titanss 0.0.3

Titanss is a celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
#[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: "titan_terrain_pbr",
            uniforms: vec![
                ShaderUniform {
                    name: "u_planet_radius",
                    value: UniformValue::Float(crate::TITAN_RADIUS_M as f32),
                },
                ShaderUniform {
                    name: "u_atmosphere_height",
                    value: UniformValue::Float(600_000.0),
                },
                ShaderUniform {
                    name: "u_surface_pressure_pa",
                    value: UniformValue::Float(146_700.0),
                },
                ShaderUniform {
                    name: "u_surface_temperature_k",
                    value: UniformValue::Float(93.7),
                },
                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]),
                },
            ],
        }
    }

    pub fn atmosphere() -> Self {
        Self {
            name: "titan_atmosphere_scattering",
            uniforms: vec![
                ShaderUniform {
                    name: "u_rayleigh_scale_height",
                    value: UniformValue::Float(21_000.0),
                },
                ShaderUniform {
                    name: "u_haze_optical_depth",
                    value: UniformValue::Float(3.8),
                },
                ShaderUniform {
                    name: "u_methane_fraction",
                    value: UniformValue::Float(0.014),
                },
                ShaderUniform {
                    name: "u_sun_intensity",
                    value: UniformValue::Float(15.0),
                },
                ShaderUniform {
                    name: "u_planet_radius",
                    value: UniformValue::Float(crate::TITAN_RADIUS_M as f32),
                },
                ShaderUniform {
                    name: "u_sky_color",
                    value: UniformValue::Vec3([0.60, 0.45, 0.20]),
                },
            ],
        }
    }

    pub fn haze() -> Self {
        Self {
            name: "titan_tholin_haze",
            uniforms: vec![
                ShaderUniform {
                    name: "u_haze_base_km",
                    value: UniformValue::Float(100.0),
                },
                ShaderUniform {
                    name: "u_haze_top_km",
                    value: UniformValue::Float(520.0),
                },
                ShaderUniform {
                    name: "u_haze_color",
                    value: UniformValue::Vec3([0.65, 0.45, 0.15]),
                },
                ShaderUniform {
                    name: "u_haze_density",
                    value: UniformValue::Float(0.7),
                },
            ],
        }
    }

    pub fn eclipse() -> Self {
        Self {
            name: "titan_eclipse",
            uniforms: vec![
                ShaderUniform {
                    name: "u_exposure",
                    value: UniformValue::Float(0.3),
                },
                ShaderUniform {
                    name: "u_gamma",
                    value: UniformValue::Float(2.2),
                },
                ShaderUniform {
                    name: "u_dust_intensity",
                    value: UniformValue::Float(0.02),
                },
            ],
        }
    }
}