diff options
| author | Sébastien Crozet <developer@crozet.re> | 2022-02-20 14:21:59 +0100 |
|---|---|---|
| committer | Sébastien Crozet <sebastien@crozet.re> | 2022-03-20 21:49:16 +0100 |
| commit | 28cc19d104d986db54d8725e68189070bef31a8a (patch) | |
| tree | a82eda017e7bf2f8715b10450bcabde841440af4 /src/geometry/collider_set.rs | |
| parent | 412fedf7e30d7d2c4136ee6f6d0818184a539658 (diff) | |
| download | rapier-28cc19d104d986db54d8725e68189070bef31a8a.tar.gz rapier-28cc19d104d986db54d8725e68189070bef31a8a.tar.bz2 rapier-28cc19d104d986db54d8725e68189070bef31a8a.zip | |
Allow removing a rigid-body without auto-removing attached colliders
Diffstat (limited to 'src/geometry/collider_set.rs')
| -rw-r--r-- | src/geometry/collider_set.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/geometry/collider_set.rs b/src/geometry/collider_set.rs index 61675d4..a25fd1e 100644 --- a/src/geometry/collider_set.rs +++ b/src/geometry/collider_set.rs @@ -6,6 +6,7 @@ use crate::geometry::{ ColliderParent, ColliderPosition, ColliderShape, ColliderType, }; use crate::geometry::{ColliderChanges, ColliderHandle}; +use crate::math::Isometry; use std::ops::{Index, IndexMut}; #[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))] @@ -180,6 +181,54 @@ impl ColliderSet { handle } + /// Sets the parent of the given collider. + // TODO: find a way to define this as a method of Collider. + pub fn set_parent( + &mut self, + handle: ColliderHandle, + new_parent_handle: Option<RigidBodyHandle>, + bodies: &mut RigidBodySet, + ) { + if let Some(collider) = self.get_mut(handle) { + let curr_parent = collider.co_parent.map(|p| p.handle); + if new_parent_handle == curr_parent { + return; // Nothing to do, this is the same parent. + } + + collider.co_changes |= ColliderChanges::PARENT; + + if let Some(parent_handle) = curr_parent { + if let Some(rb) = bodies.get_mut(parent_handle) { + rb.remove_collider_internal(handle, &*collider); + } + } + + match new_parent_handle { + Some(new_parent_handle) => { + if let Some(co_parent) = &mut collider.co_parent { + co_parent.handle = new_parent_handle; + } else { + collider.co_parent = Some(ColliderParent { + handle: new_parent_handle, + pos_wrt_parent: Isometry::identity(), + }) + }; + + if let Some(rb) = bodies.get_mut(new_parent_handle) { + rb.add_collider( + handle, + collider.co_parent.as_ref().unwrap(), + &mut collider.co_pos, + &collider.co_shape, + &collider.co_mprops, + ); + } + } + None => collider.co_parent = None, + } + } + } + /// Remove a collider from this set and update its parent accordingly. /// /// If `wake_up` is `true`, the rigid-body the removed collider is attached to |
