From 5a0e6471cd65dfcaf605d4bc2c0f2ae6e4e54546 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Sat, 3 Apr 2021 12:03:49 +0200 Subject: Fix crash caused by a collider being remove before the first timestep. --- src/geometry/collider_set.rs | 4 +++- src/pipeline/physics_pipeline.rs | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/geometry/collider_set.rs b/src/geometry/collider_set.rs index 7af34f1..b0209bb 100644 --- a/src/geometry/collider_set.rs +++ b/src/geometry/collider_set.rs @@ -139,7 +139,9 @@ impl ColliderSet { self.modified_all_colliders = false; } else { for handle in self.modified_colliders.drain(..) { - self.colliders[handle.0].changes = ColliderChanges::empty(); + if let Some(co) = self.colliders.get_mut(handle.0) { + co.changes = ColliderChanges::empty(); + } } } } diff --git a/src/pipeline/physics_pipeline.rs b/src/pipeline/physics_pipeline.rs index 0f7b5f6..9e70065 100644 --- a/src/pipeline/physics_pipeline.rs +++ b/src/pipeline/physics_pipeline.rs @@ -588,4 +588,41 @@ mod test { assert_eq!(h2a, h2b); assert_eq!(h3a, h3b); } + + #[test] + fn collider_removal_before_step() { + let mut pipeline = PhysicsPipeline::new(); + let gravity = Vector::y() * -9.81; + let integration_parameters = IntegrationParameters::default(); + let mut broad_phase = BroadPhase::new(); + let mut narrow_phase = NarrowPhase::new(); + let mut bodies = RigidBodySet::new(); + let mut colliders = ColliderSet::new(); + let mut ccd = CCDSolver::new(); + let mut joints = JointSet::new(); + let physics_hooks = (); + let event_handler = (); + + let body = RigidBodyBuilder::new_dynamic().build(); + let b_handle = bodies.insert(body); + let collider = ColliderBuilder::ball(1.0).build(); + let c_handle = colliders.insert(collider, b_handle, &mut bodies); + colliders.remove(c_handle, &mut bodies, true); + bodies.remove(b_handle, &mut colliders, &mut joints); // Happens with and without this line + + for _ in 0..10 { + pipeline.step( + &gravity, + &integration_parameters, + &mut broad_phase, + &mut narrow_phase, + &mut bodies, + &mut colliders, + &mut joints, + &mut ccd, + &physics_hooks, + &event_handler, + ); + } + } } -- cgit From 31138c252d35a8b45059c5f77018a1ebb5f82d87 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Sat, 3 Apr 2021 12:04:00 +0200 Subject: Make the CCDSolver clonable and serializable. --- src/dynamics/ccd/ccd_solver.rs | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/dynamics/ccd/ccd_solver.rs b/src/dynamics/ccd/ccd_solver.rs index 134b8a6..ff463c7 100644 --- a/src/dynamics/ccd/ccd_solver.rs +++ b/src/dynamics/ccd/ccd_solver.rs @@ -15,7 +15,10 @@ pub enum PredictedImpacts { } /// Solver responsible for performing motion-clamping on fast-moving bodies. +#[derive(Clone)] +#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))] pub struct CCDSolver { + #[cfg_attr(feature = "serde-serialize", serde(skip))] query_pipeline: QueryPipeline, } -- cgit From 88b7a5588bba6da0b2833c424b37c29274832255 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Sat, 3 Apr 2021 12:12:12 +0200 Subject: Add comment regarding the fix. --- src/geometry/collider_set.rs | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/geometry/collider_set.rs b/src/geometry/collider_set.rs index b0209bb..7b453a3 100644 --- a/src/geometry/collider_set.rs +++ b/src/geometry/collider_set.rs @@ -139,6 +139,9 @@ impl ColliderSet { self.modified_all_colliders = false; } else { for handle in self.modified_colliders.drain(..) { + // NOTE: if the collider was added, then removed from this set before + // a an update, then it will no longer exist in `self.colliders` + // so we need to do this `if let`. if let Some(co) = self.colliders.get_mut(handle.0) { co.changes = ColliderChanges::empty(); } -- cgit From 54927368634068f99c4d47e7c5799edba10633a6 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Sat, 3 Apr 2021 12:13:41 +0200 Subject: Remove useless comment. --- src/pipeline/physics_pipeline.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/pipeline/physics_pipeline.rs b/src/pipeline/physics_pipeline.rs index 9e70065..f4ac531 100644 --- a/src/pipeline/physics_pipeline.rs +++ b/src/pipeline/physics_pipeline.rs @@ -608,7 +608,7 @@ mod test { let collider = ColliderBuilder::ball(1.0).build(); let c_handle = colliders.insert(collider, b_handle, &mut bodies); colliders.remove(c_handle, &mut bodies, true); - bodies.remove(b_handle, &mut colliders, &mut joints); // Happens with and without this line + bodies.remove(b_handle, &mut colliders, &mut joints); for _ in 0..10 { pipeline.step( -- cgit