use slosh_testbed2d::{RapierData, slosh};
use glam::vec2;
use rapier2d::prelude::{ColliderBuilder, RigidBodyBuilder};
use slang_hal::backend::WebGpu;
use slosh::{
pipeline::MpmData,
solver::{Particle, SimulationParams},
};
use slosh_testbed2d::{AppState, PhysicsContext};
use slosh2d::solver::ParticleModel;
#[allow(dead_code)]
fn main() {
panic!("Run the `testbed2` example instead.");
}
pub fn sand_demo(backend: &WebGpu, app_state: &mut AppState) -> PhysicsContext {
let mut rapier_data = RapierData::default();
let offset_y = 46.0;
let cell_width = 0.2;
let mut particles = vec![];
for i in 0..700 {
for j in 0..700 {
let position =
vec2(i as f32 + 0.5, j as f32 + 0.5) * cell_width / 2.0 + vec2(0.0, offset_y);
let density = 1000.0;
let radius = cell_width / 4.0;
let young_modulus = 1.0e7;
let poisson_ratio = 0.2;
let model = ParticleModel::sand(young_modulus, poisson_ratio);
particles.push(Particle::new(position, radius, density, model));
}
}
if !app_state.restarting {
app_state.min_num_substeps = 20;
app_state.max_num_substeps = 20;
app_state.gravity_factor = 1.0;
};
let params = SimulationParams {
gravity: vec2(0.0, -9.81) * app_state.gravity_factor,
dt: 1.0 / 60.0,
padding: 0.0,
};
const ANGVEL: f32 = 1.0;
let rb = RigidBodyBuilder::fixed().translation(vec2(35.0, -1.0));
let rb_handle = rapier_data.bodies.insert(rb);
let co = ColliderBuilder::cuboid(42.0, 1.0);
rapier_data
.colliders
.insert_with_parent(co, rb_handle, &mut rapier_data.bodies);
let rb = RigidBodyBuilder::fixed()
.translation(vec2(-25.0, 45.0))
.rotation(0.5);
let rb_handle = rapier_data.bodies.insert(rb);
let co = ColliderBuilder::cuboid(1.0, 52.0);
rapier_data
.colliders
.insert_with_parent(co, rb_handle, &mut rapier_data.bodies);
let rb = RigidBodyBuilder::fixed()
.translation(vec2(95.0, 45.0))
.rotation(-0.5);
let rb_handle = rapier_data.bodies.insert(rb);
let co = ColliderBuilder::cuboid(1.0, 52.0);
rapier_data
.colliders
.insert_with_parent(co, rb_handle, &mut rapier_data.bodies);
let rb = RigidBodyBuilder::kinematic_velocity_based()
.translation(vec2(5.0, 35.0))
.angvel(ANGVEL);
let rb_handle = rapier_data.bodies.insert(rb);
let co = ColliderBuilder::cuboid(1.0, 10.0);
rapier_data
.colliders
.insert_with_parent(co, rb_handle, &mut rapier_data.bodies);
let rb = RigidBodyBuilder::kinematic_velocity_based()
.translation(vec2(35.0, 35.0))
.angvel(-ANGVEL);
let rb_handle = rapier_data.bodies.insert(rb);
let co = ColliderBuilder::cuboid(10.0, 1.0);
rapier_data
.colliders
.insert_with_parent(co, rb_handle, &mut rapier_data.bodies);
let rb = RigidBodyBuilder::kinematic_velocity_based()
.translation(vec2(65.0, 35.0))
.angvel(ANGVEL);
let rb_handle = rapier_data.bodies.insert(rb);
let co = ColliderBuilder::cuboid(1.0, 10.0);
rapier_data
.colliders
.insert_with_parent(co, rb_handle, &mut rapier_data.bodies);
let rb = RigidBodyBuilder::kinematic_velocity_based()
.translation(vec2(20.0, 20.0))
.angvel(-ANGVEL);
let rb_handle = rapier_data.bodies.insert(rb);
let co = ColliderBuilder::ball(5.0);
rapier_data
.colliders
.insert_with_parent(co, rb_handle, &mut rapier_data.bodies);
let rb = RigidBodyBuilder::kinematic_velocity_based()
.translation(vec2(50.0, 20.0))
.angvel(-ANGVEL);
let rb_handle = rapier_data.bodies.insert(rb);
let co = ColliderBuilder::capsule_y(5.0, 3.0);
rapier_data
.colliders
.insert_with_parent(co, rb_handle, &mut rapier_data.bodies);
let data = MpmData::new(
backend,
params,
&particles,
&rapier_data.bodies,
&rapier_data.colliders,
&[],
cell_width,
30_000,
)
.unwrap();
PhysicsContext {
data,
rapier_data,
callbacks: vec![],
hooks_state: None,
}
}