#[derive(Debug, Clone, Copy, PartialEq)]
pub enum CloudBiome {
UpperHaze,
AmmoniaIceCloud,
NH4SHCloud,
WaterIceCloud,
DeepCloud,
ClearZone,
StormRegion,
PolarVortex,
}
pub struct SplatWeights {
pub weights: [(CloudBiome, f32); 4],
}
pub struct CloudBiomeClassifier {
pub onebarlevel: f64,
}
impl Default for CloudBiomeClassifier {
fn default() -> Self {
Self { onebarlevel: 0.0 }
}
}
impl CloudBiomeClassifier {
pub fn classify(&self, altitudem: f64, latitudedeg: f64, windspeedms: f64) -> CloudBiome {
let abslat = latitudedeg.abs();
if abslat > 75.0 {
return CloudBiome::PolarVortex;
}
if windspeedms > 150.0 {
return CloudBiome::StormRegion;
}
if altitudem > self.onebarlevel + 50000.0 {
return CloudBiome::UpperHaze;
}
if altitudem > self.onebarlevel + 30000.0 {
return CloudBiome::AmmoniaIceCloud;
}
if altitudem > self.onebarlevel + 10000.0 {
return CloudBiome::NH4SHCloud;
}
if altitudem > self.onebarlevel - 20000.0 {
return CloudBiome::WaterIceCloud;
}
if altitudem > self.onebarlevel - 80000.0 {
return CloudBiome::DeepCloud;
}
CloudBiome::ClearZone
}
pub fn splat(&self, altitudem: f64, latitudedeg: f64, windspeedms: f64) -> SplatWeights {
let primary = self.classify(altitudem, latitudedeg, windspeedms);
SplatWeights {
weights: [
(primary, 1.0),
(CloudBiome::ClearZone, 0.0),
(CloudBiome::ClearZone, 0.0),
(CloudBiome::ClearZone, 0.0),
],
}
}
}