aboutsummaryrefslogtreecommitdiff
path: root/src/classes/mesh.rs
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 /src/classes/mesh.rs
parentadb4df66869e116a8994c6cd7380a5b1adda450c (diff)
downloadunity-tools-e52a32df7dad09a06f2791f8cb8aff51fd856404.tar
unity-tools-e52a32df7dad09a06f2791f8cb8aff51fd856404.tar.bz2
unity-tools-e52a32df7dad09a06f2791f8cb8aff51fd856404.tar.zst
coerce vector types of mesh
Diffstat (limited to 'src/classes/mesh.rs')
-rw-r--r--src/classes/mesh.rs30
1 files changed, 24 insertions, 6 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)))
}