diff options
| -rw-r--r-- | src/sim/rb_manager/mod.rs | 26 | ||||
| -rw-r--r-- | src/sim/sim_manager/mod.rs | 7 | ||||
| -rw-r--r-- | src/sim/sim_manager/utils.rs | 1 |
3 files changed, 26 insertions, 8 deletions
diff --git a/src/sim/rb_manager/mod.rs b/src/sim/rb_manager/mod.rs index 1d76621..9d183db 100644 --- a/src/sim/rb_manager/mod.rs +++ b/src/sim/rb_manager/mod.rs @@ -3,7 +3,7 @@ pub mod debug_render; use fxhash::FxHashMap; use glam::Vec2; use rapier2d::{ - dynamics::IntegrationParameters, + dynamics::{CCDSolver, IntegrationParameters, RigidBody, RigidBodyHandle}, geometry, glamx::vec2, pipeline::{DebugRenderPipeline, PhysicsWorld}, @@ -49,6 +49,28 @@ impl PhysicsManager { ), } } + + // Temporary fix for https://github.com/dimforge/rapier/pull/1003 + pub fn remove_collider( + &mut self, + handle: geometry::ColliderHandle, + ) -> Option<geometry::Collider> { + let removed = self.world.remove_collider(handle); + self.ccd_cache_invalidated(); + removed + } + + // Temporary fix for https://github.com/dimforge/rapier/pull/1003 + pub fn remove_body(&mut self, handle: RigidBodyHandle) -> Option<RigidBody> { + let removed = self.world.remove_body(handle); + self.ccd_cache_invalidated(); + removed + } + + // Temporary fix for https://github.com/dimforge/rapier/pull/1003 + fn ccd_cache_invalidated(&mut self) { + self.world.ccd_solver = CCDSolver::new(); + } } // TODO remove @@ -141,7 +163,7 @@ impl RbManager { )); if let Some(handle) = self.chunk_colliders.remove(&(cx, cy)) { - self.physics_manager.world.remove_collider(handle); + self.physics_manager.remove_collider(handle); } let handle = self.physics_manager.world.insert_collider(collider, None); diff --git a/src/sim/sim_manager/mod.rs b/src/sim/sim_manager/mod.rs index 432ac0b..ca68831 100644 --- a/src/sim/sim_manager/mod.rs +++ b/src/sim/sim_manager/mod.rs @@ -88,12 +88,9 @@ impl SimManager { pub fn destroy_entity(&mut self, id: EntityId) { if let Some(entity) = self.entities.get(&id) { if let Some(rb_h) = entity.data.rb_h { - self.rb_manager.physics_manager.world.remove_body(rb_h); + self.rb_manager.physics_manager.remove_body(rb_h); } else if let Some(collider_h) = entity.data.collider_h { - self.rb_manager - .physics_manager - .world - .remove_collider(collider_h); + self.rb_manager.physics_manager.remove_collider(collider_h); } self.entities.remove(&id); diff --git a/src/sim/sim_manager/utils.rs b/src/sim/sim_manager/utils.rs index 0270cce..45960bf 100644 --- a/src/sim/sim_manager/utils.rs +++ b/src/sim/sim_manager/utils.rs @@ -171,7 +171,6 @@ pub fn read_back_entities_from_world( // don't profile this separately as it's basically free sim.rb_manager .physics_manager - .world .remove_collider(entity.data.collider_h.unwrap()); let new_handle = sim |
