summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-19 16:44:06 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-19 16:44:06 +0100
commit2d6f319dfccf6339ed1a3bbfb003b8b2dde82383 (patch)
tree4229b75a26d6e02d1eb15c84096c7020875e650e /shared
parent2c737d660cab38fdf4ff3e940395df396a75f959 (diff)
downloadweareserver-2d6f319dfccf6339ed1a3bbfb003b8b2dde82383.tar
weareserver-2d6f319dfccf6339ed1a3bbfb003b8b2dde82383.tar.bz2
weareserver-2d6f319dfccf6339ed1a3bbfb003b8b2dde82383.tar.zst
client: normal maps
Diffstat (limited to 'shared')
-rw-r--r--shared/src/helper.rs32
-rw-r--r--shared/src/resources.rs3
2 files changed, 34 insertions, 1 deletions
diff --git a/shared/src/helper.rs b/shared/src/helper.rs
index eb1f321..d46a830 100644
--- a/shared/src/helper.rs
+++ b/shared/src/helper.rs
@@ -16,7 +16,7 @@
*/
use crate::packets::{Data, Object, Resource};
use anyhow::Result;
-use glam::{Affine3A, Vec2, Vec3A};
+use glam::{Affine3A, Vec2, Vec3, Vec3A};
use std::{
borrow::Cow,
io::{Read, Write},
@@ -103,6 +103,25 @@ impl ReadWrite for Vec<Vec3A> {
.collect())
}
}
+impl ReadWrite for Vec<Vec3> {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ for e in self {
+ e.write(w)?;
+ }
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ let mut buf = Vec::new();
+ r.read_to_end(&mut buf)?;
+ Ok(buf
+ .into_iter()
+ .array_chunks::<{ size_of::<f32>() }>()
+ .map(f32::from_be_bytes)
+ .array_chunks::<3>()
+ .map(Vec3::from_array)
+ .collect())
+ }
+}
impl ReadWrite for Vec<Vec2> {
fn write(&self, w: &mut dyn Write) -> Result<()> {
for e in self {
@@ -249,6 +268,17 @@ impl ReadWrite for Vec3A {
Ok(Self::new(f32::read(r)?, f32::read(r)?, f32::read(r)?))
}
}
+impl ReadWrite for Vec3 {
+ fn write(&self, w: &mut dyn Write) -> Result<()> {
+ self.x.write(w)?;
+ self.y.write(w)?;
+ self.z.write(w)?;
+ Ok(())
+ }
+ fn read(r: &mut dyn Read) -> Result<Self> {
+ Ok(Self::new(f32::read(r)?, f32::read(r)?, f32::read(r)?))
+ }
+}
impl ReadWrite for Affine3A {
fn write(&self, w: &mut dyn Write) -> Result<()> {
for v in self.to_cols_array() {
diff --git a/shared/src/resources.rs b/shared/src/resources.rs
index b2708cb..54a34b8 100644
--- a/shared/src/resources.rs
+++ b/shared/src/resources.rs
@@ -64,6 +64,7 @@ pub struct MeshPart {
pub g_double_sided: Option<()>,
pub va_position: Option<Resource<Vec<Vec3A>>>,
pub va_normal: Option<Resource<Vec<Vec3A>>>,
+ pub va_tangent: Option<Resource<Vec<Vec3A>>>,
pub va_texcoord: Option<Resource<Vec<Vec2>>>,
pub va_roughness: Option<Resource<Vec<f32>>>,
pub va_metallic: Option<Resource<Vec<f32>>>,
@@ -240,6 +241,7 @@ impl ReadWrite for MeshPart {
write_kv_opt(w, b"g_double_sided", &self.g_double_sided)?;
write_kv_opt(w, b"va_position", &self.va_position)?;
write_kv_opt(w, b"va_normal", &self.va_normal)?;
+ write_kv_opt(w, b"va_tangent", &self.va_tangent)?;
write_kv_opt(w, b"va_texcoord", &self.va_texcoord)?;
write_kv_opt(w, b"va_roughness", &self.va_roughness)?;
write_kv_opt(w, b"va_metallic", &self.va_metallic)?;
@@ -272,6 +274,7 @@ impl ReadWrite for MeshPart {
b"g_double_sided" => Ok(s.g_double_sided = Some(read_slice(v)?)),
b"va_position" => Ok(s.va_position = Some(read_slice(v)?)),
b"va_normal" => Ok(s.va_normal = Some(read_slice(v)?)),
+ b"va_tangent" => Ok(s.va_tangent = Some(read_slice(v)?)),
b"va_texcoord" => Ok(s.va_texcoord = Some(read_slice(v)?)),
b"va_roughness" => Ok(s.va_roughness = Some(read_slice(v)?)),
b"va_metallic" => Ok(s.va_metallic = Some(read_slice(v)?)),