aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTristan Guichaoua <tguichaoua.dev@gmail.com>2022-08-13 14:31:27 +0200
committerTristan Guichaoua <tguichaoua.dev@gmail.com>2022-08-13 14:31:27 +0200
commit6c2eca72a5dac16700ce668b75b3a9eee4e2ddda (patch)
tree12d73cbe0e7c1e6466e6a1ad5705a3795890e400 /src
parent68d250f0ad80bb2e5e10e43f2fd1b8824e2a1216 (diff)
downloadrapier-6c2eca72a5dac16700ce668b75b3a9eee4e2ddda.tar.gz
rapier-6c2eca72a5dac16700ce668b75b3a9eee4e2ddda.tar.bz2
rapier-6c2eca72a5dac16700ce668b75b3a9eee4e2ddda.zip
impl Group
Diffstat (limited to 'src')
-rw-r--r--src/geometry/interaction_groups.rs98
-rw-r--r--src/geometry/mod.rs2
2 files changed, 91 insertions, 9 deletions
diff --git a/src/geometry/interaction_groups.rs b/src/geometry/interaction_groups.rs
index b2961d9..09a20e9 100644
--- a/src/geometry/interaction_groups.rs
+++ b/src/geometry/interaction_groups.rs
@@ -18,14 +18,14 @@
#[repr(C)]
pub struct InteractionGroups {
/// Groups memberships.
- pub memberships: u32,
+ pub memberships: Group,
/// Groups filter.
- pub filter: u32,
+ pub filter: Group,
}
impl InteractionGroups {
/// Initializes with the given interaction groups and interaction mask.
- pub const fn new(memberships: u32, filter: u32) -> Self {
+ pub const fn new(memberships: Group, filter: Group) -> Self {
Self {
memberships,
filter,
@@ -34,22 +34,22 @@ impl InteractionGroups {
/// Allow interaction with everything.
pub const fn all() -> Self {
- Self::new(u32::MAX, u32::MAX)
+ Self::new(Group::ALL, Group::ALL)
}
/// Prevent all interactions.
pub const fn none() -> Self {
- Self::new(0, 0)
+ Self::new(Group::NONE, Group::NONE)
}
/// Sets the group this filter is part of.
- pub const fn with_memberships(mut self, memberships: u32) -> Self {
+ pub const fn with_memberships(mut self, memberships: Group) -> Self {
self.memberships = memberships;
self
}
/// Sets the interaction mask of this filter.
- pub const fn with_filter(mut self, filter: u32) -> Self {
+ pub const fn with_filter(mut self, filter: Group) -> Self {
self.filter = filter;
self
}
@@ -60,7 +60,10 @@ impl InteractionGroups {
/// with the filter of `rhs`, and vice-versa.
#[inline]
pub const fn test(self, rhs: Self) -> bool {
- (self.memberships & rhs.filter) != 0 && (rhs.memberships & self.filter) != 0
+ // NOTE: since const ops is not stable, we have to convert `Group` into u32
+ // to use & operator in const context.
+ (self.memberships.bits() & rhs.filter.bits()) != 0
+ && (rhs.memberships.bits() & self.filter.bits()) != 0
}
}
@@ -69,3 +72,82 @@ impl Default for InteractionGroups {
Self::all()
}
}
+
+use bitflags::bitflags;
+
+bitflags! {
+ /// A bit mask identifying groups for interaction.
+ #[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
+ #[allow(missing_docs)]
+ pub struct Group: u32 {
+ /// The group n°1.
+ const GROUP_1 = 1 << 0;
+ /// The group n°2.
+ const GROUP_2 = 1 << 1;
+ /// The group n°3.
+ const GROUP_3 = 1 << 2;
+ /// The group n°4.
+ const GROUP_4 = 1 << 3;
+ /// The group n°5.
+ const GROUP_5 = 1 << 4;
+ /// The group n°6.
+ const GROUP_6 = 1 << 5;
+ /// The group n°7.
+ const GROUP_7 = 1 << 6;
+ /// The group n°8.
+ const GROUP_8 = 1 << 7;
+ /// The group n°9.
+ const GROUP_9 = 1 << 8;
+ /// The group n°10.
+ const GROUP_10 = 1 << 9;
+ /// The group n°11.
+ const GROUP_11 = 1 << 10;
+ /// The group n°12.
+ const GROUP_12 = 1 << 11;
+ /// The group n°13.
+ const GROUP_13 = 1 << 12;
+ /// The group n°14.
+ const GROUP_14 = 1 << 13;
+ /// The group n°15.
+ const GROUP_15 = 1 << 14;
+ /// The group n°16.
+ const GROUP_16 = 1 << 15;
+ /// The group n°17.
+ const GROUP_17 = 1 << 16;
+ /// The group n°18.
+ const GROUP_18 = 1 << 17;
+ /// The group n°19.
+ const GROUP_19 = 1 << 18;
+ /// The group n°20.
+ const GROUP_20 = 1 << 19;
+ /// The group n°21.
+ const GROUP_21 = 1 << 20;
+ /// The group n°22.
+ const GROUP_22 = 1 << 21;
+ /// The group n°23.
+ const GROUP_23 = 1 << 22;
+ /// The group n°24.
+ const GROUP_24 = 1 << 23;
+ /// The group n°25.
+ const GROUP_25 = 1 << 24;
+ /// The group n°26.
+ const GROUP_26 = 1 << 25;
+ /// The group n°27.
+ const GROUP_27 = 1 << 26;
+ /// The group n°28.
+ const GROUP_28 = 1 << 27;
+ /// The group n°29.
+ const GROUP_29 = 1 << 28;
+ /// The group n°30.
+ const GROUP_30 = 1 << 29;
+ /// The group n°31.
+ const GROUP_31 = 1 << 30;
+ /// The group n°32.
+ const GROUP_32 = 1 << 31;
+
+ /// All of the groups.
+ const ALL = u32::MAX;
+ /// None of the groups.
+ const NONE = 0;
+ }
+}
diff --git a/src/geometry/mod.rs b/src/geometry/mod.rs
index 4be914d..0cec051 100644
--- a/src/geometry/mod.rs
+++ b/src/geometry/mod.rs
@@ -8,7 +8,7 @@ pub use self::contact_pair::{
pub use self::interaction_graph::{
ColliderGraphIndex, InteractionGraph, RigidBodyGraphIndex, TemporaryInteractionIndex,
};
-pub use self::interaction_groups::InteractionGroups;
+pub use self::interaction_groups::{Group, InteractionGroups};
pub use self::narrow_phase::NarrowPhase;
pub use self::collider::{Collider, ColliderBuilder};