feat: connected surfaces

This commit is contained in:
2024-03-11 22:46:23 +01:00
parent 9c9e473490
commit ac39a15b4f
2 changed files with 49 additions and 38 deletions

View File

@@ -7,7 +7,10 @@ pub fn split_surface(mut triangles: Vec<Triangle<f64>>) -> Vec<Mesh<f64>> {
while let Some(triangle) = triangles.pop() { while let Some(triangle) = triangles.pop() {
let mut surface = vec![triangle]; let mut surface = vec![triangle];
let mut bvh = Bvh::build(&mut surface); let mut bvh = Bvh::build(&mut surface);
let mut aabb = surface[0].aabb; let mut aabb = surface[0].aabb.clone();
loop {
let mut mutated = false;
triangles.retain_mut(|triangle| { triangles.retain_mut(|triangle| {
let mut stack = Vec::<usize>::new(); let mut stack = Vec::<usize>::new();
stack.push(0); stack.push(0);
@@ -32,6 +35,7 @@ pub fn split_surface(mut triangles: Vec<Triangle<f64>>) -> Vec<Mesh<f64>> {
shape_index, shape_index,
} => { } => {
if triangle.connected_with_triangle(surface[shape_index]) { if triangle.connected_with_triangle(surface[shape_index]) {
mutated = true;
surface.push(*triangle); surface.push(*triangle);
let index = surface.len() - 1; let index = surface.len() - 1;
bvh.add_shape(&mut surface, index); bvh.add_shape(&mut surface, index);
@@ -43,6 +47,10 @@ pub fn split_surface(mut triangles: Vec<Triangle<f64>>) -> Vec<Mesh<f64>> {
} }
true true
}); });
if !mutated {
break;
}
}
surfaces.push(Mesh { surfaces.push(Mesh {
triangles: surface, triangles: surface,

View File

@@ -18,16 +18,19 @@ pub struct Triangle<T: SimdPartialOrd + Scalar + Copy> {
pub aabb: Aabb<T, 3>, pub aabb: Aabb<T, 3>,
} }
fn vec_inside_aabb<T: SimdPartialOrd + Scalar + Copy + Float>( #[inline(always)]
fn vec_inside_aabb<T: SimdPartialOrd + Scalar + Copy + Float + RelativeEq + approx::AbsDiffEq>(
vec: &Vector3<T>, vec: &Vector3<T>,
aabb: &Aabb<T, 3>, aabb: &Aabb<T, 3>,
) -> bool { ) -> bool {
vec.x >= aabb.min.x macro_rules! within {
&& vec.y >= aabb.min.y ($axis:ident) => {
&& vec.z >= aabb.min.z ((vec.$axis >= aabb.min.$axis && vec.$axis <= aabb.max.$axis)
&& vec.x <= aabb.max.x || relative_eq!(vec.$axis, aabb.min.$axis)
&& vec.y <= aabb.max.y || relative_eq!(vec.$axis, aabb.max.$axis))
&& vec.z <= aabb.max.z };
}
within!(x) && within!(y) && within!(z)
} }
impl<T> Triangle<T> impl<T> Triangle<T>