summaryrefslogtreecommitdiff
path: root/shared/src/resources.rs
diff options
context:
space:
mode:
Diffstat (limited to 'shared/src/resources.rs')
-rw-r--r--shared/src/resources.rs73
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)?))
+ }
+}