parry3d/transformation/to_trimesh/
voxels_to_trimesh.rsuse crate::bounding_volume::Aabb;
use crate::math::{Point, Real};
use crate::shape::Voxels;
use alloc::{vec, vec::Vec};
impl Voxels {
pub fn to_trimesh(&self) -> (Vec<Point<Real>>, Vec<[u32; 3]>) {
let aabb = Aabb::from_half_extents(Point::origin(), self.voxel_size() / 2.0);
let aabb_vtx = aabb.vertices();
let mut vtx = vec![];
let mut idx = vec![];
for vox in self.voxels() {
let mask = vox.state.free_faces();
for i in 0..6 {
if mask.bits() & (1 << i) != 0 {
let fvid = Aabb::FACES_VERTEX_IDS[i];
let base_id = vtx.len() as u32;
vtx.push(vox.center + aabb_vtx[fvid.0].coords);
vtx.push(vox.center + aabb_vtx[fvid.1].coords);
vtx.push(vox.center + aabb_vtx[fvid.2].coords);
vtx.push(vox.center + aabb_vtx[fvid.3].coords);
if i % 2 == 0 {
idx.push([base_id, base_id + 1, base_id + 2]);
idx.push([base_id, base_id + 2, base_id + 3]);
} else {
idx.push([base_id, base_id + 2, base_id + 1]);
idx.push([base_id, base_id + 3, base_id + 2]);
}
}
}
}
(vtx, idx)
}
}