aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/data/graph.rs10
-rw-r--r--src/dynamics/joint/joint.rs1
-rw-r--r--src/dynamics/rigid_body.rs25
-rw-r--r--src/dynamics/rigid_body_set.rs6
-rw-r--r--src/geometry/collider.rs19
-rw-r--r--src/geometry/collider_set.rs4
6 files changed, 28 insertions, 37 deletions
diff --git a/src/data/graph.rs b/src/data/graph.rs
index ea27e03..de958c3 100644
--- a/src/data/graph.rs
+++ b/src/data/graph.rs
@@ -749,20 +749,12 @@ impl<N, E> IndexMut<EdgeIndex> for Graph<N, E> {
/// The walker does not borrow from the graph, so it lets you step through
/// neighbors or incident edges while also mutating graph weights, as
/// in the following example:
+#[derive(Clone)]
pub struct WalkNeighbors {
skip_start: NodeIndex,
next: [EdgeIndex; 2],
}
-impl Clone for WalkNeighbors {
- fn clone(&self) -> Self {
- WalkNeighbors {
- skip_start: self.skip_start,
- next: self.next,
- }
- }
-}
-
/// Reference to a `Graph` edge.
#[derive(Debug)]
pub struct EdgeReference<'a, E: 'a> {
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<PrismaticJoint> 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<f32>,
@@ -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<f32>) {
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];
diff --git a/src/geometry/collider.rs b/src/geometry/collider.rs
index f53d75a..524f265 100644
--- a/src/geometry/collider.rs
+++ b/src/geometry/collider.rs
@@ -188,6 +188,7 @@ impl<'de> serde::Deserialize<'de> for ColliderShape {
}
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
+#[derive(Clone)]
/// A geometric entity that can be attached to a body so it can be affected by contacts and proximity queries.
///
/// To build a new collider, use the `ColliderBuilder` structure.
@@ -212,20 +213,14 @@ pub struct Collider {
pub user_data: u128,
}
-impl Clone for Collider {
- fn clone(&self) -> Self {
- Self {
- shape: self.shape.clone(),
- parent: RigidBodySet::invalid_handle(),
- contact_graph_index: ColliderGraphIndex::new(crate::INVALID_U32),
- proximity_graph_index: ColliderGraphIndex::new(crate::INVALID_U32),
- proxy_index: crate::INVALID_USIZE,
- ..*self
- }
+impl Collider {
+ pub(crate) fn reset_internal_links(&mut self) {
+ self.parent = RigidBodySet::invalid_handle();
+ self.contact_graph_index = ColliderGraphIndex::new(crate::INVALID_U32);
+ self.proximity_graph_index = ColliderGraphIndex::new(crate::INVALID_U32);
+ self.proxy_index = crate::INVALID_USIZE;
}
-}
-impl Collider {
/// The rigid body this collider is attached to.
pub fn parent(&self) -> RigidBodyHandle {
self.parent
diff --git a/src/geometry/collider_set.rs b/src/geometry/collider_set.rs
index 5ac9658..d2bb8cc 100644
--- a/src/geometry/collider_set.rs
+++ b/src/geometry/collider_set.rs
@@ -59,6 +59,10 @@ impl ColliderSet {
parent_handle: RigidBodyHandle,
bodies: &mut RigidBodySet,
) -> ColliderHandle {
+ // Make sure the internal links are reset, they may not be
+ // if this rigid-body was obtained by cloning another one.
+ coll.reset_internal_links();
+
coll.parent = parent_handle;
let parent = bodies
.get_mut_internal(parent_handle)