aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-03-22 16:26:31 +0100
committermetamuffin <metamuffin@disroot.org>2025-03-22 16:26:31 +0100
commite52a32df7dad09a06f2791f8cb8aff51fd856404 (patch)
tree9f5ad5fb81f2462298b3d1ae170a70291a52e58d
parentadb4df66869e116a8994c6cd7380a5b1adda450c (diff)
downloadunity-tools-e52a32df7dad09a06f2791f8cb8aff51fd856404.tar
unity-tools-e52a32df7dad09a06f2791f8cb8aff51fd856404.tar.bz2
unity-tools-e52a32df7dad09a06f2791f8cb8aff51fd856404.tar.zst
coerce vector types of mesh
-rw-r--r--src/classes/mesh.rs30
-rw-r--r--src/classes/mesh_renderer.rs6
-rw-r--r--src/classes/texture2d.rs2
-rw-r--r--src/classes/transform.rs6
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")?,