This commit is contained in:
2024-03-11 00:43:31 +01:00
parent 00cfdfd46e
commit 608c2b08ec
9 changed files with 181 additions and 31 deletions

View File

@@ -1,8 +1,10 @@
use nalgebra::{vector, Vector3};
use serde::{Deserialize, Serialize};
use tsify::Tsify;
use wasm_bindgen::prelude::wasm_bindgen;
use crate::slicer::{
base_slices::create_base_slices, mesh::Mesh, split_surface::split_surface, triangle::Triangle,
base_slices::create_slices, mesh::Mesh, split_surface::split_surface, triangle::Triangle,
SlicerOptions,
};
@@ -11,8 +13,32 @@ mod util;
const BED_NORMAL: Vector3<f32> = vector![0f32, 0f32, 1f32];
#[derive(Tsify, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[tsify(from_wasm_abi)]
pub struct SliceOptions {
#[tsify(type = "Float32Array")]
positions: Vec<f32>,
layer_height: f32,
max_angle: f32,
}
#[derive(Tsify, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[tsify(into_wasm_abi)]
pub struct SliceResult {
#[tsify(type = "Array<Float32Array>")]
rings: Vec<Vec<f32>>,
}
#[wasm_bindgen]
pub fn slice(positions: &[f32], layer_height: f32, max_angle: f32) {
pub fn slice(
SliceOptions {
positions,
layer_height,
max_angle,
}: SliceOptions,
) -> SliceResult {
std::panic::set_hook(Box::new(console_error_panic_hook::hook));
assert_eq!(positions.len() % 9, 0);
@@ -29,21 +55,34 @@ pub fn slice(positions: &[f32], layer_height: f32, max_angle: f32) {
if triangle.normal.angle(&BED_NORMAL) > max_angle {
slicable_triangles.push(triangle);
} else {
slicable_triangles.push(triangle);
surface_triangles.push(triangle);
}
}
slicable_triangles.shrink_to_fit();
surface_triangles.shrink_to_fit();
console_log!("Computing BVH");
let slicer_options = SlicerOptions { layer_height };
console_log!("Creating Surfaces");
let surfaces = split_surface(surface_triangles);
console_log!("Creating Slices");
console_log!("Computing BVH");
let slicable = Mesh::from(slicable_triangles);
let base_slices = create_base_slices(&slicer_options, &slicable);
console_log!("Creating Slices");
let slices = create_slices(&slicer_options, &slicable);
console_log!("Done");
SliceResult {
rings: slices
.into_iter()
.map(|slice| {
slice
.points
.into_iter()
.flat_map(|point| [point.x, point.y, point.z])
.collect()
})
.collect(),
}
}