#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Face {
PosX,
NegX,
PosY,
NegY,
PosZ,
NegZ,
}
pub struct QuadTreeNode {
pub face: Face,
pub level: u32,
pub x: u32,
pub y: u32,
}
pub struct LodConfig {
pub max_level: u32,
}
impl Default for LodConfig {
fn default() -> Self {
Self { max_level: 12 }
}
}
pub struct LodTerrain {
pub roots: Vec<QuadTreeNode>,
pub config: LodConfig,
}
impl LodTerrain {
pub fn new(config: LodConfig) -> Self {
let roots = vec![
QuadTreeNode {
face: Face::PosX,
level: 0,
x: 0,
y: 0,
},
QuadTreeNode {
face: Face::NegX,
level: 0,
x: 0,
y: 0,
},
QuadTreeNode {
face: Face::PosY,
level: 0,
x: 0,
y: 0,
},
QuadTreeNode {
face: Face::NegY,
level: 0,
x: 0,
y: 0,
},
QuadTreeNode {
face: Face::PosZ,
level: 0,
x: 0,
y: 0,
},
QuadTreeNode {
face: Face::NegZ,
level: 0,
x: 0,
y: 0,
},
];
Self { roots, config }
}
pub fn update(&mut self, camera: (f64, f64, f64)) {
if !(camera.0.is_finite() && camera.1.is_finite() && camera.2.is_finite()) {
self.roots.clear();
}
}
pub fn leaf_count(&self) -> usize {
self.roots.len()
}
}