summaryrefslogtreecommitdiff
path: root/engine/src/model/asset.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/model/asset.rs')
-rw-r--r--engine/src/model/asset.rs69
1 files changed, 35 insertions, 34 deletions
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::<Spec, Settings, Error>(import);
+ assets.set_importer::<Model, Settings, Error>(import);
+ assets.set_importer::<Mesh, Settings, Error>(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::<Material>(
- AssetLabel {
- path: parent_path.join(mtl_lib).into(),
- name: Some(material_name.as_ref().into()),
- },
- ),
- )
- }),
- )
- })
- .build(),
- );
+ asset_submitter.submit_store(Model::default());
Ok(())
}