pub use gizmo_math::{Aabb, Frustum, Mat4};
#[inline]
pub fn visible_in_frustum(frustum: &Frustum, model_matrix: &Mat4, local_aabb: Aabb) -> bool {
frustum.intersects_aabb(local_aabb.transform(model_matrix))
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Visibility {
Camera,
ShadowOnly,
Culled,
}
pub fn classify_visibility(
camera_frustum: &Frustum,
cascade_frusta: &[Frustum],
model: &Mat4,
local_aabb: Aabb,
material_type: crate::components::MaterialType,
is_transparent: bool,
albedo_alpha: f32,
) -> Visibility {
if visible_in_frustum(camera_frustum, model, local_aabb) {
return Visibility::Camera;
}
let is_caster = !is_transparent
&& albedo_alpha >= 0.99
&& !matches!(
material_type,
crate::components::MaterialType::Unlit
| crate::components::MaterialType::Skybox
| crate::components::MaterialType::Grid
);
if is_caster
&& cascade_frusta
.iter()
.any(|f| visible_in_frustum(f, model, local_aabb))
{
Visibility::ShadowOnly
} else {
Visibility::Culled
}
}