diff options
| author | HampusM <hampus@hampusmat.com> | 2026-03-20 14:22:19 +0100 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-03-20 14:22:19 +0100 |
| commit | f285f82072b491b1f3cc92db8e08485f26779d5a (patch) | |
| tree | bf6c6c61cdfb3a12550e55966c8552957ade9e71 /engine/src/model.rs | |
| parent | 0546d575c11d3668d0f95933697ae4f670fe2a55 (diff) | |
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, +} |
