#[derive(Debug, Clone)]
pub enum UniformValue {
Float(f64),
Vec3([f64; 3]),
Vec4([f64; 4]),
Mat4([f64; 16]),
Int(i32),
}
pub struct ShaderData {
pub name: &'static str,
pub uniforms: Vec<(&'static str, UniformValue)>,
}
pub fn terrain() -> ShaderData {
ShaderData {
name: "mars_terrain",
uniforms: vec![
("u_sun_direction", UniformValue::Vec3([0.0, 1.0, 0.0])),
("u_camera_pos", UniformValue::Vec3([0.0, 0.0, 0.0])),
("u_planet_radius", UniformValue::Float(crate::MARS_RADIUS)),
("u_atmosphere_height", UniformValue::Float(200_000.0)),
(
"u_dust_optical_depth",
UniformValue::Float(crate::MEAN_DUST_OPTICAL_DEPTH),
),
],
}
}
pub fn atmosphere() -> ShaderData {
ShaderData {
name: "mars_atmosphere",
uniforms: vec![
(
"u_rayleigh_coeff",
UniformValue::Vec3([19.918e-6, 13.57e-6, 5.75e-6]),
),
("u_mie_coeff", UniformValue::Float(4.0e-5)),
("u_mie_g", UniformValue::Float(0.76)),
("u_sun_intensity", UniformValue::Float(590.0)),
("u_dust_color", UniformValue::Vec3([0.9, 0.6, 0.3])),
],
}
}
pub fn dust_storm() -> ShaderData {
ShaderData {
name: "mars_dust_storm",
uniforms: vec![
(
"u_optical_depth",
UniformValue::Float(crate::GLOBAL_STORM_OPTICAL_DEPTH),
),
("u_dust_albedo", UniformValue::Float(0.25)),
("u_dust_asymmetry", UniformValue::Float(0.65)),
("u_storm_coverage", UniformValue::Float(0.0)),
],
}
}