From 36c3860ddf47c1c7c2ccad43512091d20f5a2dff Mon Sep 17 00:00:00 2001 From: HampusM Date: Mon, 28 Sep 2026 22:58:05 +0200 Subject: refactor(engine): make model & material assets use asset dependencies --- engine/src/model/asset.rs | 69 ++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 34 deletions(-) (limited to 'engine/src/model/asset.rs') diff --git a/engine/src/model/asset.rs b/engine/src/model/asset.rs index af3e1b2..d9de6ce 100644 --- a/engine/src/model/asset.rs +++ b/engine/src/model/asset.rs @@ -1,11 +1,14 @@ use std::fs::read_to_string; use std::path::{Path, PathBuf}; -use ecs::util::Either; - -use crate::asset::{Assets, Label as AssetLabel, Submitter as AssetSubmitter}; -use crate::material::Material; -use crate::model::{MaterialDescription, Spec}; +use crate::asset::{ + Assets, + Handle as AssetHandle, + Label as AssetLabel, + Submitter as AssetSubmitter, +}; +use crate::mesh::Mesh; +use crate::model::{MaterialDescription, Model}; #[derive(Debug, Clone)] #[non_exhaustive] @@ -42,7 +45,8 @@ impl Default for Settings pub fn add_importers(assets: &mut Assets) { - assets.set_importer::(import); + assets.set_importer::(import); + assets.set_importer::(import); } fn import( @@ -69,41 +73,38 @@ fn import( .map_err(|err| Error::ReadFailed(err, path.to_path_buf()))?, )?; + if obj.mtl_libs.len() > 1 { + return Err(Error::MoreThanOneMaterialLibrary); + } + let mesh = obj.to_mesh( crate::file_format::wavefront::obj::ToMeshOptions::default() .y_flip_uvs(settings.y_flip_uvs), )?; - let mesh_asset = asset_submitter.submit_store_named("mesh", mesh); - - if obj.mtl_libs.len() > 1 { - return Err(Error::MoreThanOneMaterialLibrary); + asset_submitter.submit_store_named("mesh", mesh); + + let materials = obj + .unique_used_material_names + .into_iter() + .zip(std::iter::repeat(obj.mtl_libs.iter()).flatten()) + .map(|(material_name, mtl_lib)| { + (material_name.into_string(), parent_path.join(mtl_lib)) + }); + + for (material_name, material_path) in materials { + asset_submitter.submit_store_named( + format!("material_{material_name}"), + MaterialDescription::new(AssetHandle::invalid()).with_loading_material( + AssetLabel { + path: material_path.into(), + name: Some(material_name.into()), + }, + ), + ); } - asset_submitter.submit_store( - Spec::builder() - .mesh(mesh_asset) - .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::( - AssetLabel { - path: parent_path.join(mtl_lib).into(), - name: Some(material_name.as_ref().into()), - }, - ), - ) - }), - ) - }) - .build(), - ); + asset_submitter.submit_store(Model::default()); Ok(()) } -- cgit v1.2.3-18-g5258