diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-07 22:56:34 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-07 22:56:34 +0100 |
commit | 02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3 (patch) | |
tree | 10362c18bccf2e9690d78844a7ff3ca403f7a126 /shared/src/resources.rs | |
parent | 745c0ff9cfb27381114ce832baed3b57a2e4b4f6 (diff) | |
download | weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.bz2 weareserver-02d65e6b7ce7a0e6bae054bd321c68dda1cb0de3.tar.zst |
static typing for resources
Diffstat (limited to 'shared/src/resources.rs')
-rw-r--r-- | shared/src/resources.rs | 73 |
1 files changed, 43 insertions, 30 deletions
diff --git a/shared/src/resources.rs b/shared/src/resources.rs index be34b21..d22e3ea 100644 --- a/shared/src/resources.rs +++ b/shared/src/resources.rs @@ -19,60 +19,64 @@ use anyhow::Result; use glam::{Affine3A, Vec3A}; use log::warn; use std::{ - collections::HashMap, + collections::{BTreeMap, HashMap}, io::{Read, Write}, }; #[derive(Debug, Default, Clone)] pub struct Prefab { - pub mesh: Vec<(Affine3A, Resource)>, - pub light: Vec<(Vec3A, Resource)>, - pub environment: Option<EnvironmentPart>, + pub mesh: Vec<(Affine3A, Resource<MeshPart>)>, + pub light: Vec<(Vec3A, Resource<LightPart>)>, + pub environment: Option<Resource<EnvironmentPart>>, } #[derive(Debug, Default, Clone)] pub struct LightPart { - emission: Option<Vec3A>, - radius: Option<f32>, + pub emission: Option<Vec3A>, + pub radius: Option<f32>, } #[derive(Debug, Default, Clone)] pub struct EnvironmentPart { - skybox: Option<Resource>, - sun: Option<(Vec3A, Vec3A)>, + pub skybox: Option<Resource>, + pub sun: Option<(Vec3A, Vec3A)>, } #[derive(Debug, Default, Clone)] pub struct MeshPart { - pub index: Option<Resource>, + pub index: Option<Resource<IndexArray>>, pub g_metallic: Option<f32>, pub g_roughness: Option<f32>, pub g_albedo: Option<Vec3A>, pub g_transmission: Option<f32>, pub g_emission: Option<Vec3A>, - pub va_position: Option<[Resource; 3]>, - pub va_normal: Option<[Resource; 3]>, - pub va_texcoord: Option<[Resource; 2]>, - pub va_roughness: Option<Resource>, - pub va_metallic: Option<Resource>, - pub va_albedo: Option<[Resource; 3]>, - pub va_transmission: Option<Resource>, - pub va_emission: Option<[Resource; 3]>, - pub tex_normal: Option<Resource>, - pub tex_roughness: Option<Resource>, - pub tex_metallic: Option<Resource>, - pub tex_albedo: Option<Resource>, - pub tex_transmission: Option<Resource>, - pub tex_emission: Option<Resource>, + pub va_position: Option<[Resource<AttributeArray>; 3]>, + pub va_normal: Option<[Resource<AttributeArray>; 3]>, + pub va_texcoord: Option<[Resource<AttributeArray>; 2]>, + pub va_roughness: Option<Resource<AttributeArray>>, + pub va_metallic: Option<Resource<AttributeArray>>, + pub va_albedo: Option<[Resource<AttributeArray>; 3]>, + pub va_transmission: Option<Resource<AttributeArray>>, + pub va_emission: Option<[Resource<AttributeArray>; 3]>, + pub tex_normal: Option<Resource<Image>>, + pub tex_roughness: Option<Resource<Image>>, + pub tex_metallic: Option<Resource<Image>>, + pub tex_albedo: Option<Resource<Image>>, + pub tex_transmission: Option<Resource<Image>>, + pub tex_emission: Option<Resource<Image>>, } -pub struct PrefabIndex(pub HashMap<String, Resource>); +#[derive(Debug, Default, Clone)] +pub struct PrefabIndex(pub BTreeMap<String, Resource>); #[derive(Debug, Default, Clone)] pub struct AttributeArray(pub Vec<f32>); #[derive(Debug, Default, Clone)] pub struct IndexArray(pub Vec<[u16; 3]>); +#[derive(Debug, Clone)] +pub struct Image(pub Vec<u8>); + impl ReadWrite for PrefabIndex { fn write(&self, w: &mut dyn Write) -> Result<()> { for (k, v) in &self.0 { @@ -81,7 +85,7 @@ impl ReadWrite for PrefabIndex { Ok(()) } fn read(r: &mut dyn Read) -> Result<Self> { - let mut s = Self(HashMap::new()); + let mut s = Self(BTreeMap::new()); let mut g = Vec::new(); r.read_to_end(&mut g)?; let mut g = g.as_slice(); @@ -96,10 +100,10 @@ impl ReadWrite for PrefabIndex { impl ReadWrite for Prefab { fn write(&self, w: &mut dyn Write) -> Result<()> { for x in &self.mesh { - write_kv_opt(w, b"mesh", &Some(*x))?; + write_kv_opt(w, b"mesh", &Some(x.clone()))?; } for x in &self.light { - write_kv_opt(w, b"light", &Some(*x))?; + write_kv_opt(w, b"light", &Some(x.clone()))?; } write_kv_opt(w, b"environment", &self.environment)?; Ok(()) @@ -269,9 +273,9 @@ impl ReadWrite for u8 { impl ReadWrite for Vec3A { fn write(&self, w: &mut dyn Write) -> Result<()> { - w.write_all(&self.x.to_be_bytes())?; - w.write_all(&self.y.to_be_bytes())?; - w.write_all(&self.z.to_be_bytes())?; + self.x.write(w)?; + self.y.write(w)?; + self.z.write(w)?; Ok(()) } fn read(r: &mut dyn Read) -> Result<Self> { @@ -333,3 +337,12 @@ impl<A: ReadWrite, B: ReadWrite> ReadWrite for (A, B) { Ok((A::read(r)?, B::read(r)?)) } } +impl ReadWrite for Image { + fn write(&self, w: &mut dyn Write) -> Result<()> { + self.0.write(w) + } + + fn read(r: &mut dyn Read) -> Result<Self> { + Ok(Self(<Vec<u8> as ReadWrite>::read(r)?)) + } +} |