aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics
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/dynamics
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/dynamics')
-rw-r--r--src/dynamics/rigid_body.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/dynamics/rigid_body.rs b/src/dynamics/rigid_body.rs
index 2b07f37..5af4131 100644
--- a/src/dynamics/rigid_body.rs
+++ b/src/dynamics/rigid_body.rs
@@ -74,6 +74,61 @@ impl RigidBody {
self.ids = Default::default();
}
+ /// Copy all the characteristics from `other` to `self`.
+ ///
+ /// If you have a mutable reference to a rigid-body `rigid_body: &mut RigidBody`, attempting to
+ /// assign it a whole new rigid-body instance, e.g., `*rigid_body = RigidBodyBuilder::dynamic().build()`,
+ /// will crash due to some internal indices being overwritten. Instead, use
+ /// `rigid_body.copy_from(&RigidBodyBuilder::dynamic().build())`.
+ ///
+ /// This method will allow you to set most characteristics of this rigid-body from another
+ /// rigid-body instance without causing any breakage.
+ ///
+ /// This method **cannot** be used for editing the list of colliders attached to this rigid-body.
+ /// Therefore, the list of colliders attached to `self` won’t be replaced by the one attached
+ /// to `other`.
+ ///
+ /// 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: &RigidBody) {
+ // NOTE: we deconstruct the rigid-body struct to be sure we don’t forget to
+ // add some copies here if we add more field to RigidBody in the future.
+ let RigidBody {
+ pos,
+ mprops,
+ integrated_vels,
+ vels,
+ damping,
+ forces,
+ ccd,
+ ids: _ids, // Internal ids must not be overwritten.
+ colliders: _colliders, // This function cannot be used to edit collider sets.
+ activation,
+ changes: _changes, // Will be set to ALL.
+ body_type,
+ dominance,
+ enabled,
+ additional_solver_iterations,
+ user_data,
+ } = other;
+
+ self.pos = *pos;
+ self.mprops = mprops.clone();
+ self.integrated_vels = *integrated_vels;
+ self.vels = *vels;
+ self.damping = *damping;
+ self.forces = *forces;
+ self.ccd = *ccd;
+ self.activation = *activation;
+ self.body_type = *body_type;
+ self.dominance = *dominance;
+ self.enabled = *enabled;
+ self.additional_solver_iterations = *additional_solver_iterations;
+ self.user_data = *user_data;
+
+ self.changes = RigidBodyChanges::all();
+ }
+
/// Set the additional number of solver iterations run for this rigid-body and
/// everything interacting with it.
///