diff options
Diffstat (limited to 'src/geometry/interaction_groups.rs')
| -rw-r--r-- | src/geometry/interaction_groups.rs | 98 |
1 files changed, 90 insertions, 8 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; + } +} |
