diff options
| author | Sébastien Crozet <sebcrozet@dimforge.com> | 2024-03-23 13:11:37 +0100 |
|---|---|---|
| committer | Sébastien Crozet <sebastien@crozet.re> | 2024-03-23 14:19:52 +0100 |
| commit | cd9fb8342d115bad557ca05aa16fb961fe28b1b5 (patch) | |
| tree | 98edab178742888be9d8774c673e14431d6405d8 /src/geometry | |
| parent | 6886f8f2073b3251e3b080523d8032961b68e52a (diff) | |
| download | rapier-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.rs | 47 |
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 |
