diff options
Diffstat (limited to 'client/src/render/scene/mod.rs')
-rw-r--r-- | client/src/render/scene/mod.rs | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/client/src/render/scene/mod.rs b/client/src/render/scene/mod.rs index 569f3b9..e0af292 100644 --- a/client/src/render/scene/mod.rs +++ b/client/src/render/scene/mod.rs @@ -64,7 +64,7 @@ pub struct ScenePreparer { generated_tangent_buffers: DemandMap<TangentBufferSpec, Arc<Buffer>>, generated_normal_buffers: DemandMap<NormalBufferSpec, Arc<Buffer>>, generated_texcoord_buffers: DemandMap<TexcoordBufferSpec, Arc<Buffer>>, - mesh_parts: DemandMap<Resource<MeshPart>, Arc<RMeshPart>>, + mesh_parts: DemandMap<Resource<MeshPart>, Result<Arc<RMeshPart>, String>>, materials: DemandMap<Material, Arc<BindGroup>>, pipelines: DemandMap<PipelineSpec, Arc<RenderPipeline>>, mip_generation_pipelines: DemandMap<TextureFormat, Arc<MipGenerationPipeline>>, @@ -193,12 +193,16 @@ impl ScenePreparer { for pres in self.prefabs.needed() { if let Some(prefab) = self.downloader.try_get(pres.clone())? { let mut rprefab = RPrefab(Vec::new()); + let mut done_or_failed = 0; for (aff, partres) in &prefab.mesh { if let Some(part) = self.mesh_parts.try_get(partres.clone()) { - rprefab.0.push((*aff, part.clone())); + if let Ok(part) = part.clone() { + rprefab.0.push((*aff, part)); + } + done_or_failed += 1; } } - if rprefab.0.len() == prefab.mesh.len() { + if done_or_failed == prefab.mesh.len() { self.prefabs.insert(pres.clone(), Arc::new(rprefab), 0); debug!("prefab created ({pres})"); num_done += 1; @@ -383,7 +387,7 @@ impl ScenePreparer { debug!("part created (took {:?}) {pres}", start.elapsed()); self.mesh_parts.insert( pres, - Arc::new(RMeshPart { + Ok(Arc::new(RMeshPart { pipeline, index_count, index, @@ -398,11 +402,14 @@ impl ScenePreparer { material, double_sided, joint_uniform, - }), + })), 0, ); num_done += 1; } + } else { + self.mesh_parts + .insert(pres, Err("index or positions missing".to_string()), 0); } } } |