From 036a24614171eff0f99495b8b6f1c09e58cb4f9a Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 3 Nov 2020 14:29:47 +0100 Subject: Make cloning rigid-bodies and colliders more idiomatic. Fix #53 --- src/dynamics/joint/joint.rs | 1 + src/dynamics/rigid_body.rs | 25 ++++++++++--------------- src/dynamics/rigid_body_set.rs | 6 +++++- 3 files changed, 16 insertions(+), 16 deletions(-) (limited to 'src/dynamics') diff --git a/src/dynamics/joint/joint.rs b/src/dynamics/joint/joint.rs index 074f802..9fe6488 100644 --- a/src/dynamics/joint/joint.rs +++ b/src/dynamics/joint/joint.rs @@ -95,6 +95,7 @@ impl From for JointParams { } #[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))] +#[derive(Clone)] /// A joint attached to two bodies. pub struct Joint { /// Handle to the first body attached to this joint. diff --git a/src/dynamics/rigid_body.rs b/src/dynamics/rigid_body.rs index 6b897a6..b04ca41 100644 --- a/src/dynamics/rigid_body.rs +++ b/src/dynamics/rigid_body.rs @@ -27,7 +27,7 @@ pub enum BodyStatus { /// A rigid body. /// /// To create a new rigid-body, use the `RigidBodyBuilder` structure. -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct RigidBody { /// The world-space position of the rigid-body. pub position: Isometry, @@ -58,20 +58,6 @@ pub struct RigidBody { pub user_data: u128, } -impl Clone for RigidBody { - fn clone(&self) -> Self { - Self { - colliders: Vec::new(), - joint_graph_index: RigidBodyGraphIndex::new(crate::INVALID_U32), - active_island_id: crate::INVALID_USIZE, - active_set_id: crate::INVALID_USIZE, - active_set_offset: crate::INVALID_USIZE, - active_set_timestamp: crate::INVALID_U32, - ..*self - } - } -} - impl RigidBody { fn new() -> Self { Self { @@ -96,6 +82,15 @@ impl RigidBody { } } + pub(crate) fn reset_internal_links(&mut self) { + self.colliders = Vec::new(); + self.joint_graph_index = RigidBodyGraphIndex::new(crate::INVALID_U32); + self.active_island_id = crate::INVALID_USIZE; + self.active_set_id = crate::INVALID_USIZE; + self.active_set_offset = crate::INVALID_USIZE; + self.active_set_timestamp = crate::INVALID_U32; + } + pub(crate) fn integrate_accelerations(&mut self, dt: f32, gravity: Vector) { if self.mass_properties.inv_mass != 0.0 { self.linvel += (gravity + self.linacc) * dt; diff --git a/src/dynamics/rigid_body_set.rs b/src/dynamics/rigid_body_set.rs index 83f1c51..2efc2cf 100644 --- a/src/dynamics/rigid_body_set.rs +++ b/src/dynamics/rigid_body_set.rs @@ -154,7 +154,11 @@ impl RigidBodySet { } /// Insert a rigid body into this set and retrieve its handle. - pub fn insert(&mut self, rb: RigidBody) -> RigidBodyHandle { + pub fn insert(&mut self, mut rb: RigidBody) -> RigidBodyHandle { + // Make sure the internal links are reset, they may not be + // if this rigid-body was obtained by cloning another one. + rb.reset_internal_links(); + let handle = self.bodies.insert(rb); let rb = &mut self.bodies[handle]; -- cgit From 0cf59d78bda1669226f861e438d43a08b099d747 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 3 Nov 2020 14:43:21 +0100 Subject: Implement Clone for everything that can be cloned. --- src/dynamics/rigid_body_set.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'src/dynamics') diff --git a/src/dynamics/rigid_body_set.rs b/src/dynamics/rigid_body_set.rs index 2efc2cf..f7064ed 100644 --- a/src/dynamics/rigid_body_set.rs +++ b/src/dynamics/rigid_body_set.rs @@ -75,6 +75,7 @@ impl BodyPair { } #[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))] +#[derive(Clone)] /// A set of rigid bodies that can be handled by a physics pipeline. pub struct RigidBodySet { // NOTE: the pub(crate) are needed by the broad phase -- cgit From c6af248e66c86c900d7703bcefeb1e6d185ffedf Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 3 Nov 2020 14:45:50 +0100 Subject: Rename reset_internal_links -> reset_internal_references. --- src/dynamics/rigid_body.rs | 2 +- src/dynamics/rigid_body_set.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/dynamics') diff --git a/src/dynamics/rigid_body.rs b/src/dynamics/rigid_body.rs index b04ca41..f85ab89 100644 --- a/src/dynamics/rigid_body.rs +++ b/src/dynamics/rigid_body.rs @@ -82,7 +82,7 @@ impl RigidBody { } } - pub(crate) fn reset_internal_links(&mut self) { + pub(crate) fn reset_internal_references(&mut self) { self.colliders = Vec::new(); self.joint_graph_index = RigidBodyGraphIndex::new(crate::INVALID_U32); self.active_island_id = crate::INVALID_USIZE; diff --git a/src/dynamics/rigid_body_set.rs b/src/dynamics/rigid_body_set.rs index f7064ed..b857173 100644 --- a/src/dynamics/rigid_body_set.rs +++ b/src/dynamics/rigid_body_set.rs @@ -158,7 +158,7 @@ impl RigidBodySet { pub fn insert(&mut self, mut rb: RigidBody) -> RigidBodyHandle { // Make sure the internal links are reset, they may not be // if this rigid-body was obtained by cloning another one. - rb.reset_internal_links(); + rb.reset_internal_references(); let handle = self.bodies.insert(rb); let rb = &mut self.bodies[handle]; -- cgit From 71611d3e30ce2fddee20832db3c3e0c8b6ba0d07 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 3 Nov 2020 15:08:06 +0100 Subject: Reset the rigid-bodies internal links properly. --- src/dynamics/rigid_body.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/dynamics') diff --git a/src/dynamics/rigid_body.rs b/src/dynamics/rigid_body.rs index f85ab89..d3bd8d7 100644 --- a/src/dynamics/rigid_body.rs +++ b/src/dynamics/rigid_body.rs @@ -84,11 +84,11 @@ impl RigidBody { pub(crate) fn reset_internal_references(&mut self) { self.colliders = Vec::new(); - self.joint_graph_index = RigidBodyGraphIndex::new(crate::INVALID_U32); - self.active_island_id = crate::INVALID_USIZE; - self.active_set_id = crate::INVALID_USIZE; - self.active_set_offset = crate::INVALID_USIZE; - self.active_set_timestamp = crate::INVALID_U32; + self.joint_graph_index = InteractionGraph::<()>::invalid_graph_index(); + self.active_island_id = 0; + self.active_set_id = 0; + self.active_set_offset = 0; + self.active_set_timestamp = 0; } pub(crate) fn integrate_accelerations(&mut self, dt: f32, gravity: Vector) { -- cgit