mirror of
https://github.com/Theaninova/Bampy.git
synced 2026-01-03 15:22:50 +00:00
feat: surface stuff
This commit is contained in:
@@ -23,12 +23,25 @@ pub struct SliceOptions {
|
|||||||
max_angle: f32,
|
max_angle: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Tsify, Serialize, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase", tag = "type")]
|
||||||
|
#[tsify(into_wasm_abi)]
|
||||||
|
pub enum Slice {
|
||||||
|
Surface {
|
||||||
|
#[tsify(type = "Float32Array")]
|
||||||
|
position: Vec<f32>,
|
||||||
|
},
|
||||||
|
Ring {
|
||||||
|
#[tsify(type = "Float32Array")]
|
||||||
|
position: Vec<f32>,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Tsify, Serialize, Deserialize)]
|
#[derive(Tsify, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
#[tsify(into_wasm_abi)]
|
#[tsify(into_wasm_abi)]
|
||||||
pub struct SliceResult {
|
pub struct SliceResult {
|
||||||
#[tsify(type = "Array<Float32Array>")]
|
slices: Vec<Slice>,
|
||||||
rings: Vec<Vec<f32>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
@@ -68,7 +81,7 @@ pub fn slice(
|
|||||||
slicable_triangles.push(triangle);
|
slicable_triangles.push(triangle);
|
||||||
} else {
|
} else {
|
||||||
slicable_triangles.push(triangle);
|
slicable_triangles.push(triangle);
|
||||||
//surface_triangles.push(triangle);
|
surface_triangles.push(triangle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
slicable_triangles.shrink_to_fit();
|
slicable_triangles.shrink_to_fit();
|
||||||
@@ -79,7 +92,7 @@ pub fn slice(
|
|||||||
};
|
};
|
||||||
|
|
||||||
console_log!("Creating Surfaces");
|
console_log!("Creating Surfaces");
|
||||||
// let surfaces = split_surface(surface_triangles);
|
let surfaces = split_surface(surface_triangles);
|
||||||
|
|
||||||
console_log!("Computing BVH");
|
console_log!("Computing BVH");
|
||||||
let slicable = Mesh::from(slicable_triangles);
|
let slicable = Mesh::from(slicable_triangles);
|
||||||
@@ -88,15 +101,36 @@ pub fn slice(
|
|||||||
console_log!("Done");
|
console_log!("Done");
|
||||||
|
|
||||||
SliceResult {
|
SliceResult {
|
||||||
rings: slices
|
slices: slices
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|slice| {
|
.map(|slice| Slice::Ring {
|
||||||
slice
|
position: slice
|
||||||
.points
|
.points
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.flat_map(|point| [point.x as f32, point.y as f32, point.z as f32])
|
.flat_map(|point| [point.x as f32, point.y as f32, point.z as f32])
|
||||||
.collect()
|
.collect(),
|
||||||
})
|
})
|
||||||
|
.chain(surfaces.into_iter().map(|surface| {
|
||||||
|
Slice::Surface {
|
||||||
|
position: surface
|
||||||
|
.triangles
|
||||||
|
.into_iter()
|
||||||
|
.flat_map(|triangle| {
|
||||||
|
[
|
||||||
|
triangle.a.x as f32,
|
||||||
|
triangle.a.y as f32,
|
||||||
|
triangle.a.z as f32,
|
||||||
|
triangle.b.x as f32,
|
||||||
|
triangle.b.y as f32,
|
||||||
|
triangle.b.z as f32,
|
||||||
|
triangle.c.x as f32,
|
||||||
|
triangle.c.y as f32,
|
||||||
|
triangle.c.z as f32,
|
||||||
|
]
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
|
}
|
||||||
|
}))
|
||||||
.collect(),
|
.collect(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ 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<Mesh<f32>> {
|
pub fn split_surface(mut triangles: Vec<Triangle<f64>>) -> Vec<Mesh<f64>> {
|
||||||
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];
|
||||||
@@ -20,10 +20,10 @@ pub fn split_surface(mut triangles: Vec<Triangle<f32>>) -> Vec<Mesh<f32>> {
|
|||||||
child_r_index,
|
child_r_index,
|
||||||
child_r_aabb,
|
child_r_aabb,
|
||||||
} => {
|
} => {
|
||||||
if triangle.intersects_aabb(&child_l_aabb) {
|
if triangle.has_point_in_aabb(&child_l_aabb) {
|
||||||
stack.push(child_l_index);
|
stack.push(child_l_index);
|
||||||
}
|
}
|
||||||
if triangle.intersects_aabb(&child_r_aabb) {
|
if triangle.has_point_in_aabb(&child_r_aabb) {
|
||||||
stack.push(child_r_index);
|
stack.push(child_r_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use approx::{relative_eq, relative_ne, AbsDiffEq, RelativeEq};
|
use approx::{relative_eq, AbsDiffEq, RelativeEq};
|
||||||
use bvh::{
|
use bvh::{
|
||||||
aabb::{Aabb, Bounded},
|
aabb::{Aabb, Bounded},
|
||||||
bounding_hierarchy::BHShape,
|
bounding_hierarchy::BHShape,
|
||||||
@@ -64,7 +64,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn intersects_aabb(&self, aabb: &Aabb<T, 3>) -> bool {
|
pub fn has_point_in_aabb(&self, aabb: &Aabb<T, 3>) -> bool {
|
||||||
vec_inside_aabb(&self.a, aabb)
|
vec_inside_aabb(&self.a, aabb)
|
||||||
|| vec_inside_aabb(&self.b, aabb)
|
|| vec_inside_aabb(&self.b, aabb)
|
||||||
|| vec_inside_aabb(&self.c, aabb)
|
|| vec_inside_aabb(&self.c, aabb)
|
||||||
|
|||||||
@@ -20,13 +20,19 @@ addEventListener('message', async (event: MessageEvent<WorkerEvent>) => {
|
|||||||
layerHeight: event.data.data.layerHeight,
|
layerHeight: event.data.data.layerHeight,
|
||||||
maxAngle: event.data.data.maxNonPlanarAngle
|
maxAngle: event.data.data.maxNonPlanarAngle
|
||||||
});
|
});
|
||||||
for (const layer of result.rings) {
|
for (const layer of result.slices) {
|
||||||
const geometry = new BufferGeometry();
|
const geometry = new BufferGeometry();
|
||||||
geometry.setAttribute('position', new Float32BufferAttribute(layer, 3));
|
geometry.setAttribute('position', new Float32BufferAttribute(layer.position, 3));
|
||||||
|
if (layer.type === 'surface') {
|
||||||
|
geometry.computeVertexNormals();
|
||||||
|
}
|
||||||
|
|
||||||
self.postMessage({
|
self.postMessage({
|
||||||
type: 'layer',
|
type: 'layer',
|
||||||
data: { type: LayerType.Line, geometry: geometry.toJSON() }
|
data: {
|
||||||
|
type: layer.type === 'ring' ? LayerType.Line : LayerType.Surface,
|
||||||
|
geometry: geometry.toJSON()
|
||||||
|
}
|
||||||
} satisfies LayerMessage);
|
} satisfies LayerMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user