okgeometry-api 1.1.4 → 1.1.5

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "okgeometry-api",
3
- "version": "1.1.4",
3
+ "version": "1.1.5",
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",
package/src/Mesh.ts CHANGED
@@ -104,10 +104,13 @@ export interface MeshBooleanDebugProbe {
104
104
  resultHits: MeshDebugRayHit[];
105
105
  }
106
106
 
107
+ export type MeshBooleanDebugProbeId =
108
+ "posX" | "negX" | "posY" | "negY" | "posZ" | "negZ";
109
+
107
110
  export interface MeshBooleanDebugOptions {
108
111
  rayPaddingScale?: number;
109
112
  maxRayHits?: number;
110
- probes?: Array<"posX" | "negX" | "posY" | "negY" | "posZ" | "negZ">;
113
+ probes?: MeshBooleanDebugProbeId[];
111
114
  }
112
115
 
113
116
  export interface MeshBooleanDebugReport {
@@ -129,9 +132,14 @@ export class Mesh {
129
132
  private _buffer: Float64Array;
130
133
  private _vertexCount: number;
131
134
  private _trustedBooleanInput: boolean;
132
- private static readonly DEFAULT_BOOLEAN_DEBUG_PROBES: Array<
133
- "posX" | "negX" | "posY" | "negY" | "posZ" | "negZ"
134
- > = ["posX", "negX", "posY", "negY", "posZ", "negZ"];
135
+ private static readonly DEFAULT_BOOLEAN_DEBUG_PROBES: MeshBooleanDebugProbeId[] = [
136
+ "posX",
137
+ "negX",
138
+ "posY",
139
+ "negY",
140
+ "posZ",
141
+ "negZ",
142
+ ];
135
143
 
136
144
  private static readonly DEFAULT_BOOLEAN_LIMITS: MeshBooleanLimits = {
137
145
  maxInputFacesPerMesh: 120_000,
@@ -278,6 +286,28 @@ export class Mesh {
278
286
  }));
279
287
  }
280
288
 
289
+ private static uniqueDebugProbeIds(
290
+ probeIds: MeshBooleanDebugProbeId[],
291
+ ): MeshBooleanDebugProbeId[] {
292
+ return [...new Set(probeIds)];
293
+ }
294
+
295
+ private static buildInputBProbeOriginOffsets(
296
+ jitter: number,
297
+ ): Record<MeshBooleanDebugProbeId, Vec3> {
298
+ const major = jitter;
299
+ const minor = jitter * 0.61803398875;
300
+ const micro = jitter * 0.38196601125;
301
+ return {
302
+ posX: new Vec3(0, minor, -major),
303
+ negX: new Vec3(0, -minor, major),
304
+ posY: new Vec3(major, 0, micro),
305
+ negY: new Vec3(-major, 0, -micro),
306
+ posZ: new Vec3(major, -minor, 0),
307
+ negZ: new Vec3(-major, minor, 0),
308
+ };
309
+ }
310
+
281
311
  private static buildDirectionalDebugProbes(
282
312
  inputA: Mesh,
283
313
  inputB: Mesh,
@@ -286,12 +316,13 @@ export class Mesh {
286
316
  pad: number,
287
317
  maxDistance: number,
288
318
  maxHits: number,
289
- probeIds: Array<"posX" | "negX" | "posY" | "negY" | "posZ" | "negZ">,
319
+ probeIds: MeshBooleanDebugProbeId[],
290
320
  labelPrefix = "",
321
+ originOffsets?: Partial<Record<MeshBooleanDebugProbeId, Vec3>>,
291
322
  ): MeshBooleanDebugProbe[] {
292
323
  const prefixed = (id: string) => (labelPrefix ? `${labelPrefix}:${id}` : id);
293
324
  const probeSpecs: Record<
294
- "posX" | "negX" | "posY" | "negY" | "posZ" | "negZ",
325
+ MeshBooleanDebugProbeId,
295
326
  { origin: Point; direction: Vec3 }
296
327
  > = {
297
328
  posX: {
@@ -322,14 +353,22 @@ export class Mesh {
322
353
 
323
354
  return probeIds.map((id) => {
324
355
  const spec = probeSpecs[id];
356
+ const originOffset = originOffsets?.[id];
357
+ const origin = originOffset
358
+ ? new Point(
359
+ spec.origin.x + originOffset.x,
360
+ spec.origin.y + originOffset.y,
361
+ spec.origin.z + originOffset.z,
362
+ )
363
+ : spec.origin;
325
364
  return {
326
365
  label: prefixed(id),
327
- origin: spec.origin,
366
+ origin,
328
367
  direction: spec.direction,
329
368
  maxDistance,
330
- inputAHits: Mesh.collectDebugHits(inputA, spec.origin, spec.direction, maxDistance, maxHits),
331
- inputBHits: Mesh.collectDebugHits(inputB, spec.origin, spec.direction, maxDistance, maxHits),
332
- resultHits: Mesh.collectDebugHits(result, spec.origin, spec.direction, maxDistance, maxHits),
369
+ inputAHits: Mesh.collectDebugHits(inputA, origin, spec.direction, maxDistance, maxHits),
370
+ inputBHits: Mesh.collectDebugHits(inputB, origin, spec.direction, maxDistance, maxHits),
371
+ resultHits: Mesh.collectDebugHits(result, origin, spec.direction, maxDistance, maxHits),
333
372
  };
334
373
  });
335
374
  }
@@ -367,9 +406,13 @@ export class Mesh {
367
406
  : 0.25;
368
407
  const pad = Math.max(1e-3, diag * padScale);
369
408
  const maxHits = Mesh.clampDebugHitCount(options?.maxRayHits);
370
- const probeIds = options?.probes?.length
371
- ? options.probes
372
- : Mesh.DEFAULT_BOOLEAN_DEBUG_PROBES;
409
+ const sceneProbeIds = Mesh.uniqueDebugProbeIds(
410
+ options?.probes?.length
411
+ ? options.probes
412
+ : Mesh.DEFAULT_BOOLEAN_DEBUG_PROBES,
413
+ );
414
+ const inputBProbeIds = Mesh.uniqueDebugProbeIds(sceneProbeIds.concat(["posZ", "negZ"]));
415
+ const inputBJitter = Math.max(1e-6, Math.min(pad * 0.1, boundsB.diagonal * 0.01));
373
416
  const maxDistance = diag + pad * 2;
374
417
  const sceneCenterProbes = Mesh.buildDirectionalDebugProbes(
375
418
  inputA,
@@ -379,7 +422,7 @@ export class Mesh {
379
422
  pad,
380
423
  maxDistance,
381
424
  maxHits,
382
- probeIds,
425
+ sceneProbeIds,
383
426
  );
384
427
  const inputBCenterProbes = Mesh.buildDirectionalDebugProbes(
385
428
  inputA,
@@ -389,8 +432,9 @@ export class Mesh {
389
432
  pad,
390
433
  maxDistance,
391
434
  maxHits,
392
- probeIds,
435
+ inputBProbeIds,
393
436
  "inputB",
437
+ Mesh.buildInputBProbeOriginOffsets(inputBJitter),
394
438
  );
395
439
  return sceneCenterProbes.concat(inputBCenterProbes);
396
440
  }
package/src/index.ts CHANGED
@@ -36,6 +36,7 @@ export { NurbsSurface } from "./NurbsSurface.js";
36
36
  export { Mesh, MeshBooleanExecutionError } from "./Mesh.js";
37
37
  export type {
38
38
  MeshBooleanOperation,
39
+ MeshBooleanDebugProbeId,
39
40
  MeshBooleanDebugOptions,
40
41
  MeshBooleanDebugProbe,
41
42
  MeshBooleanDebugReport,