diff options
| author | Sébastien Crozet <developer@crozet.re> | 2020-11-02 19:00:12 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-02 19:00:12 +0100 |
| commit | b4bf737f02872e152fb9a7804d0759095ee55e24 (patch) | |
| tree | 63662f1a0c3dbe083cc64903bcb42cedec62d254 | |
| parent | 9c72a0458b89741ce31744efa2d33f4b75de0d79 (diff) | |
| parent | a4a4ddb5b4f03a6cf855ff4120803863e3c60a4f (diff) | |
| download | rapier-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.rs | 32 | ||||
| -rw-r--r-- | src_testbed/testbed.rs | 10 |
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; |
