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 | |
parent | 745c0ff9cfb27381114ce832baed3b57a2e4b4f6 (diff) | |
download | weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.bz2 weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.zst |
static typing for resources
Diffstat (limited to 'client')
-rw-r--r-- | client/src/download.rs | 17 | ||||
-rw-r--r-- | client/src/scene_prepare.rs | 52 | ||||
-rw-r--r-- | client/src/scene_render.rs | 6 |
3 files changed, 38 insertions, 37 deletions
diff --git a/client/src/download.rs b/client/src/download.rs index 95f9cc7..e65ef25 100644 --- a/client/src/download.rs +++ b/client/src/download.rs @@ -17,9 +17,9 @@ use crate::network::Network; use anyhow::Result; use log::debug; -use std::collections::HashSet; +use std::{collections::HashSet, marker::PhantomData}; use weareshared::{ - packets::{Packet, Resource}, + packets::{Packet, ReadWrite, Resource}, store::{ResourceStore, sha256}, }; @@ -39,9 +39,14 @@ impl Downloader { store, } } - pub fn try_get(&mut self, hash: Resource) -> Result<Option<Vec<u8>>> { + pub fn try_get<T: ReadWrite>(&mut self, hash: Resource<T>) -> Result<Option<T>> { + self.try_get_raw(Resource(hash.0, PhantomData))? + .map(|x| T::read(&mut x.as_slice())) + .transpose() + } + pub fn try_get_raw(&mut self, hash: Resource) -> Result<Option<Vec<u8>>> { if self.have.contains(&hash) { - self.store.get(hash) + self.store.get_raw(hash) } else { self.need.insert(hash); Ok(None) @@ -50,8 +55,8 @@ impl Downloader { pub fn packet(&mut self, p: &Packet) -> Result<()> { match p { Packet::RespondResource(d) => { - let key = Resource(sha256(&d.0)); - self.store.set(&d.0)?; + let key = Resource(sha256(&d.0), PhantomData); + self.store.set_raw(&d.0)?; self.need.remove(&key); self.pending.remove(&key); if self.have.insert(key) { 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; }; diff --git a/client/src/scene_render.rs b/client/src/scene_render.rs index d619f3d..6ec5f25 100644 --- a/client/src/scene_render.rs +++ b/client/src/scene_render.rs @@ -16,7 +16,7 @@ */ use glam::{EulerRot, Mat3, Mat4}; use std::sync::Arc; -use weareshared::{packets::Resource, tree::SceneTree}; +use weareshared::{packets::Resource, resources::Prefab, tree::SceneTree}; use wgpu::{ BindGroupLayout, BindGroupLayoutDescriptor, BindGroupLayoutEntry, BindingType, BlendState, Color, ColorTargetState, ColorWrites, CommandEncoder, CompareFunction, DepthBiasState, @@ -164,7 +164,7 @@ impl ScenePipeline { commands: &mut CommandEncoder, target: &TextureView, scene: &SceneTree, - prefabs: &mut DemandMap<Resource, Arc<RPrefab>>, + prefabs: &mut DemandMap<Resource<Prefab>, Arc<RPrefab>>, camera: Mat4, ) { let mut rpass = commands.begin_render_pass(&RenderPassDescriptor { @@ -202,7 +202,7 @@ impl ScenePipeline { ob.rot.z, )) * Mat4::from_translation(ob.pos.into()); - if let Some(prefab) = prefabs.try_get(ob.res) { + if let Some(prefab) = prefabs.try_get(ob.res.clone()) { for (affine, part) in &prefab.0 { let part_projection = prefab_projection * Mat4::from_mat3a(affine.matrix3) |