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:
@@ -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,
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user