use crate::{CoreError, Mesh, MeshHandle, Scene};
impl Scene {
pub fn add_mesh(&mut self, mesh: Mesh) -> Result<MeshHandle, CoreError> {
if self.structure(mesh.owner()).is_none() {
return Err(CoreError::StaleHandle);
}
self.mesh_revision = self.mesh_revision.wrapping_add(1);
Ok(MeshHandle(self.meshes.insert(mesh)))
}
#[must_use]
pub fn mesh(&self, handle: MeshHandle) -> Option<&Mesh> {
self.meshes.get(handle.0)
}
pub fn mesh_mut(&mut self, handle: MeshHandle) -> Option<&mut Mesh> {
let mesh = self.meshes.get_mut(handle.0)?;
self.mesh_revision = self.mesh_revision.wrapping_add(1);
Some(mesh)
}
pub fn remove_mesh(&mut self, handle: MeshHandle) {
if self.meshes.remove(handle.0).is_some() {
self.mesh_revision = self.mesh_revision.wrapping_add(1);
}
}
pub fn meshes(&self) -> impl Iterator<Item = (MeshHandle, &Mesh)> + '_ {
self.meshes
.iter()
.map(|(raw, mesh)| (MeshHandle(raw), mesh))
}
#[must_use]
pub const fn mesh_row(handle: MeshHandle) -> u32 {
handle.row()
}
#[must_use]
pub fn mesh_for_entity(&self, entity: crate::EntityRef) -> Option<&Mesh> {
if entity.kind != crate::EntityKind::Mesh {
return None;
}
let (_, mesh) = self.meshes.get_index(entity.index)?;
(mesh.owner() == entity.structure).then_some(mesh)
}
#[must_use]
pub const fn mesh_revision(&self) -> u64 {
self.mesh_revision
}
}