diff options
-rw-r--r-- | a.md | 2 | ||||
-rw-r--r-- | client/src/scene_prepare.rs | 18 | ||||
-rw-r--r-- | client/src/scene_render.rs | 10 | ||||
-rw-r--r-- | shared/src/resources.rs | 25 |
4 files changed, 38 insertions, 17 deletions
@@ -20,7 +20,7 @@ len 08 sound(id: Obj, data: Vec<u8>) ### 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<Resource, Buffer>, + index_buffers: HashMap<Resource, Arc<Buffer>>, vertex_buffers_x3: HashMap<[Resource; 1], Arc<Buffer>>, vertex_buffers_x2: HashMap<[Resource; 2], Arc<Buffer>>, vertex_buffers_x1: HashMap<[Resource; 3], Arc<Buffer>>, - parts: HashMap<Resource, Part>, + parts: HashMap<Resource, Arc<Part>>, + prefabs: HashMap<Resource, RPrefab>, +} + +pub struct RPrefab(pub Vec<Arc<RPart>>); +pub struct RPart { + pub index_count: u32, + pub index: Arc<Buffer>, + pub positions: Arc<Buffer>, + pub normals: Arc<Buffer>, } 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::<HashSet<_>>(); + let need = tree.objects.values().map(|o| o.res).collect::<HashSet<_>>(); + + 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<Resource, RPrefab>, } -struct RPrefab(Vec<RPart>); -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<Resource>); +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<Self> { + Ok(Self::new(f32::read(r)?, f32::read(r)?, f32::read(r)?)) + } +} |