aboutsummaryrefslogtreecommitdiff
path: root/src/pipeline
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2020-08-31 17:58:14 +0200
committerSébastien Crozet <developer@crozet.re>2020-08-31 19:05:14 +0200
commitdf2156ffd02ea1b8c86e86f1d68c5e4e915e6d98 (patch)
tree53c08d57b3fdbfcb94654a61fd68fcec5d66bffd /src/pipeline
parentcc05bad0410128b163e81e9f703ccb841f6a9a08 (diff)
downloadrapier-df2156ffd02ea1b8c86e86f1d68c5e4e915e6d98.tar.gz
rapier-df2156ffd02ea1b8c86e86f1d68c5e4e915e6d98.tar.bz2
rapier-df2156ffd02ea1b8c86e86f1d68c5e4e915e6d98.zip
Allow the removal of a collider.
Diffstat (limited to 'src/pipeline')
-rw-r--r--src/pipeline/physics_pipeline.rs24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/pipeline/physics_pipeline.rs b/src/pipeline/physics_pipeline.rs
index 6e18a03..8449477 100644
--- a/src/pipeline/physics_pipeline.rs
+++ b/src/pipeline/physics_pipeline.rs
@@ -7,7 +7,8 @@ use crate::dynamics::{IntegrationParameters, JointSet, RigidBody, RigidBodyHandl
#[cfg(feature = "parallel")]
use crate::dynamics::{JointGraphEdge, ParallelIslandSolver as IslandSolver};
use crate::geometry::{
- BroadPhase, BroadPhasePairEvent, ColliderPair, ColliderSet, ContactManifoldIndex, NarrowPhase,
+ BroadPhase, BroadPhasePairEvent, Collider, ColliderHandle, ColliderPair, ColliderSet,
+ ContactManifoldIndex, NarrowPhase,
};
use crate::math::Vector;
use crate::pipeline::EventHandler;
@@ -245,6 +246,27 @@ impl PhysicsPipeline {
self.counters.step_completed();
}
+ /// Remove a collider and all its associated data.
+ pub fn remove_collider(
+ &mut self,
+ handle: ColliderHandle,
+ broad_phase: &mut BroadPhase,
+ narrow_phase: &mut NarrowPhase,
+ bodies: &mut RigidBodySet,
+ colliders: &mut ColliderSet,
+ ) -> Option<Collider> {
+ broad_phase.remove_colliders(&[handle], colliders);
+ narrow_phase.remove_colliders(&[handle], colliders, bodies);
+ let collider = colliders.remove_internal(handle)?;
+
+ if let Some(parent) = bodies.get_mut_internal(collider.parent) {
+ parent.remove_collider_internal(handle, &collider);
+ bodies.wake_up(collider.parent);
+ }
+
+ Some(collider)
+ }
+
/// Remove a rigid-body and all its associated data.
pub fn remove_rigid_body(
&mut self,