okgeometry-api 1.19.0 → 1.21.0

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.
@@ -616,6 +616,13 @@ export function mesh_boolean_union(vertex_count_a: number, buffer_a: Float64Arra
616
616
  */
617
617
  export function mesh_boolean_union_all(packed: Float64Array, flags: string): Float64Array;
618
618
 
619
+ /**
620
+ * Flat 3D endpoints of every open boundary edge: `[x0,y0,z0, x1,y1,z1, ...]`,
621
+ * six values per segment. Empty when the mesh is closed. Drives the red
622
+ * "open edge" viewport highlight.
623
+ */
624
+ export function mesh_boundary_edge_segments(vertex_count: number, buffer: Float64Array): Float64Array;
625
+
619
626
  /**
620
627
  * Extract boundary (perimeter) edges from a mesh as polylines.
621
628
  * Returns polyline buffer: [num_polylines, n1, x,y,z,..., n2, x,y,z,...]
@@ -857,6 +864,16 @@ export function mesh_import_stl(data: Uint8Array, weld_tolerance: number): Float
857
864
  */
858
865
  export function mesh_is_closed_volume(vertex_count: number, buffer: Float64Array): boolean;
859
866
 
867
+ /**
868
+ * Layered "make watertight": first geometry-preserving repair; if that already
869
+ * closes the mesh, return it. Otherwise fall back to voxel remeshing.
870
+ *
871
+ * Output: `[ before(13), after(13), method, effectiveResolution, vertexCount,
872
+ * ...positions, ...indices ]` where `method` is 0 (repair) or 1 (remesh) and
873
+ * `after` describes the returned mesh.
874
+ */
875
+ export function mesh_make_watertight(vertex_count: number, buffer: Float64Array, resolution: number, iso: number): Float64Array;
876
+
860
877
  /**
861
878
  * Debug helper: run only the isolated direct-port `MeshGL -> Impl -> MeshGL`
862
879
  * normalization owner and return a JSON dump for local port validation.
@@ -923,6 +940,15 @@ export function mesh_polyline_intersection_points(vertex_count: number, buffer:
923
940
  */
924
941
  export function mesh_prepare_boolean_cutter_curve(coords: Float64Array, closed: boolean, nx: number, ny: number, nz: number, height: number): Float64Array;
925
942
 
943
+ /**
944
+ * Host-aware boolean cutter preparation: like
945
+ * `mesh_prepare_boolean_cutter_curve`, but the bias is raised past the
946
+ * measured host-surface deviation under the cutter footprint (sculpted /
947
+ * non-planar faces). The host arrives as a standard triangulated buffer.
948
+ * Returns [height, epsilon, pointCount, x,y,z,...]
949
+ */
950
+ export function mesh_prepare_hosted_boolean_cutter(host_vertex_count: number, host_buffer: Float64Array, coords: Float64Array, closed: boolean, nx: number, ny: number, nz: number, height: number): Float64Array;
951
+
926
952
  /**
927
953
  * Raycast against mesh and return closest hit.
928
954
  * Output: [] when no hit, otherwise [pointX,pointY,pointZ, normalX,normalY,normalZ, faceIndex, distance]
@@ -942,6 +968,25 @@ export function mesh_raycast_all(vertex_count: number, buffer: Float64Array, ox:
942
968
  */
943
969
  export function mesh_raycast_many(mesh_data: Float64Array, ox: number, oy: number, oz: number, dx: number, dy: number, dz: number, max_distance: number): Float64Array;
944
970
 
971
+ /**
972
+ * Geometry-preserving repair: weld, drop degenerate/duplicate triangles,
973
+ * remove orphan vertices, fix winding, and fill holes.
974
+ *
975
+ * `flags` bitmask: 1=weld, 2=removeDegenerate, 4=removeDuplicate,
976
+ * 8=fillHoles, 16=fixWinding, 32=removeUnreferenced. `weld_tolerance <= 0`
977
+ * = auto; `max_hole_edges <= 0` = fill every hole.
978
+ *
979
+ * Output: `[ before(13), after(13), weldedVertices, removedTriangles,
980
+ * filledHoles, vertexCount, ...positions, ...indices ]` — the trailing mesh
981
+ * buffer is a standard `[vertexCount, positions, indices]` block.
982
+ */
983
+ export function mesh_repair(vertex_count: number, buffer: Float64Array, flags: number, weld_tolerance: number, max_hole_edges: number): Float64Array;
984
+
985
+ /**
986
+ * Full mesh health report (see [`push_repair_diag`] for the 13-value layout).
987
+ */
988
+ export function mesh_repair_diagnostics(vertex_count: number, buffer: Float64Array): Float64Array;
989
+
945
990
  /**
946
991
  * Rotate a mesh around an arbitrary axis and return new buffers
947
992
  * Axis is defined by (ax, ay, az), angle in radians
@@ -1038,6 +1083,16 @@ export function mesh_topology_metrics_raw(vertex_count: number, buffer: Float64A
1038
1083
  */
1039
1084
  export function mesh_translate(vertex_count: number, buffer: Float64Array, dx: number, dy: number, dz: number): Float64Array;
1040
1085
 
1086
+ /**
1087
+ * Rebuild a mesh as a guaranteed-watertight solid via generalized-winding-
1088
+ * number voxel remeshing. `resolution` = cells along the longest axis
1089
+ * (`0` = 64 default, auto-capped by a work budget). `iso` = winding threshold
1090
+ * (`<=0` or `>=1` → 0.5).
1091
+ *
1092
+ * Output: a standard `[vertexCount, ...positions, ...indices]` mesh buffer.
1093
+ */
1094
+ export function mesh_voxel_remesh(vertex_count: number, buffer: Float64Array, resolution: number, iso: number): Float64Array;
1095
+
1041
1096
  /**
1042
1097
  * Intersect two NURBS curves.
1043
1098
  * Returns: [num_points, x,y,z, ...]
@@ -1328,6 +1383,16 @@ export function sculpt_session_create(vertex_count: number, buffer: Float64Array
1328
1383
  */
1329
1384
  export function sculpt_session_dab(id: number, cx: number, cy: number, cz: number, vx: number, vy: number, vz: number, dragx: number, dragy: number, dragz: number, pressure: number): Float32Array;
1330
1385
 
1386
+ /**
1387
+ * Locally REDUCE point density in the given triangle group (constrained
1388
+ * edge collapse of interior vertices; the group boundary is preserved)
1389
+ * until the group has at most `target_points` unique vertices or no safe
1390
+ * collapse remains. Returns 1 when at least one collapse happened, 0
1391
+ * otherwise. Clears session undo history; callers must refetch
1392
+ * `sculpt_session_render_data` afterwards.
1393
+ */
1394
+ export function sculpt_session_decimate_faces(id: number, triangles: Uint32Array, target_points: number): number;
1395
+
1331
1396
  /**
1332
1397
  * Finish the active stroke (pushes one undo entry).
1333
1398
  */
@@ -1539,6 +1604,7 @@ export interface InitOutput {
1539
1604
  readonly mesh_boolean_subtraction: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
1540
1605
  readonly mesh_boolean_union: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
1541
1606
  readonly mesh_boolean_union_all: (a: number, b: number, c: number, d: number) => [number, number];
1607
+ readonly mesh_boundary_edge_segments: (a: number, b: number, c: number) => [number, number];
1542
1608
  readonly mesh_boundary_polylines: (a: number, b: number, c: number) => [number, number];
1543
1609
  readonly mesh_build_coplanar_connected_face_groups: (a: number, b: number, c: number) => [number, number];
1544
1610
  readonly mesh_build_render_buffers: (a: number, b: number, c: number, d: number) => [number, number];
@@ -1574,6 +1640,7 @@ export interface InitOutput {
1574
1640
  readonly mesh_import_obj: (a: number, b: number) => [number, number];
1575
1641
  readonly mesh_import_stl: (a: number, b: number, c: number) => [number, number];
1576
1642
  readonly mesh_is_closed_volume: (a: number, b: number, c: number) => number;
1643
+ readonly mesh_make_watertight: (a: number, b: number, c: number, d: number, e: number) => [number, number];
1577
1644
  readonly mesh_manifold_port_import_roundtrip_debug: (a: number, b: number, c: number, d: number) => [number, number];
1578
1645
  readonly mesh_manifold_port_import_stage_hashes_debug: (a: number, b: number, c: number, d: number) => [number, number];
1579
1646
  readonly mesh_manifold_port_triangulate_projected_polygon_debug: (a: number, b: number, c: number, d: number) => [number, number];
@@ -1584,9 +1651,12 @@ export interface InitOutput {
1584
1651
  readonly mesh_plane_intersect: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
1585
1652
  readonly mesh_polyline_intersection_points: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
1586
1653
  readonly mesh_prepare_boolean_cutter_curve: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
1654
+ readonly mesh_prepare_hosted_boolean_cutter: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => [number, number];
1587
1655
  readonly mesh_raycast: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => [number, number];
1588
1656
  readonly 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];
1589
1657
  readonly mesh_raycast_many: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => [number, number];
1658
+ readonly mesh_repair: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
1659
+ readonly mesh_repair_diagnostics: (a: number, b: number, c: number) => [number, number];
1590
1660
  readonly mesh_rotate: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number];
1591
1661
  readonly mesh_scale: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
1592
1662
  readonly mesh_sheet_union: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => [number, number];
@@ -1600,6 +1670,7 @@ export interface InitOutput {
1600
1670
  readonly mesh_topology_metrics: (a: number, b: number, c: number) => [number, number];
1601
1671
  readonly mesh_topology_metrics_raw: (a: number, b: number, c: number) => [number, number];
1602
1672
  readonly mesh_translate: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
1673
+ readonly mesh_voxel_remesh: (a: number, b: number, c: number, d: number, e: number) => [number, number];
1603
1674
  readonly nurbs_curve_curve_intersect: (a: number, b: number, c: number, d: number) => [number, number];
1604
1675
  readonly nurbs_curve_curve_intersect_params: (a: number, b: number, c: number, d: number) => [number, number];
1605
1676
  readonly nurbs_curve_plane_intersect: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
@@ -1637,6 +1708,7 @@ export interface InitOutput {
1637
1708
  readonly sculpt_session_begin_stroke: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => number;
1638
1709
  readonly sculpt_session_create: (a: number, b: number, c: number) => number;
1639
1710
  readonly sculpt_session_dab: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number) => [number, number];
1711
+ readonly sculpt_session_decimate_faces: (a: number, b: number, c: number, d: number) => number;
1640
1712
  readonly sculpt_session_end_stroke: (a: number) => void;
1641
1713
  readonly sculpt_session_face_group: (a: number, b: number, c: number) => [number, number];
1642
1714
  readonly sculpt_session_info: (a: number) => [number, number];
@@ -1977,6 +1977,23 @@ export function mesh_boolean_union_all(packed, flags) {
1977
1977
  return v3;
1978
1978
  }
1979
1979
 
1980
+ /**
1981
+ * Flat 3D endpoints of every open boundary edge: `[x0,y0,z0, x1,y1,z1, ...]`,
1982
+ * six values per segment. Empty when the mesh is closed. Drives the red
1983
+ * "open edge" viewport highlight.
1984
+ * @param {number} vertex_count
1985
+ * @param {Float64Array} buffer
1986
+ * @returns {Float64Array}
1987
+ */
1988
+ export function mesh_boundary_edge_segments(vertex_count, buffer) {
1989
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
1990
+ const len0 = WASM_VECTOR_LEN;
1991
+ const ret = wasm.mesh_boundary_edge_segments(vertex_count, ptr0, len0);
1992
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
1993
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
1994
+ return v2;
1995
+ }
1996
+
1980
1997
  /**
1981
1998
  * Extract boundary (perimeter) edges from a mesh as polylines.
1982
1999
  * Returns polyline buffer: [num_polylines, n1, x,y,z,..., n2, x,y,z,...]
@@ -2622,6 +2639,28 @@ export function mesh_is_closed_volume(vertex_count, buffer) {
2622
2639
  return ret !== 0;
2623
2640
  }
2624
2641
 
2642
+ /**
2643
+ * Layered "make watertight": first geometry-preserving repair; if that already
2644
+ * closes the mesh, return it. Otherwise fall back to voxel remeshing.
2645
+ *
2646
+ * Output: `[ before(13), after(13), method, effectiveResolution, vertexCount,
2647
+ * ...positions, ...indices ]` where `method` is 0 (repair) or 1 (remesh) and
2648
+ * `after` describes the returned mesh.
2649
+ * @param {number} vertex_count
2650
+ * @param {Float64Array} buffer
2651
+ * @param {number} resolution
2652
+ * @param {number} iso
2653
+ * @returns {Float64Array}
2654
+ */
2655
+ export function mesh_make_watertight(vertex_count, buffer, resolution, iso) {
2656
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
2657
+ const len0 = WASM_VECTOR_LEN;
2658
+ const ret = wasm.mesh_make_watertight(vertex_count, ptr0, len0, resolution, iso);
2659
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
2660
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
2661
+ return v2;
2662
+ }
2663
+
2625
2664
  /**
2626
2665
  * Debug helper: run only the isolated direct-port `MeshGL -> Impl -> MeshGL`
2627
2666
  * normalization owner and return a JSON dump for local port validation.
@@ -2830,6 +2869,33 @@ export function mesh_prepare_boolean_cutter_curve(coords, closed, nx, ny, nz, he
2830
2869
  return v2;
2831
2870
  }
2832
2871
 
2872
+ /**
2873
+ * Host-aware boolean cutter preparation: like
2874
+ * `mesh_prepare_boolean_cutter_curve`, but the bias is raised past the
2875
+ * measured host-surface deviation under the cutter footprint (sculpted /
2876
+ * non-planar faces). The host arrives as a standard triangulated buffer.
2877
+ * Returns [height, epsilon, pointCount, x,y,z,...]
2878
+ * @param {number} host_vertex_count
2879
+ * @param {Float64Array} host_buffer
2880
+ * @param {Float64Array} coords
2881
+ * @param {boolean} closed
2882
+ * @param {number} nx
2883
+ * @param {number} ny
2884
+ * @param {number} nz
2885
+ * @param {number} height
2886
+ * @returns {Float64Array}
2887
+ */
2888
+ export function mesh_prepare_hosted_boolean_cutter(host_vertex_count, host_buffer, coords, closed, nx, ny, nz, height) {
2889
+ const ptr0 = passArrayF64ToWasm0(host_buffer, wasm.__wbindgen_malloc);
2890
+ const len0 = WASM_VECTOR_LEN;
2891
+ const ptr1 = passArrayF64ToWasm0(coords, wasm.__wbindgen_malloc);
2892
+ const len1 = WASM_VECTOR_LEN;
2893
+ const ret = wasm.mesh_prepare_hosted_boolean_cutter(host_vertex_count, ptr0, len0, ptr1, len1, closed, nx, ny, nz, height);
2894
+ var v3 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
2895
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
2896
+ return v3;
2897
+ }
2898
+
2833
2899
  /**
2834
2900
  * Raycast against mesh and return closest hit.
2835
2901
  * Output: [] when no hit, otherwise [pointX,pointY,pointZ, normalX,normalY,normalZ, faceIndex, distance]
@@ -2899,6 +2965,48 @@ export function mesh_raycast_many(mesh_data, ox, oy, oz, dx, dy, dz, max_distanc
2899
2965
  return v2;
2900
2966
  }
2901
2967
 
2968
+ /**
2969
+ * Geometry-preserving repair: weld, drop degenerate/duplicate triangles,
2970
+ * remove orphan vertices, fix winding, and fill holes.
2971
+ *
2972
+ * `flags` bitmask: 1=weld, 2=removeDegenerate, 4=removeDuplicate,
2973
+ * 8=fillHoles, 16=fixWinding, 32=removeUnreferenced. `weld_tolerance <= 0`
2974
+ * = auto; `max_hole_edges <= 0` = fill every hole.
2975
+ *
2976
+ * Output: `[ before(13), after(13), weldedVertices, removedTriangles,
2977
+ * filledHoles, vertexCount, ...positions, ...indices ]` — the trailing mesh
2978
+ * buffer is a standard `[vertexCount, positions, indices]` block.
2979
+ * @param {number} vertex_count
2980
+ * @param {Float64Array} buffer
2981
+ * @param {number} flags
2982
+ * @param {number} weld_tolerance
2983
+ * @param {number} max_hole_edges
2984
+ * @returns {Float64Array}
2985
+ */
2986
+ export function mesh_repair(vertex_count, buffer, flags, weld_tolerance, max_hole_edges) {
2987
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
2988
+ const len0 = WASM_VECTOR_LEN;
2989
+ const ret = wasm.mesh_repair(vertex_count, ptr0, len0, flags, weld_tolerance, max_hole_edges);
2990
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
2991
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
2992
+ return v2;
2993
+ }
2994
+
2995
+ /**
2996
+ * Full mesh health report (see [`push_repair_diag`] for the 13-value layout).
2997
+ * @param {number} vertex_count
2998
+ * @param {Float64Array} buffer
2999
+ * @returns {Float64Array}
3000
+ */
3001
+ export function mesh_repair_diagnostics(vertex_count, buffer) {
3002
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
3003
+ const len0 = WASM_VECTOR_LEN;
3004
+ const ret = wasm.mesh_repair_diagnostics(vertex_count, ptr0, len0);
3005
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
3006
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
3007
+ return v2;
3008
+ }
3009
+
2902
3010
  /**
2903
3011
  * Rotate a mesh around an arbitrary axis and return new buffers
2904
3012
  * Axis is defined by (ax, ay, az), angle in radians
@@ -3194,6 +3302,28 @@ export function mesh_translate(vertex_count, buffer, dx, dy, dz) {
3194
3302
  return v2;
3195
3303
  }
3196
3304
 
3305
+ /**
3306
+ * Rebuild a mesh as a guaranteed-watertight solid via generalized-winding-
3307
+ * number voxel remeshing. `resolution` = cells along the longest axis
3308
+ * (`0` = 64 default, auto-capped by a work budget). `iso` = winding threshold
3309
+ * (`<=0` or `>=1` → 0.5).
3310
+ *
3311
+ * Output: a standard `[vertexCount, ...positions, ...indices]` mesh buffer.
3312
+ * @param {number} vertex_count
3313
+ * @param {Float64Array} buffer
3314
+ * @param {number} resolution
3315
+ * @param {number} iso
3316
+ * @returns {Float64Array}
3317
+ */
3318
+ export function mesh_voxel_remesh(vertex_count, buffer, resolution, iso) {
3319
+ const ptr0 = passArrayF64ToWasm0(buffer, wasm.__wbindgen_malloc);
3320
+ const len0 = WASM_VECTOR_LEN;
3321
+ const ret = wasm.mesh_voxel_remesh(vertex_count, ptr0, len0, resolution, iso);
3322
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
3323
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
3324
+ return v2;
3325
+ }
3326
+
3197
3327
  /**
3198
3328
  * Intersect two NURBS curves.
3199
3329
  * Returns: [num_points, x,y,z, ...]
@@ -3943,6 +4073,25 @@ export function sculpt_session_dab(id, cx, cy, cz, vx, vy, vz, dragx, dragy, dra
3943
4073
  return v1;
3944
4074
  }
3945
4075
 
4076
+ /**
4077
+ * Locally REDUCE point density in the given triangle group (constrained
4078
+ * edge collapse of interior vertices; the group boundary is preserved)
4079
+ * until the group has at most `target_points` unique vertices or no safe
4080
+ * collapse remains. Returns 1 when at least one collapse happened, 0
4081
+ * otherwise. Clears session undo history; callers must refetch
4082
+ * `sculpt_session_render_data` afterwards.
4083
+ * @param {number} id
4084
+ * @param {Uint32Array} triangles
4085
+ * @param {number} target_points
4086
+ * @returns {number}
4087
+ */
4088
+ export function sculpt_session_decimate_faces(id, triangles, target_points) {
4089
+ const ptr0 = passArray32ToWasm0(triangles, wasm.__wbindgen_malloc);
4090
+ const len0 = WASM_VECTOR_LEN;
4091
+ const ret = wasm.sculpt_session_decimate_faces(id, ptr0, len0, target_points);
4092
+ return ret >>> 0;
4093
+ }
4094
+
3946
4095
  /**
3947
4096
  * Finish the active stroke (pushes one undo entry).
3948
4097
  * @param {number} id