diff options
Diffstat (limited to 'shared/src/resources.rs')
-rw-r--r-- | shared/src/resources.rs | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/shared/src/resources.rs b/shared/src/resources.rs index 512e161..c312531 100644 --- a/shared/src/resources.rs +++ b/shared/src/resources.rs @@ -2,13 +2,14 @@ use crate::packets::{ReadWrite, Resource}; use anyhow::Result; use glam::{Affine3A, Vec3A}; use log::warn; -use std::io::{Read, Write}; +use std::{ + collections::HashMap, + io::{Read, Write}, +}; #[derive(Debug, Default, Clone)] pub struct Prefab(pub Vec<(Affine3A, Resource)>); -/// Combinations of va_* and tex_* are multiplied except normal which is added. -/// Defaults should be the identity for that operation, so default is 1 (or white) except normals are Vec3::ZERO. #[derive(Debug, Default, Clone)] pub struct Part { pub index: Option<Resource>, @@ -30,11 +31,33 @@ pub struct Part { pub tex_transmission: Option<Resource>, } +pub struct PrefabIndex(pub HashMap<String, Resource>); + #[derive(Debug, Default, Clone)] pub struct AttributeArray(pub Vec<f32>); #[derive(Debug, Default, Clone)] pub struct IndexArray(pub Vec<[u16; 3]>); +impl ReadWrite for PrefabIndex { + fn write(&self, w: &mut dyn Write) -> Result<()> { + for (k, v) in &self.0 { + write_kv(w, k.as_bytes(), &v.0)?; + } + Ok(()) + } + fn read(r: &mut dyn Read) -> Result<Self> { + let mut s = Self(HashMap::new()); + let mut g = Vec::new(); + r.read_to_end(&mut g)?; + let mut g = g.as_slice(); + while !g.is_empty() { + let (k, v) = read_kv(&mut g)?; + s.0.insert(String::from_utf8(k)?, Resource::read(&mut v.as_slice())?); + } + Ok(s) + } +} + impl ReadWrite for Prefab { fn write(&self, w: &mut dyn Write) -> Result<()> { for (aff, res) in self.0.clone() { @@ -107,7 +130,6 @@ impl ReadWrite for Part { write_kv_opt(w, b"tex_metallic", &self.tex_metallic)?; write_kv_opt(w, b"tex_albedo", &self.tex_albedo)?; write_kv_opt(w, b"tex_transmission", &self.tex_transmission)?; - Ok(()) } fn read(r: &mut dyn Read) -> Result<Self> { @@ -130,16 +152,12 @@ impl ReadWrite for Part { b"va_roughness" => s.va_roughness = Some(<_ as ReadWrite>::read(&mut v)?), b"va_metallic" => s.va_metallic = Some(<_ as ReadWrite>::read(&mut v)?), b"va_albedo" => s.va_albedo = Some(<_ as ReadWrite>::read(&mut v)?), - b"va_transmission" => { - s.va_transmission = Some(<_ as ReadWrite>::read(&mut v)?) - } + b"va_transmission" => s.va_transmission = Some(<_ as ReadWrite>::read(&mut v)?), b"tex_normal" => s.tex_normal = Some(<_ as ReadWrite>::read(&mut v)?), b"tex_roughness" => s.tex_roughness = Some(<_ as ReadWrite>::read(&mut v)?), b"tex_metallic" => s.tex_metallic = Some(<_ as ReadWrite>::read(&mut v)?), b"tex_albedo" => s.tex_albedo = Some(<_ as ReadWrite>::read(&mut v)?), - b"tex_transmission" => { - s.tex_transmission = Some(<_ as ReadWrite>::read(&mut v)?) - } + b"tex_transmission" => s.tex_transmission = Some(<_ as ReadWrite>::read(&mut v)?), x => warn!("unknown part key: {:?}", String::from_utf8_lossy(x)), } } |