diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-05 23:24:57 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-05 23:24:57 +0100 |
commit | 1c0c8f788c8125c90a097e5241b5e8fe2518d1d2 (patch) | |
tree | b5542fe00a472b5d5a8bcdd17fb3a34b75ad1dd0 /shared/src | |
parent | e15b39b2a9cf028b12cbe98f56674e58c5a6bd4c (diff) | |
download | weareserver-1c0c8f788c8125c90a097e5241b5e8fe2518d1d2.tar weareserver-1c0c8f788c8125c90a097e5241b5e8fe2518d1d2.tar.bz2 weareserver-1c0c8f788c8125c90a097e5241b5e8fe2518d1d2.tar.zst |
a
Diffstat (limited to 'shared/src')
-rw-r--r-- | shared/src/packets.rs | 38 | ||||
-rw-r--r-- | shared/src/resources.rs | 6 | ||||
-rw-r--r-- | shared/src/tree.rs | 14 |
3 files changed, 43 insertions, 15 deletions
diff --git a/shared/src/packets.rs b/shared/src/packets.rs index c273028..325cf14 100644 --- a/shared/src/packets.rs +++ b/shared/src/packets.rs @@ -1,6 +1,9 @@ use anyhow::{Result, bail}; use glam::Vec3; -use std::io::{Read, Write}; +use std::{ + fmt::Display, + io::{Read, Write}, +}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct Resource(pub [u8; 32]); @@ -27,6 +30,13 @@ impl Object { impl Packet { pub fn serialize(&self, w: &mut impl Write) -> Result<()> { + let mut buf = Vec::new(); + self.serialize_inner(&mut buf)?; + w.write_all(&(buf.len() as u16).to_be_bytes())?; + w.write_all(&buf)?; + Ok(()) + } + pub fn serialize_inner(&self, w: &mut impl Write) -> Result<()> { match self { Packet::RequestResource(resource) => { w.write_all(&[0x01])?; @@ -75,9 +85,9 @@ impl Packet { Ok(()) } pub fn deserialize(r: &mut impl Read) -> Result<Self> { - let mut tag = [0u8; 1]; - r.read_exact(&mut tag)?; - Ok(match tag[0] { + let mut size_tag = [0u8; 3]; + r.read_exact(&mut size_tag)?; + Ok(match size_tag[2] { 0x01 => Packet::RequestResource(read_res(r)?), 0x02 => Packet::RespondResource(read_data(r)?), 0x03 => Packet::Add(Object(read_u128(r)?), read_res(r)?), @@ -90,7 +100,12 @@ impl Packet { 0x06 => Packet::Pose(Object(read_u128(r)?), read_params(r)?), 0x07 => Packet::Parent(Object(read_u128(r)?), Object(read_u128(r)?)), 0x08 => Packet::Sound(Object(read_u128(r)?), read_data(r)?), - _ => bail!("unknown packet tag"), + _ => { + for _ in 0..u16::from_be_bytes([size_tag[0], size_tag[1]]) { + r.read_exact(&mut [0])?; + } + bail!("unknown packet tag"); + } }) } } @@ -128,3 +143,16 @@ fn read_params(r: &mut impl Read) -> Result<Vec<f32>> { } Ok(v) } + +impl Display for Resource { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "Res{{{:08x}{:08x}{:08x}{:08x}}}", + u64::from_be_bytes(self.0[0..8].try_into().unwrap()), + u64::from_be_bytes(self.0[8..16].try_into().unwrap()), + u64::from_be_bytes(self.0[16..24].try_into().unwrap()), + u64::from_be_bytes(self.0[24..32].try_into().unwrap()), + ) + } +} diff --git a/shared/src/resources.rs b/shared/src/resources.rs index 651eb4b..a677755 100644 --- a/shared/src/resources.rs +++ b/shared/src/resources.rs @@ -15,7 +15,7 @@ pub struct Part { pub fragment_shader_data: Option<Resource>, pub vertex_shader: Option<Resource>, pub vertex_shader_data: Option<Resource>, - pub texture: Option<Resource>, + pub texture: Vec<Resource>, } #[derive(Debug, Default, Clone)] @@ -91,7 +91,7 @@ impl Part { if let Some(x) = &self.vertex_shader_data { write_kv(w, b"vertex_shader_data", &x.0); } - if let Some(x) = &self.texture { + for x in &self.vertex { write_kv(w, b"texture", &x.0); } Ok(()) @@ -108,7 +108,7 @@ impl Part { b"fragment_shader_data" => s.fragment_shader_data = Some(slice_to_res(&v)?), b"vertex_shader" => s.vertex_shader = Some(slice_to_res(&v)?), b"vertex_shader_data" => s.vertex_shader_data = Some(slice_to_res(&v)?), - b"texture" => s.texture = Some(slice_to_res(&v)?), + b"texture" => s.texture.push(slice_to_res(&v)?), _ => warn!("unknown part key"), } } diff --git a/shared/src/tree.rs b/shared/src/tree.rs index fce6f8a..4cb7abc 100644 --- a/shared/src/tree.rs +++ b/shared/src/tree.rs @@ -3,14 +3,14 @@ use glam::Vec3; use std::collections::HashMap; pub struct SceneTree { - objects: HashMap<Object, ObjectData>, + pub objects: HashMap<Object, ObjectData>, } -struct ObjectData { - pos: Vec3, - rot: Vec3, - parent: Object, - pose: Vec<f32>, - res: Resource, +pub struct ObjectData { + pub pos: Vec3, + pub rot: Vec3, + pub parent: Object, + pub pose: Vec<f32>, + pub res: Resource, } impl Default for SceneTree { fn default() -> Self { |