use roxlap_scene::{FogOfWar, GridId, Scene};
pub(crate) struct FogSpriteCull<'a> {
fow: &'a FogOfWar,
transform: roxlap_scene::GridTransform,
footprint: (glam::IVec2, glam::IVec2),
}
impl<'a> FogSpriteCull<'a> {
pub(crate) fn resolve(scene: &Scene, fow: Option<(GridId, &'a FogOfWar)>) -> Option<Self> {
let (gid, fow) = fow?;
let grid = scene.grid(gid)?;
let footprint = grid.footprint_cells()?;
Some(Self {
fow,
transform: grid.transform,
footprint,
})
}
pub(crate) fn hides(&self, center: [f32; 3]) -> bool {
self.fow.hides_sprite(
&self.transform,
self.footprint,
glam::DVec3::new(
f64::from(center[0]),
f64::from(center[1]),
f64::from(center[2]),
),
)
}
pub(crate) fn cull_key(&self) -> u64 {
let mut h: u64 = 0xcbf2_9ce4_8422_2325;
let mut mix = |v: u64| {
h ^= v;
h = h.wrapping_mul(0x0000_0100_0000_01b3);
};
mix(self.fow.sprite_epoch());
let t = &self.transform;
mix(t.origin.x.to_bits());
mix(t.origin.y.to_bits());
mix(t.origin.z.to_bits());
mix(t.rotation.x.to_bits());
mix(t.rotation.y.to_bits());
mix(t.rotation.z.to_bits());
mix(t.rotation.w.to_bits());
mix(t.voxel_world_size.to_bits());
h | (1u64 << 63)
}
}