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