@ifc-lite/renderer 5.0.0 → 6.0.1
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-projection.d.ts +2 -0
- package/dist/camera-projection.d.ts.map +1 -1
- package/dist/camera-projection.js +46 -0
- package/dist/camera-projection.js.map +1 -1
- package/dist/chunk-grid.d.ts +21 -0
- package/dist/chunk-grid.d.ts.map +1 -1
- package/dist/chunk-grid.js +25 -7
- package/dist/chunk-grid.js.map +1 -1
- package/dist/clash-solid-pipeline.d.ts.map +1 -1
- package/dist/clash-solid-pipeline.js +4 -2
- package/dist/clash-solid-pipeline.js.map +1 -1
- package/dist/deviation/deviation-computer.d.ts +4 -0
- package/dist/deviation/deviation-computer.d.ts.map +1 -1
- package/dist/deviation/deviation-computer.js +20 -0
- package/dist/deviation/deviation-computer.js.map +1 -1
- package/dist/deviation/deviation-readback.d.ts +18 -0
- package/dist/deviation/deviation-readback.d.ts.map +1 -0
- package/dist/deviation/deviation-readback.js +67 -0
- package/dist/deviation/deviation-readback.js.map +1 -0
- package/dist/edge-pass.d.ts +16 -0
- package/dist/edge-pass.d.ts.map +1 -1
- package/dist/edge-pass.js +75 -1
- package/dist/edge-pass.js.map +1 -1
- package/dist/entity-color-table.d.ts +140 -0
- package/dist/entity-color-table.d.ts.map +1 -0
- package/dist/entity-color-table.js +238 -0
- package/dist/entity-color-table.js.map +1 -0
- package/dist/gpu-upload-guard.d.ts +1 -1
- package/dist/gpu-upload-guard.js +1 -1
- package/dist/hover-mesh-cache.d.ts +29 -0
- package/dist/hover-mesh-cache.d.ts.map +1 -0
- package/dist/hover-mesh-cache.js +31 -0
- package/dist/hover-mesh-cache.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +146 -161
- package/dist/index.js.map +1 -1
- package/dist/individual-mesh-upload.d.ts +24 -0
- package/dist/individual-mesh-upload.d.ts.map +1 -0
- package/dist/individual-mesh-upload.js +85 -0
- package/dist/individual-mesh-upload.js.map +1 -0
- package/dist/instanced-render.d.ts +19 -9
- package/dist/instanced-render.d.ts.map +1 -1
- package/dist/instanced-render.js +36 -24
- package/dist/instanced-render.js.map +1 -1
- package/dist/instanced-rte.d.ts +68 -7
- package/dist/instanced-rte.d.ts.map +1 -1
- package/dist/instanced-rte.js +98 -17
- package/dist/instanced-rte.js.map +1 -1
- package/dist/instanced-vertex-layout.d.ts +26 -0
- package/dist/instanced-vertex-layout.d.ts.map +1 -0
- package/dist/instanced-vertex-layout.js +61 -0
- package/dist/instanced-vertex-layout.js.map +1 -0
- package/dist/mesh-rte-uniforms.d.ts +4 -2
- package/dist/mesh-rte-uniforms.d.ts.map +1 -1
- package/dist/mesh-rte-uniforms.js +4 -2
- package/dist/mesh-rte-uniforms.js.map +1 -1
- package/dist/model-translation.d.ts.map +1 -1
- package/dist/model-translation.js +0 -7
- package/dist/model-translation.js.map +1 -1
- package/dist/outline-params.d.ts +45 -0
- package/dist/outline-params.d.ts.map +1 -0
- package/dist/outline-params.js +54 -0
- package/dist/outline-params.js.map +1 -0
- package/dist/overlay-routing.d.ts +8 -8
- package/dist/overlay-routing.js +2 -2
- package/dist/overlay-routing.js.map +1 -1
- package/dist/overlay-theme.d.ts +9 -3
- package/dist/overlay-theme.d.ts.map +1 -1
- package/dist/overlay-theme.js.map +1 -1
- package/dist/partial-batch-requests.d.ts +2 -2
- package/dist/pick-mesh-budget.d.ts +28 -0
- package/dist/pick-mesh-budget.d.ts.map +1 -0
- package/dist/pick-mesh-budget.js +74 -0
- package/dist/pick-mesh-budget.js.map +1 -0
- package/dist/picker-rte-uniforms.d.ts +7 -1
- package/dist/picker-rte-uniforms.d.ts.map +1 -1
- package/dist/picker-rte-uniforms.js +9 -1
- package/dist/picker-rte-uniforms.js.map +1 -1
- package/dist/picker.d.ts.map +1 -1
- package/dist/picker.js +15 -28
- package/dist/picker.js.map +1 -1
- package/dist/picking-manager.d.ts.map +1 -1
- package/dist/picking-manager.js +4 -47
- package/dist/picking-manager.js.map +1 -1
- package/dist/pipeline.d.ts +7 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +37 -59
- package/dist/pipeline.js.map +1 -1
- package/dist/point-picker.d.ts.map +1 -1
- package/dist/point-picker.js +7 -2
- package/dist/point-picker.js.map +1 -1
- package/dist/pointcloud/point-cloud-node.js +1 -1
- package/dist/pointcloud/point-cloud-node.js.map +1 -1
- package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-renderer.js +3 -1
- package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
- package/dist/pointcloud/point-cloud-uniforms.d.ts +5 -1
- package/dist/pointcloud/point-cloud-uniforms.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-uniforms.js +7 -1
- package/dist/pointcloud/point-cloud-uniforms.js.map +1 -1
- package/dist/post-pass-chain.d.ts +14 -1
- package/dist/post-pass-chain.d.ts.map +1 -1
- package/dist/post-pass-chain.js +31 -2
- package/dist/post-pass-chain.js.map +1 -1
- package/dist/raycast-engine.d.ts +5 -1
- package/dist/raycast-engine.d.ts.map +1 -1
- package/dist/raycast-engine.js +20 -8
- package/dist/raycast-engine.js.map +1 -1
- package/dist/raycast-point-cloud-query.d.ts +2 -0
- package/dist/raycast-point-cloud-query.d.ts.map +1 -1
- package/dist/raycast-point-cloud-query.js +7 -0
- package/dist/raycast-point-cloud-query.js.map +1 -1
- package/dist/raycast-source-curve-query.d.ts +13 -0
- package/dist/raycast-source-curve-query.d.ts.map +1 -0
- package/dist/raycast-source-curve-query.js +17 -0
- package/dist/raycast-source-curve-query.js.map +1 -0
- package/dist/reference-image-pipeline.d.ts.map +1 -1
- package/dist/reference-image-pipeline.js +4 -2
- package/dist/reference-image-pipeline.js.map +1 -1
- package/dist/relative-to-eye-abi.d.ts +36 -0
- package/dist/relative-to-eye-abi.d.ts.map +1 -0
- package/dist/relative-to-eye-abi.js +72 -0
- package/dist/relative-to-eye-abi.js.map +1 -0
- package/dist/relative-to-eye.d.ts +15 -35
- package/dist/relative-to-eye.d.ts.map +1 -1
- package/dist/relative-to-eye.js +46 -74
- package/dist/relative-to-eye.js.map +1 -1
- package/dist/render-stats.d.ts +5 -1
- package/dist/render-stats.d.ts.map +1 -1
- package/dist/render-stats.js +1 -1
- package/dist/render-stats.js.map +1 -1
- package/dist/renderer-overlays.d.ts.map +1 -1
- package/dist/renderer-overlays.js +3 -2
- package/dist/renderer-overlays.js.map +1 -1
- package/dist/scene-batch-rebuild.d.ts +1 -2
- package/dist/scene-batch-rebuild.d.ts.map +1 -1
- package/dist/scene-batch-rebuild.js +4 -8
- package/dist/scene-batch-rebuild.js.map +1 -1
- package/dist/scene-batch-upload.d.ts.map +1 -1
- package/dist/scene-batch-upload.js +7 -3
- package/dist/scene-batch-upload.js.map +1 -1
- package/dist/scene-contents.d.ts +1 -1
- package/dist/scene-contents.d.ts.map +1 -1
- package/dist/scene-derived-batches.d.ts +19 -64
- package/dist/scene-derived-batches.d.ts.map +1 -1
- package/dist/scene-derived-batches.js +16 -51
- package/dist/scene-derived-batches.js.map +1 -1
- package/dist/scene-device-recovery.d.ts +3 -3
- package/dist/scene-device-recovery.d.ts.map +1 -1
- package/dist/scene-device-recovery.js +12 -9
- package/dist/scene-device-recovery.js.map +1 -1
- package/dist/scene-geometry.d.ts +6 -6
- package/dist/scene-geometry.d.ts.map +1 -1
- package/dist/scene-geometry.js +8 -9
- package/dist/scene-geometry.js.map +1 -1
- package/dist/scene-instance-bounds.d.ts +1 -1
- package/dist/scene-instance-bounds.d.ts.map +1 -1
- package/dist/scene-instance-bounds.js +4 -16
- package/dist/scene-instance-bounds.js.map +1 -1
- package/dist/scene-instance-materialization.d.ts.map +1 -1
- package/dist/scene-instance-materialization.js +4 -4
- package/dist/scene-instance-materialization.js.map +1 -1
- package/dist/scene-instance-translation.d.ts +6 -10
- package/dist/scene-instance-translation.d.ts.map +1 -1
- package/dist/scene-instance-translation.js +9 -31
- package/dist/scene-instance-translation.js.map +1 -1
- package/dist/scene-instance-types.d.ts +11 -2
- package/dist/scene-instance-types.d.ts.map +1 -1
- package/dist/scene-instance-types.js +7 -1
- package/dist/scene-instance-types.js.map +1 -1
- package/dist/scene-model-translation.d.ts +1 -2
- package/dist/scene-model-translation.d.ts.map +1 -1
- package/dist/scene-model-translation.js +4 -3
- package/dist/scene-model-translation.js.map +1 -1
- package/dist/scene-precision.d.ts +1 -1
- package/dist/scene-precision.d.ts.map +1 -1
- package/dist/scene-precision.js +11 -2
- package/dist/scene-precision.js.map +1 -1
- package/dist/scene.d.ts +43 -38
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +121 -129
- package/dist/scene.js.map +1 -1
- package/dist/section-2d-line-buffer.d.ts +2 -2
- package/dist/section-2d-line-buffer.d.ts.map +1 -1
- package/dist/section-2d-line-buffer.js +10 -11
- package/dist/section-2d-line-buffer.js.map +1 -1
- package/dist/section-2d-overlay.d.ts +6 -4
- package/dist/section-2d-overlay.d.ts.map +1 -1
- package/dist/section-2d-overlay.js +45 -21
- package/dist/section-2d-overlay.js.map +1 -1
- package/dist/section-2d-types.d.ts +1 -1
- package/dist/section-2d-types.d.ts.map +1 -1
- package/dist/section-2d-types.js +1 -1
- package/dist/section-2d-types.js.map +1 -1
- package/dist/section-plane.d.ts.map +1 -1
- package/dist/section-plane.js +3 -1
- package/dist/section-plane.js.map +1 -1
- package/dist/selection-mask-pass.d.ts +85 -0
- package/dist/selection-mask-pass.d.ts.map +1 -0
- package/dist/selection-mask-pass.js +170 -0
- package/dist/selection-mask-pass.js.map +1 -0
- package/dist/selection-mask-pipelines.d.ts +57 -0
- package/dist/selection-mask-pipelines.d.ts.map +1 -0
- package/dist/selection-mask-pipelines.js +150 -0
- package/dist/selection-mask-pipelines.js.map +1 -0
- package/dist/selection-outline-frame.d.ts +47 -0
- package/dist/selection-outline-frame.d.ts.map +1 -0
- package/dist/selection-outline-frame.js +122 -0
- package/dist/selection-outline-frame.js.map +1 -0
- package/dist/shaders/depth-reconstruct.wgsl.d.ts +7 -2
- package/dist/shaders/depth-reconstruct.wgsl.d.ts.map +1 -1
- package/dist/shaders/depth-reconstruct.wgsl.js +8 -3
- package/dist/shaders/depth-reconstruct.wgsl.js.map +1 -1
- package/dist/shaders/edges.wgsl.d.ts +18 -0
- package/dist/shaders/edges.wgsl.d.ts.map +1 -1
- package/dist/shaders/edges.wgsl.js +99 -0
- package/dist/shaders/edges.wgsl.js.map +1 -1
- package/dist/shaders/entity-color-table.wgsl.d.ts +2 -0
- package/dist/shaders/entity-color-table.wgsl.d.ts.map +1 -0
- package/dist/shaders/entity-color-table.wgsl.js +85 -0
- package/dist/shaders/entity-color-table.wgsl.js.map +1 -0
- 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 +45 -113
- package/dist/shaders/main.wgsl.js.map +1 -1
- package/dist/shaders/mesh-uniforms.wgsl.d.ts +2 -0
- package/dist/shaders/mesh-uniforms.wgsl.d.ts.map +1 -0
- package/dist/shaders/mesh-uniforms.wgsl.js +53 -0
- package/dist/shaders/mesh-uniforms.wgsl.js.map +1 -0
- package/dist/shaders/section-2d-overlay.wgsl.d.ts +1 -0
- package/dist/shaders/section-2d-overlay.wgsl.d.ts.map +1 -1
- package/dist/shaders/section-2d-overlay.wgsl.js +3 -2
- package/dist/shaders/section-2d-overlay.wgsl.js.map +1 -1
- package/dist/shaders/selection-mask.wgsl.d.ts +16 -0
- package/dist/shaders/selection-mask.wgsl.d.ts.map +1 -0
- package/dist/shaders/selection-mask.wgsl.js +138 -0
- package/dist/shaders/selection-mask.wgsl.js.map +1 -0
- 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 +3 -3
- package/dist/shadow-occluders.d.ts.map +1 -1
- package/dist/shadow-occluders.js +1 -0
- package/dist/shadow-occluders.js.map +1 -1
- package/dist/shadow-pass.d.ts +0 -1
- package/dist/shadow-pass.d.ts.map +1 -1
- package/dist/shadow-pass.js +26 -32
- package/dist/shadow-pass.js.map +1 -1
- package/dist/shadow-types.d.ts +3 -0
- package/dist/shadow-types.d.ts.map +1 -1
- package/dist/shadow-types.js.map +1 -1
- package/dist/snap-detector.d.ts +5 -0
- package/dist/snap-detector.d.ts.map +1 -1
- package/dist/snap-detector.js.map +1 -1
- package/dist/source-curve-clipping.d.ts +7 -0
- package/dist/source-curve-clipping.d.ts.map +1 -0
- package/dist/source-curve-clipping.js +165 -0
- package/dist/source-curve-clipping.js.map +1 -0
- package/dist/source-curve-snap.d.ts +49 -0
- package/dist/source-curve-snap.d.ts.map +1 -0
- package/dist/source-curve-snap.js +197 -0
- package/dist/source-curve-snap.js.map +1 -0
- package/dist/symbolic-overlay-pipelines.d.ts +1 -1
- package/dist/symbolic-overlay-pipelines.d.ts.map +1 -1
- package/dist/symbolic-overlay-pipelines.js +13 -22
- package/dist/symbolic-overlay-pipelines.js.map +1 -1
- package/dist/symbolic-text-rte.d.ts +16 -0
- package/dist/symbolic-text-rte.d.ts.map +1 -0
- package/dist/symbolic-text-rte.js +37 -0
- package/dist/symbolic-text-rte.js.map +1 -0
- package/dist/textured-vertices.d.ts.map +1 -1
- package/dist/textured-vertices.js +2 -3
- package/dist/textured-vertices.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/visual-enhancement.d.ts +0 -4
- package/dist/visual-enhancement.d.ts.map +1 -1
- package/dist/visual-enhancement.js +0 -5
- package/dist/visual-enhancement.js.map +1 -1
- package/dist/xray-alpha.d.ts +7 -3
- package/dist/xray-alpha.d.ts.map +1 -1
- package/dist/xray-alpha.js +11 -7
- package/dist/xray-alpha.js.map +1 -1
- package/package.json +4 -4
|
@@ -12,20 +12,33 @@ export declare const SWAP_ZUP_TO_YUP: Mat4;
|
|
|
12
12
|
* [64..67] entityId (u32)
|
|
13
13
|
* [68..83] rgba (4 f32)
|
|
14
14
|
* [84..87] flags (u32 — bit 0 = selected; bit 1 = hidden)
|
|
15
|
+
*
|
|
16
|
+
* Static between edits: the camera-relative anchor lives in a separate
|
|
17
|
+
* per-template stream (`instanced-rte.ts`), not in this record (#6393).
|
|
15
18
|
*/
|
|
16
|
-
export declare const INSTANCE_STRIDE_BYTES =
|
|
19
|
+
export declare const INSTANCE_STRIDE_BYTES = 88;
|
|
17
20
|
/** Byte offset of the rgba colour within an instance record (patched by lens/IDS overlays). */
|
|
18
21
|
export declare const INSTANCE_COLOR_OFFSET = 68;
|
|
19
22
|
/** Byte offset of the flags u32 within an instance record (patched by selection/visibility). */
|
|
20
23
|
export declare const INSTANCE_FLAGS_OFFSET = 84;
|
|
21
|
-
/** V2: two vec4 lanes hold a split Y-up source anchor on CPU, submission delta on GPU. */
|
|
22
|
-
export declare const INSTANCE_ANCHOR_HIGH_OFFSET = 88;
|
|
23
|
-
export declare const INSTANCE_ANCHOR_LOW_OFFSET = 104;
|
|
24
24
|
/** flags bit 0 — this occurrence is selected (blue highlight in the shader). */
|
|
25
25
|
export declare const INSTANCE_FLAG_SELECTED = 1;
|
|
26
26
|
/** flags bit 1 — this occurrence is hidden (hide/isolate); the shader discards it
|
|
27
27
|
* in both the render and pick passes so it neither draws nor is pickable. */
|
|
28
28
|
export declare const INSTANCE_FLAG_HIDDEN = 2;
|
|
29
|
+
/** #5984: flags bit 2 / 3 — this occurrence authors a metallic / roughness,
|
|
30
|
+
* quantized to unorm8 in bits 16-23 / 24-31 of the same lane. The IFNS shard
|
|
31
|
+
* carries the finish per occurrence (trailing field 2), but every instanced
|
|
32
|
+
* draw shares ONE uniform material row, so the finish has to ride the
|
|
33
|
+
* instance record; the flags lane already reaches the fragment stage flat,
|
|
34
|
+
* so no stride, vertex layout or picker/shadow pipeline changes. */
|
|
35
|
+
export declare const INSTANCE_FLAG_METALLIC = 4;
|
|
36
|
+
export declare const INSTANCE_FLAG_ROUGHNESS = 8;
|
|
37
|
+
/** Every flags bit the finish owns; a selection/visibility rewrite keeps them. */
|
|
38
|
+
export declare const INSTANCE_FINISH_FLAGS_MASK = 4294901772;
|
|
39
|
+
/** Pack an occurrence's authored finish into its flags lane (see above). An
|
|
40
|
+
* unauthored field sets no bit, so the shader keeps the renderer default. */
|
|
41
|
+
export declare function packInstanceFinish(metallic?: number, roughness?: number): number;
|
|
29
42
|
/**
|
|
30
43
|
* Compose the per-occurrence render matrix `SWAP · rel_k · T(origin)` that maps a
|
|
31
44
|
* template's LOCAL vertex (relative to `origin`, native IFC frame) into WebGL
|
|
@@ -71,7 +84,7 @@ export interface InstancedRenderTemplate {
|
|
|
71
84
|
* piece", never "how is it drawn". */
|
|
72
85
|
itemIds?: Uint32Array;
|
|
73
86
|
/** f64 Y-up occurrence source anchors, xyz per instance-buffer record.
|
|
74
|
-
* The
|
|
87
|
+
* The per-template RTE delta stream is derived from this sidecar. */
|
|
75
88
|
canonicalAnchors: Float64Array;
|
|
76
89
|
/** Matrix translations paired with canonicalAnchors so interactive placement
|
|
77
90
|
* preserves the authoritative f64 source anchor. */
|
|
@@ -82,10 +95,7 @@ export interface InstancedRenderTemplate {
|
|
|
82
95
|
* into `dv` at `byteOffset`. Little-endian to match the GPU buffer + the IFNS
|
|
83
96
|
* decoder. Exposed for the unit test.
|
|
84
97
|
*/
|
|
85
|
-
export declare function writeInstanceRecord(dv: DataView, byteOffset: number, instanceMatrix: Float32Array, entityId: number, color: readonly [number, number, number, number], flags?: number
|
|
86
|
-
/** Write V2's split source-anchor lanes without touching selection/colour fields.
|
|
87
|
-
* The renderer overwrites the GPU copy per submission with an RTE delta. */
|
|
88
|
-
export declare function writeInstanceAnchor(dv: DataView, byteOffset: number, anchor: readonly [number, number, number]): void;
|
|
98
|
+
export declare function writeInstanceRecord(dv: DataView, byteOffset: number, instanceMatrix: Float32Array, entityId: number, color: readonly [number, number, number, number], flags?: number): void;
|
|
89
99
|
/**
|
|
90
100
|
* Turn a decoded IFNS shard into render-ready templates. Each template's
|
|
91
101
|
* occurrences are grouped and their `SWAP · rel_k · T(origin)` matrices +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instanced-render.d.ts","sourceRoot":"","sources":["../src/instanced-render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instanced-render.d.ts","sourceRoot":"","sources":["../src/instanced-render.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,qBAAqB,EAAmB,MAAM,oBAAoB,CAAC;AAEjF;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,IAS7B,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,+FAA+F;AAC/F,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,gGAAgG;AAChG,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC;8EAC8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC;;;;;qEAKqE;AACrE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,kFAAkF;AAClF,eAAO,MAAM,0BAA0B,aAAa,CAAC;AAErD;8EAC8E;AAC9E,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAMhF;AAcD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,iBAAiB,EAAE,YAAY,EAC/B,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACxC,YAAY,CASd;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,iBAAiB,EAAE,YAAY,EAC/B,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACxC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAQ1B;AAED,mFAAmF;AACnF,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,qEAAqE;IACrE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,kGAAkG;IAClG,cAAc,EAAE,WAAW,CAAC;IAC5B,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB;;qDAEiD;IACjD,SAAS,EAAE,WAAW,CAAC;IACvB;;;;;;;;2CAQuC;IACvC,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB;yEACqE;IACrE,gBAAgB,EAAE,YAAY,CAAC;IAC/B;wDACoD;IACpD,2BAA2B,EAAE,YAAY,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,EACZ,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,YAAY,EAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChD,KAAK,SAAI,GACR,IAAI,CASN;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,GAAG,uBAAuB,EAAE,CAsD9F;AAED,mFAAmF;AACnF,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,MAAM,EAAE;QAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAChF;;6EAEyE;IACzE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,kBAAkB,GAAG,IAAI,CA4B3F"}
|
package/dist/instanced-render.js
CHANGED
|
@@ -25,11 +25,13 @@
|
|
|
25
25
|
* Rust (`verify_recomposition`), this lands instanced + flat geometry in one
|
|
26
26
|
* frame. (See instanced-render.test.ts for the GPU-free proof.)
|
|
27
27
|
*
|
|
28
|
-
* PRECISION: the GPU record remains an f32 matrix
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
28
|
+
* PRECISION: the GPU record remains an f32 matrix, but the decoded template
|
|
29
|
+
* origin is f64. The record carries no anchor: `canonicalAnchors` (f64, one
|
|
30
|
+
* xyz per occurrence) is the source of truth, and each template's separate
|
|
31
|
+
* delta stream (`instanced-rte.ts`, vertex slot 2) receives the f64
|
|
32
|
+
* drawable-minus-camera split per camera change. This keeps colour, picking,
|
|
33
|
+
* shadows and the selection mask in one precision contract without GPU world
|
|
34
|
+
* subtraction, and keeps the per-frame upload to one write per template (#6393).
|
|
33
35
|
*/
|
|
34
36
|
import { MathUtils } from './math.js';
|
|
35
37
|
import { OPAQUE_ALPHA_CUTOFF } from './overlay-routing.js';
|
|
@@ -54,20 +56,41 @@ export const SWAP_ZUP_TO_YUP = {
|
|
|
54
56
|
* [64..67] entityId (u32)
|
|
55
57
|
* [68..83] rgba (4 f32)
|
|
56
58
|
* [84..87] flags (u32 — bit 0 = selected; bit 1 = hidden)
|
|
59
|
+
*
|
|
60
|
+
* Static between edits: the camera-relative anchor lives in a separate
|
|
61
|
+
* per-template stream (`instanced-rte.ts`), not in this record (#6393).
|
|
57
62
|
*/
|
|
58
|
-
export const INSTANCE_STRIDE_BYTES =
|
|
63
|
+
export const INSTANCE_STRIDE_BYTES = 88;
|
|
59
64
|
/** Byte offset of the rgba colour within an instance record (patched by lens/IDS overlays). */
|
|
60
65
|
export const INSTANCE_COLOR_OFFSET = 68;
|
|
61
66
|
/** Byte offset of the flags u32 within an instance record (patched by selection/visibility). */
|
|
62
67
|
export const INSTANCE_FLAGS_OFFSET = 84;
|
|
63
|
-
/** V2: two vec4 lanes hold a split Y-up source anchor on CPU, submission delta on GPU. */
|
|
64
|
-
export const INSTANCE_ANCHOR_HIGH_OFFSET = 88;
|
|
65
|
-
export const INSTANCE_ANCHOR_LOW_OFFSET = 104;
|
|
66
68
|
/** flags bit 0 — this occurrence is selected (blue highlight in the shader). */
|
|
67
69
|
export const INSTANCE_FLAG_SELECTED = 1;
|
|
68
70
|
/** flags bit 1 — this occurrence is hidden (hide/isolate); the shader discards it
|
|
69
71
|
* in both the render and pick passes so it neither draws nor is pickable. */
|
|
70
72
|
export const INSTANCE_FLAG_HIDDEN = 2;
|
|
73
|
+
/** #5984: flags bit 2 / 3 — this occurrence authors a metallic / roughness,
|
|
74
|
+
* quantized to unorm8 in bits 16-23 / 24-31 of the same lane. The IFNS shard
|
|
75
|
+
* carries the finish per occurrence (trailing field 2), but every instanced
|
|
76
|
+
* draw shares ONE uniform material row, so the finish has to ride the
|
|
77
|
+
* instance record; the flags lane already reaches the fragment stage flat,
|
|
78
|
+
* so no stride, vertex layout or picker/shadow pipeline changes. */
|
|
79
|
+
export const INSTANCE_FLAG_METALLIC = 4;
|
|
80
|
+
export const INSTANCE_FLAG_ROUGHNESS = 8;
|
|
81
|
+
/** Every flags bit the finish owns; a selection/visibility rewrite keeps them. */
|
|
82
|
+
export const INSTANCE_FINISH_FLAGS_MASK = 0xffff000c;
|
|
83
|
+
/** Pack an occurrence's authored finish into its flags lane (see above). An
|
|
84
|
+
* unauthored field sets no bit, so the shader keeps the renderer default. */
|
|
85
|
+
export function packInstanceFinish(metallic, roughness) {
|
|
86
|
+
const unorm8 = (v) => Math.round(Math.min(1, Math.max(0, v)) * 255);
|
|
87
|
+
let bits = 0;
|
|
88
|
+
if (metallic !== undefined && Number.isFinite(metallic))
|
|
89
|
+
bits |= INSTANCE_FLAG_METALLIC | (unorm8(metallic) << 16);
|
|
90
|
+
if (roughness !== undefined && Number.isFinite(roughness))
|
|
91
|
+
bits |= INSTANCE_FLAG_ROUGHNESS | (unorm8(roughness) << 24);
|
|
92
|
+
return bits >>> 0;
|
|
93
|
+
}
|
|
71
94
|
/** Transpose a row-major mat4 (the IFNS / `DecodedInstance.transform` convention)
|
|
72
95
|
* into a column-major `Mat4` (MathUtils / WGSL convention). */
|
|
73
96
|
function rowMajorToColMajor(rm) {
|
|
@@ -117,7 +140,7 @@ export function composeInstanceAnchor(transformRowMajor, origin) {
|
|
|
117
140
|
* into `dv` at `byteOffset`. Little-endian to match the GPU buffer + the IFNS
|
|
118
141
|
* decoder. Exposed for the unit test.
|
|
119
142
|
*/
|
|
120
|
-
export function writeInstanceRecord(dv, byteOffset, instanceMatrix, entityId, color, flags = 0
|
|
143
|
+
export function writeInstanceRecord(dv, byteOffset, instanceMatrix, entityId, color, flags = 0) {
|
|
121
144
|
for (let j = 0; j < 16; j++) {
|
|
122
145
|
dv.setFloat32(byteOffset + j * 4, instanceMatrix[j], true);
|
|
123
146
|
}
|
|
@@ -126,18 +149,6 @@ export function writeInstanceRecord(dv, byteOffset, instanceMatrix, entityId, co
|
|
|
126
149
|
dv.setFloat32(byteOffset + INSTANCE_COLOR_OFFSET + j * 4, color[j], true);
|
|
127
150
|
}
|
|
128
151
|
dv.setUint32(byteOffset + INSTANCE_FLAGS_OFFSET, flags >>> 0, true);
|
|
129
|
-
writeInstanceAnchor(dv, byteOffset, anchor);
|
|
130
|
-
}
|
|
131
|
-
/** Write V2's split source-anchor lanes without touching selection/colour fields.
|
|
132
|
-
* The renderer overwrites the GPU copy per submission with an RTE delta. */
|
|
133
|
-
export function writeInstanceAnchor(dv, byteOffset, anchor) {
|
|
134
|
-
for (let axis = 0; axis < 3; axis++) {
|
|
135
|
-
const high = Math.fround(anchor[axis]);
|
|
136
|
-
dv.setFloat32(byteOffset + INSTANCE_ANCHOR_HIGH_OFFSET + axis * 4, high, true);
|
|
137
|
-
dv.setFloat32(byteOffset + INSTANCE_ANCHOR_LOW_OFFSET + axis * 4, Math.fround(anchor[axis] - high), true);
|
|
138
|
-
}
|
|
139
|
-
dv.setFloat32(byteOffset + INSTANCE_ANCHOR_HIGH_OFFSET + 12, 0, true);
|
|
140
|
-
dv.setFloat32(byteOffset + INSTANCE_ANCHOR_LOW_OFFSET + 12, 0, true);
|
|
141
152
|
}
|
|
142
153
|
/**
|
|
143
154
|
* Turn a decoded IFNS shard into render-ready templates. Each template's
|
|
@@ -183,8 +194,9 @@ export function prepareInstancedRender(shard) {
|
|
|
183
194
|
const inst = insts[i];
|
|
184
195
|
const mat = composeInstanceMatrix(inst.transform, tmpl.origin);
|
|
185
196
|
const anchor = composeInstanceAnchor(inst.transform, tmpl.origin);
|
|
186
|
-
// flags
|
|
187
|
-
|
|
197
|
+
// Every occurrence starts unselected; the flags carry only its finish (#5984).
|
|
198
|
+
const flags = packInstanceFinish(inst.metallic, inst.roughness);
|
|
199
|
+
writeInstanceRecord(dv, i * INSTANCE_STRIDE_BYTES, mat, inst.entityId, inst.color, flags);
|
|
188
200
|
entityIds[i] = inst.entityId >>> 0;
|
|
189
201
|
canonicalAnchors.set(anchor, i * 3);
|
|
190
202
|
canonicalMatrixTranslations.set([mat[12], mat[13], mat[14]], i * 3);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instanced-render.js","sourceRoot":"","sources":["../src/instanced-render.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D
|
|
1
|
+
{"version":3,"file":"instanced-render.js","sourceRoot":"","sources":["../src/instanced-render.ts"],"names":[],"mappings":"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"}
|
package/dist/instanced-rte.d.ts
CHANGED
|
@@ -1,17 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Camera-relative instance deltas shared by colour, pick, shadow and the
|
|
3
|
+
* selection mask.
|
|
4
|
+
*
|
|
5
|
+
* Each instanced template owns an {@link InstancedRteDeltaStream}: a vertex
|
|
6
|
+
* buffer (slot 2 of `INSTANCED_VERTEX_BUFFERS`) holding one split
|
|
7
|
+
* `(drawable - camera)` high/low vec4 pair per occurrence, packed on the CPU
|
|
8
|
+
* in f64 from `canonicalAnchors`. It is kept apart from the static instance
|
|
9
|
+
* record so a camera move rewrites it with ONE `writeBuffer` per template
|
|
10
|
+
* rather than one 32-byte write per occurrence per pass, which on a model
|
|
11
|
+
* with ~45K instanced occurrences was tens of thousands of queue writes per
|
|
12
|
+
* frame and most of the submit latency (#6393).
|
|
13
|
+
*
|
|
14
|
+
* QUEUE ORDERING. `writeBuffer` is ordered before the next `queue.submit`,
|
|
15
|
+
* not before the individual pass that reads it, so a stream holds exactly one
|
|
16
|
+
* camera's deltas per submission. Every pass that shares a submission must
|
|
17
|
+
* therefore use the same camera: the colour pass, the shadow depth pre-pass
|
|
18
|
+
* and the selection mask are all encoded into the frame's one encoder with
|
|
19
|
+
* `relativeToEyeFrame.getCameraWorld()`, and the picker records and submits
|
|
20
|
+
* its own encoder. The per-stream camera cache is what turns those three
|
|
21
|
+
* same-frame calls into one upload; two different cameras inside ONE
|
|
22
|
+
* submission would make the earlier pass read the later camera's deltas.
|
|
23
|
+
*/
|
|
1
24
|
import { type WorldPoint } from './relative-to-eye.js';
|
|
25
|
+
/** Bytes per occurrence in a delta stream: high vec4 + low vec4. */
|
|
26
|
+
export declare const INSTANCED_RTE_DELTA_STRIDE_BYTES = 32;
|
|
27
|
+
/** A contiguous `[first, first + count)` instance range, drawn via `firstInstance`. */
|
|
28
|
+
export interface InstanceRun {
|
|
29
|
+
readonly first: number;
|
|
30
|
+
readonly count: number;
|
|
31
|
+
}
|
|
32
|
+
/** One template's GPU delta stream plus the camera it currently holds. */
|
|
33
|
+
export interface InstancedRteDeltaStream {
|
|
34
|
+
/** VERTEX | COPY_DST, `instanceCount * 32` bytes, bound at vertex slot 2. */
|
|
35
|
+
readonly buffer: GPUBuffer;
|
|
36
|
+
/** CPU staging, 8 floats per occurrence at `instance * 8`. */
|
|
37
|
+
readonly scratch: Float32Array;
|
|
38
|
+
/** Camera whose deltas `buffer` holds, or null when it must be rewritten. */
|
|
39
|
+
camera: WorldPoint | null;
|
|
40
|
+
/** Drawable runs for `camera` (out-of-envelope occurrences excluded). */
|
|
41
|
+
runs: readonly InstanceRun[];
|
|
42
|
+
}
|
|
2
43
|
export interface InstancedRteTemplate {
|
|
3
|
-
instanceBuffer: GPUBuffer;
|
|
4
44
|
instanceCount: number;
|
|
5
45
|
/** Canonical f64 Y-up drawable origins, xyz for each instance. */
|
|
6
46
|
canonicalAnchors: Float64Array;
|
|
47
|
+
rteDeltas: InstancedRteDeltaStream;
|
|
7
48
|
}
|
|
49
|
+
/** Allocate a template's delta stream; it holds no camera until first uploaded. */
|
|
50
|
+
export declare function createInstancedRteDeltaStream(device: GPUDevice, instanceCount: number): InstancedRteDeltaStream;
|
|
51
|
+
/** Force the next upload to repack every occurrence (its canonical anchors changed). */
|
|
52
|
+
export declare function invalidateInstancedRteDeltas(stream: InstancedRteDeltaStream): void;
|
|
8
53
|
/**
|
|
9
|
-
*
|
|
54
|
+
* Bring each template's delta stream to `camera` and return its drawable runs
|
|
55
|
+
* (one list per template, in order).
|
|
56
|
+
*
|
|
57
|
+
* This is the sole writer of the delta streams. It applies the shared f64
|
|
58
|
+
* boundary/envelope check before any f32 rounding, so a colour, picker,
|
|
59
|
+
* shadow or mask pass cannot independently subtract two large rounded
|
|
60
|
+
* origins on the GPU. An occurrence outside the camera-relative envelope
|
|
61
|
+
* cannot be rasterised this frame and its lanes stay stale, so it is left out
|
|
62
|
+
* of the runs; draw them with `drawInstanceRuns` (#6128).
|
|
10
63
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
64
|
+
* A stream already holding `camera` (exact component equality) returns its
|
|
65
|
+
* cached runs with no queue write; otherwise the packed span from the first
|
|
66
|
+
* run's start to the last run's end is uploaded in one `writeBuffer` (#6393).
|
|
67
|
+
* See the module comment for the one-camera-per-submission contract.
|
|
68
|
+
*/
|
|
69
|
+
export declare function uploadInstancedRteDeltas(device: GPUDevice, templates: readonly InstancedRteTemplate[], camera: WorldPoint): (readonly InstanceRun[])[];
|
|
70
|
+
/**
|
|
71
|
+
* Visit instances `0..count-1` in order and group those for which `drawable`
|
|
72
|
+
* returns true into maximal contiguous runs. `drawable` is called exactly once
|
|
73
|
+
* per instance, so it may also perform that instance's packing.
|
|
15
74
|
*/
|
|
16
|
-
export declare function
|
|
75
|
+
export declare function collectInstanceRuns(count: number, drawable: (instance: number) => boolean): InstanceRun[];
|
|
76
|
+
/** Draw the refreshed instance runs of the bound buffers; returns the draw-call count. */
|
|
77
|
+
export declare function drawInstanceRuns(pass: GPURenderPassEncoder, indexCount: number, runs: readonly InstanceRun[]): number;
|
|
17
78
|
//# sourceMappingURL=instanced-rte.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instanced-rte.d.ts","sourceRoot":"","sources":["../src/instanced-rte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instanced-rte.d.ts","sourceRoot":"","sources":["../src/instanced-rte.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhF,oEAAoE;AACpE,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAGnD,uFAAuF;AACvF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,0EAA0E;AAC1E,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,6EAA6E;IAC7E,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,gBAAgB,EAAE,YAAY,CAAC;IAC/B,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAED,mFAAmF;AACnF,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,uBAAuB,CAO/G;AAED,wFAAwF;AACxF,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAElF;AAKD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,SAAS,oBAAoB,EAAE,EAC1C,MAAM,EAAE,UAAU,GACjB,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,CA+B5B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GAAG,WAAW,EAAE,CAazG;AAED,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,oBAAoB,EAC1B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,WAAW,EAAE,GAC3B,MAAM,CAGR"}
|
package/dist/instanced-rte.js
CHANGED
|
@@ -1,32 +1,113 @@
|
|
|
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
|
-
/** Camera-relative instance-record uploads shared by colour, pick and shadow. */
|
|
5
|
-
import { INSTANCE_ANCHOR_HIGH_OFFSET, INSTANCE_STRIDE_BYTES, } from './instanced-render.js';
|
|
6
|
-
import { packRteDrawableDelta } from './relative-to-eye.js';
|
|
7
4
|
/**
|
|
8
|
-
*
|
|
5
|
+
* Camera-relative instance deltas shared by colour, pick, shadow and the
|
|
6
|
+
* selection mask.
|
|
9
7
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
8
|
+
* Each instanced template owns an {@link InstancedRteDeltaStream}: a vertex
|
|
9
|
+
* buffer (slot 2 of `INSTANCED_VERTEX_BUFFERS`) holding one split
|
|
10
|
+
* `(drawable - camera)` high/low vec4 pair per occurrence, packed on the CPU
|
|
11
|
+
* in f64 from `canonicalAnchors`. It is kept apart from the static instance
|
|
12
|
+
* record so a camera move rewrites it with ONE `writeBuffer` per template
|
|
13
|
+
* rather than one 32-byte write per occurrence per pass, which on a model
|
|
14
|
+
* with ~45K instanced occurrences was tens of thousands of queue writes per
|
|
15
|
+
* frame and most of the submit latency (#6393).
|
|
16
|
+
*
|
|
17
|
+
* QUEUE ORDERING. `writeBuffer` is ordered before the next `queue.submit`,
|
|
18
|
+
* not before the individual pass that reads it, so a stream holds exactly one
|
|
19
|
+
* camera's deltas per submission. Every pass that shares a submission must
|
|
20
|
+
* therefore use the same camera: the colour pass, the shadow depth pre-pass
|
|
21
|
+
* and the selection mask are all encoded into the frame's one encoder with
|
|
22
|
+
* `relativeToEyeFrame.getCameraWorld()`, and the picker records and submits
|
|
23
|
+
* its own encoder. The per-stream camera cache is what turns those three
|
|
24
|
+
* same-frame calls into one upload; two different cameras inside ONE
|
|
25
|
+
* submission would make the earlier pass read the later camera's deltas.
|
|
26
|
+
*/
|
|
27
|
+
import { tryPackRteDrawableDelta } from './relative-to-eye.js';
|
|
28
|
+
/** Bytes per occurrence in a delta stream: high vec4 + low vec4. */
|
|
29
|
+
export const INSTANCED_RTE_DELTA_STRIDE_BYTES = 32;
|
|
30
|
+
const DELTA_FLOATS = INSTANCED_RTE_DELTA_STRIDE_BYTES / 4;
|
|
31
|
+
/** Allocate a template's delta stream; it holds no camera until first uploaded. */
|
|
32
|
+
export function createInstancedRteDeltaStream(device, instanceCount) {
|
|
33
|
+
const buffer = device.createBuffer({
|
|
34
|
+
label: 'instanced-rte-deltas',
|
|
35
|
+
size: Math.max(1, instanceCount) * INSTANCED_RTE_DELTA_STRIDE_BYTES,
|
|
36
|
+
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
|
37
|
+
});
|
|
38
|
+
return { buffer, scratch: new Float32Array(instanceCount * DELTA_FLOATS), camera: null, runs: [] };
|
|
39
|
+
}
|
|
40
|
+
/** Force the next upload to repack every occurrence (its canonical anchors changed). */
|
|
41
|
+
export function invalidateInstancedRteDeltas(stream) {
|
|
42
|
+
stream.camera = null;
|
|
43
|
+
}
|
|
44
|
+
const sameCamera = (a, b) => a !== null && a[0] === b[0] && a[1] === b[1] && a[2] === b[2];
|
|
45
|
+
/**
|
|
46
|
+
* Bring each template's delta stream to `camera` and return its drawable runs
|
|
47
|
+
* (one list per template, in order).
|
|
48
|
+
*
|
|
49
|
+
* This is the sole writer of the delta streams. It applies the shared f64
|
|
50
|
+
* boundary/envelope check before any f32 rounding, so a colour, picker,
|
|
51
|
+
* shadow or mask pass cannot independently subtract two large rounded
|
|
52
|
+
* origins on the GPU. An occurrence outside the camera-relative envelope
|
|
53
|
+
* cannot be rasterised this frame and its lanes stay stale, so it is left out
|
|
54
|
+
* of the runs; draw them with `drawInstanceRuns` (#6128).
|
|
55
|
+
*
|
|
56
|
+
* A stream already holding `camera` (exact component equality) returns its
|
|
57
|
+
* cached runs with no queue write; otherwise the packed span from the first
|
|
58
|
+
* run's start to the last run's end is uploaded in one `writeBuffer` (#6393).
|
|
59
|
+
* See the module comment for the one-camera-per-submission contract.
|
|
14
60
|
*/
|
|
15
61
|
export function uploadInstancedRteDeltas(device, templates, camera) {
|
|
16
|
-
|
|
17
|
-
for (const template of templates) {
|
|
62
|
+
return templates.map((template) => {
|
|
18
63
|
if (template.canonicalAnchors.length !== template.instanceCount * 3) {
|
|
19
64
|
throw new RangeError('Instanced RTE anchors do not match the instance-buffer record count.');
|
|
20
65
|
}
|
|
21
|
-
|
|
66
|
+
const stream = template.rteDeltas;
|
|
67
|
+
if (sameCamera(stream.camera, camera))
|
|
68
|
+
return stream.runs;
|
|
69
|
+
const anchors = template.canonicalAnchors;
|
|
70
|
+
const runs = collectInstanceRuns(template.instanceCount, (instance) => {
|
|
22
71
|
const source = instance * 3;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
72
|
+
return tryPackRteDrawableDelta([anchors[source], anchors[source + 1], anchors[source + 2]], camera, stream.scratch, instance * DELTA_FLOATS);
|
|
73
|
+
});
|
|
74
|
+
if (runs.length > 0) {
|
|
75
|
+
const first = runs[0].first;
|
|
76
|
+
const last = runs[runs.length - 1];
|
|
77
|
+
const end = last.first + last.count;
|
|
78
|
+
device.queue.writeBuffer(stream.buffer, first * INSTANCED_RTE_DELTA_STRIDE_BYTES, stream.scratch.subarray(first * DELTA_FLOATS, end * DELTA_FLOATS));
|
|
79
|
+
}
|
|
80
|
+
stream.camera = [camera[0], camera[1], camera[2]];
|
|
81
|
+
stream.runs = runs;
|
|
82
|
+
return runs;
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Visit instances `0..count-1` in order and group those for which `drawable`
|
|
87
|
+
* returns true into maximal contiguous runs. `drawable` is called exactly once
|
|
88
|
+
* per instance, so it may also perform that instance's packing.
|
|
89
|
+
*/
|
|
90
|
+
export function collectInstanceRuns(count, drawable) {
|
|
91
|
+
const runs = [];
|
|
92
|
+
let runStart = -1;
|
|
93
|
+
for (let instance = 0; instance < count; instance++) {
|
|
94
|
+
if (drawable(instance)) {
|
|
95
|
+
if (runStart < 0)
|
|
96
|
+
runStart = instance;
|
|
97
|
+
}
|
|
98
|
+
else if (runStart >= 0) {
|
|
99
|
+
runs.push({ first: runStart, count: instance - runStart });
|
|
100
|
+
runStart = -1;
|
|
29
101
|
}
|
|
30
102
|
}
|
|
103
|
+
if (runStart >= 0)
|
|
104
|
+
runs.push({ first: runStart, count: count - runStart });
|
|
105
|
+
return runs;
|
|
106
|
+
}
|
|
107
|
+
/** Draw the refreshed instance runs of the bound buffers; returns the draw-call count. */
|
|
108
|
+
export function drawInstanceRuns(pass, indexCount, runs) {
|
|
109
|
+
for (const run of runs)
|
|
110
|
+
pass.drawIndexed(indexCount, run.count, 0, 0, run.first);
|
|
111
|
+
return runs.length;
|
|
31
112
|
}
|
|
32
113
|
//# sourceMappingURL=instanced-rte.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instanced-rte.js","sourceRoot":"","sources":["../src/instanced-rte.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D
|
|
1
|
+
{"version":3,"file":"instanced-rte.js","sourceRoot":"","sources":["../src/instanced-rte.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vertex buffers every instanced pipeline reads:
|
|
3
|
+
*
|
|
4
|
+
* - slot 0: the template's 28-byte vertex (pos + normal + entityId; that
|
|
5
|
+
* per-vertex entityId is unused, the per-instance one wins, but it keeps
|
|
6
|
+
* slot 0 identical to the flat layout);
|
|
7
|
+
* - slot 1 (stepMode 'instance'): the static per-occurrence record, the mat4
|
|
8
|
+
* as four column vec4s, entityId, rgba and flags (`INSTANCE_STRIDE_BYTES`);
|
|
9
|
+
* - slot 2 (stepMode 'instance'): the per-template camera-relative delta
|
|
10
|
+
* stream (`instanced-rte.ts`), the split drawable-minus-camera high/low
|
|
11
|
+
* vec4s, rewritten in ONE upload per template when the camera moves (#6393).
|
|
12
|
+
*
|
|
13
|
+
* One definition for every pipeline that draws instanced geometry: the main
|
|
14
|
+
* opaque / transparent instanced pipelines in `pipeline.ts`, the
|
|
15
|
+
* selection/hover mask (#5745), the shadow depth pass and the picker. A
|
|
16
|
+
* pipeline whose shader reads only some of these locations (the shadow and
|
|
17
|
+
* pick shaders skip normal, colour, ...) still uses this layout: WebGPU
|
|
18
|
+
* permits layout attributes the shader does not consume, and sharing it means
|
|
19
|
+
* a mask, a shadow or a pick can never read a record the colour pass laid out
|
|
20
|
+
* differently. `selection-mask-instanced-bindings.test.ts` pins it against
|
|
21
|
+
* every shader's `InstanceInput`.
|
|
22
|
+
*/
|
|
23
|
+
export declare const INSTANCED_VERTEX_BUFFERS: GPUVertexBufferLayout[];
|
|
24
|
+
/** Vertex-buffer slot of the per-template RTE delta stream (slot 2 above). */
|
|
25
|
+
export declare const INSTANCED_RTE_DELTA_SLOT = 2;
|
|
26
|
+
//# sourceMappingURL=instanced-vertex-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instanced-vertex-layout.d.ts","sourceRoot":"","sources":["../src/instanced-vertex-layout.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,wBAAwB,EAAE,qBAAqB,EA8B3D,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB,IAAI,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
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 { INSTANCE_STRIDE_BYTES } from './instanced-render.js';
|
|
5
|
+
import { INSTANCED_RTE_DELTA_STRIDE_BYTES } from './instanced-rte.js';
|
|
6
|
+
/**
|
|
7
|
+
* Vertex buffers every instanced pipeline reads:
|
|
8
|
+
*
|
|
9
|
+
* - slot 0: the template's 28-byte vertex (pos + normal + entityId; that
|
|
10
|
+
* per-vertex entityId is unused, the per-instance one wins, but it keeps
|
|
11
|
+
* slot 0 identical to the flat layout);
|
|
12
|
+
* - slot 1 (stepMode 'instance'): the static per-occurrence record, the mat4
|
|
13
|
+
* as four column vec4s, entityId, rgba and flags (`INSTANCE_STRIDE_BYTES`);
|
|
14
|
+
* - slot 2 (stepMode 'instance'): the per-template camera-relative delta
|
|
15
|
+
* stream (`instanced-rte.ts`), the split drawable-minus-camera high/low
|
|
16
|
+
* vec4s, rewritten in ONE upload per template when the camera moves (#6393).
|
|
17
|
+
*
|
|
18
|
+
* One definition for every pipeline that draws instanced geometry: the main
|
|
19
|
+
* opaque / transparent instanced pipelines in `pipeline.ts`, the
|
|
20
|
+
* selection/hover mask (#5745), the shadow depth pass and the picker. A
|
|
21
|
+
* pipeline whose shader reads only some of these locations (the shadow and
|
|
22
|
+
* pick shaders skip normal, colour, ...) still uses this layout: WebGPU
|
|
23
|
+
* permits layout attributes the shader does not consume, and sharing it means
|
|
24
|
+
* a mask, a shadow or a pick can never read a record the colour pass laid out
|
|
25
|
+
* differently. `selection-mask-instanced-bindings.test.ts` pins it against
|
|
26
|
+
* every shader's `InstanceInput`.
|
|
27
|
+
*/
|
|
28
|
+
export const INSTANCED_VERTEX_BUFFERS = [
|
|
29
|
+
{
|
|
30
|
+
arrayStride: 28,
|
|
31
|
+
attributes: [
|
|
32
|
+
{ shaderLocation: 0, offset: 0, format: 'float32x3' }, // position
|
|
33
|
+
{ shaderLocation: 1, offset: 12, format: 'float32x3' }, // normal
|
|
34
|
+
{ shaderLocation: 2, offset: 24, format: 'uint32' }, // entityId (unused here)
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
arrayStride: INSTANCE_STRIDE_BYTES,
|
|
39
|
+
stepMode: 'instance',
|
|
40
|
+
attributes: [
|
|
41
|
+
{ shaderLocation: 3, offset: 0, format: 'float32x4' }, // instMat col0
|
|
42
|
+
{ shaderLocation: 4, offset: 16, format: 'float32x4' }, // col1
|
|
43
|
+
{ shaderLocation: 5, offset: 32, format: 'float32x4' }, // col2
|
|
44
|
+
{ shaderLocation: 6, offset: 48, format: 'float32x4' }, // col3
|
|
45
|
+
{ shaderLocation: 7, offset: 64, format: 'uint32' }, // entityId
|
|
46
|
+
{ shaderLocation: 8, offset: 68, format: 'float32x4' }, // rgba
|
|
47
|
+
{ shaderLocation: 9, offset: 84, format: 'uint32' }, // flags (bit 0 = selected, bit 1 = hidden)
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
arrayStride: INSTANCED_RTE_DELTA_STRIDE_BYTES,
|
|
52
|
+
stepMode: 'instance',
|
|
53
|
+
attributes: [
|
|
54
|
+
{ shaderLocation: 10, offset: 0, format: 'float32x4' }, // drawable - camera, high
|
|
55
|
+
{ shaderLocation: 11, offset: 16, format: 'float32x4' }, // drawable - camera, low
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
/** Vertex-buffer slot of the per-template RTE delta stream (slot 2 above). */
|
|
60
|
+
export const INSTANCED_RTE_DELTA_SLOT = 2;
|
|
61
|
+
//# sourceMappingURL=instanced-vertex-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instanced-vertex-layout.js","sourceRoot":"","sources":["../src/instanced-vertex-layout.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,gCAAgC,EAAE,MAAM,oBAAoB,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAA4B;IAC/D;QACE,WAAW,EAAE,EAAE;QACf,UAAU,EAAE;YACV,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,WAAW;YAClE,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,SAAS;YACjE,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,yBAAyB;SAC/E;KACF;IACD;QACE,WAAW,EAAE,qBAAqB;QAClC,QAAQ,EAAE,UAAU;QACpB,UAAU,EAAE;YACV,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,eAAe;YACtE,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO;YAC/D,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO;YAC/D,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO;YAC/D,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,WAAW;YAChE,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO;YAC/D,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,2CAA2C;SACjG;KACF;IACD;QACE,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,UAAU;QACpB,UAAU,EAAE;YACV,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,0BAA0B;YAClF,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,yBAAyB;SACnF;KACF;CACF,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { ClipBox } from './types.js';
|
|
10
10
|
import { type RelativeToEyeFrame } from './relative-to-eye.js';
|
|
11
|
-
export declare const MESH_UNIFORM_FLOATS =
|
|
11
|
+
export declare const MESH_UNIFORM_FLOATS = 96;
|
|
12
12
|
export declare const MESH_UNIFORM_BYTES: number;
|
|
13
13
|
export declare const MESH_UNIFORM_OFFSET: {
|
|
14
14
|
readonly viewProj: 0;
|
|
@@ -22,6 +22,8 @@ export declare const MESH_UNIFORM_OFFSET: {
|
|
|
22
22
|
readonly rteViewProj: 60;
|
|
23
23
|
readonly drawableDelta: 76;
|
|
24
24
|
readonly rteCameraOrigin: 84;
|
|
25
|
+
/** vec4<u32>: per-draw colour-table anchor + mode bits (entity-color-table.ts, #6076). */
|
|
26
|
+
readonly overrideParams: 92;
|
|
25
27
|
};
|
|
26
28
|
/** flags.x: vertex and fragment values are camera-relative RTE coordinates. */
|
|
27
29
|
export declare const MESH_FLAG_RTE_DRAWABLE: number;
|
|
@@ -42,6 +44,6 @@ export interface MeshSectionPlane {
|
|
|
42
44
|
* cut/crop boundary and an entire several-decimetre quantisation cell.
|
|
43
45
|
*/
|
|
44
46
|
export declare function packRteFragmentSpace(frame: RelativeToEyeFrame, section: MeshSectionPlane | null | undefined, clipBox: ClipBox | null | undefined, out: Float32Array): void;
|
|
45
|
-
/** Pack the shared camera high/low lanes used by
|
|
47
|
+
/** Pack the shared camera high/low lanes used by instanced RTE shaders. */
|
|
46
48
|
export declare function packRteCameraOrigin(frame: RelativeToEyeFrame, out: Float32Array): void;
|
|
47
49
|
//# sourceMappingURL=mesh-rte-uniforms.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesh-rte-uniforms.d.ts","sourceRoot":"","sources":["../src/mesh-rte-uniforms.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG9E,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,kBAAkB,QAAuD,CAAC;AAEvF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"mesh-rte-uniforms.d.ts","sourceRoot":"","sources":["../src/mesh-rte-uniforms.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG9E,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,kBAAkB,QAAuD,CAAC;AAEvF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;IAY9B,0FAA0F;;CAElF,CAAC;AAEX,+EAA+E;AAC/E,eAAO,MAAM,sBAAsB,QAAU,CAAC;AAE9C,gEAAgE;AAChE,eAAO,MAAM,sBAAsB,QAA6D,CAAC;AAEjG,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,EAC5C,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,EACnC,GAAG,EAAE,YAAY,GAChB,IAAI,CAkBN;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAKtF"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
import { packRteOrigin } from './relative-to-eye.js';
|
|
5
5
|
import { packRteClipBox, rtePlaneDistance } from './rte-clip-space.js';
|
|
6
|
-
export const MESH_UNIFORM_FLOATS =
|
|
6
|
+
export const MESH_UNIFORM_FLOATS = 96;
|
|
7
7
|
export const MESH_UNIFORM_BYTES = MESH_UNIFORM_FLOATS * Float32Array.BYTES_PER_ELEMENT;
|
|
8
8
|
export const MESH_UNIFORM_OFFSET = {
|
|
9
9
|
viewProj: 0,
|
|
@@ -17,6 +17,8 @@ export const MESH_UNIFORM_OFFSET = {
|
|
|
17
17
|
rteViewProj: 60,
|
|
18
18
|
drawableDelta: 76,
|
|
19
19
|
rteCameraOrigin: 84,
|
|
20
|
+
/** vec4<u32>: per-draw colour-table anchor + mode bits (entity-color-table.ts, #6076). */
|
|
21
|
+
overrideParams: 92,
|
|
20
22
|
};
|
|
21
23
|
/** flags.x: vertex and fragment values are camera-relative RTE coordinates. */
|
|
22
24
|
export const MESH_FLAG_RTE_DRAWABLE = 1 << 16;
|
|
@@ -50,7 +52,7 @@ export function packRteFragmentSpace(frame, section, clipBox, out) {
|
|
|
50
52
|
const clipOffset = MESH_UNIFORM_OFFSET.clipBoxMin;
|
|
51
53
|
packRteClipBox(clipBox, eye, out, clipOffset);
|
|
52
54
|
}
|
|
53
|
-
/** Pack the shared camera high/low lanes used by
|
|
55
|
+
/** Pack the shared camera high/low lanes used by instanced RTE shaders. */
|
|
54
56
|
export function packRteCameraOrigin(frame, out) {
|
|
55
57
|
if (out.length < MESH_UNIFORM_FLOATS) {
|
|
56
58
|
throw new RangeError(`Mesh RTE uniform needs ${MESH_UNIFORM_FLOATS} floats.`);
|