earths 0.0.3

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;
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: "terrainpbr".to_string(),
            uniforms: vec![
                ShaderUniform {
                    name: "usundirection".into(),
                    value: UniformValue::Vec3([0.0, 1.0, 0.0]),
                },
                ShaderUniform {
                    name: "ucamerapos".into(),
                    value: UniformValue::Vec3([0.0, 0.0, 0.0]),
                },
                ShaderUniform {
                    name: "uplanetradius".into(),
                    value: UniformValue::Float(EARTH_RADIUS as f32),
                },
                ShaderUniform {
                    name: "uatmosphereheight".into(),
                    value: UniformValue::Float(100000.0),
                },
            ],
        }
    }
    pub fn atmosphere() -> Self {
        Self {
            name: "atmospherescattering".to_string(),
            uniforms: vec![
                ShaderUniform {
                    name: "urayleighcoeff".into(),
                    value: UniformValue::Vec3([5.5e-6, 13.0e-6, 22.4e-6]),
                },
                ShaderUniform {
                    name: "umiecoeff".into(),
                    value: UniformValue::Float(21e-6),
                },
                ShaderUniform {
                    name: "umieg".into(),
                    value: UniformValue::Float(0.76),
                },
                ShaderUniform {
                    name: "usunintensity".into(),
                    value: UniformValue::Float(22.0),
                },
                ShaderUniform {
                    name: "uscaleheightrayleigh".into(),
                    value: UniformValue::Float(8500.0),
                },
                ShaderUniform {
                    name: "uscaleheightmie".into(),
                    value: UniformValue::Float(1200.0),
                },
            ],
        }
    }
    pub fn ocean() -> Self {
        Self {
            name: "oceansurface".to_string(),
            uniforms: vec![
                ShaderUniform {
                    name: "uwindspeed".into(),
                    value: UniformValue::Float(10.0),
                },
                ShaderUniform {
                    name: "uwaveamplitude".into(),
                    value: UniformValue::Float(1.5),
                },
                ShaderUniform {
                    name: "udeepcolor".into(),
                    value: UniformValue::Vec3([0.01, 0.03, 0.08]),
                },
                ShaderUniform {
                    name: "ushallowcolor".into(),
                    value: UniformValue::Vec3([0.05, 0.15, 0.20]),
                },
                ShaderUniform {
                    name: "ufresnelpower".into(),
                    value: UniformValue::Float(5.0),
                },
            ],
        }
    }
}