improvements

This commit is contained in:
2024-03-10 20:10:48 +01:00
parent c66eaf153c
commit 00cfdfd46e
4 changed files with 20 additions and 27 deletions

View File

@@ -1,10 +1,9 @@
use std::collections::LinkedList;
use nalgebra::{vector, Vector3}; use nalgebra::{vector, Vector3};
use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen::prelude::wasm_bindgen;
use crate::slicer::{ use crate::slicer::{
base_slices::create_base_slices, split_surface::split_surface, Mesh, SlicerOptions, Triangle, base_slices::create_base_slices, mesh::Mesh, split_surface::split_surface, triangle::Triangle,
SlicerOptions,
}; };
mod slicer; mod slicer;
@@ -18,7 +17,7 @@ pub fn slice(positions: &[f32], layer_height: f32, max_angle: f32) {
assert_eq!(positions.len() % 9, 0); assert_eq!(positions.len() % 9, 0);
let mut surface_triangles = LinkedList::<Triangle<f32>>::new(); let mut surface_triangles = Vec::<Triangle<f32>>::with_capacity(positions.len() / 9);
let mut slicable_triangles = Vec::with_capacity(positions.len() / 9); let mut slicable_triangles = Vec::with_capacity(positions.len() / 9);
for i in (0..positions.len()).step_by(9) { for i in (0..positions.len()).step_by(9) {
let triangle = Triangle::new( let triangle = Triangle::new(
@@ -30,10 +29,11 @@ pub fn slice(positions: &[f32], layer_height: f32, max_angle: f32) {
if triangle.normal.angle(&BED_NORMAL) > max_angle { if triangle.normal.angle(&BED_NORMAL) > max_angle {
slicable_triangles.push(triangle); slicable_triangles.push(triangle);
} else { } else {
surface_triangles.push_back(triangle); surface_triangles.push(triangle);
} }
} }
slicable_triangles.shrink_to_fit(); slicable_triangles.shrink_to_fit();
surface_triangles.shrink_to_fit();
console_log!("Computing BVH"); console_log!("Computing BVH");

View File

@@ -20,7 +20,7 @@ where
aabb: triangles aabb: triangles
.get(0) .get(0)
.map(|triangle| { .map(|triangle| {
let mut aabb = triangle.aabb(); let mut aabb = triangle.aabb;
for triangle in triangles.iter().skip(1) { for triangle in triangles.iter().skip(1) {
aabb.join_mut(&triangle.aabb); aabb.join_mut(&triangle.aabb);
} }

View File

@@ -1,12 +1,13 @@
use super::triangle::Triangle; use super::{mesh::Mesh, triangle::Triangle};
use bvh::bvh::{Bvh, BvhNode}; use bvh::bvh::{Bvh, BvhNode};
/// Splits a surface into connected surfaces. /// Splits a surface into connected surfaces.
pub fn split_surface(mut triangles: Vec<Triangle<f32>>) -> Vec<Vec<Triangle<f32>>> { pub fn split_surface(mut triangles: Vec<Triangle<f32>>) -> Vec<Mesh<f32>> {
let mut surfaces = vec![]; let mut surfaces = vec![];
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;
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,13 +33,21 @@ pub fn split_surface(mut triangles: Vec<Triangle<f32>>) -> Vec<Vec<Triangle<f32>
} => { } => {
if triangle.connected_with_triangle(surface[shape_index]) { if triangle.connected_with_triangle(surface[shape_index]) {
surface.push(*triangle); surface.push(*triangle);
bvh.add_shape(&mut surface, surface.len() - 1); let index = surface.len() - 1;
bvh.add_shape(&mut surface, index);
aabb.join_mut(&triangle.aabb);
return false; return false;
} }
} }
} }
} }
true true
});
surfaces.push(Mesh {
triangles: surface,
aabb,
bvh,
}) })
} }
surfaces surfaces

View File

@@ -1,21 +1,5 @@
import { import { BufferGeometryLoader } from 'three';
BufferGeometry, import { type SliceArguments, type ProgressMessage, type WorkerEvent } from './worker-data';
BufferGeometryLoader,
Float32BufferAttribute,
Line3,
MathUtils,
Matrix4,
Plane,
Vector3
} from 'three';
import { ExtendedTriangle, MeshBVH, type HitPointInfo } from 'three-mesh-bvh';
import {
LayerType,
type LayerMessage,
type SliceArguments,
type ProgressMessage,
type WorkerEvent
} from './worker-data';
import init, { slice } from 'bampy'; import init, { slice } from 'bampy';
addEventListener('message', async (event: MessageEvent<WorkerEvent>) => { addEventListener('message', async (event: MessageEvent<WorkerEvent>) => {