use std::sync::{Arc, OnceLock};
use bevy::{
math::{Dir3, Vec2},
prelude::Component,
transform::components::{GlobalTransform, Transform},
};
use super::ObstacleSource;
#[derive(Clone, Component, Debug)]
pub struct CachedObstacle<T: ObstacleSource> {
polygon: Arc<OnceLock<Vec<Vec<Vec2>>>>,
source: T,
}
impl<T: ObstacleSource> CachedObstacle<T> {
pub fn new(source: T) -> Self {
Self {
polygon: Arc::new(OnceLock::new()),
source,
}
}
pub fn clear(&mut self) {
self.polygon = Arc::new(OnceLock::new());
}
}
impl<T: ObstacleSource> ObstacleSource for CachedObstacle<T> {
fn get_polygons(
&self,
obstacle_transform: &GlobalTransform,
navmesh_transform: &Transform,
up: (Dir3, f32),
) -> Vec<Vec<Vec2>> {
self.polygon
.get_or_init(|| {
T::get_polygons(&self.source, obstacle_transform, navmesh_transform, up)
.into_iter()
.collect::<Vec<_>>()
})
.clone()
}
}