@ifc-lite/renderer 6.3.3 → 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 +19 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +69 -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,49 @@
|
|
|
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
|
+
* Where every section plane is in the scene (#7545), for the UI to mark it.
|
|
6
|
+
*
|
|
7
|
+
* The renderer resolves a cardinal plane's slider percentage into a world plane
|
|
8
|
+
* (its own bounds, the building rotation); nothing outside it can do that
|
|
9
|
+
* exactly. So the viewer's name tags, outlines and drag handle ask for the
|
|
10
|
+
* planes' world-space frames, resolved the way the last frame resolved them.
|
|
11
|
+
* Pure: it holds no GPU object.
|
|
12
|
+
*/
|
|
13
|
+
import { planeBasis } from './section-plane-basis.js';
|
|
14
|
+
import { resolveSectionPlaneGeometry } from './section-plane-resolve.js';
|
|
15
|
+
/** The anchor and quad of `dot(p, normal) = distance` across `bounds`, matching the preview quad's size. */
|
|
16
|
+
export function planeFrameGeometry(normal, distance, bounds) {
|
|
17
|
+
const [nx, ny, nz] = normal;
|
|
18
|
+
const { min, max } = bounds;
|
|
19
|
+
const cx = (min.x + max.x) / 2;
|
|
20
|
+
const cy = (min.y + max.y) / 2;
|
|
21
|
+
const cz = (min.z + max.z) / 2;
|
|
22
|
+
const k = distance - (cx * nx + cy * ny + cz * nz);
|
|
23
|
+
const anchor = [cx + nx * k, cy + ny * k, cz + nz * k];
|
|
24
|
+
const { tangent: t, bitangent: b } = planeBasis([nx, ny, nz]);
|
|
25
|
+
const half = 0.55 * Math.hypot(max.x - min.x, max.y - min.y, max.z - min.z);
|
|
26
|
+
const corner = (st, sb) => [
|
|
27
|
+
anchor[0] + t[0] * half * st + b[0] * half * sb,
|
|
28
|
+
anchor[1] + t[1] * half * st + b[1] * half * sb,
|
|
29
|
+
anchor[2] + t[2] * half * st + b[2] * half * sb,
|
|
30
|
+
];
|
|
31
|
+
return { anchor, corners: [corner(-1, -1), corner(1, -1), corner(1, 1), corner(-1, 1)] };
|
|
32
|
+
}
|
|
33
|
+
/** Every plane of `input`, enabled or not, primary first. Seven extras at most, as the renderer clips. */
|
|
34
|
+
export function resolveSectionPlaneFrames(input) {
|
|
35
|
+
const frames = [];
|
|
36
|
+
const add = (plane, primary) => {
|
|
37
|
+
const { normal, distance } = resolveSectionPlaneGeometry(plane, input.bounds.min, input.bounds.max, input.buildingRotation);
|
|
38
|
+
frames.push({
|
|
39
|
+
id: plane.id ?? null, primary, enabled: plane.enabled, flipped: plane.flipped === true,
|
|
40
|
+
normal, distance, ...planeFrameGeometry(normal, distance, input.bounds),
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
if (input.primary)
|
|
44
|
+
add(input.primary, true);
|
|
45
|
+
for (const plane of input.extras.slice(0, 7))
|
|
46
|
+
add(plane, false);
|
|
47
|
+
return frames;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=section-plane-frames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-plane-frames.js","sourceRoot":"","sources":["../src/section-plane-frames.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How one `SectionPlane` becomes the world-space plane the shaders clip on,
|
|
3
|
+
* lifted out of `resolveSectionPlaneFrame` so the primary plane and the cutting
|
|
4
|
+
* planes beyond it (#7545) are resolved by the very same code: a cardinal
|
|
5
|
+
* plane's slider range, the building rotation and the explicit-normal guards
|
|
6
|
+
* are not written twice.
|
|
7
|
+
*/
|
|
8
|
+
import type { ExtraClipPlane } from './clip-types.js';
|
|
9
|
+
import type { SectionPlane } from './types.js';
|
|
10
|
+
type Xyz = {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
z: number;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* The distance range an AABB spans along `normal`: the min and max of
|
|
17
|
+
* `dot(corner, normal)` over the eight corners (issue #2447).
|
|
18
|
+
*
|
|
19
|
+
* This is the quantity a section slider has to travel over, because the plane
|
|
20
|
+
* the shader clips against is `dot(worldPos, normal) = distance`. Reading the
|
|
21
|
+
* range off one axis of the AABB instead is only the same quantity when
|
|
22
|
+
* `normal` IS that unit axis; on a rotated building it is short by up to
|
|
23
|
+
* `(1 - cos45) * extent` at each end, so the slider's 0-100% cannot reach the
|
|
24
|
+
* model's extremes (a 40 x 20 footprint cut on `side` at 45 degrees spans 40
|
|
25
|
+
* units where the true extent along the normal is 42.426).
|
|
26
|
+
*
|
|
27
|
+
* When `normal` IS a unit axis the loop collapses to that axis's extent
|
|
28
|
+
* bit-for-bit (`x * 1 + y * 0 + z * 0 === x` for finite inputs), so unrotated
|
|
29
|
+
* models are unaffected.
|
|
30
|
+
*
|
|
31
|
+
* Exported so the 2D cap upload can share the one formula instead of carrying
|
|
32
|
+
* a second copy — see `RendererOverlays.uploadSection2DOverlay`, which passes
|
|
33
|
+
* the un-rotated axis normal on purpose.
|
|
34
|
+
*/
|
|
35
|
+
export declare function projectedBoundsRange(boundsMin: {
|
|
36
|
+
x: number;
|
|
37
|
+
y: number;
|
|
38
|
+
z: number;
|
|
39
|
+
}, boundsMax: {
|
|
40
|
+
x: number;
|
|
41
|
+
y: number;
|
|
42
|
+
z: number;
|
|
43
|
+
}, normal: readonly [number, number, number]): {
|
|
44
|
+
min: number;
|
|
45
|
+
max: number;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* The normal and distance one section plane clips on. `explicit` reports that
|
|
49
|
+
* the caller's own `normal` + `distance` were used (a face pick) rather than the
|
|
50
|
+
* cardinal axis and slider position.
|
|
51
|
+
*/
|
|
52
|
+
export declare function resolveSectionPlaneGeometry(plane: SectionPlane, boundsMin: Xyz, boundsMax: Xyz, buildingRotation: number | undefined): {
|
|
53
|
+
normal: [number, number, number];
|
|
54
|
+
distance: number;
|
|
55
|
+
explicit: boolean;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Every ENABLED plane of `planes` as an `ExtraClipPlane`, resolved against the
|
|
59
|
+
* same bounds and rotation as the primary plane; at most `limit` of them.
|
|
60
|
+
*/
|
|
61
|
+
export declare function resolveExtraSectionPlanes(planes: readonly SectionPlane[] | undefined, boundsMin: Xyz, boundsMax: Xyz, buildingRotation: number | undefined, limit: number): ExtraClipPlane[];
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=section-plane-resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-plane-resolve.d.ts","sourceRoot":"","sources":["../src/section-plane-resolve.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,KAAK,GAAG,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAChC,SAAS,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9C,SAAS,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9C,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC1C;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAa9B;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACvC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,GAAG,EACd,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACrC;IAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAkJ3E;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACrC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,EAC3C,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,GAAG,EACd,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,KAAK,EAAE,MAAM,GACd,cAAc,EAAE,CASlB"}
|
|
@@ -0,0 +1,200 @@
|
|
|
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 distance range an AABB spans along `normal`: the min and max of
|
|
6
|
+
* `dot(corner, normal)` over the eight corners (issue #2447).
|
|
7
|
+
*
|
|
8
|
+
* This is the quantity a section slider has to travel over, because the plane
|
|
9
|
+
* the shader clips against is `dot(worldPos, normal) = distance`. Reading the
|
|
10
|
+
* range off one axis of the AABB instead is only the same quantity when
|
|
11
|
+
* `normal` IS that unit axis; on a rotated building it is short by up to
|
|
12
|
+
* `(1 - cos45) * extent` at each end, so the slider's 0-100% cannot reach the
|
|
13
|
+
* model's extremes (a 40 x 20 footprint cut on `side` at 45 degrees spans 40
|
|
14
|
+
* units where the true extent along the normal is 42.426).
|
|
15
|
+
*
|
|
16
|
+
* When `normal` IS a unit axis the loop collapses to that axis's extent
|
|
17
|
+
* bit-for-bit (`x * 1 + y * 0 + z * 0 === x` for finite inputs), so unrotated
|
|
18
|
+
* models are unaffected.
|
|
19
|
+
*
|
|
20
|
+
* Exported so the 2D cap upload can share the one formula instead of carrying
|
|
21
|
+
* a second copy — see `RendererOverlays.uploadSection2DOverlay`, which passes
|
|
22
|
+
* the un-rotated axis normal on purpose.
|
|
23
|
+
*/
|
|
24
|
+
export function projectedBoundsRange(boundsMin, boundsMax, normal) {
|
|
25
|
+
let min = Infinity;
|
|
26
|
+
let max = -Infinity;
|
|
27
|
+
for (const x of [boundsMin.x, boundsMax.x]) {
|
|
28
|
+
for (const y of [boundsMin.y, boundsMax.y]) {
|
|
29
|
+
for (const z of [boundsMin.z, boundsMax.z]) {
|
|
30
|
+
const d = x * normal[0] + y * normal[1] + z * normal[2];
|
|
31
|
+
if (d < min)
|
|
32
|
+
min = d;
|
|
33
|
+
if (d > max)
|
|
34
|
+
max = d;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { min, max };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The normal and distance one section plane clips on. `explicit` reports that
|
|
42
|
+
* the caller's own `normal` + `distance` were used (a face pick) rather than the
|
|
43
|
+
* cardinal axis and slider position.
|
|
44
|
+
*/
|
|
45
|
+
export function resolveSectionPlaneGeometry(plane, boundsMin, boundsMax, buildingRotation) {
|
|
46
|
+
const explicitNormal = plane.normal;
|
|
47
|
+
const explicitDistance = plane.distance;
|
|
48
|
+
// `SectionPlane.normal` / `.distance` are caller-supplied public
|
|
49
|
+
// `RenderOptions` surface (the face-pick / arbitrary-plane path from
|
|
50
|
+
// #243), so every component has to clear finiteness before it can reach
|
|
51
|
+
// the clip uniform and `_activePickSection` (#2442). Only `distance`
|
|
52
|
+
// used to be checked: an `Infinity` component then made `len` infinite,
|
|
53
|
+
// `len > 1e-6` true, and `normal = [NaN, NaN, NaN]` was written straight
|
|
54
|
+
// into both the draw and the GPU pick. A rejected plane degrades to the
|
|
55
|
+
// cardinal-axis preset below, which is always a usable plane.
|
|
56
|
+
const hasExplicitPlane = explicitNormal !== undefined &&
|
|
57
|
+
explicitDistance !== undefined &&
|
|
58
|
+
Number.isFinite(explicitDistance) &&
|
|
59
|
+
Number.isFinite(explicitNormal[0]) &&
|
|
60
|
+
Number.isFinite(explicitNormal[1]) &&
|
|
61
|
+
Number.isFinite(explicitNormal[2]);
|
|
62
|
+
let normal;
|
|
63
|
+
let distance;
|
|
64
|
+
if (hasExplicitPlane) {
|
|
65
|
+
// Defensive renormalisation in case the caller passed a
|
|
66
|
+
// non-unit vector (e.g. mesh face normals quantised by
|
|
67
|
+
// the geometry pipeline).
|
|
68
|
+
const nx = explicitNormal[0];
|
|
69
|
+
const ny = explicitNormal[1];
|
|
70
|
+
const nz = explicitNormal[2];
|
|
71
|
+
const len = Math.sqrt(nx * nx + ny * ny + nz * nz);
|
|
72
|
+
// Finite components are not enough: `1e200` squares to `Infinity`,
|
|
73
|
+
// so `len` can still overflow and `len > 1e-6` is true for it,
|
|
74
|
+
// yielding `normal = [0, 0, 0]` and `distance = 0` (#2442). Both the
|
|
75
|
+
// overflow and the degenerate near-zero vector take the documented
|
|
76
|
+
// [0, 1, 0] fallback.
|
|
77
|
+
if (Number.isFinite(len) && len > 1e-6) {
|
|
78
|
+
normal = [nx / len, ny / len, nz / len];
|
|
79
|
+
distance = explicitDistance / len;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
normal = [0, 1, 0];
|
|
83
|
+
distance = explicitDistance;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
// Cardinal-axis preset path (unchanged behaviour).
|
|
88
|
+
// down = Y axis (horizontal cut), front = Z axis, side = X axis
|
|
89
|
+
normal = [0, 0, 0];
|
|
90
|
+
if (plane.axis === 'side')
|
|
91
|
+
normal[0] = 1; // X axis
|
|
92
|
+
else if (plane.axis === 'down')
|
|
93
|
+
normal[1] = 1; // Y axis (horizontal)
|
|
94
|
+
else
|
|
95
|
+
normal[2] = 1; // Z axis (front)
|
|
96
|
+
// Apply building rotation if present (rotate normal around Y axis)
|
|
97
|
+
// Building rotation is in X-Y plane (Z is up in IFC, Y is up in WebGL)
|
|
98
|
+
//
|
|
99
|
+
// The angle must also be FINITE (#2442). It is model-derived, not
|
|
100
|
+
// authored by us — `rotation_angle_about_z` on the resolved IfcSite
|
|
101
|
+
// placement — and a malformed placement direction whose components
|
|
102
|
+
// overflow to Infinity (`IFCDIRECTION((0.,0.,1.0E400))`, which the
|
|
103
|
+
// STEP tokenizer parses to `inf`) normalises to a NaN matrix, so
|
|
104
|
+
// the pre-pass emits `atan2(NaN, NaN)` = NaN and nothing on the way
|
|
105
|
+
// to `RenderOptions` filters it. `Math.cos` is NaN for both NaN and
|
|
106
|
+
// Infinity, and the `rlen > 0.0001` guard below is FALSE for NaN,
|
|
107
|
+
// so it would reach `projectedBoundsRange`, `distance` and the clip
|
|
108
|
+
// uniform — the failure #2442 fixed on the explicit-plane sibling.
|
|
109
|
+
// Non-finite degrades to no rotation: the cardinal preset the axis
|
|
110
|
+
// already describes.
|
|
111
|
+
if (buildingRotation !== undefined &&
|
|
112
|
+
buildingRotation !== 0 &&
|
|
113
|
+
Number.isFinite(buildingRotation)) {
|
|
114
|
+
const cosR = Math.cos(buildingRotation);
|
|
115
|
+
const sinR = Math.sin(buildingRotation);
|
|
116
|
+
// Rotate normal vector around Y axis (vertical)
|
|
117
|
+
// For X-Z plane rotation: x' = x*cos - z*sin, z' = x*sin + z*cos, y' = y
|
|
118
|
+
const x = normal[0];
|
|
119
|
+
const z = normal[2];
|
|
120
|
+
normal[0] = x * cosR - z * sinR;
|
|
121
|
+
normal[2] = x * sinR + z * cosR;
|
|
122
|
+
// Normalize to maintain unit length
|
|
123
|
+
const rlen = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]);
|
|
124
|
+
if (rlen > 0.0001) {
|
|
125
|
+
normal[0] /= rlen;
|
|
126
|
+
normal[1] /= rlen;
|
|
127
|
+
normal[2] /= rlen;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Get the range the slider travels over. The renderer's own `boundsMin/Max`
|
|
131
|
+
// are computed from the GPU vertex buffers this frame, so
|
|
132
|
+
// they are guaranteed to be in the same Y-up world space as
|
|
133
|
+
// `input.worldPos` in the shader. `plane.min/max`
|
|
134
|
+
// comes from the UI via `coordinateInfo.shiftedBounds` and can
|
|
135
|
+
// be stale during streaming or outright wrong during model
|
|
136
|
+
// load (initialised to {0,0,0} before the first bounds update)
|
|
137
|
+
// — using those directly was the cause of the "slider moves
|
|
138
|
+
// 1% and the whole model disappears" bug.
|
|
139
|
+
//
|
|
140
|
+
// Policy: always use the renderer's own bounds for the Y-up
|
|
141
|
+
// range. Only honour the UI override when it is a valid,
|
|
142
|
+
// non-degenerate range that lies INSIDE the actual mesh
|
|
143
|
+
// bounds (e.g. storey filtering from the level picker).
|
|
144
|
+
//
|
|
145
|
+
// The range must be measured along the normal the plane actually
|
|
146
|
+
// cuts with, not along the cardinal axis it was derived from: the
|
|
147
|
+
// shader clips on `dot(worldPos, normal)`, so on a rotated building
|
|
148
|
+
// an axis-aligned extent leaves an unreachable wedge at each end of
|
|
149
|
+
// the slider (#2447). `projectedBoundsRange` is the axis extent
|
|
150
|
+
// exactly when the normal is still that unit axis.
|
|
151
|
+
const projected = projectedBoundsRange(boundsMin, boundsMax, normal);
|
|
152
|
+
let minVal = projected.min;
|
|
153
|
+
let maxVal = projected.max;
|
|
154
|
+
// The UI override arrives in AXIS-ALIGNED elevation units
|
|
155
|
+
// (`coordinateInfo.shiftedBounds`), while the range above is a plane
|
|
156
|
+
// distance. Those coincide only while the resolved normal is still
|
|
157
|
+
// the positive unit axis the override is expressed along — true for
|
|
158
|
+
// any unrotated model, and true for `axis: 'down'` at every rotation
|
|
159
|
+
// (a Y-axis building rotation leaves [0,1,0] fixed). Outside that,
|
|
160
|
+
// honouring the override would silently compare metres-along-Y
|
|
161
|
+
// against a distance-along-a-tilted-normal, so it is skipped and the
|
|
162
|
+
// full projected range stands (#2447).
|
|
163
|
+
const axisComponent = plane.axis === 'side' ? 0 : plane.axis === 'down' ? 1 : 2;
|
|
164
|
+
const overrideUnitsMatch = Math.abs(normal[axisComponent] - 1) <= 1e-6 &&
|
|
165
|
+
Math.abs(normal[(axisComponent + 1) % 3]) <= 1e-6 &&
|
|
166
|
+
Math.abs(normal[(axisComponent + 2) % 3]) <= 1e-6;
|
|
167
|
+
const uiMin = plane.min;
|
|
168
|
+
const uiMax = plane.max;
|
|
169
|
+
if (overrideUnitsMatch &&
|
|
170
|
+
Number.isFinite(uiMin) &&
|
|
171
|
+
Number.isFinite(uiMax) &&
|
|
172
|
+
uiMax - uiMin > 1e-6 &&
|
|
173
|
+
uiMin >= minVal - 1e-3 &&
|
|
174
|
+
uiMax <= maxVal + 1e-3) {
|
|
175
|
+
minVal = uiMin;
|
|
176
|
+
maxVal = uiMax;
|
|
177
|
+
}
|
|
178
|
+
// Calculate plane distance from position percentage
|
|
179
|
+
const range = maxVal - minVal;
|
|
180
|
+
distance = minVal + (plane.position / 100) * range;
|
|
181
|
+
}
|
|
182
|
+
return { normal, distance, explicit: hasExplicitPlane };
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Every ENABLED plane of `planes` as an `ExtraClipPlane`, resolved against the
|
|
186
|
+
* same bounds and rotation as the primary plane; at most `limit` of them.
|
|
187
|
+
*/
|
|
188
|
+
export function resolveExtraSectionPlanes(planes, boundsMin, boundsMax, buildingRotation, limit) {
|
|
189
|
+
const out = [];
|
|
190
|
+
for (const plane of planes ?? []) {
|
|
191
|
+
if (!plane.enabled)
|
|
192
|
+
continue;
|
|
193
|
+
if (out.length >= limit)
|
|
194
|
+
break;
|
|
195
|
+
const { normal, distance } = resolveSectionPlaneGeometry(plane, boundsMin, boundsMax, buildingRotation);
|
|
196
|
+
out.push({ normal, distance, flipped: plane.flipped === true, ...(plane.id !== undefined ? { id: plane.id } : {}) });
|
|
197
|
+
}
|
|
198
|
+
return out;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=section-plane-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-plane-resolve.js","sourceRoot":"","sources":["../src/section-plane-resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,7 @@ export interface SelectionMaskFrame {
|
|
|
30
30
|
hovered: readonly HoveredMesh[];
|
|
31
31
|
/** GPU-instanced occurrences to outline (#5745); absent or null when none are selected or hovered. */
|
|
32
32
|
instanced?: InstancedMaskFrame | null;
|
|
33
|
+
geometricVisibility?: GPUBindGroup;
|
|
33
34
|
}
|
|
34
35
|
export interface SelectionMaskViews {
|
|
35
36
|
visibleView: GPUTextureView;
|
|
@@ -40,6 +41,7 @@ export declare class SelectionMaskPass {
|
|
|
40
41
|
private readonly meshBindGroupLayout;
|
|
41
42
|
private readonly sampleCount;
|
|
42
43
|
private readonly pipelines;
|
|
44
|
+
private geometricPipelines;
|
|
43
45
|
/** Built on the first frame with an instanced selection or hover. */
|
|
44
46
|
private instanced;
|
|
45
47
|
private targets;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-mask-pass.d.ts","sourceRoot":"","sources":["../src/selection-mask-pass.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"selection-mask-pass.d.ts","sourceRoot":"","sources":["../src/selection-mask-pass.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAOL,KAAK,kBAAkB,EAGxB,MAAM,+BAA+B,CAAC;AAavC,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,YAAY,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG,CAC1D;IAAE,SAAS,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,GACjD;IAAE,SAAS,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,CACpD,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,SAAS,EAAE,cAAc,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,6EAA6E;IAC7E,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,sGAAsG;IACtG,SAAS,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtC,mBAAmB,CAAC,EAAE,YAAY,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,cAAc,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;CACzB;AAeD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,kBAAkB,CAA8B;IACxD,qEAAqE;IACrE,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,OAAO,CAA4B;IAC3C,gFAAgF;IAChF,OAAO,CAAC,aAAa,CAAwD;IAC7E,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM;IAiB9F,4FAA4F;IAC5F,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC,GAAG,OAAO;IAI9F,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,kBAAkB;IAoDrD,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,cAAc;IAOtB,+EAA+E;IAC/E,OAAO,IAAI,IAAI;CAUhB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
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 { sectionExclusions, withSectionExclusions } from './section-exclusions.js';
|
|
4
5
|
/**
|
|
5
6
|
* Selection/hover mask pass (#5390): draws the selected and hovered
|
|
6
7
|
* meshes into two resolved targets the edge
|
|
@@ -25,7 +26,8 @@
|
|
|
25
26
|
import { renderPassTimestampWrites } from './renderer-frame-timing.js';
|
|
26
27
|
import { mainShaderSource } from './shaders/main.wgsl.js';
|
|
27
28
|
import { selectionMaskFragmentSource } from './shaders/selection-mask.wgsl.js';
|
|
28
|
-
import { createMaskPipelines, InstancedSelectionMask, isInstancedMaskEmpty, MASK_ALL_FORMAT, MASK_VISIBLE_FORMAT, } from './selection-mask-pipelines.js';
|
|
29
|
+
import { createMaskPipelines, createGeometricMaskPipelines, InstancedSelectionMask, isInstancedMaskEmpty, MASK_ALL_FORMAT, MASK_VISIBLE_FORMAT, } from './selection-mask-pipelines.js';
|
|
30
|
+
import { OPAQUE_VISIBILITY_GROUP } from './shaders/opaque-visibility.wgsl.js';
|
|
29
31
|
/** The regular (non-instanced) mesh vertex layout `vs_main` reads. */
|
|
30
32
|
const MESH_VERTEX_BUFFERS = [{
|
|
31
33
|
arrayStride: 28,
|
|
@@ -40,6 +42,7 @@ export class SelectionMaskPass {
|
|
|
40
42
|
meshBindGroupLayout;
|
|
41
43
|
sampleCount;
|
|
42
44
|
pipelines;
|
|
45
|
+
geometricPipelines = null;
|
|
43
46
|
/** Built on the first frame with an instanced selection or hover. */
|
|
44
47
|
instanced = null;
|
|
45
48
|
targets = null;
|
|
@@ -48,9 +51,10 @@ export class SelectionMaskPass {
|
|
|
48
51
|
destroyed = false;
|
|
49
52
|
constructor(device, meshBindGroupLayout, sampleCount) {
|
|
50
53
|
this.device = device.getDevice();
|
|
54
|
+
sectionExclusions(this.device).retain();
|
|
51
55
|
this.meshBindGroupLayout = meshBindGroupLayout;
|
|
52
56
|
this.sampleCount = sampleCount;
|
|
53
|
-
const layout = this.device.createPipelineLayout({ bindGroupLayouts: [this.meshBindGroupLayout] });
|
|
57
|
+
const layout = this.device.createPipelineLayout({ bindGroupLayouts: withSectionExclusions(this.device, [this.meshBindGroupLayout]) });
|
|
54
58
|
const vertexModule = this.device.createShaderModule({ label: 'selection-mask-vs', code: mainShaderSource });
|
|
55
59
|
const fragmentModule = this.device.createShaderModule({
|
|
56
60
|
label: 'selection-mask-fs',
|
|
@@ -86,15 +90,22 @@ export class SelectionMaskPass {
|
|
|
86
90
|
}],
|
|
87
91
|
...(visible ? { depthStencilAttachment: { view: frame.depthView, depthReadOnly: true, stencilReadOnly: true } } : {}),
|
|
88
92
|
});
|
|
89
|
-
|
|
93
|
+
if (visible && frame.geometricVisibility) {
|
|
94
|
+
this.geometricPipelines ??= createGeometricMaskPipelines(this.device, this.meshBindGroupLayout, this.sampleCount);
|
|
95
|
+
pass.setPipeline(this.geometricPipelines[kind]);
|
|
96
|
+
pass.setBindGroup(OPAQUE_VISIBILITY_GROUP, frame.geometricVisibility);
|
|
97
|
+
}
|
|
98
|
+
else
|
|
99
|
+
pass.setPipeline(this.pipelines[kind]);
|
|
90
100
|
for (const mesh of meshes) {
|
|
101
|
+
pass.setBindGroup(3, sectionExclusions(this.device).bindGroup);
|
|
91
102
|
pass.setBindGroup(0, mesh.bindGroup);
|
|
92
103
|
pass.setVertexBuffer(0, mesh.vertexBuffer);
|
|
93
104
|
pass.setIndexBuffer(mesh.indexBuffer, 'uint32');
|
|
94
105
|
pass.drawIndexed(mesh.indexCount, 1, 0, 0, 0);
|
|
95
106
|
}
|
|
96
107
|
if (instanced && instancedFrame) {
|
|
97
|
-
instanced.draw(pass, kind, kind === 'hoverVisible' ? instancedFrame.hovered : instancedFrame.selected);
|
|
108
|
+
instanced.draw(pass, kind, kind === 'hoverVisible' ? instancedFrame.hovered : instancedFrame.selected, frame.geometricVisibility);
|
|
98
109
|
}
|
|
99
110
|
pass.end();
|
|
100
111
|
};
|
|
@@ -170,6 +181,7 @@ export class SelectionMaskPass {
|
|
|
170
181
|
this.hoverUniforms = [];
|
|
171
182
|
this.instanced?.destroy();
|
|
172
183
|
this.instanced = null;
|
|
184
|
+
sectionExclusions(this.device).release();
|
|
173
185
|
}
|
|
174
186
|
}
|
|
175
187
|
//# sourceMappingURL=selection-mask-pass.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-mask-pass.js","sourceRoot":"","sources":["../src/selection-mask-pass.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,GAIpB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"selection-mask-pass.js","sourceRoot":"","sources":["../src/selection-mask-pass.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export declare const MASK_ALL_FORMAT: GPUTextureFormat;
|
|
|
5
5
|
/** Which mask output a draw writes. */
|
|
6
6
|
export type MaskKind = 'selectedVisible' | 'hoverVisible' | 'selectedAll';
|
|
7
7
|
export type MaskPipelines = Record<MaskKind, GPURenderPipeline>;
|
|
8
|
+
export declare function createGeometricMaskPipelines(device: GPUDevice, meshLayout: GPUBindGroupLayout, samples: number, hoverLayout?: GPUBindGroupLayout): MaskPipelines;
|
|
8
9
|
/** The three mask pipelines over one vertex stage and one fragment module. */
|
|
9
10
|
export declare function createMaskPipelines(device: GPUDevice, labelPrefix: string, layout: GPUPipelineLayout, vertex: GPUVertexState, fragmentModule: GPUShaderModule, sampleCount: number): MaskPipelines;
|
|
10
11
|
/** What the instanced mask draws of a template: its geometry and its instance records. */
|
|
@@ -38,6 +39,9 @@ export declare function isInstancedMaskEmpty(frame: InstancedMaskFrame | null |
|
|
|
38
39
|
* frame that has an instanced selection or hover.
|
|
39
40
|
*/
|
|
40
41
|
export declare class InstancedSelectionMask {
|
|
42
|
+
private geometricPipelines;
|
|
43
|
+
private readonly hoverLayout;
|
|
44
|
+
private readonly sampleCount;
|
|
41
45
|
private readonly device;
|
|
42
46
|
private readonly pipelines;
|
|
43
47
|
private readonly meshBindGroupLayout;
|
|
@@ -51,7 +55,7 @@ export declare class InstancedSelectionMask {
|
|
|
51
55
|
/** Upload this frame's uniforms. Call once per frame, before `draw`. */
|
|
52
56
|
prepare(frame: InstancedMaskFrame): void;
|
|
53
57
|
/** Draw `templates` into the open mask pass, one instanced draw per in-envelope run. */
|
|
54
|
-
draw(pass: GPURenderPassEncoder, kind: MaskKind, templates: readonly InstancedMaskTemplate[]): void;
|
|
58
|
+
draw(pass: GPURenderPassEncoder, kind: MaskKind, templates: readonly InstancedMaskTemplate[], geometricVisibility?: GPUBindGroup): void;
|
|
55
59
|
destroy(): void;
|
|
56
60
|
}
|
|
57
61
|
//# sourceMappingURL=selection-mask-pipelines.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-mask-pipelines.d.ts","sourceRoot":"","sources":["../src/selection-mask-pipelines.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"selection-mask-pipelines.d.ts","sourceRoot":"","sources":["../src/selection-mask-pipelines.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAUtE,eAAO,MAAM,mBAAmB,EAAE,gBAA6B,CAAC;AAChE,eAAO,MAAM,eAAe,EAAE,gBAA4B,CAAC;AAQ3D,uCAAuC;AACvC,MAAM,MAAM,QAAQ,GAAG,iBAAiB,GAAG,cAAc,GAAG,aAAa,CAAC;AAE1E,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AAEhE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,kBAAkB,GAAG,aAAa,CAQhK;AAQD,8EAA8E;AAC9E,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,cAAc,EACtB,cAAc,EAAE,eAAe,EAC/B,WAAW,EAAE,MAAM,GAClB,aAAa,CAgBf;AAED,0FAA0F;AAC1F,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,oBAAoB,EACpB,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,gBAAgB,GAAG,eAAe,GAAG,kBAAkB,GAAG,WAAW,CACtH,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,QAAQ,EAAE,YAAY,CAAC;IACvB;;;;;OAKG;IACH,SAAS,EAAE,UAAU,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC3C,qFAAqF;IACrF,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,yDAAyD;AACzD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAE1F;AAED;;;;;GAKG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IACzD,OAAO,CAAC,WAAW,CAA+D;IAClF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAe;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,+DAA+D;IAC/D,OAAO,CAAC,IAAI,CAA4D;gBAE5D,MAAM,EAAE,SAAS,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM;IAmC3F,wEAAwE;IACxE,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAyBxC,wFAAwF;IACxF,IAAI,CAAC,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qBAAqB,EAAE,EAAE,mBAAmB,CAAC,EAAE,YAAY,GAAG,IAAI;IAkBvI,OAAO,IAAI,IAAI;CAMhB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
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 { sectionExclusions, withSectionExclusions } from './section-exclusions.js';
|
|
4
5
|
/**
|
|
5
6
|
* The selection/hover mask pipelines (#5390), and the instanced variant that
|
|
6
7
|
* outlines GPU-instanced occurrences (#5745): repeated windows, doors,
|
|
@@ -21,6 +22,8 @@ import { INSTANCED_RTE_DELTA_SLOT, INSTANCED_VERTEX_BUFFERS } from './instanced-
|
|
|
21
22
|
import { drawInstanceRuns, uploadInstancedRteDeltas } from './instanced-rte.js';
|
|
22
23
|
import { mainShaderSource } from './shaders/main.wgsl.js';
|
|
23
24
|
import { PIPELINE_CONSTANTS } from './constants.js';
|
|
25
|
+
import { opaqueVisibilityLayout } from './opaque-visibility-pass.js';
|
|
26
|
+
import { OPAQUE_VISIBILITY_GROUP } from './shaders/opaque-visibility.wgsl.js';
|
|
24
27
|
import { SELECTION_MASK_HOVER_GROUP, selectionMaskFragmentSource, } from './shaders/selection-mask.wgsl.js';
|
|
25
28
|
export const MASK_VISIBLE_FORMAT = 'rg8unorm';
|
|
26
29
|
export const MASK_ALL_FORMAT = 'r8unorm';
|
|
@@ -29,6 +32,15 @@ const ADDITIVE_BLEND = {
|
|
|
29
32
|
color: { srcFactor: 'one', dstFactor: 'one' },
|
|
30
33
|
alpha: { srcFactor: 'one', dstFactor: 'one' },
|
|
31
34
|
};
|
|
35
|
+
export function createGeometricMaskPipelines(device, meshLayout, samples, hoverLayout) {
|
|
36
|
+
const instanced = hoverLayout !== undefined;
|
|
37
|
+
const layout = device.createPipelineLayout({ bindGroupLayouts: withSectionExclusions(device, [meshLayout, hoverLayout ?? device.createBindGroupLayout({ entries: [] }), opaqueVisibilityLayout(device, samples)]) });
|
|
38
|
+
const vertex = {
|
|
39
|
+
module: device.createShaderModule({ code: mainShaderSource.replace('@location(8) @interpolate(linear)', '@location(8) @interpolate(linear, sample)') }),
|
|
40
|
+
entryPoint: instanced ? 'vs_instanced' : 'vs_main', buffers: instanced ? INSTANCED_VERTEX_BUFFERS : [INSTANCED_VERTEX_BUFFERS[0]],
|
|
41
|
+
};
|
|
42
|
+
return createMaskPipelines(device, 'geometric-mask', layout, vertex, device.createShaderModule({ code: selectionMaskFragmentSource(instanced, samples) }), samples);
|
|
43
|
+
}
|
|
32
44
|
const MASK_OUTPUTS = {
|
|
33
45
|
selectedVisible: { label: 'selected-visible', entryPoint: 'fs_mask_selected_visible', format: MASK_VISIBLE_FORMAT },
|
|
34
46
|
hoverVisible: { label: 'hover-visible', entryPoint: 'fs_mask_hover_visible', format: MASK_VISIBLE_FORMAT },
|
|
@@ -63,6 +75,9 @@ export function isInstancedMaskEmpty(frame) {
|
|
|
63
75
|
* frame that has an instanced selection or hover.
|
|
64
76
|
*/
|
|
65
77
|
export class InstancedSelectionMask {
|
|
78
|
+
geometricPipelines = null;
|
|
79
|
+
hoverLayout;
|
|
80
|
+
sampleCount;
|
|
66
81
|
device;
|
|
67
82
|
pipelines;
|
|
68
83
|
meshBindGroupLayout;
|
|
@@ -73,16 +88,18 @@ export class InstancedSelectionMask {
|
|
|
73
88
|
/** This frame's drawable runs per template, from `prepare`. */
|
|
74
89
|
runs = new Map();
|
|
75
90
|
constructor(device, meshBindGroupLayout, sampleCount) {
|
|
91
|
+
this.sampleCount = sampleCount;
|
|
76
92
|
this.device = device;
|
|
77
93
|
this.meshBindGroupLayout = meshBindGroupLayout;
|
|
78
94
|
const hoverLayout = device.createBindGroupLayout({
|
|
79
95
|
label: 'selection-mask-instanced-hover-bgl',
|
|
80
96
|
entries: [{ binding: 0, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } }],
|
|
81
97
|
});
|
|
98
|
+
this.hoverLayout = hoverLayout;
|
|
82
99
|
const groups = [];
|
|
83
100
|
groups[0] = meshBindGroupLayout;
|
|
84
101
|
groups[SELECTION_MASK_HOVER_GROUP] = hoverLayout;
|
|
85
|
-
const layout = device.createPipelineLayout({ label: 'selection-mask-instanced-layout', bindGroupLayouts: groups });
|
|
102
|
+
const layout = device.createPipelineLayout({ label: 'selection-mask-instanced-layout', bindGroupLayouts: withSectionExclusions(device, groups) });
|
|
86
103
|
const vertex = {
|
|
87
104
|
module: device.createShaderModule({ label: 'selection-mask-instanced-vs', code: mainShaderSource }),
|
|
88
105
|
entryPoint: 'vs_instanced',
|
|
@@ -129,10 +146,17 @@ export class InstancedSelectionMask {
|
|
|
129
146
|
this.runs = new Map(templates.map((t, i) => [t, runs[i]]));
|
|
130
147
|
}
|
|
131
148
|
/** Draw `templates` into the open mask pass, one instanced draw per in-envelope run. */
|
|
132
|
-
draw(pass, kind, templates) {
|
|
149
|
+
draw(pass, kind, templates, geometricVisibility) {
|
|
133
150
|
if (templates.length === 0 || !this.meshUniform)
|
|
134
151
|
return;
|
|
135
|
-
|
|
152
|
+
if (geometricVisibility && kind !== 'selectedAll') {
|
|
153
|
+
this.geometricPipelines ??= createGeometricMaskPipelines(this.device, this.meshBindGroupLayout, this.sampleCount, this.hoverLayout);
|
|
154
|
+
pass.setPipeline(this.geometricPipelines[kind]);
|
|
155
|
+
pass.setBindGroup(OPAQUE_VISIBILITY_GROUP, geometricVisibility);
|
|
156
|
+
}
|
|
157
|
+
else
|
|
158
|
+
pass.setPipeline(this.pipelines[kind]);
|
|
159
|
+
pass.setBindGroup(3, sectionExclusions(this.device).bindGroup);
|
|
136
160
|
pass.setBindGroup(0, this.meshUniform.bindGroup);
|
|
137
161
|
pass.setBindGroup(SELECTION_MASK_HOVER_GROUP, this.hoverBindGroup);
|
|
138
162
|
for (const t of templates) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-mask-pipelines.js","sourceRoot":"","sources":["../src/selection-mask-pipelines.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAoB,MAAM,oBAAoB,CAAC;AAGlG,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,kCAAkC,CAAC;AAE1C,MAAM,CAAC,MAAM,mBAAmB,GAAqB,UAAU,CAAC;AAChE,MAAM,CAAC,MAAM,eAAe,GAAqB,SAAS,CAAC;AAE3D,6GAA6G;AAC7G,MAAM,cAAc,GAAkB;IACpC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAC7C,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;CAC9C,CAAC;AAOF,MAAM,YAAY,GAAsF;IACtG,eAAe,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,EAAE,mBAAmB,EAAE;IACnH,YAAY,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,EAAE,mBAAmB,EAAE;IAC1G,WAAW,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,EAAE,eAAe,EAAE;CACpG,CAAC;AAEF,8EAA8E;AAC9E,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,WAAmB,EACnB,MAAyB,EACzB,MAAsB,EACtB,cAA+B,EAC/B,WAAmB;IAEnB,MAAM,IAAI,GAAG,CAAC,IAAc,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,oBAAoB,CAAC;YACjC,KAAK,EAAE,GAAG,WAAW,IAAI,GAAG,CAAC,KAAK,EAAE;YACpC,MAAM;YACN,MAAM;YACN,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE;YAC1H,SAAS,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE;YAC1D,GAAG,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChC,YAAY,EAAE,EAAE,MAAM,EAAE,kBAAkB,CAAC,YAAY,EAAE,iBAAiB,EAAE,KAAK,EAAE,YAAY,EAAE,eAAwB,EAAE;gBAC3H,WAAW,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;aACpC,CAAC;SACH,CAAC,CAAC;IACL,CAAC,CAAC;IACF,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;AAC5H,CAAC;AA6BD,yDAAyD;AACzD,MAAM,UAAU,oBAAoB,CAAC,KAA4C;IAC/E,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,sBAAsB;
|
|
1
|
+
{"version":3,"file":"selection-mask-pipelines.js","sourceRoot":"","sources":["../src/selection-mask-pipelines.ts"],"names":[],"mappings":"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"}
|