use sciforge::hub::prelude::constants::EARTH_RADIUS;
pub struct ShaderData {
pub name: String,
pub uniforms: Vec<ShaderUniform>,
}
#[derive(Debug, Clone)]
pub enum UniformValue {
Float(f32),
Vec3([f32; 3]),
Vec4([f32; 4]),
Mat4([[f32; 4]; 4]),
Int(i32),
}
#[derive(Debug, Clone)]
pub struct ShaderUniform {
pub name: String,
pub value: UniformValue,
}
impl ShaderData {
pub fn terrain() -> Self {
Self {
name: "terrain_pbr".to_string(),
uniforms: vec![
ShaderUniform {
name: "u_sun_direction".into(),
value: UniformValue::Vec3([0.0, 1.0, 0.0]),
},
ShaderUniform {
name: "u_camera_pos".into(),
value: UniformValue::Vec3([0.0, 0.0, 0.0]),
},
ShaderUniform {
name: "u_planet_radius".into(),
value: UniformValue::Float(EARTH_RADIUS as f32),
},
ShaderUniform {
name: "u_atmosphere_height".into(),
value: UniformValue::Float(100_000.0),
},
],
}
}
pub fn atmosphere() -> Self {
Self {
name: "atmosphere_scattering".to_string(),
uniforms: vec![
ShaderUniform {
name: "u_rayleigh_coeff".into(),
value: UniformValue::Vec3([5.5e-6, 13.0e-6, 22.4e-6]),
},
ShaderUniform {
name: "u_mie_coeff".into(),
value: UniformValue::Float(21e-6),
},
ShaderUniform {
name: "u_mie_g".into(),
value: UniformValue::Float(0.76),
},
ShaderUniform {
name: "u_sun_intensity".into(),
value: UniformValue::Float(22.0),
},
ShaderUniform {
name: "u_scale_height_rayleigh".into(),
value: UniformValue::Float(8500.0),
},
ShaderUniform {
name: "u_scale_height_mie".into(),
value: UniformValue::Float(1200.0),
},
],
}
}
pub fn ocean() -> Self {
Self {
name: "ocean_surface".to_string(),
uniforms: vec![
ShaderUniform {
name: "u_wind_speed".into(),
value: UniformValue::Float(10.0),
},
ShaderUniform {
name: "u_wave_amplitude".into(),
value: UniformValue::Float(1.5),
},
ShaderUniform {
name: "u_deep_color".into(),
value: UniformValue::Vec3([0.01, 0.03, 0.08]),
},
ShaderUniform {
name: "u_shallow_color".into(),
value: UniformValue::Vec3([0.05, 0.15, 0.20]),
},
ShaderUniform {
name: "u_fresnel_power".into(),
value: UniformValue::Float(5.0),
},
],
}
}
}