aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/collider_set.rs
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2020-10-05 19:04:18 +0200
committerCrozet Sébastien <developer@crozet.re>2020-10-05 19:04:18 +0200
commit93aa7b6e1e8cbfd73542ed10ad5c26ae0a8b9848 (patch)
tree5d602450c5b5e1c0c08eeffd3196b373b4312a08 /src/geometry/collider_set.rs
parent2d0a888484dd296cc785caf978252dd97b58e10a (diff)
downloadrapier-93aa7b6e1e8cbfd73542ed10ad5c26ae0a8b9848.tar.gz
rapier-93aa7b6e1e8cbfd73542ed10ad5c26ae0a8b9848.tar.bz2
rapier-93aa7b6e1e8cbfd73542ed10ad5c26ae0a8b9848.zip
Use the publish-subscribe mechanism to handle collider removals across pipelines.
Diffstat (limited to 'src/geometry/collider_set.rs')
-rw-r--r--src/geometry/collider_set.rs45
1 files changed, 42 insertions, 3 deletions
diff --git a/src/geometry/collider_set.rs b/src/geometry/collider_set.rs
index 22bba1b..3a259ae 100644
--- a/src/geometry/collider_set.rs
+++ b/src/geometry/collider_set.rs
@@ -1,14 +1,25 @@
use crate::data::arena::Arena;
+use crate::data::pubsub::PubSub;
use crate::dynamics::{RigidBodyHandle, RigidBodySet};
-use crate::geometry::Collider;
+use crate::geometry::{Collider, ColliderGraphIndex};
use std::ops::{Index, IndexMut};
/// The unique identifier of a collider added to a collider set.
pub type ColliderHandle = crate::data::arena::Index;
+#[derive(Copy, Clone, Debug)]
+#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
+pub(crate) struct RemovedCollider {
+ pub handle: ColliderHandle,
+ pub(crate) contact_graph_index: ColliderGraphIndex,
+ pub(crate) proximity_graph_index: ColliderGraphIndex,
+ pub(crate) proxy_index: usize,
+}
+
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
/// A set of colliders that can be handled by a physics `World`.
pub struct ColliderSet {
+ pub(crate) removed_colliders: PubSub<RemovedCollider>,
pub(crate) colliders: Arena<Collider>,
}
@@ -16,6 +27,7 @@ impl ColliderSet {
/// Create a new empty set of colliders.
pub fn new() -> Self {
ColliderSet {
+ removed_colliders: PubSub::new(),
colliders: Arena::new(),
}
}
@@ -60,8 +72,35 @@ impl ColliderSet {
handle
}
- pub(crate) fn remove_internal(&mut self, handle: ColliderHandle) -> Option<Collider> {
- self.colliders.remove(handle)
+ /// Remove a collider from this set and update its parent accordingly.
+ pub fn remove(
+ &mut self,
+ handle: ColliderHandle,
+ bodies: &mut RigidBodySet,
+ ) -> Option<Collider> {
+ let collider = self.colliders.remove(handle)?;
+
+ /*
+ * Delete the collider from its parent body.
+ */
+ if let Some(mut parent) = bodies.get_mut_internal(collider.parent) {
+ parent.remove_collider_internal(handle, &collider);
+ bodies.wake_up(collider.parent, true);
+ }
+
+ /*
+ * Publish removal.
+ */
+ let message = RemovedCollider {
+ handle,
+ contact_graph_index: collider.contact_graph_index,
+ proximity_graph_index: collider.proximity_graph_index,
+ proxy_index: collider.proxy_index,
+ };
+
+ self.removed_colliders.publish(message);
+
+ Some(collider)
}
/// Gets the collider with the given handle without a known generation.