#[derive(Debug, Clone)]
pub enum UniformValue {
Float(f32),
Vec3([f32; 3]),
Vec4([f32; 4]),
Mat4([f32; 16]),
Int(i32),
}
#[derive(Debug, Clone)]
pub struct ShaderUniform {
pub name: &'static str,
pub value: UniformValue,
}
pub struct ShaderEndpoint {
pub name: &'static str,
pub uniforms: Vec<ShaderUniform>,
}
impl ShaderEndpoint {
pub fn terrain() -> Self {
Self {
name: "venus_terrain_pbr",
uniforms: vec![
ShaderUniform {
name: "u_planet_radius",
value: UniformValue::Float(crate::VENUS_RADIUS as f32),
},
ShaderUniform {
name: "u_sun_direction",
value: UniformValue::Vec3([0.0, 1.0, 0.0]),
},
ShaderUniform {
name: "u_camera_pos",
value: UniformValue::Vec3([0.0, 0.0, 0.0]),
},
ShaderUniform {
name: "u_surface_pressure_bar",
value: UniformValue::Float(92.0),
},
ShaderUniform {
name: "u_surface_temperature_k",
value: UniformValue::Float(crate::MEAN_TEMPERATURE_K as f32),
},
ShaderUniform {
name: "u_max_elevation",
value: UniformValue::Float(crate::MAX_MOUNTAIN_HEIGHT_M as f32),
},
],
}
}
pub fn atmosphere() -> Self {
Self {
name: "venus_atmosphere_scattering",
uniforms: vec![
ShaderUniform {
name: "u_rayleigh_coeff",
value: UniformValue::Vec3([1.9e-7, 5.1e-7, 1.3e-6]),
},
ShaderUniform {
name: "u_cloud_optical_depth",
value: UniformValue::Float(crate::MEAN_CLOUD_OPTICAL_DEPTH as f32),
},
ShaderUniform {
name: "u_scale_height",
value: UniformValue::Float(crate::SCALE_HEIGHT_M as f32),
},
ShaderUniform {
name: "u_sun_intensity",
value: UniformValue::Float(0.0),
},
ShaderUniform {
name: "u_cloud_scatter_albedo",
value: UniformValue::Float(0.998),
},
],
}
}
pub fn surface_haze() -> Self {
Self {
name: "venus_surface_haze",
uniforms: vec![
ShaderUniform {
name: "u_haze_density",
value: UniformValue::Float(65.0),
},
ShaderUniform {
name: "u_visibility_km",
value: UniformValue::Float(1.0),
},
ShaderUniform {
name: "u_haze_color",
value: UniformValue::Vec3([0.95, 0.80, 0.50]),
},
],
}
}
}