diff options
author | metamuffin <metamuffin@disroot.org> | 2025-03-22 16:26:31 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-03-22 16:26:31 +0100 |
commit | e52a32df7dad09a06f2791f8cb8aff51fd856404 (patch) | |
tree | 9f5ad5fb81f2462298b3d1ae170a70291a52e58d /src | |
parent | adb4df66869e116a8994c6cd7380a5b1adda450c (diff) | |
download | unity-tools-e52a32df7dad09a06f2791f8cb8aff51fd856404.tar unity-tools-e52a32df7dad09a06f2791f8cb8aff51fd856404.tar.bz2 unity-tools-e52a32df7dad09a06f2791f8cb8aff51fd856404.tar.zst |
coerce vector types of mesh
Diffstat (limited to 'src')
-rw-r--r-- | src/classes/mesh.rs | 30 | ||||
-rw-r--r-- | src/classes/mesh_renderer.rs | 6 | ||||
-rw-r--r-- | src/classes/texture2d.rs | 2 | ||||
-rw-r--r-- | src/classes/transform.rs | 6 |
4 files changed, 33 insertions, 11 deletions
diff --git a/src/classes/mesh.rs b/src/classes/mesh.rs index 348c61c..6d21ff5 100644 --- a/src/classes/mesh.rs +++ b/src/classes/mesh.rs @@ -182,16 +182,34 @@ impl VertexData { pub fn read_channel_vec<T: VectorType>( &self, channel: VertexDataChannel, + coerce: bool, ) -> Result<Option<Vec<T>>> { - let Some((dim, data)) = self.read_channel(channel) else { + let Some((dim, mut data)) = self.read_channel(channel) else { return Ok(None); }; if dim != T::DIM { - bail!( - "dimension mismatch reading {channel:?} channel ({} != {})", - dim, - T::DIM - ); + if coerce { + let mut ndata = Vec::new(); + if dim > T::DIM { + for e in data.chunks_exact(dim) { + ndata.extend(&e[..T::DIM]); + } + } else if dim < T::DIM { + for e in data.chunks_exact(dim) { + ndata.extend(e); + for _ in 0..(T::DIM - dim) { + ndata.push(0.); + } + } + } + data = ndata; + } else { + bail!( + "dimension mismatch reading {channel:?} channel ({} != {})", + dim, + T::DIM + ); + } } Ok(Some(VectorType::convert_array(data))) } diff --git a/src/classes/mesh_renderer.rs b/src/classes/mesh_renderer.rs index ac69483..c169450 100644 --- a/src/classes/mesh_renderer.rs +++ b/src/classes/mesh_renderer.rs @@ -5,7 +5,7 @@ use crate::object::{ Value, parser::{Fields, FromValue}, }; -use anyhow::Result; +use anyhow::{Context, Result}; pub struct MeshRenderer { pub enabled: bool, @@ -32,7 +32,9 @@ impl MeshRenderer { enabled: fields.field("m_Enabled")?, mesh: fields.field("m_Mesh")?, cast_shadows: fields.field("m_CastShadows")?, - game_object: fields.field("m_GameObject")?, + game_object: fields + .field("m_GameObject") + .context("gameobject of meshrenderer")?, materials: fields .remove("m_Materials") .unwrap() diff --git a/src/classes/texture2d.rs b/src/classes/texture2d.rs index 752bfeb..9ad2a1d 100644 --- a/src/classes/texture2d.rs +++ b/src/classes/texture2d.rs @@ -20,7 +20,7 @@ pub struct Texture2D { impl FromValue for Texture2D { fn from_value(v: Value) -> Result<Self> { - let mut fields = v.as_class("Texture2D").unwrap(); + let mut fields = v.as_class("Texture2D")?; Ok(Texture2D { width: fields.field("m_Width")?, height: fields.field("m_Height")?, diff --git a/src/classes/transform.rs b/src/classes/transform.rs index ed04d35..7a24a5c 100644 --- a/src/classes/transform.rs +++ b/src/classes/transform.rs @@ -1,6 +1,6 @@ use super::{gameobject::GameObject, pptr::PPtr}; use crate::object::{Value, parser::FromValue}; -use anyhow::Result; +use anyhow::{Context, Result}; use glam::{Quat, Vec3}; use serde::Serialize; @@ -22,7 +22,9 @@ impl FromValue for Transform { .or(v.as_class("Transform"))?; Ok(Self { father: fields.field("m_Father")?, - gameobject: fields.field("m_GameObject")?, + gameobject: fields + .field("m_GameObject") + .context("gameobject of transform")?, local_position: fields.field("m_LocalPosition")?, local_rotation: fields.field("m_LocalRotation")?, local_scale: fields.field("m_LocalScale")?, |