aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/geometry/mod.rs')
-rw-r--r--src/geometry/mod.rs55
1 files changed, 37 insertions, 18 deletions
diff --git a/src/geometry/mod.rs b/src/geometry/mod.rs
index 7733ad2..d64c270 100644
--- a/src/geometry/mod.rs
+++ b/src/geometry/mod.rs
@@ -50,27 +50,28 @@ pub type PointProjection = parry::query::PointProjection;
pub type TOI = parry::query::TOI;
pub use parry::shape::SharedShape;
+bitflags::bitflags! {
+ #[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
+ pub struct CollisionEventFlags: u32 {
+ /// Flag set if at least one of the colliders involved in the
+ /// collision was a sensor when the event was fired.
+ const SENSOR = 0b0001;
+ /// Flag set if a `CollisionEvent::Stopped` was fired because
+ /// at least one of the colliders was removed.
+ const REMOVED = 0b0010;
+ }
+}
+
#[derive(Copy, Clone, Hash, Debug)]
-/// Events occurring when two colliders start or stop being in contact (or intersecting)
+/// Events occurring when two colliders start or stop colliding
pub enum CollisionEvent {
- /// Event occurring when two colliders start being in contact (or intersecting)
- Started(ColliderHandle, ColliderHandle),
- /// Event occurring when two colliders stop being in contact (or intersecting).
- ///
- /// The boolean is set to `true` of this event originates from at least one of
- /// the colliders being removed from the `ColliderSet`.
- Stopped(ColliderHandle, ColliderHandle, bool),
+ /// Event occurring when two colliders start colliding
+ Started(ColliderHandle, ColliderHandle, CollisionEventFlags),
+ /// Event occurring when two colliders stop colliding.
+ Stopped(ColliderHandle, ColliderHandle, CollisionEventFlags),
}
impl CollisionEvent {
- pub(crate) fn new(h1: ColliderHandle, h2: ColliderHandle, start: bool) -> Self {
- if start {
- Self::Started(h1, h2)
- } else {
- Self::Stopped(h1, h2, false)
- }
- }
-
/// Is this a `Started` collision event?
pub fn started(self) -> bool {
matches!(self, CollisionEvent::Started(..))
@@ -84,14 +85,32 @@ impl CollisionEvent {
/// The handle of the first collider involved in this collision event.
pub fn collider1(self) -> ColliderHandle {
match self {
- Self::Started(h, _) | Self::Stopped(h, _, _) => h,
+ Self::Started(h, _, _) | Self::Stopped(h, _, _) => h,
}
}
/// The handle of the second collider involved in this collision event.
pub fn collider2(self) -> ColliderHandle {
match self {
- Self::Started(_, h) | Self::Stopped(_, h, _) => h,
+ Self::Started(_, h, _) | Self::Stopped(_, h, _) => h,
+ }
+ }
+
+ /// Was at least one of the colliders involved in the collision a sensor?
+ pub fn sensor(self) -> bool {
+ match self {
+ Self::Started(_, _, f) | Self::Stopped(_, _, f) => {
+ f.contains(CollisionEventFlags::SENSOR)
+ }
+ }
+ }
+
+ /// Was at least one of the colliders involved in the collision removed?
+ pub fn removed(self) -> bool {
+ match self {
+ Self::Started(_, _, f) | Self::Stopped(_, _, f) => {
+ f.contains(CollisionEventFlags::REMOVED)
+ }
}
}
}