aboutsummaryrefslogtreecommitdiff
path: root/src/geometry
diff options
context:
space:
mode:
authorSébastien Crozet <sebcrozet@dimforge.com>2024-03-23 13:11:37 +0100
committerSébastien Crozet <sebastien@crozet.re>2024-03-23 14:19:52 +0100
commitcd9fb8342d115bad557ca05aa16fb961fe28b1b5 (patch)
tree98edab178742888be9d8774c673e14431d6405d8 /src/geometry
parent6886f8f2073b3251e3b080523d8032961b68e52a (diff)
downloadrapier-cd9fb8342d115bad557ca05aa16fb961fe28b1b5.tar.gz
rapier-cd9fb8342d115bad557ca05aa16fb961fe28b1b5.tar.bz2
rapier-cd9fb8342d115bad557ca05aa16fb961fe28b1b5.zip
feat: add RigidBody::copy_from and Collider::copy_from
Closes #595
Diffstat (limited to 'src/geometry')
-rw-r--r--src/geometry/collider.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/geometry/collider.rs b/src/geometry/collider.rs
index 2a31afa..4e7fbc7 100644
--- a/src/geometry/collider.rs
+++ b/src/geometry/collider.rs
@@ -60,6 +60,53 @@ impl Collider {
self.coll_type.is_sensor()
}
+ /// Copy all the characteristics from `other` to `self`.
+ ///
+ /// If you have a mutable reference to a collider `collider: &mut Collider`, attempting to
+ /// assign it a whole new collider instance, e.g., `*collider = ColliderBuilder::ball(0.5).build()`,
+ /// will crash due to some internal indices being overwritten. Instead, use
+ /// `collider.copy_from(&ColliderBuilder::ball(0.5).build())`.
+ ///
+ /// This method will allow you to set most characteristics of this collider from another
+ /// collider instance without causing any breakage.
+ ///
+ /// This method **cannot** be used for reparenting a collider. Therefore, the parent of the
+ /// `other` (if any), as well as its relative position to that parent will not be copied into
+ /// `self`.
+ ///
+ /// The pose of `other` will only copied into `self` if `self` doesn’t have a parent (if it has
+ /// a parent, its position is directly controlled by the parent rigid-body).
+ pub fn copy_from(&mut self, other: &Collider) {
+ // NOTE: we deconstruct the collider struct to be sure we don’t forget to
+ // add some copies here if we add more field to Collider in the future.
+ let Collider {
+ coll_type,
+ shape,
+ mprops,
+ changes: _changes, // Will be set to ALL.
+ parent: _parent, // This function cannot be used to reparent the collider.
+ pos,
+ material,
+ flags,
+ bf_data: _bf_data, // Internal ids must not be overwritten.
+ contact_force_event_threshold,
+ user_data,
+ } = other;
+
+ if self.parent.is_none() {
+ self.pos = *pos;
+ }
+
+ self.coll_type = *coll_type;
+ self.shape = shape.clone();
+ self.mprops = mprops.clone();
+ self.material = *material;
+ self.contact_force_event_threshold = *contact_force_event_threshold;
+ self.user_data = *user_data;
+ self.flags = *flags;
+ self.changes = ColliderChanges::all();
+ }
+
/// The physics hooks enabled for this collider.
pub fn active_hooks(&self) -> ActiveHooks {
self.flags.active_hooks