concinnity_core/physics/layers/
mask.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub struct LayerMask {
11 pub memberships: u32,
13 pub filter: u32,
15}
16
17impl LayerMask {
18 pub const ALL: LayerMask = LayerMask {
20 memberships: u32::MAX,
21 filter: u32::MAX,
22 };
23
24 pub(crate) const fn interacts_with(self, other: LayerMask) -> bool {
27 (self.memberships & other.filter) != 0 && (other.memberships & self.filter) != 0
28 }
29}
30
31#[cfg(test)]
32mod tests {
33 use super::*;
34
35 #[test]
36 fn everything_admits_everything() {
37 assert!(LayerMask::ALL.interacts_with(LayerMask::ALL));
38 }
39
40 #[test]
41 fn a_one_way_filter_blocks_the_pair_from_both_sides() {
42 let open = LayerMask::ALL;
43 let closed = LayerMask {
44 memberships: u32::MAX,
45 filter: 0,
46 };
47 assert!(!open.interacts_with(closed));
48 assert!(!closed.interacts_with(open));
49 }
50
51 #[test]
52 fn disjoint_layers_never_meet() {
53 let first = LayerMask {
54 memberships: 0b01,
55 filter: 0b01,
56 };
57 let second = LayerMask {
58 memberships: 0b10,
59 filter: 0b10,
60 };
61 assert!(!first.interacts_with(second));
62 assert!(first.interacts_with(first));
63 }
64}