summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-28 14:50:56 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-28 14:50:56 +0100
commit3331150162e34471bf0294bdb61a1a748cb94ee5 (patch)
tree10c5584dd22ce81a4d2b8d2e77b7f3a4545b4674
parent505560045a30dd1078480734a8cbf9b12c781170 (diff)
downloadweareserver-3331150162e34471bf0294bdb61a1a748cb94ee5.tar
weareserver-3331150162e34471bf0294bdb61a1a748cb94ee5.tar.bz2
weareserver-3331150162e34471bf0294bdb61a1a748cb94ee5.tar.zst
server+world: tangent handedness
-rw-r--r--doc/resources.md2
-rw-r--r--shared/src/helper.rs38
-rw-r--r--shared/src/lib.rs2
-rw-r--r--shared/src/resources.rs4
-rw-r--r--world/src/mesh.rs17
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(())
}