aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/geometry/broad_phase_multi_sap/broad_phase.rs15
-rw-r--r--src/pipeline/physics_pipeline.rs21
-rw-r--r--src/pipeline/user_changes.rs8
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): (