use std::sync::Arc;
use slotmap::new_key_type;
use crate::{
CoordinateSystem, ValidNavigationMesh,
util::{BoundingBox, Transform},
};
new_key_type! {
pub struct IslandId;
}
pub struct Island<CS: CoordinateSystem> {
pub(crate) transform: Transform<CS>,
pub(crate) nav_mesh: Arc<ValidNavigationMesh<CS>>,
pub(crate) transformed_bounds: BoundingBox,
pub(crate) dirty: bool,
}
impl<CS: CoordinateSystem> Island<CS> {
pub fn new(
transform: Transform<CS>,
nav_mesh: Arc<ValidNavigationMesh<CS>>,
) -> Self {
Self {
transformed_bounds: nav_mesh.get_bounds().transform(&transform),
transform,
nav_mesh,
dirty: true,
}
}
pub fn get_transform(&self) -> &Transform<CS> {
&self.transform
}
pub fn set_transform(&mut self, transform: Transform<CS>) {
self.transform = transform;
self.dirty = true;
self.transformed_bounds =
self.nav_mesh.get_bounds().transform(&self.transform);
}
pub fn get_nav_mesh(&self) -> Arc<ValidNavigationMesh<CS>> {
self.nav_mesh.clone()
}
pub fn set_nav_mesh(&mut self, nav_mesh: Arc<ValidNavigationMesh<CS>>) {
self.nav_mesh = nav_mesh;
self.dirty = true;
self.transformed_bounds =
self.nav_mesh.get_bounds().transform(&self.transform);
}
}