diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-28 14:50:56 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-28 14:50:56 +0100 |
commit | 3331150162e34471bf0294bdb61a1a748cb94ee5 (patch) | |
tree | 10c5584dd22ce81a4d2b8d2e77b7f3a4545b4674 | |
parent | 505560045a30dd1078480734a8cbf9b12c781170 (diff) | |
download | weareserver-3331150162e34471bf0294bdb61a1a748cb94ee5.tar weareserver-3331150162e34471bf0294bdb61a1a748cb94ee5.tar.bz2 weareserver-3331150162e34471bf0294bdb61a1a748cb94ee5.tar.zst |
server+world: tangent handedness
-rw-r--r-- | doc/resources.md | 2 | ||||
-rw-r--r-- | shared/src/helper.rs | 38 | ||||
-rw-r--r-- | shared/src/lib.rs | 2 | ||||
-rw-r--r-- | shared/src/resources.rs | 4 | ||||
-rw-r--r-- | world/src/mesh.rs | 17 |
5 files changed, 47 insertions, 16 deletions
diff --git a/doc/resources.md b/doc/resources.md index 4fbc54f..53bd3c0 100644 --- a/doc/resources.md +++ b/doc/resources.md @@ -58,7 +58,7 @@ white except normals are zero. | `g_double_sided` | | | | `va_position` | `Res<[Vec3]>` | | | `va_normal` | `Res<[Vec3]>` | | -| `va_tangent` | `Res<[Vec3]>` | | +| `va_tangent` | `Res<[Vec4]>` | Tangent+Handedness | | `va_texcoord` | `Res<[Vec2]>` | | | `va_roughness` | `Res<[Float]>` | | | `va_metallic` | `Res<[Float]>` | | diff --git a/shared/src/helper.rs b/shared/src/helper.rs index 366ea52..be7d929 100644 --- a/shared/src/helper.rs +++ b/shared/src/helper.rs @@ -16,7 +16,7 @@ */ use crate::packets::{Data, Message, Object, Resource}; use anyhow::Result; -use glam::{Affine3A, Vec2, Vec3, Vec3A}; +use glam::{Affine3A, Vec2, Vec3, Vec3A, Vec4}; use std::{ borrow::Cow, io::{Read, Write}, @@ -122,6 +122,25 @@ impl ReadWrite for Vec<Vec3> { .collect()) } } +impl ReadWrite for Vec<Vec4> { + 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::<4>() + .map(Vec4::from_array) + .collect()) + } +} impl ReadWrite for Vec<Vec2> { fn write(&self, w: &mut dyn Write) -> Result<()> { for e in self { @@ -382,6 +401,23 @@ impl ReadWrite for Vec3A { Ok(Self::new(f32::read(r)?, f32::read(r)?, f32::read(r)?)) } } +impl ReadWrite for Vec4 { + fn write(&self, w: &mut dyn Write) -> Result<()> { + self.x.write(w)?; + self.y.write(w)?; + self.z.write(w)?; + self.w.write(w)?; + Ok(()) + } + fn read(r: &mut dyn Read) -> Result<Self> { + Ok(Self::new( + f32::read(r)?, + 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)?; diff --git a/shared/src/lib.rs b/shared/src/lib.rs index e6b296e..9c3e863 100644 --- a/shared/src/lib.rs +++ b/shared/src/lib.rs @@ -28,4 +28,4 @@ pub mod resources; pub mod store; pub mod tree; -pub use glam::{Affine3A, Mat3A, Vec2, Vec3A, vec2, vec3a}; +pub use glam::{Affine3A, Mat3A, Vec2, Vec3A, Vec4, vec2, vec3a, vec4}; diff --git a/shared/src/resources.rs b/shared/src/resources.rs index 2c94d05..f2b7859 100644 --- a/shared/src/resources.rs +++ b/shared/src/resources.rs @@ -16,7 +16,7 @@ */ use crate::{helper::ReadWrite, packets::Resource}; use anyhow::Result; -use glam::{Affine3A, Vec2, Vec3A}; +use glam::{Affine3A, Vec2, Vec3A, Vec4}; use log::warn; use std::{ borrow::Cow, @@ -65,7 +65,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_tangent: Option<Resource<Vec<Vec4>>>, pub va_texcoord: Option<Resource<Vec<Vec2>>>, pub va_roughness: Option<Resource<Vec<f32>>>, pub va_metallic: Option<Resource<Vec<f32>>>, diff --git a/world/src/mesh.rs b/world/src/mesh.rs index 4e6317d..0d90b82 100644 --- a/world/src/mesh.rs +++ b/world/src/mesh.rs @@ -20,10 +20,7 @@ use gltf::{Mesh, Node, buffer::Data}; use log::{debug, info}; use std::path::Path; use weareshared::{ - Affine3A, Vec3A, - resources::{Armature, MeshPart, Prefab}, - store::ResourceStore, - vec2, vec3a, + resources::{Armature, MeshPart, Prefab}, store::ResourceStore, vec2, vec3a, vec4, Affine3A, Vec3A }; pub fn import_mesh( @@ -69,7 +66,9 @@ pub fn import_mesh( .read_tangents() .map(|iter| { // TODO dont ignore handedness - let a = iter.map(|[x, y, z, _h]| vec3a(x, y, z)).collect::<Vec<_>>(); + let a = iter + .map(|[x, y, z, h]| vec4(x, y, z, h)) + .collect::<Vec<_>>(); debug!("{} vertex tangents", a.len()); store.set(&a) }) @@ -198,11 +197,7 @@ pub fn import_mesh( )?); } let mut tex_thickness = None; - if let Some(tex) = p - .material() - .volume() - .and_then(|t| t.thickness_texture()) - { + if let Some(tex) = p.material().volume().and_then(|t| t.thickness_texture()) { tex_thickness = Some(load_texture( "thickness", store, @@ -387,6 +382,6 @@ pub fn import_mesh( })?; prefab.mesh.push((trans, mesh)) - }; + } Ok(()) } |