From 00cfdfd46e21eb34cb934ce48151693753fe3b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Sun, 10 Mar 2024 20:10:48 +0100 Subject: [PATCH] improvements --- bampy/src/lib.rs | 10 +++++----- bampy/src/slicer/mesh.rs | 2 +- bampy/src/slicer/split_surface.rs | 15 ++++++++++++--- src/lib/slicer/worker.ts | 20 ++------------------ 4 files changed, 20 insertions(+), 27 deletions(-) diff --git a/bampy/src/lib.rs b/bampy/src/lib.rs index e0ea8e1..fa0c29c 100644 --- a/bampy/src/lib.rs +++ b/bampy/src/lib.rs @@ -1,10 +1,9 @@ -use std::collections::LinkedList; - use nalgebra::{vector, Vector3}; use wasm_bindgen::prelude::wasm_bindgen; 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; @@ -18,7 +17,7 @@ pub fn slice(positions: &[f32], layer_height: f32, max_angle: f32) { assert_eq!(positions.len() % 9, 0); - let mut surface_triangles = LinkedList::>::new(); + let mut surface_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) { 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 { slicable_triangles.push(triangle); } else { - surface_triangles.push_back(triangle); + surface_triangles.push(triangle); } } slicable_triangles.shrink_to_fit(); + surface_triangles.shrink_to_fit(); console_log!("Computing BVH"); diff --git a/bampy/src/slicer/mesh.rs b/bampy/src/slicer/mesh.rs index 400c4e2..659c309 100644 --- a/bampy/src/slicer/mesh.rs +++ b/bampy/src/slicer/mesh.rs @@ -20,7 +20,7 @@ where aabb: triangles .get(0) .map(|triangle| { - let mut aabb = triangle.aabb(); + let mut aabb = triangle.aabb; for triangle in triangles.iter().skip(1) { aabb.join_mut(&triangle.aabb); } diff --git a/bampy/src/slicer/split_surface.rs b/bampy/src/slicer/split_surface.rs index 827b53a..15e59c2 100644 --- a/bampy/src/slicer/split_surface.rs +++ b/bampy/src/slicer/split_surface.rs @@ -1,12 +1,13 @@ -use super::triangle::Triangle; +use super::{mesh::Mesh, triangle::Triangle}; use bvh::bvh::{Bvh, BvhNode}; /// Splits a surface into connected surfaces. -pub fn split_surface(mut triangles: Vec>) -> Vec>> { +pub fn split_surface(mut triangles: Vec>) -> Vec> { let mut surfaces = vec![]; while let Some(triangle) = triangles.pop() { let mut surface = vec![triangle]; let mut bvh = Bvh::build(&mut surface); + let mut aabb = surface[0].aabb; triangles.retain_mut(|triangle| { let mut stack = Vec::::new(); stack.push(0); @@ -32,13 +33,21 @@ pub fn split_surface(mut triangles: Vec>) -> Vec } => { if triangle.connected_with_triangle(surface[shape_index]) { 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; } } } } true + }); + + surfaces.push(Mesh { + triangles: surface, + aabb, + bvh, }) } surfaces diff --git a/src/lib/slicer/worker.ts b/src/lib/slicer/worker.ts index c424b14..f43212c 100644 --- a/src/lib/slicer/worker.ts +++ b/src/lib/slicer/worker.ts @@ -1,21 +1,5 @@ -import { - BufferGeometry, - 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 { BufferGeometryLoader } from 'three'; +import { type SliceArguments, type ProgressMessage, type WorkerEvent } from './worker-data'; import init, { slice } from 'bampy'; addEventListener('message', async (event: MessageEvent) => {