summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-07 16:50:44 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-07 16:50:44 +0100
commit0a0abfe7b093d91447fb7070820a0e6d56d6c22d (patch)
tree17cdfd63bce8d717cd35d4d88646b837fbffc594 /shared
parentd0d8c07e1915b47610bf91176d908c9b46a5ab54 (diff)
downloadweareserver-0a0abfe7b093d91447fb7070820a0e6d56d6c22d.tar
weareserver-0a0abfe7b093d91447fb7070820a0e6d56d6c22d.tar.bz2
weareserver-0a0abfe7b093d91447fb7070820a0e6d56d6c22d.tar.zst
normal texture
Diffstat (limited to 'shared')
-rw-r--r--shared/src/resources.rs38
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)),
}
}