From 48a0fb31737362c9bae0ff8f6fcf1e4e10600f94 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 6 Jan 2025 14:58:42 +0100 Subject: prefab offsets --- a.md | 2 +- client/src/scene_prepare.rs | 18 +++++++++++++++--- client/src/scene_render.rs | 10 ++-------- shared/src/resources.rs | 25 ++++++++++++++++++++----- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/a.md b/a.md index 30c1f86..d36109c 100644 --- a/a.md +++ b/a.md @@ -20,7 +20,7 @@ len 08 sound(id: Obj, data: Vec) ### Prefab ``` -Prefab = *(part) +Prefab = *(pos:f32x3 rot:f32x3 part) ``` ### Part diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs index 8d52f49..f069b5d 100644 --- a/client/src/scene_prepare.rs +++ b/client/src/scene_prepare.rs @@ -7,11 +7,20 @@ use weareshared::{packets::Resource, resources::Part, tree::SceneTree}; use wgpu::Buffer; pub struct ScenePreparer { - index_buffers: HashMap, + index_buffers: HashMap>, vertex_buffers_x3: HashMap<[Resource; 1], Arc>, vertex_buffers_x2: HashMap<[Resource; 2], Arc>, vertex_buffers_x1: HashMap<[Resource; 3], Arc>, - parts: HashMap, + parts: HashMap>, + prefabs: HashMap, +} + +pub struct RPrefab(pub Vec>); +pub struct RPart { + pub index_count: u32, + pub index: Arc, + pub positions: Arc, + pub normals: Arc, } impl ScenePreparer { @@ -22,9 +31,12 @@ impl ScenePreparer { vertex_buffers_x2: HashMap::new(), vertex_buffers_x1: HashMap::new(), parts: HashMap::new(), + prefabs: HashMap::new(), } } fn update(&mut self, tree: &SceneTree) -> Result<()> { - let x = tree.objects.values().map(|o| o.res).collect::>(); + let need = tree.objects.values().map(|o| o.res).collect::>(); + + for n in need {} } } diff --git a/client/src/scene_render.rs b/client/src/scene_render.rs index cc15e3f..d19b083 100644 --- a/client/src/scene_render.rs +++ b/client/src/scene_render.rs @@ -10,20 +10,14 @@ use wgpu::{ include_wgsl, }; +use crate::scene_prepare::RPrefab; + pub struct ScenePipeline { pipeline: RenderPipeline, bind_group: BindGroup, prefabs: HashMap, } -struct RPrefab(Vec); -struct RPart { - index_count: u32, - index: Buffer, - positions: Buffer, - normals: Buffer, -} - impl ScenePipeline { pub fn new(device: &Device, format: TextureFormat) -> Self { let module = device.create_shader_module(include_wgsl!("shader.wgsl")); diff --git a/shared/src/resources.rs b/shared/src/resources.rs index cdf53bd..e59ea25 100644 --- a/shared/src/resources.rs +++ b/shared/src/resources.rs @@ -1,10 +1,11 @@ use crate::packets::{ReadWrite, Resource}; use anyhow::{Result, bail}; +use glam::Vec3; use log::warn; use std::io::{Read, Write}; #[derive(Debug, Default, Clone)] -pub struct Prefab(pub Vec); +pub struct Prefab(pub Vec<(Vec3, Vec3, Resource)>); #[derive(Debug, Default, Clone)] pub struct Part { @@ -32,8 +33,10 @@ pub struct IndexArray(pub Vec<[u16; 3]>); impl ReadWrite for Prefab { fn write(&self, w: &mut dyn Write) -> Result<()> { - for x in self.0.clone() { - w.write_all(&x.0)?; + for (pos, rot, res) in self.0.clone() { + pos.write(w)?; + rot.write(w)?; + res.write(w)?; } Ok(()) } @@ -41,8 +44,8 @@ impl ReadWrite for Prefab { let mut s = Prefab::default(); let mut g = Vec::new(); r.read_to_end(&mut g)?; - for x in g.iter().array_chunks::<32>() { - s.0.push(Resource(x.map(|x| *x))) + while !g.is_empty() { + s.0.push((Vec3::read(r)?, Vec3::read(r)?, Resource::read(r)?)) } Ok(s) } @@ -182,3 +185,15 @@ impl ReadWrite for Attribute { }) } } + +impl ReadWrite for Vec3 { + fn write(&self, w: &mut dyn Write) -> Result<()> { + w.write_all(&self.x.to_be_bytes())?; + w.write_all(&self.y.to_be_bytes())?; + w.write_all(&self.z.to_be_bytes())?; + Ok(()) + } + fn read(r: &mut dyn Read) -> Result { + Ok(Self::new(f32::read(r)?, f32::read(r)?, f32::read(r)?)) + } +} -- cgit v1.2.3-70-g09d2