okgeometry-api 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"wasm-base64.js","sourceRoot":"","sources":["../src/wasm-base64.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,0iryBAA0iryB,CAAC"}
1
+ {"version":3,"file":"wasm-base64.js","sourceRoot":"","sources":["../src/wasm-base64.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,8tq5BAA8tq5B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "okgeometry-api",
3
- "version": "0.4.2",
3
+ "version": "0.4.4",
4
4
  "description": "Geometry engine API for AEC applications — NURBS, meshes, booleans, intersections. Powered by Rust/WASM.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -93,6 +93,12 @@ export function fillet_polycurve(coords: Float64Array, radius: number, nx: numbe
93
93
  */
94
94
  export function line_length(x1: number, y1: number, z1: number, x2: number, y2: number, z2: number): number;
95
95
 
96
+ /**
97
+ * Offset a line segment perpendicular to line direction relative to reference normal.
98
+ * Returns [startX,startY,startZ,endX,endY,endZ]
99
+ */
100
+ export function line_offset(x1: number, y1: number, z1: number, x2: number, y2: number, z2: number, distance: number, nx: number, ny: number, nz: number): Float64Array;
101
+
96
102
  /**
97
103
  * Evaluate a point on a line segment at parameter t ∈ [0,1].
98
104
  * Returns [x, y, z].
@@ -189,6 +195,13 @@ export function mesh_boolean_union(vertex_count_a: number, buffer_a: Float64Arra
189
195
  */
190
196
  export function mesh_boundary_polylines(vertex_count: number, buffer: Float64Array): Float64Array;
191
197
 
198
+ /**
199
+ * Coplanar connected face groups.
200
+ * Output format:
201
+ * [groupCount, triCount, tri..., centroidX,centroidY,centroidZ, normalX,normalY,normalZ, ...]
202
+ */
203
+ export function mesh_build_coplanar_connected_face_groups(vertex_count: number, buffer: Float64Array): Float64Array;
204
+
192
205
  /**
193
206
  * Chamfer all edges of a primitive mesh (flat bevel)
194
207
  *
@@ -202,6 +215,16 @@ export function mesh_boundary_polylines(vertex_count: number, buffer: Float64Arr
202
215
  */
203
216
  export function mesh_chamfer_all_edges(mesh_type: string, params: Float64Array, offset: number): Float64Array;
204
217
 
218
+ /**
219
+ * Compute planar curve normal from ordered points.
220
+ */
221
+ export function mesh_compute_planar_curve_normal(coords: Float64Array, closed: boolean): Float64Array;
222
+
223
+ /**
224
+ * Odd/even mesh containment test.
225
+ */
226
+ export function mesh_contains_point(vertex_count: number, buffer: Float64Array, px: number, py: number, pz: number): boolean;
227
+
205
228
  /**
206
229
  * Create a box mesh and return buffers
207
230
  * Returns [vertices..., indices...]
@@ -243,6 +266,71 @@ export function mesh_evaluate(vertex_count: number, buffer: Float64Array, u: num
243
266
  */
244
267
  export function mesh_export_obj(vertex_count: number, buffer: Float64Array): string;
245
268
 
269
+ /**
270
+ * Push/pull a planar face set by moving its coplanar connected region.
271
+ */
272
+ export function mesh_extrude_face(vertex_count: number, buffer: Float64Array, face_index: number, distance: number): Float64Array;
273
+
274
+ /**
275
+ * Extrude planar curve profile by normal * height.
276
+ */
277
+ export function mesh_extrude_planar_curve(coords: Float64Array, nx: number, ny: number, nz: number, height: number, closed: boolean): Float64Array;
278
+
279
+ /**
280
+ * Find the best matching coplanar connected face group by normal and optional near-point.
281
+ * Output format: [centroidX, centroidY, centroidZ, normalX, normalY, normalZ] or [].
282
+ */
283
+ export function mesh_find_face_group_by_normal(vertex_count: number, buffer: Float64Array, nx: number, ny: number, nz: number, near_x: number, near_y: number, near_z: number, use_near_point: boolean): Float64Array;
284
+
285
+ /**
286
+ * Find the coplanar connected face group containing triangle_index.
287
+ * Output format: [centroidX, centroidY, centroidZ, normalX, normalY, normalZ] or [].
288
+ */
289
+ export function mesh_find_face_group_by_triangle_index(vertex_count: number, buffer: Float64Array, triangle_index: number): Float64Array;
290
+
291
+ /**
292
+ * Axis-aligned bounding box as [minX, minY, minZ, maxX, maxY, maxZ].
293
+ */
294
+ export function mesh_get_bounds(vertex_count: number, buffer: Float64Array): Float64Array;
295
+
296
+ /**
297
+ * Coplanar connected face-group centroid containing a given triangle face index.
298
+ * Output format: [x, y, z] or [] when unavailable.
299
+ */
300
+ export function mesh_get_coplanar_face_group_centroid(vertex_count: number, buffer: Float64Array, face_index: number): Float64Array;
301
+
302
+ /**
303
+ * Edge-connected coplanar triangle indices as [count, i0, i1, ...].
304
+ */
305
+ export function mesh_get_coplanar_face_indices(vertex_count: number, buffer: Float64Array, face_index: number): Float64Array;
306
+
307
+ /**
308
+ * Coplanar connected face region projected to a plane basis.
309
+ * Output format:
310
+ * [faceCount, faceIndex0, faceIndex1, ..., uMin, uMax, vMin, vMax]
311
+ */
312
+ export function mesh_get_coplanar_face_region(vertex_count: number, buffer: Float64Array, face_index: number, ox: number, oy: number, oz: number, ux: number, uy: number, uz: number, vx: number, vy: number, vz: number, margin_scale: number, min_margin: number): Float64Array;
313
+
314
+ /**
315
+ * Unique undirected triangle edges as [edgeCount, v0a, v0b, v1a, v1b, ...].
316
+ */
317
+ export function mesh_get_edge_vertex_pairs(vertex_count: number, buffer: Float64Array): Float64Array;
318
+
319
+ /**
320
+ * Face area.
321
+ */
322
+ export function mesh_get_face_area(vertex_count: number, buffer: Float64Array, face_index: number): number;
323
+
324
+ /**
325
+ * Face centroid as [x, y, z].
326
+ */
327
+ export function mesh_get_face_centroid(vertex_count: number, buffer: Float64Array, face_index: number): Float64Array;
328
+
329
+ /**
330
+ * Face normal as [x, y, z].
331
+ */
332
+ export function mesh_get_face_normal(vertex_count: number, buffer: Float64Array, face_index: number): Float64Array;
333
+
246
334
  /**
247
335
  * Get mesh statistics
248
336
  * Returns [vertex_count, face_count, edge_count]
@@ -254,6 +342,17 @@ export function mesh_get_stats(vertex_count: number, buffer: Float64Array): Floa
254
342
  */
255
343
  export function mesh_import_obj(obj_data: string): Float64Array;
256
344
 
345
+ /**
346
+ * Check if triangulated mesh is a closed volume (no welded boundary edges).
347
+ */
348
+ export function mesh_is_closed_volume(vertex_count: number, buffer: Float64Array): boolean;
349
+
350
+ /**
351
+ * Merge multiple mesh buffers while preserving per-mesh vertex order and index remapping.
352
+ * Input format: [mesh_count, len1, mesh1..., len2, mesh2..., ...]
353
+ */
354
+ export function mesh_merge(mesh_data: Float64Array): Float64Array;
355
+
257
356
  /**
258
357
  * Intersect two meshes, returning intersection polyline points.
259
358
  * Returns: [num_polylines, n1, x,y,z,..., n2, x,y,z,...]
@@ -275,6 +374,31 @@ export function mesh_patch_from_points(coords: Float64Array): Float64Array;
275
374
  */
276
375
  export function mesh_plane_intersect(vertex_count: number, buffer: Float64Array, nx: number, ny: number, nz: number, d: number): Float64Array;
277
376
 
377
+ /**
378
+ * Shift closed boolean cutter curve and adjust height.
379
+ * Returns [height, epsilon, pointCount, x,y,z,...]
380
+ */
381
+ export function mesh_prepare_boolean_cutter_curve(coords: Float64Array, closed: boolean, nx: number, ny: number, nz: number, height: number): Float64Array;
382
+
383
+ /**
384
+ * Raycast against mesh and return closest hit.
385
+ * Output: [] when no hit, otherwise [pointX,pointY,pointZ, normalX,normalY,normalZ, faceIndex, distance]
386
+ */
387
+ export function mesh_raycast(vertex_count: number, buffer: Float64Array, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, max_distance: number): Float64Array;
388
+
389
+ /**
390
+ * Raycast against mesh and return all hits sorted by distance.
391
+ * Output: [hitCount, (point, normal, faceIndex, distance)*]
392
+ */
393
+ export function mesh_raycast_all(vertex_count: number, buffer: Float64Array, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, max_distance: number): Float64Array;
394
+
395
+ /**
396
+ * Raycast against many meshes packed as:
397
+ * [meshCount, meshLen0, meshRaw0..., meshLen1, meshRaw1..., ...]
398
+ * Output: [hitCount, meshIndex, pointX,pointY,pointZ, normalX,normalY,normalZ, faceIndex, distance, ...]
399
+ */
400
+ export function mesh_raycast_many(mesh_data: Float64Array, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, max_distance: number): Float64Array;
401
+
278
402
  /**
279
403
  * Rotate a mesh around an arbitrary axis and return new buffers
280
404
  * Axis is defined by (ax, ay, az), angle in radians
@@ -5,5 +5,5 @@ import { __wbg_set_wasm } from "./okgeometrycore_bg.js";
5
5
  __wbg_set_wasm(wasm);
6
6
  wasm.__wbindgen_start();
7
7
  export {
8
- arc_length, arc_point_at, chamfer_polycurve, circle_length, circle_point_at, create_arc, create_circle, create_line, create_polyline, curve_to_points, evaluate_nurbs_curve_at, extrude_circle, extrude_line, extrude_polyline, fillet_polycurve, line_length, line_point_at, line_tangent, loft_circles, loft_nurbs_surface, loft_polylines, make_nurbs_curves_compatible, mesh_apply_matrix, mesh_boolean_intersection, mesh_boolean_operation, mesh_boolean_subtraction, mesh_boolean_union, mesh_boundary_polylines, mesh_chamfer_all_edges, mesh_create_box, mesh_create_cone, mesh_create_cylinder, mesh_create_prism, mesh_create_sphere, mesh_evaluate, mesh_export_obj, mesh_get_stats, mesh_import_obj, mesh_mesh_intersect, mesh_patch_from_points, mesh_plane_intersect, mesh_rotate, mesh_scale, mesh_translate, nurbs_curve_curve_intersect, nurbs_curve_plane_intersect, nurbs_surface_evaluate, nurbs_surface_plane_intersect, nurbs_surface_surface_intersect, offset_polyline_curve, polycurve_to_nurbs, polyline_length, polyline_point_at, ray_closest_point, ray_closest_point_parameter, ray_distance_to_point, ray_point_at, sample_nurbs_curve, sweep_curves, sweep_polylines, tessellate_nurbs_surface, test_wasm, version
8
+ arc_length, arc_point_at, chamfer_polycurve, circle_length, circle_point_at, create_arc, create_circle, create_line, create_polyline, curve_to_points, evaluate_nurbs_curve_at, extrude_circle, extrude_line, extrude_polyline, fillet_polycurve, line_length, line_offset, line_point_at, line_tangent, loft_circles, loft_nurbs_surface, loft_polylines, make_nurbs_curves_compatible, mesh_apply_matrix, mesh_boolean_intersection, mesh_boolean_operation, mesh_boolean_subtraction, mesh_boolean_union, mesh_boundary_polylines, mesh_build_coplanar_connected_face_groups, mesh_chamfer_all_edges, mesh_compute_planar_curve_normal, mesh_contains_point, mesh_create_box, mesh_create_cone, mesh_create_cylinder, mesh_create_prism, mesh_create_sphere, mesh_evaluate, mesh_export_obj, mesh_extrude_face, mesh_extrude_planar_curve, mesh_find_face_group_by_normal, mesh_find_face_group_by_triangle_index, mesh_get_bounds, mesh_get_coplanar_face_group_centroid, mesh_get_coplanar_face_indices, mesh_get_coplanar_face_region, mesh_get_edge_vertex_pairs, mesh_get_face_area, mesh_get_face_centroid, mesh_get_face_normal, mesh_get_stats, mesh_import_obj, mesh_is_closed_volume, mesh_merge, mesh_mesh_intersect, mesh_patch_from_points, mesh_plane_intersect, mesh_prepare_boolean_cutter_curve, mesh_raycast, mesh_raycast_all, mesh_raycast_many, mesh_rotate, mesh_scale, mesh_translate, nurbs_curve_curve_intersect, nurbs_curve_plane_intersect, nurbs_surface_evaluate, nurbs_surface_plane_intersect, nurbs_surface_surface_intersect, offset_polyline_curve, polycurve_to_nurbs, polyline_length, polyline_point_at, ray_closest_point, ray_closest_point_parameter, ray_distance_to_point, ray_point_at, sample_nurbs_curve, sweep_curves, sweep_polylines, tessellate_nurbs_surface, test_wasm, version
9
9
  } from "./okgeometrycore_bg.js";
@@ -289,6 +289,28 @@ export function line_length(x1, y1, z1, x2, y2, z2) {
289
289
  return ret;
290
290
  }
291
291
 
292
+ /**
293
+ * Offset a line segment perpendicular to line direction relative to reference normal.
294
+ * Returns [startX,startY,startZ,endX,endY,endZ]
295
+ * @param {number} x1
296
+ * @param {number} y1
297
+ * @param {number} z1
298
+ * @param {number} x2
299
+ * @param {number} y2
300
+ * @param {number} z2
301
+ * @param {number} distance
302
+ * @param {number} nx
303
+ * @param {number} ny
304
+ * @param {number} nz
305
+ * @returns {Float64Array}
306
+ */
307
+ export function line_offset(x1, y1, z1, x2, y2, z2, distance, nx, ny, nz) {
308
+ const ret = wasm.line_offset(x1, y1, z1, x2, y2, z2, distance, nx, ny, nz);
309
+ var v1 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
310
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
311
+ return v1;
312
+ }
313
+
292
314
  /**
293
315
  * Evaluate a point on a line segment at parameter t ∈ [0,1].
294
316
  * Returns [x, y, z].
@@ -532,6 +554,23 @@ export function mesh_boundary_polylines(vertex_count, buffer) {
532
554
  return v2;
533
555
  }
534
556
 
557
+ /**
558
+ * Coplanar connected face groups.
559
+ * Output format:
560
+ * [groupCount, triCount, tri..., centroidX,centroidY,centroidZ, normalX,normalY,normalZ, ...]
561
+ * @param {number} vertex_count
562
+ * @param {Float64Array} buffer
563
+ * @returns {Float64Array}
564
+ */
565
+ export function mesh_build_coplanar_connected_face_groups(vertex_count, buffer) {
566
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
567
+ const len0 = WASM_VECTOR_LEN;
568
+ const ret = wasm.mesh_build_coplanar_connected_face_groups(vertex_count, ptr0, len0);
569
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
570
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
571
+ return v2;
572
+ }
573
+
535
574
  /**
536
575
  * Chamfer all edges of a primitive mesh (flat bevel)
537
576
  *
@@ -558,6 +597,37 @@ export function mesh_chamfer_all_edges(mesh_type, params, offset) {
558
597
  return v3;
559
598
  }
560
599
 
600
+ /**
601
+ * Compute planar curve normal from ordered points.
602
+ * @param {Float64Array} coords
603
+ * @param {boolean} closed
604
+ * @returns {Float64Array}
605
+ */
606
+ export function mesh_compute_planar_curve_normal(coords, closed) {
607
+ const ptr0 = passArrayF64ToWasm0(coords, wasm.__wbindgen_malloc);
608
+ const len0 = WASM_VECTOR_LEN;
609
+ const ret = wasm.mesh_compute_planar_curve_normal(ptr0, len0, closed);
610
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
611
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
612
+ return v2;
613
+ }
614
+
615
+ /**
616
+ * Odd/even mesh containment test.
617
+ * @param {number} vertex_count
618
+ * @param {Float64Array} buffer
619
+ * @param {number} px
620
+ * @param {number} py
621
+ * @param {number} pz
622
+ * @returns {boolean}
623
+ */
624
+ export function mesh_contains_point(vertex_count, buffer, px, py, pz) {
625
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
626
+ const len0 = WASM_VECTOR_LEN;
627
+ const ret = wasm.mesh_contains_point(vertex_count, ptr0, len0, px, py, pz);
628
+ return ret !== 0;
629
+ }
630
+
561
631
  /**
562
632
  * Create a box mesh and return buffers
563
633
  * Returns [vertices..., indices...]
@@ -672,6 +742,220 @@ export function mesh_export_obj(vertex_count, buffer) {
672
742
  }
673
743
  }
674
744
 
745
+ /**
746
+ * Push/pull a planar face set by moving its coplanar connected region.
747
+ * @param {number} vertex_count
748
+ * @param {Float64Array} buffer
749
+ * @param {number} face_index
750
+ * @param {number} distance
751
+ * @returns {Float64Array}
752
+ */
753
+ export function mesh_extrude_face(vertex_count, buffer, face_index, distance) {
754
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
755
+ const len0 = WASM_VECTOR_LEN;
756
+ const ret = wasm.mesh_extrude_face(vertex_count, ptr0, len0, face_index, distance);
757
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
758
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
759
+ return v2;
760
+ }
761
+
762
+ /**
763
+ * Extrude planar curve profile by normal * height.
764
+ * @param {Float64Array} coords
765
+ * @param {number} nx
766
+ * @param {number} ny
767
+ * @param {number} nz
768
+ * @param {number} height
769
+ * @param {boolean} closed
770
+ * @returns {Float64Array}
771
+ */
772
+ export function mesh_extrude_planar_curve(coords, nx, ny, nz, height, closed) {
773
+ const ptr0 = passArrayF64ToWasm0(coords, wasm.__wbindgen_malloc);
774
+ const len0 = WASM_VECTOR_LEN;
775
+ const ret = wasm.mesh_extrude_planar_curve(ptr0, len0, nx, ny, nz, height, closed);
776
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
777
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
778
+ return v2;
779
+ }
780
+
781
+ /**
782
+ * Find the best matching coplanar connected face group by normal and optional near-point.
783
+ * Output format: [centroidX, centroidY, centroidZ, normalX, normalY, normalZ] or [].
784
+ * @param {number} vertex_count
785
+ * @param {Float64Array} buffer
786
+ * @param {number} nx
787
+ * @param {number} ny
788
+ * @param {number} nz
789
+ * @param {number} near_x
790
+ * @param {number} near_y
791
+ * @param {number} near_z
792
+ * @param {boolean} use_near_point
793
+ * @returns {Float64Array}
794
+ */
795
+ export function mesh_find_face_group_by_normal(vertex_count, buffer, nx, ny, nz, near_x, near_y, near_z, use_near_point) {
796
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
797
+ const len0 = WASM_VECTOR_LEN;
798
+ const ret = wasm.mesh_find_face_group_by_normal(vertex_count, ptr0, len0, nx, ny, nz, near_x, near_y, near_z, use_near_point);
799
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
800
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
801
+ return v2;
802
+ }
803
+
804
+ /**
805
+ * Find the coplanar connected face group containing triangle_index.
806
+ * Output format: [centroidX, centroidY, centroidZ, normalX, normalY, normalZ] or [].
807
+ * @param {number} vertex_count
808
+ * @param {Float64Array} buffer
809
+ * @param {number} triangle_index
810
+ * @returns {Float64Array}
811
+ */
812
+ export function mesh_find_face_group_by_triangle_index(vertex_count, buffer, triangle_index) {
813
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
814
+ const len0 = WASM_VECTOR_LEN;
815
+ const ret = wasm.mesh_find_face_group_by_triangle_index(vertex_count, ptr0, len0, triangle_index);
816
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
817
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
818
+ return v2;
819
+ }
820
+
821
+ /**
822
+ * Axis-aligned bounding box as [minX, minY, minZ, maxX, maxY, maxZ].
823
+ * @param {number} vertex_count
824
+ * @param {Float64Array} buffer
825
+ * @returns {Float64Array}
826
+ */
827
+ export function mesh_get_bounds(vertex_count, buffer) {
828
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
829
+ const len0 = WASM_VECTOR_LEN;
830
+ const ret = wasm.mesh_get_bounds(vertex_count, ptr0, len0);
831
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
832
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
833
+ return v2;
834
+ }
835
+
836
+ /**
837
+ * Coplanar connected face-group centroid containing a given triangle face index.
838
+ * Output format: [x, y, z] or [] when unavailable.
839
+ * @param {number} vertex_count
840
+ * @param {Float64Array} buffer
841
+ * @param {number} face_index
842
+ * @returns {Float64Array}
843
+ */
844
+ export function mesh_get_coplanar_face_group_centroid(vertex_count, buffer, face_index) {
845
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
846
+ const len0 = WASM_VECTOR_LEN;
847
+ const ret = wasm.mesh_get_coplanar_face_group_centroid(vertex_count, ptr0, len0, face_index);
848
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
849
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
850
+ return v2;
851
+ }
852
+
853
+ /**
854
+ * Edge-connected coplanar triangle indices as [count, i0, i1, ...].
855
+ * @param {number} vertex_count
856
+ * @param {Float64Array} buffer
857
+ * @param {number} face_index
858
+ * @returns {Float64Array}
859
+ */
860
+ export function mesh_get_coplanar_face_indices(vertex_count, buffer, face_index) {
861
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
862
+ const len0 = WASM_VECTOR_LEN;
863
+ const ret = wasm.mesh_get_coplanar_face_indices(vertex_count, ptr0, len0, face_index);
864
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
865
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
866
+ return v2;
867
+ }
868
+
869
+ /**
870
+ * Coplanar connected face region projected to a plane basis.
871
+ * Output format:
872
+ * [faceCount, faceIndex0, faceIndex1, ..., uMin, uMax, vMin, vMax]
873
+ * @param {number} vertex_count
874
+ * @param {Float64Array} buffer
875
+ * @param {number} face_index
876
+ * @param {number} ox
877
+ * @param {number} oy
878
+ * @param {number} oz
879
+ * @param {number} ux
880
+ * @param {number} uy
881
+ * @param {number} uz
882
+ * @param {number} vx
883
+ * @param {number} vy
884
+ * @param {number} vz
885
+ * @param {number} margin_scale
886
+ * @param {number} min_margin
887
+ * @returns {Float64Array}
888
+ */
889
+ export function mesh_get_coplanar_face_region(vertex_count, buffer, face_index, ox, oy, oz, ux, uy, uz, vx, vy, vz, margin_scale, min_margin) {
890
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
891
+ const len0 = WASM_VECTOR_LEN;
892
+ const ret = wasm.mesh_get_coplanar_face_region(vertex_count, ptr0, len0, face_index, ox, oy, oz, ux, uy, uz, vx, vy, vz, margin_scale, min_margin);
893
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
894
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
895
+ return v2;
896
+ }
897
+
898
+ /**
899
+ * Unique undirected triangle edges as [edgeCount, v0a, v0b, v1a, v1b, ...].
900
+ * @param {number} vertex_count
901
+ * @param {Float64Array} buffer
902
+ * @returns {Float64Array}
903
+ */
904
+ export function mesh_get_edge_vertex_pairs(vertex_count, buffer) {
905
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
906
+ const len0 = WASM_VECTOR_LEN;
907
+ const ret = wasm.mesh_get_edge_vertex_pairs(vertex_count, ptr0, len0);
908
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
909
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
910
+ return v2;
911
+ }
912
+
913
+ /**
914
+ * Face area.
915
+ * @param {number} vertex_count
916
+ * @param {Float64Array} buffer
917
+ * @param {number} face_index
918
+ * @returns {number}
919
+ */
920
+ export function mesh_get_face_area(vertex_count, buffer, face_index) {
921
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
922
+ const len0 = WASM_VECTOR_LEN;
923
+ const ret = wasm.mesh_get_face_area(vertex_count, ptr0, len0, face_index);
924
+ return ret;
925
+ }
926
+
927
+ /**
928
+ * Face centroid as [x, y, z].
929
+ * @param {number} vertex_count
930
+ * @param {Float64Array} buffer
931
+ * @param {number} face_index
932
+ * @returns {Float64Array}
933
+ */
934
+ export function mesh_get_face_centroid(vertex_count, buffer, face_index) {
935
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
936
+ const len0 = WASM_VECTOR_LEN;
937
+ const ret = wasm.mesh_get_face_centroid(vertex_count, ptr0, len0, face_index);
938
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
939
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
940
+ return v2;
941
+ }
942
+
943
+ /**
944
+ * Face normal as [x, y, z].
945
+ * @param {number} vertex_count
946
+ * @param {Float64Array} buffer
947
+ * @param {number} face_index
948
+ * @returns {Float64Array}
949
+ */
950
+ export function mesh_get_face_normal(vertex_count, buffer, face_index) {
951
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
952
+ const len0 = WASM_VECTOR_LEN;
953
+ const ret = wasm.mesh_get_face_normal(vertex_count, ptr0, len0, face_index);
954
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
955
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
956
+ return v2;
957
+ }
958
+
675
959
  /**
676
960
  * Get mesh statistics
677
961
  * Returns [vertex_count, face_count, edge_count]
@@ -702,6 +986,34 @@ export function mesh_import_obj(obj_data) {
702
986
  return v2;
703
987
  }
704
988
 
989
+ /**
990
+ * Check if triangulated mesh is a closed volume (no welded boundary edges).
991
+ * @param {number} vertex_count
992
+ * @param {Float64Array} buffer
993
+ * @returns {boolean}
994
+ */
995
+ export function mesh_is_closed_volume(vertex_count, buffer) {
996
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
997
+ const len0 = WASM_VECTOR_LEN;
998
+ const ret = wasm.mesh_is_closed_volume(vertex_count, ptr0, len0);
999
+ return ret !== 0;
1000
+ }
1001
+
1002
+ /**
1003
+ * Merge multiple mesh buffers while preserving per-mesh vertex order and index remapping.
1004
+ * Input format: [mesh_count, len1, mesh1..., len2, mesh2..., ...]
1005
+ * @param {Float64Array} mesh_data
1006
+ * @returns {Float64Array}
1007
+ */
1008
+ export function mesh_merge(mesh_data) {
1009
+ const ptr0 = passArrayF64ToWasm0(mesh_data, wasm.__wbindgen_malloc);
1010
+ const len0 = WASM_VECTOR_LEN;
1011
+ const ret = wasm.mesh_merge(ptr0, len0);
1012
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
1013
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
1014
+ return v2;
1015
+ }
1016
+
705
1017
  /**
706
1018
  * Intersect two meshes, returning intersection polyline points.
707
1019
  * Returns: [num_polylines, n1, x,y,z,..., n2, x,y,z,...]
@@ -760,6 +1072,95 @@ export function mesh_plane_intersect(vertex_count, buffer, nx, ny, nz, d) {
760
1072
  return v2;
761
1073
  }
762
1074
 
1075
+ /**
1076
+ * Shift closed boolean cutter curve and adjust height.
1077
+ * Returns [height, epsilon, pointCount, x,y,z,...]
1078
+ * @param {Float64Array} coords
1079
+ * @param {boolean} closed
1080
+ * @param {number} nx
1081
+ * @param {number} ny
1082
+ * @param {number} nz
1083
+ * @param {number} height
1084
+ * @returns {Float64Array}
1085
+ */
1086
+ export function mesh_prepare_boolean_cutter_curve(coords, closed, nx, ny, nz, height) {
1087
+ const ptr0 = passArrayF64ToWasm0(coords, wasm.__wbindgen_malloc);
1088
+ const len0 = WASM_VECTOR_LEN;
1089
+ const ret = wasm.mesh_prepare_boolean_cutter_curve(ptr0, len0, closed, nx, ny, nz, height);
1090
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
1091
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
1092
+ return v2;
1093
+ }
1094
+
1095
+ /**
1096
+ * Raycast against mesh and return closest hit.
1097
+ * Output: [] when no hit, otherwise [pointX,pointY,pointZ, normalX,normalY,normalZ, faceIndex, distance]
1098
+ * @param {number} vertex_count
1099
+ * @param {Float64Array} buffer
1100
+ * @param {number} ox
1101
+ * @param {number} oy
1102
+ * @param {number} oz
1103
+ * @param {number} dx
1104
+ * @param {number} dy
1105
+ * @param {number} dz
1106
+ * @param {number} max_distance
1107
+ * @returns {Float64Array}
1108
+ */
1109
+ export function mesh_raycast(vertex_count, buffer, ox, oy, oz, dx, dy, dz, max_distance) {
1110
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
1111
+ const len0 = WASM_VECTOR_LEN;
1112
+ const ret = wasm.mesh_raycast(vertex_count, ptr0, len0, ox, oy, oz, dx, dy, dz, max_distance);
1113
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
1114
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
1115
+ return v2;
1116
+ }
1117
+
1118
+ /**
1119
+ * Raycast against mesh and return all hits sorted by distance.
1120
+ * Output: [hitCount, (point, normal, faceIndex, distance)*]
1121
+ * @param {number} vertex_count
1122
+ * @param {Float64Array} buffer
1123
+ * @param {number} ox
1124
+ * @param {number} oy
1125
+ * @param {number} oz
1126
+ * @param {number} dx
1127
+ * @param {number} dy
1128
+ * @param {number} dz
1129
+ * @param {number} max_distance
1130
+ * @returns {Float64Array}
1131
+ */
1132
+ export function mesh_raycast_all(vertex_count, buffer, ox, oy, oz, dx, dy, dz, max_distance) {
1133
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
1134
+ const len0 = WASM_VECTOR_LEN;
1135
+ const ret = wasm.mesh_raycast_all(vertex_count, ptr0, len0, ox, oy, oz, dx, dy, dz, max_distance);
1136
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
1137
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
1138
+ return v2;
1139
+ }
1140
+
1141
+ /**
1142
+ * Raycast against many meshes packed as:
1143
+ * [meshCount, meshLen0, meshRaw0..., meshLen1, meshRaw1..., ...]
1144
+ * Output: [hitCount, meshIndex, pointX,pointY,pointZ, normalX,normalY,normalZ, faceIndex, distance, ...]
1145
+ * @param {Float64Array} mesh_data
1146
+ * @param {number} ox
1147
+ * @param {number} oy
1148
+ * @param {number} oz
1149
+ * @param {number} dx
1150
+ * @param {number} dy
1151
+ * @param {number} dz
1152
+ * @param {number} max_distance
1153
+ * @returns {Float64Array}
1154
+ */
1155
+ export function mesh_raycast_many(mesh_data, ox, oy, oz, dx, dy, dz, max_distance) {
1156
+ const ptr0 = passArrayF64ToWasm0(mesh_data, wasm.__wbindgen_malloc);
1157
+ const len0 = WASM_VECTOR_LEN;
1158
+ const ret = wasm.mesh_raycast_many(ptr0, len0, ox, oy, oz, dx, dy, dz, max_distance);
1159
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
1160
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
1161
+ return v2;
1162
+ }
1163
+
763
1164
  /**
764
1165
  * Rotate a mesh around an arbitrary axis and return new buffers
765
1166
  * Axis is defined by (ax, ay, az), angle in radians
Binary file
@@ -17,6 +17,7 @@ export const extrude_line: (a: number, b: number, c: number, d: number, e: numbe
17
17
  export const extrude_polyline: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
18
18
  export const fillet_polycurve: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
19
19
  export const line_length: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
20
+ export const line_offset: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => [number, number];
20
21
  export const line_point_at: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
21
22
  export const line_tangent: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
22
23
  export const loft_circles: (a: number, b: number, c: number, d: number) => [number, number];
@@ -29,7 +30,10 @@ export const mesh_boolean_operation: (a: number, b: number, c: number, d: number
29
30
  export const mesh_boolean_subtraction: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
30
31
  export const mesh_boolean_union: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
31
32
  export const mesh_boundary_polylines: (a: number, b: number, c: number) => [number, number];
33
+ export const mesh_build_coplanar_connected_face_groups: (a: number, b: number, c: number) => [number, number];
32
34
  export const mesh_chamfer_all_edges: (a: number, b: number, c: number, d: number, e: number) => [number, number];
35
+ export const mesh_compute_planar_curve_normal: (a: number, b: number, c: number) => [number, number];
36
+ export const mesh_contains_point: (a: number, b: number, c: number, d: number, e: number, f: number) => number;
33
37
  export const mesh_create_box: (a: number, b: number, c: number) => [number, number];
34
38
  export const mesh_create_cone: (a: number, b: number, c: number) => [number, number];
35
39
  export const mesh_create_cylinder: (a: number, b: number, c: number) => [number, number];
@@ -37,11 +41,29 @@ export const mesh_create_prism: (a: number, b: number, c: number) => [number, nu
37
41
  export const mesh_create_sphere: (a: number, b: number, c: number) => [number, number];
38
42
  export const mesh_evaluate: (a: number, b: number, c: number, d: number, e: number) => [number, number];
39
43
  export const mesh_export_obj: (a: number, b: number, c: number) => [number, number];
44
+ export const mesh_extrude_face: (a: number, b: number, c: number, d: number, e: number) => [number, number];
45
+ export const mesh_extrude_planar_curve: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
46
+ export const mesh_find_face_group_by_normal: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => [number, number];
47
+ export const mesh_find_face_group_by_triangle_index: (a: number, b: number, c: number, d: number) => [number, number];
48
+ export const mesh_get_bounds: (a: number, b: number, c: number) => [number, number];
49
+ export const mesh_get_coplanar_face_group_centroid: (a: number, b: number, c: number, d: number) => [number, number];
50
+ export const mesh_get_coplanar_face_indices: (a: number, b: number, c: number, d: number) => [number, number];
51
+ export const mesh_get_coplanar_face_region: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number) => [number, number];
52
+ export const mesh_get_edge_vertex_pairs: (a: number, b: number, c: number) => [number, number];
53
+ export const mesh_get_face_area: (a: number, b: number, c: number, d: number) => number;
54
+ export const mesh_get_face_centroid: (a: number, b: number, c: number, d: number) => [number, number];
55
+ export const mesh_get_face_normal: (a: number, b: number, c: number, d: number) => [number, number];
40
56
  export const mesh_get_stats: (a: number, b: number, c: number) => [number, number];
41
57
  export const mesh_import_obj: (a: number, b: number) => [number, number];
58
+ export const mesh_is_closed_volume: (a: number, b: number, c: number) => number;
59
+ export const mesh_merge: (a: number, b: number) => [number, number];
42
60
  export const mesh_mesh_intersect: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
43
61
  export const mesh_patch_from_points: (a: number, b: number) => [number, number];
44
62
  export const mesh_plane_intersect: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
63
+ export const mesh_prepare_boolean_cutter_curve: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
64
+ export const mesh_raycast: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => [number, number];
65
+ export const mesh_raycast_all: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => [number, number];
66
+ export const mesh_raycast_many: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => [number, number];
45
67
  export const mesh_rotate: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
46
68
  export const mesh_scale: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
47
69
  export const mesh_translate: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];