diff options
Diffstat (limited to 'engine/src/model.rs')
| -rw-r--r-- | engine/src/model.rs | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/engine/src/model.rs b/engine/src/model.rs index 4c88f8f..ebf623f 100644 --- a/engine/src/model.rs +++ b/engine/src/model.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use ecs::Component; -use crate::asset::Handle as AssetHandle; +use crate::asset::{Assets, Handle as AssetHandle}; use crate::material::Material; use crate::material::asset::Map as MaterialAssetMap; use crate::mesh::Mesh; @@ -40,6 +40,38 @@ impl Spec { SpecBuilder::default() } + + pub fn find_first_material<'assets>( + &'assets self, + assets: &'assets Assets, + ) -> MaterialSearchResult<'assets> + { + let Some(material_name) = self.material_names.first() else { + return MaterialSearchResult::NoMaterials; + }; + + let material_asset = match &self.materials { + Materials::Maps(material_asset_map_assets) => material_asset_map_assets + .iter() + .find_map(|mat_asset_map_asset| { + let mat_asset_map = assets.get(mat_asset_map_asset)?; + + mat_asset_map.assets.get(material_name) + }), + Materials::Direct(material_assets) => material_assets.get(material_name), + }; + + let Some(material_asset) = material_asset else { + return MaterialSearchResult::NotFound; + }; + + if assets.get(material_asset).is_none() { + tracing::trace!("Missing material asset"); + return MaterialSearchResult::NotFound; + } + + MaterialSearchResult::Found(material_asset) + } } #[derive(Debug, Default, Clone)] @@ -152,3 +184,10 @@ impl Default for Materials Self::Maps(Vec::new()) } } + +pub enum MaterialSearchResult<'a> +{ + Found(&'a AssetHandle<Material>), + NotFound, + NoMaterials, +} |
