diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-06 15:34:40 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-06 15:34:40 +0100 |
commit | 14d348febd549b944d03030bf748f7817a2bedac (patch) | |
tree | 96fb79928296a9b6e6b50e0c805fcafaaf32e16a | |
parent | 48a0fb31737362c9bae0ff8f6fcf1e4e10600f94 (diff) | |
download | weareserver-14d348febd549b944d03030bf748f7817a2bedac.tar weareserver-14d348febd549b944d03030bf748f7817a2bedac.tar.bz2 weareserver-14d348febd549b944d03030bf748f7817a2bedac.tar.zst |
a
-rw-r--r-- | a.md | 4 | ||||
-rw-r--r-- | client/src/scene_prepare.rs | 24 | ||||
-rw-r--r-- | client/src/scene_render.rs | 14 | ||||
-rw-r--r-- | shared/src/lib.rs | 2 | ||||
-rw-r--r-- | shared/src/resources.rs | 24 | ||||
-rw-r--r-- | world/src/main.rs | 16 |
6 files changed, 62 insertions, 22 deletions
@@ -20,14 +20,14 @@ len 08 sound(id: Obj, data: Vec<u8>) ### Prefab ``` -Prefab = *(pos:f32x3 rot:f32x3 part) +Prefab = *(pos:f32x3 mat:f32_3x3 part:Res<Part>) ``` ### Part ``` Part = *(len_key:u16 len_value:u16 *(key:u8) *(value:u8)) -Attribute = 0x01 value:f32 / 0x02 buffer:Res / 0x03 texture:Res +Attribute = 0x01 value:f32 / 0x02 buffer:Res / 0x03 texture:Res<Texture> ``` | Key | Value Type | diff --git a/client/src/scene_prepare.rs b/client/src/scene_prepare.rs index f069b5d..30c1742 100644 --- a/client/src/scene_prepare.rs +++ b/client/src/scene_prepare.rs @@ -3,16 +3,23 @@ use std::{ collections::{HashMap, HashSet}, sync::Arc, }; -use weareshared::{packets::Resource, resources::Part, tree::SceneTree}; +use weareshared::{ + packets::{ReadWrite, Resource}, + resources::Prefab, + tree::SceneTree, +}; use wgpu::Buffer; +use crate::download::Downloader; + pub struct ScenePreparer { 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, Arc<Part>>, + parts: HashMap<Resource, Arc<RPart>>, prefabs: HashMap<Resource, RPrefab>, + prefabs_needed: HashSet<Resource>, } pub struct RPrefab(pub Vec<Arc<RPart>>); @@ -32,11 +39,16 @@ impl ScenePreparer { vertex_buffers_x1: HashMap::new(), parts: HashMap::new(), prefabs: HashMap::new(), + prefabs_needed: HashSet::new(), } } - fn update(&mut self, tree: &SceneTree) -> Result<()> { - let need = tree.objects.values().map(|o| o.res).collect::<HashSet<_>>(); - - for n in need {} + fn update(&mut self, dls: &mut Downloader) -> Result<()> { + for pres in &self.prefabs_needed { + if let Some(buf) = dls.try_get(*pres)? { + let prefab = Prefab::read(&mut buf.as_slice())?; + + } + } + Ok(()) } } diff --git a/client/src/scene_render.rs b/client/src/scene_render.rs index d19b083..f80f6c2 100644 --- a/client/src/scene_render.rs +++ b/client/src/scene_render.rs @@ -1,9 +1,9 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use weareshared::{packets::Resource, tree::SceneTree}; use wgpu::{ - BindGroup, BindGroupDescriptor, BindGroupLayoutDescriptor, BlendState, Buffer, Color, - ColorTargetState, ColorWrites, CommandEncoder, Device, FragmentState, FrontFace, IndexFormat, - LoadOp, MultisampleState, Operations, PipelineCompilationOptions, PipelineLayoutDescriptor, + BindGroup, BindGroupDescriptor, BindGroupLayoutDescriptor, BlendState, Color, ColorTargetState, + ColorWrites, CommandEncoder, Device, FragmentState, FrontFace, IndexFormat, LoadOp, + MultisampleState, Operations, PipelineCompilationOptions, PipelineLayoutDescriptor, PolygonMode, PrimitiveState, PrimitiveTopology, RenderPassColorAttachment, RenderPassDescriptor, RenderPipeline, RenderPipelineDescriptor, StoreOp, TextureFormat, TextureView, VertexAttribute, VertexBufferLayout, VertexFormat, VertexState, VertexStepMode, @@ -16,6 +16,7 @@ pub struct ScenePipeline { pipeline: RenderPipeline, bind_group: BindGroup, prefabs: HashMap<Resource, RPrefab>, + prefabs_needed: HashSet<Resource>, } impl ScenePipeline { @@ -85,10 +86,11 @@ impl ScenePipeline { Self { bind_group, pipeline, + prefabs_needed: HashSet::new(), prefabs: HashMap::new(), } } - pub fn draw(&self, commands: &mut CommandEncoder, target: &TextureView, scene: &SceneTree) { + pub fn draw(&mut self, commands: &mut CommandEncoder, target: &TextureView, scene: &SceneTree) { let mut rpass = commands.begin_render_pass(&RenderPassDescriptor { label: None, color_attachments: &[Some(RenderPassColorAttachment { @@ -117,6 +119,8 @@ impl ScenePipeline { rpass.set_vertex_buffer(1, part.normals.slice(..)); rpass.draw_indexed(0..part.index_count, 0, 0..1); } + } else { + self.prefabs_needed.insert(ob.res); } } } diff --git a/shared/src/lib.rs b/shared/src/lib.rs index 45b31da..56c1fe4 100644 --- a/shared/src/lib.rs +++ b/shared/src/lib.rs @@ -4,3 +4,5 @@ pub mod packets; pub mod resources; pub mod store; pub mod tree; + +pub use glam::{Affine3A, Mat3A, Vec3A}; diff --git a/shared/src/resources.rs b/shared/src/resources.rs index e59ea25..6741936 100644 --- a/shared/src/resources.rs +++ b/shared/src/resources.rs @@ -1,11 +1,11 @@ use crate::packets::{ReadWrite, Resource}; use anyhow::{Result, bail}; -use glam::Vec3; +use glam::{Affine3A, Vec3A}; use log::warn; use std::io::{Read, Write}; #[derive(Debug, Default, Clone)] -pub struct Prefab(pub Vec<(Vec3, Vec3, Resource)>); +pub struct Prefab(pub Vec<(Affine3A, Resource)>); #[derive(Debug, Default, Clone)] pub struct Part { @@ -33,9 +33,8 @@ pub struct IndexArray(pub Vec<[u16; 3]>); impl ReadWrite for Prefab { fn write(&self, w: &mut dyn Write) -> Result<()> { - for (pos, rot, res) in self.0.clone() { - pos.write(w)?; - rot.write(w)?; + for (aff, res) in self.0.clone() { + aff.write(w)?; res.write(w)?; } Ok(()) @@ -45,7 +44,7 @@ impl ReadWrite for Prefab { let mut g = Vec::new(); r.read_to_end(&mut g)?; while !g.is_empty() { - s.0.push((Vec3::read(r)?, Vec3::read(r)?, Resource::read(r)?)) + s.0.push((Affine3A::read(r)?, Resource::read(r)?)) } Ok(s) } @@ -186,7 +185,7 @@ impl ReadWrite for Attribute { } } -impl ReadWrite for Vec3 { +impl ReadWrite for Vec3A { fn write(&self, w: &mut dyn Write) -> Result<()> { w.write_all(&self.x.to_be_bytes())?; w.write_all(&self.y.to_be_bytes())?; @@ -197,3 +196,14 @@ impl ReadWrite for Vec3 { Ok(Self::new(f32::read(r)?, f32::read(r)?, f32::read(r)?)) } } +impl ReadWrite for Affine3A { + fn write(&self, w: &mut dyn Write) -> Result<()> { + for v in self.to_cols_array() { + v.write(w)? + } + Ok(()) + } + fn read(r: &mut dyn Read) -> Result<Self> { + Ok(Self::from_cols_array(&[(); 12].try_map(|()| f32::read(r))?)) + } +} diff --git a/world/src/main.rs b/world/src/main.rs index 772c87d..fe71e79 100644 --- a/world/src/main.rs +++ b/world/src/main.rs @@ -6,8 +6,9 @@ use std::{ path::PathBuf, }; use weareshared::{ + Affine3A, Mat3A, Vec3A, packets::{Object, Packet, ReadWrite}, - resources::{Attribute, AttributeArray, IndexArray, Part}, + resources::{Attribute, AttributeArray, IndexArray, Part, Prefab}, store::ResourceStore, }; @@ -26,6 +27,7 @@ fn main() -> Result<()> { let (gltf, buffers, _) = gltf::import(args.scene)?; + let mut prefab = Prefab::default(); for node in gltf.nodes() { if let Some(mesh) = node.mesh() { for p in mesh.primitives() { @@ -71,11 +73,21 @@ fn main() -> Result<()> { } .write_alloc(), )?; - Packet::Add(Object::new(), part).write(&mut sock)?; + + let mat = node.transform().matrix(); + let aff = Affine3A::from_cols_array_2d(&[ + [mat[0][0], mat[0][1], mat[0][2]], + [mat[1][0], mat[1][1], mat[1][2]], + [mat[2][0], mat[2][1], mat[2][2]], + [mat[3][0], mat[3][1], mat[3][2]], + ]); + prefab.0.push((aff, part)) } } } + Packet::Add(Object::new(), store.set(&prefab.write_alloc())?).write(&mut sock)?; + store.iter(|d| { Packet::RespondResource(d.to_vec()) .write(&mut sock) |