summaryrefslogtreecommitdiff
path: root/engine/src/model/asset.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-09-16 17:43:44 +0200
committerHampusM <hampus@hampusmat.com>2026-09-16 17:43:44 +0200
commit99bd0d8e78a2f7739344f2a55e0ae7babd91514b (patch)
treeb6264423e95c3fec1d48ce05537ce71c7c5ecdee /engine/src/model/asset.rs
parent047f75917dc963d2ee92cb6d3d3dca1c3aea5854 (diff)
refactor(engine): simplify how model materials are handled
Diffstat (limited to 'engine/src/model/asset.rs')
-rw-r--r--engine/src/model/asset.rs45
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),
}