use scenix_core::ValidationError;
#[derive(Clone, Copy, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ShadowConfig {
pub map_size: u32,
pub near: f32,
pub far: f32,
pub bias: f32,
pub pcf_radius: u32,
pub cascades: u8,
}
impl ShadowConfig {
#[inline]
pub const fn new(map_size: u32, near: f32, far: f32) -> Self {
Self {
map_size,
near,
far,
bias: 0.0005,
pcf_radius: 1,
cascades: 1,
}
}
#[inline]
pub const fn bias(mut self, bias: f32) -> Self {
self.bias = bias;
self
}
#[inline]
pub const fn pcf_radius(mut self, pcf_radius: u32) -> Self {
self.pcf_radius = pcf_radius;
self
}
#[inline]
pub const fn cascades(mut self, cascades: u8) -> Self {
self.cascades = cascades;
self
}
pub const fn validate(self) -> Result<(), ValidationError> {
if self.map_size == 0 || !self.map_size.is_power_of_two() {
return Err(ValidationError::OutOfRange);
}
if self.near <= 0.0 || self.far <= self.near {
return Err(ValidationError::OutOfRange);
}
if self.cascades == 0 || self.cascades > 4 {
return Err(ValidationError::OutOfRange);
}
Ok(())
}
}
impl Default for ShadowConfig {
#[inline]
fn default() -> Self {
Self::new(1024, 0.1, 100.0)
}
}