aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2021-04-03 12:03:49 +0200
committerCrozet Sébastien <developer@crozet.re>2021-04-03 12:03:49 +0200
commit5a0e6471cd65dfcaf605d4bc2c0f2ae6e4e54546 (patch)
treef77228cde05882e3cba75d2c3325b3fc136faac4
parent7557d2a6ee20488835998c8aef4541ed5ada576f (diff)
downloadrapier-5a0e6471cd65dfcaf605d4bc2c0f2ae6e4e54546.tar.gz
rapier-5a0e6471cd65dfcaf605d4bc2c0f2ae6e4e54546.tar.bz2
rapier-5a0e6471cd65dfcaf605d4bc2c0f2ae6e4e54546.zip
Fix crash caused by a collider being remove before the first timestep.
-rw-r--r--src/geometry/collider_set.rs4
-rw-r--r--src/pipeline/physics_pipeline.rs37
2 files changed, 40 insertions, 1 deletions
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,
+ );
+ }
+ }
}