From 31ae23b7eb8cd0b688be07ae6cb4b5a96ee02a68 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 7 Jan 2025 00:56:35 +0100 Subject: a --- shared/src/packets.rs | 3 ++- shared/src/resources.rs | 28 ++++++++++++++++++---------- 2 files changed, 20 insertions(+), 11 deletions(-) (limited to 'shared') diff --git a/shared/src/packets.rs b/shared/src/packets.rs index a1636cd..0f1a886 100644 --- a/shared/src/packets.rs +++ b/shared/src/packets.rs @@ -125,7 +125,8 @@ impl ReadWrite for Packet { 0x07 => Packet::Parent(Object(read_u128(r)?), Object(read_u128(r)?)), 0x08 => Packet::Sound(Object(read_u128(r)?), Data::read(r)?), _ => { - for _ in 0..u16::from_be_bytes([size_tag[0], size_tag[1]]) - 1 { + let len = u16::from_be_bytes([size_tag[0], size_tag[1]]); + for _ in 0..len.max(1) - 1 { r.read_exact(&mut [0])?; } bail!("unknown packet tag"); diff --git a/shared/src/resources.rs b/shared/src/resources.rs index 042dff3..a071f1c 100644 --- a/shared/src/resources.rs +++ b/shared/src/resources.rs @@ -2,10 +2,7 @@ use crate::packets::{ReadWrite, Resource}; use anyhow::{Result, bail}; use glam::{Affine3A, Vec3A}; use log::warn; -use std::{ - fs::File, - io::{Read, Write}, -}; +use std::io::{Read, Write}; #[derive(Debug, Default, Clone)] pub struct Prefab(pub Vec<(Affine3A, Resource)>); @@ -26,7 +23,7 @@ pub struct Part { pub enum Attribute { Constant(f32), Vertex(Resource), - Texture(Resource), + Texture(Resource, u8), } #[derive(Debug, Default, Clone)] @@ -171,25 +168,36 @@ impl ReadWrite for Attribute { w.write_all(&[0x02])?; resource.write(w)?; } - Attribute::Texture(resource) => { + Attribute::Texture(resource, channel) => { w.write_all(&[0x03])?; resource.write(w)?; + channel.write(w)?; } } Ok(()) } fn read(r: &mut dyn Read) -> Result { - let mut tag = [0u8; 1]; - r.read_exact(&mut tag)?; - Ok(match tag[0] { + Ok(match u8::read(r)? { 0x01 => Self::Constant(f32::read(r)?), 0x02 => Self::Vertex(Resource::read(r)?), - 0x03 => Self::Texture(Resource::read(r)?), + 0x03 => Self::Texture(Resource::read(r)?, u8::read(r)?), _ => bail!("unknown attribute tag"), }) } } +impl ReadWrite for u8 { + fn write(&self, w: &mut dyn Write) -> Result<()> { + w.write_all(&[*self])?; + Ok(()) + } + fn read(r: &mut dyn Read) -> Result { + let mut buf = [0u8; 1]; + r.read_exact(&mut buf)?; + Ok(buf[0]) + } +} + impl ReadWrite for Vec3A { fn write(&self, w: &mut dyn Write) -> Result<()> { w.write_all(&self.x.to_be_bytes())?; -- cgit v1.2.3-70-g09d2