diff options
| -rw-r--r-- | src/geometry/broad_phase_multi_sap/broad_phase.rs | 15 | ||||
| -rw-r--r-- | src/pipeline/physics_pipeline.rs | 21 | ||||
| -rw-r--r-- | src/pipeline/user_changes.rs | 8 |
3 files changed, 29 insertions, 15 deletions
diff --git a/src/geometry/broad_phase_multi_sap/broad_phase.rs b/src/geometry/broad_phase_multi_sap/broad_phase.rs index 890d851..230d54d 100644 --- a/src/geometry/broad_phase_multi_sap/broad_phase.rs +++ b/src/geometry/broad_phase_multi_sap/broad_phase.rs @@ -583,7 +583,7 @@ impl BroadPhase { #[cfg(test)] mod test { - use crate::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; + use crate::dynamics::{IslandManager, JointSet, RigidBodyBuilder, RigidBodySet}; use crate::geometry::{BroadPhase, ColliderBuilder, ColliderSet}; #[test] @@ -592,25 +592,26 @@ mod test { let mut bodies = RigidBodySet::new(); let mut colliders = ColliderSet::new(); let mut joints = JointSet::new(); + let mut islands = IslandManager::new(); let rb = RigidBodyBuilder::new_dynamic().build(); let co = ColliderBuilder::ball(0.5).build(); let hrb = bodies.insert(rb); - colliders.insert(co, hrb, &mut bodies); + let coh = colliders.insert(co, hrb, &mut bodies); let mut events = Vec::new(); - broad_phase.update(0.0, &mut colliders, &mut events); + broad_phase.update(0.0, &mut colliders, &[coh], &[], &mut events); - bodies.remove(hrb, &mut colliders, &mut joints); - broad_phase.update(0.0, &mut colliders, &mut events); + bodies.remove(hrb, &mut islands, &mut colliders, &mut joints); + broad_phase.update(0.0, &mut colliders, &[], &[coh], &mut events); // Create another body. let rb = RigidBodyBuilder::new_dynamic().build(); let co = ColliderBuilder::ball(0.5).build(); let hrb = bodies.insert(rb); - colliders.insert(co, hrb, &mut bodies); + let coh = colliders.insert(co, hrb, &mut bodies); // Make sure the proxy handles is recycled properly. - broad_phase.update(0.0, &mut colliders, &mut events); + broad_phase.update(0.0, &mut colliders, &[coh], &[], &mut events); } } diff --git a/src/pipeline/physics_pipeline.rs b/src/pipeline/physics_pipeline.rs index 328e810..a5196ba 100644 --- a/src/pipeline/physics_pipeline.rs +++ b/src/pipeline/physics_pipeline.rs @@ -696,7 +696,7 @@ impl PhysicsPipeline { #[cfg(test)] mod test { use crate::dynamics::{ - CCDSolver, IntegrationParameters, JointSet, RigidBodyBuilder, RigidBodySet, + CCDSolver, IntegrationParameters, IslandManager, JointSet, RigidBodyBuilder, RigidBodySet, }; use crate::geometry::{BroadPhase, ColliderBuilder, ColliderSet, NarrowPhase}; use crate::math::Vector; @@ -710,6 +710,7 @@ mod test { let mut bf = BroadPhase::new(); let mut nf = NarrowPhase::new(); let mut bodies = RigidBodySet::new(); + let mut islands = IslandManager::new(); let rb = RigidBodyBuilder::new_static().build(); let h1 = bodies.insert(rb.clone()); @@ -724,6 +725,7 @@ mod test { pipeline.step( &Vector::zeros(), &IntegrationParameters::default(), + &mut islands, &mut bf, &mut nf, &mut bodies, @@ -742,6 +744,7 @@ mod test { let mut pipeline = PhysicsPipeline::new(); let mut bf = BroadPhase::new(); let mut nf = NarrowPhase::new(); + let mut islands = IslandManager::new(); let mut bodies = RigidBodySet::new(); @@ -762,12 +765,13 @@ mod test { let to_delete = [h1, h2, h3, h4]; for h in &to_delete { - bodies.remove(*h, &mut colliders, &mut joints); + bodies.remove(*h, &mut islands, &mut colliders, &mut joints); } pipeline.step( &Vector::zeros(), &IntegrationParameters::default(), + &mut islands, &mut bf, &mut nf, &mut bodies, @@ -784,6 +788,7 @@ mod test { fn rigid_body_removal_snapshot_handle_determinism() { let mut colliders = ColliderSet::new(); let mut joints = JointSet::new(); + let mut islands = IslandManager::new(); let mut bodies = RigidBodySet::new(); let rb = RigidBodyBuilder::new_dynamic().build(); @@ -791,9 +796,9 @@ mod test { let h2 = bodies.insert(rb.clone()); let h3 = bodies.insert(rb.clone()); - bodies.remove(h1, &mut colliders, &mut joints); - bodies.remove(h3, &mut colliders, &mut joints); - bodies.remove(h2, &mut colliders, &mut joints); + bodies.remove(h1, &mut islands, &mut colliders, &mut joints); + bodies.remove(h3, &mut islands, &mut colliders, &mut joints); + bodies.remove(h2, &mut islands, &mut colliders, &mut joints); let ser_bodies = bincode::serialize(&bodies).unwrap(); let mut bodies2: RigidBodySet = bincode::deserialize(&ser_bodies).unwrap(); @@ -822,6 +827,7 @@ mod test { let mut colliders = ColliderSet::new(); let mut ccd = CCDSolver::new(); let mut joints = JointSet::new(); + let mut islands = IslandManager::new(); let physics_hooks = (); let event_handler = (); @@ -829,13 +835,14 @@ mod test { 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); + colliders.remove(c_handle, &mut islands, &mut bodies, true); + bodies.remove(b_handle, &mut islands, &mut colliders, &mut joints); for _ in 0..10 { pipeline.step( &gravity, &integration_parameters, + &mut islands, &mut broad_phase, &mut narrow_phase, &mut bodies, diff --git a/src/pipeline/user_changes.rs b/src/pipeline/user_changes.rs index 34a34a2..99c5cfe 100644 --- a/src/pipeline/user_changes.rs +++ b/src/pipeline/user_changes.rs @@ -60,8 +60,14 @@ pub(crate) fn handle_user_changes_to_rigid_bodies<Bodies, Colliders>( for handle in modified_bodies { let mut final_action = None; + let changes: Option<&RigidBodyChanges> = bodies.get(handle.0); - let mut changes: RigidBodyChanges = *bodies.index(handle.0); + if changes.is_none() { + // The body no longer exists. + continue; + } + + let mut changes = *changes.unwrap(); let mut ids: RigidBodyIds = *bodies.index(handle.0); let mut activation: RigidBodyActivation = *bodies.index(handle.0); let (status, rb_colliders, poss): ( |
