use nalgebra::Point3;
use palette::{Gradient, LinSrgba};
use serde::Deserialize;
use std::collections::HashMap;
use crate::render::Shader;
#[derive(Deserialize)]
pub struct ShaderBuilder {
sun_pos: Point3<f64>,
light: [f64; 3],
shadow: [f64; 2],
spec_pow: i32,
occ_dist: [f64; 2],
fall_off: f64,
soft_shadow_samples: Option<(i32, f64)>,
ambient_shadow_samples: Option<(i32, i32)>,
sky_grad: String,
data_grad: String,
}
impl ShaderBuilder {
#[inline]
#[must_use]
pub fn used_gradient_names(&self) -> Vec<String> {
vec![self.sky_grad.clone(), self.data_grad.clone()]
}
}
impl<'a> ShaderBuilder {
#[inline]
#[must_use]
pub fn build(&self, grads: &'a HashMap<String, Gradient<LinSrgba>>) -> Shader<'a> {
let soft_shadow_samples = if let Some((n, alpha)) = self.soft_shadow_samples {
Some((n, alpha.to_radians()))
} else {
None
};
Shader::new(
self.sun_pos,
self.light,
self.shadow,
self.spec_pow,
self.occ_dist,
self.fall_off,
soft_shadow_samples,
self.ambient_shadow_samples,
grads.get(&self.sky_grad).unwrap_or_else(|| {
panic!("Failed to link shader-gradient key: {}", &self.sky_grad)
}),
grads.get(&self.data_grad).unwrap_or_else(|| {
panic!("Failed to link shader-gradient key: {}", &self.data_grad)
}),
)
}
}