diff --git a/crates/asset_material/src/material_catalog.rs b/crates/asset_material/src/material_catalog.rs index 580b27b..1eee3bd 100644 --- a/crates/asset_material/src/material_catalog.rs +++ b/crates/asset_material/src/material_catalog.rs @@ -937,6 +937,21 @@ impl MaterialCatalog { ) } + fn reference_material_index(&self, s: &ZoneStream<'_>) -> Option { + let name = s + .latest_material()? + .name + .and_then(|name| s.cstr(name).ok()) + .map(AssetRef::decode)?; + if !name.is_reference() { + return None; + } + let namespace = self.capture_ns?; + self.materials + .iter() + .position(|m| m.namespace == namespace && m.name.is_real() && m.name.same_name(&name)) + } + fn capture_material(&mut self, s: &ZoneStream<'_>) -> Option { let geometry = s.latest_material()?; let name = geometry @@ -1299,7 +1314,10 @@ impl AssetLinkSink for MaterialCatalog { } AssetType::Material => { let header = s.latest_material().and_then(|g| g.header); - let Some(index) = self.capture_material(s) else { + let Some(index) = self + .capture_material(s) + .or_else(|| self.reference_material_index(s)) + else { self.capture_gaps += 1; return Ok(()); }; diff --git a/crates/render_anim/src/anim/model_materials.rs b/crates/render_anim/src/anim/model_materials.rs index 1fe5629..cdeaae2 100644 --- a/crates/render_anim/src/anim/model_materials.rs +++ b/crates/render_anim/src/anim/model_materials.rs @@ -111,6 +111,9 @@ pub fn scene_lit_pass_material( authored: assets::MaterialIndex, ) -> Option { let world_material = tess.catalog().derived(authored)?; + if world_material.shadow_only { + return None; + } let ordinal = tess .catalog() .parts()