summaryrefslogtreecommitdiff
path: root/engine/src/model.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/model.rs')
-rw-r--r--engine/src/model.rs167
1 files changed, 83 insertions, 84 deletions
diff --git a/engine/src/model.rs b/engine/src/model.rs
index 220e4f6..c231a9f 100644
--- a/engine/src/model.rs
+++ b/engine/src/model.rs
@@ -1,125 +1,124 @@
-use crate::asset::{Asset, Assets, Handle as AssetHandle};
+use crate::asset::{
+ Asset,
+ Assets,
+ Dependency as AssetDependency,
+ Event as AssetEvent,
+ Events as AssetEvents,
+ Handle as AssetHandle,
+ Label as AssetLabel,
+};
+use crate::ecs::sole::Single;
use crate::ecs::Component;
use crate::material::Material;
use crate::mesh::Mesh;
pub mod asset;
-#[derive(Debug, Clone, Component)]
+#[derive(Debug, Default)]
#[non_exhaustive]
-pub struct Model
-{
- pub spec_asset: AssetHandle<Spec>,
-}
+pub struct Model {}
-impl Model
+impl Asset for Model
{
- #[must_use]
- pub fn new(asset_handle: AssetHandle<Spec>) -> Self
+ fn dependencies(&self) -> impl Iterator<Item = AssetDependency<'_>>
{
- Self { spec_asset: asset_handle }
+ [].into_iter()
}
}
+#[derive(Debug, Clone, Component)]
+#[allow(clippy::module_name_repetitions)]
+pub struct ModelMesh
+{
+ pub asset: AssetHandle<Mesh>,
+}
+
+#[derive(Debug, Clone, Component)]
+#[allow(clippy::module_name_repetitions)]
+pub struct ModelMaterial
+{
+ pub asset: AssetHandle<MaterialDescription>,
+}
+
#[derive(Debug, Clone)]
#[non_exhaustive]
-pub struct Spec
+pub struct MaterialDescription
{
- pub mesh_asset: Option<AssetHandle<Mesh>>,
- pub materials: Vec<MaterialDescription>,
+ pub asset: AssetHandle<Material>,
+ pub loading_material: Option<AssetLabel<'static>>,
}
-impl Spec
+impl MaterialDescription
{
#[must_use]
- pub fn builder() -> SpecBuilder
+ pub fn new(asset: AssetHandle<Material>) -> Self
{
- SpecBuilder::default()
+ Self { asset, loading_material: None }
}
- pub fn find_first_material<'assets>(
- &'assets self,
- assets: &'assets Assets,
- ) -> MaterialSearchResult<'assets>
+ #[must_use]
+ pub fn with_loading_material(mut self, loading_material: AssetLabel<'static>)
+ -> Self
{
- let Some(material_desc) = self.materials.first() else {
- return MaterialSearchResult::NoMaterials;
- };
-
- if assets.get(&material_desc.asset).is_none() {
- tracing::trace!("Missing material asset");
- return MaterialSearchResult::NotFound;
- }
-
- MaterialSearchResult::Found(&material_desc.asset)
+ self.loading_material = Some(loading_material);
+ self
}
}
-impl Asset for Spec
+impl Asset for MaterialDescription
{
- fn dependencies(&self) -> impl Iterator<Item = crate::asset::Dependency<'_>>
+ fn dependencies(&self) -> impl Iterator<Item = AssetDependency<'_>>
{
- [].into_iter()
+ self.loading_material.iter().map(|material_label| {
+ AssetDependency::new::<Material>(AssetLabel {
+ path: (&*material_label.path).into(),
+ name: material_label.name.as_deref().map(Into::into),
+ })
+ })
}
}
-#[derive(Debug, Default, Clone)]
-pub struct SpecBuilder
+pub(crate) fn set_stored_mat_descs_handles(
+ mut assets: Single<Assets>,
+ asset_events: Single<AssetEvents>,
+)
{
- mesh_asset: Option<AssetHandle<Mesh>>,
- materials: Vec<MaterialDescription>,
-}
+ let assets = assets.get_mut().unwrap();
+ let asset_events = asset_events.get().unwrap();
-impl SpecBuilder
-{
- #[must_use]
- pub fn mesh(mut self, asset: AssetHandle<Mesh>) -> Self
- {
- self.mesh_asset = Some(asset);
+ for AssetEvent::Stored(asset_id, ..) in asset_events.iter_last_tick() {
+ let asset_handle = AssetHandle::<MaterialDescription>::from_id(*asset_id);
- self
- }
-
- #[must_use]
- pub fn materials(
- mut self,
- materials: impl IntoIterator<Item = MaterialDescription>,
- ) -> Self
- {
- self.materials = materials.into_iter().collect();
+ if !assets.is_loaded_and_has_type(&asset_handle) {
+ continue;
+ }
- self
- }
+ let material_asset = {
+ let Some(material_desc) = assets.get(&asset_handle) else {
+ unreachable!();
+ };
+
+ if let Some(material_label) = &material_desc.loading_material {
+ let Some(material_asset) =
+ assets.get_handle_to_loaded::<Material>(material_label.clone())
+ else {
+ unreachable!();
+ };
+
+ Some(material_asset)
+ } else {
+ None
+ }
+ };
- #[tracing::instrument(skip_all)]
- pub fn build(self) -> Spec
- {
- Spec {
- mesh_asset: self.mesh_asset,
- materials: self.materials,
- }
- }
-}
+ let Some(material_asset) = material_asset else {
+ continue;
+ };
-#[derive(Debug, Clone)]
-#[non_exhaustive]
-pub struct MaterialDescription
-{
- pub asset: AssetHandle<Material>,
-}
+ let Some(material_desc) = assets.get_mut(&asset_handle) else {
+ unreachable!();
+ };
-impl MaterialDescription
-{
- #[must_use]
- pub fn new(asset: AssetHandle<Material>) -> Self
- {
- Self { asset }
+ material_desc.asset = material_asset;
}
}
-
-pub enum MaterialSearchResult<'a>
-{
- Found(&'a AssetHandle<Material>),
- NotFound,
- NoMaterials,
-}