@ifc-lite/drawing-2d 1.21.2 → 2.1.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.
Files changed (73) hide show
  1. package/dist/color-raster.d.ts +95 -0
  2. package/dist/color-raster.d.ts.map +1 -0
  3. package/dist/color-raster.js +225 -0
  4. package/dist/color-raster.js.map +1 -0
  5. package/dist/drawing-generator.d.ts +17 -0
  6. package/dist/drawing-generator.d.ts.map +1 -1
  7. package/dist/drawing-generator.js +33 -7
  8. package/dist/drawing-generator.js.map +1 -1
  9. package/dist/edge-extractor.d.ts +17 -0
  10. package/dist/edge-extractor.d.ts.map +1 -1
  11. package/dist/edge-extractor.js +104 -1
  12. package/dist/edge-extractor.js.map +1 -1
  13. package/dist/half-space-clip.d.ts +77 -0
  14. package/dist/half-space-clip.d.ts.map +1 -0
  15. package/dist/half-space-clip.js +257 -0
  16. package/dist/half-space-clip.js.map +1 -0
  17. package/dist/hidden-line-raster.d.ts +50 -0
  18. package/dist/hidden-line-raster.d.ts.map +1 -0
  19. package/dist/hidden-line-raster.js +103 -0
  20. package/dist/hidden-line-raster.js.map +1 -0
  21. package/dist/hidden-line.d.ts +34 -21
  22. package/dist/hidden-line.d.ts.map +1 -1
  23. package/dist/hidden-line.js +107 -214
  24. package/dist/hidden-line.js.map +1 -1
  25. package/dist/index.d.ts +11 -3
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +25 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/line-merger.d.ts.map +1 -1
  30. package/dist/line-merger.js +88 -44
  31. package/dist/line-merger.js.map +1 -1
  32. package/dist/pdf-scale.d.ts +17 -0
  33. package/dist/pdf-scale.d.ts.map +1 -1
  34. package/dist/pdf-scale.js +38 -0
  35. package/dist/pdf-scale.js.map +1 -1
  36. package/dist/polygon-builder.d.ts +31 -0
  37. package/dist/polygon-builder.d.ts.map +1 -1
  38. package/dist/polygon-builder.js +60 -3
  39. package/dist/polygon-builder.js.map +1 -1
  40. package/dist/profile-projector.js +17 -9
  41. package/dist/profile-projector.js.map +1 -1
  42. package/dist/projection-bands.d.ts +13 -6
  43. package/dist/projection-bands.d.ts.map +1 -1
  44. package/dist/projection-bands.js +15 -3
  45. package/dist/projection-bands.js.map +1 -1
  46. package/dist/raster-core.d.ts +71 -0
  47. package/dist/raster-core.d.ts.map +1 -0
  48. package/dist/raster-core.js +89 -0
  49. package/dist/raster-core.js.map +1 -0
  50. package/dist/section-cutter.d.ts +8 -0
  51. package/dist/section-cutter.d.ts.map +1 -1
  52. package/dist/section-cutter.js +59 -11
  53. package/dist/section-cutter.js.map +1 -1
  54. package/dist/sheet/index.d.ts +2 -0
  55. package/dist/sheet/index.d.ts.map +1 -1
  56. package/dist/sheet/index.js +1 -0
  57. package/dist/sheet/index.js.map +1 -1
  58. package/dist/sheet/scale-stamp.d.ts +130 -0
  59. package/dist/sheet/scale-stamp.d.ts.map +1 -0
  60. package/dist/sheet/scale-stamp.js +277 -0
  61. package/dist/sheet/scale-stamp.js.map +1 -0
  62. package/dist/types.d.ts +26 -1
  63. package/dist/types.d.ts.map +1 -1
  64. package/dist/types.js.map +1 -1
  65. package/dist/view-plane.d.ts +99 -0
  66. package/dist/view-plane.d.ts.map +1 -0
  67. package/dist/view-plane.js +183 -0
  68. package/dist/view-plane.js.map +1 -0
  69. package/dist/world-line-seeds.d.ts +41 -0
  70. package/dist/world-line-seeds.d.ts.map +1 -0
  71. package/dist/world-line-seeds.js +43 -0
  72. package/dist/world-line-seeds.js.map +1 -0
  73. package/package.json +2 -2
@@ -37,6 +37,29 @@ import { classifySegmentBand, bandVisibility, projectPointForPlane, signedDepth,
37
37
  * without excluding any genuinely tilted face (e.g. a pitched roof).
38
38
  */
39
39
  const SILHOUETTE_EPSILON = 1e-4;
40
+ /**
41
+ * Scale-relative floor for trusting the signed-volume winding test (issue
42
+ * #2682).
43
+ *
44
+ * The silhouette test is NOT symmetric under a global winding flip: it keeps
45
+ * an edge whose faces differ in "is front-facing", and the deadband lumps
46
+ * perpendicular faces in with back-facing ones. For an outward-wound box in
47
+ * plan that yields the TOP rim (the face pointing at the viewer against the
48
+ * four perpendicular sides); flip the winding and the same test yields the
49
+ * BOTTOM rim instead — the far side of the solid. Both project to the same
50
+ * square, so the defect hides until the far rim falls outside the projection
51
+ * band, at which point the line work is simply GONE (a blank sheet, produced
52
+ * successfully). See `windingSign`.
53
+ *
54
+ * The fix orients the mesh by its signed volume before classifying, which is
55
+ * only meaningful when the volume is decisively non-zero. An open shell or a
56
+ * flat sheet integrates to ~0 and an inconsistently wound mesh to something
57
+ * arbitrary, so the sign is only trusted when |V| clears this fraction of the
58
+ * mesh's bounding-box volume (diagonal³). A closed box sits around 0.19 of
59
+ * that; a 1 mm sheet spanning 4 m sits near 1e-4. 1e-6 is far below any real
60
+ * solid and far above f32 integration noise.
61
+ */
62
+ const WINDING_VOLUME_EPSILON = 1e-6;
40
63
  // ═══════════════════════════════════════════════════════════════════════════
41
64
  // EDGE EXTRACTOR CLASS
42
65
  // ═══════════════════════════════════════════════════════════════════════════
@@ -73,6 +96,20 @@ export class EdgeExtractor {
73
96
  this.registerEdge(edgeMap, i1, i2, t);
74
97
  this.registerEdge(edgeMap, i2, i0, t);
75
98
  }
99
+ // Orient the face normals OUTWARD before classification (issue #2682).
100
+ // ifc-lite's winding is explicitly unreliable (see `MeshData.indices`), and
101
+ // the silhouette test is winding-sensitive, so an inward-wound solid
102
+ // silhouettes its far side and can lose its line work entirely. Negating
103
+ // every normal is exactly what reversing every triangle does, so a mesh and
104
+ // its reversed twin now classify identically. Crease classification is
105
+ // unaffected: the dihedral angle between two normals is invariant under
106
+ // negating both.
107
+ if (this.windingSign(positions, indices) < 0) {
108
+ for (let f = 0; f < faceNormals.length; f++) {
109
+ const n = faceNormals[f];
110
+ faceNormals[f] = vec3(-n.x, -n.y, -n.z);
111
+ }
112
+ }
76
113
  // Second pass: classify edges
77
114
  const edges = [];
78
115
  for (const [, edgeInfo] of edgeMap) {
@@ -180,6 +217,10 @@ export class EdgeExtractor {
180
217
  if (Math.abs(start.x - end.x) < EPSILON && Math.abs(start.y - end.y) < EPSILON) {
181
218
  continue;
182
219
  }
220
+ // Flip-adjusted depths at the clipped endpoints: signedDepth is affine
221
+ // along the segment, so lerp d0/d1 by the clip parameters.
222
+ const dA = d0 + (d1 - d0) * clip[0];
223
+ const dB = d0 + (d1 - d0) * clip[1];
183
224
  lines.push({
184
225
  line: { start, end },
185
226
  category: 'projection',
@@ -187,7 +228,11 @@ export class EdgeExtractor {
187
228
  entityId: edge.entityId,
188
229
  ifcType: edge.ifcType,
189
230
  modelIndex: edge.modelIndex,
190
- depth: 0,
231
+ // Per-endpoint VIEW depth (issue #2639, see projection-bands.ts):
232
+ // negated flip-adjusted depth, clamped at the cut plane. The
233
+ // classifier lerps depth..depthEnd along the line.
234
+ depth: Math.max(0, -dA),
235
+ depthEnd: Math.max(0, -dB),
191
236
  });
192
237
  }
193
238
  return lines;
@@ -201,6 +246,64 @@ export class EdgeExtractor {
201
246
  ? vec3(positions[base] + origin[0], positions[base + 1] + origin[1], positions[base + 2] + origin[2])
202
247
  : vec3(positions[base], positions[base + 1], positions[base + 2]);
203
248
  }
249
+ /**
250
+ * `-1` when the mesh is a closed solid wound INWARD, `+1` otherwise
251
+ * (issue #2682).
252
+ *
253
+ * Six times the enclosed signed volume is `Σ v0 · (v1 × v2)`, positive for
254
+ * outward winding. It is translation-invariant for a closed mesh, so the sum
255
+ * is taken relative to the first vertex to keep the terms small and the
256
+ * cancellation honest on RTC-shifted coordinates.
257
+ *
258
+ * `+1` is the deliberate answer whenever the test is inconclusive — an open
259
+ * shell, a flat sheet, or an inconsistently wound mesh integrates to ~0 (or
260
+ * to an arbitrary number) and gets the pre-existing behaviour rather than a
261
+ * coin-flip reorientation. Positions are read directly rather than through
262
+ * `getVertex` because the per-element `origin` is a pure translation and
263
+ * therefore cannot change the result.
264
+ */
265
+ windingSign(positions, indices) {
266
+ const triangleCount = Math.floor(indices.length / 3);
267
+ if (triangleCount === 0 || positions.length < 3)
268
+ return 1;
269
+ const rx = positions[indices[0] * 3];
270
+ const ry = positions[indices[0] * 3 + 1];
271
+ const rz = positions[indices[0] * 3 + 2];
272
+ let volume6 = 0;
273
+ let minX = Infinity, minY = Infinity, minZ = Infinity;
274
+ let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
275
+ const track = (x, y, z) => {
276
+ if (x < minX)
277
+ minX = x;
278
+ if (x > maxX)
279
+ maxX = x;
280
+ if (y < minY)
281
+ minY = y;
282
+ if (y > maxY)
283
+ maxY = y;
284
+ if (z < minZ)
285
+ minZ = z;
286
+ if (z > maxZ)
287
+ maxZ = z;
288
+ };
289
+ for (let t = 0; t < triangleCount; t++) {
290
+ const b0 = indices[t * 3] * 3;
291
+ const b1 = indices[t * 3 + 1] * 3;
292
+ const b2 = indices[t * 3 + 2] * 3;
293
+ const ax = positions[b0] - rx, ay = positions[b0 + 1] - ry, az = positions[b0 + 2] - rz;
294
+ const bx = positions[b1] - rx, by = positions[b1 + 1] - ry, bz = positions[b1 + 2] - rz;
295
+ const cx = positions[b2] - rx, cy = positions[b2 + 1] - ry, cz = positions[b2 + 2] - rz;
296
+ // a · (b × c)
297
+ volume6 += ax * (by * cz - bz * cy) + ay * (bz * cx - bx * cz) + az * (bx * cy - by * cx);
298
+ track(ax, ay, az);
299
+ track(bx, by, bz);
300
+ track(cx, cy, cz);
301
+ }
302
+ const dx = maxX - minX, dy = maxY - minY, dz = maxZ - minZ;
303
+ const diagonal = Math.sqrt(dx * dx + dy * dy + dz * dz);
304
+ const floor = WINDING_VOLUME_EPSILON * diagonal * diagonal * diagonal;
305
+ return volume6 / 6 < -floor ? -1 : 1;
306
+ }
204
307
  computeFaceNormal(v0, v1, v2) {
205
308
  const edge1 = vec3Sub(v1, v0);
206
309
  const edge2 = vec3Sub(v2, v0);
@@ -1 +1 @@
1
- {"version":3,"file":"edge-extractor.js","sourceRoot":"","sources":["../src/edge-extractor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edge-extractor.js","sourceRoot":"","sources":["../src/edge-extractor.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAa/D,OAAO,EACL,IAAI,EACJ,OAAO,EACP,SAAS,EACT,aAAa,EACb,OAAO,EACP,QAAQ,EACR,OAAO,GACR,MAAM,WAAW,CAAC;AAEnB;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;IACtE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9C,CAAC;IACD,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACzC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC;AACD,OAAO,EAEL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAiBpC,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,OAAO,aAAa;IACxB,wCAAwC;IAChC,WAAW,CAAS;IAE5B,YAAY,qBAA6B,EAAE;QACzC,IAAI,CAAC,WAAW,GAAG,CAAC,kBAAkB,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAc;QACzB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAE5E,mCAAmC;QACnC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC5C,MAAM,WAAW,GAAW,EAAE,CAAC;QAE/B,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAEzC,4DAA4D;QAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAE9B,qEAAqE;YACrE,gEAAgE;YAChE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YAEjD,sBAAsB;YACtB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACtD,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE7B,iBAAiB;YACjB,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,uEAAuE;QACvE,4EAA4E;QAC5E,qEAAqE;QACrE,yEAAyE;QACzE,4EAA4E;QAC5E,uEAAuE;QACvE,wEAAwE;QACxE,iBAAiB;QACjB,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBACzB,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,8BAA8B;QAC9B,MAAM,KAAK,GAAe,EAAE,CAAC;QAE7B,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC7D,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAE7D,IAAI,WAAW,GAAgB,IAAI,CAAC;YACpC,IAAI,WAAW,GAAgB,IAAI,CAAC;YACpC,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,IAAI,GAAqB,QAAQ,CAAC;YAEtC,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,yCAAyC;gBACzC,IAAI,GAAG,UAAU,CAAC;gBAClB,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,CAAC;iBAAM,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC5C,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEnD,yBAAyB;gBACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;gBACzE,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAE/B,gDAAgD;gBAChD,IAAI,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrC,IAAI,GAAG,QAAQ,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,gCAAgC;YAChC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE;oBACF,EAAE;oBACF,WAAW;oBACX,WAAW;oBACX,aAAa;oBACb,IAAI;oBACJ,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,OAAO,IAAI,SAAS;oBAC7B,UAAU,EAAE,UAAU,IAAI,CAAC;iBAC5B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,kBAAkB,CAAC,KAAiB,EAAE,aAAmB;QACvD,MAAM,cAAc,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;QAEpD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3B,wCAAwC;YACxC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,6CAA6C;YAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC3C,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAEvD,uEAAuE;YACvE,sEAAsE;YACtE,uEAAuE;YACvE,yEAAyE;YACzE,0DAA0D;YAC1D,sBAAsB;YACtB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC;YAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC;YAC1C,OAAO,MAAM,KAAK,MAAM,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACH,sBAAsB,CACpB,KAAiB,EACjB,KAAyB,EACzB,MAA4B;QAE5B,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,iFAAiF;QACjF,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;QAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACvC,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAEvC,wEAAwE;YACxE,kEAAkE;YAClE,kEAAkE;YAClE,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC1D,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAE9C,MAAM,UAAU,GAAG,cAAc,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5E,IAAI,UAAU,KAAK,IAAI;gBAAE,SAAS;YAElC,MAAM,KAAK,GAAG,oBAAoB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,GAAG,GAAG,oBAAoB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAE3C,oDAAoD;YACpD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC;gBAC/E,SAAS;YACX,CAAC;YAED,uEAAuE;YACvE,2DAA2D;YAC3D,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAEpC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;gBACpB,QAAQ,EAAE,YAAY;gBACtB,UAAU;gBACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,kEAAkE;gBAClE,6DAA6D;gBAC7D,mDAAmD;gBACnD,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvB,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAEtE,SAAS,CACf,SAAuB,EACvB,KAAa,EACb,MAAiC;QAEjC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;QACvB,OAAO,MAAM;YACX,CAAC,CAAC,IAAI,CACF,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAC3B,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAC/B,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAChC;YACH,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACK,WAAW,CAAC,SAAuB,EAAE,OAAoB;QAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrD,IAAI,aAAa,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;QAE1D,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC;QACtD,IAAI,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;QAEzD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAQ,EAAE;YACtD,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAElC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACxF,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACxF,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAExF,cAAc;YACd,OAAO,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAE1F,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAClB,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAClB,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;QAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,sBAAsB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QAEtE,OAAO,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAEO,iBAAiB,CAAC,EAAQ,EAAE,EAAQ,EAAE,EAAQ;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAEO,YAAY,CAClB,OAA8B,EAC9B,IAAY,EACZ,IAAY,EACZ,SAAiB;QAEjB,+CAA+C;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;QAElC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;gBACf,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,EAAE;aAChB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;CACF"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * CPU half-space clipping of render meshes, for exporting a sectioned 3D
3
+ * viewport to a to-scale vector PDF (issue #2042).
4
+ *
5
+ * The on-screen section plane is a GPU clip: the fragment shader discards
6
+ * pixels, and no geometry ever changes. An exported drawing has no fragment
7
+ * stage, so the same cut has to be applied to the triangles themselves —
8
+ * otherwise the PDF shows the whole model while the screen shows half of it.
9
+ *
10
+ * # Defect class this module guards against
11
+ * **The `MeshData.origin` double-fold** (and its mirror, the un-folded
12
+ * comparison). `positions` are stored in the element's LOCAL frame, with
13
+ * `world = origin + local`; `origin` exists purely so building-scale
14
+ * coordinates survive f32. A half-space test is defined in WORLD space, so a
15
+ * naive implementation either
16
+ *
17
+ * 1. tests LOCAL positions against a WORLD offset — clipping a wall 100 m
18
+ * from the model origin at completely the wrong place, or
19
+ * 2. bakes world coordinates back into `positions` and leaves `origin`
20
+ * set — folding the offset in twice and translating the element by
21
+ * `origin` again downstream.
22
+ *
23
+ * Both produce a drawing that looks like geometry and is in the wrong
24
+ * place. This module converts the plane ONCE into the mesh's local frame
25
+ * (`localOffset = offset − dot(origin, normal)`), leaves every emitted
26
+ * position local, and carries `origin` through untouched — so a mesh with an
27
+ * `origin` and a baked-positions twin of the same element clip to the same
28
+ * world result.
29
+ *
30
+ * The kept half is `dot(worldPoint, normal) <= offset` (the side the normal
31
+ * points AWAY from). `rimSegments` are the new edges created on the cut
32
+ * plane, returned in WORLD space so they can be projected straight into
33
+ * drawing lines (see `world-line-seeds.ts`).
34
+ */
35
+ import type { MeshData } from '@ifc-lite/geometry';
36
+ import type { Vec3 } from './types.js';
37
+ /** A world-space 3D segment created by the cut. */
38
+ export interface WorldSegment {
39
+ start: Vec3;
40
+ end: Vec3;
41
+ /** Source element, carried so the drawing can style/filter the rim. */
42
+ entityId: number;
43
+ ifcType: string;
44
+ modelIndex: number;
45
+ }
46
+ export interface HalfSpaceClipResult {
47
+ /**
48
+ * The clipped mesh, or `null` when no triangle survived. When NOTHING was
49
+ * cut or dropped this is the INPUT mesh by reference (no copy) — the
50
+ * common case for a model where only a handful of elements straddle the
51
+ * plane.
52
+ */
53
+ mesh: MeshData | null;
54
+ /** New edges on the cut plane, world space. Empty when nothing was cut. */
55
+ rimSegments: WorldSegment[];
56
+ }
57
+ export interface HalfSpaceClipBatchResult {
58
+ /** Surviving meshes, in input order; fully-clipped meshes are omitted. */
59
+ meshes: MeshData[];
60
+ rimSegments: WorldSegment[];
61
+ }
62
+ /**
63
+ * Clip one mesh to the half-space `dot(worldPoint, normal) <= offset`.
64
+ *
65
+ * @param normal Plane normal (world). Need not be unit — it is normalised
66
+ * internally, and `offset` is rescaled with it, so the half-space is
67
+ * the same set either way.
68
+ * @param offset Plane offset: `dot(pointOnPlane, normal)`.
69
+ *
70
+ * @throws when `normal` is (numerically) the zero vector — that defines no
71
+ * half-space at all, and silently keeping everything would print a
72
+ * model the screen is showing cut.
73
+ */
74
+ export declare function clipMeshToHalfSpace(mesh: MeshData, normal: Vec3, offset: number): HalfSpaceClipResult;
75
+ /** Clip every mesh, dropping the ones that vanish and pooling the rim. */
76
+ export declare function clipMeshesToHalfSpace(meshes: readonly MeshData[], normal: Vec3, offset: number): HalfSpaceClipBatchResult;
77
+ //# sourceMappingURL=half-space-clip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"half-space-clip.d.ts","sourceRoot":"","sources":["../src/half-space-clip.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,IAAI,CAAC;IACV,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IACtB,2EAA2E;IAC3E,WAAW,EAAE,YAAY,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,0EAA0E;IAC1E,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,WAAW,EAAE,YAAY,EAAE,CAAC;CAC7B;AAqBD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,MAAM,GACb,mBAAmB,CAyIrB;AAMD,0EAA0E;AAC1E,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,MAAM,GACb,wBAAwB,CAa1B"}
@@ -0,0 +1,257 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { vec3Length } from './math.js';
5
+ const MIN_NORMAL_LENGTH = 1e-12;
6
+ // ═══════════════════════════════════════════════════════════════════════════
7
+ // SINGLE MESH
8
+ // ═══════════════════════════════════════════════════════════════════════════
9
+ /**
10
+ * Clip one mesh to the half-space `dot(worldPoint, normal) <= offset`.
11
+ *
12
+ * @param normal Plane normal (world). Need not be unit — it is normalised
13
+ * internally, and `offset` is rescaled with it, so the half-space is
14
+ * the same set either way.
15
+ * @param offset Plane offset: `dot(pointOnPlane, normal)`.
16
+ *
17
+ * @throws when `normal` is (numerically) the zero vector — that defines no
18
+ * half-space at all, and silently keeping everything would print a
19
+ * model the screen is showing cut.
20
+ */
21
+ export function clipMeshToHalfSpace(mesh, normal, offset) {
22
+ const len = vec3Length(normal);
23
+ if (!Number.isFinite(len) || len < MIN_NORMAL_LENGTH) {
24
+ throw new Error('Cannot clip to a half-space with a zero-length or non-finite normal.');
25
+ }
26
+ if (!Number.isFinite(offset)) {
27
+ throw new Error('Cannot clip to a half-space with a non-finite offset.');
28
+ }
29
+ const nx = normal.x / len;
30
+ const ny = normal.y / len;
31
+ const nz = normal.z / len;
32
+ const worldOffset = offset / len;
33
+ const { positions, normals, indices, origin, entityIds } = mesh;
34
+ const ox = origin ? origin[0] : 0;
35
+ const oy = origin ? origin[1] : 0;
36
+ const oz = origin ? origin[2] : 0;
37
+ // The plane, expressed once in this mesh's LOCAL frame. This is the whole
38
+ // point of the module: every comparison and every emitted coordinate below
39
+ // stays local, and `origin` is never folded into `positions`.
40
+ const localOffset = worldOffset - (ox * nx + oy * ny + oz * nz);
41
+ const vertexCount = Math.floor(positions.length / 3);
42
+ const planeEps = planeEpsilonFor(positions, vertexCount);
43
+ const outPositions = [];
44
+ const outNormals = [];
45
+ const outEntityIds = [];
46
+ const rimSegments = [];
47
+ const entityId = mesh.expressId;
48
+ const ifcType = mesh.ifcType ?? 'Unknown';
49
+ const modelIndex = mesh.modelIndex ?? 0;
50
+ const hasNormals = normals.length >= positions.length;
51
+ const triangleCount = Math.floor(indices.length / 3);
52
+ let modified = false;
53
+ const poly = [];
54
+ const clipped = [];
55
+ for (let t = 0; t < triangleCount; t++) {
56
+ poly.length = 0;
57
+ let inside = 0;
58
+ for (let k = 0; k < 3; k++) {
59
+ const idx = indices[t * 3 + k];
60
+ const base = idx * 3;
61
+ const x = positions[base];
62
+ const y = positions[base + 1];
63
+ const z = positions[base + 2];
64
+ const d = x * nx + y * ny + z * nz - localOffset;
65
+ if (d <= planeEps)
66
+ inside++;
67
+ poly.push({
68
+ x,
69
+ y,
70
+ z,
71
+ nx: hasNormals ? normals[base] : 0,
72
+ ny: hasNormals ? normals[base + 1] : 0,
73
+ nz: hasNormals ? normals[base + 2] : 0,
74
+ entityId: entityIds ? entityIds[idx] : entityId,
75
+ d,
76
+ });
77
+ }
78
+ if (inside === 3) {
79
+ // Fully kept — emit verbatim.
80
+ for (const v of poly)
81
+ pushVertex(outPositions, outNormals, outEntityIds, v);
82
+ continue;
83
+ }
84
+ modified = true;
85
+ if (inside === 0)
86
+ continue; // fully dropped
87
+ // ── Sutherland–Hodgman against the single kept half-space ────────────
88
+ clipped.length = 0;
89
+ const newVertices = [];
90
+ for (let k = 0; k < 3; k++) {
91
+ const cur = poly[k];
92
+ const nxt = poly[(k + 1) % 3];
93
+ const curIn = cur.d <= planeEps;
94
+ const nxtIn = nxt.d <= planeEps;
95
+ if (curIn)
96
+ clipped.push(cur);
97
+ if (curIn !== nxtIn) {
98
+ const denom = cur.d - nxt.d;
99
+ // `curIn !== nxtIn` means the two distances straddle the plane, so
100
+ // the denominator cannot be zero; clamp anyway rather than emit NaN.
101
+ const s = Math.abs(denom) < Number.EPSILON ? 0 : cur.d / denom;
102
+ const cut = lerpVertex(cur, nxt, Math.min(1, Math.max(0, s)));
103
+ clipped.push(cut);
104
+ newVertices.push(cut);
105
+ }
106
+ }
107
+ // Fan-triangulate the clipped polygon (convex by construction: a convex
108
+ // triangle intersected with a half-space).
109
+ for (let k = 1; k + 1 < clipped.length; k++) {
110
+ const a = clipped[0];
111
+ const b = clipped[k];
112
+ const c = clipped[k + 1];
113
+ if (isDegenerate(a, b, c))
114
+ continue;
115
+ pushVertex(outPositions, outNormals, outEntityIds, a);
116
+ pushVertex(outPositions, outNormals, outEntityIds, b);
117
+ pushVertex(outPositions, outNormals, outEntityIds, c);
118
+ }
119
+ // The cut edge is the segment between the two intersection points a
120
+ // triangle-vs-plane crossing produces. Exactly two is the only case that
121
+ // yields a real edge; zero (a triangle merely touching the plane at one
122
+ // vertex) contributes nothing to the rim outline.
123
+ if (newVertices.length === 2) {
124
+ const [a, b] = newVertices;
125
+ const start = { x: a.x + ox, y: a.y + oy, z: a.z + oz };
126
+ const end = { x: b.x + ox, y: b.y + oy, z: b.z + oz };
127
+ const dx = end.x - start.x;
128
+ const dy = end.y - start.y;
129
+ const dz = end.z - start.z;
130
+ // A triangle that merely TOUCHES the plane with one vertex produces two
131
+ // coincident intersection points; that is a point, not an edge, and
132
+ // emitting it would litter the rim outline with zero-length segments.
133
+ if (dx * dx + dy * dy + dz * dz > planeEps * planeEps) {
134
+ rimSegments.push({ start, end, entityId, ifcType, modelIndex });
135
+ }
136
+ }
137
+ }
138
+ if (!modified) {
139
+ // Nothing straddled or fell outside: hand back the identical mesh so the
140
+ // caller keeps vertex sharing (and any attribute this module drops).
141
+ return { mesh, rimSegments: [] };
142
+ }
143
+ if (outPositions.length === 0) {
144
+ return { mesh: null, rimSegments };
145
+ }
146
+ return { mesh: rebuildMesh(mesh, outPositions, outNormals, outEntityIds), rimSegments };
147
+ }
148
+ // ═══════════════════════════════════════════════════════════════════════════
149
+ // BATCH
150
+ // ═══════════════════════════════════════════════════════════════════════════
151
+ /** Clip every mesh, dropping the ones that vanish and pooling the rim. */
152
+ export function clipMeshesToHalfSpace(meshes, normal, offset) {
153
+ const kept = [];
154
+ const rimSegments = [];
155
+ for (const mesh of meshes) {
156
+ const result = clipMeshToHalfSpace(mesh, normal, offset);
157
+ if (result.mesh)
158
+ kept.push(result.mesh);
159
+ // Appended one at a time, NOT `push(...result.rimSegments)`: a whole-model
160
+ // clip can produce far more rim segments than the engine's maximum argument
161
+ // count, and the spread form fails with a RangeError exactly on the large
162
+ // models this export exists for.
163
+ for (const segment of result.rimSegments)
164
+ rimSegments.push(segment);
165
+ }
166
+ return { meshes: kept, rimSegments };
167
+ }
168
+ // ═══════════════════════════════════════════════════════════════════════════
169
+ // INTERNALS
170
+ // ═══════════════════════════════════════════════════════════════════════════
171
+ /**
172
+ * Plane-coincidence tolerance sized to the mesh's own LOCAL coordinate
173
+ * magnitude times the f32 ULP term (`2⁻²²`) used elsewhere in this repo.
174
+ * Measuring it on local (not world) coordinates matters for the same reason
175
+ * `CutSegment.localMaxCoord` does (#2622): f32 quantisation happens in the
176
+ * local frame, so a small element at a large `origin` must not inherit a
177
+ * tolerance scaled to its distance from the model origin.
178
+ */
179
+ function planeEpsilonFor(positions, vertexCount) {
180
+ let maxAbs = 0;
181
+ const limit = vertexCount * 3;
182
+ for (let i = 0; i < limit; i++) {
183
+ const a = Math.abs(positions[i]);
184
+ if (a > maxAbs)
185
+ maxAbs = a;
186
+ }
187
+ return Math.max(1e-9, maxAbs * 2 ** -22);
188
+ }
189
+ function lerpVertex(a, b, s) {
190
+ return {
191
+ x: a.x + (b.x - a.x) * s,
192
+ y: a.y + (b.y - a.y) * s,
193
+ z: a.z + (b.z - a.z) * s,
194
+ nx: a.nx + (b.nx - a.nx) * s,
195
+ ny: a.ny + (b.ny - a.ny) * s,
196
+ nz: a.nz + (b.nz - a.nz) * s,
197
+ // Entity ids are per-ELEMENT, so both endpoints of any edge of one
198
+ // triangle carry the same id; taking the start's is exact, not a guess.
199
+ entityId: a.entityId,
200
+ d: 0,
201
+ };
202
+ }
203
+ function isDegenerate(a, b, c) {
204
+ const ux = b.x - a.x, uy = b.y - a.y, uz = b.z - a.z;
205
+ const vx = c.x - a.x, vy = c.y - a.y, vz = c.z - a.z;
206
+ const cx = uy * vz - uz * vy;
207
+ const cy = uz * vx - ux * vz;
208
+ const cz = ux * vy - uy * vx;
209
+ return cx * cx + cy * cy + cz * cz === 0;
210
+ }
211
+ function pushVertex(outPositions, outNormals, outEntityIds, v) {
212
+ outPositions.push(v.x, v.y, v.z);
213
+ outNormals.push(v.nx, v.ny, v.nz);
214
+ outEntityIds.push(v.entityId);
215
+ }
216
+ /**
217
+ * Assemble the clipped mesh. Fields are carried over EXPLICITLY rather than
218
+ * spread, because clipping invalidates several of them and silently passing
219
+ * a stale one on is exactly the kind of field-migration bug a blanket spread
220
+ * hides: `localBounds`, `geometryAabb`, `geometryVolume` and `geometryHash`
221
+ * all describe the WHOLE, uncut element, and `uvs`/`texture*` are per-vertex
222
+ * data the re-tessellated vertex buffer no longer matches. Line drawings
223
+ * consume none of them, so they are dropped rather than fabricated.
224
+ */
225
+ function rebuildMesh(source, outPositions, outNormals, outEntityIds) {
226
+ const vertexCount = outPositions.length / 3;
227
+ const indices = new Uint32Array(vertexCount);
228
+ for (let i = 0; i < vertexCount; i++)
229
+ indices[i] = i;
230
+ const clippedMesh = {
231
+ expressId: source.expressId,
232
+ positions: new Float32Array(outPositions),
233
+ normals: new Float32Array(outNormals),
234
+ indices,
235
+ color: source.color,
236
+ };
237
+ if (source.ifcType !== undefined)
238
+ clippedMesh.ifcType = source.ifcType;
239
+ if (source.modelIndex !== undefined)
240
+ clippedMesh.modelIndex = source.modelIndex;
241
+ if (source.shadingColor !== undefined)
242
+ clippedMesh.shadingColor = source.shadingColor;
243
+ // `origin` is carried through UNCHANGED and `positions` stay local: the
244
+ // whole no-double-fold contract of this module.
245
+ if (source.origin !== undefined)
246
+ clippedMesh.origin = source.origin;
247
+ if (source.geometryClass !== undefined)
248
+ clippedMesh.geometryClass = source.geometryClass;
249
+ if (source.occurrenceKey !== undefined)
250
+ clippedMesh.occurrenceKey = source.occurrenceKey;
251
+ if (source.localToWorld !== undefined)
252
+ clippedMesh.localToWorld = source.localToWorld;
253
+ if (source.entityIds !== undefined)
254
+ clippedMesh.entityIds = new Uint32Array(outEntityIds);
255
+ return clippedMesh;
256
+ }
257
+ //# sourceMappingURL=half-space-clip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"half-space-clip.js","sourceRoot":"","sources":["../src/half-space-clip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Internal software depth rasterizer backing HiddenLineClassifier.
3
+ *
4
+ * Rasterizes the KEPT half of the section - flip-adjusted signed depth
5
+ * `d` in `[-occluderDepth, 0]`, see the sign-convention comment in
6
+ * projection-bands.ts - into a per-pixel minimum buffer of VIEW DEPTHS
7
+ * (`-d`): 0 at the cut plane, increasing into the kept half, smaller means
8
+ * nearer the viewer. Before issue #2639 the rasterizer sampled the CUT-AWAY
9
+ * half instead, so nothing that could actually occlude was ever rasterized.
10
+ *
11
+ * Depth and 2D projection reuse the exact plane-aware helpers the line
12
+ * producers use (`signedDepth` / `projectPointForPlane`), so the buffer and
13
+ * the lines sampled against it agree on frame and sign by construction,
14
+ * for cardinal and custom planes alike.
15
+ *
16
+ * The vertex fetch, the projected-extent walk and the barycentric test are
17
+ * shared with the shaded colour raster via `raster-core.ts`. The per-pixel
18
+ * loop below is NOT shared: this one maps the extent onto `width - 1` (pixel
19
+ * CENTRES sit on the bounds edges), which is right for sampling a buffer and
20
+ * wrong for an image whose rectangle must cover the extent exactly, so
21
+ * `color-raster.ts` maps edge-to-edge instead.
22
+ *
23
+ * Internal module: not exported from the package index.
24
+ */
25
+ import type { MeshData } from '@ifc-lite/geometry';
26
+ import type { Bounds2D, SectionPlaneConfig } from './types.js';
27
+ export interface DepthRaster {
28
+ /** Per-pixel minimum view depth; Infinity where nothing rasterized. */
29
+ buffer: Float32Array;
30
+ width: number;
31
+ height: number;
32
+ bounds: Bounds2D;
33
+ }
34
+ /**
35
+ * 2D bounds of every occluder vertex whose view depth lies in
36
+ * `[0, occluderDepth]` (the kept half of the section), grown by a 1% margin
37
+ * so geometry on the exact edge still rasterizes cleanly. Empty (non-finite)
38
+ * when no vertex is in the window: the caller degrades to "everything
39
+ * visible".
40
+ */
41
+ export declare function computeOccluderBounds(meshes: MeshData[], plane: SectionPlaneConfig, occluderDepth: number): Bounds2D;
42
+ /**
43
+ * Build the min-view-depth raster for the kept half of the section.
44
+ * Returns `null` when the bounds are empty or degenerate (no in-window
45
+ * occluder and none supplied): nothing can occlude, so the caller must
46
+ * classify every line visible instead of sampling a buffer with NaN
47
+ * coordinates (which classified EVERYTHING hidden - issue #2639).
48
+ */
49
+ export declare function buildDepthRaster(meshes: MeshData[], plane: SectionPlaneConfig, occluderDepth: number, resolution: number, depthBias: number, bounds?: Bounds2D): DepthRaster | null;
50
+ //# sourceMappingURL=hidden-line-raster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hidden-line-raster.d.ts","sourceRoot":"","sources":["../src/hidden-line-raster.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAM/D,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,QAAQ,EAAE,EAClB,KAAK,EAAE,kBAAkB,EACzB,aAAa,EAAE,MAAM,GACpB,QAAQ,CAEV;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,QAAQ,EAAE,EAClB,KAAK,EAAE,kBAAkB,EACzB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,QAAQ,GAChB,WAAW,GAAG,IAAI,CAmCpB"}