earths 0.0.4

High-fidelity Earth simulation engine — orbit, atmosphere, geology, hydrology, biosphere, terrain, lighting, rendering, satellites, and temporal systems with full scientific coupling
Documentation
use sciforge::hub::prelude::constants::EARTH_RADIUS;

#[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: "earth_terrain_pbr",
            uniforms: vec![
                ShaderUniform {
                    name: "u_planet_radius",
                    value: UniformValue::Float(EARTH_RADIUS as f32),
                },
                ShaderUniform {
                    name: "u_atmosphere_height",
                    value: UniformValue::Float(100_000.0),
                },
                ShaderUniform {
                    name: "u_max_elevation",
                    value: UniformValue::Float(8_848.86),
                },
                ShaderUniform {
                    name: "u_min_elevation",
                    value: UniformValue::Float(-10_994.0),
                },
                ShaderUniform {
                    name: "u_snow_line_equator",
                    value: UniformValue::Float(5_000.0),
                },
                ShaderUniform {
                    name: "u_snow_line_pole",
                    value: UniformValue::Float(0.0),
                },
                ShaderUniform {
                    name: "u_treeline_equator",
                    value: UniformValue::Float(3_500.0),
                },
            ],
        }
    }
    pub fn atmosphere() -> Self {
        Self {
            name: "earth_atmosphere_scattering",
            uniforms: vec![
                ShaderUniform {
                    name: "u_rayleigh_coeff",
                    value: UniformValue::Vec3([5.5e-6, 13.0e-6, 22.4e-6]),
                },
                ShaderUniform {
                    name: "u_mie_coeff",
                    value: UniformValue::Float(21e-6),
                },
                ShaderUniform {
                    name: "u_mie_g",
                    value: UniformValue::Float(0.76),
                },
                ShaderUniform {
                    name: "u_sun_intensity",
                    value: UniformValue::Float(22.0),
                },
                ShaderUniform {
                    name: "u_scale_height_rayleigh",
                    value: UniformValue::Float(8_500.0),
                },
                ShaderUniform {
                    name: "u_scale_height_mie",
                    value: UniformValue::Float(1_200.0),
                },
                ShaderUniform {
                    name: "u_planet_radius",
                    value: UniformValue::Float(EARTH_RADIUS as f32),
                },
                ShaderUniform {
                    name: "u_ozone_peak_alt",
                    value: UniformValue::Float(25_000.0),
                },
                ShaderUniform {
                    name: "u_ozone_falloff",
                    value: UniformValue::Float(15_000.0),
                },
            ],
        }
    }
    pub fn ocean() -> Self {
        Self {
            name: "earth_ocean_surface",
            uniforms: vec![
                ShaderUniform {
                    name: "u_wind_speed",
                    value: UniformValue::Float(10.0),
                },
                ShaderUniform {
                    name: "u_wave_amplitude",
                    value: UniformValue::Float(1.5),
                },
                ShaderUniform {
                    name: "u_deep_color",
                    value: UniformValue::Vec3([0.006, 0.018, 0.065]),
                },
                ShaderUniform {
                    name: "u_shallow_color",
                    value: UniformValue::Vec3([0.04, 0.12, 0.18]),
                },
                ShaderUniform {
                    name: "u_fresnel_power",
                    value: UniformValue::Float(5.0),
                },
                ShaderUniform {
                    name: "u_ior",
                    value: UniformValue::Float(1.333),
                },
                ShaderUniform {
                    name: "u_foam_threshold",
                    value: UniformValue::Float(7.0),
                },
            ],
        }
    }
    pub fn night_lights() -> Self {
        Self {
            name: "earth_night_lights",
            uniforms: vec![
                ShaderUniform {
                    name: "u_city_light_color",
                    value: UniformValue::Vec3([1.0, 0.85, 0.6]),
                },
                ShaderUniform {
                    name: "u_city_light_intensity",
                    value: UniformValue::Float(0.3),
                },
                ShaderUniform {
                    name: "u_terminator_blend_deg",
                    value: UniformValue::Float(6.0),
                },
            ],
        }
    }
}