@ifc-lite/renderer 1.17.0 → 1.20.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/deviation/deviation-pipeline.d.ts +48 -0
- package/dist/deviation/deviation-pipeline.d.ts.map +1 -0
- package/dist/deviation/deviation-pipeline.js +163 -0
- package/dist/deviation/deviation-pipeline.js.map +1 -0
- package/dist/deviation/deviation-shader.wgsl.d.ts +23 -0
- package/dist/deviation/deviation-shader.wgsl.d.ts.map +1 -0
- package/dist/deviation/deviation-shader.wgsl.js +237 -0
- package/dist/deviation/deviation-shader.wgsl.js.map +1 -0
- package/dist/deviation/triangle-bvh.d.ts +58 -0
- package/dist/deviation/triangle-bvh.d.ts.map +1 -0
- package/dist/deviation/triangle-bvh.js +255 -0
- package/dist/deviation/triangle-bvh.js.map +1 -0
- package/dist/device.d.ts +3 -0
- package/dist/device.d.ts.map +1 -1
- package/dist/device.js +10 -0
- package/dist/device.js.map +1 -1
- package/dist/edl-pass.d.ts +52 -0
- package/dist/edl-pass.d.ts.map +1 -0
- package/dist/edl-pass.js +204 -0
- package/dist/edl-pass.js.map +1 -0
- package/dist/index.d.ts +175 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +676 -110
- package/dist/index.js.map +1 -1
- package/dist/picker.d.ts +40 -3
- package/dist/picker.d.ts.map +1 -1
- package/dist/picker.js +211 -59
- package/dist/picker.js.map +1 -1
- package/dist/picking-manager.d.ts +32 -1
- package/dist/picking-manager.d.ts.map +1 -1
- package/dist/picking-manager.js +53 -1
- package/dist/picking-manager.js.map +1 -1
- package/dist/point-picker.d.ts +61 -0
- package/dist/point-picker.d.ts.map +1 -0
- package/dist/point-picker.js +223 -0
- package/dist/point-picker.js.map +1 -0
- package/dist/pointcloud/point-cloud-node.d.ts +63 -0
- package/dist/pointcloud/point-cloud-node.d.ts.map +1 -0
- package/dist/pointcloud/point-cloud-node.js +149 -0
- package/dist/pointcloud/point-cloud-node.js.map +1 -0
- package/dist/pointcloud/point-cloud-renderer.d.ts +166 -0
- package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -0
- package/dist/pointcloud/point-cloud-renderer.js +293 -0
- package/dist/pointcloud/point-cloud-renderer.js.map +1 -0
- package/dist/pointcloud/point-cloud-uniforms.d.ts +36 -0
- package/dist/pointcloud/point-cloud-uniforms.d.ts.map +1 -0
- package/dist/pointcloud/point-cloud-uniforms.js +89 -0
- package/dist/pointcloud/point-cloud-uniforms.js.map +1 -0
- package/dist/pointcloud/point-pipeline.d.ts +27 -0
- package/dist/pointcloud/point-pipeline.d.ts.map +1 -0
- package/dist/pointcloud/point-pipeline.js +126 -0
- package/dist/pointcloud/point-pipeline.js.map +1 -0
- package/dist/pointcloud/point-shader.wgsl.d.ts +22 -0
- package/dist/pointcloud/point-shader.wgsl.d.ts.map +1 -0
- package/dist/pointcloud/point-shader.wgsl.js +288 -0
- package/dist/pointcloud/point-shader.wgsl.js.map +1 -0
- package/dist/scene.d.ts +11 -0
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +21 -0
- package/dist/scene.js.map +1 -1
- package/dist/section-2d-overlay.d.ts +24 -5
- package/dist/section-2d-overlay.d.ts.map +1 -1
- package/dist/section-2d-overlay.js +42 -13
- package/dist/section-2d-overlay.js.map +1 -1
- package/dist/section-plane-basis.d.ts +64 -0
- package/dist/section-plane-basis.d.ts.map +1 -0
- package/dist/section-plane-basis.js +86 -0
- package/dist/section-plane-basis.js.map +1 -0
- package/dist/section-plane.d.ts +18 -0
- package/dist/section-plane.d.ts.map +1 -1
- package/dist/section-plane.js +89 -6
- package/dist/section-plane.js.map +1 -1
- package/dist/types.d.ts +35 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,255 @@
|
|
|
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
|
+
/** High bit of the u32-packed slot 3 marks a leaf node. */
|
|
5
|
+
const LEAF_FLAG = 0x80000000;
|
|
6
|
+
/**
|
|
7
|
+
* Build the per-triangle BVH.
|
|
8
|
+
*
|
|
9
|
+
* Splits leaves until each holds at most `maxTrisPerLeaf` triangles
|
|
10
|
+
* (default 16, balancing tree depth vs. per-leaf work). Median split
|
|
11
|
+
* along the longest AABB axis — fast O(n log n) build, no SAH for v1.
|
|
12
|
+
*
|
|
13
|
+
* For typical BIMs (1M triangles) the build runs in ~1–3 seconds on
|
|
14
|
+
* the main thread. Acceptable since it only re-runs when the mesh
|
|
15
|
+
* set changes (load / federation update).
|
|
16
|
+
*/
|
|
17
|
+
export function buildTriangleBVH(meshes, options = {}) {
|
|
18
|
+
const maxTrisPerLeaf = options.maxTrisPerLeaf ?? 16;
|
|
19
|
+
// Pass 1: flatten meshes into a triangle list with precomputed
|
|
20
|
+
// centroids + AABBs. This array stays in CPU memory only long
|
|
21
|
+
// enough to drive the build; the final output is a packed Float32
|
|
22
|
+
// buffer suitable for GPU upload.
|
|
23
|
+
const triCount = countTriangles(meshes);
|
|
24
|
+
const triBuf = new Float32Array(triCount * 12);
|
|
25
|
+
const centroids = new Float32Array(triCount * 3);
|
|
26
|
+
const triAabb = new Float32Array(triCount * 6); // min(x,y,z) + max(x,y,z)
|
|
27
|
+
let triIndex = 0;
|
|
28
|
+
let bxMin = Infinity, byMin = Infinity, bzMin = Infinity;
|
|
29
|
+
let bxMax = -Infinity, byMax = -Infinity, bzMax = -Infinity;
|
|
30
|
+
for (const mesh of meshes) {
|
|
31
|
+
const positions = mesh.positions;
|
|
32
|
+
const indices = mesh.indices;
|
|
33
|
+
if (!positions || positions.length === 0)
|
|
34
|
+
continue;
|
|
35
|
+
const n = indices ? indices.length : positions.length / 3;
|
|
36
|
+
for (let i = 0; i + 2 < n; i += 3) {
|
|
37
|
+
const i0 = indices ? indices[i] * 3 : (i) * 3;
|
|
38
|
+
const i1 = indices ? indices[i + 1] * 3 : (i + 1) * 3;
|
|
39
|
+
const i2 = indices ? indices[i + 2] * 3 : (i + 2) * 3;
|
|
40
|
+
const x0 = positions[i0], y0 = positions[i0 + 1], z0 = positions[i0 + 2];
|
|
41
|
+
const x1 = positions[i1], y1 = positions[i1 + 1], z1 = positions[i1 + 2];
|
|
42
|
+
const x2 = positions[i2], y2 = positions[i2 + 1], z2 = positions[i2 + 2];
|
|
43
|
+
const off = triIndex * 12;
|
|
44
|
+
triBuf[off] = x0;
|
|
45
|
+
triBuf[off + 1] = y0;
|
|
46
|
+
triBuf[off + 2] = z0;
|
|
47
|
+
triBuf[off + 3] = x1;
|
|
48
|
+
triBuf[off + 4] = y1;
|
|
49
|
+
triBuf[off + 5] = z1;
|
|
50
|
+
triBuf[off + 6] = x2;
|
|
51
|
+
triBuf[off + 7] = y2;
|
|
52
|
+
triBuf[off + 8] = z2;
|
|
53
|
+
// Face normal — cross((v1-v0), (v2-v0)), normalised.
|
|
54
|
+
const ex = x1 - x0, ey = y1 - y0, ez = z1 - z0;
|
|
55
|
+
const fx = x2 - x0, fy = y2 - y0, fz = z2 - z0;
|
|
56
|
+
let nx = ey * fz - ez * fy;
|
|
57
|
+
let ny = ez * fx - ex * fz;
|
|
58
|
+
let nz = ex * fy - ey * fx;
|
|
59
|
+
const len = Math.hypot(nx, ny, nz);
|
|
60
|
+
if (len > 1e-12) {
|
|
61
|
+
nx /= len;
|
|
62
|
+
ny /= len;
|
|
63
|
+
nz /= len;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Degenerate triangle (zero area) — keep a default so we
|
|
67
|
+
// don't poison the GPU with NaN. Sign on these is meaningless.
|
|
68
|
+
nx = 0;
|
|
69
|
+
ny = 1;
|
|
70
|
+
nz = 0;
|
|
71
|
+
}
|
|
72
|
+
triBuf[off + 9] = nx;
|
|
73
|
+
triBuf[off + 10] = ny;
|
|
74
|
+
triBuf[off + 11] = nz;
|
|
75
|
+
// Centroid + AABB for the BVH builder.
|
|
76
|
+
const cx = (x0 + x1 + x2) / 3;
|
|
77
|
+
const cy = (y0 + y1 + y2) / 3;
|
|
78
|
+
const cz = (z0 + z1 + z2) / 3;
|
|
79
|
+
centroids[triIndex * 3] = cx;
|
|
80
|
+
centroids[triIndex * 3 + 1] = cy;
|
|
81
|
+
centroids[triIndex * 3 + 2] = cz;
|
|
82
|
+
const tMinX = Math.min(x0, x1, x2);
|
|
83
|
+
const tMinY = Math.min(y0, y1, y2);
|
|
84
|
+
const tMinZ = Math.min(z0, z1, z2);
|
|
85
|
+
const tMaxX = Math.max(x0, x1, x2);
|
|
86
|
+
const tMaxY = Math.max(y0, y1, y2);
|
|
87
|
+
const tMaxZ = Math.max(z0, z1, z2);
|
|
88
|
+
triAabb[triIndex * 6] = tMinX;
|
|
89
|
+
triAabb[triIndex * 6 + 1] = tMinY;
|
|
90
|
+
triAabb[triIndex * 6 + 2] = tMinZ;
|
|
91
|
+
triAabb[triIndex * 6 + 3] = tMaxX;
|
|
92
|
+
triAabb[triIndex * 6 + 4] = tMaxY;
|
|
93
|
+
triAabb[triIndex * 6 + 5] = tMaxZ;
|
|
94
|
+
if (tMinX < bxMin)
|
|
95
|
+
bxMin = tMinX;
|
|
96
|
+
if (tMinY < byMin)
|
|
97
|
+
byMin = tMinY;
|
|
98
|
+
if (tMinZ < bzMin)
|
|
99
|
+
bzMin = tMinZ;
|
|
100
|
+
if (tMaxX > bxMax)
|
|
101
|
+
bxMax = tMaxX;
|
|
102
|
+
if (tMaxY > byMax)
|
|
103
|
+
byMax = tMaxY;
|
|
104
|
+
if (tMaxZ > bzMax)
|
|
105
|
+
bzMax = tMaxZ;
|
|
106
|
+
triIndex++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Build a permutation: tris[outOrder[k]] is the k-th triangle in
|
|
110
|
+
// the BVH layout. The final emit re-orders `triBuf` in place via
|
|
111
|
+
// a temporary copy so leaves can store [start, count) ranges
|
|
112
|
+
// instead of an index list.
|
|
113
|
+
const outOrder = new Uint32Array(triIndex);
|
|
114
|
+
for (let i = 0; i < triIndex; i++)
|
|
115
|
+
outOrder[i] = i;
|
|
116
|
+
// Allocate node buffer with worst-case size: 2N - 1 nodes for N
|
|
117
|
+
// leaves (binary tree). Trim at the end.
|
|
118
|
+
const maxNodes = Math.max(1, 2 * triIndex - 1);
|
|
119
|
+
const nodes = new Float32Array(maxNodes * 8);
|
|
120
|
+
const nodesU32 = new Uint32Array(nodes.buffer);
|
|
121
|
+
let nodeCursor = 0;
|
|
122
|
+
const allocNode = () => {
|
|
123
|
+
const idx = nodeCursor++;
|
|
124
|
+
return idx;
|
|
125
|
+
};
|
|
126
|
+
const setNodeAabb = (nodeIdx, mn, mx) => {
|
|
127
|
+
const off = nodeIdx * 8;
|
|
128
|
+
nodes[off] = mn[0];
|
|
129
|
+
nodes[off + 1] = mn[1];
|
|
130
|
+
nodes[off + 2] = mn[2];
|
|
131
|
+
nodes[off + 4] = mx[0];
|
|
132
|
+
nodes[off + 5] = mx[1];
|
|
133
|
+
nodes[off + 6] = mx[2];
|
|
134
|
+
};
|
|
135
|
+
const setLeaf = (nodeIdx, triStart, triCount) => {
|
|
136
|
+
const off = nodeIdx * 8;
|
|
137
|
+
// High bit set on slot 3 marks "leaf"; remaining 31 bits hold start index.
|
|
138
|
+
nodesU32[off + 3] = LEAF_FLAG | (triStart >>> 0);
|
|
139
|
+
nodesU32[off + 7] = triCount >>> 0;
|
|
140
|
+
};
|
|
141
|
+
const setInternal = (nodeIdx, leftIdx, rightIdx) => {
|
|
142
|
+
const off = nodeIdx * 8;
|
|
143
|
+
nodesU32[off + 3] = leftIdx >>> 0;
|
|
144
|
+
nodesU32[off + 7] = rightIdx >>> 0;
|
|
145
|
+
};
|
|
146
|
+
const stack = [];
|
|
147
|
+
if (triIndex > 0) {
|
|
148
|
+
stack.push({ start: 0, end: triIndex, nodeIdx: allocNode() });
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// Empty BVH — single zero-bound leaf so traversal can early-out.
|
|
152
|
+
allocNode();
|
|
153
|
+
setNodeAabb(0, [0, 0, 0], [0, 0, 0]);
|
|
154
|
+
setLeaf(0, 0, 0);
|
|
155
|
+
}
|
|
156
|
+
while (stack.length > 0) {
|
|
157
|
+
const frame = stack.pop();
|
|
158
|
+
const { start, end, nodeIdx } = frame;
|
|
159
|
+
const count = end - start;
|
|
160
|
+
// Compute AABB across the range.
|
|
161
|
+
let nMinX = Infinity, nMinY = Infinity, nMinZ = Infinity;
|
|
162
|
+
let nMaxX = -Infinity, nMaxY = -Infinity, nMaxZ = -Infinity;
|
|
163
|
+
let cMinX = Infinity, cMinY = Infinity, cMinZ = Infinity;
|
|
164
|
+
let cMaxX = -Infinity, cMaxY = -Infinity, cMaxZ = -Infinity;
|
|
165
|
+
for (let k = start; k < end; k++) {
|
|
166
|
+
const t = outOrder[k];
|
|
167
|
+
const aOff = t * 6;
|
|
168
|
+
const cOff = t * 3;
|
|
169
|
+
if (triAabb[aOff] < nMinX)
|
|
170
|
+
nMinX = triAabb[aOff];
|
|
171
|
+
if (triAabb[aOff + 1] < nMinY)
|
|
172
|
+
nMinY = triAabb[aOff + 1];
|
|
173
|
+
if (triAabb[aOff + 2] < nMinZ)
|
|
174
|
+
nMinZ = triAabb[aOff + 2];
|
|
175
|
+
if (triAabb[aOff + 3] > nMaxX)
|
|
176
|
+
nMaxX = triAabb[aOff + 3];
|
|
177
|
+
if (triAabb[aOff + 4] > nMaxY)
|
|
178
|
+
nMaxY = triAabb[aOff + 4];
|
|
179
|
+
if (triAabb[aOff + 5] > nMaxZ)
|
|
180
|
+
nMaxZ = triAabb[aOff + 5];
|
|
181
|
+
if (centroids[cOff] < cMinX)
|
|
182
|
+
cMinX = centroids[cOff];
|
|
183
|
+
if (centroids[cOff + 1] < cMinY)
|
|
184
|
+
cMinY = centroids[cOff + 1];
|
|
185
|
+
if (centroids[cOff + 2] < cMinZ)
|
|
186
|
+
cMinZ = centroids[cOff + 2];
|
|
187
|
+
if (centroids[cOff] > cMaxX)
|
|
188
|
+
cMaxX = centroids[cOff];
|
|
189
|
+
if (centroids[cOff + 1] > cMaxY)
|
|
190
|
+
cMaxY = centroids[cOff + 1];
|
|
191
|
+
if (centroids[cOff + 2] > cMaxZ)
|
|
192
|
+
cMaxZ = centroids[cOff + 2];
|
|
193
|
+
}
|
|
194
|
+
setNodeAabb(nodeIdx, [nMinX, nMinY, nMinZ], [nMaxX, nMaxY, nMaxZ]);
|
|
195
|
+
// Stop splitting when we hit the leaf threshold.
|
|
196
|
+
if (count <= maxTrisPerLeaf) {
|
|
197
|
+
setLeaf(nodeIdx, start, count);
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
// Pick the longest centroid-bbox axis and median-split.
|
|
201
|
+
const dx = cMaxX - cMinX, dy = cMaxY - cMinY, dz = cMaxZ - cMinZ;
|
|
202
|
+
const axis = (dx > dy && dx > dz) ? 0 : (dy > dz ? 1 : 2);
|
|
203
|
+
// Quickselect-ish median split: in-place sort of `outOrder[start:end]`
|
|
204
|
+
// by centroid on the chosen axis. JS Array.sort is good enough here.
|
|
205
|
+
const slice = Array.from(outOrder.subarray(start, end));
|
|
206
|
+
slice.sort((a, b) => centroids[a * 3 + axis] - centroids[b * 3 + axis]);
|
|
207
|
+
for (let i = 0; i < slice.length; i++)
|
|
208
|
+
outOrder[start + i] = slice[i];
|
|
209
|
+
const mid = start + (count >> 1);
|
|
210
|
+
if (mid === start || mid === end) {
|
|
211
|
+
// Centroid degeneracy → can't split, fall back to leaf even
|
|
212
|
+
// though it exceeds the threshold. Rare in practice.
|
|
213
|
+
setLeaf(nodeIdx, start, count);
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
const leftIdx = allocNode();
|
|
217
|
+
const rightIdx = allocNode();
|
|
218
|
+
setInternal(nodeIdx, leftIdx, rightIdx);
|
|
219
|
+
// Right first, left second → left popped first → DFS left-leaning.
|
|
220
|
+
stack.push({ start: mid, end, nodeIdx: rightIdx });
|
|
221
|
+
stack.push({ start, end: mid, nodeIdx: leftIdx });
|
|
222
|
+
}
|
|
223
|
+
// Emit triangles in BVH order so leaves can store [start, count).
|
|
224
|
+
const reordered = new Float32Array(triIndex * 12);
|
|
225
|
+
for (let k = 0; k < triIndex; k++) {
|
|
226
|
+
const src = outOrder[k] * 12;
|
|
227
|
+
const dst = k * 12;
|
|
228
|
+
for (let i = 0; i < 12; i++)
|
|
229
|
+
reordered[dst + i] = triBuf[src + i];
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
nodes: nodes.subarray(0, nodeCursor * 8),
|
|
233
|
+
triangles: reordered,
|
|
234
|
+
triangleCount: triIndex,
|
|
235
|
+
nodeCount: nodeCursor,
|
|
236
|
+
meshCount: meshes.length,
|
|
237
|
+
bounds: {
|
|
238
|
+
min: triIndex > 0 ? [bxMin, byMin, bzMin] : [0, 0, 0],
|
|
239
|
+
max: triIndex > 0 ? [bxMax, byMax, bzMax] : [0, 0, 0],
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function countTriangles(meshes) {
|
|
244
|
+
let count = 0;
|
|
245
|
+
for (const mesh of meshes) {
|
|
246
|
+
const positions = mesh.positions;
|
|
247
|
+
if (!positions || positions.length === 0)
|
|
248
|
+
continue;
|
|
249
|
+
const indices = mesh.indices;
|
|
250
|
+
const n = indices ? indices.length : positions.length / 3;
|
|
251
|
+
count += Math.floor(n / 3);
|
|
252
|
+
}
|
|
253
|
+
return count;
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=triangle-bvh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triangle-bvh.js","sourceRoot":"","sources":["../../src/deviation/triangle-bvh.ts"],"names":[],"mappings":"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"}
|
package/dist/device.d.ts
CHANGED
|
@@ -11,6 +11,9 @@ export declare class WebGPUDevice {
|
|
|
11
11
|
private lastHeight;
|
|
12
12
|
private contextConfigured;
|
|
13
13
|
private frameCount;
|
|
14
|
+
/** Async GPU validation errors (not caught by try-catch) */
|
|
15
|
+
_uncapturedErrorCount: number;
|
|
16
|
+
_lastUncapturedError: string;
|
|
14
17
|
/**
|
|
15
18
|
* Initialize WebGPU device and canvas context
|
|
16
19
|
*/
|
package/dist/device.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,UAAU,CAAa;
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,UAAU,CAAa;IAC/B,4DAA4D;IAC5D,qBAAqB,EAAE,MAAM,CAAK;IAClC,oBAAoB,EAAE,MAAM,CAAM;IAElC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCpD;;;OAGG;IACH,gBAAgB,IAAI,IAAI;IAoBxB;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAM3B;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAIzB;;;OAGG;IACH,aAAa,IAAI,OAAO;IAWxB;;;OAGG;IACH,iBAAiB,IAAI,UAAU,GAAG,IAAI;IAgBtC,SAAS,IAAI,SAAS;IAOtB,UAAU,IAAI,gBAAgB;IAO9B,SAAS,IAAI,gBAAgB;IAI7B,aAAa,IAAI,OAAO;CAGzB"}
|
package/dist/device.js
CHANGED
|
@@ -14,6 +14,9 @@ export class WebGPUDevice {
|
|
|
14
14
|
lastHeight = 0;
|
|
15
15
|
contextConfigured = false;
|
|
16
16
|
frameCount = 0;
|
|
17
|
+
/** Async GPU validation errors (not caught by try-catch) */
|
|
18
|
+
_uncapturedErrorCount = 0;
|
|
19
|
+
_lastUncapturedError = '';
|
|
17
20
|
/**
|
|
18
21
|
* Initialize WebGPU device and canvas context
|
|
19
22
|
*/
|
|
@@ -32,6 +35,13 @@ export class WebGPUDevice {
|
|
|
32
35
|
if (!this.context) {
|
|
33
36
|
throw new Error('Failed to get WebGPU context');
|
|
34
37
|
}
|
|
38
|
+
// Capture async GPU errors (validation errors from submit() are async)
|
|
39
|
+
this.device.onuncapturederror = (event) => {
|
|
40
|
+
const msg = event.error?.message ?? String(event);
|
|
41
|
+
console.error('[WebGPU] Uncaptured error:', msg);
|
|
42
|
+
this._lastUncapturedError = msg;
|
|
43
|
+
this._uncapturedErrorCount++;
|
|
44
|
+
};
|
|
35
45
|
// Handle device lost - mark context as needing reconfiguration
|
|
36
46
|
// Use type assertion as 'lost' may not be in all WebGPU type definitions
|
|
37
47
|
const deviceWithLost = this.device;
|
package/dist/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,MAAM,OAAO,YAAY;IACf,OAAO,GAAsB,IAAI,CAAC;IAClC,MAAM,GAAqB,IAAI,CAAC;IAChC,OAAO,GAA4B,IAAI,CAAC;IACxC,MAAM,GAAqB,YAAY,CAAC;IACxC,MAAM,GAA6B,IAAI,CAAC;IACxC,SAAS,GAAW,CAAC,CAAC;IACtB,UAAU,GAAW,CAAC,CAAC;IACvB,iBAAiB,GAAY,KAAK,CAAC;IACnC,UAAU,GAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../src/device.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eye-Dome Lighting (EDL) post-pass.
|
|
3
|
+
*
|
|
4
|
+
* Standard Potree-style screen-space depth shading: for each pixel, sample
|
|
5
|
+
* a few neighbouring depths at radius R, compute the mean log-depth-diff,
|
|
6
|
+
* and darken proportionally. The result is a soft black halo at silhouettes
|
|
7
|
+
* and gives un-normaled point clouds (and triangle meshes) a strong sense
|
|
8
|
+
* of depth without needing geometric normals.
|
|
9
|
+
*
|
|
10
|
+
* Costs ~9 texture taps per pixel (1 centre + 8 neighbours) at the high
|
|
11
|
+
* quality setting, ~5 at low. Cheap on any modern GPU.
|
|
12
|
+
*
|
|
13
|
+
* Render order: this should run AFTER the existing PostProcessor (which
|
|
14
|
+
* does contact / separation shading) so EDL also darkens those overlays.
|
|
15
|
+
*
|
|
16
|
+
* Reverse-Z note: the main pipeline uses depthCompare 'greater' with
|
|
17
|
+
* clearValue 0.0. So depth=1 → near plane, depth=0 → far plane. A bigger
|
|
18
|
+
* neighbour depth means the neighbour is closer; a smaller neighbour depth
|
|
19
|
+
* means it's further. We darken pixels whose neighbours are further away —
|
|
20
|
+
* i.e. silhouette edges — by clamping `max(0, log(centre) - log(neighbour))`.
|
|
21
|
+
*/
|
|
22
|
+
import { WebGPUDevice } from './device.js';
|
|
23
|
+
export interface EdlPassOptions {
|
|
24
|
+
/** Multiplier on the final darken alpha. 0..3, default 1. */
|
|
25
|
+
strength?: number;
|
|
26
|
+
/** Sample radius in pixels. 1..4, default 1. */
|
|
27
|
+
radiusPx?: number;
|
|
28
|
+
/** When true, sample 8 neighbours; when false, just 4 cardinal. */
|
|
29
|
+
highQuality?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface EdlPassApplyOptions {
|
|
32
|
+
/** Output target — typically the swap chain texture view. */
|
|
33
|
+
targetView: GPUTextureView;
|
|
34
|
+
/** Depth texture view (must be `aspect: 'depth-only'` for stencil formats). */
|
|
35
|
+
depthView: GPUTextureView;
|
|
36
|
+
}
|
|
37
|
+
export declare class EdlPass {
|
|
38
|
+
private device;
|
|
39
|
+
private colorFormat;
|
|
40
|
+
private isMultisampled;
|
|
41
|
+
private uniformBuffer;
|
|
42
|
+
private uniformStaging;
|
|
43
|
+
private bindGroupLayout;
|
|
44
|
+
private pipeline;
|
|
45
|
+
private cachedBindGroup;
|
|
46
|
+
private cachedDepthView;
|
|
47
|
+
private destroyed;
|
|
48
|
+
constructor(device: WebGPUDevice, sampleCount: number);
|
|
49
|
+
apply(encoder: GPUCommandEncoder, opts: EdlPassApplyOptions, params: Required<EdlPassOptions>): void;
|
|
50
|
+
destroy(): void;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=edl-pass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edl-pass.d.ts","sourceRoot":"","sources":["../src/edl-pass.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,UAAU,EAAE,cAAc,CAAC;IAC3B,+EAA+E;IAC/E,SAAS,EAAE,cAAc,CAAC;CAC3B;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM;IA4JrD,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,IAAI;IA+BpG,OAAO,IAAI,IAAI;CAOhB"}
|
package/dist/edl-pass.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
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
|
+
export class EdlPass {
|
|
5
|
+
device;
|
|
6
|
+
colorFormat;
|
|
7
|
+
isMultisampled;
|
|
8
|
+
uniformBuffer;
|
|
9
|
+
uniformStaging = new Float32Array(4);
|
|
10
|
+
bindGroupLayout;
|
|
11
|
+
pipeline;
|
|
12
|
+
cachedBindGroup = null;
|
|
13
|
+
cachedDepthView = null;
|
|
14
|
+
destroyed = false;
|
|
15
|
+
constructor(device, sampleCount) {
|
|
16
|
+
this.device = device.getDevice();
|
|
17
|
+
this.colorFormat = device.getFormat();
|
|
18
|
+
this.isMultisampled = sampleCount > 1;
|
|
19
|
+
this.uniformBuffer = this.device.createBuffer({
|
|
20
|
+
// strength, radiusPx, highQuality(u32-as-f32 placeholder), pad
|
|
21
|
+
size: 16,
|
|
22
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
23
|
+
});
|
|
24
|
+
this.bindGroupLayout = this.device.createBindGroupLayout({
|
|
25
|
+
entries: [
|
|
26
|
+
{
|
|
27
|
+
binding: 0,
|
|
28
|
+
visibility: GPUShaderStage.FRAGMENT,
|
|
29
|
+
texture: {
|
|
30
|
+
sampleType: 'depth',
|
|
31
|
+
viewDimension: '2d',
|
|
32
|
+
multisampled: this.isMultisampled,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
binding: 1,
|
|
37
|
+
visibility: GPUShaderStage.FRAGMENT,
|
|
38
|
+
buffer: { type: 'uniform' },
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
});
|
|
42
|
+
const depthTexDecl = this.isMultisampled
|
|
43
|
+
? '@group(0) @binding(0) var depthTex: texture_depth_multisampled_2d;'
|
|
44
|
+
: '@group(0) @binding(0) var depthTex: texture_depth_2d;';
|
|
45
|
+
const depthLoadExpr = this.isMultisampled
|
|
46
|
+
// sample_index for texture_depth_multisampled_2d must be i32 per
|
|
47
|
+
// the WGSL spec; some browsers accept the unsigned form, but
|
|
48
|
+
// strict validators (Naga) reject it.
|
|
49
|
+
? 'textureLoad(depthTex, c, 0)'
|
|
50
|
+
: 'textureLoad(depthTex, c, 0)';
|
|
51
|
+
const shader = this.device.createShaderModule({
|
|
52
|
+
code: `
|
|
53
|
+
struct Params {
|
|
54
|
+
strength: f32,
|
|
55
|
+
radiusPx: f32,
|
|
56
|
+
highQuality: f32,
|
|
57
|
+
_pad: f32,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
${depthTexDecl}
|
|
61
|
+
@group(0) @binding(1) var<uniform> params: Params;
|
|
62
|
+
|
|
63
|
+
struct VsOut {
|
|
64
|
+
@builtin(position) pos: vec4<f32>,
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@vertex
|
|
68
|
+
fn vs_main(@builtin(vertex_index) v: u32) -> VsOut {
|
|
69
|
+
// Standard fullscreen triangle (covers viewport, no UVs needed since
|
|
70
|
+
// the fragment shader reads from textureLoad with @builtin(position)).
|
|
71
|
+
var p = array<vec2<f32>, 3>(
|
|
72
|
+
vec2<f32>(-1.0, -3.0),
|
|
73
|
+
vec2<f32>(-1.0, 1.0),
|
|
74
|
+
vec2<f32>( 3.0, 1.0)
|
|
75
|
+
);
|
|
76
|
+
var o: VsOut;
|
|
77
|
+
o.pos = vec4<f32>(p[v], 0.0, 1.0);
|
|
78
|
+
return o;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
fn sampleDepthClamped(ip: vec2<i32>, dims: vec2<i32>) -> f32 {
|
|
82
|
+
let c = vec2<i32>(clamp(ip.x, 0, dims.x - 1), clamp(ip.y, 0, dims.y - 1));
|
|
83
|
+
return ${depthLoadExpr};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@fragment
|
|
87
|
+
fn fs_main(@builtin(position) fragPos: vec4<f32>) -> @location(0) vec4<f32> {
|
|
88
|
+
let dimsU = textureDimensions(depthTex);
|
|
89
|
+
let dims = vec2<i32>(i32(dimsU.x), i32(dimsU.y));
|
|
90
|
+
let p = vec2<i32>(i32(fragPos.x), i32(fragPos.y));
|
|
91
|
+
|
|
92
|
+
let center = sampleDepthClamped(p, dims);
|
|
93
|
+
// Reverse-Z: 0 = far plane (no geometry written here), so skip.
|
|
94
|
+
if (center <= 1e-5) {
|
|
95
|
+
return vec4<f32>(0.0, 0.0, 0.0, 0.0);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
let r = max(1, i32(params.radiusPx));
|
|
99
|
+
let logCenter = log(center);
|
|
100
|
+
|
|
101
|
+
var accum = 0.0;
|
|
102
|
+
var count = 0.0;
|
|
103
|
+
|
|
104
|
+
// Cardinal taps
|
|
105
|
+
let neighbourOffsets4 = array<vec2<i32>, 4>(
|
|
106
|
+
vec2<i32>( r, 0),
|
|
107
|
+
vec2<i32>(-r, 0),
|
|
108
|
+
vec2<i32>( 0, r),
|
|
109
|
+
vec2<i32>( 0, -r),
|
|
110
|
+
);
|
|
111
|
+
for (var i = 0; i < 4; i = i + 1) {
|
|
112
|
+
let dn = sampleDepthClamped(p + neighbourOffsets4[i], dims);
|
|
113
|
+
if (dn > 1e-5) {
|
|
114
|
+
// log(centre) - log(dn) > 0 when neighbour is further (smaller depth)
|
|
115
|
+
// → darken silhouette edges.
|
|
116
|
+
accum = accum + max(0.0, logCenter - log(dn));
|
|
117
|
+
count = count + 1.0;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (params.highQuality > 0.5) {
|
|
122
|
+
let neighbourOffsets8 = array<vec2<i32>, 4>(
|
|
123
|
+
vec2<i32>( r, r),
|
|
124
|
+
vec2<i32>(-r, r),
|
|
125
|
+
vec2<i32>( r, -r),
|
|
126
|
+
vec2<i32>(-r, -r),
|
|
127
|
+
);
|
|
128
|
+
for (var i = 0; i < 4; i = i + 1) {
|
|
129
|
+
let dn = sampleDepthClamped(p + neighbourOffsets8[i], dims);
|
|
130
|
+
if (dn > 1e-5) {
|
|
131
|
+
accum = accum + max(0.0, logCenter - log(dn));
|
|
132
|
+
count = count + 1.0;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
let meanLog = accum / max(count, 1.0);
|
|
138
|
+
// exp(-300 * meanLog * strength) — 300 matches Potree's default sensitivity.
|
|
139
|
+
// Output (1 - shade) as alpha; the blend mode multiplies dst by (1 - alpha).
|
|
140
|
+
let shade = exp(-300.0 * meanLog * params.strength);
|
|
141
|
+
let darken = clamp(1.0 - shade, 0.0, 0.85);
|
|
142
|
+
return vec4<f32>(0.0, 0.0, 0.0, darken);
|
|
143
|
+
}
|
|
144
|
+
`,
|
|
145
|
+
});
|
|
146
|
+
this.pipeline = this.device.createRenderPipeline({
|
|
147
|
+
layout: this.device.createPipelineLayout({ bindGroupLayouts: [this.bindGroupLayout] }),
|
|
148
|
+
vertex: { module: shader, entryPoint: 'vs_main' },
|
|
149
|
+
fragment: {
|
|
150
|
+
module: shader,
|
|
151
|
+
entryPoint: 'fs_main',
|
|
152
|
+
targets: [{
|
|
153
|
+
format: this.colorFormat,
|
|
154
|
+
// Same darken-overlay blend as the existing PostProcessor:
|
|
155
|
+
// dst' = dst * (1 - srcAlpha), src colour discarded.
|
|
156
|
+
blend: {
|
|
157
|
+
color: { srcFactor: 'zero', dstFactor: 'one-minus-src-alpha' },
|
|
158
|
+
alpha: { srcFactor: 'zero', dstFactor: 'one' },
|
|
159
|
+
},
|
|
160
|
+
}],
|
|
161
|
+
},
|
|
162
|
+
primitive: { topology: 'triangle-list' },
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
apply(encoder, opts, params) {
|
|
166
|
+
if (this.destroyed)
|
|
167
|
+
return;
|
|
168
|
+
if (this.cachedBindGroup === null || this.cachedDepthView !== opts.depthView) {
|
|
169
|
+
this.cachedBindGroup = this.device.createBindGroup({
|
|
170
|
+
layout: this.bindGroupLayout,
|
|
171
|
+
entries: [
|
|
172
|
+
{ binding: 0, resource: opts.depthView },
|
|
173
|
+
{ binding: 1, resource: { buffer: this.uniformBuffer } },
|
|
174
|
+
],
|
|
175
|
+
});
|
|
176
|
+
this.cachedDepthView = opts.depthView;
|
|
177
|
+
}
|
|
178
|
+
this.uniformStaging[0] = params.strength;
|
|
179
|
+
this.uniformStaging[1] = params.radiusPx;
|
|
180
|
+
this.uniformStaging[2] = params.highQuality ? 1 : 0;
|
|
181
|
+
this.uniformStaging[3] = 0;
|
|
182
|
+
this.device.queue.writeBuffer(this.uniformBuffer, 0, this.uniformStaging);
|
|
183
|
+
const pass = encoder.beginRenderPass({
|
|
184
|
+
colorAttachments: [{
|
|
185
|
+
view: opts.targetView,
|
|
186
|
+
loadOp: 'load',
|
|
187
|
+
storeOp: 'store',
|
|
188
|
+
}],
|
|
189
|
+
});
|
|
190
|
+
pass.setPipeline(this.pipeline);
|
|
191
|
+
pass.setBindGroup(0, this.cachedBindGroup);
|
|
192
|
+
pass.draw(3, 1, 0, 0);
|
|
193
|
+
pass.end();
|
|
194
|
+
}
|
|
195
|
+
destroy() {
|
|
196
|
+
if (this.destroyed)
|
|
197
|
+
return;
|
|
198
|
+
this.destroyed = true;
|
|
199
|
+
this.uniformBuffer.destroy();
|
|
200
|
+
this.cachedBindGroup = null;
|
|
201
|
+
this.cachedDepthView = null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=edl-pass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edl-pass.js","sourceRoot":"","sources":["../src/edl-pass.ts"],"names":[],"mappings":"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"}
|