diff options
| -rw-r--r-- | examples2d/collision_groups2.rs | 4 | ||||
| -rw-r--r-- | examples3d/collision_groups3.rs | 4 | ||||
| -rw-r--r-- | src/geometry/interaction_groups.rs | 98 | ||||
| -rw-r--r-- | src/geometry/mod.rs | 2 |
4 files changed, 95 insertions, 13 deletions
diff --git a/examples2d/collision_groups2.rs b/examples2d/collision_groups2.rs index 707696c..f84f139 100644 --- a/examples2d/collision_groups2.rs +++ b/examples2d/collision_groups2.rs @@ -24,8 +24,8 @@ pub fn init_world(testbed: &mut Testbed) { /* * Setup groups */ - const GREEN_GROUP: InteractionGroups = InteractionGroups::new(0b01, 0b01); - const BLUE_GROUP: InteractionGroups = InteractionGroups::new(0b10, 0b10); + const GREEN_GROUP: InteractionGroups = InteractionGroups::new(Group::GROUP_1, Group::GROUP_1); + const BLUE_GROUP: InteractionGroups = InteractionGroups::new(Group::GROUP_2, Group::GROUP_2); /* * A green floor that will collide with the GREEN group only. diff --git a/examples3d/collision_groups3.rs b/examples3d/collision_groups3.rs index 480ac3e..b9eea79 100644 --- a/examples3d/collision_groups3.rs +++ b/examples3d/collision_groups3.rs @@ -24,8 +24,8 @@ pub fn init_world(testbed: &mut Testbed) { /* * Setup groups */ - const GREEN_GROUP: InteractionGroups = InteractionGroups::new(0b01, 0b01); - const BLUE_GROUP: InteractionGroups = InteractionGroups::new(0b10, 0b10); + const GREEN_GROUP: InteractionGroups = InteractionGroups::new(Group::GROUP_1, Group::GROUP_1); + const BLUE_GROUP: InteractionGroups = InteractionGroups::new(Group::GROUP_2, Group::GROUP_2); /* * A green floor that will collide with the GREEN group only. 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}; |
