use alloc::vec::Vec;
use scenix_core::MeshId;
#[derive(Clone, Debug, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct LodGroup {
levels: Vec<(f32, MeshId)>,
}
impl LodGroup {
pub fn new(mut levels: Vec<(f32, MeshId)>) -> Self {
levels.sort_by(|a, b| a.0.total_cmp(&b.0));
Self { levels }
}
#[inline]
pub const fn empty() -> Self {
Self { levels: Vec::new() }
}
#[inline]
pub fn levels(&self) -> &[(f32, MeshId)] {
&self.levels
}
pub fn add_level(&mut self, max_distance: f32, mesh_id: MeshId) {
self.levels.push((max_distance, mesh_id));
self.levels.sort_by(|a, b| a.0.total_cmp(&b.0));
}
pub fn select(&self, distance: f32) -> Option<MeshId> {
let farthest = self.levels.last().map(|(_, mesh_id)| *mesh_id);
self.levels
.iter()
.find(|(max_distance, _)| distance <= *max_distance)
.map(|(_, mesh_id)| *mesh_id)
.or(farthest)
}
}