1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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)
}),
)
}
}