aboutsummaryrefslogtreecommitdiff
path: root/src/classes/mesh.rs
diff options
context:
space:
mode:
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)))
}