marss 0.0.3

Mars celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
#[derive(Debug, Clone)]
pub enum UniformValue {
    Float(f32),
    Vec3([f32; 3]),
    Vec4([f32; 4]),
    Mat4([f32; 16]),
    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: "mars_terrain_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::MARS_EQUATORIAL_RADIUS as f32),
                },
                ShaderUniform {
                    name: "u_atmosphere_height",
                    value: UniformValue::Float(100_000.0),
                },
                ShaderUniform {
                    name: "u_dust_optical_depth",
                    value: UniformValue::Float(crate::MEAN_DUST_OPTICAL_DEPTH as f32),
                },
                ShaderUniform {
                    name: "u_max_elevation",
                    value: UniformValue::Float(crate::OLYMPUS_MONS_HEIGHT_M as f32),
                },
                ShaderUniform {
                    name: "u_min_elevation",
                    value: UniformValue::Float(-(crate::HELLAS_DEPTH_M as f32)),
                },
            ],
        }
    }

    pub fn atmosphere() -> Self {
        Self {
            name: "mars_atmosphere_scattering",
            uniforms: vec![
                ShaderUniform {
                    name: "u_rayleigh_coeff",
                    value: UniformValue::Vec3([1.9e-7, 5.1e-7, 1.3e-6]),
                },
                ShaderUniform {
                    name: "u_mie_coeff",
                    value: UniformValue::Float(5e-4),
                },
                ShaderUniform {
                    name: "u_mie_g",
                    value: UniformValue::Float(0.63),
                },
                ShaderUniform {
                    name: "u_sun_intensity",
                    value: UniformValue::Float(0.0),
                },
                ShaderUniform {
                    name: "u_scale_height_rayleigh",
                    value: UniformValue::Float(crate::SCALE_HEIGHT_M as f32),
                },
                ShaderUniform {
                    name: "u_scale_height_mie",
                    value: UniformValue::Float(5_000.0),
                },
                ShaderUniform {
                    name: "u_dust_scatter_albedo",
                    value: UniformValue::Float(0.92),
                },
            ],
        }
    }

    pub fn dust_storm() -> Self {
        Self {
            name: "mars_dust_storm",
            uniforms: vec![
                ShaderUniform {
                    name: "u_dust_optical_depth",
                    value: UniformValue::Float(crate::MEAN_DUST_OPTICAL_DEPTH as f32),
                },
                ShaderUniform {
                    name: "u_dust_color",
                    value: UniformValue::Vec3([0.72, 0.45, 0.20]),
                },
                ShaderUniform {
                    name: "u_dust_scatter_albedo",
                    value: UniformValue::Float(0.92),
                },
                ShaderUniform {
                    name: "u_storm_intensity",
                    value: UniformValue::Float(0.0),
                },
            ],
        }
    }
}