use ifc_lite_geometry::projection_outline::{mesh_outline_2d, ProjectionAxis};
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub struct MeshOutlineJs {
contours: Vec<Vec<f32>>, axis_min: f32,
axis_max: f32,
}
#[wasm_bindgen]
impl MeshOutlineJs {
#[wasm_bindgen(getter, js_name = axisMin)]
pub fn axis_min(&self) -> f32 {
self.axis_min
}
#[wasm_bindgen(getter, js_name = axisMax)]
pub fn axis_max(&self) -> f32 {
self.axis_max
}
#[wasm_bindgen(getter, js_name = contourCount)]
pub fn contour_count(&self) -> usize {
self.contours.len()
}
pub fn contour(&self, index: usize) -> Option<js_sys::Float32Array> {
self.contours
.get(index)
.map(|c| js_sys::Float32Array::from(&c[..]))
}
}
impl MeshOutlineJs {
pub(crate) fn rings_f64(&self) -> Vec<Vec<[f64; 2]>> {
self.contours
.iter()
.map(|flat| {
flat.chunks_exact(2)
.map(|p| [p[0] as f64, p[1] as f64])
.collect()
})
.collect()
}
}
#[wasm_bindgen(js_name = meshOutline2d)]
pub fn mesh_outline_2d_js(
positions: &[f32],
indices: &[u32],
axis: u8,
flipped: bool,
) -> Option<MeshOutlineJs> {
let axis = ProjectionAxis::from_u8(axis)?;
let outline = mesh_outline_2d(positions, indices, axis, flipped)?;
let contours = outline
.contours
.into_iter()
.map(|ring| {
let mut flat = Vec::with_capacity(ring.len() * 2);
for p in ring {
flat.push(p[0]);
flat.push(p[1]);
}
flat
})
.collect();
Some(MeshOutlineJs {
contours,
axis_min: outline.axis_min,
axis_max: outline.axis_max,
})
}