summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
Diffstat (limited to 'shared')
-rw-r--r--shared/src/packets.rs3
-rw-r--r--shared/src/resources.rs28
2 files changed, 20 insertions, 11 deletions
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<Self> {
- 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<Self> {
+ 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())?;