diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-07 22:56:34 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-07 22:56:34 +0100 |
commit | 02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3 (patch) | |
tree | 10362c18bccf2e9690d78844a7ff3ca403f7a126 /client/src/scene_prepare.rs | |
parent | 745c0ff9cfb27381114ce832baed3b57a2e4b4f6 (diff) | |
download | weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.bz2 weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.zst |
static typing for resources
Diffstat (limited to 'client/src/scene_prepare.rs')
-rw-r--r-- | client/src/scene_prepare.rs | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs index 6e4cb51..1807e39 100644 --- a/client/src/scene_prepare.rs +++ b/client/src/scene_prepare.rs @@ -15,7 +15,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ use crate::download::Downloader; -use anyhow::{Context, Result}; +use anyhow::Result; use image::ImageReader; use log::debug; use std::{ @@ -26,8 +26,8 @@ use std::{ }; use weareshared::{ Affine3A, - packets::{ReadWrite, Resource}, - resources::{MeshPart, Prefab}, + packets::Resource, + resources::{AttributeArray, Image, IndexArray, MeshPart, Prefab}, }; use wgpu::{ BindGroup, BindGroupDescriptor, BindGroupEntry, BindGroupLayout, BindingResource, Buffer, @@ -66,13 +66,13 @@ pub struct ScenePreparer { queue: Arc<Queue>, texture_bgl: BindGroupLayout, - textures: DemandMap<Resource, (Arc<Texture>, Arc<BindGroup>)>, + textures: DemandMap<Resource<Image>, (Arc<Texture>, Arc<BindGroup>)>, placeholder_textures: DemandMap<(), (Arc<Texture>, Arc<BindGroup>)>, - index_buffers: DemandMap<Resource, (Arc<Buffer>, u32)>, - vertex_buffers: DemandMap<Resource, (Arc<Buffer>, u32)>, + index_buffers: DemandMap<Resource<IndexArray>, (Arc<Buffer>, u32)>, + vertex_buffers: DemandMap<Resource<AttributeArray>, (Arc<Buffer>, u32)>, placeholder_vertex_buffers: DemandMap<(u32, bool), Arc<Buffer>>, - mesh_parts: DemandMap<Resource, Arc<RMeshPart>>, - pub prefabs: DemandMap<Resource, Arc<RPrefab>>, + mesh_parts: DemandMap<Resource<MeshPart>, Arc<RMeshPart>>, + pub prefabs: DemandMap<Resource<Prefab>, Arc<RPrefab>>, } pub struct RPrefab(pub Vec<(Affine3A, Arc<RMeshPart>)>); @@ -102,28 +102,26 @@ impl ScenePreparer { } pub fn update(&mut self, dls: &mut Downloader) -> Result<()> { for pres in self.prefabs.needed.clone() { - if let Some(buf) = dls.try_get(pres)? { - let prefab = Prefab::read(&mut buf.as_slice()).context("parsing prefab")?; + if let Some(prefab) = dls.try_get(pres.clone())? { let mut rprefab = RPrefab(Vec::new()); for (aff, partres) in &prefab.mesh { - if let Some(part) = self.mesh_parts.try_get(*partres) { + if let Some(part) = self.mesh_parts.try_get(partres.clone()) { rprefab.0.push((*aff, part.clone())); } } if rprefab.0.len() == prefab.mesh.len() { - self.prefabs.insert(pres, Arc::new(rprefab)); + self.prefabs.insert(pres.clone(), Arc::new(rprefab)); debug!("prefab created ({pres})"); } } } for pres in self.index_buffers.needed.clone() { - if let Some(buf) = dls.try_get(pres)? { + if let Some(buf) = dls.try_get(pres.clone())? { let buf = buf + .0 .into_iter() - .array_chunks::<2>() - .map(u16::from_be_bytes) - .map(u16::to_le_bytes) .flatten() + .flat_map(u16::to_le_bytes) .collect::<Vec<_>>(); let buffer = self.device.create_buffer_init(&BufferInitDescriptor { contents: &buf, @@ -131,16 +129,15 @@ impl ScenePreparer { usage: BufferUsages::INDEX | BufferUsages::COPY_DST, }); self.index_buffers - .insert(pres, (Arc::new(buffer), (buf.len() / 2) as u32)); + .insert(pres.clone(), (Arc::new(buffer), (buf.len() / 2) as u32)); debug!("index buffer created (len={}) {pres}", buf.len() / 2); } } for pres in self.vertex_buffers.needed.clone() { - if let Some(buf) = dls.try_get(pres)? { + if let Some(buf) = dls.try_get(pres.clone())? { let buf = buf + .0 .into_iter() - .array_chunks::<4>() - .map(f32::from_be_bytes) .map(f32::to_le_bytes) .flatten() .collect::<Vec<_>>(); @@ -150,7 +147,7 @@ impl ScenePreparer { usage: BufferUsages::VERTEX | BufferUsages::COPY_DST, }); self.vertex_buffers - .insert(pres, (Arc::new(buffer), (buf.len() / 4) as u32)); + .insert(pres.clone(), (Arc::new(buffer), (buf.len() / 4) as u32)); debug!( "vertex attribute buffer created (len={}) {pres}", buf.len() / 4 @@ -158,8 +155,8 @@ impl ScenePreparer { } } for pres in self.textures.needed.clone() { - if let Some(buf) = dls.try_get(pres)? { - let image = ImageReader::new(Cursor::new(buf)).with_guessed_format()?; + if let Some(buf) = dls.try_get(pres.clone())? { + let image = ImageReader::new(Cursor::new(buf.0)).with_guessed_format()?; let image = image.decode()?; let image = image.to_rgba8(); let image_raw = image.to_vec(); @@ -171,7 +168,7 @@ impl ScenePreparer { image.width(), image.height(), ); - self.textures.insert(pres, tex_bg); + self.textures.insert(pres.clone(), tex_bg); } } for pres in self.placeholder_textures.needed.clone() { @@ -186,11 +183,10 @@ impl ScenePreparer { self.placeholder_textures.insert(pres, tex_bg); } for pres in self.mesh_parts.needed.clone() { - if let Some(buf) = dls.try_get(pres)? { - let part = MeshPart::read(&mut buf.as_slice()).context("parsing part")?; - + if let Some(part) = dls.try_get(pres.clone())? { if let (Some(indexres), Some(positionres)) = (part.index, part.va_position) { - let Some((index, index_count)) = self.index_buffers.try_get(indexres) else { + let Some((index, index_count)) = self.index_buffers.try_get(indexres.clone()) + else { self.index_buffers.needed.insert(indexres); continue; }; |