#[derive(Debug, Clone)]
pub enum UniformValue {
Float(f32),
Vec3([f32; 3]),
Vec4([f32; 4]),
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: "enceladus_terrain_pbr",
uniforms: vec![
ShaderUniform {
name: "u_planet_radius",
value: UniformValue::Float(crate::ENCELADUS_RADIUS_M 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_temp_k",
value: UniformValue::Float(75.0),
},
ShaderUniform {
name: "u_ice_albedo",
value: UniformValue::Float(0.99),
},
],
}
}
pub fn plume() -> Self {
Self {
name: "enceladus_plume_scatter",
uniforms: vec![
ShaderUniform {
name: "u_plume_height_km",
value: UniformValue::Float(500.0),
},
ShaderUniform {
name: "u_plume_opacity",
value: UniformValue::Float(0.15),
},
ShaderUniform {
name: "u_particle_scatter_color",
value: UniformValue::Vec3([0.95, 0.97, 1.0]),
},
ShaderUniform {
name: "u_sun_direction",
value: UniformValue::Vec3([0.0, 1.0, 0.0]),
},
],
}
}
pub fn tiger_stripe() -> Self {
Self {
name: "enceladus_tiger_stripe_thermal",
uniforms: vec![
ShaderUniform {
name: "u_vent_temp_k",
value: UniformValue::Float(197.0),
},
ShaderUniform {
name: "u_background_temp_k",
value: UniformValue::Float(75.0),
},
ShaderUniform {
name: "u_thermal_glow_color",
value: UniformValue::Vec3([0.8, 0.6, 0.3]),
},
ShaderUniform {
name: "u_thermal_output_gw",
value: UniformValue::Float(15.8),
},
],
}
}
}