Fix crash caused by a collider being remove before the first timestep.

This commit is contained in:
Crozet Sébastien
2021-04-03 12:03:49 +02:00
parent 7557d2a6ee
commit 5a0e6471cd
2 changed files with 40 additions and 1 deletions

View File

@@ -139,7 +139,9 @@ impl ColliderSet {
self.modified_all_colliders = false; self.modified_all_colliders = false;
} else { } else {
for handle in self.modified_colliders.drain(..) { 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();
}
} }
} }
} }

View File

@@ -588,4 +588,41 @@ mod test {
assert_eq!(h2a, h2b); assert_eq!(h2a, h2b);
assert_eq!(h3a, h3b); 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,
);
}
}
} }