mirror of
https://github.com/Theaninova/Bampy.git
synced 2026-01-06 16:52:48 +00:00
improvements
This commit is contained in:
@@ -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");
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user