@ifc-lite/renderer 1.41.1 → 1.44.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/camera-animation.d.ts +20 -32
- package/dist/camera-animation.d.ts.map +1 -1
- package/dist/camera-animation.js +71 -358
- package/dist/camera-animation.js.map +1 -1
- package/dist/camera-controls.d.ts +11 -51
- package/dist/camera-controls.d.ts.map +1 -1
- package/dist/camera-controls.js +140 -12
- package/dist/camera-controls.js.map +1 -1
- package/dist/camera-first-person.d.ts +52 -0
- package/dist/camera-first-person.d.ts.map +1 -0
- package/dist/camera-first-person.js +119 -0
- package/dist/camera-first-person.js.map +1 -0
- package/dist/camera-fit-policy.d.ts.map +1 -1
- package/dist/camera-fit-policy.js +18 -7
- package/dist/camera-fit-policy.js.map +1 -1
- package/dist/camera-framing.d.ts +86 -0
- package/dist/camera-framing.d.ts.map +1 -0
- package/dist/camera-framing.js +230 -0
- package/dist/camera-framing.js.map +1 -0
- package/dist/camera-guards.d.ts +148 -0
- package/dist/camera-guards.d.ts.map +1 -0
- package/dist/camera-guards.js +150 -0
- package/dist/camera-guards.js.map +1 -0
- package/dist/camera-matrices.d.ts +14 -0
- package/dist/camera-matrices.d.ts.map +1 -0
- package/dist/camera-matrices.js +146 -0
- package/dist/camera-matrices.js.map +1 -0
- package/dist/camera-preset-view.d.ts +56 -0
- package/dist/camera-preset-view.d.ts.map +1 -0
- package/dist/camera-preset-view.js +180 -0
- package/dist/camera-preset-view.js.map +1 -0
- package/dist/camera-projection.d.ts +1 -1
- package/dist/camera-projection.d.ts.map +1 -1
- package/dist/camera-projection.js +83 -30
- package/dist/camera-projection.js.map +1 -1
- package/dist/camera-state.d.ts +62 -0
- package/dist/camera-state.d.ts.map +1 -0
- package/dist/camera-state.js +5 -0
- package/dist/camera-state.js.map +1 -0
- package/dist/camera.d.ts +22 -11
- package/dist/camera.d.ts.map +1 -1
- package/dist/camera.js +110 -85
- package/dist/camera.js.map +1 -1
- package/dist/deviation/deviation-pipeline.d.ts.map +1 -1
- package/dist/deviation/deviation-pipeline.js +21 -4
- package/dist/deviation/deviation-pipeline.js.map +1 -1
- package/dist/environment.d.ts.map +1 -1
- package/dist/environment.js +23 -1
- package/dist/environment.js.map +1 -1
- package/dist/index.d.ts +333 -43
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +753 -704
- package/dist/index.js.map +1 -1
- package/dist/math.d.ts +59 -2
- package/dist/math.d.ts.map +1 -1
- package/dist/math.js +173 -23
- package/dist/math.js.map +1 -1
- package/dist/model-bounds-tracker.d.ts +96 -0
- package/dist/model-bounds-tracker.d.ts.map +1 -0
- package/dist/model-bounds-tracker.js +147 -0
- package/dist/model-bounds-tracker.js.map +1 -0
- package/dist/pointcloud/point-cloud-node.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-node.js +24 -4
- package/dist/pointcloud/point-cloud-node.js.map +1 -1
- package/dist/render-degradation.d.ts +77 -0
- package/dist/render-degradation.d.ts.map +1 -0
- package/dist/render-degradation.js +52 -0
- package/dist/render-degradation.js.map +1 -0
- package/dist/render-section-draw.d.ts +51 -0
- package/dist/render-section-draw.d.ts.map +1 -0
- package/dist/render-section-draw.js +66 -0
- package/dist/render-section-draw.js.map +1 -0
- package/dist/render-section-plane.d.ts +128 -0
- package/dist/render-section-plane.d.ts.map +1 -0
- package/dist/render-section-plane.js +298 -0
- package/dist/render-section-plane.js.map +1 -0
- package/dist/renderer-overlays.d.ts +144 -0
- package/dist/renderer-overlays.d.ts.map +1 -0
- package/dist/renderer-overlays.js +257 -0
- package/dist/renderer-overlays.js.map +1 -0
- package/dist/renderer-symbolic-overlays.d.ts +52 -0
- package/dist/renderer-symbolic-overlays.d.ts.map +1 -0
- package/dist/renderer-symbolic-overlays.js +115 -0
- package/dist/renderer-symbolic-overlays.js.map +1 -0
- package/dist/scene-geometry.d.ts +32 -0
- package/dist/scene-geometry.d.ts.map +1 -1
- package/dist/scene-geometry.js +66 -0
- package/dist/scene-geometry.js.map +1 -1
- package/dist/scene.d.ts +86 -1
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +391 -201
- package/dist/scene.js.map +1 -1
- package/dist/section-2d-lift.d.ts +105 -0
- package/dist/section-2d-lift.d.ts.map +1 -0
- package/dist/section-2d-lift.js +162 -0
- package/dist/section-2d-lift.js.map +1 -0
- package/dist/section-2d-line-buffer.d.ts +58 -0
- package/dist/section-2d-line-buffer.d.ts.map +1 -0
- package/dist/section-2d-line-buffer.js +109 -0
- package/dist/section-2d-line-buffer.js.map +1 -0
- package/dist/section-2d-overlay.d.ts +43 -75
- package/dist/section-2d-overlay.d.ts.map +1 -1
- package/dist/section-2d-overlay.js +189 -559
- package/dist/section-2d-overlay.js.map +1 -1
- package/dist/section-plane-basis.d.ts +22 -3
- package/dist/section-plane-basis.d.ts.map +1 -1
- package/dist/section-plane-basis.js +51 -10
- package/dist/section-plane-basis.js.map +1 -1
- package/dist/section-plane.d.ts.map +1 -1
- package/dist/section-plane.js +10 -1
- package/dist/section-plane.js.map +1 -1
- package/dist/shaders/section-2d-overlay.wgsl.d.ts +102 -0
- package/dist/shaders/section-2d-overlay.wgsl.d.ts.map +1 -0
- package/dist/shaders/section-2d-overlay.wgsl.js +281 -0
- package/dist/shaders/section-2d-overlay.wgsl.js.map +1 -0
- package/dist/visual-enhancement.d.ts +33 -0
- package/dist/visual-enhancement.d.ts.map +1 -0
- package/dist/visual-enhancement.js +46 -0
- package/dist/visual-enhancement.js.map +1 -0
- package/package.json +4 -3
|
@@ -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 { SectionPlaneRenderer } from './section-plane.js';
|
|
5
|
+
import { Section2DOverlayRenderer } from './section-2d-overlay.js';
|
|
6
|
+
import { SymbolicOverlays } from './renderer-symbolic-overlays.js';
|
|
7
|
+
import { aabbEdgeLineList } from './aabb-edges.js';
|
|
8
|
+
import { projectedBoundsRange } from './render-section-plane.js';
|
|
9
|
+
import { drawSectionOverlays } from './render-section-draw.js';
|
|
10
|
+
export class RendererOverlays {
|
|
11
|
+
host;
|
|
12
|
+
sectionPlaneRenderer = null;
|
|
13
|
+
section2DOverlayRenderer = null;
|
|
14
|
+
// Overlay/section-cut line colour, kept here so it survives a
|
|
15
|
+
// pre-init call and a section2DOverlayRenderer re-creation (re-applied below).
|
|
16
|
+
overlayLineColor = [0, 0, 0, 1];
|
|
17
|
+
symbolic;
|
|
18
|
+
constructor(host) {
|
|
19
|
+
this.host = host;
|
|
20
|
+
this.symbolic = new SymbolicOverlays(host);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create the overlay GPU objects. Called from `Renderer.init()` once the
|
|
24
|
+
* device and the main pipeline (for its sample count) exist.
|
|
25
|
+
*/
|
|
26
|
+
init(device, format, sampleCount) {
|
|
27
|
+
this.sectionPlaneRenderer = new SectionPlaneRenderer(device, format, sampleCount);
|
|
28
|
+
this.section2DOverlayRenderer = new Section2DOverlayRenderer(device, format, sampleCount);
|
|
29
|
+
// Re-apply any colour set before this (re)creation so it isn't lost.
|
|
30
|
+
this.section2DOverlayRenderer.setOverlayLineColor(this.overlayLineColor);
|
|
31
|
+
this.symbolic.init(device, format, sampleCount);
|
|
32
|
+
}
|
|
33
|
+
/** Release every overlay GPU resource. Idempotent, like `Renderer.destroy()`. */
|
|
34
|
+
destroy() {
|
|
35
|
+
this.sectionPlaneRenderer?.destroy();
|
|
36
|
+
this.sectionPlaneRenderer = null;
|
|
37
|
+
this.section2DOverlayRenderer?.dispose();
|
|
38
|
+
this.section2DOverlayRenderer = null;
|
|
39
|
+
this.symbolic.destroy();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Draw every overlay into the frame's render pass, in the documented order.
|
|
43
|
+
* Called from the encode region right before `pass.end()`.
|
|
44
|
+
*/
|
|
45
|
+
draw(pass, ctx) {
|
|
46
|
+
const { viewProj, camera } = ctx;
|
|
47
|
+
drawSectionOverlays(pass, this.sectionPlaneRenderer, this.section2DOverlayRenderer, ctx);
|
|
48
|
+
// Standalone IFC annotation overlay (issue #653). The line
|
|
49
|
+
// vertices were pre-lifted to world space at upload time, so
|
|
50
|
+
// this draw happens regardless of whether a section plane is
|
|
51
|
+
// active — annotations are a free-floating "drawing layer"
|
|
52
|
+
// that sits at each annotation's storey elevation.
|
|
53
|
+
//
|
|
54
|
+
// This block was previously nested inside the `if (options.sectionPlane && ...)`
|
|
55
|
+
// guard above, contradicting its own comment. Loading an
|
|
56
|
+
// annotation-only model with no section plane meant the entire
|
|
57
|
+
// overlay was skipped at draw time even though 9000+ vertices
|
|
58
|
+
// had been uploaded successfully. Pulled out to its own block.
|
|
59
|
+
//
|
|
60
|
+
// Order: fills (background) → lines (outlines on top) →
|
|
61
|
+
// texts (labels above everything).
|
|
62
|
+
this.symbolic.drawFills(pass, viewProj);
|
|
63
|
+
if (this.section2DOverlayRenderer?.hasAnnotationLines3D()) {
|
|
64
|
+
this.section2DOverlayRenderer.drawAnnotationLines3D(pass, viewProj);
|
|
65
|
+
}
|
|
66
|
+
if (this.section2DOverlayRenderer?.hasAlignmentLines3D()) {
|
|
67
|
+
this.section2DOverlayRenderer.drawAlignmentLines3D(pass, viewProj);
|
|
68
|
+
}
|
|
69
|
+
if (this.section2DOverlayRenderer?.hasGridLines3D()) {
|
|
70
|
+
this.section2DOverlayRenderer.drawGridLines3D(pass, viewProj);
|
|
71
|
+
}
|
|
72
|
+
if (this.section2DOverlayRenderer?.hasDxfLines3D()) {
|
|
73
|
+
this.section2DOverlayRenderer.drawDxfLines3D(pass, viewProj);
|
|
74
|
+
}
|
|
75
|
+
if (this.section2DOverlayRenderer?.hasClashBoxLines3D()) {
|
|
76
|
+
this.section2DOverlayRenderer.drawClashBoxLines3D(pass, viewProj);
|
|
77
|
+
}
|
|
78
|
+
this.symbolic.drawTexts(pass, viewProj, ctx.canvasWidth, ctx.canvasHeight, camera);
|
|
79
|
+
}
|
|
80
|
+
/** See `Renderer.uploadSection2DOverlay` for the published contract. */
|
|
81
|
+
uploadSection2DOverlay(polygons, lines, axis, position, // 0-100 percentage
|
|
82
|
+
sectionRange, // Same storey-based range as section plane
|
|
83
|
+
flipped = false, customPlane) {
|
|
84
|
+
// Rendering is dirty-flag gated, so every path that actually CHANGES
|
|
85
|
+
// overlay geometry has to request a frame or the new drawing only
|
|
86
|
+
// appears when something unrelated next dirties the viewport (#2442).
|
|
87
|
+
// The two early returns below leave the geometry untouched, so they
|
|
88
|
+
// correctly ask for nothing — matching `uploadGridLines3D` and friends.
|
|
89
|
+
if (!this.section2DOverlayRenderer)
|
|
90
|
+
return;
|
|
91
|
+
if (customPlane) {
|
|
92
|
+
// Custom-plane path: planePosition / axis are unused — the
|
|
93
|
+
// basis the cap shader needs travels in `customPlane`. We pass
|
|
94
|
+
// 0 for `planePosition` and the existing `axis` so the cardinal
|
|
95
|
+
// shader code path that callers depend on (e.g. legacy SVG
|
|
96
|
+
// export) keeps working when customPlane is omitted.
|
|
97
|
+
this.section2DOverlayRenderer.uploadDrawing(polygons, lines, axis, 0, flipped, customPlane);
|
|
98
|
+
this.host.requestRender();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Same range formula as the clip plane (`resolveSectionPlaneFrame`),
|
|
102
|
+
// shared rather than copied — but deliberately evaluated against the
|
|
103
|
+
// UN-ROTATED axis normal, which is what makes the two agree instead of
|
|
104
|
+
// merely look alike (#2447).
|
|
105
|
+
//
|
|
106
|
+
// `planePosition` is not a plane distance here: `transform2Dto3D` lifts
|
|
107
|
+
// the cardinal drawing onto an AXIS-ALIGNED plane at that world
|
|
108
|
+
// coordinate (`side` -> `[planePosition, y, x]`), and the polygons it
|
|
109
|
+
// lifts were cut on that same axis-aligned plane upstream. Feeding it
|
|
110
|
+
// the rotated plane's distance would move the cap off the geometry it
|
|
111
|
+
// was cut from. A rotated or face-picked plane reaches the cap through
|
|
112
|
+
// `customPlane` above, which carries its own basis.
|
|
113
|
+
const axisNormal = axis === 'side' ? [1, 0, 0] : axis === 'down' ? [0, 1, 0] : [0, 0, 1];
|
|
114
|
+
const modelBounds = this.host.getModelBounds();
|
|
115
|
+
// Allow upload if either sectionRange has both values, or modelBounds exists as fallback
|
|
116
|
+
const hasFullRange = sectionRange?.min !== undefined && sectionRange?.max !== undefined;
|
|
117
|
+
if (!hasFullRange && !modelBounds)
|
|
118
|
+
return;
|
|
119
|
+
const axisRange = modelBounds ? projectedBoundsRange(modelBounds.min, modelBounds.max, axisNormal) : null;
|
|
120
|
+
const minVal = sectionRange?.min ?? axisRange.min;
|
|
121
|
+
const maxVal = sectionRange?.max ?? axisRange.max;
|
|
122
|
+
const planePosition = minVal + (position / 100) * (maxVal - minVal);
|
|
123
|
+
this.section2DOverlayRenderer.uploadDrawing(polygons, lines, axis, planePosition, flipped);
|
|
124
|
+
this.host.requestRender();
|
|
125
|
+
}
|
|
126
|
+
/** See `Renderer.clearSection2DOverlay` for the published contract. */
|
|
127
|
+
clearSection2DOverlay() {
|
|
128
|
+
if (this.section2DOverlayRenderer) {
|
|
129
|
+
this.section2DOverlayRenderer.clearGeometry();
|
|
130
|
+
this.host.requestRender();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** See `Renderer.setOverlayLineColor` for the published contract. */
|
|
134
|
+
setOverlayLineColor(color) {
|
|
135
|
+
// Persist here so a pre-init call (and any later overlay
|
|
136
|
+
// re-creation) keeps the colour — init() re-applies this.overlayLineColor.
|
|
137
|
+
this.overlayLineColor = color;
|
|
138
|
+
this.section2DOverlayRenderer?.setOverlayLineColor(color);
|
|
139
|
+
this.host.requestRender();
|
|
140
|
+
}
|
|
141
|
+
/** See `Renderer.uploadAnnotationLines3D` for the published contract. */
|
|
142
|
+
uploadAnnotationLines3D(vertices) {
|
|
143
|
+
if (!this.section2DOverlayRenderer)
|
|
144
|
+
return;
|
|
145
|
+
this.section2DOverlayRenderer.uploadAnnotationLines3D(vertices);
|
|
146
|
+
// Contribute annotation extents to modelBounds + camera sceneBounds
|
|
147
|
+
// so an annotation-only model (no IfcProduct meshes — common for
|
|
148
|
+
// separate "annotation sheets") gets framed by Home / fit-to-view
|
|
149
|
+
// AND has correct near/far clipping. Without sceneBounds the camera
|
|
150
|
+
// frustum doesn't include the annotation cluster and they're clipped
|
|
151
|
+
// away even when the camera is pointed at them. Mirror the
|
|
152
|
+
// point-cloud upload path (`addPointClouds`, `setPointClouds`) which
|
|
153
|
+
// does the same thing.
|
|
154
|
+
this.host.expandModelBoundsWithFlatVertices(vertices, 3);
|
|
155
|
+
this.host.syncCameraSceneBounds();
|
|
156
|
+
this.host.requestRender();
|
|
157
|
+
}
|
|
158
|
+
/** See `Renderer.clearAnnotationLines3D` for the published contract. */
|
|
159
|
+
clearAnnotationLines3D() {
|
|
160
|
+
if (this.section2DOverlayRenderer) {
|
|
161
|
+
this.section2DOverlayRenderer.clearAnnotationLines3D();
|
|
162
|
+
this.host.requestRender();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/** See `Renderer.uploadAlignmentLines3D` for the published contract. */
|
|
166
|
+
uploadAlignmentLines3D(vertices) {
|
|
167
|
+
if (!this.section2DOverlayRenderer)
|
|
168
|
+
return;
|
|
169
|
+
this.section2DOverlayRenderer.uploadAlignmentLines3D(vertices);
|
|
170
|
+
// Frame alignment-only files the same way annotation overlays are
|
|
171
|
+
// framed (see uploadAnnotationLines3D).
|
|
172
|
+
this.host.expandModelBoundsWithFlatVertices(vertices, 3);
|
|
173
|
+
this.host.syncCameraSceneBounds();
|
|
174
|
+
this.host.requestRender();
|
|
175
|
+
}
|
|
176
|
+
/** See `Renderer.clearAlignmentLines3D` for the published contract. */
|
|
177
|
+
clearAlignmentLines3D() {
|
|
178
|
+
if (this.section2DOverlayRenderer) {
|
|
179
|
+
this.section2DOverlayRenderer.clearAlignmentLines3D();
|
|
180
|
+
this.host.requestRender();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* See `Renderer.uploadGridLines3D` for the published contract. Unlike
|
|
185
|
+
* alignment, grids do NOT expand model bounds: they're behind a visibility
|
|
186
|
+
* toggle, so toggling them on must not reframe the camera.
|
|
187
|
+
*/
|
|
188
|
+
uploadGridLines3D(vertices) {
|
|
189
|
+
if (!this.section2DOverlayRenderer)
|
|
190
|
+
return;
|
|
191
|
+
this.section2DOverlayRenderer.uploadGridLines3D(vertices);
|
|
192
|
+
this.host.requestRender();
|
|
193
|
+
}
|
|
194
|
+
/** See `Renderer.clearGridLines3D` for the published contract. */
|
|
195
|
+
clearGridLines3D() {
|
|
196
|
+
if (this.section2DOverlayRenderer) {
|
|
197
|
+
this.section2DOverlayRenderer.clearGridLines3D();
|
|
198
|
+
this.host.requestRender();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/** See `Renderer.uploadDxfLines3D` for the published contract. */
|
|
202
|
+
uploadDxfLines3D(vertices) {
|
|
203
|
+
if (!this.section2DOverlayRenderer)
|
|
204
|
+
return;
|
|
205
|
+
this.section2DOverlayRenderer.uploadDxfLines3D(vertices);
|
|
206
|
+
this.host.requestRender();
|
|
207
|
+
}
|
|
208
|
+
/** See `Renderer.clearDxfLines3D` for the published contract. */
|
|
209
|
+
clearDxfLines3D() {
|
|
210
|
+
if (this.section2DOverlayRenderer) {
|
|
211
|
+
this.section2DOverlayRenderer.clearDxfLines3D();
|
|
212
|
+
this.host.requestRender();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/** See `Renderer.setClashOverlapBox` for the published contract. */
|
|
216
|
+
setClashOverlapBox(box) {
|
|
217
|
+
if (!this.section2DOverlayRenderer)
|
|
218
|
+
return;
|
|
219
|
+
if (!box) {
|
|
220
|
+
this.section2DOverlayRenderer.clearClashBoxLines3D();
|
|
221
|
+
this.host.requestRender();
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
this.section2DOverlayRenderer.setClashBoxLineColor(box.color);
|
|
225
|
+
this.section2DOverlayRenderer.uploadClashBoxLines3D(aabbEdgeLineList(box.min, box.max));
|
|
226
|
+
this.host.requestRender();
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* See `Renderer.setClashContactLines` for the published contract. Shares the
|
|
230
|
+
* clash-box line buffer, so only one of this / setClashOverlapBox shows.
|
|
231
|
+
*/
|
|
232
|
+
setClashContactLines(lines) {
|
|
233
|
+
if (!this.section2DOverlayRenderer)
|
|
234
|
+
return;
|
|
235
|
+
if (!lines || lines.vertices.length === 0) {
|
|
236
|
+
this.section2DOverlayRenderer.clearClashBoxLines3D();
|
|
237
|
+
this.host.requestRender();
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
this.section2DOverlayRenderer.setClashBoxLineColor(lines.color);
|
|
241
|
+
this.section2DOverlayRenderer.uploadClashBoxLines3D(lines.vertices);
|
|
242
|
+
this.host.requestRender();
|
|
243
|
+
}
|
|
244
|
+
/** See `Renderer.uploadAnnotationFills3D` for the published contract. */
|
|
245
|
+
uploadAnnotationFills3D(fills) {
|
|
246
|
+
this.symbolic.uploadFills(fills);
|
|
247
|
+
}
|
|
248
|
+
/** See `Renderer.uploadAnnotationTexts3D` for the published contract. */
|
|
249
|
+
uploadAnnotationTexts3D(texts) {
|
|
250
|
+
this.symbolic.uploadTexts(texts);
|
|
251
|
+
}
|
|
252
|
+
/** See `Renderer.hasSection2DOverlay` for the published contract. */
|
|
253
|
+
hasSection2DOverlay() {
|
|
254
|
+
return this.section2DOverlayRenderer?.hasGeometry() ?? false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=renderer-overlays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-overlays.js","sourceRoot":"","sources":["../src/renderer-overlays.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The symbolic annotation overlay: filled IfcAnnotation regions and world-space
|
|
3
|
+
* text labels (issue #653).
|
|
4
|
+
*
|
|
5
|
+
* Split out of `RendererOverlays` because these are a genuinely separate pair of
|
|
6
|
+
* GPU objects — `SymbolicFillPipeline` and `SymbolicTextPipeline` own their own
|
|
7
|
+
* buffers, sampler and glyph-atlas texture, and share no state whatsoever with
|
|
8
|
+
* the `Section2DOverlayRenderer` that backs the section cap and every 3D line
|
|
9
|
+
* layer. `RendererOverlays` composes this and drives the draw order, because the
|
|
10
|
+
* order is the one thing the two families do share: fills paint underneath the
|
|
11
|
+
* line layers, text labels on top of everything.
|
|
12
|
+
*/
|
|
13
|
+
import type { Camera } from './camera.js';
|
|
14
|
+
import { type SymbolicFillInput, type SymbolicTextInput } from './symbolic-overlay-pipelines.js';
|
|
15
|
+
/**
|
|
16
|
+
* The model-bounds bookkeeping the symbolic uploads borrow from `Renderer`.
|
|
17
|
+
* Structurally narrower than `OverlayHost` on purpose: this module never reads
|
|
18
|
+
* the bounds back, it only grows them and asks for a frame.
|
|
19
|
+
*/
|
|
20
|
+
export interface SymbolicOverlayHost {
|
|
21
|
+
expandModelBoundsWithFlatVertices(positions: Float32Array, stride: number): void;
|
|
22
|
+
syncCameraSceneBounds(): void;
|
|
23
|
+
requestRender(): void;
|
|
24
|
+
}
|
|
25
|
+
export declare class SymbolicOverlays {
|
|
26
|
+
private readonly host;
|
|
27
|
+
private fillPipeline;
|
|
28
|
+
private textPipeline;
|
|
29
|
+
constructor(host: SymbolicOverlayHost);
|
|
30
|
+
/**
|
|
31
|
+
* Share the device + presentation format AND the MSAA sample count +
|
|
32
|
+
* objectId attachment shape with the rest of the renderer so these
|
|
33
|
+
* composite into the same RGBA pass without WebGPU pass-compatibility
|
|
34
|
+
* validation errors.
|
|
35
|
+
*/
|
|
36
|
+
init(device: GPUDevice, format: GPUTextureFormat, sampleCount: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* These pipelines own their own GPU buffers, sampler, and atlas texture —
|
|
39
|
+
* recreating the viewer without releasing them leaks resources on every
|
|
40
|
+
* reload.
|
|
41
|
+
*/
|
|
42
|
+
destroy(): void;
|
|
43
|
+
/** Background layer: painted before the 3D line overlays. */
|
|
44
|
+
drawFills(pass: GPURenderPassEncoder, viewProj: Float32Array): void;
|
|
45
|
+
/** Label layer: painted after everything else. */
|
|
46
|
+
drawTexts(pass: GPURenderPassEncoder, viewProj: Float32Array, canvasWidth: number, canvasHeight: number, camera: Camera): void;
|
|
47
|
+
/** See `Renderer.uploadAnnotationFills3D` for the published contract. */
|
|
48
|
+
uploadFills(fills: readonly SymbolicFillInput[]): void;
|
|
49
|
+
/** See `Renderer.uploadAnnotationTexts3D` for the published contract. */
|
|
50
|
+
uploadTexts(texts: readonly SymbolicTextInput[]): void;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=renderer-symbolic-overlays.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-symbolic-overlays.d.ts","sourceRoot":"","sources":["../src/renderer-symbolic-overlays.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAGH,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACzB,MAAM,iCAAiC,CAAC;AAEzC;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAChC,iCAAiC,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACjF,qBAAqB,IAAI,IAAI,CAAC;IAC9B,aAAa,IAAI,IAAI,CAAC;CACzB;AAED,qBAAa,gBAAgB;IAIb,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,YAAY,CAAqC;gBAE5B,IAAI,EAAE,mBAAmB;IAEtD;;;;;OAKG;IACH,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAK5E;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAOf,6DAA6D;IAC7D,SAAS,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAMnE,kDAAkD;IAClD,SAAS,CACL,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,GACf,IAAI;IAqCP,yEAAyE;IACzE,WAAW,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI;IAqBtD,yEAAyE;IACzE,WAAW,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI;CAkBzD"}
|
|
@@ -0,0 +1,115 @@
|
|
|
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 { viewBasis } from './math.js';
|
|
5
|
+
import { SymbolicFillPipeline, SymbolicTextPipeline, } from './symbolic-overlay-pipelines.js';
|
|
6
|
+
export class SymbolicOverlays {
|
|
7
|
+
host;
|
|
8
|
+
fillPipeline = null;
|
|
9
|
+
textPipeline = null;
|
|
10
|
+
constructor(host) {
|
|
11
|
+
this.host = host;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Share the device + presentation format AND the MSAA sample count +
|
|
15
|
+
* objectId attachment shape with the rest of the renderer so these
|
|
16
|
+
* composite into the same RGBA pass without WebGPU pass-compatibility
|
|
17
|
+
* validation errors.
|
|
18
|
+
*/
|
|
19
|
+
init(device, format, sampleCount) {
|
|
20
|
+
this.fillPipeline = new SymbolicFillPipeline(device, format, sampleCount);
|
|
21
|
+
this.textPipeline = new SymbolicTextPipeline(device, format, sampleCount);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* These pipelines own their own GPU buffers, sampler, and atlas texture —
|
|
25
|
+
* recreating the viewer without releasing them leaks resources on every
|
|
26
|
+
* reload.
|
|
27
|
+
*/
|
|
28
|
+
destroy() {
|
|
29
|
+
this.fillPipeline?.destroy();
|
|
30
|
+
this.fillPipeline = null;
|
|
31
|
+
this.textPipeline?.destroy();
|
|
32
|
+
this.textPipeline = null;
|
|
33
|
+
}
|
|
34
|
+
/** Background layer: painted before the 3D line overlays. */
|
|
35
|
+
drawFills(pass, viewProj) {
|
|
36
|
+
if (this.fillPipeline?.hasGeometry()) {
|
|
37
|
+
this.fillPipeline.render(pass, viewProj);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Label layer: painted after everything else. */
|
|
41
|
+
drawTexts(pass, viewProj, canvasWidth, canvasHeight, camera) {
|
|
42
|
+
if (!this.textPipeline?.hasGeometry())
|
|
43
|
+
return;
|
|
44
|
+
// Pass viewport pixel dimensions so the shader can scale glyphs
|
|
45
|
+
// to a constant on-screen size (BIMvision-style annotations)
|
|
46
|
+
// regardless of camera distance or authored text height.
|
|
47
|
+
//
|
|
48
|
+
// Also pass the screen-aligned camera basis (right, up) so
|
|
49
|
+
// billboarded glyphs (grid bubble tags) can face the camera
|
|
50
|
+
// in any orientation — top-down, eye-level, oblique alike.
|
|
51
|
+
//
|
|
52
|
+
// `viewBasis` rather than a local `cross(forward, up)` (#2489): this
|
|
53
|
+
// used to be a third independent derivation of the same basis the
|
|
54
|
+
// view matrix is built from, and like the unprojection ray's copy
|
|
55
|
+
// that #2467 removed it disagreed with `lookAt` about every
|
|
56
|
+
// degenerate pose. It guarded the two divisors with `|| 1` but not
|
|
57
|
+
// the numerators, so an infinite or NaN coordinate anywhere in the
|
|
58
|
+
// pose produced NaN axes; and for the two *finite* degeneracies —
|
|
59
|
+
// `eye === target`, and an `up` parallel to the view direction (a
|
|
60
|
+
// plan pose, or a restored BCF viewpoint) — it produced a zero-length
|
|
61
|
+
// right/up, which collapses every glyph quad to a point. Both are
|
|
62
|
+
// exactly the cases `viewBasis` substitutes a deterministic hint for,
|
|
63
|
+
// and taking that substitute is what makes the labels billboard
|
|
64
|
+
// against the basis the frame was actually drawn with.
|
|
65
|
+
//
|
|
66
|
+
// Only `right`/`up` are read here: a screen-aligned quad needs the
|
|
67
|
+
// screen plane, not the view direction.
|
|
68
|
+
const basis = viewBasis(camera.getPosition(), camera.getTarget(), camera.getUp());
|
|
69
|
+
this.textPipeline.render(pass, viewProj, canvasWidth, canvasHeight, [basis.right.x, basis.right.y, basis.right.z], [basis.up.x, basis.up.y, basis.up.z]);
|
|
70
|
+
}
|
|
71
|
+
/** See `Renderer.uploadAnnotationFills3D` for the published contract. */
|
|
72
|
+
uploadFills(fills) {
|
|
73
|
+
if (!this.fillPipeline)
|
|
74
|
+
return;
|
|
75
|
+
this.fillPipeline.upload(fills);
|
|
76
|
+
// Contribute fill extents to modelBounds — see uploadAnnotationLines3D.
|
|
77
|
+
for (const fill of fills) {
|
|
78
|
+
const pts = fill.points;
|
|
79
|
+
if (pts.length === 0)
|
|
80
|
+
continue;
|
|
81
|
+
// points are flat [x,z,x,z,...]; lift to (x, fill.worldY, z) per
|
|
82
|
+
// vertex so we expand bounds in the same world space the renderer draws in.
|
|
83
|
+
const lifted = new Float32Array((pts.length / 2) * 3);
|
|
84
|
+
for (let i = 0, j = 0; i < pts.length; i += 2, j += 3) {
|
|
85
|
+
lifted[j] = pts[i];
|
|
86
|
+
lifted[j + 1] = fill.worldY;
|
|
87
|
+
lifted[j + 2] = pts[i + 1];
|
|
88
|
+
}
|
|
89
|
+
this.host.expandModelBoundsWithFlatVertices(lifted, 3);
|
|
90
|
+
}
|
|
91
|
+
this.host.syncCameraSceneBounds();
|
|
92
|
+
this.host.requestRender();
|
|
93
|
+
}
|
|
94
|
+
/** See `Renderer.uploadAnnotationTexts3D` for the published contract. */
|
|
95
|
+
uploadTexts(texts) {
|
|
96
|
+
if (!this.textPipeline)
|
|
97
|
+
return;
|
|
98
|
+
this.textPipeline.upload(texts);
|
|
99
|
+
// Text origins are single points; pack them into a flat buffer and
|
|
100
|
+
// expand bounds. Glyph extents are small enough that origin-only
|
|
101
|
+
// suffices for framing.
|
|
102
|
+
if (texts.length > 0) {
|
|
103
|
+
const buf = new Float32Array(texts.length * 3);
|
|
104
|
+
for (let i = 0; i < texts.length; i++) {
|
|
105
|
+
buf[i * 3 + 0] = texts[i].worldPos[0];
|
|
106
|
+
buf[i * 3 + 1] = texts[i].worldPos[1];
|
|
107
|
+
buf[i * 3 + 2] = texts[i].worldPos[2];
|
|
108
|
+
}
|
|
109
|
+
this.host.expandModelBoundsWithFlatVertices(buf, 3);
|
|
110
|
+
this.host.syncCameraSceneBounds();
|
|
111
|
+
}
|
|
112
|
+
this.host.requestRender();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=renderer-symbolic-overlays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer-symbolic-overlays.js","sourceRoot":"","sources":["../src/renderer-symbolic-overlays.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAgB/D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACH,oBAAoB,EACpB,oBAAoB,GAGvB,MAAM,iCAAiC,CAAC;AAazC,MAAM,OAAO,gBAAgB;IAII;IAHrB,YAAY,GAAgC,IAAI,CAAC;IACjD,YAAY,GAAgC,IAAI,CAAC;IAEzD,YAA6B,IAAyB;QAAzB,SAAI,GAAJ,IAAI,CAAqB;IAAG,CAAC;IAE1D;;;;;OAKG;IACH,IAAI,CAAC,MAAiB,EAAE,MAAwB,EAAE,WAAmB;QACjE,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC1E,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC9E,CAAC;IAED;;;;OAIG;IACH,OAAO;QACH,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,6DAA6D;IAC7D,SAAS,CAAC,IAA0B,EAAE,QAAsB;QACxD,IAAI,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IAED,kDAAkD;IAClD,SAAS,CACL,IAA0B,EAC1B,QAAsB,EACtB,WAAmB,EACnB,YAAoB,EACpB,MAAc;QAEd,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE;YAAE,OAAO;QAC9C,gEAAgE;QAChE,6DAA6D;QAC7D,yDAAyD;QACzD,EAAE;QACF,2DAA2D;QAC3D,4DAA4D;QAC5D,2DAA2D;QAC3D,EAAE;QACF,qEAAqE;QACrE,kEAAkE;QAClE,kEAAkE;QAClE,4DAA4D;QAC5D,mEAAmE;QACnE,mEAAmE;QACnE,kEAAkE;QAClE,kEAAkE;QAClE,sEAAsE;QACtE,kEAAkE;QAClE,sEAAsE;QACtE,gEAAgE;QAChE,uDAAuD;QACvD,EAAE;QACF,mEAAmE;QACnE,wCAAwC;QACxC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,YAAY,CAAC,MAAM,CACpB,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAC7C,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CACvC,CAAC;IACN,CAAC;IAED,yEAAyE;IACzE,WAAW,CAAC,KAAmC;QAC3C,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAC/B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,wEAAwE;QACxE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;YACxB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC/B,iEAAiE;YACjE,4EAA4E;YAC5E,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpD,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACnB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC5B,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAED,yEAAyE;IACzE,WAAW,CAAC,KAAmC;QAC3C,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAC/B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,mEAAmE;QACnE,iEAAiE;QACjE,wBAAwB;QACxB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACtC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACtC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;CACJ"}
|
package/dist/scene-geometry.d.ts
CHANGED
|
@@ -5,6 +5,38 @@
|
|
|
5
5
|
* No dependency on Scene internal state or GPU device.
|
|
6
6
|
*/
|
|
7
7
|
import type { MeshData } from '@ifc-lite/geometry';
|
|
8
|
+
import type { BoundingBox } from './scene-raycaster.js';
|
|
9
|
+
/** The subset of `MeshData` a world-space AABB needs. */
|
|
10
|
+
export interface AabbPiece {
|
|
11
|
+
positions: Float32Array;
|
|
12
|
+
origin?: [number, number, number];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* World-space AABB over an entity's mesh pieces, or `null` when they contain
|
|
16
|
+
* no vertex a box can be built from (issue #2480).
|
|
17
|
+
*
|
|
18
|
+
* Three copies of this loop lived in `Scene` — `getEntityBoundingBox`,
|
|
19
|
+
* `finishEphemeralStreaming` and `releaseGeometryData` — and all three seeded
|
|
20
|
+
* `±Infinity` and returned whatever the seed was left as. That is the correct
|
|
21
|
+
* identity value for a min/max *accumulation*, and `ModelBoundsTracker` still
|
|
22
|
+
* uses it that way deliberately, but it is not a correct *answer*: a piece
|
|
23
|
+
* with a zero-length positions array made `getEntityBoundingBox` compute — and
|
|
24
|
+
* **cache** — `{ min: +Infinity, max: -Infinity }` for a real entity, which
|
|
25
|
+
* then poisoned the entry for good even after the entity gained real geometry
|
|
26
|
+
* (the cache has no invalidation tied to that).
|
|
27
|
+
*
|
|
28
|
+
* `null` is the answer the class already gives for "this entity has no
|
|
29
|
+
* geometry", and `Scene.getBounds()` — the sibling accumulation over the very
|
|
30
|
+
* same `meshDataMap` — has always screened each vertex with `Number.isFinite`
|
|
31
|
+
* and returned `null` when none survived. This brings the per-entity path in
|
|
32
|
+
* line with the whole-scene one rather than inventing a new contract.
|
|
33
|
+
*
|
|
34
|
+
* Non-finite vertices are skipped rather than poisoning the box, for the same
|
|
35
|
+
* reason: #1645 records NaN placement matrices as a real input class, and one
|
|
36
|
+
* infinite coordinate would otherwise widen the entity's box to infinity and
|
|
37
|
+
* hand that to the camera, raycaster and clash consumers alike.
|
|
38
|
+
*/
|
|
39
|
+
export declare function worldAabbFromPieces(pieces: readonly AabbPiece[] | undefined): BoundingBox | null;
|
|
8
40
|
/**
|
|
9
41
|
* Per-vertex z-nudge salt (issue: lens/overlay colouring).
|
|
10
42
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-geometry.d.ts","sourceRoot":"","sources":["../src/scene-geometry.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"scene-geometry.d.ts","sourceRoot":"","sources":["../src/scene-geometry.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,yDAAyD;AACzD,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,GAAG,WAAW,GAAG,IAAI,CAkChG;AAKD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,MAAM,CAStE;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,QAAQ,EAAE,EASzB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACtC;IACD,UAAU,EAAE,YAAY,CAAC;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE;QAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IACzE;;qEAEiE;IACjE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAsGA;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,QAAQ,EAAE,EAAE,CA6C1G"}
|
package/dist/scene-geometry.js
CHANGED
|
@@ -2,6 +2,72 @@
|
|
|
2
2
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
import { BATCH_CONSTANTS } from './constants.js';
|
|
5
|
+
/**
|
|
6
|
+
* World-space AABB over an entity's mesh pieces, or `null` when they contain
|
|
7
|
+
* no vertex a box can be built from (issue #2480).
|
|
8
|
+
*
|
|
9
|
+
* Three copies of this loop lived in `Scene` — `getEntityBoundingBox`,
|
|
10
|
+
* `finishEphemeralStreaming` and `releaseGeometryData` — and all three seeded
|
|
11
|
+
* `±Infinity` and returned whatever the seed was left as. That is the correct
|
|
12
|
+
* identity value for a min/max *accumulation*, and `ModelBoundsTracker` still
|
|
13
|
+
* uses it that way deliberately, but it is not a correct *answer*: a piece
|
|
14
|
+
* with a zero-length positions array made `getEntityBoundingBox` compute — and
|
|
15
|
+
* **cache** — `{ min: +Infinity, max: -Infinity }` for a real entity, which
|
|
16
|
+
* then poisoned the entry for good even after the entity gained real geometry
|
|
17
|
+
* (the cache has no invalidation tied to that).
|
|
18
|
+
*
|
|
19
|
+
* `null` is the answer the class already gives for "this entity has no
|
|
20
|
+
* geometry", and `Scene.getBounds()` — the sibling accumulation over the very
|
|
21
|
+
* same `meshDataMap` — has always screened each vertex with `Number.isFinite`
|
|
22
|
+
* and returned `null` when none survived. This brings the per-entity path in
|
|
23
|
+
* line with the whole-scene one rather than inventing a new contract.
|
|
24
|
+
*
|
|
25
|
+
* Non-finite vertices are skipped rather than poisoning the box, for the same
|
|
26
|
+
* reason: #1645 records NaN placement matrices as a real input class, and one
|
|
27
|
+
* infinite coordinate would otherwise widen the entity's box to infinity and
|
|
28
|
+
* hand that to the camera, raycaster and clash consumers alike.
|
|
29
|
+
*/
|
|
30
|
+
export function worldAabbFromPieces(pieces) {
|
|
31
|
+
if (!pieces || pieces.length === 0)
|
|
32
|
+
return null;
|
|
33
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
34
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
35
|
+
let hasValidData = false;
|
|
36
|
+
for (const piece of pieces) {
|
|
37
|
+
const positions = piece.positions;
|
|
38
|
+
// world = origin + position (per-element local frame); origin absent or
|
|
39
|
+
// [0,0,0] for legacy absolute meshes.
|
|
40
|
+
const ox = piece.origin ? piece.origin[0] : 0;
|
|
41
|
+
const oy = piece.origin ? piece.origin[1] : 0;
|
|
42
|
+
const oz = piece.origin ? piece.origin[2] : 0;
|
|
43
|
+
for (let i = 0; i + 2 < positions.length; i += 3) {
|
|
44
|
+
const x = positions[i] + ox;
|
|
45
|
+
const y = positions[i + 1] + oy;
|
|
46
|
+
const z = positions[i + 2] + oz;
|
|
47
|
+
if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z))
|
|
48
|
+
continue;
|
|
49
|
+
hasValidData = true;
|
|
50
|
+
if (x < minX)
|
|
51
|
+
minX = x;
|
|
52
|
+
if (y < minY)
|
|
53
|
+
minY = y;
|
|
54
|
+
if (z < minZ)
|
|
55
|
+
minZ = z;
|
|
56
|
+
if (x > maxX)
|
|
57
|
+
maxX = x;
|
|
58
|
+
if (y > maxY)
|
|
59
|
+
maxY = y;
|
|
60
|
+
if (z > maxZ)
|
|
61
|
+
maxZ = z;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!hasValidData)
|
|
65
|
+
return null;
|
|
66
|
+
return {
|
|
67
|
+
min: { x: minX, y: minY, z: minZ },
|
|
68
|
+
max: { x: maxX, y: maxY, z: maxZ },
|
|
69
|
+
};
|
|
70
|
+
}
|
|
5
71
|
const MAX_ENCODED_ENTITY_ID = 0xFFFFFF;
|
|
6
72
|
let warnedEntityIdRange = false;
|
|
7
73
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-geometry.js","sourceRoot":"","sources":["../src/scene-geometry.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAU/D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"scene-geometry.js","sourceRoot":"","sources":["../src/scene-geometry.ts"],"names":[],"mappings":"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"}
|