aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2020-11-02 19:00:12 +0100
committerGitHub <noreply@github.com>2020-11-02 19:00:12 +0100
commitb4bf737f02872e152fb9a7804d0759095ee55e24 (patch)
tree63662f1a0c3dbe083cc64903bcb42cedec62d254
parent9c72a0458b89741ce31744efa2d33f4b75de0d79 (diff)
parenta4a4ddb5b4f03a6cf855ff4120803863e3c60a4f (diff)
downloadrapier-b4bf737f02872e152fb9a7804d0759095ee55e24.tar.gz
rapier-b4bf737f02872e152fb9a7804d0759095ee55e24.tar.bz2
rapier-b4bf737f02872e152fb9a7804d0759095ee55e24.zip
Merge pull request #50 from dimforge/joint_removal
Implement joint removal.
-rw-r--r--src/dynamics/joint/joint_set.rs32
-rw-r--r--src_testbed/testbed.rs10
2 files changed, 42 insertions, 0 deletions
diff --git a/src/dynamics/joint/joint_set.rs b/src/dynamics/joint/joint_set.rs
index 2b1895f..5144d97 100644
--- a/src/dynamics/joint/joint_set.rs
+++ b/src/dynamics/joint/joint_set.rs
@@ -181,6 +181,38 @@ impl JointSet {
}
}
+ /// Removes a joint from this set.
+ ///
+ /// If `wake_up` is set to `true`, then the bodies attached to this joint will be
+ /// automatically woken up.
+ pub fn remove(
+ &mut self,
+ handle: JointHandle,
+ bodies: &mut RigidBodySet,
+ wake_up: bool,
+ ) -> Option<Joint> {
+ let id = self.joint_ids.remove(handle)?;
+ let endpoints = self.joint_graph.graph.edge_endpoints(id)?;
+
+ if wake_up {
+ // Wake-up the bodies attached to this joint.
+ if let Some(rb_handle) = self.joint_graph.graph.node_weight(endpoints.0) {
+ bodies.wake_up(*rb_handle, true);
+ }
+ if let Some(rb_handle) = self.joint_graph.graph.node_weight(endpoints.1) {
+ bodies.wake_up(*rb_handle, true);
+ }
+ }
+
+ let removed_joint = self.joint_graph.graph.remove_edge(id);
+
+ if let Some(edge) = self.joint_graph.graph.edge_weight(id) {
+ self.joint_ids[edge.handle] = id;
+ }
+
+ removed_joint
+ }
+
pub(crate) fn remove_rigid_body(
&mut self,
deleted_id: RigidBodyGraphIndex,
diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs
index 3bf720a..7160b3b 100644
--- a/src_testbed/testbed.rs
+++ b/src_testbed/testbed.rs
@@ -847,6 +847,16 @@ impl Testbed {
);
}
}
+ WindowEvent::Key(Key::J, Action::Release, _) => {
+ // Delete 10% of the remaining joints.
+ let joints: Vec<_> = self.physics.joints.iter().map(|e| e.0).collect();
+ let num_to_delete = (joints.len() / 10).max(1);
+ for to_delete in &joints[..num_to_delete] {
+ self.physics
+ .joints
+ .remove(*to_delete, &mut self.physics.bodies, true);
+ }
+ }
WindowEvent::CursorPos(x, y, _) => {
self.cursor_pos.x = x as f32;
self.cursor_pos.y = y as f32;