diff options
| author | HampusM <hampus@hampusmat.com> | 2026-09-16 17:43:44 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-09-16 17:43:44 +0200 |
| commit | 99bd0d8e78a2f7739344f2a55e0ae7babd91514b (patch) | |
| tree | b6264423e95c3fec1d48ce05537ce71c7c5ecdee /engine/src/model/asset.rs | |
| parent | 047f75917dc963d2ee92cb6d3d3dca1c3aea5854 (diff) | |
refactor(engine): simplify how model materials are handled
Diffstat (limited to 'engine/src/model/asset.rs')
| -rw-r--r-- | engine/src/model/asset.rs | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/engine/src/model/asset.rs b/engine/src/model/asset.rs index 5487203..52a6733 100644 --- a/engine/src/model/asset.rs +++ b/engine/src/model/asset.rs @@ -1,9 +1,11 @@ use std::fs::read_to_string; use std::path::{Path, PathBuf}; -use crate::asset::{Assets, Submitter as AssetSubmitter}; -use crate::material::asset::Map as MaterialAssetMap; -use crate::model::{Materials, Spec}; +use ecs::util::Either; + +use crate::asset::{Assets, Label as AssetLabel, Submitter as AssetSubmitter}; +use crate::material::Material; +use crate::model::{MaterialDescription, Spec}; #[derive(Debug, Clone)] #[non_exhaustive] @@ -69,24 +71,32 @@ fn import_wavefront_obj_asset( let mesh_asset = asset_submitter.submit_store_named("mesh", mesh); - let mut material_asset_map_assets = Vec::with_capacity(obj.mtl_libs.len()); - - for mtl_lib_path in &obj.mtl_libs { - let mtl_lib_asset = asset_submitter - .submit_load_other::<MaterialAssetMap>(parent_path.join(mtl_lib_path)); - - material_asset_map_assets.push(mtl_lib_asset); + if obj.mtl_libs.len() > 1 { + return Err(Error::MoreThanOneMaterialLibrary); } asset_submitter.submit_store( Spec::builder() .mesh(mesh_asset) - .materials(Materials::Maps(material_asset_map_assets)) - .material_names( - obj.unique_used_material_names - .into_iter() - .map(|material_name| material_name.into_string()), - ) + .materials(if obj.mtl_libs.is_empty() { + Either::A([].into_iter()) + } else { + Either::B( + obj.unique_used_material_names + .iter() + .zip(std::iter::repeat(obj.mtl_libs.iter()).flatten()) + .map(|(material_name, mtl_lib)| { + MaterialDescription::new( + asset_submitter.submit_load_other::<Material>( + AssetLabel { + path: parent_path.join(mtl_lib).into(), + name: Some(material_name.as_ref().into()), + }, + ), + ) + }), + ) + }) .build(), ); @@ -102,6 +112,9 @@ enum Error #[error("Failed to read file {}", .1.display())] ReadFailed(#[source] std::io::Error, PathBuf), + #[error("More than one material library is specified. This is not supported")] + MoreThanOneMaterialLibrary, + #[error(transparent)] Other(#[from] crate::file_format::wavefront::obj::Error), } |
