diff options
Diffstat (limited to 'examples3d')
| -rw-r--r-- | examples3d/debug_shape_modification3.rs | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/examples3d/debug_shape_modification3.rs b/examples3d/debug_shape_modification3.rs index 0fc3cc5..8974218 100644 --- a/examples3d/debug_shape_modification3.rs +++ b/examples3d/debug_shape_modification3.rs @@ -35,13 +35,32 @@ pub fn init_world(testbed: &mut Testbed) { let collider = ColliderBuilder::ball(ball_rad).density(100.0); let ball_coll_handle = colliders.insert_with_parent(collider, ball_handle, &mut bodies); + /* + * Colliders without bodies + */ + let shape_size = 3.0; + let static_collider = + ColliderBuilder::ball(shape_size).translation(vector![-15.0, shape_size, 18.0]); + colliders.insert(static_collider); + + let shapes = [ + SharedShape::ball(shape_size), + SharedShape::cuboid(shape_size, shape_size, shape_size), + SharedShape::cone(shape_size, shape_size), + SharedShape::cylinder(shape_size, shape_size), + ]; + let mut shape_idx = 0; + let shapeshifting_collider = ColliderBuilder::new(shapes[shape_idx].clone()) + .translation(vector![-15.0, shape_size, 9.0]); + let shapeshifting_coll_handle = colliders.insert(shapeshifting_collider); + let mut linvel = Vector::zeros(); let mut angvel = Vector::zeros(); let mut pos = Isometry::identity(); let mut step = 0; let snapped_frame = 51; - testbed.add_callback(move |_, physics, _, _| { + testbed.add_callback(move |mut gfx, physics, _, _| { step += 1; // Snap the ball velocity or restore it. @@ -53,6 +72,15 @@ pub fn init_world(testbed: &mut Testbed) { pos = *ball.position(); } + let shapeshifting_coll = physics + .colliders + .get_mut(shapeshifting_coll_handle) + .unwrap(); + if step % 50 == 0 { + shape_idx = (shape_idx + 1) % 4; + shapeshifting_coll.set_shape(shapes[shape_idx].clone()) + } + if step == 100 { ball.set_linvel(linvel, true); ball.set_angvel(angvel, true); @@ -62,6 +90,11 @@ pub fn init_world(testbed: &mut Testbed) { let ball_coll = physics.colliders.get_mut(ball_coll_handle).unwrap(); ball_coll.set_shape(SharedShape::ball(ball_rad * step as f32 * 2.0)); + + if let Some(gfx) = &mut gfx { + gfx.update_collider(ball_coll_handle, &physics.colliders); + gfx.update_collider(shapeshifting_coll_handle, &physics.colliders); + } }); /* @@ -111,5 +144,5 @@ pub fn init_world(testbed: &mut Testbed) { * Set up the testbed. */ testbed.set_world(bodies, colliders, impulse_joints, multibody_joints); - testbed.look_at(point![10.0, 10.0, 10.0], Point::origin()); + testbed.look_at(point![40.0, 40.0, 40.0], Point::origin()); } |
