aboutsummaryrefslogtreecommitdiff
path: root/src/geometry
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2020-08-27 09:01:32 +0200
committerSébastien Crozet <developer@crozet.re>2020-08-27 09:08:17 +0200
commit3b000f90bfb0762df23f78a8a9b9a9cf5ad6c08a (patch)
tree6287bffb6928a49bb8c4845465d71e45f1d6336d /src/geometry
parentcd3d4e0bff92f403be02cb98e0aa95024d7b1716 (diff)
downloadrapier-3b000f90bfb0762df23f78a8a9b9a9cf5ad6c08a.tar.gz
rapier-3b000f90bfb0762df23f78a8a9b9a9cf5ad6c08a.tar.bz2
rapier-3b000f90bfb0762df23f78a8a9b9a9cf5ad6c08a.zip
Fix BroadPhase proxy handle recycling causing a crash.
Diffstat (limited to 'src/geometry')
-rw-r--r--src/geometry/broad_phase_multi_sap.rs52
1 files changed, 48 insertions, 4 deletions
diff --git a/src/geometry/broad_phase_multi_sap.rs b/src/geometry/broad_phase_multi_sap.rs
index 8356339..0505e21 100644
--- a/src/geometry/broad_phase_multi_sap.rs
+++ b/src/geometry/broad_phase_multi_sap.rs
@@ -426,10 +426,10 @@ impl Proxies {
pub fn insert(&mut self, proxy: BroadPhaseProxy) -> usize {
if self.first_free != NEXT_FREE_SENTINEL {
- let proxy_id = self.first_free;
- self.first_free = self.elements[self.first_free as usize].next_free;
- self.elements[self.first_free as usize] = proxy;
- proxy_id as usize
+ let proxy_id = self.first_free as usize;
+ self.first_free = self.elements[proxy_id].next_free;
+ self.elements[proxy_id] = proxy;
+ proxy_id
} else {
self.elements.push(proxy);
self.elements.len() - 1
@@ -643,3 +643,47 @@ impl BroadPhase {
// );
}
}
+
+#[cfg(test)]
+mod test {
+ use crate::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
+ use crate::geometry::{BroadPhase, ColliderBuilder, ColliderSet, NarrowPhase};
+ use crate::pipeline::PhysicsPipeline;
+
+ #[test]
+ fn test_add_update_remove() {
+ let mut broad_phase = BroadPhase::new();
+ let mut narrow_phase = NarrowPhase::new();
+ let mut bodies = RigidBodySet::new();
+ let mut colliders = ColliderSet::new();
+ let mut joints = JointSet::new();
+ let mut pipeline = PhysicsPipeline::new();
+
+ let rb = RigidBodyBuilder::new_dynamic().build();
+ let co = ColliderBuilder::ball(0.5).build();
+ let hrb = bodies.insert(rb);
+ let hco = colliders.insert(co, hrb, &mut bodies);
+
+ broad_phase.update_aabbs(0.0, &bodies, &mut colliders);
+
+ pipeline.remove_rigid_body(
+ hrb,
+ &mut broad_phase,
+ &mut narrow_phase,
+ &mut bodies,
+ &mut colliders,
+ &mut joints,
+ );
+
+ broad_phase.update_aabbs(0.0, &bodies, &mut colliders);
+
+ // Create another body.
+ let rb = RigidBodyBuilder::new_dynamic().build();
+ let co = ColliderBuilder::ball(0.5).build();
+ let hrb = bodies.insert(rb);
+ let hco = colliders.insert(co, hrb, &mut bodies);
+
+ // Make sure the proxy handles is recycled properly.
+ broad_phase.update_aabbs(0.0, &bodies, &mut colliders);
+ }
+}