@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
package/dist/picker.js
CHANGED
|
@@ -1,8 +1,33 @@
|
|
|
1
1
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
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
|
+
import { PointPicker, decodePickSample } from './point-picker.js';
|
|
5
|
+
import { MathUtils } from './math.js';
|
|
6
|
+
/**
|
|
7
|
+
* Reproject a pick coordinate (px, depth in [0, 1]) into world space
|
|
8
|
+
* using the inverse view-projection matrix.
|
|
9
|
+
*
|
|
10
|
+
* Reverse-Z: depth=1 is the near plane, depth=0 is far. A depth of
|
|
11
|
+
* exactly 0 means the click missed every drawn primitive (depth was
|
|
12
|
+
* never written, so the clear value sticks), and we return null.
|
|
13
|
+
*
|
|
14
|
+
* Pixel coords use the WebGPU/screen convention (origin top-left, y
|
|
15
|
+
* increases downward); NDC y is inverted to match the camera's
|
|
16
|
+
* projection matrix.
|
|
17
|
+
*/
|
|
18
|
+
function unprojectPickSample(viewProj, pickX, pickY, width, height, depth) {
|
|
19
|
+
if (!Number.isFinite(depth) || depth <= 0)
|
|
20
|
+
return null;
|
|
21
|
+
const ndcX = ((pickX + 0.5) / width) * 2 - 1;
|
|
22
|
+
const ndcY = 1 - ((pickY + 0.5) / height) * 2;
|
|
23
|
+
const inv = MathUtils.invert({ m: viewProj });
|
|
24
|
+
if (!inv)
|
|
25
|
+
return null;
|
|
26
|
+
return MathUtils.transformPoint(inv, { x: ndcX, y: ndcY, z: depth });
|
|
27
|
+
}
|
|
4
28
|
export class Picker {
|
|
5
29
|
device;
|
|
30
|
+
webgpuDevice;
|
|
6
31
|
pipeline;
|
|
7
32
|
depthTexture;
|
|
8
33
|
colorTexture;
|
|
@@ -11,7 +36,9 @@ export class Picker {
|
|
|
11
36
|
bindGroup;
|
|
12
37
|
maxMeshes = 100000; // Support up to 100K meshes (was 10K)
|
|
13
38
|
destroyed = false;
|
|
39
|
+
pointPicker = null;
|
|
14
40
|
constructor(device, width = 1, height = 1) {
|
|
41
|
+
this.webgpuDevice = device;
|
|
15
42
|
this.device = device.getDevice();
|
|
16
43
|
// Create textures for picking
|
|
17
44
|
this.colorTexture = this.device.createTexture({
|
|
@@ -22,7 +49,10 @@ export class Picker {
|
|
|
22
49
|
this.depthTexture = this.device.createTexture({
|
|
23
50
|
size: { width, height },
|
|
24
51
|
format: 'depth32float',
|
|
25
|
-
|
|
52
|
+
// COPY_SRC so we can read the depth texel at the click position
|
|
53
|
+
// back to the CPU and unproject to recover the world-space hit
|
|
54
|
+
// point for hover tooltips / measurements.
|
|
55
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
|
|
26
56
|
});
|
|
27
57
|
// Create uniform buffer for viewProj matrix only (16 floats = 64 bytes)
|
|
28
58
|
this.uniformBuffer = this.device.createBuffer({
|
|
@@ -117,11 +147,164 @@ export class Picker {
|
|
|
117
147
|
});
|
|
118
148
|
}
|
|
119
149
|
/**
|
|
120
|
-
* Pick object at screen coordinates
|
|
121
|
-
*
|
|
150
|
+
* Pick object at screen coordinates.
|
|
151
|
+
*
|
|
152
|
+
* When `pointNodes` is non-empty the picker draws point splats into
|
|
153
|
+
* the same r32uint target as the meshes (sharing the depth buffer so
|
|
154
|
+
* occlusion is correct). Point hits set bit 31 of the readback value;
|
|
155
|
+
* the decoder distinguishes mesh vs point from that flag.
|
|
156
|
+
*
|
|
157
|
+
* Returns `PickResult` with `{expressId, modelIndex}` for both kinds.
|
|
158
|
+
* For point hits, expressId is the federated globalId of the asset
|
|
159
|
+
* (already correct for hover/selection plumbing — no remapping needed).
|
|
160
|
+
*/
|
|
161
|
+
async pick(x, y, width, height, meshes, viewProj, pointNodes, pointSizing) {
|
|
162
|
+
const encoder = this.renderPickPass(width, height, meshes, viewProj, pointNodes, pointSizing);
|
|
163
|
+
// Clamp the texel origin to the texture bounds. Math.floor(x/y) can
|
|
164
|
+
// be -1 or equal to width/height on border clicks (and on
|
|
165
|
+
// pointer-captured drags that leave the canvas), and either makes
|
|
166
|
+
// copyTextureToBuffer reject the submit. pickRect already guards
|
|
167
|
+
// this path; pick() needs the same.
|
|
168
|
+
const sampleX = Math.max(0, Math.min(width - 1, Math.floor(x)));
|
|
169
|
+
const sampleY = Math.max(0, Math.min(height - 1, Math.floor(y)));
|
|
170
|
+
// Read pixel at click position. WebGPU requires bytesPerRow to be a
|
|
171
|
+
// multiple of 256 for copyTextureToBuffer, even for a 1×1 read.
|
|
172
|
+
const BYTES_PER_ROW = 256;
|
|
173
|
+
const readBuffer = this.device.createBuffer({
|
|
174
|
+
size: BYTES_PER_ROW,
|
|
175
|
+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
|
|
176
|
+
});
|
|
177
|
+
encoder.copyTextureToBuffer({
|
|
178
|
+
texture: this.colorTexture,
|
|
179
|
+
origin: { x: sampleX, y: sampleY, z: 0 },
|
|
180
|
+
}, { buffer: readBuffer, bytesPerRow: BYTES_PER_ROW, rowsPerImage: 1 }, { width: 1, height: 1 });
|
|
181
|
+
// Depth readback for click-to-world unprojection. WebGPU forbids
|
|
182
|
+
// partial copies from depth/stencil-format textures — the copy must
|
|
183
|
+
// cover the entire subresource. So we copy the whole depth image
|
|
184
|
+
// and index into the buffer client-side after mapping. depth32float
|
|
185
|
+
// = 4 bytes per texel; bytesPerRow must still be a multiple of 256.
|
|
186
|
+
const depthBytesPerRow = Math.ceil((width * 4) / 256) * 256;
|
|
187
|
+
const depthBuffer = this.device.createBuffer({
|
|
188
|
+
size: depthBytesPerRow * height,
|
|
189
|
+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
|
|
190
|
+
});
|
|
191
|
+
encoder.copyTextureToBuffer({
|
|
192
|
+
texture: this.depthTexture,
|
|
193
|
+
origin: { x: 0, y: 0, z: 0 },
|
|
194
|
+
aspect: 'depth-only',
|
|
195
|
+
}, { buffer: depthBuffer, bytesPerRow: depthBytesPerRow, rowsPerImage: height }, { width, height });
|
|
196
|
+
this.device.queue.submit([encoder.finish()]);
|
|
197
|
+
// GPUMapMode.READ = 1 (WebGPU spec)
|
|
198
|
+
await Promise.all([readBuffer.mapAsync(1), depthBuffer.mapAsync(1)]);
|
|
199
|
+
const sample = new Uint32Array(readBuffer.getMappedRange())[0];
|
|
200
|
+
const depthBytes = new Uint8Array(depthBuffer.getMappedRange());
|
|
201
|
+
const depthOffset = sampleY * depthBytesPerRow + sampleX * 4;
|
|
202
|
+
const depth = new Float32Array(depthBytes.buffer, depthBytes.byteOffset + depthOffset, 1)[0];
|
|
203
|
+
readBuffer.unmap();
|
|
204
|
+
depthBuffer.unmap();
|
|
205
|
+
readBuffer.destroy();
|
|
206
|
+
depthBuffer.destroy();
|
|
207
|
+
const decoded = decodePickSample(sample);
|
|
208
|
+
if (decoded.kind === 'none')
|
|
209
|
+
return null;
|
|
210
|
+
// Unproject (x, y, depth) → world space. Reverse-Z keeps depth in
|
|
211
|
+
// [0, 1] (1 = near, 0 = far) — same NDC convention as the camera
|
|
212
|
+
// raycaster, so MathUtils.transformPoint with the inverse viewProj
|
|
213
|
+
// gives the world hit position directly.
|
|
214
|
+
const worldXYZ = unprojectPickSample(viewProj, sampleX, sampleY, width, height, depth);
|
|
215
|
+
if (decoded.kind === 'point') {
|
|
216
|
+
// Look up the asset for modelIndex. expressId is already the
|
|
217
|
+
// federated globalId (vertex shader writes it from the per-point
|
|
218
|
+
// attribute, no lookup table needed).
|
|
219
|
+
const node = pointNodes?.find((n) => (n.expressId >>> 0) === decoded.pointExpressId);
|
|
220
|
+
return {
|
|
221
|
+
expressId: decoded.pointExpressId,
|
|
222
|
+
modelIndex: node?.modelIndex,
|
|
223
|
+
worldXYZ: worldXYZ ?? undefined,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
// Mesh hit — meshIndex is (actual index + 1), already validated > 0.
|
|
227
|
+
const mesh = meshes[decoded.meshIndexPlusOne - 1];
|
|
228
|
+
if (!mesh)
|
|
229
|
+
return null;
|
|
230
|
+
return {
|
|
231
|
+
expressId: mesh.expressId,
|
|
232
|
+
modelIndex: mesh.modelIndex,
|
|
233
|
+
worldXYZ: worldXYZ ?? undefined,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
updateUniforms(viewProj) {
|
|
237
|
+
// Update viewProj matrix only
|
|
238
|
+
this.device.queue.writeBuffer(this.uniformBuffer, 0, viewProj);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Rectangle pick: render the pick pass once, then read back every
|
|
242
|
+
* texel inside `[x0, y0]..[x1, y1]` and dedupe the hit set. Returns
|
|
243
|
+
* a `Set<expressId>` for both meshes and point clouds.
|
|
244
|
+
*
|
|
245
|
+
* Used by the Shift+drag rectangle-selection UI; not meant for
|
|
246
|
+
* sustained use because the readback grows with rect area. A 800×600
|
|
247
|
+
* rect = 480k pixels = ~2 MB transfer, fine for one-shot but we'd
|
|
248
|
+
* want a GPU-side dedupe for sustained marquee selection.
|
|
249
|
+
*/
|
|
250
|
+
async pickRect(x0, y0, x1, y1, width, height, meshes, viewProj, pointNodes, pointSizing) {
|
|
251
|
+
// Normalise + clip rect to texture bounds.
|
|
252
|
+
const lx = Math.max(0, Math.floor(Math.min(x0, x1)));
|
|
253
|
+
const ly = Math.max(0, Math.floor(Math.min(y0, y1)));
|
|
254
|
+
const hx = Math.min(width - 1, Math.floor(Math.max(x0, x1)));
|
|
255
|
+
const hy = Math.min(height - 1, Math.floor(Math.max(y0, y1)));
|
|
256
|
+
const rectW = hx - lx + 1;
|
|
257
|
+
const rectH = hy - ly + 1;
|
|
258
|
+
if (rectW <= 0 || rectH <= 0)
|
|
259
|
+
return new Set();
|
|
260
|
+
const encoder = this.renderPickPass(width, height, meshes, viewProj, pointNodes, pointSizing);
|
|
261
|
+
// copyTextureToBuffer requires bytesPerRow to be a multiple of 256.
|
|
262
|
+
// r32uint = 4 bytes per texel. Round up to nearest 256.
|
|
263
|
+
const rawRowBytes = rectW * 4;
|
|
264
|
+
const rowStride = Math.ceil(rawRowBytes / 256) * 256;
|
|
265
|
+
const readBuffer = this.device.createBuffer({
|
|
266
|
+
size: rowStride * rectH,
|
|
267
|
+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
|
|
268
|
+
});
|
|
269
|
+
encoder.copyTextureToBuffer({
|
|
270
|
+
texture: this.colorTexture,
|
|
271
|
+
origin: { x: lx, y: ly, z: 0 },
|
|
272
|
+
}, { buffer: readBuffer, bytesPerRow: rowStride, rowsPerImage: rectH }, { width: rectW, height: rectH });
|
|
273
|
+
this.device.queue.submit([encoder.finish()]);
|
|
274
|
+
await readBuffer.mapAsync(1);
|
|
275
|
+
const view = new Uint32Array(readBuffer.getMappedRange());
|
|
276
|
+
const ids = new Set();
|
|
277
|
+
const stridePx = rowStride / 4;
|
|
278
|
+
for (let y = 0; y < rectH; y++) {
|
|
279
|
+
const row = y * stridePx;
|
|
280
|
+
for (let x = 0; x < rectW; x++) {
|
|
281
|
+
const sample = view[row + x];
|
|
282
|
+
if (sample === 0)
|
|
283
|
+
continue;
|
|
284
|
+
const decoded = decodePickSample(sample);
|
|
285
|
+
if (decoded.kind === 'none')
|
|
286
|
+
continue;
|
|
287
|
+
if (decoded.kind === 'point') {
|
|
288
|
+
ids.add(decoded.pointExpressId);
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
const mesh = meshes[decoded.meshIndexPlusOne - 1];
|
|
292
|
+
if (mesh)
|
|
293
|
+
ids.add(mesh.expressId);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
readBuffer.unmap();
|
|
298
|
+
readBuffer.destroy();
|
|
299
|
+
return ids;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Render the picker pass into `colorTexture` + `depthTexture` and
|
|
303
|
+
* return the still-open command encoder so the caller can append a
|
|
304
|
+
* `copyTextureToBuffer` for either a single texel (`pick`) or a
|
|
305
|
+
* whole rect (`pickRect`) before submitting.
|
|
122
306
|
*/
|
|
123
|
-
|
|
124
|
-
// Resize textures if needed
|
|
307
|
+
renderPickPass(width, height, meshes, viewProj, pointNodes, pointSizing) {
|
|
125
308
|
if (this.colorTexture.width !== width || this.colorTexture.height !== height) {
|
|
126
309
|
this.colorTexture.destroy();
|
|
127
310
|
this.depthTexture.destroy();
|
|
@@ -133,24 +316,23 @@ export class Picker {
|
|
|
133
316
|
this.depthTexture = this.device.createTexture({
|
|
134
317
|
size: { width, height },
|
|
135
318
|
format: 'depth32float',
|
|
136
|
-
|
|
319
|
+
// COPY_SRC so single-pixel pick can read depth back for the
|
|
320
|
+
// hover-XYZ unprojection. Rect pick doesn't sample depth but
|
|
321
|
+
// costs nothing to keep the flag set.
|
|
322
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
|
|
137
323
|
});
|
|
138
324
|
}
|
|
139
|
-
//
|
|
140
|
-
// WebGPU texture views cannot be reused after being submitted
|
|
325
|
+
// WebGPU texture views can't be reused after submit, so build fresh ones.
|
|
141
326
|
const colorView = this.colorTexture.createView();
|
|
142
327
|
const depthView = this.depthTexture.createView();
|
|
143
|
-
// Render picker pass
|
|
144
328
|
const encoder = this.device.createCommandEncoder();
|
|
145
329
|
const pass = encoder.beginRenderPass({
|
|
146
|
-
colorAttachments: [
|
|
147
|
-
{
|
|
330
|
+
colorAttachments: [{
|
|
148
331
|
view: colorView,
|
|
149
332
|
loadOp: 'clear',
|
|
150
333
|
clearValue: { r: 0, g: 0, b: 0, a: 0 },
|
|
151
334
|
storeOp: 'store',
|
|
152
|
-
},
|
|
153
|
-
],
|
|
335
|
+
}],
|
|
154
336
|
depthStencilAttachment: {
|
|
155
337
|
view: depthView,
|
|
156
338
|
depthClearValue: 0.0, // Reverse-Z: clear to 0.0 (far plane)
|
|
@@ -158,72 +340,40 @@ export class Picker {
|
|
|
158
340
|
depthStoreOp: 'store',
|
|
159
341
|
},
|
|
160
342
|
});
|
|
161
|
-
// Resize buffer if needed (safety net for very large models)
|
|
162
343
|
if (meshes.length > this.maxMeshes) {
|
|
163
344
|
this.resizeExpressIdBuffer(meshes.length);
|
|
164
345
|
}
|
|
165
|
-
// Upload viewProj matrix to uniform buffer (once for all meshes)
|
|
166
346
|
this.device.queue.writeBuffer(this.uniformBuffer, 0, viewProj);
|
|
167
|
-
// Build mesh index array (index + 1, so 0 = no hit)
|
|
168
|
-
// Using mesh index instead of expressId to properly support multi-model with overlapping expressIds
|
|
169
347
|
const meshIndexArray = new Uint32Array(meshes.length);
|
|
170
348
|
for (let i = 0; i < meshes.length; i++) {
|
|
171
|
-
if (meshes[i])
|
|
349
|
+
if (meshes[i])
|
|
172
350
|
meshIndexArray[i] = i + 1; // +1 so 0 means no hit
|
|
173
|
-
}
|
|
174
351
|
}
|
|
175
352
|
this.device.queue.writeBuffer(this.expressIdBuffer, 0, meshIndexArray);
|
|
176
353
|
pass.setPipeline(this.pipeline);
|
|
177
354
|
pass.setBindGroup(0, this.bindGroup);
|
|
178
|
-
// Draw each mesh with its index as the first instance
|
|
179
|
-
// The shader will use this instance_index to look up the expressId
|
|
180
355
|
for (let i = 0; i < meshes.length; i++) {
|
|
181
356
|
const mesh = meshes[i];
|
|
182
357
|
if (!mesh)
|
|
183
358
|
continue;
|
|
184
359
|
pass.setVertexBuffer(0, mesh.vertexBuffer);
|
|
185
360
|
pass.setIndexBuffer(mesh.indexBuffer, 'uint32');
|
|
186
|
-
// Draw 1 instance, starting at instance i (so instance_index = i in shader)
|
|
187
361
|
pass.drawIndexed(mesh.indexCount, 1, 0, 0, i);
|
|
188
362
|
}
|
|
363
|
+
if (pointNodes && pointNodes.length > 0) {
|
|
364
|
+
if (!this.pointPicker) {
|
|
365
|
+
this.pointPicker = new PointPicker(this.webgpuDevice);
|
|
366
|
+
}
|
|
367
|
+
const sz = pointSizing ?? { sizeMode: 0, worldRadius: 0.02, pointSizePx: 4 };
|
|
368
|
+
this.pointPicker.drawIntoPass(pass, pointNodes, viewProj, { width, height }, {
|
|
369
|
+
sizeMode: sz.sizeMode,
|
|
370
|
+
worldRadius: sz.worldRadius,
|
|
371
|
+
pointSizePx: sz.pointSizePx,
|
|
372
|
+
clickTolerancePx: sz.clickTolerancePx ?? 2,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
189
375
|
pass.end();
|
|
190
|
-
|
|
191
|
-
// WebGPU requires bytesPerRow to be a multiple of 256
|
|
192
|
-
const BYTES_PER_ROW = 256;
|
|
193
|
-
const readBuffer = this.device.createBuffer({
|
|
194
|
-
size: BYTES_PER_ROW,
|
|
195
|
-
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
|
|
196
|
-
});
|
|
197
|
-
encoder.copyTextureToBuffer({
|
|
198
|
-
texture: this.colorTexture,
|
|
199
|
-
origin: { x: Math.floor(x), y: Math.floor(y), z: 0 },
|
|
200
|
-
}, {
|
|
201
|
-
buffer: readBuffer,
|
|
202
|
-
bytesPerRow: BYTES_PER_ROW,
|
|
203
|
-
rowsPerImage: 1,
|
|
204
|
-
}, { width: 1, height: 1 });
|
|
205
|
-
this.device.queue.submit([encoder.finish()]);
|
|
206
|
-
// GPUMapMode.READ = 1 (WebGPU spec)
|
|
207
|
-
await readBuffer.mapAsync(1); // GPUMapMode.READ
|
|
208
|
-
const data = new Uint32Array(readBuffer.getMappedRange());
|
|
209
|
-
const meshIndex = data[0];
|
|
210
|
-
readBuffer.unmap();
|
|
211
|
-
readBuffer.destroy();
|
|
212
|
-
// meshIndex is (actual index + 1), so 0 = no hit
|
|
213
|
-
if (meshIndex === 0)
|
|
214
|
-
return null;
|
|
215
|
-
// Look up the mesh to get both expressId and modelIndex
|
|
216
|
-
const mesh = meshes[meshIndex - 1];
|
|
217
|
-
if (!mesh)
|
|
218
|
-
return null;
|
|
219
|
-
return {
|
|
220
|
-
expressId: mesh.expressId,
|
|
221
|
-
modelIndex: mesh.modelIndex,
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
updateUniforms(viewProj) {
|
|
225
|
-
// Update viewProj matrix only
|
|
226
|
-
this.device.queue.writeBuffer(this.uniformBuffer, 0, viewProj);
|
|
376
|
+
return encoder;
|
|
227
377
|
}
|
|
228
378
|
/**
|
|
229
379
|
* Resize expressId buffer to accommodate more meshes
|
|
@@ -266,6 +416,8 @@ export class Picker {
|
|
|
266
416
|
this.depthTexture.destroy();
|
|
267
417
|
this.uniformBuffer.destroy();
|
|
268
418
|
this.expressIdBuffer.destroy();
|
|
419
|
+
this.pointPicker?.destroy();
|
|
420
|
+
this.pointPicker = null;
|
|
269
421
|
}
|
|
270
422
|
}
|
|
271
423
|
//# sourceMappingURL=picker.js.map
|
package/dist/picker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker.js","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"picker.js","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,16 +4,29 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { Camera } from './camera.js';
|
|
6
6
|
import { Scene } from './scene.js';
|
|
7
|
-
import { Picker } from './picker.js';
|
|
7
|
+
import { Picker, type PointPickSizing } from './picker.js';
|
|
8
8
|
import type { MeshData } from '@ifc-lite/geometry';
|
|
9
9
|
import type { PickOptions, PickResult } from './types.js';
|
|
10
|
+
import type { PointPickNode } from './point-picker.js';
|
|
11
|
+
/**
|
|
12
|
+
* Supplied by the renderer when point clouds are loaded — returns the
|
|
13
|
+
* snapshot of pickable nodes and the sizing to use for the splat picker.
|
|
14
|
+
* Returning empty / null disables point-pick for this frame.
|
|
15
|
+
*/
|
|
16
|
+
export type PointPickProvider = () => {
|
|
17
|
+
nodes: ReadonlyArray<PointPickNode>;
|
|
18
|
+
sizing: PointPickSizing;
|
|
19
|
+
} | null;
|
|
10
20
|
export declare class PickingManager {
|
|
11
21
|
private camera;
|
|
12
22
|
private scene;
|
|
13
23
|
private picker;
|
|
14
24
|
private canvas;
|
|
15
25
|
private createMeshFromDataFn;
|
|
26
|
+
private pointPickProvider;
|
|
16
27
|
constructor(camera: Camera, scene: Scene, picker: Picker | null, canvas: HTMLCanvasElement, createMeshFromDataFn: (meshData: MeshData) => void);
|
|
28
|
+
/** Renderer wires this on init so the manager can fetch point nodes lazily. */
|
|
29
|
+
setPointPickProvider(provider: PointPickProvider | null): void;
|
|
17
30
|
/**
|
|
18
31
|
* Update the picker reference (e.g., after init)
|
|
19
32
|
*/
|
|
@@ -27,5 +40,23 @@ export declare class PickingManager {
|
|
|
27
40
|
* These are scaled internally to match the actual canvas pixel dimensions.
|
|
28
41
|
*/
|
|
29
42
|
pick(x: number, y: number, options?: PickOptions): Promise<PickResult | null>;
|
|
43
|
+
/**
|
|
44
|
+
* GPU-based rectangle pick. Renders the same pick pass as `pick()`,
|
|
45
|
+
* then reads back every texel inside the rect and dedupes the hit
|
|
46
|
+
* set. Point splats and mesh triangles both participate.
|
|
47
|
+
*
|
|
48
|
+
* Rect coordinates are in CSS pixels; we scale to canvas pixels
|
|
49
|
+
* the same way `pick()` does. Visibility filters from `options`
|
|
50
|
+
* are applied to meshes before the pass; point nodes are not
|
|
51
|
+
* filtered (per-asset visibility is binary and the asset count is
|
|
52
|
+
* tiny).
|
|
53
|
+
*
|
|
54
|
+
* Limitations: skips the CPU-raycast and dynamic-mesh-creation
|
|
55
|
+
* fallbacks that `pick()` uses for very large batched models, so
|
|
56
|
+
* rect pick may miss entities whose individual meshes haven't been
|
|
57
|
+
* hydrated. Acceptable for an MVP — rect select is a power-user
|
|
58
|
+
* tool and the user can fall back to single-click pick.
|
|
59
|
+
*/
|
|
60
|
+
pickRect(x0: number, y0: number, x1: number, y1: number, options?: PickOptions): Promise<Set<number>>;
|
|
30
61
|
}
|
|
31
62
|
//# sourceMappingURL=picking-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picking-manager.d.ts","sourceRoot":"","sources":["../src/picking-manager.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"picking-manager.d.ts","sourceRoot":"","sources":["../src/picking-manager.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAC5B;IAAE,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAChE,IAAI,CAAC;AAET,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,oBAAoB,CAA+B;IAC3D,OAAO,CAAC,iBAAiB,CAAkC;gBAGvD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,EAAE,iBAAiB,EACzB,oBAAoB,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI;IAStD,+EAA+E;IAC/E,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI;IAI9D;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAItC;;;;;;;OAOG;IACG,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAyJnF;;;;;;;;;;;;;;;;OAgBG;IACG,QAAQ,CACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,WAAW,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;CA4B1B"}
|
package/dist/picking-manager.js
CHANGED
|
@@ -7,6 +7,7 @@ export class PickingManager {
|
|
|
7
7
|
picker;
|
|
8
8
|
canvas;
|
|
9
9
|
createMeshFromDataFn;
|
|
10
|
+
pointPickProvider = null;
|
|
10
11
|
constructor(camera, scene, picker, canvas, createMeshFromDataFn) {
|
|
11
12
|
this.camera = camera;
|
|
12
13
|
this.scene = scene;
|
|
@@ -14,6 +15,10 @@ export class PickingManager {
|
|
|
14
15
|
this.canvas = canvas;
|
|
15
16
|
this.createMeshFromDataFn = createMeshFromDataFn;
|
|
16
17
|
}
|
|
18
|
+
/** Renderer wires this on init so the manager can fetch point nodes lazily. */
|
|
19
|
+
setPointPickProvider(provider) {
|
|
20
|
+
this.pointPickProvider = provider;
|
|
21
|
+
}
|
|
17
22
|
/**
|
|
18
23
|
* Update the picker reference (e.g., after init)
|
|
19
24
|
*/
|
|
@@ -151,8 +156,55 @@ export class PickingManager {
|
|
|
151
156
|
meshes = meshes.filter(mesh => options.isolatedIds.has(mesh.expressId));
|
|
152
157
|
}
|
|
153
158
|
const viewProj = this.camera.getViewProjMatrix().m;
|
|
154
|
-
const
|
|
159
|
+
const pointSnap = this.pointPickProvider?.() ?? null;
|
|
160
|
+
// Skip point picking when isolation excludes everything to keep
|
|
161
|
+
// existing visibility semantics (caller already filtered meshes
|
|
162
|
+
// accordingly; we don't filter point nodes here because per-asset
|
|
163
|
+
// visibility is binary and assets are tiny in count).
|
|
164
|
+
const pointNodes = pointSnap?.nodes ?? undefined;
|
|
165
|
+
const pointSizing = pointSnap?.sizing ?? undefined;
|
|
166
|
+
const result = await this.picker.pick(scaledX, scaledY, this.canvas.width, this.canvas.height, meshes, viewProj, pointNodes, pointSizing);
|
|
155
167
|
return result;
|
|
156
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* GPU-based rectangle pick. Renders the same pick pass as `pick()`,
|
|
171
|
+
* then reads back every texel inside the rect and dedupes the hit
|
|
172
|
+
* set. Point splats and mesh triangles both participate.
|
|
173
|
+
*
|
|
174
|
+
* Rect coordinates are in CSS pixels; we scale to canvas pixels
|
|
175
|
+
* the same way `pick()` does. Visibility filters from `options`
|
|
176
|
+
* are applied to meshes before the pass; point nodes are not
|
|
177
|
+
* filtered (per-asset visibility is binary and the asset count is
|
|
178
|
+
* tiny).
|
|
179
|
+
*
|
|
180
|
+
* Limitations: skips the CPU-raycast and dynamic-mesh-creation
|
|
181
|
+
* fallbacks that `pick()` uses for very large batched models, so
|
|
182
|
+
* rect pick may miss entities whose individual meshes haven't been
|
|
183
|
+
* hydrated. Acceptable for an MVP — rect select is a power-user
|
|
184
|
+
* tool and the user can fall back to single-click pick.
|
|
185
|
+
*/
|
|
186
|
+
async pickRect(x0, y0, x1, y1, options) {
|
|
187
|
+
if (!this.picker)
|
|
188
|
+
return new Set();
|
|
189
|
+
const rect = this.canvas.getBoundingClientRect();
|
|
190
|
+
if (rect.width === 0 || rect.height === 0)
|
|
191
|
+
return new Set();
|
|
192
|
+
const scaleX = this.canvas.width / rect.width;
|
|
193
|
+
const scaleY = this.canvas.height / rect.height;
|
|
194
|
+
const sx0 = x0 * scaleX, sy0 = y0 * scaleY;
|
|
195
|
+
const sx1 = x1 * scaleX, sy1 = y1 * scaleY;
|
|
196
|
+
if (options?.isStreaming)
|
|
197
|
+
return new Set();
|
|
198
|
+
let meshes = this.scene.getMeshes();
|
|
199
|
+
if (options?.hiddenIds && options.hiddenIds.size > 0) {
|
|
200
|
+
meshes = meshes.filter((m) => !options.hiddenIds.has(m.expressId));
|
|
201
|
+
}
|
|
202
|
+
if (options?.isolatedIds !== null && options?.isolatedIds !== undefined) {
|
|
203
|
+
meshes = meshes.filter((m) => options.isolatedIds.has(m.expressId));
|
|
204
|
+
}
|
|
205
|
+
const viewProj = this.camera.getViewProjMatrix().m;
|
|
206
|
+
const pointSnap = this.pointPickProvider?.() ?? null;
|
|
207
|
+
return this.picker.pickRect(sx0, sy0, sx1, sy1, this.canvas.width, this.canvas.height, meshes, viewProj, pointSnap?.nodes ?? undefined, pointSnap?.sizing ?? undefined);
|
|
208
|
+
}
|
|
157
209
|
}
|
|
158
210
|
//# sourceMappingURL=picking-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picking-manager.js","sourceRoot":"","sources":["../src/picking-manager.ts"],"names":[],"mappings":"AAAA;;+DAE+D;
|
|
1
|
+
{"version":3,"file":"picking-manager.js","sourceRoot":"","sources":["../src/picking-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Point cloud picker — sibling pipeline to `Picker` that draws splats
|
|
3
|
+
* into the same r32uint object-id target so points and meshes occlude
|
|
4
|
+
* each other correctly during a pick.
|
|
5
|
+
*
|
|
6
|
+
* Disambiguation: points emit `0x80000000 | (expressId & 0x7FFFFFFF)`,
|
|
7
|
+
* meshes emit `meshIndex+1` (always under 100K). The reader checks bit
|
|
8
|
+
* 31 to know which path produced the hit.
|
|
9
|
+
*
|
|
10
|
+
* Click tolerance: the picker pipeline inflates each splat by an extra
|
|
11
|
+
* ~2 px over its on-screen size. This makes picking forgiving even for
|
|
12
|
+
* sub-pixel splats (adaptive-world mode, dense scans) without changing
|
|
13
|
+
* the rendered look.
|
|
14
|
+
*/
|
|
15
|
+
import type { WebGPUDevice } from './device.js';
|
|
16
|
+
export interface PointPickNode {
|
|
17
|
+
expressId: number;
|
|
18
|
+
modelIndex?: number;
|
|
19
|
+
chunks: ReadonlyArray<{
|
|
20
|
+
vertexBuffer: GPUBuffer;
|
|
21
|
+
pointCount: number;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
/** Decode a r32uint sample from the picker target. */
|
|
25
|
+
export interface DecodedPickSample {
|
|
26
|
+
/** Mesh index (1-based) when bit 31 is clear and value > 0; 0 = no hit. */
|
|
27
|
+
meshIndexPlusOne: number;
|
|
28
|
+
/** Federated expressId when bit 31 is set; 0 otherwise. */
|
|
29
|
+
pointExpressId: number;
|
|
30
|
+
/** Convenience: which discipline produced the hit. */
|
|
31
|
+
kind: 'mesh' | 'point' | 'none';
|
|
32
|
+
}
|
|
33
|
+
export declare function decodePickSample(value: number): DecodedPickSample;
|
|
34
|
+
export declare class PointPicker {
|
|
35
|
+
private device;
|
|
36
|
+
private pipeline;
|
|
37
|
+
private bindGroupLayout;
|
|
38
|
+
private uniformBuffer;
|
|
39
|
+
private bindGroup;
|
|
40
|
+
private uniformScratch;
|
|
41
|
+
private uniformU32;
|
|
42
|
+
private destroyed;
|
|
43
|
+
constructor(device: WebGPUDevice);
|
|
44
|
+
/**
|
|
45
|
+
* Draw point pick splats into the (already-open) render pass. The
|
|
46
|
+
* caller is responsible for clearing the color + depth attachments
|
|
47
|
+
* and ending the pass.
|
|
48
|
+
*/
|
|
49
|
+
drawIntoPass(pass: GPURenderPassEncoder, nodes: ReadonlyArray<PointPickNode>, viewProj: Float32Array, viewport: {
|
|
50
|
+
width: number;
|
|
51
|
+
height: number;
|
|
52
|
+
}, sizing: {
|
|
53
|
+
sizeMode: 0 | 1 | 2;
|
|
54
|
+
worldRadius: number;
|
|
55
|
+
pointSizePx: number;
|
|
56
|
+
clickTolerancePx: number;
|
|
57
|
+
}): void;
|
|
58
|
+
private writeUniforms;
|
|
59
|
+
destroy(): void;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=point-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"point-picker.d.ts","sourceRoot":"","sources":["../src/point-picker.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;QAAE,YAAY,EAAE,SAAS,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxE;AAKD,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;CACjC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAYjE;AAKD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY;IAiJhC;;;;OAIG;IACH,YAAY,CACV,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,EACnC,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAC3C,MAAM,EAAE;QAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,GAClG,IAAI;IAmBP,OAAO,CAAC,aAAa;IA2BrB,OAAO,IAAI,IAAI;CAKhB"}
|