aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/collider_set.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2022-02-20 14:21:59 +0100
committerSébastien Crozet <sebastien@crozet.re>2022-03-20 21:49:16 +0100
commit28cc19d104d986db54d8725e68189070bef31a8a (patch)
treea82eda017e7bf2f8715b10450bcabde841440af4 /src/geometry/collider_set.rs
parent412fedf7e30d7d2c4136ee6f6d0818184a539658 (diff)
downloadrapier-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.rs49
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