use crate::BlenderMesh;
impl BlenderMesh {
pub(crate) fn triangulate(&self, indices: &Vec<u16>) -> Vec<u16> {
let mut triangulated_position_indices = vec![];
let mut triangulated_face_vertex_counts = vec![];
let mut face_pointer = 0;
for num_verts_in_face in self
.multi_indexed_vertex_attributes
.vertices_in_each_face
.iter()
{
triangulated_position_indices.push(indices[face_pointer]);
triangulated_position_indices.push(indices[face_pointer + 1]);
triangulated_position_indices.push(indices[face_pointer + 2]);
triangulated_face_vertex_counts.push(3);
match num_verts_in_face {
&3 => {}
&4 => {
triangulated_position_indices.push(indices[face_pointer]);
triangulated_position_indices.push(indices[face_pointer + 2]);
triangulated_position_indices.push(indices[face_pointer + 3]);
triangulated_face_vertex_counts.push(3);
}
_ => {
panic!("blender-mesh currently only supports triangulating faces with 3 or 4 vertices");
}
};
face_pointer += *num_verts_in_face as usize;
}
return triangulated_position_indices;
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::vertex_attributes::{
IndexedAttribute, MultiIndexedVertexAttributes, VertexAttribute,
};
#[test]
fn triangulate_faces() {
let start_mesh = BlenderMesh {
multi_indexed_vertex_attributes: MultiIndexedVertexAttributes {
positions: IndexedAttribute {
indices: vec![0, 1, 2, 3, 4, 5, 6, 7],
attribute: VertexAttribute::default(),
},
vertices_in_each_face: vec![4, 4],
..MultiIndexedVertexAttributes::default()
}
.into(),
..BlenderMesh::default()
};
let triangulated_indices = start_mesh.triangulate(&vec![0, 1, 2, 3, 4, 5, 6, 7]);
assert_eq!(
triangulated_indices,
vec![0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7]
);
}
}