@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.
- package/dist/color-raster.d.ts +95 -0
- package/dist/color-raster.d.ts.map +1 -0
- package/dist/color-raster.js +225 -0
- package/dist/color-raster.js.map +1 -0
- package/dist/drawing-generator.d.ts +17 -0
- package/dist/drawing-generator.d.ts.map +1 -1
- package/dist/drawing-generator.js +33 -7
- package/dist/drawing-generator.js.map +1 -1
- package/dist/edge-extractor.d.ts +17 -0
- package/dist/edge-extractor.d.ts.map +1 -1
- package/dist/edge-extractor.js +104 -1
- package/dist/edge-extractor.js.map +1 -1
- package/dist/half-space-clip.d.ts +77 -0
- package/dist/half-space-clip.d.ts.map +1 -0
- package/dist/half-space-clip.js +257 -0
- package/dist/half-space-clip.js.map +1 -0
- package/dist/hidden-line-raster.d.ts +50 -0
- package/dist/hidden-line-raster.d.ts.map +1 -0
- package/dist/hidden-line-raster.js +103 -0
- package/dist/hidden-line-raster.js.map +1 -0
- package/dist/hidden-line.d.ts +34 -21
- package/dist/hidden-line.d.ts.map +1 -1
- package/dist/hidden-line.js +107 -214
- package/dist/hidden-line.js.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -1
- package/dist/index.js.map +1 -1
- package/dist/line-merger.d.ts.map +1 -1
- package/dist/line-merger.js +88 -44
- package/dist/line-merger.js.map +1 -1
- package/dist/pdf-scale.d.ts +17 -0
- package/dist/pdf-scale.d.ts.map +1 -1
- package/dist/pdf-scale.js +38 -0
- package/dist/pdf-scale.js.map +1 -1
- package/dist/polygon-builder.d.ts +31 -0
- package/dist/polygon-builder.d.ts.map +1 -1
- package/dist/polygon-builder.js +60 -3
- package/dist/polygon-builder.js.map +1 -1
- package/dist/profile-projector.js +17 -9
- package/dist/profile-projector.js.map +1 -1
- package/dist/projection-bands.d.ts +13 -6
- package/dist/projection-bands.d.ts.map +1 -1
- package/dist/projection-bands.js +15 -3
- package/dist/projection-bands.js.map +1 -1
- package/dist/raster-core.d.ts +71 -0
- package/dist/raster-core.d.ts.map +1 -0
- package/dist/raster-core.js +89 -0
- package/dist/raster-core.js.map +1 -0
- package/dist/section-cutter.d.ts +8 -0
- package/dist/section-cutter.d.ts.map +1 -1
- package/dist/section-cutter.js +59 -11
- package/dist/section-cutter.js.map +1 -1
- package/dist/sheet/index.d.ts +2 -0
- package/dist/sheet/index.d.ts.map +1 -1
- package/dist/sheet/index.js +1 -0
- package/dist/sheet/index.js.map +1 -1
- package/dist/sheet/scale-stamp.d.ts +130 -0
- package/dist/sheet/scale-stamp.d.ts.map +1 -0
- package/dist/sheet/scale-stamp.js +277 -0
- package/dist/sheet/scale-stamp.js.map +1 -0
- package/dist/types.d.ts +26 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/view-plane.d.ts +99 -0
- package/dist/view-plane.d.ts.map +1 -0
- package/dist/view-plane.js +183 -0
- package/dist/view-plane.js.map +1 -0
- package/dist/world-line-seeds.d.ts +41 -0
- package/dist/world-line-seeds.d.ts.map +1 -0
- package/dist/world-line-seeds.js +43 -0
- package/dist/world-line-seeds.js.map +1 -0
- package/package.json +2 -2
package/dist/edge-extractor.js
CHANGED
|
@@ -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
|
|
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":"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"}
|
|
@@ -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"}
|