diff options
| author | Sébastien Crozet <developer@crozet.re> | 2020-08-27 09:01:32 +0200 |
|---|---|---|
| committer | Sébastien Crozet <developer@crozet.re> | 2020-08-27 09:08:17 +0200 |
| commit | 3b000f90bfb0762df23f78a8a9b9a9cf5ad6c08a (patch) | |
| tree | 6287bffb6928a49bb8c4845465d71e45f1d6336d /src/geometry | |
| parent | cd3d4e0bff92f403be02cb98e0aa95024d7b1716 (diff) | |
| download | rapier-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.rs | 52 |
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); + } +} |
