@ifc-lite/renderer 3.2.0 → 5.0.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/aabb-edges.d.ts +10 -0
- package/dist/aabb-edges.d.ts.map +1 -1
- package/dist/aabb-edges.js +13 -0
- package/dist/aabb-edges.js.map +1 -1
- package/dist/ao-params.d.ts +85 -0
- package/dist/ao-params.d.ts.map +1 -0
- package/dist/ao-params.js +109 -0
- package/dist/ao-params.js.map +1 -0
- package/dist/ao-pass.d.ts +47 -0
- package/dist/ao-pass.d.ts.map +1 -0
- package/dist/ao-pass.js +157 -0
- package/dist/ao-pass.js.map +1 -0
- package/dist/camera-matrices.d.ts +3 -0
- package/dist/camera-matrices.d.ts.map +1 -1
- package/dist/camera-matrices.js +12 -1
- package/dist/camera-matrices.js.map +1 -1
- package/dist/camera-orientation.d.ts +62 -0
- package/dist/camera-orientation.d.ts.map +1 -0
- package/dist/camera-orientation.js +155 -0
- package/dist/camera-orientation.js.map +1 -0
- package/dist/camera-projection.d.ts +3 -1
- package/dist/camera-projection.d.ts.map +1 -1
- package/dist/camera-projection.js +26 -20
- package/dist/camera-projection.js.map +1 -1
- package/dist/camera-surface-zoom.d.ts +32 -0
- package/dist/camera-surface-zoom.d.ts.map +1 -0
- package/dist/camera-surface-zoom.js +37 -0
- package/dist/camera-surface-zoom.js.map +1 -0
- package/dist/camera.d.ts +32 -61
- package/dist/camera.d.ts.map +1 -1
- package/dist/camera.js +71 -167
- package/dist/camera.js.map +1 -1
- package/dist/clash-solid-pipeline.d.ts +9 -3
- package/dist/clash-solid-pipeline.d.ts.map +1 -1
- package/dist/clash-solid-pipeline.js +31 -8
- package/dist/clash-solid-pipeline.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -3
- package/dist/constants.js.map +1 -1
- package/dist/depth-reconstruct.d.ts +43 -0
- package/dist/depth-reconstruct.d.ts.map +1 -0
- package/dist/depth-reconstruct.js +35 -0
- package/dist/depth-reconstruct.js.map +1 -0
- package/dist/device.js +1 -1
- package/dist/device.js.map +1 -1
- package/dist/edge-params.d.ts +43 -0
- package/dist/edge-params.d.ts.map +1 -0
- package/dist/edge-params.js +63 -0
- package/dist/edge-params.js.map +1 -0
- package/dist/edge-pass.d.ts +38 -0
- package/dist/edge-pass.d.ts.map +1 -0
- package/dist/edge-pass.js +111 -0
- package/dist/edge-pass.js.map +1 -0
- package/dist/environment.d.ts +26 -15
- package/dist/environment.d.ts.map +1 -1
- package/dist/environment.js +24 -13
- package/dist/environment.js.map +1 -1
- package/dist/federation-registry.d.ts +16 -0
- package/dist/federation-registry.d.ts.map +1 -1
- package/dist/federation-registry.js +80 -9
- package/dist/federation-registry.js.map +1 -1
- package/dist/gpu-static-upload.d.ts +39 -0
- package/dist/gpu-static-upload.d.ts.map +1 -0
- package/dist/gpu-static-upload.js +70 -0
- package/dist/gpu-static-upload.js.map +1 -0
- package/dist/gpu-upload-guard.d.ts +12 -23
- package/dist/gpu-upload-guard.d.ts.map +1 -1
- package/dist/gpu-upload-guard.js +12 -26
- package/dist/gpu-upload-guard.js.map +1 -1
- package/dist/index.d.ts +58 -35
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +255 -284
- package/dist/index.js.map +1 -1
- package/dist/instanced-render.d.ts +25 -5
- package/dist/instanced-render.d.ts.map +1 -1
- package/dist/instanced-render.js +50 -13
- package/dist/instanced-render.js.map +1 -1
- package/dist/instanced-rte.d.ts +17 -0
- package/dist/instanced-rte.d.ts.map +1 -0
- package/dist/instanced-rte.js +32 -0
- package/dist/instanced-rte.js.map +1 -0
- package/dist/mesh-material.d.ts +26 -0
- package/dist/mesh-material.d.ts.map +1 -0
- package/dist/mesh-material.js +52 -0
- package/dist/mesh-material.js.map +1 -0
- package/dist/mesh-rte-uniforms.d.ts +47 -0
- package/dist/mesh-rte-uniforms.d.ts.map +1 -0
- package/dist/mesh-rte-uniforms.js +60 -0
- package/dist/mesh-rte-uniforms.js.map +1 -0
- package/dist/model-bounds-tracker.d.ts +7 -0
- package/dist/model-bounds-tracker.d.ts.map +1 -1
- package/dist/model-bounds-tracker.js +16 -5
- package/dist/model-bounds-tracker.js.map +1 -1
- package/dist/model-translation.d.ts +1 -1
- package/dist/model-translation.d.ts.map +1 -1
- package/dist/model-translation.js +50 -2
- package/dist/model-translation.js.map +1 -1
- package/dist/overlay-theme-uniforms.d.ts +54 -0
- package/dist/overlay-theme-uniforms.d.ts.map +1 -0
- package/dist/overlay-theme-uniforms.js +89 -0
- package/dist/overlay-theme-uniforms.js.map +1 -0
- package/dist/overlay-theme.d.ts +73 -0
- package/dist/overlay-theme.d.ts.map +1 -0
- package/dist/overlay-theme.js +24 -0
- package/dist/overlay-theme.js.map +1 -0
- package/dist/pick-rte-snapshot.d.ts +7 -0
- package/dist/pick-rte-snapshot.d.ts.map +1 -0
- package/dist/pick-rte-snapshot.js +15 -0
- package/dist/pick-rte-snapshot.js.map +1 -0
- package/dist/pick-types.d.ts +17 -0
- package/dist/pick-types.d.ts.map +1 -0
- package/dist/pick-types.js +5 -0
- package/dist/pick-types.js.map +1 -0
- package/dist/pick-uniforms.d.ts +6 -0
- package/dist/pick-uniforms.d.ts.map +1 -1
- package/dist/pick-uniforms.js +22 -18
- package/dist/pick-uniforms.js.map +1 -1
- package/dist/pick-world-position.d.ts +18 -0
- package/dist/pick-world-position.d.ts.map +1 -0
- package/dist/pick-world-position.js +21 -0
- package/dist/pick-world-position.js.map +1 -0
- package/dist/picker-readbacks.d.ts +6 -0
- package/dist/picker-readbacks.d.ts.map +1 -0
- package/dist/picker-readbacks.js +20 -0
- package/dist/picker-readbacks.js.map +1 -0
- package/dist/picker-rte-uniforms.d.ts +6 -0
- package/dist/picker-rte-uniforms.d.ts.map +1 -0
- package/dist/picker-rte-uniforms.js +41 -0
- package/dist/picker-rte-uniforms.js.map +1 -0
- package/dist/picker.d.ts +6 -7
- package/dist/picker.d.ts.map +1 -1
- package/dist/picker.js +88 -115
- package/dist/picker.js.map +1 -1
- package/dist/picking-manager.d.ts +8 -0
- package/dist/picking-manager.d.ts.map +1 -1
- package/dist/picking-manager.js +46 -19
- package/dist/picking-manager.js.map +1 -1
- package/dist/pipeline.d.ts +3 -7
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +27 -31
- package/dist/pipeline.js.map +1 -1
- package/dist/point-picker.d.ts +5 -1
- package/dist/point-picker.d.ts.map +1 -1
- package/dist/point-picker.js +49 -9
- package/dist/point-picker.js.map +1 -1
- package/dist/pointcloud/point-cloud-handle-ids.d.ts +22 -0
- package/dist/pointcloud/point-cloud-handle-ids.d.ts.map +1 -0
- package/dist/pointcloud/point-cloud-handle-ids.js +31 -0
- package/dist/pointcloud/point-cloud-handle-ids.js.map +1 -0
- package/dist/pointcloud/point-cloud-node.d.ts +14 -6
- package/dist/pointcloud/point-cloud-node.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-node.js.map +1 -1
- package/dist/pointcloud/point-cloud-pick-sources.d.ts +47 -0
- package/dist/pointcloud/point-cloud-pick-sources.d.ts.map +1 -0
- package/dist/pointcloud/point-cloud-pick-sources.js +32 -0
- package/dist/pointcloud/point-cloud-pick-sources.js.map +1 -0
- package/dist/pointcloud/point-cloud-placement.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-placement.js +20 -5
- package/dist/pointcloud/point-cloud-placement.js.map +1 -1
- package/dist/pointcloud/point-cloud-ray-transform.d.ts +78 -4
- package/dist/pointcloud/point-cloud-ray-transform.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-ray-transform.js +31 -84
- package/dist/pointcloud/point-cloud-ray-transform.js.map +1 -1
- package/dist/pointcloud/point-cloud-renderer.d.ts +21 -19
- package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-renderer.js +46 -52
- package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
- package/dist/pointcloud/point-cloud-stream-lifecycle.d.ts +44 -0
- package/dist/pointcloud/point-cloud-stream-lifecycle.d.ts.map +1 -0
- package/dist/pointcloud/point-cloud-stream-lifecycle.js +44 -0
- package/dist/pointcloud/point-cloud-stream-lifecycle.js.map +1 -0
- package/dist/pointcloud/point-cloud-uniforms.d.ts +5 -0
- package/dist/pointcloud/point-cloud-uniforms.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-uniforms.js +55 -44
- package/dist/pointcloud/point-cloud-uniforms.js.map +1 -1
- package/dist/pointcloud/point-cloud-visibility.d.ts +10 -0
- package/dist/pointcloud/point-cloud-visibility.d.ts.map +1 -0
- package/dist/pointcloud/point-cloud-visibility.js +18 -0
- package/dist/pointcloud/point-cloud-visibility.js.map +1 -0
- package/dist/pointcloud/point-pipeline.d.ts +4 -9
- package/dist/pointcloud/point-pipeline.d.ts.map +1 -1
- package/dist/pointcloud/point-pipeline.js +4 -9
- package/dist/pointcloud/point-pipeline.js.map +1 -1
- package/dist/pointcloud/point-shader.wgsl.d.ts +1 -21
- package/dist/pointcloud/point-shader.wgsl.d.ts.map +1 -1
- package/dist/pointcloud/point-shader.wgsl.js +25 -5
- package/dist/pointcloud/point-shader.wgsl.js.map +1 -1
- package/dist/post-pass-chain.d.ts +38 -0
- package/dist/post-pass-chain.d.ts.map +1 -0
- package/dist/post-pass-chain.js +105 -0
- package/dist/post-pass-chain.js.map +1 -0
- package/dist/raycast-engine.d.ts +7 -5
- package/dist/raycast-engine.d.ts.map +1 -1
- package/dist/raycast-engine.js +17 -20
- package/dist/raycast-engine.js.map +1 -1
- package/dist/raycast-point-cloud-query.d.ts +1 -1
- package/dist/raycast-point-cloud-query.d.ts.map +1 -1
- package/dist/reference-image-pipeline.d.ts +1 -1
- package/dist/reference-image-pipeline.d.ts.map +1 -1
- package/dist/reference-image-pipeline.js +25 -7
- package/dist/reference-image-pipeline.js.map +1 -1
- package/dist/reference-images.d.ts +1 -1
- package/dist/reference-images.d.ts.map +1 -1
- package/dist/reference-images.js +13 -5
- package/dist/reference-images.js.map +1 -1
- package/dist/relative-to-eye.d.ts +146 -0
- package/dist/relative-to-eye.d.ts.map +1 -0
- package/dist/relative-to-eye.js +326 -0
- package/dist/relative-to-eye.js.map +1 -0
- package/dist/render-section-draw.d.ts +11 -0
- package/dist/render-section-draw.d.ts.map +1 -1
- package/dist/render-section-draw.js +6 -3
- package/dist/render-section-draw.js.map +1 -1
- package/dist/renderer-color-readback.d.ts +50 -0
- package/dist/renderer-color-readback.d.ts.map +1 -0
- package/dist/renderer-color-readback.js +145 -0
- package/dist/renderer-color-readback.js.map +1 -0
- package/dist/renderer-overlays.d.ts +20 -10
- package/dist/renderer-overlays.d.ts.map +1 -1
- package/dist/renderer-overlays.js +44 -34
- package/dist/renderer-overlays.js.map +1 -1
- package/dist/renderer-screenshot.d.ts +4 -0
- package/dist/renderer-screenshot.d.ts.map +1 -0
- package/dist/renderer-screenshot.js +17 -0
- package/dist/renderer-screenshot.js.map +1 -0
- package/dist/renderer-symbolic-overlays.d.ts +4 -2
- package/dist/renderer-symbolic-overlays.d.ts.map +1 -1
- package/dist/renderer-symbolic-overlays.js +33 -13
- package/dist/renderer-symbolic-overlays.js.map +1 -1
- package/dist/renderer-viewport.d.ts +45 -0
- package/dist/renderer-viewport.d.ts.map +1 -1
- package/dist/renderer-viewport.js +44 -0
- package/dist/renderer-viewport.js.map +1 -1
- package/dist/rte-clip-space.d.ts +12 -0
- package/dist/rte-clip-space.d.ts.map +1 -0
- package/dist/rte-clip-space.js +22 -0
- package/dist/rte-clip-space.js.map +1 -0
- package/dist/rte-frustum.d.ts +24 -0
- package/dist/rte-frustum.d.ts.map +1 -0
- package/dist/rte-frustum.js +45 -0
- package/dist/rte-frustum.js.map +1 -0
- package/dist/scene-batch-upload.d.ts.map +1 -1
- package/dist/scene-batch-upload.js +14 -38
- package/dist/scene-batch-upload.js.map +1 -1
- package/dist/scene-device-recovery.d.ts.map +1 -1
- package/dist/scene-device-recovery.js +5 -9
- package/dist/scene-device-recovery.js.map +1 -1
- package/dist/scene-finalize-regroup.d.ts +54 -0
- package/dist/scene-finalize-regroup.d.ts.map +1 -0
- package/dist/scene-finalize-regroup.js +136 -0
- package/dist/scene-finalize-regroup.js.map +1 -0
- package/dist/scene-instance-bounds.d.ts +12 -0
- package/dist/scene-instance-bounds.d.ts.map +1 -0
- package/dist/scene-instance-bounds.js +48 -0
- package/dist/scene-instance-bounds.js.map +1 -0
- package/dist/scene-instance-materialization.d.ts +4 -1
- package/dist/scene-instance-materialization.d.ts.map +1 -1
- package/dist/scene-instance-materialization.js +21 -6
- package/dist/scene-instance-materialization.js.map +1 -1
- package/dist/scene-instance-translation.d.ts +17 -0
- package/dist/scene-instance-translation.d.ts.map +1 -0
- package/dist/scene-instance-translation.js +50 -0
- package/dist/scene-instance-translation.js.map +1 -0
- package/dist/scene-instance-types.d.ts +6 -0
- package/dist/scene-instance-types.d.ts.map +1 -1
- package/dist/scene-model-translation.d.ts +2 -0
- package/dist/scene-model-translation.d.ts.map +1 -1
- package/dist/scene-model-translation.js +1 -1
- package/dist/scene-model-translation.js.map +1 -1
- package/dist/scene-rect-select.d.ts +11 -1
- package/dist/scene-rect-select.d.ts.map +1 -1
- package/dist/scene-rect-select.js +7 -4
- package/dist/scene-rect-select.js.map +1 -1
- package/dist/scene.d.ts +27 -20
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +109 -238
- package/dist/scene.js.map +1 -1
- package/dist/section-2d-lift.d.ts +10 -2
- package/dist/section-2d-lift.d.ts.map +1 -1
- package/dist/section-2d-lift.js +14 -6
- package/dist/section-2d-lift.js.map +1 -1
- package/dist/section-2d-line-buffer.d.ts +12 -4
- package/dist/section-2d-line-buffer.d.ts.map +1 -1
- package/dist/section-2d-line-buffer.js +59 -33
- package/dist/section-2d-line-buffer.js.map +1 -1
- package/dist/section-2d-overlay.d.ts +18 -72
- package/dist/section-2d-overlay.d.ts.map +1 -1
- package/dist/section-2d-overlay.js +72 -103
- package/dist/section-2d-overlay.js.map +1 -1
- package/dist/section-2d-types.d.ts +38 -0
- package/dist/section-2d-types.d.ts.map +1 -0
- package/dist/section-2d-types.js +6 -0
- package/dist/section-2d-types.js.map +1 -0
- package/dist/section-cap-pipelines.d.ts +6 -0
- package/dist/section-cap-pipelines.d.ts.map +1 -0
- package/dist/section-cap-pipelines.js +87 -0
- package/dist/section-cap-pipelines.js.map +1 -0
- package/dist/section-plane-geometry.d.ts +24 -0
- package/dist/section-plane-geometry.d.ts.map +1 -0
- package/dist/section-plane-geometry.js +93 -0
- package/dist/section-plane-geometry.js.map +1 -0
- package/dist/section-plane.d.ts +26 -24
- package/dist/section-plane.d.ts.map +1 -1
- package/dist/section-plane.js +57 -182
- package/dist/section-plane.js.map +1 -1
- package/dist/shaders/ao.wgsl.d.ts +2 -0
- package/dist/shaders/ao.wgsl.d.ts.map +1 -0
- package/dist/shaders/ao.wgsl.js +234 -0
- package/dist/shaders/ao.wgsl.js.map +1 -0
- package/dist/shaders/color-transfer.wgsl.d.ts +28 -0
- package/dist/shaders/color-transfer.wgsl.d.ts.map +1 -0
- package/dist/shaders/color-transfer.wgsl.js +55 -0
- package/dist/shaders/color-transfer.wgsl.js.map +1 -0
- package/dist/shaders/depth-reconstruct.wgsl.d.ts +16 -0
- package/dist/shaders/depth-reconstruct.wgsl.d.ts.map +1 -0
- package/dist/shaders/depth-reconstruct.wgsl.js +69 -0
- package/dist/shaders/depth-reconstruct.wgsl.js.map +1 -0
- package/dist/shaders/edges.wgsl.d.ts +2 -0
- package/dist/shaders/edges.wgsl.d.ts.map +1 -0
- package/dist/shaders/edges.wgsl.js +158 -0
- package/dist/shaders/edges.wgsl.js.map +1 -0
- package/dist/shaders/main-rte-shadow.wgsl.d.ts +4 -0
- package/dist/shaders/main-rte-shadow.wgsl.d.ts.map +1 -0
- package/dist/shaders/main-rte-shadow.wgsl.js +54 -0
- package/dist/shaders/main-rte-shadow.wgsl.js.map +1 -0
- package/dist/shaders/main.wgsl.d.ts +1 -6
- package/dist/shaders/main.wgsl.d.ts.map +1 -1
- package/dist/shaders/main.wgsl.js +183 -228
- package/dist/shaders/main.wgsl.js.map +1 -1
- package/dist/shaders/relative-to-eye.wgsl.d.ts +12 -0
- package/dist/shaders/relative-to-eye.wgsl.d.ts.map +1 -0
- package/dist/shaders/relative-to-eye.wgsl.js +40 -0
- package/dist/shaders/relative-to-eye.wgsl.js.map +1 -0
- package/dist/shaders/section-2d-overlay.wgsl.d.ts +28 -12
- package/dist/shaders/section-2d-overlay.wgsl.d.ts.map +1 -1
- package/dist/shaders/section-2d-overlay.wgsl.js +40 -13
- package/dist/shaders/section-2d-overlay.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 +25 -7
- package/dist/shaders/shadow.wgsl.js.map +1 -1
- package/dist/shaders/sky.wgsl.d.ts +1 -11
- package/dist/shaders/sky.wgsl.d.ts.map +1 -1
- package/dist/shaders/sky.wgsl.js +17 -19
- package/dist/shaders/sky.wgsl.js.map +1 -1
- package/dist/shaders/specular.wgsl.d.ts +34 -0
- package/dist/shaders/specular.wgsl.d.ts.map +1 -0
- package/dist/shaders/specular.wgsl.js +134 -0
- package/dist/shaders/specular.wgsl.js.map +1 -0
- package/dist/shaders/symbolic-overlay.wgsl.d.ts +2 -9
- package/dist/shaders/symbolic-overlay.wgsl.d.ts.map +1 -1
- package/dist/shaders/symbolic-overlay.wgsl.js +88 -17
- package/dist/shaders/symbolic-overlay.wgsl.js.map +1 -1
- package/dist/shaders/textured.wgsl.d.ts.map +1 -1
- package/dist/shaders/textured.wgsl.js +11 -9
- package/dist/shaders/textured.wgsl.js.map +1 -1
- package/dist/shadow-light-matrix.d.ts +7 -0
- package/dist/shadow-light-matrix.d.ts.map +1 -1
- package/dist/shadow-light-matrix.js +11 -0
- package/dist/shadow-light-matrix.js.map +1 -1
- package/dist/shadow-occluder-batches.d.ts +10 -0
- package/dist/shadow-occluder-batches.d.ts.map +1 -0
- package/dist/shadow-occluder-batches.js +39 -0
- package/dist/shadow-occluder-batches.js.map +1 -0
- 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 +5 -51
- package/dist/shadow-pass.d.ts.map +1 -1
- package/dist/shadow-pass.js +49 -45
- package/dist/shadow-pass.js.map +1 -1
- package/dist/shadow-types.d.ts +39 -0
- package/dist/shadow-types.d.ts.map +1 -0
- package/dist/shadow-types.js +15 -0
- package/dist/shadow-types.js.map +1 -0
- package/dist/symbolic-overlay-geometry.d.ts +7 -0
- package/dist/symbolic-overlay-geometry.d.ts.map +1 -0
- package/dist/symbolic-overlay-geometry.js +43 -0
- package/dist/symbolic-overlay-geometry.js.map +1 -0
- package/dist/symbolic-overlay-pipelines.d.ts +24 -36
- package/dist/symbolic-overlay-pipelines.d.ts.map +1 -1
- package/dist/symbolic-overlay-pipelines.js +175 -182
- package/dist/symbolic-overlay-pipelines.js.map +1 -1
- package/dist/symbolic-text-atlas.d.ts +21 -0
- package/dist/symbolic-text-atlas.d.ts.map +1 -1
- package/dist/symbolic-text-atlas.js +29 -1
- package/dist/symbolic-text-atlas.js.map +1 -1
- package/dist/types.d.ts +20 -26
- package/dist/types.d.ts.map +1 -1
- package/dist/visual-enhancement.d.ts +30 -1
- package/dist/visual-enhancement.d.ts.map +1 -1
- package/dist/visual-enhancement.js +44 -12
- package/dist/visual-enhancement.js.map +1 -1
- package/package.json +3 -3
- package/dist/post-processor.d.ts +0 -60
- package/dist/post-processor.d.ts.map +0 -1
- package/dist/post-processor.js +0 -353
- package/dist/post-processor.js.map +0 -1
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
2
|
+
import type { BatchedMesh } from './types.js';
|
|
3
|
+
/** The slice of a bucket the finalize re-group reads and writes. */
|
|
4
|
+
export interface RegroupBucket {
|
|
5
|
+
key: string;
|
|
6
|
+
meshData: MeshData[];
|
|
7
|
+
batchedMesh: BatchedMesh | null;
|
|
8
|
+
vertexBytes: number;
|
|
9
|
+
frameOrigin?: [number, number, number];
|
|
10
|
+
}
|
|
11
|
+
/** The scene state a streaming finalize re-groups. Maps are mutated in place. */
|
|
12
|
+
export interface RegroupHost<Bucket extends RegroupBucket> {
|
|
13
|
+
buckets: Map<string, Bucket>;
|
|
14
|
+
meshDataBucket: Map<MeshData, Bucket>;
|
|
15
|
+
activeBucketKey: Map<string, string>;
|
|
16
|
+
coldBuckets: ReadonlySet<string>;
|
|
17
|
+
pendingBatchKeys: Set<string>;
|
|
18
|
+
/** Buckets that received streamed meshes since the last finalize. */
|
|
19
|
+
streamedBucketKeys: Set<string>;
|
|
20
|
+
bucketBaseKey(meshData: MeshData): string;
|
|
21
|
+
/** Routes a mesh to a bucket key, creating the bucket when needed. */
|
|
22
|
+
resolveActiveBucket(baseKey: string, meshData: MeshData): string;
|
|
23
|
+
/** Creates a bucket for a key the router left unpublished. */
|
|
24
|
+
createBucket(key: string): Bucket;
|
|
25
|
+
}
|
|
26
|
+
export interface FinalizeRegroup {
|
|
27
|
+
/**
|
|
28
|
+
* Batches of the dissolved buckets. They stay live, and keep drawing from
|
|
29
|
+
* the old flat array, until the replacement batches are swapped in; only
|
|
30
|
+
* then may the caller free them.
|
|
31
|
+
*/
|
|
32
|
+
retired: BatchedMesh[];
|
|
33
|
+
/** Undo every map mutation, for a rebuild that failed before its swap. */
|
|
34
|
+
rollback(): void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Re-group ONLY the meshes streamed since the last finalize (#5358).
|
|
38
|
+
*
|
|
39
|
+
* Finalize used to dissolve and rebuild every bucket in the scene, so each
|
|
40
|
+
* federated add re-merged and re-uploaded the whole federation (O(N^2) over N
|
|
41
|
+
* models) and held two GPU copies of all of it until the swap. The reason for
|
|
42
|
+
* re-grouping at all is local to the streamed meshes: their colours can be
|
|
43
|
+
* mutated in place while streaming (deferred style colours), so the key they
|
|
44
|
+
* were bucketed under can be stale. Every other bucket is already correct and
|
|
45
|
+
* keeps its batch.
|
|
46
|
+
*
|
|
47
|
+
* The streamed buckets are dissolved and their meshes re-routed by CURRENT
|
|
48
|
+
* colour. A mesh may land in a bucket that already existed (same model, same
|
|
49
|
+
* colour); that bucket is rebuilt with it, and nothing else is. Every key that
|
|
50
|
+
* needs a (re)build is added to `pendingBatchKeys`. Cold shells are sealed and
|
|
51
|
+
* are never dissolved.
|
|
52
|
+
*/
|
|
53
|
+
export declare function regroupStreamedBuckets<Bucket extends RegroupBucket>(host: RegroupHost<Bucket>): FinalizeRegroup;
|
|
54
|
+
//# sourceMappingURL=scene-finalize-regroup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-finalize-regroup.d.ts","sourceRoot":"","sources":["../src/scene-finalize-regroup.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,iFAAiF;AACjF,MAAM,WAAW,WAAW,CAAC,MAAM,SAAS,aAAa;IACvD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,cAAc,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,qEAAqE;IACrE,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1C,sEAAsE;IACtE,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjE,8DAA8D;IAC9D,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,0EAA0E;IAC1E,QAAQ,IAAI,IAAI,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,SAAS,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,eAAe,CAqG/G"}
|
|
@@ -0,0 +1,136 @@
|
|
|
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
|
+
* Re-group ONLY the meshes streamed since the last finalize (#5358).
|
|
6
|
+
*
|
|
7
|
+
* Finalize used to dissolve and rebuild every bucket in the scene, so each
|
|
8
|
+
* federated add re-merged and re-uploaded the whole federation (O(N^2) over N
|
|
9
|
+
* models) and held two GPU copies of all of it until the swap. The reason for
|
|
10
|
+
* re-grouping at all is local to the streamed meshes: their colours can be
|
|
11
|
+
* mutated in place while streaming (deferred style colours), so the key they
|
|
12
|
+
* were bucketed under can be stale. Every other bucket is already correct and
|
|
13
|
+
* keeps its batch.
|
|
14
|
+
*
|
|
15
|
+
* The streamed buckets are dissolved and their meshes re-routed by CURRENT
|
|
16
|
+
* colour. A mesh may land in a bucket that already existed (same model, same
|
|
17
|
+
* colour); that bucket is rebuilt with it, and nothing else is. Every key that
|
|
18
|
+
* needs a (re)build is added to `pendingBatchKeys`. Cold shells are sealed and
|
|
19
|
+
* are never dissolved.
|
|
20
|
+
*/
|
|
21
|
+
export function regroupStreamedBuckets(host) {
|
|
22
|
+
const activeSnapshot = new Map(host.activeBucketKey);
|
|
23
|
+
const pendingSnapshot = new Set(host.pendingBatchKeys);
|
|
24
|
+
const streamedSnapshot = new Set(host.streamedBucketKeys);
|
|
25
|
+
const dissolved = [];
|
|
26
|
+
const retired = [];
|
|
27
|
+
const moved = [];
|
|
28
|
+
for (const key of host.streamedBucketKeys) {
|
|
29
|
+
const bucket = host.buckets.get(key);
|
|
30
|
+
if (!bucket)
|
|
31
|
+
continue;
|
|
32
|
+
if (host.coldBuckets.has(key) && bucket.meshData.length === 0)
|
|
33
|
+
continue;
|
|
34
|
+
host.buckets.delete(key);
|
|
35
|
+
host.pendingBatchKeys.delete(key);
|
|
36
|
+
dissolved.push([key, bucket]);
|
|
37
|
+
if (bucket.batchedMesh)
|
|
38
|
+
retired.push(bucket.batchedMesh);
|
|
39
|
+
for (const md of bucket.meshData)
|
|
40
|
+
moved.push(md);
|
|
41
|
+
}
|
|
42
|
+
host.streamedBucketKeys.clear();
|
|
43
|
+
// Every bucket the re-group routes into, so a rollback can take exactly the
|
|
44
|
+
// moved meshes (and their bytes) back out. Byte counters are snapshotted up
|
|
45
|
+
// front because the router bumps them while it routes.
|
|
46
|
+
const preexisting = new Map();
|
|
47
|
+
for (const [key, bucket] of host.buckets)
|
|
48
|
+
preexisting.set(key, bucket.vertexBytes);
|
|
49
|
+
const touched = new Map();
|
|
50
|
+
const addedPending = new Set();
|
|
51
|
+
const activeChanges = new Map();
|
|
52
|
+
// The async finalize can fail a whole chunk later, after more meshes have
|
|
53
|
+
// streamed in. The rollback therefore undoes only what the re-group itself
|
|
54
|
+
// did: it strips the moved meshes rather than truncating, keeps keys and
|
|
55
|
+
// active split keys set since, and unions (never replaces) the key sets.
|
|
56
|
+
const rollback = () => {
|
|
57
|
+
const movedSet = new Set(moved);
|
|
58
|
+
const restoredKeys = new Map(dissolved);
|
|
59
|
+
for (const [key, entry] of touched) {
|
|
60
|
+
const { bucket } = entry;
|
|
61
|
+
const kept = bucket.meshData.filter((md) => !movedSet.has(md));
|
|
62
|
+
bucket.meshData.splice(0, bucket.meshData.length, ...kept);
|
|
63
|
+
bucket.vertexBytes = entry.bytesBefore + Math.max(0, bucket.vertexBytes - entry.bytesAfter);
|
|
64
|
+
if (!entry.created || host.buckets.get(key) !== bucket)
|
|
65
|
+
continue;
|
|
66
|
+
const original = restoredKeys.get(key);
|
|
67
|
+
if (kept.length === 0 || original)
|
|
68
|
+
host.buckets.delete(key);
|
|
69
|
+
if (original && kept.length > 0) {
|
|
70
|
+
// Meshes streamed into the re-created key since: fold them back into
|
|
71
|
+
// the bucket that owned the key before the re-group.
|
|
72
|
+
for (const md of kept) {
|
|
73
|
+
original.meshData.push(md);
|
|
74
|
+
host.meshDataBucket.set(md, original);
|
|
75
|
+
}
|
|
76
|
+
original.vertexBytes += bucket.vertexBytes - entry.bytesBefore;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
for (const [key, bucket] of dissolved) {
|
|
80
|
+
host.buckets.set(key, bucket);
|
|
81
|
+
for (const md of bucket.meshData)
|
|
82
|
+
host.meshDataBucket.set(md, bucket);
|
|
83
|
+
}
|
|
84
|
+
for (const [base, change] of activeChanges) {
|
|
85
|
+
if (host.activeBucketKey.get(base) !== change.after)
|
|
86
|
+
continue;
|
|
87
|
+
if (change.before === undefined)
|
|
88
|
+
host.activeBucketKey.delete(base);
|
|
89
|
+
else
|
|
90
|
+
host.activeBucketKey.set(base, change.before);
|
|
91
|
+
}
|
|
92
|
+
for (const key of addedPending)
|
|
93
|
+
host.pendingBatchKeys.delete(key);
|
|
94
|
+
for (const key of pendingSnapshot)
|
|
95
|
+
host.pendingBatchKeys.add(key);
|
|
96
|
+
for (const key of streamedSnapshot)
|
|
97
|
+
host.streamedBucketKeys.add(key);
|
|
98
|
+
};
|
|
99
|
+
try {
|
|
100
|
+
for (const meshData of moved) {
|
|
101
|
+
const key = host.resolveActiveBucket(host.bucketBaseKey(meshData), meshData);
|
|
102
|
+
let bucket = host.buckets.get(key);
|
|
103
|
+
if (!bucket) {
|
|
104
|
+
bucket = host.createBucket(key);
|
|
105
|
+
host.buckets.set(key, bucket);
|
|
106
|
+
}
|
|
107
|
+
if (!touched.has(key)) {
|
|
108
|
+
touched.set(key, { bucket, bytesBefore: preexisting.get(key) ?? 0, bytesAfter: 0, created: !preexisting.has(key) });
|
|
109
|
+
}
|
|
110
|
+
bucket.meshData.push(meshData);
|
|
111
|
+
host.meshDataBucket.set(meshData, bucket);
|
|
112
|
+
if (!host.pendingBatchKeys.has(key))
|
|
113
|
+
addedPending.add(key);
|
|
114
|
+
host.pendingBatchKeys.add(key);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
recordRegroupEffects();
|
|
119
|
+
rollback();
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
recordRegroupEffects();
|
|
123
|
+
return { retired, rollback };
|
|
124
|
+
// What the routing left behind, so a later rollback can tell it apart from
|
|
125
|
+
// anything that streams in afterwards.
|
|
126
|
+
function recordRegroupEffects() {
|
|
127
|
+
for (const entry of touched.values())
|
|
128
|
+
entry.bytesAfter = entry.bucket.vertexBytes;
|
|
129
|
+
for (const [base, key] of host.activeBucketKey) {
|
|
130
|
+
const before = activeSnapshot.get(base);
|
|
131
|
+
if (before !== key)
|
|
132
|
+
activeChanges.set(base, { before, after: key });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=scene-finalize-regroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-finalize-regroup.js","sourceRoot":"","sources":["../src/scene-finalize-regroup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BoundingBox } from './scene-raycaster.js';
|
|
2
|
+
export interface InstanceWorldAabb {
|
|
3
|
+
minX: number;
|
|
4
|
+
minY: number;
|
|
5
|
+
minZ: number;
|
|
6
|
+
maxX: number;
|
|
7
|
+
maxY: number;
|
|
8
|
+
maxZ: number;
|
|
9
|
+
}
|
|
10
|
+
/** Transform one local instance box and fold it into its entity's source-f64 bounds. */
|
|
11
|
+
export declare function unionInstancedWorldAabb(boundingBoxes: Map<number, BoundingBox>, eid: number, dv: DataView, matOffset: number, lmnx: number, lmny: number, lmnz: number, lmxx: number, lmxy: number, lmxz: number): InstanceWorldAabb;
|
|
12
|
+
//# sourceMappingURL=scene-instance-bounds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-instance-bounds.d.ts","sourceRoot":"","sources":["../src/scene-instance-bounds.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AASxD,MAAM,WAAW,iBAAiB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAEzH,wFAAwF;AACxF,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EACrF,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GACjF,iBAAiB,CAyBnB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
+
// V2 instance records keep their canonical renderer-Y-up origin as split
|
|
5
|
+
// f64-like lanes. Bounds/culling/CPU broad-phase must read those same lanes as
|
|
6
|
+
// the GPU path; the V1 matrix translation has already rounded away centimetres
|
|
7
|
+
// at national-grid coordinates.
|
|
8
|
+
const INSTANCE_ANCHOR_HIGH_OFFSET = 88;
|
|
9
|
+
const INSTANCE_ANCHOR_LOW_OFFSET = 104;
|
|
10
|
+
/** Transform one local instance box and fold it into its entity's source-f64 bounds. */
|
|
11
|
+
export function unionInstancedWorldAabb(boundingBoxes, eid, dv, matOffset, lmnx, lmny, lmnz, lmxx, lmxy, lmxz) {
|
|
12
|
+
const m0 = dv.getFloat32(matOffset, true), m1 = dv.getFloat32(matOffset + 4, true), m2 = dv.getFloat32(matOffset + 8, true);
|
|
13
|
+
const m4 = dv.getFloat32(matOffset + 16, true), m5 = dv.getFloat32(matOffset + 20, true), m6 = dv.getFloat32(matOffset + 24, true);
|
|
14
|
+
const m8 = dv.getFloat32(matOffset + 32, true), m9 = dv.getFloat32(matOffset + 36, true), m10 = dv.getFloat32(matOffset + 40, true);
|
|
15
|
+
const legacyX = dv.getFloat32(matOffset + 48, true), legacyY = dv.getFloat32(matOffset + 52, true), legacyZ = dv.getFloat32(matOffset + 56, true);
|
|
16
|
+
const splitAnchor = (axis, legacy) => {
|
|
17
|
+
if (matOffset + INSTANCE_ANCHOR_LOW_OFFSET + axis * 4 + 4 > dv.byteLength)
|
|
18
|
+
return legacy;
|
|
19
|
+
const high = dv.getFloat32(matOffset + INSTANCE_ANCHOR_HIGH_OFFSET + axis * 4, true);
|
|
20
|
+
const low = dv.getFloat32(matOffset + INSTANCE_ANCHOR_LOW_OFFSET + axis * 4, true);
|
|
21
|
+
return Number.isFinite(high) && Number.isFinite(low) ? high + low : legacy;
|
|
22
|
+
};
|
|
23
|
+
const anchorX = splitAnchor(0, legacyX), anchorY = splitAnchor(1, legacyY), anchorZ = splitAnchor(2, legacyZ);
|
|
24
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity, maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
25
|
+
for (let corner = 0; corner < 8; corner++) {
|
|
26
|
+
const x = (corner & 1) ? lmxx : lmnx, y = (corner & 2) ? lmxy : lmny, z = (corner & 4) ? lmxz : lmnz;
|
|
27
|
+
const wx = m0 * x + m4 * y + m8 * z + anchorX, wy = m1 * x + m5 * y + m9 * z + anchorY, wz = m2 * x + m6 * y + m10 * z + anchorZ;
|
|
28
|
+
minX = Math.min(minX, wx);
|
|
29
|
+
minY = Math.min(minY, wy);
|
|
30
|
+
minZ = Math.min(minZ, wz);
|
|
31
|
+
maxX = Math.max(maxX, wx);
|
|
32
|
+
maxY = Math.max(maxY, wy);
|
|
33
|
+
maxZ = Math.max(maxZ, wz);
|
|
34
|
+
}
|
|
35
|
+
const existing = boundingBoxes.get(eid);
|
|
36
|
+
if (existing) {
|
|
37
|
+
existing.min.x = Math.min(existing.min.x, minX);
|
|
38
|
+
existing.min.y = Math.min(existing.min.y, minY);
|
|
39
|
+
existing.min.z = Math.min(existing.min.z, minZ);
|
|
40
|
+
existing.max.x = Math.max(existing.max.x, maxX);
|
|
41
|
+
existing.max.y = Math.max(existing.max.y, maxY);
|
|
42
|
+
existing.max.z = Math.max(existing.max.z, maxZ);
|
|
43
|
+
}
|
|
44
|
+
else
|
|
45
|
+
boundingBoxes.set(eid, { min: { x: minX, y: minY, z: minZ }, max: { x: maxX, y: maxY, z: maxZ } });
|
|
46
|
+
return { minX, minY, minZ, maxX, maxY, maxZ };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=scene-instance-bounds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-instance-bounds.js","sourceRoot":"","sources":["../src/scene-instance-bounds.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAI/D,yEAAyE;AACzE,+EAA+E;AAC/E,+EAA+E;AAC/E,gCAAgC;AAChC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AACvC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAIvC,wFAAwF;AACxF,MAAM,UAAU,uBAAuB,CACrC,aAAuC,EAAE,GAAW,EAAE,EAAY,EAAE,SAAiB,EACrF,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,IAAY;IAElF,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5H,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IACnI,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IACpI,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAClJ,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,MAAc,EAAU,EAAE;QAC3D,IAAI,SAAS,GAAG,0BAA0B,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,UAAU;YAAE,OAAO,MAAM,CAAC;QACzF,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,2BAA2B,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACrF,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,GAAG,0BAA0B,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACnF,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7E,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9G,IAAI,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;IAC5G,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACrG,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC;QACjI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChF,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAClJ,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACpJ,CAAC;;QAAM,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1G,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -11,8 +11,11 @@ interface Template {
|
|
|
11
11
|
normals: Float32Array;
|
|
12
12
|
indices: Uint32Array;
|
|
13
13
|
instanceData: ArrayBuffer;
|
|
14
|
+
canonicalAnchors?: Float64Array;
|
|
15
|
+
canonicalMatrixTranslations?: Float32Array;
|
|
14
16
|
}
|
|
15
|
-
/** CPU
|
|
17
|
+
/** CPU expansion retains the canonical f64 occurrence anchor rather than
|
|
18
|
+
* round-tripping a national-grid translation through the V1 f32 matrix. */
|
|
16
19
|
export declare function materializeInstances(expressId: number, occ: readonly Occurrence[], templates: readonly (Template | undefined)[]): MeshData[] | undefined;
|
|
17
20
|
export {};
|
|
18
21
|
//# sourceMappingURL=scene-instance-materialization.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-instance-materialization.d.ts","sourceRoot":"","sources":["../src/scene-instance-materialization.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,UAAU,UAAU;IAAG,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AACpI,UAAU,QAAQ;IAAG,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,YAAY,EAAE,WAAW,CAAA;CAAE;
|
|
1
|
+
{"version":3,"file":"scene-instance-materialization.d.ts","sourceRoot":"","sources":["../src/scene-instance-materialization.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,UAAU,UAAU;IAAG,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AACpI,UAAU,QAAQ;IAAG,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,YAAY,EAAE,WAAW,CAAC;IAAC,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAAC,2BAA2B,CAAC,EAAE,YAAY,CAAA;CAAE;AAEvN;2EAC2E;AAC3E,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,SAAS,CA8DxJ"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
const INSTANCE_STRIDE_BYTES = 120;
|
|
2
|
+
/** CPU expansion retains the canonical f64 occurrence anchor rather than
|
|
3
|
+
* round-tripping a national-grid translation through the V1 f32 matrix. */
|
|
2
4
|
export function materializeInstances(expressId, occ, templates) {
|
|
3
5
|
const out = [];
|
|
4
6
|
for (const o of occ) {
|
|
@@ -10,15 +12,28 @@ export function materializeInstances(expressId, occ, templates) {
|
|
|
10
12
|
const m0 = dv.getFloat32(b + 0, true), m1 = dv.getFloat32(b + 4, true), m2 = dv.getFloat32(b + 8, true);
|
|
11
13
|
const m4 = dv.getFloat32(b + 16, true), m5 = dv.getFloat32(b + 20, true), m6 = dv.getFloat32(b + 24, true);
|
|
12
14
|
const m8 = dv.getFloat32(b + 32, true), m9 = dv.getFloat32(b + 36, true), m10 = dv.getFloat32(b + 40, true);
|
|
13
|
-
const
|
|
15
|
+
const anchorOffset = (b / INSTANCE_STRIDE_BYTES) * 3;
|
|
16
|
+
const raw12 = dv.getFloat32(b + 48, true), raw13 = dv.getFloat32(b + 52, true), raw14 = dv.getFloat32(b + 56, true);
|
|
17
|
+
const anchors = tpl.canonicalAnchors, baseline = tpl.canonicalMatrixTranslations;
|
|
18
|
+
// Model/entity placement mutates the V1 matrix after decode. Do not apply
|
|
19
|
+
// a stale anchor to an edited occurrence; the forthcoming V2 GPU record
|
|
20
|
+
// owns editable f64 anchors. Unedited occurrences retain source precision.
|
|
21
|
+
const canonical = anchors && baseline
|
|
22
|
+
&& raw12 === baseline[anchorOffset] && raw13 === baseline[anchorOffset + 1] && raw14 === baseline[anchorOffset + 2];
|
|
23
|
+
const m12 = canonical ? anchors[anchorOffset] : raw12;
|
|
24
|
+
const m13 = canonical ? anchors[anchorOffset + 1] : raw13;
|
|
25
|
+
const m14 = canonical ? anchors[anchorOffset + 2] : raw14;
|
|
14
26
|
const n = tpl.positions.length;
|
|
15
27
|
const positions = new Float32Array(n);
|
|
16
28
|
const normals = new Float32Array(tpl.normals.length);
|
|
17
29
|
for (let i = 0; i < n; i += 3) {
|
|
18
30
|
const x = tpl.positions[i], y = tpl.positions[i + 1], z = tpl.positions[i + 2];
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
31
|
+
// Keep the transformed template local. Adding the occurrence anchor
|
|
32
|
+
// here would narrow a 5,000-km f64 placement back into Float32 before
|
|
33
|
+
// raycast/snap/section consumers can use it.
|
|
34
|
+
positions[i] = m0 * x + m4 * y + m8 * z;
|
|
35
|
+
positions[i + 1] = m1 * x + m5 * y + m9 * z;
|
|
36
|
+
positions[i + 2] = m2 * x + m6 * y + m10 * z;
|
|
22
37
|
if (i + 2 < tpl.normals.length) {
|
|
23
38
|
// Rotate normals by the upper-3×3 (instancing transforms are rigid +
|
|
24
39
|
// uniform scale, so this is correct up to a renormalize).
|
|
@@ -49,7 +64,7 @@ export function materializeInstances(expressId, occ, templates) {
|
|
|
49
64
|
// decoded template's exact index reference as the canonical source fence,
|
|
50
65
|
// and carry its model-scoped slot onto the materialized occurrence.
|
|
51
66
|
const indices = tpl.indices;
|
|
52
|
-
out.push({ expressId, modelIndex: tpl.modelIndex, positions, normals, indices, color, occurrenceKey, ...item,
|
|
67
|
+
out.push({ expressId, modelIndex: tpl.modelIndex, positions, normals, indices, color, origin: [m12, m13, m14], occurrenceKey, ...item,
|
|
53
68
|
appearanceSource: { kind: 'canonical-item', indices, sourceIndices: indices } });
|
|
54
69
|
}
|
|
55
70
|
return out.length > 0 ? out : undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-instance-materialization.js","sourceRoot":"","sources":["../src/scene-instance-materialization.ts"],"names":[],"mappings":"AAMA,
|
|
1
|
+
{"version":3,"file":"scene-instance-materialization.js","sourceRoot":"","sources":["../src/scene-instance-materialization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface InstanceTranslationTarget {
|
|
2
|
+
instanceData: ArrayBuffer;
|
|
3
|
+
canonicalAnchors?: Float64Array;
|
|
4
|
+
canonicalMatrixTranslations?: Float32Array;
|
|
5
|
+
}
|
|
6
|
+
export interface InstanceTranslationResult {
|
|
7
|
+
translation: Float32Array;
|
|
8
|
+
/** Legacy records retain static split anchors; V2 lanes are submission data. */
|
|
9
|
+
legacyAnchors?: Float32Array;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Apply a world-frame delta without turning V2's camera-relative GPU lanes
|
|
13
|
+
* into a durable source origin. The f64 sidecar remains authoritative for the
|
|
14
|
+
* next RTE submission; only pre-V2 records receive a compatibility anchor.
|
|
15
|
+
*/
|
|
16
|
+
export declare function translateInstanceRecord(target: InstanceTranslationTarget, byteOffset: number, delta: readonly [number, number, number]): InstanceTranslationResult;
|
|
17
|
+
//# sourceMappingURL=scene-instance-translation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-instance-translation.d.ts","sourceRoot":"","sources":["../src/scene-instance-translation.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC,2BAA2B,CAAC,EAAE,YAAY,CAAC;CAC5C;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,YAAY,CAAC;IAC1B,gFAAgF;IAChF,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,yBAAyB,EACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACvC,yBAAyB,CA0C3B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
/** Mutation of one CPU-side instanced occurrence placement. */
|
|
5
|
+
import { INSTANCE_ANCHOR_HIGH_OFFSET, INSTANCE_ANCHOR_LOW_OFFSET, INSTANCE_STRIDE_BYTES, } from './instanced-render.js';
|
|
6
|
+
/**
|
|
7
|
+
* Apply a world-frame delta without turning V2's camera-relative GPU lanes
|
|
8
|
+
* into a durable source origin. The f64 sidecar remains authoritative for the
|
|
9
|
+
* next RTE submission; only pre-V2 records receive a compatibility anchor.
|
|
10
|
+
*/
|
|
11
|
+
export function translateInstanceRecord(target, byteOffset, delta) {
|
|
12
|
+
const dv = new DataView(target.instanceData);
|
|
13
|
+
const translation = new Float32Array([
|
|
14
|
+
dv.getFloat32(byteOffset + 48, true) + delta[0],
|
|
15
|
+
dv.getFloat32(byteOffset + 52, true) + delta[1],
|
|
16
|
+
dv.getFloat32(byteOffset + 56, true) + delta[2],
|
|
17
|
+
]);
|
|
18
|
+
dv.setFloat32(byteOffset + 48, translation[0], true);
|
|
19
|
+
dv.setFloat32(byteOffset + 52, translation[1], true);
|
|
20
|
+
dv.setFloat32(byteOffset + 56, translation[2], true);
|
|
21
|
+
const anchorOffset = (byteOffset / INSTANCE_STRIDE_BYTES) * 3;
|
|
22
|
+
if (target.canonicalAnchors) {
|
|
23
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
24
|
+
target.canonicalAnchors[anchorOffset + axis] += delta[axis];
|
|
25
|
+
// CPU records remain the durable source of truth for bounds, recovery,
|
|
26
|
+
// and materialisation. Only the GPU copy of these lanes is overwritten
|
|
27
|
+
// with a drawable-minus-camera delta at submission time.
|
|
28
|
+
const value = target.canonicalAnchors[anchorOffset + axis];
|
|
29
|
+
const high = Math.fround(value);
|
|
30
|
+
dv.setFloat32(byteOffset + INSTANCE_ANCHOR_HIGH_OFFSET + axis * 4, high, true);
|
|
31
|
+
dv.setFloat32(byteOffset + INSTANCE_ANCHOR_LOW_OFFSET + axis * 4, Math.fround(value - high), true);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (target.canonicalMatrixTranslations) {
|
|
35
|
+
target.canonicalMatrixTranslations.set(translation, anchorOffset);
|
|
36
|
+
}
|
|
37
|
+
if (target.canonicalAnchors)
|
|
38
|
+
return { translation };
|
|
39
|
+
const legacyAnchors = new Float32Array(8);
|
|
40
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
41
|
+
const value = translation[axis];
|
|
42
|
+
const high = Math.fround(value);
|
|
43
|
+
legacyAnchors[axis] = high;
|
|
44
|
+
legacyAnchors[axis + 4] = Math.fround(value - high);
|
|
45
|
+
dv.setFloat32(byteOffset + INSTANCE_ANCHOR_HIGH_OFFSET + axis * 4, high, true);
|
|
46
|
+
dv.setFloat32(byteOffset + INSTANCE_ANCHOR_LOW_OFFSET + axis * 4, legacyAnchors[axis + 4], true);
|
|
47
|
+
}
|
|
48
|
+
return { translation, legacyAnchors };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=scene-instance-translation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-instance-translation.js","sourceRoot":"","sources":["../src/scene-instance-translation.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,8 @@ export interface InstancedTemplateGPU {
|
|
|
9
9
|
indexCount: number;
|
|
10
10
|
instanceBuffer: GPUBuffer;
|
|
11
11
|
instanceCount: number;
|
|
12
|
+
/** Canonical f64 Y-up drawable origins, xyz for each GPU record. */
|
|
13
|
+
canonicalAnchors: Float64Array;
|
|
12
14
|
/** Union of the occurrences' world AABBs (null when no occurrence has a
|
|
13
15
|
* finite box — such templates are never culled). Same tuple layout as
|
|
14
16
|
* BatchedMesh.bounds so the render loop's frustum test is shared. */
|
|
@@ -51,6 +53,10 @@ export interface InstancedTemplateCpu {
|
|
|
51
53
|
normals: Float32Array;
|
|
52
54
|
indices: Uint32Array;
|
|
53
55
|
instanceData: ArrayBuffer;
|
|
56
|
+
/** Canonical f64 occurrence anchors (xyz per record). These are deliberately
|
|
57
|
+
* CPU-side until the V2 GPU instance ABI is enabled. */
|
|
58
|
+
canonicalAnchors: Float64Array;
|
|
59
|
+
canonicalMatrixTranslations: Float32Array;
|
|
54
60
|
localMin: [number, number, number];
|
|
55
61
|
localMax: [number, number, number];
|
|
56
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-instance-types.d.ts","sourceRoot":"","sources":["../src/scene-instance-types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC;;;8CAG0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB;;0EAEsE;IACtE,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;;6DAEyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB;;6DAEyD;IACzD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;0FAC0F;AAC1F,MAAM,WAAW,mBAAmB;IAClC;;mDAE+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD;oFACgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;qFAKqF;AACrF,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,YAAY,EAAE,WAAW,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC"}
|
|
1
|
+
{"version":3,"file":"scene-instance-types.d.ts","sourceRoot":"","sources":["../src/scene-instance-types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC;;;8CAG0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,gBAAgB,EAAE,YAAY,CAAC;IAC/B;;0EAEsE;IACtE,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;;6DAEyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB;;6DAEyD;IACzD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;0FAC0F;AAC1F,MAAM,WAAW,mBAAmB;IAClC;;mDAE+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD;oFACgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;qFAKqF;AACrF,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,YAAY,EAAE,WAAW,CAAC;IAC1B;4DACwD;IACxD,gBAAgB,EAAE,YAAY,CAAC;IAC/B,2BAA2B,EAAE,YAAY,CAAC;IAC1C,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC"}
|
|
@@ -6,6 +6,8 @@ import type { BoundingBox } from './scene-raycaster.js';
|
|
|
6
6
|
type Triple = [number, number, number];
|
|
7
7
|
interface CpuTemplate {
|
|
8
8
|
instanceData: ArrayBuffer;
|
|
9
|
+
canonicalAnchors: Float64Array;
|
|
10
|
+
canonicalMatrixTranslations: Float32Array;
|
|
9
11
|
localMin: Triple;
|
|
10
12
|
localMax: Triple;
|
|
11
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-model-translation.d.ts","sourceRoot":"","sources":["../src/scene-model-translation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,KAAK,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACvC,UAAU,WAAW;
|
|
1
|
+
{"version":3,"file":"scene-model-translation.d.ts","sourceRoot":"","sources":["../src/scene-model-translation.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,7 +61,7 @@ export function placeSceneInstances(scene, modelIndex) {
|
|
|
61
61
|
const gpu = scene.templates[i], cpu = scene.cpu[i];
|
|
62
62
|
if (!gpu || !cpu || gpu.modelIndex !== modelIndex)
|
|
63
63
|
continue;
|
|
64
|
-
if (scene.translations.placeInstances(cpu.instanceData, modelIndex, INSTANCE_STRIDE_BYTES)) {
|
|
64
|
+
if (scene.translations.placeInstances(cpu.instanceData, modelIndex, INSTANCE_STRIDE_BYTES, cpu.canonicalAnchors, cpu.canonicalMatrixTranslations)) {
|
|
65
65
|
scene.device?.queue.writeBuffer(gpu.instanceBuffer, 0, cpu.instanceData);
|
|
66
66
|
}
|
|
67
67
|
gpu.bounds = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-model-translation.js","sourceRoot":"","sources":["../src/scene-model-translation.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"scene-model-translation.js","sourceRoot":"","sources":["../src/scene-model-translation.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,16 @@ export interface ScreenRect {
|
|
|
34
34
|
x1: number;
|
|
35
35
|
y1: number;
|
|
36
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Camera-relative projection inputs. The GPU mesh/pick paths use the same
|
|
39
|
+
* translation-free projection at national-grid coordinates; the released
|
|
40
|
+
* geometry CPU fallback must not multiply a world-f32 matrix by 5,000 km box
|
|
41
|
+
* corners and silently select the wrong element.
|
|
42
|
+
*/
|
|
43
|
+
export interface RectangleRteFrame {
|
|
44
|
+
/** f64 camera origin, subtracted from every AABB corner before projection. */
|
|
45
|
+
cameraWorld: readonly [number, number, number];
|
|
46
|
+
}
|
|
37
47
|
/**
|
|
38
48
|
* Every entity whose bounding box projects onto the given screen rect.
|
|
39
49
|
*
|
|
@@ -47,5 +57,5 @@ export interface ScreenRect {
|
|
|
47
57
|
* @param clip Active section plane / crop box, so selection matches
|
|
48
58
|
* what is visible (same contract as the raycast paths)
|
|
49
59
|
*/
|
|
50
|
-
export declare function selectBoundingBoxesInRect(boundingBoxes: Map<number, BoundingBox>, viewProj: Float32Array, rect: ScreenRect, viewportWidth: number, viewportHeight: number, hiddenIds?: Set<number>, isolatedIds?: Set<number> | null, clip?: PickClipState | null): Set<number>;
|
|
60
|
+
export declare function selectBoundingBoxesInRect(boundingBoxes: Map<number, BoundingBox>, viewProj: Float32Array, rect: ScreenRect, viewportWidth: number, viewportHeight: number, hiddenIds?: Set<number>, isolatedIds?: Set<number> | null, clip?: PickClipState | null, rte?: RectangleRteFrame | null): Set<number>;
|
|
51
61
|
//# sourceMappingURL=scene-rect-select.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-rect-select.d.ts","sourceRoot":"","sources":["../src/scene-rect-select.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAiBhD,kFAAkF;AAClF,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACrC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACvC,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,UAAU,EAChB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAChC,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"scene-rect-select.d.ts","sourceRoot":"","sources":["../src/scene-rect-select.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAiBhD,kFAAkF;AAClF,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAC9B,8EAA8E;IAC9E,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAClD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACrC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACvC,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,UAAU,EAChB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAChC,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,EAC3B,GAAG,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAC/B,GAAG,CAAC,MAAM,CAAC,CA4Ib"}
|
|
@@ -56,7 +56,7 @@ const EDGE_CORNERS = new Uint8Array([
|
|
|
56
56
|
* @param clip Active section plane / crop box, so selection matches
|
|
57
57
|
* what is visible (same contract as the raycast paths)
|
|
58
58
|
*/
|
|
59
|
-
export function selectBoundingBoxesInRect(boundingBoxes, viewProj, rect, viewportWidth, viewportHeight, hiddenIds, isolatedIds, clip) {
|
|
59
|
+
export function selectBoundingBoxesInRect(boundingBoxes, viewProj, rect, viewportWidth, viewportHeight, hiddenIds, isolatedIds, clip, rte) {
|
|
60
60
|
const hits = new Set();
|
|
61
61
|
// A zero-sized canvas would divide the whole scene onto one texel.
|
|
62
62
|
if (!(viewportWidth > 0) || !(viewportHeight > 0))
|
|
@@ -84,9 +84,12 @@ export function selectBoundingBoxesInRect(boundingBoxes, viewProj, rect, viewpor
|
|
|
84
84
|
continue;
|
|
85
85
|
let allInside = true;
|
|
86
86
|
for (let corner = 0; corner < 8; corner++) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
// Keep the subtraction in JS f64. `viewProj` is deliberately the
|
|
88
|
+
// camera-translation-free RTE matrix when `rte` is present, so the
|
|
89
|
+
// following f32 coefficients only ever multiply metre-scale values.
|
|
90
|
+
const x = ((corner & 1) ? bbox.max.x : bbox.min.x) - (rte?.cameraWorld[0] ?? 0);
|
|
91
|
+
const y = ((corner & 2) ? bbox.max.y : bbox.min.y) - (rte?.cameraWorld[1] ?? 0);
|
|
92
|
+
const z = ((corner & 4) ? bbox.max.z : bbox.min.z) - (rte?.cameraWorld[2] ?? 0);
|
|
90
93
|
// Column-major mat4 * vec4, matching what the pick shader does with
|
|
91
94
|
// the same matrix: `uniforms.viewProj * vec4<f32>(position, 1.0)`.
|
|
92
95
|
const cw = m[3] * x + m[7] * y + m[11] * z + m[15];
|