#[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: "jupiter_cloud_top_pbr",
uniforms: vec![
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_planet_radius",
value: UniformValue::Float(crate::JUPITEREQUATORIALRADIUS as f32),
},
ShaderUniform {
name: "u_atmosphere_height",
value: UniformValue::Float(1_000_000.0),
},
ShaderUniform {
name: "u_max_wind",
value: UniformValue::Float(crate::MAXWINDSMS as f32),
},
],
}
}
pub fn atmosphere() -> Self {
Self {
name: "jupiter_atmosphere_scattering",
uniforms: vec![
ShaderUniform {
name: "u_rayleigh_coeff",
value: UniformValue::Vec3([1.0e-6, 2.8e-6, 7.2e-6]),
},
ShaderUniform {
name: "u_mie_coeff",
value: UniformValue::Float(8e-6),
},
ShaderUniform {
name: "u_mie_g",
value: UniformValue::Float(0.78),
},
ShaderUniform {
name: "u_sun_intensity",
value: UniformValue::Float(0.81),
},
ShaderUniform {
name: "u_scale_height_rayleigh",
value: UniformValue::Float(*crate::SCALEHEIGHT as f32),
},
ShaderUniform {
name: "u_scale_height_mie",
value: UniformValue::Float(20_000.0),
},
ShaderUniform {
name: "u_ammonia_absorption",
value: UniformValue::Vec3([0.001, 0.0005, 0.0002]),
},
],
}
}
pub fn interior_ocean() -> Self {
Self {
name: "jupiter_interior_ocean",
uniforms: vec![
ShaderUniform {
name: "u_pressure",
value: UniformValue::Float(400.0),
},
ShaderUniform {
name: "u_temperature",
value: UniformValue::Float(10_000.0),
},
ShaderUniform {
name: "u_deep_color",
value: UniformValue::Vec3([0.10, 0.08, 0.05]),
},
ShaderUniform {
name: "u_emissive",
value: UniformValue::Vec3([0.005, 0.005, 0.008]),
},
ShaderUniform {
name: "u_density",
value: UniformValue::Float(1_000.0),
},
],
}
}
pub fn band_dynamics() -> Self {
Self {
name: "jupiter_band_dynamics",
uniforms: vec![
ShaderUniform {
name: "u_band_count",
value: UniformValue::Int(24),
},
ShaderUniform {
name: "u_zone_albedo",
value: UniformValue::Float(0.85),
},
ShaderUniform {
name: "u_belt_albedo",
value: UniformValue::Float(0.45),
},
ShaderUniform {
name: "u_differential_rotation",
value: UniformValue::Float(0.02),
},
],
}
}
}