diff options
Diffstat (limited to 'examples3d/one_way_platforms3.rs')
| -rw-r--r-- | examples3d/one_way_platforms3.rs | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/examples3d/one_way_platforms3.rs b/examples3d/one_way_platforms3.rs index d117a5b..f5a2f1b 100644 --- a/examples3d/one_way_platforms3.rs +++ b/examples3d/one_way_platforms3.rs @@ -9,36 +9,39 @@ struct OneWayPlatformHook { platform2: ColliderHandle, } -impl PhysicsHooks for OneWayPlatformHook { +impl PhysicsHooks<RigidBodySet, ColliderSet> for OneWayPlatformHook { fn active_hooks(&self) -> PhysicsHooksFlags { PhysicsHooksFlags::MODIFY_SOLVER_CONTACTS } - fn modify_solver_contacts(&self, context: &mut ContactModificationContext) { + fn modify_solver_contacts( + &self, + context: &mut ContactModificationContext<RigidBodySet, ColliderSet>, + ) { // The allowed normal for the first platform is its local +y axis, and the // allowed normal for the second platform is its local -y axis. // // Now we have to be careful because the `manifold.local_n1` normal points // toward the outside of the shape of `context.co1`. So we need to flip the - // allowed normal direction if the platform is in `context.collider_handle2`. + // allowed normal direction if the platform is in `context.collider2`. // // Therefore: - // - If context.collider_handle1 == self.platform1 then the allowed normal is +y. - // - If context.collider_handle2 == self.platform1 then the allowed normal is -y. - // - If context.collider_handle1 == self.platform2 then its allowed normal +y needs to be flipped to -y. - // - If context.collider_handle2 == self.platform2 then the allowed normal -y needs to be flipped to +y. + // - If context.collider1 == self.platform1 then the allowed normal is +y. + // - If context.collider2 == self.platform1 then the allowed normal is -y. + // - If context.collider1 == self.platform2 then its allowed normal +y needs to be flipped to -y. + // - If context.collider2 == self.platform2 then the allowed normal -y needs to be flipped to +y. let mut allowed_local_n1 = Vector3::zeros(); - if context.collider_handle1 == self.platform1 { + if context.collider1 == self.platform1 { allowed_local_n1 = Vector3::y(); - } else if context.collider_handle2 == self.platform1 { + } else if context.collider2 == self.platform1 { // Flip the allowed direction. allowed_local_n1 = -Vector3::y(); } - if context.collider_handle1 == self.platform2 { + if context.collider1 == self.platform2 { allowed_local_n1 = -Vector3::y(); - } else if context.collider_handle2 == self.platform2 { + } else if context.collider2 == self.platform2 { // Flip the allowed direction. allowed_local_n1 = Vector3::y(); } @@ -47,13 +50,12 @@ impl PhysicsHooks for OneWayPlatformHook { context.update_as_oneway_platform(&allowed_local_n1, 0.1); // Set the surface velocity of the accepted contacts. - let tangent_velocity = if context.collider_handle1 == self.platform1 - || context.collider_handle2 == self.platform2 - { - -12.0 - } else { - 12.0 - }; + let tangent_velocity = + if context.collider1 == self.platform1 || context.collider2 == self.platform2 { + -12.0 + } else { + 12.0 + }; for contact in context.solver_contacts.iter_mut() { contact.tangent_velocity.z = tangent_velocity; @@ -115,13 +117,14 @@ pub fn init_world(testbed: &mut Testbed) { } } - physics.bodies.foreach_active_dynamic_body_mut(|_, body| { + for handle in physics.islands.active_dynamic_bodies() { + let body = physics.bodies.get_mut(*handle).unwrap(); if body.position().translation.y > 1.0 { body.set_gravity_scale(1.0, false); } else if body.position().translation.y < -1.0 { body.set_gravity_scale(-1.0, false); } - }); + } }); /* |
