Merge pull request #164 from dimforge/collider_removal_fix

Fix crash caused by a collider being remove before the first timestep.
This commit is contained in:
Sébastien Crozet
2021-04-03 15:26:38 +02:00
committed by GitHub
3 changed files with 46 additions and 1 deletions

View File

@@ -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,
}

View File

@@ -139,7 +139,12 @@ impl ColliderSet {
self.modified_all_colliders = false;
} else {
for handle in self.modified_colliders.drain(..) {
self.colliders[handle.0].changes = ColliderChanges::empty();
// 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();
}
}
}
}

View File

@@ -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);
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,
);
}
}
}