use crate::{meshes::MeshKey, AwsmRenderer};
use super::node::{SceneNode, SceneNodeFlags};
impl AwsmRenderer {
pub fn sync_spatial_for_mesh(&mut self, mesh_key: MeshKey) {
let Ok(mesh) = self.meshes.get(mesh_key) else {
self.scene_spatial.remove(mesh_key);
return;
};
let Some(world_aabb) = mesh.world_aabb.clone() else {
self.scene_spatial.remove(mesh_key);
return;
};
let flags = SceneNodeFlags::from_mesh(mesh);
let should_be_dynamic = mesh.instanced
|| self
.meshes
.mesh_skin_key(mesh_key)
.map(|opt| opt.is_some())
.unwrap_or(false);
if self.scene_spatial.get(mesh_key).is_some() {
self.scene_spatial.update(mesh_key, world_aabb);
self.scene_spatial.set_flags(mesh_key, flags);
} else {
self.scene_spatial.insert(SceneNode {
aabb: world_aabb,
mesh_key,
flags,
});
}
if self.scene_spatial.is_dynamic(mesh_key) != should_be_dynamic {
self.scene_spatial.set_dynamic(mesh_key, should_be_dynamic);
}
}
pub fn set_mesh_dynamic(&mut self, mesh_key: MeshKey, dynamic: bool) {
self.scene_spatial.set_dynamic(mesh_key, dynamic);
}
pub fn drop_spatial_for_mesh(&mut self, mesh_key: MeshKey) {
self.scene_spatial.remove(mesh_key);
}
}