From e52a32df7dad09a06f2791f8cb8aff51fd856404 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sat, 22 Mar 2025 16:26:31 +0100 Subject: coerce vector types of mesh --- src/classes/mesh.rs | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) (limited to 'src/classes/mesh.rs') 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( &self, channel: VertexDataChannel, + coerce: bool, ) -> Result>> { - 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))) } -- cgit v1.2.3-70-g09d2