#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct RenderLayers(pub u64);
impl RenderLayers {
pub const DEFAULT: Self = Self(1);
pub const NONE: Self = Self(0);
pub const ALL: Self = Self(u64::MAX);
#[inline]
pub const fn layer(n: u8) -> Self {
if n >= 64 { Self::NONE } else { Self(1u64 << n) }
}
#[inline]
pub const fn none() -> Self {
Self::NONE
}
#[inline]
pub const fn with(self, n: u8) -> Self {
if n >= 64 {
self
} else {
Self(self.0 | (1u64 << n))
}
}
#[inline]
pub const fn without(self, n: u8) -> Self {
if n >= 64 {
self
} else {
Self(self.0 & !(1u64 << n))
}
}
#[inline]
pub const fn intersects(self, other: Self) -> bool {
self.0 & other.0 != 0
}
#[inline]
pub const fn bits(self) -> u64 {
self.0
}
}
impl Default for RenderLayers {
fn default() -> Self {
Self::DEFAULT
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_intersects_layer0() {
assert!(RenderLayers::DEFAULT.intersects(RenderLayers::layer(0)));
assert!(!RenderLayers::DEFAULT.intersects(RenderLayers::layer(1)));
}
#[test]
fn empty_never_intersects() {
assert!(!RenderLayers::NONE.intersects(RenderLayers::NONE));
assert!(!RenderLayers::NONE.intersects(RenderLayers::ALL));
}
#[test]
fn with_without() {
let layers = RenderLayers::layer(0).with(3).with(7);
assert!(layers.intersects(RenderLayers::layer(3)));
assert!(!layers.without(3).intersects(RenderLayers::layer(3)));
}
}