@ifc-lite/renderer 6.4.0 → 6.5.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 +7 -1
- package/dist/camera-animation.d.ts.map +1 -1
- package/dist/camera-animation.js +19 -3
- package/dist/camera-animation.js.map +1 -1
- package/dist/camera-fit-geometry.d.ts +47 -0
- package/dist/camera-fit-geometry.d.ts.map +1 -0
- package/dist/camera-fit-geometry.js +44 -0
- package/dist/camera-fit-geometry.js.map +1 -0
- package/dist/camera-framing.d.ts +27 -21
- package/dist/camera-framing.d.ts.map +1 -1
- package/dist/camera-framing.js +47 -44
- package/dist/camera-framing.js.map +1 -1
- package/dist/camera-preset-view.d.ts +18 -0
- package/dist/camera-preset-view.d.ts.map +1 -1
- package/dist/camera-preset-view.js +42 -0
- package/dist/camera-preset-view.js.map +1 -1
- package/dist/camera.d.ts +14 -1
- package/dist/camera.d.ts.map +1 -1
- package/dist/camera.js +14 -2
- package/dist/camera.js.map +1 -1
- package/dist/clip-types.d.ts +35 -0
- package/dist/clip-types.d.ts.map +1 -0
- package/dist/clip-types.js +5 -0
- package/dist/clip-types.js.map +1 -0
- package/dist/device-recovery.js +11 -1
- package/dist/device-recovery.js.map +1 -1
- package/dist/device.d.ts +4 -4
- package/dist/device.js +9 -9
- package/dist/device.js.map +1 -1
- package/dist/extra-clip-planes.d.ts +57 -0
- package/dist/extra-clip-planes.d.ts.map +1 -0
- package/dist/extra-clip-planes.js +161 -0
- package/dist/extra-clip-planes.js.map +1 -0
- package/dist/gpu-counters.d.ts +4 -2
- package/dist/gpu-counters.d.ts.map +1 -1
- package/dist/gpu-counters.js +9 -6
- package/dist/gpu-counters.js.map +1 -1
- package/dist/index.d.ts +18 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -90
- package/dist/index.js.map +1 -1
- package/dist/mesh-rte-uniforms.d.ts +7 -3
- package/dist/mesh-rte-uniforms.d.ts.map +1 -1
- package/dist/mesh-rte-uniforms.js +16 -2
- package/dist/mesh-rte-uniforms.js.map +1 -1
- package/dist/opaque-visibility-commands.d.ts +3 -0
- package/dist/opaque-visibility-commands.d.ts.map +1 -0
- package/dist/opaque-visibility-commands.js +11 -0
- package/dist/opaque-visibility-commands.js.map +1 -0
- package/dist/opaque-visibility-pass.d.ts +37 -0
- package/dist/opaque-visibility-pass.d.ts.map +1 -0
- package/dist/opaque-visibility-pass.js +230 -0
- package/dist/opaque-visibility-pass.js.map +1 -0
- package/dist/pick-types.d.ts +5 -1
- package/dist/pick-types.d.ts.map +1 -1
- package/dist/picker-rte-uniforms.d.ts +1 -1
- package/dist/picker-rte-uniforms.d.ts.map +1 -1
- package/dist/picker-rte-uniforms.js +4 -2
- package/dist/picker-rte-uniforms.js.map +1 -1
- package/dist/picker-shaders.d.ts +5 -0
- package/dist/picker-shaders.d.ts.map +1 -0
- package/dist/picker-shaders.js +157 -0
- package/dist/picker-shaders.js.map +1 -0
- package/dist/picker.d.ts +3 -0
- package/dist/picker.d.ts.map +1 -1
- package/dist/picker.js +43 -133
- package/dist/picker.js.map +1 -1
- package/dist/pipeline.d.ts +5 -9
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +34 -29
- package/dist/pipeline.js.map +1 -1
- package/dist/point-picker.d.ts +2 -1
- package/dist/point-picker.d.ts.map +1 -1
- package/dist/point-picker.js +12 -4
- package/dist/point-picker.js.map +1 -1
- package/dist/pointcloud/point-cloud-renderer.d.ts +4 -4
- package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-renderer.js +1 -1
- package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
- package/dist/pointcloud/point-cloud-uniforms.d.ts +3 -1
- package/dist/pointcloud/point-cloud-uniforms.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-uniforms.js +3 -1
- package/dist/pointcloud/point-cloud-uniforms.js.map +1 -1
- package/dist/pointcloud/point-pipeline.d.ts +3 -1
- package/dist/pointcloud/point-pipeline.d.ts.map +1 -1
- package/dist/pointcloud/point-pipeline.js +4 -1
- package/dist/pointcloud/point-pipeline.js.map +1 -1
- package/dist/pointcloud/point-shader.wgsl.d.ts +1 -1
- package/dist/pointcloud/point-shader.wgsl.d.ts.map +1 -1
- package/dist/pointcloud/point-shader.wgsl.js +8 -0
- package/dist/pointcloud/point-shader.wgsl.js.map +1 -1
- package/dist/post-pass-chain.d.ts +1 -0
- package/dist/post-pass-chain.d.ts.map +1 -1
- package/dist/post-pass-chain.js +1 -0
- package/dist/post-pass-chain.js.map +1 -1
- package/dist/quantized-lifecycle.d.ts +6 -0
- package/dist/quantized-lifecycle.d.ts.map +1 -0
- package/dist/quantized-lifecycle.js +19 -0
- package/dist/quantized-lifecycle.js.map +1 -0
- package/dist/raycast-engine.d.ts.map +1 -1
- package/dist/raycast-engine.js +3 -2
- package/dist/raycast-engine.js.map +1 -1
- package/dist/render-section-draw.d.ts +5 -0
- package/dist/render-section-draw.d.ts.map +1 -1
- package/dist/render-section-draw.js +59 -25
- package/dist/render-section-draw.js.map +1 -1
- package/dist/render-section-plane.d.ts +5 -33
- package/dist/render-section-plane.d.ts.map +1 -1
- package/dist/render-section-plane.js +8 -175
- package/dist/render-section-plane.js.map +1 -1
- package/dist/renderer-frame-timing.d.ts +1 -0
- package/dist/renderer-frame-timing.d.ts.map +1 -1
- package/dist/renderer-frame-timing.js +8 -1
- package/dist/renderer-frame-timing.js.map +1 -1
- package/dist/renderer-overlays.d.ts +8 -2
- package/dist/renderer-overlays.d.ts.map +1 -1
- package/dist/renderer-overlays.js +22 -45
- package/dist/renderer-overlays.js.map +1 -1
- package/dist/scene-raycaster.d.ts +1 -1
- package/dist/scene-raycaster.d.ts.map +1 -1
- package/dist/scene-raycaster.js +18 -44
- package/dist/scene-raycaster.js.map +1 -1
- package/dist/scene-rect-select.d.ts.map +1 -1
- package/dist/scene-rect-select.js +2 -1
- package/dist/scene-rect-select.js.map +1 -1
- package/dist/section-2d-lift.d.ts +25 -0
- package/dist/section-2d-lift.d.ts.map +1 -1
- package/dist/section-2d-lift.js +35 -0
- package/dist/section-2d-lift.js.map +1 -1
- package/dist/section-2d-overlay.d.ts +41 -12
- package/dist/section-2d-overlay.d.ts.map +1 -1
- package/dist/section-2d-overlay.js +121 -179
- package/dist/section-2d-overlay.js.map +1 -1
- package/dist/section-2d-types.d.ts +2 -0
- package/dist/section-2d-types.d.ts.map +1 -1
- package/dist/section-cap-geometry.d.ts +33 -0
- package/dist/section-cap-geometry.d.ts.map +1 -0
- package/dist/section-cap-geometry.js +137 -0
- package/dist/section-cap-geometry.js.map +1 -0
- package/dist/section-cap-set.d.ts +60 -0
- package/dist/section-cap-set.d.ts.map +1 -0
- package/dist/section-cap-set.js +212 -0
- package/dist/section-cap-set.js.map +1 -0
- package/dist/section-cap-style.d.ts +3 -0
- package/dist/section-cap-style.d.ts.map +1 -1
- package/dist/section-cap-style.js.map +1 -1
- package/dist/section-cap-upload.d.ts +16 -0
- package/dist/section-cap-upload.d.ts.map +1 -0
- package/dist/section-cap-upload.js +52 -0
- package/dist/section-cap-upload.js.map +1 -0
- package/dist/section-exclusions.d.ts +26 -0
- package/dist/section-exclusions.d.ts.map +1 -0
- package/dist/section-exclusions.js +95 -0
- package/dist/section-exclusions.js.map +1 -0
- package/dist/section-plane-frames.d.ts +48 -0
- package/dist/section-plane-frames.d.ts.map +1 -0
- package/dist/section-plane-frames.js +49 -0
- package/dist/section-plane-frames.js.map +1 -0
- package/dist/section-plane-resolve.d.ts +63 -0
- package/dist/section-plane-resolve.d.ts.map +1 -0
- package/dist/section-plane-resolve.js +200 -0
- package/dist/section-plane-resolve.js.map +1 -0
- package/dist/selection-mask-pass.d.ts +2 -0
- package/dist/selection-mask-pass.d.ts.map +1 -1
- package/dist/selection-mask-pass.js +16 -4
- package/dist/selection-mask-pass.js.map +1 -1
- package/dist/selection-mask-pipelines.d.ts +5 -1
- package/dist/selection-mask-pipelines.d.ts.map +1 -1
- package/dist/selection-mask-pipelines.js +27 -3
- package/dist/selection-mask-pipelines.js.map +1 -1
- package/dist/selection-outline-frame.d.ts +3 -1
- package/dist/selection-outline-frame.d.ts.map +1 -1
- package/dist/selection-outline-frame.js +2 -1
- package/dist/selection-outline-frame.js.map +1 -1
- package/dist/shaders/depth-nudge.wgsl.d.ts +2 -2
- package/dist/shaders/depth-nudge.wgsl.d.ts.map +1 -1
- package/dist/shaders/depth-nudge.wgsl.js +1 -18
- package/dist/shaders/depth-nudge.wgsl.js.map +1 -1
- package/dist/shaders/main.wgsl.d.ts +1 -1
- package/dist/shaders/main.wgsl.d.ts.map +1 -1
- package/dist/shaders/main.wgsl.js +9 -1
- package/dist/shaders/main.wgsl.js.map +1 -1
- package/dist/shaders/mesh-uniforms.wgsl.d.ts +1 -1
- package/dist/shaders/mesh-uniforms.wgsl.d.ts.map +1 -1
- package/dist/shaders/mesh-uniforms.wgsl.js +11 -3
- package/dist/shaders/mesh-uniforms.wgsl.js.map +1 -1
- package/dist/shaders/opaque-visibility.wgsl.d.ts +11 -0
- package/dist/shaders/opaque-visibility.wgsl.d.ts.map +1 -0
- package/dist/shaders/opaque-visibility.wgsl.js +55 -0
- package/dist/shaders/opaque-visibility.wgsl.js.map +1 -0
- package/dist/shaders/section-2d-overlay.wgsl.d.ts +11 -5
- package/dist/shaders/section-2d-overlay.wgsl.d.ts.map +1 -1
- package/dist/shaders/section-2d-overlay.wgsl.js +31 -5
- package/dist/shaders/section-2d-overlay.wgsl.js.map +1 -1
- package/dist/shaders/selection-mask.wgsl.d.ts +1 -1
- package/dist/shaders/selection-mask.wgsl.d.ts.map +1 -1
- package/dist/shaders/selection-mask.wgsl.js +10 -4
- package/dist/shaders/selection-mask.wgsl.js.map +1 -1
- package/dist/shaders/shadow.wgsl.d.ts +1 -1
- package/dist/shaders/shadow.wgsl.d.ts.map +1 -1
- package/dist/shaders/shadow.wgsl.js +22 -7
- package/dist/shaders/shadow.wgsl.js.map +1 -1
- package/dist/shaders/symbolic-overlay.wgsl.d.ts +1 -1
- package/dist/shaders/symbolic-overlay.wgsl.d.ts.map +1 -1
- package/dist/shadow-occluders.d.ts.map +1 -1
- package/dist/shadow-occluders.js +4 -0
- package/dist/shadow-occluders.js.map +1 -1
- package/dist/shadow-pass.d.ts +2 -5
- package/dist/shadow-pass.d.ts.map +1 -1
- package/dist/shadow-pass.js +17 -17
- package/dist/shadow-pass.js.map +1 -1
- package/dist/shadow-types.d.ts +7 -0
- package/dist/shadow-types.d.ts.map +1 -1
- package/dist/shadow-types.js.map +1 -1
- package/dist/source-curve-clipping.d.ts.map +1 -1
- package/dist/source-curve-clipping.js +7 -1
- package/dist/source-curve-clipping.js.map +1 -1
- package/dist/source-curve-snap.d.ts.map +1 -1
- package/dist/source-curve-snap.js +2 -1
- package/dist/source-curve-snap.js.map +1 -1
- package/dist/types.d.ts +12 -16
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare function opaqueVisibilityLayout(device: GPUDevice, samples: number): GPUBindGroupLayout;
|
|
2
|
+
/** A compiling frame is discarded before submit; completion requests its replacement. */
|
|
3
|
+
export declare function deferOpaqueVisibilityFrame(error: unknown, requestRender: () => void): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Orthographic only: replay the SAME submitted opaque draws into unbiased
|
|
6
|
+
* sample-matched depth, then constrain the legacy coplanar ranking to it.
|
|
7
|
+
* No second visibility, partial-batch, texture or instancing enumeration.
|
|
8
|
+
*/
|
|
9
|
+
export declare class OpaqueVisibilityPass {
|
|
10
|
+
private readonly device;
|
|
11
|
+
private readonly samples;
|
|
12
|
+
private readonly sectionBinding?;
|
|
13
|
+
private readonly registrations;
|
|
14
|
+
private readonly variants;
|
|
15
|
+
private readonly pending;
|
|
16
|
+
private readonly failures;
|
|
17
|
+
private destroyed;
|
|
18
|
+
private texture;
|
|
19
|
+
private binding;
|
|
20
|
+
private width;
|
|
21
|
+
private height;
|
|
22
|
+
private active;
|
|
23
|
+
constructor(device: GPUDevice, samples: number, sectionBinding?: (() => GPUBindGroup) | undefined);
|
|
24
|
+
create(descriptor: GPURenderPipelineDescriptor, source?: string): GPURenderPipeline;
|
|
25
|
+
createAsync(descriptor: GPURenderPipelineDescriptor, source?: string): Promise<GPURenderPipeline>;
|
|
26
|
+
register(pipeline: GPURenderPipeline, descriptor: GPURenderPipelineDescriptor, source: string): GPURenderPipeline;
|
|
27
|
+
getBinding(): GPUBindGroup | undefined;
|
|
28
|
+
private ensureSize;
|
|
29
|
+
/** Explicit setup for async consumers; the render path requests only used variants. */
|
|
30
|
+
prepare(base?: GPURenderPipeline): Promise<void>;
|
|
31
|
+
private forPipeline;
|
|
32
|
+
private buildVariants;
|
|
33
|
+
begin(encoder: GPUCommandEncoder, descriptor: GPURenderPassDescriptor, orthographic: boolean, width: number, height: number): GPURenderPassEncoder;
|
|
34
|
+
private releaseTexture;
|
|
35
|
+
destroy(): void;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=opaque-visibility-pass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opaque-visibility-pass.d.ts","sourceRoot":"","sources":["../src/opaque-visibility-pass.ts"],"names":[],"mappings":"AAUA,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAU7F;AAQD,yFAAyF;AACzF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,GAAG,OAAO,CAK7F;AAED;;;;GAIG;AACH,qBAAa,oBAAoB;IAYnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAa,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAU,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAXlH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8C;IAC5E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;IAClE,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAS;gBAEM,MAAM,EAAE,SAAS,EAAmB,OAAO,EAAE,MAAM,EAAmB,cAAc,CAAC,GAAE,MAAM,YAAY,aAAA;IAEtI,MAAM,CAAC,UAAU,EAAE,2BAA2B,EAAE,MAAM,SAAmB,GAAG,iBAAiB;IAIvF,WAAW,CAAC,UAAU,EAAE,2BAA2B,EAAE,MAAM,SAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjH,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,2BAA2B,EAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB;IAKjH,UAAU,IAAI,YAAY,GAAG,SAAS;IAEtC,OAAO,CAAC,UAAU;IASlB,uFAAuF;IACjF,OAAO,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAetD,OAAO,CAAC,WAAW;YAOL,aAAa;IAkB3B,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,uBAAuB,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,oBAAoB;IAwDlJ,OAAO,CAAC,cAAc;IAItB,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,230 @@
|
|
|
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 { guardedMeshShader, unbiasedMeshShader, OPAQUE_VISIBILITY_GROUP } from './shaders/opaque-visibility.wgsl.js';
|
|
5
|
+
import { mainShaderSource } from './shaders/main.wgsl.js';
|
|
6
|
+
import { setOpaqueVisibilityCommands } from './opaque-visibility-commands.js';
|
|
7
|
+
import { opaqueVisibilityTimestampWrites } from './renderer-frame-timing.js';
|
|
8
|
+
const layouts = new WeakMap();
|
|
9
|
+
export function opaqueVisibilityLayout(device, samples) {
|
|
10
|
+
let bySamples = layouts.get(device);
|
|
11
|
+
if (!bySamples) {
|
|
12
|
+
bySamples = new Map();
|
|
13
|
+
layouts.set(device, bySamples);
|
|
14
|
+
}
|
|
15
|
+
let layout = bySamples.get(samples);
|
|
16
|
+
if (!layout) {
|
|
17
|
+
layout = device.createBindGroupLayout({ entries: [{ binding: 0, visibility: GPUShaderStage.FRAGMENT,
|
|
18
|
+
texture: { sampleType: 'depth', multisampled: samples > 1 } }] });
|
|
19
|
+
bySamples.set(samples, layout);
|
|
20
|
+
}
|
|
21
|
+
return layout;
|
|
22
|
+
}
|
|
23
|
+
class PendingVisibility extends Error {
|
|
24
|
+
ready;
|
|
25
|
+
alive;
|
|
26
|
+
constructor(ready, alive) {
|
|
27
|
+
super('Orthographic pipelines are compiling');
|
|
28
|
+
this.ready = ready;
|
|
29
|
+
this.alive = alive;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** A compiling frame is discarded before submit; completion requests its replacement. */
|
|
33
|
+
export function deferOpaqueVisibilityFrame(error, requestRender) {
|
|
34
|
+
if (!(error instanceof PendingVisibility))
|
|
35
|
+
return false;
|
|
36
|
+
const wake = () => { if (error.alive())
|
|
37
|
+
requestRender(); };
|
|
38
|
+
void error.ready.then(wake, wake); // Rejection is retained and thrown on the next draw.
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Orthographic only: replay the SAME submitted opaque draws into unbiased
|
|
43
|
+
* sample-matched depth, then constrain the legacy coplanar ranking to it.
|
|
44
|
+
* No second visibility, partial-batch, texture or instancing enumeration.
|
|
45
|
+
*/
|
|
46
|
+
export class OpaqueVisibilityPass {
|
|
47
|
+
device;
|
|
48
|
+
samples;
|
|
49
|
+
sectionBinding;
|
|
50
|
+
registrations = new Map();
|
|
51
|
+
variants = new Map();
|
|
52
|
+
pending = new Map();
|
|
53
|
+
failures = new Map();
|
|
54
|
+
destroyed = false;
|
|
55
|
+
texture = null;
|
|
56
|
+
binding = null;
|
|
57
|
+
width = 0;
|
|
58
|
+
height = 0;
|
|
59
|
+
active = false;
|
|
60
|
+
constructor(device, samples, sectionBinding) {
|
|
61
|
+
this.device = device;
|
|
62
|
+
this.samples = samples;
|
|
63
|
+
this.sectionBinding = sectionBinding;
|
|
64
|
+
}
|
|
65
|
+
create(descriptor, source = mainShaderSource) {
|
|
66
|
+
return this.register(this.device.createRenderPipeline(descriptor), descriptor, source);
|
|
67
|
+
}
|
|
68
|
+
async createAsync(descriptor, source = mainShaderSource) {
|
|
69
|
+
return this.register(await this.device.createRenderPipelineAsync(descriptor), descriptor, source);
|
|
70
|
+
}
|
|
71
|
+
register(pipeline, descriptor, source) {
|
|
72
|
+
if (this.destroyed)
|
|
73
|
+
throw new Error('Visibility pass was destroyed during compilation');
|
|
74
|
+
this.registrations.set(pipeline, { descriptor, source });
|
|
75
|
+
return pipeline;
|
|
76
|
+
}
|
|
77
|
+
getBinding() { return this.active ? this.binding ?? undefined : undefined; }
|
|
78
|
+
ensureSize(width, height) {
|
|
79
|
+
if (this.texture && width === this.width && height === this.height)
|
|
80
|
+
return;
|
|
81
|
+
this.texture?.destroy();
|
|
82
|
+
this.width = width;
|
|
83
|
+
this.height = height;
|
|
84
|
+
this.texture = this.device.createTexture({ label: 'opaque-geometric-depth', size: [width, height],
|
|
85
|
+
sampleCount: this.samples, format: 'depth32float', usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING });
|
|
86
|
+
this.binding = this.device.createBindGroup({ layout: opaqueVisibilityLayout(this.device, this.samples),
|
|
87
|
+
entries: [{ binding: 0, resource: this.texture.createView() }] });
|
|
88
|
+
}
|
|
89
|
+
/** Explicit setup for async consumers; the render path requests only used variants. */
|
|
90
|
+
async prepare(base) {
|
|
91
|
+
if (!base) {
|
|
92
|
+
await Promise.all([...this.registrations.keys()].map(pipeline => this.prepare(pipeline)));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (this.variants.has(base))
|
|
96
|
+
return;
|
|
97
|
+
let ready = this.pending.get(base);
|
|
98
|
+
if (!ready) {
|
|
99
|
+
const registration = this.registrations.get(base);
|
|
100
|
+
if (!registration)
|
|
101
|
+
return;
|
|
102
|
+
ready = this.buildVariants(base, registration).then(variants => {
|
|
103
|
+
if (!this.destroyed && variants)
|
|
104
|
+
this.variants.set(base, variants);
|
|
105
|
+
}, error => { this.failures.set(base, error); throw error; });
|
|
106
|
+
this.pending.set(base, ready);
|
|
107
|
+
}
|
|
108
|
+
await ready;
|
|
109
|
+
}
|
|
110
|
+
forPipeline(base) {
|
|
111
|
+
if (this.failures.has(base))
|
|
112
|
+
throw this.failures.get(base);
|
|
113
|
+
const variants = this.variants.get(base);
|
|
114
|
+
if (variants || !this.registrations.get(base)?.descriptor.fragment)
|
|
115
|
+
return variants;
|
|
116
|
+
throw new PendingVisibility(this.prepare(base), () => !this.destroyed);
|
|
117
|
+
}
|
|
118
|
+
async buildVariants(base, registration) {
|
|
119
|
+
const { descriptor: d, source } = registration;
|
|
120
|
+
const fragment = d.fragment;
|
|
121
|
+
if (!fragment)
|
|
122
|
+
return undefined;
|
|
123
|
+
const module = this.device.createShaderModule({ code: guardedMeshShader(source, this.samples, fragment.entryPoint ?? 'fs_main') });
|
|
124
|
+
const colour = await this.device.createRenderPipelineAsync({ ...d,
|
|
125
|
+
layout: this.device.createPipelineLayout({ bindGroupLayouts: [base.getBindGroupLayout(0), base.getBindGroupLayout(1), opaqueVisibilityLayout(this.device, this.samples), base.getBindGroupLayout(3)] }),
|
|
126
|
+
vertex: { ...d.vertex, module }, fragment: { ...fragment, module } });
|
|
127
|
+
let depth = null;
|
|
128
|
+
if (d.depthStencil?.depthWriteEnabled) {
|
|
129
|
+
const unbiased = this.device.createShaderModule({ code: unbiasedMeshShader(source, this.samples, fragment.entryPoint ?? 'fs_main') });
|
|
130
|
+
depth = await this.device.createRenderPipelineAsync({ ...d, vertex: { ...d.vertex, module: unbiased },
|
|
131
|
+
fragment: { module: unbiased, entryPoint: 'fs_geometric_depth', targets: [] },
|
|
132
|
+
depthStencil: { format: 'depth32float', depthWriteEnabled: true, depthCompare: 'greater' } });
|
|
133
|
+
}
|
|
134
|
+
return { colour, depth };
|
|
135
|
+
}
|
|
136
|
+
begin(encoder, descriptor, orthographic, width, height) {
|
|
137
|
+
this.active = orthographic;
|
|
138
|
+
const main = encoder.beginRenderPass(descriptor);
|
|
139
|
+
const section = this.sectionBinding?.();
|
|
140
|
+
if (section)
|
|
141
|
+
main.setBindGroup(3, section);
|
|
142
|
+
if (!orthographic) {
|
|
143
|
+
this.releaseTexture();
|
|
144
|
+
return main;
|
|
145
|
+
}
|
|
146
|
+
this.ensureSize(width, height);
|
|
147
|
+
const before = this.device.createCommandEncoder({ label: 'opaque-visibility-before-main' });
|
|
148
|
+
const depthPass = before.beginRenderPass({
|
|
149
|
+
timestampWrites: opaqueVisibilityTimestampWrites(encoder, before),
|
|
150
|
+
colorAttachments: [],
|
|
151
|
+
depthStencilAttachment: { view: this.texture.createView(), depthClearValue: 0, depthLoadOp: 'clear', depthStoreOp: 'store' },
|
|
152
|
+
});
|
|
153
|
+
let variant;
|
|
154
|
+
const groups = new Map(), vertices = new Map();
|
|
155
|
+
if (section)
|
|
156
|
+
groups.set(3, [3, section]);
|
|
157
|
+
let indices;
|
|
158
|
+
const raster = new Map();
|
|
159
|
+
const methods = new Map();
|
|
160
|
+
const invoke = (pass, name, args) => Reflect.apply(Reflect.get(pass, name), pass, args);
|
|
161
|
+
const draw = (name, args) => {
|
|
162
|
+
if (variant?.depth) {
|
|
163
|
+
depthPass.setPipeline(variant.depth);
|
|
164
|
+
for (const [group, args] of groups)
|
|
165
|
+
if (group !== OPAQUE_VISIBILITY_GROUP)
|
|
166
|
+
invoke(depthPass, 'setBindGroup', args);
|
|
167
|
+
for (const args of vertices.values())
|
|
168
|
+
invoke(depthPass, 'setVertexBuffer', args);
|
|
169
|
+
if (indices)
|
|
170
|
+
invoke(depthPass, 'setIndexBuffer', indices);
|
|
171
|
+
for (const [method, args] of raster)
|
|
172
|
+
invoke(depthPass, method, args);
|
|
173
|
+
invoke(depthPass, name, args);
|
|
174
|
+
}
|
|
175
|
+
if (variant)
|
|
176
|
+
main.setBindGroup(OPAQUE_VISIBILITY_GROUP, this.binding);
|
|
177
|
+
invoke(main, name, args);
|
|
178
|
+
};
|
|
179
|
+
// Proxy retains the actual pass API for existing mesh/overlay helpers. Only
|
|
180
|
+
// orthographic frames pay interception; perspective returns the real pass.
|
|
181
|
+
return new Proxy(main, { get: (target, key) => {
|
|
182
|
+
if (methods.has(key))
|
|
183
|
+
return methods.get(key);
|
|
184
|
+
const member = Reflect.get(target, key);
|
|
185
|
+
if (typeof member !== 'function')
|
|
186
|
+
return member;
|
|
187
|
+
const method = (...args) => {
|
|
188
|
+
if (key === 'setPipeline') {
|
|
189
|
+
variant = this.forPipeline(args[0]);
|
|
190
|
+
return main.setPipeline(variant?.colour ?? args[0]);
|
|
191
|
+
}
|
|
192
|
+
if (key === 'setBindGroup')
|
|
193
|
+
groups.set(args[0], args);
|
|
194
|
+
if (key === 'setVertexBuffer')
|
|
195
|
+
vertices.set(args[0], args);
|
|
196
|
+
if (key === 'setIndexBuffer')
|
|
197
|
+
indices = args;
|
|
198
|
+
if (key === 'setViewport' || key === 'setScissorRect' || key === 'setBlendConstant')
|
|
199
|
+
raster.set(key, args);
|
|
200
|
+
if (key === 'draw' || key === 'drawIndexed' || key === 'drawIndirect' || key === 'drawIndexedIndirect')
|
|
201
|
+
return draw(key, args);
|
|
202
|
+
if (key === 'executeBundles')
|
|
203
|
+
throw new Error('Opaque visibility requires prepared draws, not an opaque render bundle');
|
|
204
|
+
if (key === 'end') {
|
|
205
|
+
depthPass.end();
|
|
206
|
+
setOpaqueVisibilityCommands(encoder, before.finish());
|
|
207
|
+
}
|
|
208
|
+
return Reflect.apply(member, target, args);
|
|
209
|
+
};
|
|
210
|
+
methods.set(key, method);
|
|
211
|
+
return method;
|
|
212
|
+
} });
|
|
213
|
+
}
|
|
214
|
+
releaseTexture() {
|
|
215
|
+
this.texture?.destroy();
|
|
216
|
+
this.texture = null;
|
|
217
|
+
this.binding = null;
|
|
218
|
+
this.width = 0;
|
|
219
|
+
this.height = 0;
|
|
220
|
+
}
|
|
221
|
+
destroy() {
|
|
222
|
+
this.destroyed = true;
|
|
223
|
+
this.releaseTexture();
|
|
224
|
+
this.variants.clear();
|
|
225
|
+
this.registrations.clear();
|
|
226
|
+
this.failures.clear();
|
|
227
|
+
this.pending.clear();
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=opaque-visibility-pass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opaque-visibility-pass.js","sourceRoot":"","sources":["../src/opaque-visibility-pass.ts"],"names":[],"mappings":"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"}
|
package/dist/pick-types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClipBox } from './types.js';
|
|
1
|
+
import type { ClipBox, ExtraClipPlane } from './types.js';
|
|
2
2
|
/** Options for GPU picking/selection, matching rendered visibility. */
|
|
3
3
|
export interface PickOptions {
|
|
4
4
|
isStreaming?: boolean;
|
|
@@ -7,11 +7,15 @@ export interface PickOptions {
|
|
|
7
7
|
}
|
|
8
8
|
/** Clip state the GPU picker mirrors from the most recent rendered frame. */
|
|
9
9
|
export interface PickClipState {
|
|
10
|
+
/** Full scene ids exempt from primary and extra section planes; crop boxes still apply. */
|
|
11
|
+
sectionExcludedIds?: ReadonlySet<number>;
|
|
10
12
|
sectionPlane?: {
|
|
11
13
|
normal: [number, number, number];
|
|
12
14
|
distance: number;
|
|
13
15
|
flipped: boolean;
|
|
14
16
|
} | null;
|
|
17
|
+
/** Further planes (#7545), world-space; the picker clips against all of them. */
|
|
18
|
+
extraPlanes?: readonly ExtraClipPlane[] | null;
|
|
15
19
|
clipBox?: ClipBox | null;
|
|
16
20
|
}
|
|
17
21
|
//# sourceMappingURL=pick-types.d.ts.map
|
package/dist/pick-types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pick-types.d.ts","sourceRoot":"","sources":["../src/pick-types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"pick-types.d.ts","sourceRoot":"","sources":["../src/pick-types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE1D,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CAClC;AAED,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,2FAA2F;IAC3F,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE;QAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/F,iFAAiF;IACjF,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC1B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type RelativeToEyeSnapshot } from './relative-to-eye.js';
|
|
2
2
|
import type { Mesh, PickClipState } from './types.js';
|
|
3
|
-
export declare function writePickUniforms(device: GPUDevice, buffer: GPUBuffer, scratch: Float32Array, clipFlags: Uint32Array, viewProj: Float32Array, clip?: PickClipState | null): void;
|
|
3
|
+
export declare function writePickUniforms(device: GPUDevice, buffer: GPUBuffer, scratch: Float32Array, clipFlags: Uint32Array, viewProj: Float32Array, clip?: PickClipState | null, expressId?: number, slot?: number): void;
|
|
4
4
|
/**
|
|
5
5
|
* Write one flat mesh's pick uniforms into dynamic slot `slot`. Returns false,
|
|
6
6
|
* writing nothing, for a mesh outside the snapshot's camera-relative envelope:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker-rte-uniforms.d.ts","sourceRoot":"","sources":["../src/picker-rte-uniforms.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,YAAY,EACtB,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"picker-rte-uniforms.d.ts","sourceRoot":"","sources":["../src/picker-rte-uniforms.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,YAAY,EACtB,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,EAC3B,SAAS,SAAI,EACb,IAAI,SAAI,GACP,IAAI,CAON;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,WAAW,EACtB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,qBAAqB,EAC/B,IAAI,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EACtC,IAAI,EAAE,MAAM,GACX,OAAO,CAcT;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,qBAAqB,EAC/B,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,GAC1B,IAAI,CAQN"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { packPickClip, packPickUniforms } from './pick-uniforms.js';
|
|
6
6
|
import { packRteOrigin } from './relative-to-eye.js';
|
|
7
7
|
import { packRteClipBox, rtePlaneDistance } from './rte-clip-space.js';
|
|
8
|
-
export function writePickUniforms(device, buffer, scratch, clipFlags, viewProj, clip) {
|
|
8
|
+
export function writePickUniforms(device, buffer, scratch, clipFlags, viewProj, clip, expressId = 0, slot = 0) {
|
|
9
9
|
scratch.fill(0);
|
|
10
10
|
scratch.set(viewProj, 0);
|
|
11
11
|
scratch[16] = 1;
|
|
@@ -13,7 +13,8 @@ export function writePickUniforms(device, buffer, scratch, clipFlags, viewProj,
|
|
|
13
13
|
scratch[26] = 1;
|
|
14
14
|
scratch[31] = 1;
|
|
15
15
|
packPickClip(clip, scratch, clipFlags, 32);
|
|
16
|
-
|
|
16
|
+
clipFlags[1] = expressId;
|
|
17
|
+
device.queue.writeBuffer(buffer, slot * 256, scratch);
|
|
17
18
|
}
|
|
18
19
|
/**
|
|
19
20
|
* Write one flat mesh's pick uniforms into dynamic slot `slot`. Returns false,
|
|
@@ -32,6 +33,7 @@ export function writeFlatPickUniform(device, buffer, scratch, clipFlags, mesh, s
|
|
|
32
33
|
packRteClipBox(clip?.clipBox, camera, scratch, 32);
|
|
33
34
|
if (clip?.sectionPlane)
|
|
34
35
|
scratch[43] = rtePlaneDistance(clip.sectionPlane.distance, clip.sectionPlane.normal, camera);
|
|
36
|
+
clipFlags[1] = mesh.expressId;
|
|
35
37
|
device.queue.writeBuffer(buffer, slot * 256, scratch);
|
|
36
38
|
return true;
|
|
37
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker-rte-uniforms.js","sourceRoot":"","sources":["../src/picker-rte-uniforms.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,iEAAiE;AAEjE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,aAAa,EAA8B,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvE,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,MAAiB,EACjB,OAAqB,EACrB,SAAsB,EACtB,QAAsB,EACtB,IAA2B;
|
|
1
|
+
{"version":3,"file":"picker-rte-uniforms.js","sourceRoot":"","sources":["../src/picker-rte-uniforms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Flat meshes: one dynamic-offset uniform slot per mesh, expressIds in a storage buffer. */
|
|
2
|
+
export declare const flatPickShaderWgsl = "\n \nstruct RteFrameUniform {\n // Camera translation is intentionally absent. This projects positions\n // returned by rteWorldPosition, which are already relative to the eye.\n viewProj: mat4x4<f32>,\n}\n\nstruct RteDrawableUniform {\n // CPU computes (drawable origin - camera origin) in f64 and splits it.\n // This data must be refreshed whenever the RTE camera frame changes.\n drawableDeltaHigh: vec4<f32>,\n drawableDeltaLow: vec4<f32>,\n}\n\nfn rteWorldPosition(\n local: vec3<f32>,\n drawable: RteDrawableUniform,\n) -> vec4<f32> {\n // Do not subtract a camera origin here: this delta was formed in CPU f64.\n let highDelta = drawable.drawableDeltaHigh.xyz;\n let lowDelta = drawable.drawableDeltaLow.xyz;\n // A drawable template can span kilometres. Keep local with high first;\n // The local-plus-(high-plus-low) association is not equivalent in f32.\n return vec4<f32>((local + highDelta) + lowDelta, 1.0);\n}\n\n \n struct ExtraClip {\n planeInfo: vec4<u32>, // x = plane count, y = flipped bit mask\n planes: array<vec4<f32>, 7>, // xyz = normal, w = distance\n }\n\n // True when p is on the removed side of ANY extra plane.\n fn extraClipClipped(clip: ExtraClip, p: vec3<f32>) -> bool {\n for (var i = 0u; i < clip.planeInfo.x; i = i + 1u) {\n let side = select(1.0, -1.0, ((clip.planeInfo.y >> i) & 1u) == 1u);\n if ((dot(p, clip.planes[i].xyz) - clip.planes[i].w) * side > 0.0) { return true; }\n }\n return false;\n }\n\n \n@group(3) @binding(0) var<storage, read> sectionExcludedIds: array<u32>;\n// Scene colour buckets are partitioned by 2^24 ID page. Reject an invalid anchor.\nfn sectionEntityFromLane(anchor: u32, lane: u32) -> u32 {\n return select(anchor + ((lane - anchor) & 0x00FFFFFFu), 0xFFFFFFFFu, anchor == 0xFFFFFFFFu);\n}\nfn sectionExcluded(id: u32) -> bool {\n var lo = 0u;\n var hi = sectionExcludedIds[0];\n while (lo < hi) {\n let mid = lo + (hi - lo) / 2u;\n let key = sectionExcludedIds[mid + 1u];\n if (key == id) { return true; }\n if (key < id) { lo = mid + 1u; } else { hi = mid; }\n }\n return false;\n}\n\n struct Uniforms {\n viewProj: mat4x4<f32>, // translation-free RTE projection\n model: mat4x4<f32>, // linear transform; translation lives in originHigh/Low\n clipBoxMin: vec4<f32>, // xyz = min corner (world), w = pad\n clipBoxMax: vec4<f32>, // xyz = max corner (world), w = pad\n sectionPlane: vec4<f32>, // xyz = plane normal, w = plane distance\n clipFlags: vec4<u32>, // x: bit0 sectionEnabled, bit1 flipped, bit2 clipBox\n originHigh: vec4<f32>,\n originLow: vec4<f32>,\n }\n @binding(0) @group(0) var<uniform> uniforms: Uniforms;\n @binding(1) @group(0) var<storage, read> expressIds: array<u32>;\n @binding(2) @group(0) var<uniform> extraClip: ExtraClip;\n\n struct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) normal: vec3<f32>,\n }\n\n struct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) @interpolate(flat) objectId: u32,\n @location(1) worldPos: vec3<f32>,\n }\n\n @vertex\n fn vs_main(input: VertexInput, @builtin(instance_index) instanceIndex: u32) -> VertexOutput {\n var output: VertexOutput;\n let linear = (uniforms.model * vec4<f32>(input.position, 0.0)).xyz;\n let relative = rteWorldPosition(linear, RteDrawableUniform(uniforms.originHigh, uniforms.originLow)).xyz;\n output.position = uniforms.viewProj * vec4<f32>(relative, 1.0);\n output.worldPos = relative;\n // Look up expressId from storage buffer using instance index\n output.objectId = expressIds[instanceIndex];\n return output;\n }\n\n @fragment\n fn fs_main(input: VertexOutput) -> @location(0) u32 {\n let excluded = sectionExcluded(uniforms.clipFlags.y);\n // Mirror the main render's clip discards so a click can't select a\n // fragment the user has sectioned or cropped out of view.\n if (!excluded && (uniforms.clipFlags.x & 1u) != 0u) { // section plane enabled\n let flipped = (uniforms.clipFlags.x & 2u) != 0u;\n let side = select(1.0, -1.0, flipped);\n let distToPlane = (dot(input.worldPos, uniforms.sectionPlane.xyz) - uniforms.sectionPlane.w) * side;\n if (distToPlane > 0.0) {\n discard;\n }\n }\n if (!excluded && extraClipClipped(extraClip, input.worldPos)) { // cutting planes beyond the first (#7545)\n discard;\n }\n if ((uniforms.clipFlags.x & 4u) != 0u) { // clip box enabled\n let p = input.worldPos;\n if (any(p < uniforms.clipBoxMin.xyz) || any(p > uniforms.clipBoxMax.xyz)) {\n discard;\n }\n }\n return input.objectId;\n }\n ";
|
|
3
|
+
/** Instanced occurrences: per-instance matrix, express id and flags in the instance buffer. */
|
|
4
|
+
export declare const instancedPickShaderWgsl = "\n \nstruct RteFrameUniform {\n // Camera translation is intentionally absent. This projects positions\n // returned by rteWorldPosition, which are already relative to the eye.\n viewProj: mat4x4<f32>,\n}\n\nstruct RteDrawableUniform {\n // CPU computes (drawable origin - camera origin) in f64 and splits it.\n // This data must be refreshed whenever the RTE camera frame changes.\n drawableDeltaHigh: vec4<f32>,\n drawableDeltaLow: vec4<f32>,\n}\n\nfn rteWorldPosition(\n local: vec3<f32>,\n drawable: RteDrawableUniform,\n) -> vec4<f32> {\n // Do not subtract a camera origin here: this delta was formed in CPU f64.\n let highDelta = drawable.drawableDeltaHigh.xyz;\n let lowDelta = drawable.drawableDeltaLow.xyz;\n // A drawable template can span kilometres. Keep local with high first;\n // The local-plus-(high-plus-low) association is not equivalent in f32.\n return vec4<f32>((local + highDelta) + lowDelta, 1.0);\n}\n\n \n struct ExtraClip {\n planeInfo: vec4<u32>, // x = plane count, y = flipped bit mask\n planes: array<vec4<f32>, 7>, // xyz = normal, w = distance\n }\n\n // True when p is on the removed side of ANY extra plane.\n fn extraClipClipped(clip: ExtraClip, p: vec3<f32>) -> bool {\n for (var i = 0u; i < clip.planeInfo.x; i = i + 1u) {\n let side = select(1.0, -1.0, ((clip.planeInfo.y >> i) & 1u) == 1u);\n if ((dot(p, clip.planes[i].xyz) - clip.planes[i].w) * side > 0.0) { return true; }\n }\n return false;\n }\n\n \n@group(3) @binding(0) var<storage, read> sectionExcludedIds: array<u32>;\n// Scene colour buckets are partitioned by 2^24 ID page. Reject an invalid anchor.\nfn sectionEntityFromLane(anchor: u32, lane: u32) -> u32 {\n return select(anchor + ((lane - anchor) & 0x00FFFFFFu), 0xFFFFFFFFu, anchor == 0xFFFFFFFFu);\n}\nfn sectionExcluded(id: u32) -> bool {\n var lo = 0u;\n var hi = sectionExcludedIds[0];\n while (lo < hi) {\n let mid = lo + (hi - lo) / 2u;\n let key = sectionExcludedIds[mid + 1u];\n if (key == id) { return true; }\n if (key < id) { lo = mid + 1u; } else { hi = mid; }\n }\n return false;\n}\n\n struct Uniforms {\n viewProj: mat4x4<f32>,\n clipBoxMin: vec4<f32>, // xyz = min corner (world), w = pad\n clipBoxMax: vec4<f32>, // xyz = max corner (world), w = pad\n sectionPlane: vec4<f32>, // xyz = plane normal, w = plane distance\n clipFlags: vec4<u32>, // x: bit0 sectionEnabled, bit1 flipped, bit2 clipBox\n cameraHigh: vec4<f32>,\n cameraLow: vec4<f32>,\n }\n @binding(0) @group(0) var<uniform> uniforms: Uniforms;\n @binding(1) @group(0) var<uniform> extraClip: ExtraClip;\n struct VertexInput { @location(0) position: vec3<f32> }\n struct InstanceInput {\n @location(3) m0: vec4<f32>,\n @location(4) m1: vec4<f32>,\n @location(5) m2: vec4<f32>,\n @location(6) m3: vec4<f32>,\n @location(7) instEntityId: u32,\n @location(9) instFlags: u32,\n @location(10) anchorHigh: vec4<f32>,\n @location(11) anchorLow: vec4<f32>,\n }\n struct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) @interpolate(flat) objectId: u32,\n @location(1) @interpolate(flat) instFlags: u32,\n @location(2) worldPos: vec3<f32>,\n @location(3) @interpolate(flat) sectionEntityId: u32,\n }\n @vertex\n fn vs_main(input: VertexInput, inst: InstanceInput) -> VertexOutput {\n var output: VertexOutput;\n let m = mat4x4<f32>(inst.m0, inst.m1, inst.m2, inst.m3);\n let linear = (m * vec4<f32>(input.position, 0.0)).xyz;\n let relative = rteWorldPosition(linear, RteDrawableUniform(inst.anchorHigh, inst.anchorLow)).xyz;\n output.position = uniforms.viewProj * vec4<f32>(relative, 1.0);\n output.worldPos = relative;\n // bit 30 = instanced marker; express id in the low 30 bits.\n output.objectId = 0x40000000u | (inst.instEntityId & 0x3FFFFFFFu);\n output.sectionEntityId = inst.instEntityId;\n output.instFlags = inst.instFlags;\n return output;\n }\n @fragment\n fn fs_main(input: VertexOutput) -> @location(0) u32 {\n let excluded = sectionExcluded(input.sectionEntityId);\n // Hidden occurrences (flags bit 1) are not pickable \u2014 mirror the render-pass\n // discard so a hidden instanced element can't be selected through the picker.\n if ((input.instFlags & 2u) != 0u) {\n discard;\n }\n // Mirror the main render's section + crop-box discards for occurrences.\n if (!excluded && (uniforms.clipFlags.x & 1u) != 0u) { // section plane enabled\n let flipped = (uniforms.clipFlags.x & 2u) != 0u;\n let side = select(1.0, -1.0, flipped);\n let distToPlane = (dot(input.worldPos, uniforms.sectionPlane.xyz) - uniforms.sectionPlane.w) * side;\n if (distToPlane > 0.0) {\n discard;\n }\n }\n if (!excluded && extraClipClipped(extraClip, input.worldPos)) { // cutting planes beyond the first (#7545)\n discard;\n }\n if ((uniforms.clipFlags.x & 4u) != 0u) { // clip box enabled\n let p = input.worldPos;\n if (any(p < uniforms.clipBoxMin.xyz) || any(p > uniforms.clipBoxMax.xyz)) {\n discard;\n }\n }\n return input.objectId;\n }\n ";
|
|
5
|
+
//# sourceMappingURL=picker-shaders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker-shaders.d.ts","sourceRoot":"","sources":["../src/picker-shaders.ts"],"names":[],"mappings":"AAeA,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,mhKAiExB,CAAC;AAER,+FAA+F;AAC/F,eAAO,MAAM,uBAAuB,mlLA2E7B,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
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
|
+
/**
|
|
5
|
+
* The GPU picker's WGSL, lifted out of `picker.ts`: the flat-mesh pick pass and
|
|
6
|
+
* the instanced-occurrence pick pass. Both mirror the colour pass's clip
|
|
7
|
+
* discards (section plane, the cutting planes beyond it, crop box), so a click
|
|
8
|
+
* cannot select a fragment the user has cut away.
|
|
9
|
+
*/
|
|
10
|
+
import { relativeToEyeWgsl } from './shaders/relative-to-eye.wgsl.js';
|
|
11
|
+
import { sectionExclusionsWgsl } from './section-exclusions.js';
|
|
12
|
+
import { extraClipWgsl } from './extra-clip-planes.js';
|
|
13
|
+
/** Flat meshes: one dynamic-offset uniform slot per mesh, expressIds in a storage buffer. */
|
|
14
|
+
export const flatPickShaderWgsl = `
|
|
15
|
+
${relativeToEyeWgsl}
|
|
16
|
+
${extraClipWgsl}
|
|
17
|
+
${sectionExclusionsWgsl}
|
|
18
|
+
struct Uniforms {
|
|
19
|
+
viewProj: mat4x4<f32>, // translation-free RTE projection
|
|
20
|
+
model: mat4x4<f32>, // linear transform; translation lives in originHigh/Low
|
|
21
|
+
clipBoxMin: vec4<f32>, // xyz = min corner (world), w = pad
|
|
22
|
+
clipBoxMax: vec4<f32>, // xyz = max corner (world), w = pad
|
|
23
|
+
sectionPlane: vec4<f32>, // xyz = plane normal, w = plane distance
|
|
24
|
+
clipFlags: vec4<u32>, // x: bit0 sectionEnabled, bit1 flipped, bit2 clipBox
|
|
25
|
+
originHigh: vec4<f32>,
|
|
26
|
+
originLow: vec4<f32>,
|
|
27
|
+
}
|
|
28
|
+
@binding(0) @group(0) var<uniform> uniforms: Uniforms;
|
|
29
|
+
@binding(1) @group(0) var<storage, read> expressIds: array<u32>;
|
|
30
|
+
@binding(2) @group(0) var<uniform> extraClip: ExtraClip;
|
|
31
|
+
|
|
32
|
+
struct VertexInput {
|
|
33
|
+
@location(0) position: vec3<f32>,
|
|
34
|
+
@location(1) normal: vec3<f32>,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
struct VertexOutput {
|
|
38
|
+
@builtin(position) position: vec4<f32>,
|
|
39
|
+
@location(0) @interpolate(flat) objectId: u32,
|
|
40
|
+
@location(1) worldPos: vec3<f32>,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@vertex
|
|
44
|
+
fn vs_main(input: VertexInput, @builtin(instance_index) instanceIndex: u32) -> VertexOutput {
|
|
45
|
+
var output: VertexOutput;
|
|
46
|
+
let linear = (uniforms.model * vec4<f32>(input.position, 0.0)).xyz;
|
|
47
|
+
let relative = rteWorldPosition(linear, RteDrawableUniform(uniforms.originHigh, uniforms.originLow)).xyz;
|
|
48
|
+
output.position = uniforms.viewProj * vec4<f32>(relative, 1.0);
|
|
49
|
+
output.worldPos = relative;
|
|
50
|
+
// Look up expressId from storage buffer using instance index
|
|
51
|
+
output.objectId = expressIds[instanceIndex];
|
|
52
|
+
return output;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@fragment
|
|
56
|
+
fn fs_main(input: VertexOutput) -> @location(0) u32 {
|
|
57
|
+
let excluded = sectionExcluded(uniforms.clipFlags.y);
|
|
58
|
+
// Mirror the main render's clip discards so a click can't select a
|
|
59
|
+
// fragment the user has sectioned or cropped out of view.
|
|
60
|
+
if (!excluded && (uniforms.clipFlags.x & 1u) != 0u) { // section plane enabled
|
|
61
|
+
let flipped = (uniforms.clipFlags.x & 2u) != 0u;
|
|
62
|
+
let side = select(1.0, -1.0, flipped);
|
|
63
|
+
let distToPlane = (dot(input.worldPos, uniforms.sectionPlane.xyz) - uniforms.sectionPlane.w) * side;
|
|
64
|
+
if (distToPlane > 0.0) {
|
|
65
|
+
discard;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (!excluded && extraClipClipped(extraClip, input.worldPos)) { // cutting planes beyond the first (#7545)
|
|
69
|
+
discard;
|
|
70
|
+
}
|
|
71
|
+
if ((uniforms.clipFlags.x & 4u) != 0u) { // clip box enabled
|
|
72
|
+
let p = input.worldPos;
|
|
73
|
+
if (any(p < uniforms.clipBoxMin.xyz) || any(p > uniforms.clipBoxMax.xyz)) {
|
|
74
|
+
discard;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return input.objectId;
|
|
78
|
+
}
|
|
79
|
+
`;
|
|
80
|
+
/** Instanced occurrences: per-instance matrix, express id and flags in the instance buffer. */
|
|
81
|
+
export const instancedPickShaderWgsl = `
|
|
82
|
+
${relativeToEyeWgsl}
|
|
83
|
+
${extraClipWgsl}
|
|
84
|
+
${sectionExclusionsWgsl}
|
|
85
|
+
struct Uniforms {
|
|
86
|
+
viewProj: mat4x4<f32>,
|
|
87
|
+
clipBoxMin: vec4<f32>, // xyz = min corner (world), w = pad
|
|
88
|
+
clipBoxMax: vec4<f32>, // xyz = max corner (world), w = pad
|
|
89
|
+
sectionPlane: vec4<f32>, // xyz = plane normal, w = plane distance
|
|
90
|
+
clipFlags: vec4<u32>, // x: bit0 sectionEnabled, bit1 flipped, bit2 clipBox
|
|
91
|
+
cameraHigh: vec4<f32>,
|
|
92
|
+
cameraLow: vec4<f32>,
|
|
93
|
+
}
|
|
94
|
+
@binding(0) @group(0) var<uniform> uniforms: Uniforms;
|
|
95
|
+
@binding(1) @group(0) var<uniform> extraClip: ExtraClip;
|
|
96
|
+
struct VertexInput { @location(0) position: vec3<f32> }
|
|
97
|
+
struct InstanceInput {
|
|
98
|
+
@location(3) m0: vec4<f32>,
|
|
99
|
+
@location(4) m1: vec4<f32>,
|
|
100
|
+
@location(5) m2: vec4<f32>,
|
|
101
|
+
@location(6) m3: vec4<f32>,
|
|
102
|
+
@location(7) instEntityId: u32,
|
|
103
|
+
@location(9) instFlags: u32,
|
|
104
|
+
@location(10) anchorHigh: vec4<f32>,
|
|
105
|
+
@location(11) anchorLow: vec4<f32>,
|
|
106
|
+
}
|
|
107
|
+
struct VertexOutput {
|
|
108
|
+
@builtin(position) position: vec4<f32>,
|
|
109
|
+
@location(0) @interpolate(flat) objectId: u32,
|
|
110
|
+
@location(1) @interpolate(flat) instFlags: u32,
|
|
111
|
+
@location(2) worldPos: vec3<f32>,
|
|
112
|
+
@location(3) @interpolate(flat) sectionEntityId: u32,
|
|
113
|
+
}
|
|
114
|
+
@vertex
|
|
115
|
+
fn vs_main(input: VertexInput, inst: InstanceInput) -> VertexOutput {
|
|
116
|
+
var output: VertexOutput;
|
|
117
|
+
let m = mat4x4<f32>(inst.m0, inst.m1, inst.m2, inst.m3);
|
|
118
|
+
let linear = (m * vec4<f32>(input.position, 0.0)).xyz;
|
|
119
|
+
let relative = rteWorldPosition(linear, RteDrawableUniform(inst.anchorHigh, inst.anchorLow)).xyz;
|
|
120
|
+
output.position = uniforms.viewProj * vec4<f32>(relative, 1.0);
|
|
121
|
+
output.worldPos = relative;
|
|
122
|
+
// bit 30 = instanced marker; express id in the low 30 bits.
|
|
123
|
+
output.objectId = 0x40000000u | (inst.instEntityId & 0x3FFFFFFFu);
|
|
124
|
+
output.sectionEntityId = inst.instEntityId;
|
|
125
|
+
output.instFlags = inst.instFlags;
|
|
126
|
+
return output;
|
|
127
|
+
}
|
|
128
|
+
@fragment
|
|
129
|
+
fn fs_main(input: VertexOutput) -> @location(0) u32 {
|
|
130
|
+
let excluded = sectionExcluded(input.sectionEntityId);
|
|
131
|
+
// Hidden occurrences (flags bit 1) are not pickable — mirror the render-pass
|
|
132
|
+
// discard so a hidden instanced element can't be selected through the picker.
|
|
133
|
+
if ((input.instFlags & 2u) != 0u) {
|
|
134
|
+
discard;
|
|
135
|
+
}
|
|
136
|
+
// Mirror the main render's section + crop-box discards for occurrences.
|
|
137
|
+
if (!excluded && (uniforms.clipFlags.x & 1u) != 0u) { // section plane enabled
|
|
138
|
+
let flipped = (uniforms.clipFlags.x & 2u) != 0u;
|
|
139
|
+
let side = select(1.0, -1.0, flipped);
|
|
140
|
+
let distToPlane = (dot(input.worldPos, uniforms.sectionPlane.xyz) - uniforms.sectionPlane.w) * side;
|
|
141
|
+
if (distToPlane > 0.0) {
|
|
142
|
+
discard;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (!excluded && extraClipClipped(extraClip, input.worldPos)) { // cutting planes beyond the first (#7545)
|
|
146
|
+
discard;
|
|
147
|
+
}
|
|
148
|
+
if ((uniforms.clipFlags.x & 4u) != 0u) { // clip box enabled
|
|
149
|
+
let p = input.worldPos;
|
|
150
|
+
if (any(p < uniforms.clipBoxMin.xyz) || any(p > uniforms.clipBoxMax.xyz)) {
|
|
151
|
+
discard;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return input.objectId;
|
|
155
|
+
}
|
|
156
|
+
`;
|
|
157
|
+
//# sourceMappingURL=picker-shaders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker-shaders.js","sourceRoot":"","sources":["../src/picker-shaders.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,kBAAkB,GAAG;UACxB,iBAAiB;UACjB,aAAa;UACb,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8DxB,CAAC;AAER,+FAA+F;AAC/F,MAAM,CAAC,MAAM,uBAAuB,GAAG;UAC7B,iBAAiB;UACjB,aAAa;UACb,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwExB,CAAC"}
|
package/dist/picker.d.ts
CHANGED
|
@@ -21,6 +21,9 @@ export declare class Picker {
|
|
|
21
21
|
private instancedPickPipeline;
|
|
22
22
|
private instancedPickBindGroup;
|
|
23
23
|
private instancedUniformBuffer;
|
|
24
|
+
/** Extra cutting planes (#7545), one block shared by every pick draw; rewritten per pass. */
|
|
25
|
+
private extraClipBuffer;
|
|
26
|
+
private readonly extraClipScratch;
|
|
24
27
|
private depthTexture;
|
|
25
28
|
private depthSample;
|
|
26
29
|
private colorTexture;
|
package/dist/picker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"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"}
|