#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LayerMask {
pub memberships: u32,
pub filter: u32,
}
impl LayerMask {
pub const ALL: LayerMask = LayerMask {
memberships: u32::MAX,
filter: u32::MAX,
};
pub(crate) const fn interacts_with(self, other: LayerMask) -> bool {
(self.memberships & other.filter) != 0 && (other.memberships & self.filter) != 0
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn everything_admits_everything() {
assert!(LayerMask::ALL.interacts_with(LayerMask::ALL));
}
#[test]
fn a_one_way_filter_blocks_the_pair_from_both_sides() {
let open = LayerMask::ALL;
let closed = LayerMask {
memberships: u32::MAX,
filter: 0,
};
assert!(!open.interacts_with(closed));
assert!(!closed.interacts_with(open));
}
#[test]
fn disjoint_layers_never_meet() {
let first = LayerMask {
memberships: 0b01,
filter: 0b01,
};
let second = LayerMask {
memberships: 0b10,
filter: 0b10,
};
assert!(!first.interacts_with(second));
assert!(first.interacts_with(first));
}
}