summaryrefslogtreecommitdiff
path: root/shared/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-05 23:24:57 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-05 23:24:57 +0100
commit1c0c8f788c8125c90a097e5241b5e8fe2518d1d2 (patch)
treeb5542fe00a472b5d5a8bcdd17fb3a34b75ad1dd0 /shared/src
parente15b39b2a9cf028b12cbe98f56674e58c5a6bd4c (diff)
downloadweareserver-1c0c8f788c8125c90a097e5241b5e8fe2518d1d2.tar
weareserver-1c0c8f788c8125c90a097e5241b5e8fe2518d1d2.tar.bz2
weareserver-1c0c8f788c8125c90a097e5241b5e8fe2518d1d2.tar.zst
a
Diffstat (limited to 'shared/src')
-rw-r--r--shared/src/packets.rs38
-rw-r--r--shared/src/resources.rs6
-rw-r--r--shared/src/tree.rs14
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 {