@forgeax/engine-render 0.1.27 → 0.1.29
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/README.md +842 -124
- package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
- package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/dynamic-geometry-host.d.ts +52 -0
- package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -0
- package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
- package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +3 -1
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/gpu-driven-owner.d.ts +10 -0
- package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
- package/dist/assembly/host-contract.d.ts +19 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts +7 -0
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material-shader-policy.d.ts +3 -1
- package/dist/assembly/material-shader-policy.d.ts.map +1 -1
- package/dist/assembly/recovery/failure-location.d.ts +12 -0
- package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
- package/dist/assembly/recovery/renderer-recover.d.ts +6 -4
- package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
- package/dist/assembly/renderer-facade.d.ts.map +1 -1
- package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
- package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
- package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
- package/dist/assembly/renderer-helpers.d.ts +3 -0
- package/dist/assembly/renderer-helpers.d.ts.map +1 -1
- package/dist/assembly/renderer-inspection.d.ts +4 -0
- package/dist/assembly/renderer-inspection.d.ts.map +1 -1
- package/dist/assembly/shader-prewarm-policy.d.ts +6 -0
- package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
- package/dist/assembly/skin-palette-owner.d.ts +8 -0
- package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
- package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
- package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/webgpu-device-loss.d.ts +15 -0
- package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
- package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready.d.ts +7 -3
- package/dist/assembly/webgpu-ready.d.ts.map +1 -1
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
- package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
- package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
- package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
- package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer.d.ts +7 -141
- package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
- package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
- package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
- package/dist/authoring.mjs +3 -3
- package/dist/{chunk-ADHHVYLW.mjs → chunk-33XZFTQU.mjs} +245 -39
- package/dist/chunk-33XZFTQU.mjs.map +1 -0
- package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
- package/dist/chunk-BLXGONR2.mjs.map +1 -0
- package/dist/{chunk-KM2NOX2I.mjs → chunk-BQVQOQJH.mjs} +958 -254
- package/dist/chunk-BQVQOQJH.mjs.map +1 -0
- package/dist/{chunk-HKXTW355.mjs → chunk-BTWH7BP4.mjs} +386 -17
- package/dist/chunk-BTWH7BP4.mjs.map +1 -0
- package/dist/{chunk-TMIASV2N.mjs → chunk-FUODTTIA.mjs} +3934 -676
- package/dist/chunk-FUODTTIA.mjs.map +1 -0
- package/dist/{chunk-FJ6P52EE.mjs → chunk-ILQ5MEZF.mjs} +3 -17
- package/dist/chunk-ILQ5MEZF.mjs.map +1 -0
- package/dist/{chunk-E34VL5VI.mjs → chunk-JQTSEI3Z.mjs} +3 -3
- package/dist/{chunk-E34VL5VI.mjs.map → chunk-JQTSEI3Z.mjs.map} +1 -1
- package/dist/{chunk-GE3SDD72.mjs → chunk-NICXSHAT.mjs} +16 -38
- package/dist/chunk-NICXSHAT.mjs.map +1 -0
- package/dist/{chunk-ZZ4YQ474.mjs → chunk-NRNXBLIJ.mjs} +577 -7
- package/dist/chunk-NRNXBLIJ.mjs.map +1 -0
- package/dist/{chunk-JDWARUOI.mjs → chunk-PA5DRJNI.mjs} +17 -3
- package/dist/chunk-PA5DRJNI.mjs.map +1 -0
- package/dist/{chunk-XDP6XE5V.mjs → chunk-S4DNKQYQ.mjs} +1118 -446
- package/dist/chunk-S4DNKQYQ.mjs.map +1 -0
- package/dist/components/camera.d.ts +62 -2
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/instances.d.ts +6 -20
- package/dist/components/instances.d.ts.map +1 -1
- package/dist/components/scene-instance.d.ts +2 -1
- package/dist/components/scene-instance.d.ts.map +1 -1
- package/dist/components/screen-space-reflection.d.ts +14 -0
- package/dist/components/screen-space-reflection.d.ts.map +1 -0
- package/dist/construct-renderer.mjs +13805 -7186
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +11 -17
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/device/mesh-residency-lifetime.d.ts +21 -0
- package/dist/device/mesh-residency-lifetime.d.ts.map +1 -0
- package/dist/dynamic-geometry.d.ts +125 -0
- package/dist/dynamic-geometry.d.ts.map +1 -0
- package/dist/environment/background.d.ts +6 -0
- package/dist/environment/background.d.ts.map +1 -0
- package/dist/errors/gpu-driven.d.ts +6 -3
- package/dist/errors/gpu-driven.d.ts.map +1 -1
- package/dist/errors/render.d.ts +7 -4
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/camera.d.ts.map +1 -1
- package/dist/extract/gpu-driven.d.ts +33 -3
- package/dist/extract/gpu-driven.d.ts.map +1 -1
- package/dist/features/host.d.ts +23 -1
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/noise-texture.d.ts +17 -0
- package/dist/features/noise-texture.d.ts.map +1 -0
- package/dist/features/plan.d.ts +83 -2
- package/dist/features/plan.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +37 -4
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics-store.d.ts.map +1 -1
- package/dist/features/prepared-graphics.d.ts +5 -0
- package/dist/features/prepared-graphics.d.ts.map +1 -1
- package/dist/features/render-graph-compute.d.ts +5 -3
- package/dist/features/render-graph-compute.d.ts.map +1 -1
- package/dist/features/render-graph-contribution.d.ts +11 -3
- package/dist/features/render-graph-contribution.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +19 -3
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/types.d.ts +11 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +2 -0
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts +34 -1
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/pbr-program.d.ts +10 -0
- package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +144 -23
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/shadow-views.d.ts +126 -0
- package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
- package/dist/gpu-driven/view-gpu.d.ts +18 -2
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-scene-schema.d.ts +2 -8
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +14 -0
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-texture-usage.d.ts +1 -0
- package/dist/gpu-texture-usage.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +6 -0
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/frame-resources.d.ts +8 -0
- package/dist/ibl/frame-resources.d.ts.map +1 -0
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +21 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +8 -7
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +164 -0
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instances-derived-bounds.d.ts +11 -0
- package/dist/instances-derived-bounds.d.ts.map +1 -1
- package/dist/instances.d.ts +89 -44
- package/dist/instances.d.ts.map +1 -1
- package/dist/internal.d.ts +3 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +118 -10
- package/dist/internal.mjs.map +1 -1
- package/dist/lifecycle.d.ts +2 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/material-row.d.ts +5 -0
- package/dist/material-row.d.ts.map +1 -0
- package/dist/materials.d.ts +15 -0
- package/dist/materials.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +21 -5
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
- package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
- package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
- package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
- package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
- package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
- package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
- package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
- package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
- package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
- package/dist/pipeline/standard-output/graph.d.ts +15 -0
- package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
- package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
- package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
- package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
- package/dist/pipeline/standard-output/resources.d.ts +10 -0
- package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
- package/dist/pipeline/standard-output/types.d.ts +39 -0
- package/dist/pipeline/standard-output/types.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts +2 -2
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +2 -1
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec-types.d.ts +4 -0
- package/dist/pipeline-spec-types.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +1 -9
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/points-lines/standard-owner.d.ts +1 -1
- package/dist/points-lines/standard-owner.d.ts.map +1 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
- package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
- package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +3 -3
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +106 -5
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +39 -4
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +7 -8
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +38 -1
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +2 -10
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +12 -2
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +15 -6
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/prepared-material-bindings.d.ts +19 -0
- package/dist/record/prepared-material-bindings.d.ts.map +1 -0
- package/dist/record/recovery-pipeline.d.ts +2 -9
- package/dist/record/recovery-pipeline.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +76 -26
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts +62 -7
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +1 -1
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +35 -7
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +1 -0
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/recovery/render-system-candidate.d.ts +10 -2
- package/dist/recovery/render-system-candidate.d.ts.map +1 -1
- package/dist/recovery/render-system-roots.d.ts +11 -0
- package/dist/recovery/render-system-roots.d.ts.map +1 -0
- package/dist/recovery/types.d.ts +76 -0
- package/dist/recovery/types.d.ts.map +1 -0
- package/dist/reflection/record-owner.d.ts +0 -2
- package/dist/reflection/record-owner.d.ts.map +1 -1
- package/dist/render-contract.d.ts +185 -30
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts +1 -0
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +64 -5
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts +7 -5
- package/dist/render-system-extract-tail.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +101 -41
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system-projections.d.ts +22 -0
- package/dist/render-system-projections.d.ts.map +1 -0
- package/dist/render-system.d.ts +34 -77
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene-types.d.ts +14 -7
- package/dist/scene/render-scene-types.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +29 -11
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/scene/shadow-visibility.d.ts +5 -0
- package/dist/scene/shadow-visibility.d.ts.map +1 -0
- package/dist/ssr/admission.d.ts +70 -1
- package/dist/ssr/admission.d.ts.map +1 -1
- package/dist/ssr/compose.d.ts +13 -0
- package/dist/ssr/compose.d.ts.map +1 -0
- package/dist/ssr/errors.d.ts +35 -0
- package/dist/ssr/errors.d.ts.map +1 -1
- package/dist/ssr/graph.d.ts +60 -0
- package/dist/ssr/graph.d.ts.map +1 -0
- package/dist/ssr/history.d.ts +97 -0
- package/dist/ssr/history.d.ts.map +1 -0
- package/dist/ssr/hiz.d.ts +37 -0
- package/dist/ssr/hiz.d.ts.map +1 -0
- package/dist/ssr/inspection.d.ts +42 -0
- package/dist/ssr/inspection.d.ts.map +1 -0
- package/dist/ssr/resources.d.ts +58 -0
- package/dist/ssr/resources.d.ts.map +1 -0
- package/dist/ssr/temporal.d.ts +38 -0
- package/dist/ssr/temporal.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts +32 -10
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
- package/dist/systems/skin-palette-types.d.ts +15 -0
- package/dist/systems/skin-palette-types.d.ts.map +1 -1
- package/dist/systems/transparent-dispatch.d.ts +9 -0
- package/dist/systems/transparent-dispatch.d.ts.map +1 -0
- package/dist/targets/material-source.d.ts +7 -0
- package/dist/targets/material-source.d.ts.map +1 -1
- package/dist/temporal/frame-coordinator.d.ts +7 -0
- package/dist/temporal/frame-coordinator.d.ts.map +1 -1
- package/dist/temporal/gpu.d.ts +8 -0
- package/dist/temporal/gpu.d.ts.map +1 -1
- package/dist/temporal/history.d.ts.map +1 -1
- package/dist/temporal/index.mjs +6 -6
- package/dist/temporal/inspection.d.ts.map +1 -1
- package/dist/temporal/standard-scene-data.d.ts +2 -1
- package/dist/temporal/standard-scene-data.d.ts.map +1 -1
- package/dist/temporal/temporal-view.d.ts +2 -0
- package/dist/temporal/temporal-view.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +35 -1
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-passes.d.ts +3 -1
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/temporal.d.ts +6 -0
- package/dist/volume/temporal.d.ts.map +1 -1
- package/package.json +21 -20
- package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
- package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
- package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
- package/src/__tests__/auto-exposure.browser.test.ts +33 -0
- package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
- package/src/__tests__/detached-inspection.integration.test.ts +5 -0
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
- package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
- package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
- package/src/__tests__/dynamic-geometry-host.unit.test.ts +1123 -0
- package/src/__tests__/dynamic-geometry.unit.test.ts +233 -0
- package/src/__tests__/factory-contract.integration.test.ts +73 -22
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
- package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
- package/src/__tests__/feature-noise.unit.test.ts +38 -0
- package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
- package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
- package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
- package/src/__tests__/frame-targets.unit.test.ts +24 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
- package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +287 -6
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
- package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
- package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +264 -0
- package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +349 -0
- package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1417 -0
- package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
- package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
- package/src/__tests__/gpu-driven-production.integration.test.ts +1075 -93
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
- package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
- package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
- package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
- package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
- package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
- package/src/__tests__/gpu-driven-view.unit.test.ts +159 -52
- package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -1
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
- package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
- package/src/__tests__/gpu-scene.unit.test.ts +559 -33
- package/src/__tests__/instances-culling.integration.test.ts +36 -10
- package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
- package/src/__tests__/instances-store.unit.test.ts +242 -39
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
- package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
- package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
- package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
- package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
- package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
- package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
- package/src/__tests__/material-texture-source.unit.test.ts +87 -0
- package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
- package/src/__tests__/materials-standard-contract.unit.test.ts +52 -2
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
- package/src/__tests__/mesh-submission-lifetime.unit.test.ts +53 -0
- package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
- package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
- package/src/__tests__/physical-clearcoat.integration.test.ts +37 -3
- package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
- package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
- package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
- package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +35 -4
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
- package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
- package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
- package/src/__tests__/public-surface.test-d.ts +3 -0
- package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
- package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +104 -0
- package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +2 -1
- package/src/__tests__/render-error-code-owner.test-d.ts +4 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +22 -0
- package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
- package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
- package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
- package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
- package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
- package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
- package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +914 -23
- package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
- package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
- package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
- package/src/__tests__/render-target-material-source.test-d.ts +27 -3
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +61 -1
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
- package/src/__tests__/shader-manifest-fixture.ts +39 -0
- package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
- package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
- package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +118 -14
- package/src/__tests__/specular-environment-scale.dawn.test.ts +156 -0
- package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
- package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
- package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
- package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
- package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +91 -0
- package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +112 -0
- package/src/__tests__/ssr-gpu-dispatch.ts +946 -0
- package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
- package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
- package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
- package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
- package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
- package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
- package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
- package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
- package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
- package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
- package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
- package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
- package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
- package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
- package/src/__tests__/ssr-reprojection-probe.ts +90 -0
- package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
- package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
- package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
- package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
- package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
- package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
- package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +44 -12
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
- package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
- package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
- package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
- package/src/__tests__/standard-output.browser.test.ts +15 -0
- package/src/__tests__/standard-output.dawn.test.ts +15 -0
- package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +38 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
- package/src/__tests__/standard-profile-oracle.unit.test.ts +22 -0
- package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
- package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
- package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
- package/src/__tests__/taa-coverage-edge.dawn.test.ts +193 -0
- package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
- package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +778 -0
- package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
- package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
- package/src/__tests__/taa-stability-feedback.ts +341 -0
- package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
- package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
- package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
- package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
- package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
- package/src/__tests__/visibility-extract.perf.test.ts +20 -8
- package/src/__tests__/visibility-instances.integration.test.ts +19 -7
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
- package/src/assembly/atmosphere-shader-prewarm.ts +38 -0
- package/src/assembly/dynamic-geometry-host.ts +887 -0
- package/src/assembly/dynamic-geometry-runtime.ts +71 -0
- package/src/assembly/factory.ts +4 -0
- package/src/assembly/gpu-driven-owner.ts +29 -0
- package/src/assembly/host-contract.ts +36 -0
- package/src/assembly/material/assembly.ts +38 -0
- package/src/assembly/material-shader-policy.ts +71 -28
- package/src/assembly/recovery/failure-location.ts +62 -0
- package/src/assembly/recovery/renderer-recover.ts +19 -17
- package/src/assembly/renderer-facade.ts +29 -0
- package/src/assembly/renderer-feature-inspection.ts +13 -0
- package/src/assembly/renderer-frame-transaction.ts +63 -0
- package/src/assembly/renderer-helpers.ts +26 -0
- package/src/assembly/renderer-inspection.ts +6 -0
- package/src/assembly/shader-prewarm-policy.ts +32 -0
- package/src/assembly/skin-palette-owner.ts +21 -0
- package/src/assembly/ssr-shader-prewarm.ts +41 -0
- package/src/assembly/webgpu-device-loss.ts +75 -0
- package/src/assembly/webgpu-pbr-ready.ts +232 -0
- package/src/assembly/webgpu-ready-mipmap.ts +26 -0
- package/src/assembly/webgpu-ready.ts +142 -121
- package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
- package/src/assembly/webgpu-renderer-contract.ts +69 -0
- package/src/assembly/webgpu-renderer-guards.ts +32 -0
- package/src/assembly/webgpu-renderer-observation.ts +43 -0
- package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
- package/src/assembly/webgpu-renderer.ts +675 -614
- package/src/assembly/webgpu-vertex-layouts.ts +233 -87
- package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
- package/src/components/camera.ts +287 -7
- package/src/components/index.ts +1 -0
- package/src/components/instances.ts +45 -18
- package/src/components/scene-instance.ts +2 -1
- package/src/components/screen-space-reflection.ts +21 -0
- package/src/components/sprite-animation.ts +3 -3
- package/src/components/sprite-instances.ts +1 -1
- package/src/device/gpu-residency.ts +96 -93
- package/src/device/mesh-residency-lifetime.ts +73 -0
- package/src/dynamic-geometry.ts +736 -0
- package/src/environment/background.ts +263 -0
- package/src/errors/gpu-driven.ts +39 -5
- package/src/errors/render.ts +27 -3
- package/src/extract/camera.ts +26 -1
- package/src/extract/gpu-driven.ts +185 -10
- package/src/features/host.ts +237 -19
- package/src/features/noise-texture.ts +91 -0
- package/src/features/plan.ts +553 -24
- package/src/features/prepared-gpu-work.ts +631 -49
- package/src/features/prepared-graphics-store.ts +31 -0
- package/src/features/prepared-graphics.ts +5 -0
- package/src/features/render-graph-compute.ts +41 -8
- package/src/features/render-graph-contribution.ts +141 -3
- package/src/features/render-graph-raster.ts +143 -30
- package/src/features/types.ts +11 -0
- package/src/fullscreen-post-process-pass.ts +3 -0
- package/src/gpu-driven/batch-topology.ts +424 -102
- package/src/gpu-driven/pbr-program.ts +31 -0
- package/src/gpu-driven/prepared-draw.ts +29 -4
- package/src/gpu-driven/production-raster.ts +2267 -694
- package/src/gpu-driven/shadow-views.ts +539 -0
- package/src/gpu-driven/view-gpu.ts +188 -41
- package/src/gpu-scene-schema.ts +52 -11
- package/src/gpu-scene.ts +186 -99
- package/src/gpu-texture-usage.ts +1 -0
- package/src/hdrp-buffers.ts +72 -36
- package/src/ibl/frame-resources.ts +38 -0
- package/src/ibl/skylight-bind-group.ts +5 -4
- package/src/index.ts +125 -1
- package/src/inspection-types.ts +191 -0
- package/src/instances-derived-bounds.ts +258 -34
- package/src/instances.ts +459 -150
- package/src/internal.ts +22 -0
- package/src/lifecycle.ts +2 -0
- package/src/material-row.ts +145 -0
- package/src/materials.ts +44 -8
- package/src/pbr-pipeline.ts +159 -17
- package/src/pipeline/standard-forward-lane.ts +52 -24
- package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
- package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
- package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
- package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
- package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
- package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
- package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
- package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
- package/src/pipeline/standard-output/color-transform.ts +124 -0
- package/src/pipeline/standard-output/graph.ts +139 -0
- package/src/pipeline/standard-output/lut-admission.ts +121 -0
- package/src/pipeline/standard-output/lut-gpu.ts +399 -0
- package/src/pipeline/standard-output/lut-state.ts +176 -0
- package/src/pipeline/standard-output/resources.ts +121 -0
- package/src/pipeline/standard-output/types.ts +58 -0
- package/src/pipeline/standard-pipeline.ts +192 -59
- package/src/pipeline/standard-post.ts +186 -27
- package/src/pipeline-builder.ts +16 -6
- package/src/pipeline-spec-types.ts +4 -0
- package/src/pipeline-spec.ts +37 -29
- package/src/points-lines/standard-owner.ts +6 -14
- package/src/prepare/prepared-graphics-resolver.ts +9 -2
- package/src/record/__tests__/material-slot-plan.unit.test.ts +48 -0
- package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
- package/src/record/__tests__/recovery-pipeline.unit.test.ts +2 -29
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +36 -5
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
- package/src/record/dynamic-geometry-consumption.ts +59 -0
- package/src/record/frame-lighting.ts +12 -11
- package/src/record/frame-snapshot.ts +133 -23
- package/src/record/frame-targets.ts +9 -0
- package/src/record/frame.ts +727 -133
- package/src/record/main-pass-geometry.ts +162 -98
- package/src/record/main-pass-material.ts +115 -26
- package/src/record/main-pass-sprite-draws.ts +18 -107
- package/src/record/main-pass.ts +78 -8
- package/src/record/material-uniforms.ts +1 -1
- package/src/record/mesh-ssbo.ts +59 -15
- package/src/record/prepared-material-bindings.ts +234 -0
- package/src/record/recovery-pipeline.ts +59 -136
- package/src/record/render-context.ts +92 -22
- package/src/record/shadow-pass.ts +1231 -209
- package/src/record/skybox-post-pass.ts +14 -3
- package/src/record/typed-frame-graph.ts +1006 -53
- package/src/record/view-ubo.ts +11 -0
- package/src/recovery/render-system-candidate.ts +90 -66
- package/src/recovery/render-system-roots.ts +113 -0
- package/src/recovery/types.ts +77 -0
- package/src/reflection/record-owner.ts +26 -54
- package/src/render-contract.ts +219 -25
- package/src/render-graph-primitives.ts +6 -2
- package/src/render-pipeline.ts +70 -1
- package/src/render-system-extract-tail.ts +409 -160
- package/src/render-system-extract.ts +376 -102
- package/src/render-system-projections.ts +241 -0
- package/src/render-system.ts +692 -791
- package/src/scene/render-scene-types.ts +13 -4
- package/src/scene/render-scene.ts +569 -355
- package/src/scene/shadow-visibility.ts +21 -0
- package/src/ssr/admission.ts +380 -14
- package/src/ssr/compose.ts +144 -0
- package/src/ssr/errors.ts +48 -0
- package/src/ssr/graph.ts +777 -0
- package/src/ssr/history.ts +436 -0
- package/src/ssr/hiz.ts +124 -0
- package/src/ssr/inspection.ts +124 -0
- package/src/ssr/resources.ts +202 -0
- package/src/ssr/temporal.ts +164 -0
- package/src/systems/skin-palette-allocator.ts +495 -148
- package/src/systems/skin-palette-types.ts +17 -0
- package/src/systems/transparent-dispatch.ts +90 -0
- package/src/targets/material-source.ts +34 -0
- package/src/temporal/coverage.ts +1 -1
- package/src/temporal/frame-coordinator.ts +23 -2
- package/src/temporal/gpu.ts +74 -12
- package/src/temporal/history.ts +3 -1
- package/src/temporal/inspection.ts +2 -1
- package/src/temporal/standard-scene-data.ts +3 -1
- package/src/temporal/temporal-view.ts +3 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +204 -139
- package/src/typed-render-graph-primitives.ts +266 -74
- package/src/typed-shadow-passes.ts +122 -12
- package/src/volume/temporal.ts +10 -0
- package/dist/chunk-ADHHVYLW.mjs.map +0 -1
- package/dist/chunk-FJ6P52EE.mjs.map +0 -1
- package/dist/chunk-GE3SDD72.mjs.map +0 -1
- package/dist/chunk-GF523LHF.mjs.map +0 -1
- package/dist/chunk-HKXTW355.mjs.map +0 -1
- package/dist/chunk-JDWARUOI.mjs.map +0 -1
- package/dist/chunk-KM2NOX2I.mjs.map +0 -1
- package/dist/chunk-TMIASV2N.mjs.map +0 -1
- package/dist/chunk-XDP6XE5V.mjs.map +0 -1
- package/dist/chunk-ZZ4YQ474.mjs.map +0 -1
- package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
- package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { PointsLinesBudgetExceededError, PointsLinesStyleUnsupportedError, PointsLinesMaterialUnsupportedError, PointsLinesInvalidStyleError, PointsLinesTopologyMismatchError } from './chunk-
|
|
1
|
+
import { PointShapeValue, pointShapeFromU32 } from './chunk-33XZFTQU.mjs';
|
|
2
|
+
import { PointsLinesBudgetExceededError, createVisibilityBudget, PointsLinesStyleUnsupportedError, PointsLinesMaterialUnsupportedError, PointsLinesInvalidStyleError, PointsLinesTopologyMismatchError } from './chunk-NRNXBLIJ.mjs';
|
|
3
3
|
import { err, ok } from '@forgeax/engine-types';
|
|
4
|
-
import { mat4 } from '@forgeax/engine-math';
|
|
5
4
|
import { validateR32FloatReceipt } from '@forgeax/engine-rhi';
|
|
6
5
|
|
|
7
6
|
function invalidStyle(input, component, field, value, expected) {
|
|
@@ -163,6 +162,458 @@ function inspectPointShadow(snapshots, shadowAtlasCapacity) {
|
|
|
163
162
|
shadowAtlasCapacity
|
|
164
163
|
});
|
|
165
164
|
}
|
|
165
|
+
var SSR_FORMAT_PROFILE = "r32float-mip-sampled-storage";
|
|
166
|
+
var SSR_FORMAT_STAGES = Object.freeze([
|
|
167
|
+
"texture-create",
|
|
168
|
+
"mip-view",
|
|
169
|
+
"sampled-storage-bind-group",
|
|
170
|
+
"pipeline-bind",
|
|
171
|
+
"finish",
|
|
172
|
+
"submit",
|
|
173
|
+
"completion",
|
|
174
|
+
"readback"
|
|
175
|
+
]);
|
|
176
|
+
var ZERO_WORK = Object.freeze({
|
|
177
|
+
attachmentCount: 0,
|
|
178
|
+
passCount: 0,
|
|
179
|
+
bindingCount: 0,
|
|
180
|
+
resourceCount: 0,
|
|
181
|
+
historyCount: 0,
|
|
182
|
+
temporalDemand: 0
|
|
183
|
+
});
|
|
184
|
+
var ADMITTED_WORK = Object.freeze({
|
|
185
|
+
attachmentCount: 1,
|
|
186
|
+
passCount: 1,
|
|
187
|
+
bindingCount: 1,
|
|
188
|
+
resourceCount: 1,
|
|
189
|
+
historyCount: 0,
|
|
190
|
+
temporalDemand: 0
|
|
191
|
+
});
|
|
192
|
+
var ZERO_BUDGET = Object.freeze({
|
|
193
|
+
probeExecutions: 0,
|
|
194
|
+
resetCount: 0,
|
|
195
|
+
rebuildCount: 0
|
|
196
|
+
});
|
|
197
|
+
var ADMITTED_BUDGET = Object.freeze({
|
|
198
|
+
probeExecutions: 1,
|
|
199
|
+
resetCount: 0,
|
|
200
|
+
rebuildCount: 0
|
|
201
|
+
});
|
|
202
|
+
function identityFieldMismatch(expected, actual) {
|
|
203
|
+
for (const field of ["sourceHead", "sourceTree", "lockSha256", "buildSha256"]) {
|
|
204
|
+
if (expected[field] !== actual[field]) return field;
|
|
205
|
+
}
|
|
206
|
+
return void 0;
|
|
207
|
+
}
|
|
208
|
+
function blocked(identity, failure2, generation = 0) {
|
|
209
|
+
return Object.freeze({
|
|
210
|
+
status: "fallback-only",
|
|
211
|
+
identity,
|
|
212
|
+
generation,
|
|
213
|
+
work: ZERO_WORK,
|
|
214
|
+
budget: ZERO_BUDGET,
|
|
215
|
+
failure: failure2
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
function failure(code, owner, hint, detail = {}) {
|
|
219
|
+
const action = recoveryActionFor(code);
|
|
220
|
+
return Object.freeze({
|
|
221
|
+
code,
|
|
222
|
+
expected: "all producer, format, and temporal receipts share one admitted identity",
|
|
223
|
+
hint,
|
|
224
|
+
detail: Object.freeze({ owner, action, ...detail })
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
function recoveryActionFor(code) {
|
|
228
|
+
switch (code) {
|
|
229
|
+
case "ssr-reflection-fallback-unavailable":
|
|
230
|
+
case "ssr-receipt-identity-mismatch":
|
|
231
|
+
return "rebuild";
|
|
232
|
+
case "ssr-not-requested":
|
|
233
|
+
case "ssr-format-unavailable":
|
|
234
|
+
case "ssr-temporal-unavailable":
|
|
235
|
+
case "ssr-receipt-stale":
|
|
236
|
+
return "retry";
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function receiptFailure(input, receipt, owner) {
|
|
240
|
+
const field = identityFieldMismatch(input.identity, receipt.identity);
|
|
241
|
+
if (field === void 0) return void 0;
|
|
242
|
+
return blocked(
|
|
243
|
+
input.identity,
|
|
244
|
+
failure("ssr-receipt-identity-mismatch", owner, "rebuild the owner receipt for this identity", {
|
|
245
|
+
identityField: field
|
|
246
|
+
})
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
function validFallback(receipt) {
|
|
250
|
+
return receipt !== void 0 && receipt.candidateVisible === false && Number.isFinite(receipt.coverage) && receipt.coverage >= 0 && receipt.coverage <= 1 && (receipt.sourceKey === void 0 || receipt.sourceKey.length > 0) && (receipt.extent === void 0 || receipt.extent.length === 3 && receipt.extent.every((value) => Number.isFinite(value) && value > 0)) && Number.isInteger(receipt.sourceGeneration) && receipt.sourceGeneration >= 0 && Number.isInteger(receipt.projectionGeneration) && receipt.projectionGeneration >= 0 && Number.isInteger(receipt.deviceGeneration) && receipt.deviceGeneration >= 0 && receipt.brdfSignature === "standard-pbr-ibl-v1" && (receipt.source === "probe" && (receipt.state === "active" || receipt.state === "lkg") || receipt.source === "skylight" && (receipt.state === "active" || receipt.state === "lkg") || receipt.source === "neutral" && receipt.state === "neutral");
|
|
251
|
+
}
|
|
252
|
+
function validFormat(receipt) {
|
|
253
|
+
if (receipt?.profile !== SSR_FORMAT_PROFILE || receipt.verdict !== "admitted" || receipt.evidence !== "real" || !Number.isInteger(receipt.deviceGeneration) || receipt.deviceGeneration < 0) {
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
if (!SSR_FORMAT_STAGES.every(
|
|
257
|
+
(stage) => receipt.stages.some((entry) => entry.stage === stage && entry.verdict === "admitted")
|
|
258
|
+
)) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
return validateR32FloatReceipt(receipt).ok;
|
|
262
|
+
}
|
|
263
|
+
function validTemporal(receipt) {
|
|
264
|
+
return receipt?.successfulSubmit === true && Number.isInteger(receipt.generation) && receipt.generation >= 0;
|
|
265
|
+
}
|
|
266
|
+
function admitSsrM0(input) {
|
|
267
|
+
if (!input.requested) {
|
|
268
|
+
return blocked(
|
|
269
|
+
input.identity,
|
|
270
|
+
failure("ssr-not-requested", "consumer", "request SSR before evaluating M0 admission")
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
if (input.reflectionFallback === void 0) {
|
|
274
|
+
return blocked(
|
|
275
|
+
input.identity,
|
|
276
|
+
failure("ssr-reflection-fallback-unavailable", "producer", "use LKG, Skylight, or neutral")
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
const fallbackIdentityFailure = receiptFailure(input, input.reflectionFallback, "producer");
|
|
280
|
+
if (fallbackIdentityFailure !== void 0) return fallbackIdentityFailure;
|
|
281
|
+
if (!validFallback(input.reflectionFallback)) {
|
|
282
|
+
return blocked(
|
|
283
|
+
input.identity,
|
|
284
|
+
failure(
|
|
285
|
+
"ssr-reflection-fallback-unavailable",
|
|
286
|
+
"producer",
|
|
287
|
+
"inspect and rebuild the producer receipt"
|
|
288
|
+
),
|
|
289
|
+
input.reflectionFallback.projectionGeneration
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
if (input.format === void 0) {
|
|
293
|
+
return blocked(
|
|
294
|
+
input.identity,
|
|
295
|
+
failure("ssr-format-unavailable", "format", "probe the exact format profile for this device"),
|
|
296
|
+
input.reflectionFallback.projectionGeneration
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
const formatIdentityFailure = receiptFailure(input, input.format, "format");
|
|
300
|
+
if (formatIdentityFailure !== void 0) return formatIdentityFailure;
|
|
301
|
+
if (!validFormat(input.format)) {
|
|
302
|
+
return blocked(
|
|
303
|
+
input.identity,
|
|
304
|
+
failure("ssr-format-unavailable", "format", "complete the full r32float profile probe"),
|
|
305
|
+
input.reflectionFallback.projectionGeneration
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
const temporalIdentityFailure = input.temporal === void 0 ? void 0 : receiptFailure(input, input.temporal, "temporal");
|
|
309
|
+
if (temporalIdentityFailure !== void 0) return temporalIdentityFailure;
|
|
310
|
+
if (input.temporal !== void 0 && !validTemporal(input.temporal)) {
|
|
311
|
+
return blocked(
|
|
312
|
+
input.identity,
|
|
313
|
+
failure("ssr-temporal-unavailable", "temporal", "inspect and rebuild the temporal receipt"),
|
|
314
|
+
input.reflectionFallback.projectionGeneration
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
if (input.previousGeneration !== void 0 && input.previousGeneration !== input.reflectionFallback.projectionGeneration) {
|
|
318
|
+
return blocked(
|
|
319
|
+
input.identity,
|
|
320
|
+
failure(
|
|
321
|
+
"ssr-receipt-stale",
|
|
322
|
+
"consumer",
|
|
323
|
+
"discard stale completion and reinspect the owners",
|
|
324
|
+
{
|
|
325
|
+
generation: input.reflectionFallback.projectionGeneration
|
|
326
|
+
}
|
|
327
|
+
),
|
|
328
|
+
input.reflectionFallback.projectionGeneration
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
return Object.freeze({
|
|
332
|
+
status: "admitted",
|
|
333
|
+
identity: input.identity,
|
|
334
|
+
generation: input.reflectionFallback.projectionGeneration,
|
|
335
|
+
work: ADMITTED_WORK,
|
|
336
|
+
budget: ADMITTED_BUDGET
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
function projectSsrDependencies(input) {
|
|
340
|
+
const identity = input.identity;
|
|
341
|
+
const reflectionFallback = identity === void 0 || input.reflectionFallback?.identity === void 0 ? void 0 : input.reflectionFallback;
|
|
342
|
+
const format = identity === void 0 || input.format === void 0 ? void 0 : { ...input.format, identity };
|
|
343
|
+
const temporal = identity === void 0 || input.temporal === void 0 ? void 0 : { identity, ...input.temporal };
|
|
344
|
+
const admission = identity === void 0 ? blocked(
|
|
345
|
+
void 0,
|
|
346
|
+
failure(
|
|
347
|
+
input.requested ? "ssr-receipt-identity-mismatch" : "ssr-not-requested",
|
|
348
|
+
"consumer",
|
|
349
|
+
input.requested ? "bind the exact source, tree, lock, and build identity before admission" : "request SSR before evaluating M0 admission",
|
|
350
|
+
input.requested ? { identityField: "sourceHead" } : {}
|
|
351
|
+
)
|
|
352
|
+
) : admitSsrM0({
|
|
353
|
+
requested: input.requested,
|
|
354
|
+
identity,
|
|
355
|
+
...reflectionFallback === void 0 ? {} : { reflectionFallback },
|
|
356
|
+
...format === void 0 ? {} : { format },
|
|
357
|
+
...temporal === void 0 ? {} : { temporal },
|
|
358
|
+
...input.previousGeneration === void 0 ? {} : { previousGeneration: input.previousGeneration }
|
|
359
|
+
});
|
|
360
|
+
return Object.freeze({
|
|
361
|
+
status: admission.status,
|
|
362
|
+
identity,
|
|
363
|
+
requested: input.requested,
|
|
364
|
+
reflectionFallback: input.reflectionFallback,
|
|
365
|
+
format,
|
|
366
|
+
temporal,
|
|
367
|
+
admission,
|
|
368
|
+
work: admission.work,
|
|
369
|
+
budget: admission.budget,
|
|
370
|
+
failure: admission.failure
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
function zeroSsrAdmissionWork() {
|
|
374
|
+
return ZERO_WORK;
|
|
375
|
+
}
|
|
376
|
+
function resolveSsrAdmissionGeneration(previousGeneration, nextGeneration) {
|
|
377
|
+
return {
|
|
378
|
+
changed: previousGeneration !== void 0 && nextGeneration !== void 0 && previousGeneration !== nextGeneration,
|
|
379
|
+
generation: nextGeneration
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
var ZERO_SPATIAL_WORK = Object.freeze({
|
|
383
|
+
attachmentCount: 0,
|
|
384
|
+
passCount: 0,
|
|
385
|
+
bindingCount: 0,
|
|
386
|
+
resourceCount: 0,
|
|
387
|
+
historyCount: 0,
|
|
388
|
+
temporalDemand: 0
|
|
389
|
+
});
|
|
390
|
+
var ADMITTED_SPATIAL_WORK = Object.freeze({
|
|
391
|
+
attachmentCount: 3,
|
|
392
|
+
passCount: 4,
|
|
393
|
+
bindingCount: 4,
|
|
394
|
+
resourceCount: 3,
|
|
395
|
+
historyCount: 0,
|
|
396
|
+
temporalDemand: 0
|
|
397
|
+
});
|
|
398
|
+
function configRange(field, viewRange, maxDistance) {
|
|
399
|
+
switch (field) {
|
|
400
|
+
case "maxDistance":
|
|
401
|
+
return { min: 0, minInclusive: false, max: viewRange, maxInclusive: true };
|
|
402
|
+
case "thickness":
|
|
403
|
+
return { min: 0, minInclusive: false, max: maxDistance, maxInclusive: true };
|
|
404
|
+
case "maxRoughness":
|
|
405
|
+
return { min: 0, minInclusive: true, max: 1, maxInclusive: true };
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
function configError(field, value, range) {
|
|
409
|
+
const left = range.minInclusive ? "[" : "(";
|
|
410
|
+
const right = range.maxInclusive ? "]" : ")";
|
|
411
|
+
return Object.freeze({
|
|
412
|
+
code: "ssr-config-invalid",
|
|
413
|
+
expected: `finite ${field} in ${left}${range.min}, ${range.max}${right}`,
|
|
414
|
+
hint: `set ${field} to a finite value inside the reported range before retrying`,
|
|
415
|
+
detail: Object.freeze({ field, value, range: Object.freeze(range) })
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
function validateScreenSpaceReflection(config, input) {
|
|
419
|
+
const viewRange = input.viewRange;
|
|
420
|
+
if (!Number.isFinite(viewRange) || viewRange <= 0) {
|
|
421
|
+
return err(
|
|
422
|
+
configError("maxDistance", config.maxDistance, configRange("maxDistance", viewRange, 0))
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
if (!Number.isFinite(config.maxDistance) || config.maxDistance <= 0 || config.maxDistance > viewRange) {
|
|
426
|
+
return err(
|
|
427
|
+
configError(
|
|
428
|
+
"maxDistance",
|
|
429
|
+
config.maxDistance,
|
|
430
|
+
configRange("maxDistance", viewRange, config.maxDistance)
|
|
431
|
+
)
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
if (!Number.isFinite(config.thickness) || config.thickness <= 0 || config.thickness > config.maxDistance) {
|
|
435
|
+
return err(
|
|
436
|
+
configError(
|
|
437
|
+
"thickness",
|
|
438
|
+
config.thickness,
|
|
439
|
+
configRange("thickness", viewRange, config.maxDistance)
|
|
440
|
+
)
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
if (!Number.isFinite(config.maxRoughness) || config.maxRoughness < 0 || config.maxRoughness > 1) {
|
|
444
|
+
return err(
|
|
445
|
+
configError(
|
|
446
|
+
"maxRoughness",
|
|
447
|
+
config.maxRoughness,
|
|
448
|
+
configRange("maxRoughness", viewRange, config.maxDistance)
|
|
449
|
+
)
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
return ok(
|
|
453
|
+
Object.freeze({
|
|
454
|
+
maxDistance: config.maxDistance,
|
|
455
|
+
thickness: config.thickness,
|
|
456
|
+
maxRoughness: config.maxRoughness
|
|
457
|
+
})
|
|
458
|
+
);
|
|
459
|
+
}
|
|
460
|
+
function unavailable(lane, reason, required, actual) {
|
|
461
|
+
const recovery = reason === "lane-unsupported" || reason === "projection-unsupported" ? "select a perspective clustered or deferred Standard lane" : reason === "reflection-fallback-unavailable" ? "repair the submitted reflection fallback owner receipt" : reason === "temporal-unavailable" ? "submit the matching temporal-v1 producer receipt" : reason === "recovery-unavailable" ? "complete device and producer recovery before retrying" : "restore the required scene, capability, or format input before retrying";
|
|
462
|
+
return Object.freeze({
|
|
463
|
+
code: "ssr-unavailable",
|
|
464
|
+
expected: "SSR spatial admission has a complete Standard input and capability set",
|
|
465
|
+
hint: recovery,
|
|
466
|
+
detail: Object.freeze({
|
|
467
|
+
lane,
|
|
468
|
+
reason,
|
|
469
|
+
required: Object.freeze([...required]),
|
|
470
|
+
actual: Object.freeze({ ...actual }),
|
|
471
|
+
recovery
|
|
472
|
+
})
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
function unavailableResult(lane, viewRange, failure2) {
|
|
476
|
+
return Object.freeze({
|
|
477
|
+
status: "fallback-only",
|
|
478
|
+
lane,
|
|
479
|
+
config: void 0,
|
|
480
|
+
viewRange,
|
|
481
|
+
work: ZERO_SPATIAL_WORK,
|
|
482
|
+
failure: failure2
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
function admitSsrSpatial(input) {
|
|
486
|
+
const camera = input.camera;
|
|
487
|
+
const environment = input.environment;
|
|
488
|
+
const viewRange = camera.far - camera.near;
|
|
489
|
+
const config = camera.screenSpaceReflection;
|
|
490
|
+
if (config === void 0) {
|
|
491
|
+
return Object.freeze({
|
|
492
|
+
status: "not-requested",
|
|
493
|
+
lane: environment.lane,
|
|
494
|
+
config: void 0,
|
|
495
|
+
viewRange,
|
|
496
|
+
work: ZERO_SPATIAL_WORK
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
const valid = validateScreenSpaceReflection(config, { viewRange });
|
|
500
|
+
if (!valid.ok) {
|
|
501
|
+
return Object.freeze({
|
|
502
|
+
status: "fallback-only",
|
|
503
|
+
lane: environment.lane,
|
|
504
|
+
config,
|
|
505
|
+
viewRange,
|
|
506
|
+
work: ZERO_SPATIAL_WORK,
|
|
507
|
+
failure: valid.error
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
if (environment.m0.status !== "admitted") {
|
|
511
|
+
return unavailableResult(
|
|
512
|
+
environment.lane,
|
|
513
|
+
viewRange,
|
|
514
|
+
unavailable(
|
|
515
|
+
environment.lane,
|
|
516
|
+
"reflection-fallback-unavailable",
|
|
517
|
+
["admitted M0 dependency receipt"],
|
|
518
|
+
{ m0: false }
|
|
519
|
+
)
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
if (environment.lane !== "clustered" && environment.lane !== "deferred") {
|
|
523
|
+
return unavailableResult(
|
|
524
|
+
environment.lane,
|
|
525
|
+
viewRange,
|
|
526
|
+
unavailable(environment.lane, "lane-unsupported", ["clustered or deferred Standard lane"], {
|
|
527
|
+
lane: environment.lane
|
|
528
|
+
})
|
|
529
|
+
);
|
|
530
|
+
}
|
|
531
|
+
if (camera.projection !== "perspective") {
|
|
532
|
+
return unavailableResult(
|
|
533
|
+
environment.lane,
|
|
534
|
+
viewRange,
|
|
535
|
+
unavailable(environment.lane, "projection-unsupported", ["perspective camera"], {
|
|
536
|
+
projection: camera.projection
|
|
537
|
+
})
|
|
538
|
+
);
|
|
539
|
+
}
|
|
540
|
+
if (!environment.sceneInputs) {
|
|
541
|
+
return unavailableResult(
|
|
542
|
+
environment.lane,
|
|
543
|
+
viewRange,
|
|
544
|
+
unavailable(
|
|
545
|
+
environment.lane,
|
|
546
|
+
"scene-input-unavailable",
|
|
547
|
+
["deferred Standard scene/material/fallback inputs"],
|
|
548
|
+
{ sceneInputs: false }
|
|
549
|
+
)
|
|
550
|
+
);
|
|
551
|
+
}
|
|
552
|
+
if (!environment.temporal) {
|
|
553
|
+
return unavailableResult(
|
|
554
|
+
environment.lane,
|
|
555
|
+
viewRange,
|
|
556
|
+
unavailable(environment.lane, "temporal-unavailable", ["temporal-v1"], { temporal: false })
|
|
557
|
+
);
|
|
558
|
+
}
|
|
559
|
+
if (!environment.reflectionFallback) {
|
|
560
|
+
return unavailableResult(
|
|
561
|
+
environment.lane,
|
|
562
|
+
viewRange,
|
|
563
|
+
unavailable(
|
|
564
|
+
environment.lane,
|
|
565
|
+
"reflection-fallback-unavailable",
|
|
566
|
+
["submitted BRDF-projected fallback"],
|
|
567
|
+
{ reflectionFallback: false }
|
|
568
|
+
)
|
|
569
|
+
);
|
|
570
|
+
}
|
|
571
|
+
if (environment.recovery === false) {
|
|
572
|
+
return unavailableResult(
|
|
573
|
+
environment.lane,
|
|
574
|
+
viewRange,
|
|
575
|
+
unavailable(environment.lane, "recovery-unavailable", ["ready device and owners"], {
|
|
576
|
+
recovery: false
|
|
577
|
+
})
|
|
578
|
+
);
|
|
579
|
+
}
|
|
580
|
+
const capabilities = environment.capabilities;
|
|
581
|
+
if (!capabilities.compute || !capabilities.storageTexture || !capabilities.rgba16floatRenderable) {
|
|
582
|
+
return unavailableResult(
|
|
583
|
+
environment.lane,
|
|
584
|
+
viewRange,
|
|
585
|
+
unavailable(
|
|
586
|
+
environment.lane,
|
|
587
|
+
"capability-unavailable",
|
|
588
|
+
["compute", "storageTexture", "rgba16floatRenderable"],
|
|
589
|
+
{
|
|
590
|
+
compute: capabilities.compute,
|
|
591
|
+
storageTexture: capabilities.storageTexture,
|
|
592
|
+
rgba16floatRenderable: capabilities.rgba16floatRenderable
|
|
593
|
+
}
|
|
594
|
+
)
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
if (!capabilities.r32floatSampledStorage) {
|
|
598
|
+
return unavailableResult(
|
|
599
|
+
environment.lane,
|
|
600
|
+
viewRange,
|
|
601
|
+
unavailable(
|
|
602
|
+
environment.lane,
|
|
603
|
+
"format-unavailable",
|
|
604
|
+
["r32float sampled and storage mip chain"],
|
|
605
|
+
{ r32floatSampledStorage: false }
|
|
606
|
+
)
|
|
607
|
+
);
|
|
608
|
+
}
|
|
609
|
+
return Object.freeze({
|
|
610
|
+
status: "admitted",
|
|
611
|
+
lane: environment.lane,
|
|
612
|
+
config: valid.value,
|
|
613
|
+
viewRange,
|
|
614
|
+
work: ADMITTED_SPATIAL_WORK
|
|
615
|
+
});
|
|
616
|
+
}
|
|
166
617
|
|
|
167
618
|
// src/volume/inspection.ts
|
|
168
619
|
function resourceStage(input) {
|
|
@@ -195,48 +646,6 @@ function inspectVolumetricFog(input) {
|
|
|
195
646
|
candidateSelectedLight: recovery?.candidateSelectedLight
|
|
196
647
|
});
|
|
197
648
|
}
|
|
198
|
-
var FACE_ORIENTATION = [
|
|
199
|
-
{ direction: [1, 0, 0], up: [0, 1, 0] },
|
|
200
|
-
{ direction: [-1, 0, 0], up: [0, 1, 0] },
|
|
201
|
-
{ direction: [0, 1, 0], up: [0, 0, -1] },
|
|
202
|
-
{ direction: [0, -1, 0], up: [0, 0, 1] },
|
|
203
|
-
{ direction: [0, 0, 1], up: [0, 1, 0] },
|
|
204
|
-
{ direction: [0, 0, -1], up: [0, 1, 0] }
|
|
205
|
-
];
|
|
206
|
-
function assertRange(near, far) {
|
|
207
|
-
if (!Number.isFinite(near) || near <= 0 || !Number.isFinite(far) || far <= near) {
|
|
208
|
-
throw new RangeError("CubeCamera requires finite near > 0 and far > near.");
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
function buildCubeCameraFaceViews(input) {
|
|
212
|
-
assertRange(input.near, input.far);
|
|
213
|
-
const views = [];
|
|
214
|
-
for (const [index, face] of CUBE_CAMERA_FACE_ORDER.entries()) {
|
|
215
|
-
const orientation = FACE_ORIENTATION[index];
|
|
216
|
-
if (orientation === void 0)
|
|
217
|
-
throw new Error(`CubeCamera face orientation missing at ${index}`);
|
|
218
|
-
const target = [
|
|
219
|
-
(input.position[0] ?? 0) + orientation.direction[0],
|
|
220
|
-
(input.position[1] ?? 0) + orientation.direction[1],
|
|
221
|
-
(input.position[2] ?? 0) + orientation.direction[2]
|
|
222
|
-
];
|
|
223
|
-
const view = mat4.lookAt(mat4.create(), input.position, target, orientation.up);
|
|
224
|
-
const projection = mat4.perspective(mat4.create(), Math.PI / 2, 1, input.near, input.far);
|
|
225
|
-
const viewProjection = mat4.multiply(mat4.create(), projection, view);
|
|
226
|
-
views.push({
|
|
227
|
-
position: input.position,
|
|
228
|
-
face,
|
|
229
|
-
direction: orientation.direction,
|
|
230
|
-
up: orientation.up,
|
|
231
|
-
near: input.near,
|
|
232
|
-
far: input.far,
|
|
233
|
-
view,
|
|
234
|
-
projection,
|
|
235
|
-
viewProjection
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
return views;
|
|
239
|
-
}
|
|
240
649
|
|
|
241
650
|
// src/reflection/filter.ts
|
|
242
651
|
function createProbeFilterState(input) {
|
|
@@ -769,235 +1178,530 @@ function consumeLodOcclusionInspection(inspection) {
|
|
|
769
1178
|
const action = error.code.startsWith("asset-") || reason === "producer-failed" ? "rebuild" : reason === "query-failed" || reason === "page-exhausted" || reason === "device-loss" ? "retry" : "cold-cook";
|
|
770
1179
|
return { action, sourceKey: inspection.root.sourceKey, reason };
|
|
771
1180
|
}
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
"finish",
|
|
779
|
-
"submit",
|
|
780
|
-
"completion",
|
|
781
|
-
"readback"
|
|
782
|
-
]);
|
|
783
|
-
var ZERO_WORK = Object.freeze({
|
|
784
|
-
attachmentCount: 0,
|
|
785
|
-
passCount: 0,
|
|
786
|
-
bindingCount: 0,
|
|
787
|
-
resourceCount: 0,
|
|
788
|
-
historyCount: 0,
|
|
789
|
-
temporalDemand: 0
|
|
790
|
-
});
|
|
791
|
-
var ADMITTED_WORK = Object.freeze({
|
|
792
|
-
attachmentCount: 1,
|
|
793
|
-
passCount: 1,
|
|
794
|
-
bindingCount: 1,
|
|
795
|
-
resourceCount: 1,
|
|
796
|
-
historyCount: 0,
|
|
797
|
-
temporalDemand: 0
|
|
798
|
-
});
|
|
799
|
-
var ZERO_BUDGET = Object.freeze({
|
|
800
|
-
probeExecutions: 0,
|
|
801
|
-
resetCount: 0,
|
|
802
|
-
rebuildCount: 0
|
|
803
|
-
});
|
|
804
|
-
var ADMITTED_BUDGET = Object.freeze({
|
|
805
|
-
probeExecutions: 1,
|
|
806
|
-
resetCount: 0,
|
|
807
|
-
rebuildCount: 0
|
|
808
|
-
});
|
|
809
|
-
function identityFieldMismatch(expected, actual) {
|
|
810
|
-
for (const field of ["sourceHead", "sourceTree", "lockSha256", "buildSha256"]) {
|
|
811
|
-
if (expected[field] !== actual[field]) return field;
|
|
1181
|
+
|
|
1182
|
+
// src/ssr/inspection.ts
|
|
1183
|
+
var SSR_INSPECTION_MAX_PASSES = 64;
|
|
1184
|
+
function nonNegativeSafeInteger(name, value) {
|
|
1185
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
1186
|
+
throw new Error(`${name} must be a non-negative safe integer`);
|
|
812
1187
|
}
|
|
813
|
-
return
|
|
814
|
-
}
|
|
815
|
-
function blocked(identity, failure2, generation = 0) {
|
|
816
|
-
return Object.freeze({
|
|
817
|
-
status: "fallback-only",
|
|
818
|
-
identity,
|
|
819
|
-
generation,
|
|
820
|
-
work: ZERO_WORK,
|
|
821
|
-
budget: ZERO_BUDGET,
|
|
822
|
-
failure: failure2
|
|
823
|
-
});
|
|
1188
|
+
return value;
|
|
824
1189
|
}
|
|
825
|
-
function
|
|
826
|
-
|
|
1190
|
+
function copyHistory(history) {
|
|
1191
|
+
nonNegativeSafeInteger("SSR inspection history.bytes", history.bytes);
|
|
1192
|
+
nonNegativeSafeInteger("SSR inspection history.resetCount", history.resetCount);
|
|
827
1193
|
return Object.freeze({
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
detail: Object.freeze({ owner, action, ...detail })
|
|
1194
|
+
state: history.state,
|
|
1195
|
+
bytes: history.bytes,
|
|
1196
|
+
resetCount: history.resetCount
|
|
832
1197
|
});
|
|
833
1198
|
}
|
|
834
|
-
function
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
case "ssr-receipt-stale":
|
|
843
|
-
return "retry";
|
|
1199
|
+
function copyCoverage(coverage) {
|
|
1200
|
+
const result = {
|
|
1201
|
+
hitCount: coverage?.hitCount ?? null,
|
|
1202
|
+
fallbackCount: coverage?.fallbackCount ?? null,
|
|
1203
|
+
excludedCount: coverage?.excludedCount ?? null
|
|
1204
|
+
};
|
|
1205
|
+
for (const [key, value] of Object.entries(result)) {
|
|
1206
|
+
if (value !== null) nonNegativeSafeInteger(`SSR inspection coverage.${key}`, value);
|
|
844
1207
|
}
|
|
1208
|
+
return Object.freeze(result);
|
|
845
1209
|
}
|
|
846
|
-
function
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
1210
|
+
function copyPassRoster(passRoster) {
|
|
1211
|
+
return Object.freeze(
|
|
1212
|
+
[...passRoster ?? []].slice(0, SSR_INSPECTION_MAX_PASSES).map((name, index) => {
|
|
1213
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
1214
|
+
throw new Error(`SSR inspection passRoster[${index}] must be a non-empty string`);
|
|
1215
|
+
}
|
|
1216
|
+
return name;
|
|
853
1217
|
})
|
|
854
1218
|
);
|
|
855
1219
|
}
|
|
856
|
-
function
|
|
857
|
-
|
|
1220
|
+
function projectSsrSpatialInspection(admission, projection = {}) {
|
|
1221
|
+
const config = admission.config;
|
|
1222
|
+
return Object.freeze({
|
|
1223
|
+
status: projection.status ?? admission.status,
|
|
1224
|
+
lane: admission.lane,
|
|
1225
|
+
config: config === void 0 ? void 0 : Object.freeze({
|
|
1226
|
+
maxDistance: config.maxDistance,
|
|
1227
|
+
thickness: config.thickness,
|
|
1228
|
+
maxRoughness: config.maxRoughness
|
|
1229
|
+
}),
|
|
1230
|
+
viewRange: admission.viewRange,
|
|
1231
|
+
coverage: copyCoverage(projection.coverage),
|
|
1232
|
+
history: copyHistory(
|
|
1233
|
+
projection.history ?? {
|
|
1234
|
+
state: "not-owned",
|
|
1235
|
+
bytes: 0,
|
|
1236
|
+
resetCount: 0
|
|
1237
|
+
}
|
|
1238
|
+
),
|
|
1239
|
+
work: Object.freeze({ ...admission.work }),
|
|
1240
|
+
passRoster: copyPassRoster(projection.passRoster),
|
|
1241
|
+
fallbackSource: projection.fallbackSource,
|
|
1242
|
+
failure: projection.failure ?? admission.failure
|
|
1243
|
+
});
|
|
858
1244
|
}
|
|
859
|
-
function
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
1245
|
+
function serializeSsrSpatialInspection(inspection) {
|
|
1246
|
+
return JSON.stringify(inspection);
|
|
1247
|
+
}
|
|
1248
|
+
var DynamicGeometryError = class extends Error {
|
|
1249
|
+
code;
|
|
1250
|
+
expected;
|
|
1251
|
+
hint;
|
|
1252
|
+
detail;
|
|
1253
|
+
constructor(code, expected, hint, detail = {}) {
|
|
1254
|
+
super(`${code}: ${expected}`);
|
|
1255
|
+
this.name = "DynamicGeometryError";
|
|
1256
|
+
this.code = code;
|
|
1257
|
+
this.expected = expected;
|
|
1258
|
+
this.hint = hint;
|
|
1259
|
+
this.detail = Object.freeze({ code, ...detail });
|
|
867
1260
|
}
|
|
868
|
-
|
|
1261
|
+
};
|
|
1262
|
+
function sameCandidateCredential(candidate, committed) {
|
|
1263
|
+
return candidate.candidateId === committed.candidateId && candidate.owner === committed.owner && candidate.world === committed.world && candidate.generation === committed.generation && candidate.entity === committed.entity && candidate.physicsEntity === committed.physicsEntity && candidate.gpuReady === committed.gpuReady && candidate.meshBytes === committed.meshBytes && candidate.revision === committed.revision && candidate.topologyRevision === committed.topologyRevision && candidate.materialIdentity === committed.materialIdentity && candidate.meshHandle === committed.meshHandle && candidate.fixedStep === committed.fixedStep;
|
|
869
1264
|
}
|
|
870
|
-
function
|
|
871
|
-
return
|
|
1265
|
+
function cloneTypedArray(value) {
|
|
1266
|
+
return new value.constructor(value);
|
|
872
1267
|
}
|
|
873
|
-
function
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
)
|
|
879
|
-
|
|
880
|
-
if (input.reflectionFallback === void 0) {
|
|
881
|
-
return blocked(
|
|
882
|
-
input.identity,
|
|
883
|
-
failure("ssr-reflection-fallback-unavailable", "producer", "use LKG, Skylight, or neutral")
|
|
884
|
-
);
|
|
885
|
-
}
|
|
886
|
-
const fallbackIdentityFailure = receiptFailure(input, input.reflectionFallback, "producer");
|
|
887
|
-
if (fallbackIdentityFailure !== void 0) return fallbackIdentityFailure;
|
|
888
|
-
if (!validFallback(input.reflectionFallback)) {
|
|
889
|
-
return blocked(
|
|
890
|
-
input.identity,
|
|
891
|
-
failure(
|
|
892
|
-
"ssr-reflection-fallback-unavailable",
|
|
893
|
-
"producer",
|
|
894
|
-
"inspect and rebuild the producer receipt"
|
|
895
|
-
),
|
|
896
|
-
input.reflectionFallback.projectionGeneration
|
|
897
|
-
);
|
|
898
|
-
}
|
|
899
|
-
if (input.format === void 0) {
|
|
900
|
-
return blocked(
|
|
901
|
-
input.identity,
|
|
902
|
-
failure("ssr-format-unavailable", "format", "probe the exact format profile for this device"),
|
|
903
|
-
input.reflectionFallback.projectionGeneration
|
|
904
|
-
);
|
|
905
|
-
}
|
|
906
|
-
const formatIdentityFailure = receiptFailure(input, input.format, "format");
|
|
907
|
-
if (formatIdentityFailure !== void 0) return formatIdentityFailure;
|
|
908
|
-
if (!validFormat(input.format)) {
|
|
909
|
-
return blocked(
|
|
910
|
-
input.identity,
|
|
911
|
-
failure("ssr-format-unavailable", "format", "complete the full r32float profile probe"),
|
|
912
|
-
input.reflectionFallback.projectionGeneration
|
|
913
|
-
);
|
|
914
|
-
}
|
|
915
|
-
if (input.temporal === void 0) {
|
|
916
|
-
return blocked(
|
|
917
|
-
input.identity,
|
|
918
|
-
failure(
|
|
919
|
-
"ssr-temporal-unavailable",
|
|
920
|
-
"temporal",
|
|
921
|
-
"submit the matching temporal producer receipt"
|
|
922
|
-
),
|
|
923
|
-
input.reflectionFallback.projectionGeneration
|
|
924
|
-
);
|
|
925
|
-
}
|
|
926
|
-
const temporalIdentityFailure = receiptFailure(input, input.temporal, "temporal");
|
|
927
|
-
if (temporalIdentityFailure !== void 0) return temporalIdentityFailure;
|
|
928
|
-
if (!validTemporal(input.temporal)) {
|
|
929
|
-
return blocked(
|
|
930
|
-
input.identity,
|
|
931
|
-
failure("ssr-temporal-unavailable", "temporal", "inspect and rebuild the temporal receipt"),
|
|
932
|
-
input.reflectionFallback.projectionGeneration
|
|
933
|
-
);
|
|
934
|
-
}
|
|
935
|
-
if (input.previousGeneration !== void 0 && input.previousGeneration !== input.reflectionFallback.projectionGeneration) {
|
|
936
|
-
return blocked(
|
|
937
|
-
input.identity,
|
|
938
|
-
failure(
|
|
939
|
-
"ssr-receipt-stale",
|
|
940
|
-
"consumer",
|
|
941
|
-
"discard stale completion and reinspect the owners",
|
|
942
|
-
{
|
|
943
|
-
generation: input.reflectionFallback.projectionGeneration
|
|
944
|
-
}
|
|
945
|
-
),
|
|
946
|
-
input.reflectionFallback.projectionGeneration
|
|
947
|
-
);
|
|
948
|
-
}
|
|
1268
|
+
function cloneMesh(mesh) {
|
|
1269
|
+
const attributes = Object.fromEntries(
|
|
1270
|
+
Object.entries(mesh.attributes).map(([key, value]) => [
|
|
1271
|
+
key,
|
|
1272
|
+
value instanceof ArrayBuffer ? value.slice(0) : value === void 0 ? void 0 : cloneTypedArray(value)
|
|
1273
|
+
])
|
|
1274
|
+
);
|
|
949
1275
|
return Object.freeze({
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
1276
|
+
...mesh,
|
|
1277
|
+
vertices: new Float32Array(mesh.vertices),
|
|
1278
|
+
...mesh.indices === void 0 ? {} : { indices: cloneTypedArray(mesh.indices) },
|
|
1279
|
+
attributes,
|
|
1280
|
+
...mesh.aabb === void 0 ? {} : { aabb: new Float32Array(mesh.aabb) },
|
|
1281
|
+
submeshes: Object.freeze(mesh.submeshes.map((submesh) => Object.freeze({ ...submesh }))),
|
|
1282
|
+
materialSlots: Object.freeze(mesh.materialSlots.map((slot) => Object.freeze({ ...slot })))
|
|
955
1283
|
});
|
|
956
1284
|
}
|
|
957
|
-
function
|
|
958
|
-
|
|
959
|
-
const reflectionFallback = identity === void 0 || input.reflectionFallback?.identity === void 0 ? void 0 : input.reflectionFallback;
|
|
960
|
-
const format = identity === void 0 || input.format === void 0 ? void 0 : { ...input.format, identity };
|
|
961
|
-
const temporal = identity === void 0 || input.temporal === void 0 ? void 0 : { identity, ...input.temporal };
|
|
962
|
-
const admission = identity === void 0 ? blocked(
|
|
963
|
-
void 0,
|
|
964
|
-
failure(
|
|
965
|
-
input.requested ? "ssr-receipt-identity-mismatch" : "ssr-not-requested",
|
|
966
|
-
"consumer",
|
|
967
|
-
input.requested ? "bind the exact source, tree, lock, and build identity before admission" : "request SSR before evaluating M0 admission",
|
|
968
|
-
input.requested ? { identityField: "sourceHead" } : {}
|
|
969
|
-
)
|
|
970
|
-
) : admitSsrM0({
|
|
971
|
-
requested: input.requested,
|
|
972
|
-
identity,
|
|
973
|
-
...reflectionFallback === void 0 ? {} : { reflectionFallback },
|
|
974
|
-
...format === void 0 ? {} : { format },
|
|
975
|
-
...temporal === void 0 ? {} : { temporal },
|
|
976
|
-
...input.previousGeneration === void 0 ? {} : { previousGeneration: input.previousGeneration }
|
|
977
|
-
});
|
|
978
|
-
return Object.freeze({
|
|
979
|
-
status: admission.status,
|
|
980
|
-
identity,
|
|
981
|
-
requested: input.requested,
|
|
982
|
-
reflectionFallback: input.reflectionFallback,
|
|
983
|
-
format,
|
|
984
|
-
temporal,
|
|
985
|
-
admission,
|
|
986
|
-
work: admission.work,
|
|
987
|
-
budget: admission.budget,
|
|
988
|
-
failure: admission.failure
|
|
989
|
-
});
|
|
1285
|
+
function cloneCandidate(candidate) {
|
|
1286
|
+
return Object.freeze({ ...candidate, mesh: cloneMesh(candidate.mesh) });
|
|
990
1287
|
}
|
|
991
|
-
function
|
|
992
|
-
return
|
|
1288
|
+
function validateMesh(mesh) {
|
|
1289
|
+
if (mesh.kind !== "mesh") return "MeshAsset.kind must be mesh";
|
|
1290
|
+
if (!(mesh.vertices instanceof Float32Array) || mesh.vertices.length === 0 || mesh.vertices.length % 3 !== 0) {
|
|
1291
|
+
return "MeshAsset.vertices must be a non-empty Float32Array with xyz triples";
|
|
1292
|
+
}
|
|
1293
|
+
if (mesh.indices !== void 0 && !(mesh.indices instanceof Uint16Array || mesh.indices instanceof Uint32Array)) {
|
|
1294
|
+
return "MeshAsset.indices must be Uint16Array or Uint32Array";
|
|
1295
|
+
}
|
|
1296
|
+
if (mesh.submeshes.length === 0)
|
|
1297
|
+
return "MeshAsset.submeshes must contain at least one topology range";
|
|
1298
|
+
if (mesh.materialSlots.length < mesh.submeshes.length) {
|
|
1299
|
+
return "MeshAsset.materialSlots must cover every submesh";
|
|
1300
|
+
}
|
|
1301
|
+
if (mesh.vertices.some((value) => !Number.isFinite(value)))
|
|
1302
|
+
return "MeshAsset.vertices must be finite";
|
|
1303
|
+
return void 0;
|
|
993
1304
|
}
|
|
994
|
-
function
|
|
1305
|
+
function meshByteSize(mesh) {
|
|
1306
|
+
let bytes = mesh.vertices.byteLength + (mesh.indices?.byteLength ?? 0);
|
|
1307
|
+
for (const value of Object.values(mesh.attributes)) {
|
|
1308
|
+
if (value instanceof ArrayBuffer) bytes += value.byteLength;
|
|
1309
|
+
else if (value !== void 0 && ArrayBuffer.isView(value)) bytes += value.byteLength;
|
|
1310
|
+
}
|
|
1311
|
+
if (mesh.aabb !== void 0) bytes += mesh.aabb.byteLength;
|
|
1312
|
+
return bytes;
|
|
1313
|
+
}
|
|
1314
|
+
function createDynamicGeometryLifecycle(maxCandidates = 32, maxMeshBytes = 64 * 1024 * 1024) {
|
|
1315
|
+
const records = /* @__PURE__ */ new Map();
|
|
1316
|
+
const owner = {};
|
|
1317
|
+
let sequence = 0;
|
|
1318
|
+
let currentGeneration = 0;
|
|
1319
|
+
let disposed = false;
|
|
1320
|
+
let historyInvalidations = 0;
|
|
1321
|
+
let latestRevision;
|
|
1322
|
+
let latestFrameId;
|
|
1323
|
+
let retired = 0;
|
|
1324
|
+
let invalidated = 0;
|
|
1325
|
+
let meshBytes = 0;
|
|
1326
|
+
const latestRevisionByWorld = /* @__PURE__ */ new WeakMap();
|
|
1327
|
+
const latestTopologyRevisionByWorld = /* @__PURE__ */ new WeakMap();
|
|
1328
|
+
const publishedReceipts = /* @__PURE__ */ new Map();
|
|
1329
|
+
const failure2 = (code, expected, hint, detail = {}) => err(new DynamicGeometryError(code, expected, hint, detail));
|
|
1330
|
+
const current = (candidate) => {
|
|
1331
|
+
const record = records.get(candidate.candidateId);
|
|
1332
|
+
if (record === void 0 || candidate.owner !== owner || record.candidate.owner !== candidate.owner || record.candidate.world !== candidate.world || record.candidate.generation !== candidate.generation)
|
|
1333
|
+
return void 0;
|
|
1334
|
+
return record;
|
|
1335
|
+
};
|
|
995
1336
|
return {
|
|
996
|
-
|
|
997
|
-
|
|
1337
|
+
prepare(input, generation) {
|
|
1338
|
+
if (disposed)
|
|
1339
|
+
return failure2("dynamic-geometry-disposed", "renderer is alive", "rebuild the Renderer");
|
|
1340
|
+
if (input.world === null || typeof input.world !== "object") {
|
|
1341
|
+
return failure2(
|
|
1342
|
+
"dynamic-geometry-world-not-attached",
|
|
1343
|
+
"candidate belongs to an attached World",
|
|
1344
|
+
"attach the World before preparing geometry"
|
|
1345
|
+
);
|
|
1346
|
+
}
|
|
1347
|
+
if (!Number.isInteger(input.revision) || input.revision < 0) {
|
|
1348
|
+
return failure2(
|
|
1349
|
+
"dynamic-geometry-invalid",
|
|
1350
|
+
"geometry revision is a non-negative integer",
|
|
1351
|
+
"advance the consumer revision monotonically",
|
|
1352
|
+
{ revision: input.revision }
|
|
1353
|
+
);
|
|
1354
|
+
}
|
|
1355
|
+
if (generation !== currentGeneration && currentGeneration !== 0) {
|
|
1356
|
+
return failure2(
|
|
1357
|
+
"dynamic-geometry-generation-mismatch",
|
|
1358
|
+
"candidate uses the active renderer generation",
|
|
1359
|
+
"discard stale generation work and prepare again",
|
|
1360
|
+
{ generation, actual: currentGeneration }
|
|
1361
|
+
);
|
|
1362
|
+
}
|
|
1363
|
+
if (records.size >= maxCandidates) {
|
|
1364
|
+
return failure2(
|
|
1365
|
+
"dynamic-geometry-budget-exceeded",
|
|
1366
|
+
"candidate count remains within the bounded renderer budget",
|
|
1367
|
+
"cancel or retire an earlier candidate before retrying",
|
|
1368
|
+
{ actual: records.size }
|
|
1369
|
+
);
|
|
1370
|
+
}
|
|
1371
|
+
const invalid = validateMesh(input.mesh);
|
|
1372
|
+
if (invalid !== void 0)
|
|
1373
|
+
return failure2(
|
|
1374
|
+
"dynamic-geometry-invalid",
|
|
1375
|
+
"MeshAsset satisfies the standard geometry contract",
|
|
1376
|
+
invalid
|
|
1377
|
+
);
|
|
1378
|
+
const candidateBytes = meshByteSize(input.mesh);
|
|
1379
|
+
if (!Number.isSafeInteger(candidateBytes) || candidateBytes < 0 || meshBytes > maxMeshBytes - candidateBytes) {
|
|
1380
|
+
return failure2(
|
|
1381
|
+
"dynamic-geometry-budget-exceeded",
|
|
1382
|
+
"candidate mesh bytes remain within the bounded renderer resource budget",
|
|
1383
|
+
"cancel or retire an earlier candidate before retrying",
|
|
1384
|
+
{ actual: { meshBytes, candidateBytes, maxMeshBytes } }
|
|
1385
|
+
);
|
|
1386
|
+
}
|
|
1387
|
+
const candidateId = `mesh:${generation}:${++sequence}:${input.revision}`;
|
|
1388
|
+
const candidate = Object.freeze({
|
|
1389
|
+
candidateId,
|
|
1390
|
+
generation,
|
|
1391
|
+
owner,
|
|
1392
|
+
world: input.world,
|
|
1393
|
+
...input.entity === void 0 ? {} : { entity: input.entity },
|
|
1394
|
+
...input.physicsEntity === void 0 ? {} : { physicsEntity: input.physicsEntity },
|
|
1395
|
+
gpuReady: input.meshHandle !== void 0,
|
|
1396
|
+
meshBytes: candidateBytes,
|
|
1397
|
+
revision: input.revision,
|
|
1398
|
+
topologyRevision: input.topologyRevision ?? input.revision,
|
|
1399
|
+
...input.materialIdentity === void 0 ? {} : { materialIdentity: input.materialIdentity },
|
|
1400
|
+
...input.meshHandle === void 0 ? {} : { meshHandle: input.meshHandle },
|
|
1401
|
+
...input.fixedStep === void 0 ? {} : { fixedStep: input.fixedStep },
|
|
1402
|
+
mesh: cloneMesh(input.mesh),
|
|
1403
|
+
state: "prepared"
|
|
1404
|
+
});
|
|
1405
|
+
records.set(candidateId, {
|
|
1406
|
+
world: input.world,
|
|
1407
|
+
candidate,
|
|
1408
|
+
historyInvalidated: false
|
|
1409
|
+
});
|
|
1410
|
+
meshBytes += candidateBytes;
|
|
1411
|
+
currentGeneration = generation;
|
|
1412
|
+
return ok(cloneCandidate(candidate));
|
|
1413
|
+
},
|
|
1414
|
+
accept(candidate, ordering) {
|
|
1415
|
+
if (disposed)
|
|
1416
|
+
return failure2("dynamic-geometry-disposed", "renderer is alive", "rebuild the Renderer");
|
|
1417
|
+
const record = current(candidate);
|
|
1418
|
+
if (record === void 0)
|
|
1419
|
+
return failure2(
|
|
1420
|
+
"dynamic-geometry-candidate-not-found",
|
|
1421
|
+
"candidate is owned by this renderer",
|
|
1422
|
+
"discard the stale credential"
|
|
1423
|
+
);
|
|
1424
|
+
if (candidate.generation !== currentGeneration) {
|
|
1425
|
+
return failure2(
|
|
1426
|
+
"dynamic-geometry-generation-mismatch",
|
|
1427
|
+
"candidate generation matches the active renderer generation",
|
|
1428
|
+
"prepare against the current renderer generation",
|
|
1429
|
+
{ candidateId: candidate.candidateId }
|
|
1430
|
+
);
|
|
1431
|
+
}
|
|
1432
|
+
if (record.candidate.state !== "prepared") {
|
|
1433
|
+
return failure2(
|
|
1434
|
+
"dynamic-geometry-candidate-state",
|
|
1435
|
+
"candidate is prepared exactly once before acceptance",
|
|
1436
|
+
"retain the accepted or published receipt",
|
|
1437
|
+
{ candidateId: candidate.candidateId }
|
|
1438
|
+
);
|
|
1439
|
+
}
|
|
1440
|
+
if (!sameCandidateCredential(candidate, record.candidate)) {
|
|
1441
|
+
return failure2(
|
|
1442
|
+
"dynamic-geometry-receipt-mismatch",
|
|
1443
|
+
"acceptance uses the exact prepared candidate credential",
|
|
1444
|
+
"discard the altered credential and use the value returned by prepare",
|
|
1445
|
+
{ candidateId: candidate.candidateId }
|
|
1446
|
+
);
|
|
1447
|
+
}
|
|
1448
|
+
if (ordering !== void 0) {
|
|
1449
|
+
if (ordering.world !== record.world || !Number.isInteger(ordering.fixedStep) || ordering.fixedStep < 0) {
|
|
1450
|
+
return failure2(
|
|
1451
|
+
"dynamic-geometry-ordering-required",
|
|
1452
|
+
"acceptance ordering names the candidate World and a non-negative fixed step",
|
|
1453
|
+
"submit the PhysicsWorld publication ordering for the same attached World",
|
|
1454
|
+
{ candidateId: candidate.candidateId, actual: ordering }
|
|
1455
|
+
);
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
const newest = [...records.values()].filter(
|
|
1459
|
+
(entry) => entry.candidate.candidateId !== candidate.candidateId && entry.world === record.world && entry.candidate.entity === record.candidate.entity && (entry.candidate.state === "prepared" || entry.candidate.state === "accepted")
|
|
1460
|
+
).map((entry) => entry.candidate.revision).concat(latestRevisionByWorld.get(record.world)?.get(record.candidate.entity) ?? -1).sort((a, b) => b - a)[0];
|
|
1461
|
+
if (newest !== void 0 && record.candidate.revision <= newest) {
|
|
1462
|
+
return failure2(
|
|
1463
|
+
"dynamic-geometry-stale",
|
|
1464
|
+
"accepted geometry revision is newer than the active candidate",
|
|
1465
|
+
"advance topology revision before accepting",
|
|
1466
|
+
{ candidateId: candidate.candidateId }
|
|
1467
|
+
);
|
|
1468
|
+
}
|
|
1469
|
+
const accepted = Object.freeze({
|
|
1470
|
+
...record.candidate,
|
|
1471
|
+
...ordering === void 0 ? {} : { fixedStep: ordering.fixedStep },
|
|
1472
|
+
state: "accepted"
|
|
1473
|
+
});
|
|
1474
|
+
const previousTopologies = [...records.values()].filter(
|
|
1475
|
+
(entry) => entry.candidate.candidateId !== candidate.candidateId && entry.world === record.world && entry.candidate.entity === record.candidate.entity
|
|
1476
|
+
).map((entry) => entry.candidate.topologyRevision);
|
|
1477
|
+
const previousLatestTopology = latestTopologyRevisionByWorld.get(record.world)?.get(record.candidate.entity);
|
|
1478
|
+
const newestTopology = previousTopologies.concat(previousLatestTopology === void 0 ? [] : [previousLatestTopology]).sort((a, b) => b - a)[0];
|
|
1479
|
+
if (newestTopology !== void 0 && accepted.topologyRevision < newestTopology) {
|
|
1480
|
+
return failure2(
|
|
1481
|
+
"dynamic-geometry-stale",
|
|
1482
|
+
"accepted topology revision is not older than the active geometry history",
|
|
1483
|
+
"advance topology revision before accepting a replacement candidate",
|
|
1484
|
+
{ candidateId: candidate.candidateId }
|
|
1485
|
+
);
|
|
1486
|
+
}
|
|
1487
|
+
if (newestTopology !== void 0 && accepted.topologyRevision > newestTopology) {
|
|
1488
|
+
historyInvalidations += 1;
|
|
1489
|
+
for (const previous of records.values()) {
|
|
1490
|
+
if (previous.world !== record.world || previous.candidate.entity !== record.candidate.entity || previous.candidate.candidateId === candidate.candidateId || previous.candidate.topologyRevision >= accepted.topologyRevision)
|
|
1491
|
+
continue;
|
|
1492
|
+
if (!previous.historyInvalidated) {
|
|
1493
|
+
previous.historyInvalidated = true;
|
|
1494
|
+
invalidated += 1;
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
}
|
|
1498
|
+
record.candidate = accepted;
|
|
1499
|
+
return ok(cloneCandidate(accepted));
|
|
1500
|
+
},
|
|
1501
|
+
cancel(candidate, completion) {
|
|
1502
|
+
const record = current(candidate);
|
|
1503
|
+
if (record === void 0)
|
|
1504
|
+
return failure2(
|
|
1505
|
+
"dynamic-geometry-candidate-not-found",
|
|
1506
|
+
"candidate is owned by this renderer",
|
|
1507
|
+
"discard the stale credential"
|
|
1508
|
+
);
|
|
1509
|
+
if (!sameCandidateCredential(candidate, record.candidate))
|
|
1510
|
+
return failure2(
|
|
1511
|
+
"dynamic-geometry-receipt-mismatch",
|
|
1512
|
+
"cancellation uses the exact prepared candidate credential",
|
|
1513
|
+
"discard the altered credential and use the value returned by prepare",
|
|
1514
|
+
{ candidateId: candidate.candidateId }
|
|
1515
|
+
);
|
|
1516
|
+
if (record.candidate.state !== "prepared" && record.candidate.state !== "accepted") {
|
|
1517
|
+
return failure2(
|
|
1518
|
+
"dynamic-geometry-candidate-state",
|
|
1519
|
+
"only prepared or accepted geometry can be cancelled once",
|
|
1520
|
+
"retire published geometry or await the existing terminal cleanup"
|
|
1521
|
+
);
|
|
1522
|
+
}
|
|
1523
|
+
record.candidate = Object.freeze({ ...record.candidate, state: "cancelled" });
|
|
1524
|
+
const release = () => {
|
|
1525
|
+
if (records.get(candidate.candidateId) !== record) return;
|
|
1526
|
+
records.delete(candidate.candidateId);
|
|
1527
|
+
meshBytes = Math.max(0, meshBytes - record.candidate.meshBytes);
|
|
1528
|
+
};
|
|
1529
|
+
if (completion === void 0) release();
|
|
1530
|
+
else void completion.then(release, release);
|
|
1531
|
+
return ok(void 0);
|
|
1532
|
+
},
|
|
1533
|
+
retire(candidate) {
|
|
1534
|
+
const record = current(candidate);
|
|
1535
|
+
if (record === void 0)
|
|
1536
|
+
return failure2(
|
|
1537
|
+
"dynamic-geometry-candidate-not-found",
|
|
1538
|
+
"retirement uses a published candidate owned by this renderer",
|
|
1539
|
+
"discard the stale credential and do not evict any unrelated mesh",
|
|
1540
|
+
{ candidateId: candidate.candidateId }
|
|
1541
|
+
);
|
|
1542
|
+
if (!sameCandidateCredential(candidate, record.candidate))
|
|
1543
|
+
return failure2(
|
|
1544
|
+
"dynamic-geometry-receipt-mismatch",
|
|
1545
|
+
"retirement uses the exact published candidate credential",
|
|
1546
|
+
"discard the altered credential and use the value returned by publish",
|
|
1547
|
+
{ candidateId: candidate.candidateId }
|
|
1548
|
+
);
|
|
1549
|
+
if (record.candidate.state !== "published") {
|
|
1550
|
+
return failure2(
|
|
1551
|
+
"dynamic-geometry-candidate-state",
|
|
1552
|
+
"only published geometry can enter receipt-bound retirement",
|
|
1553
|
+
"publish the candidate from a submitted frame first"
|
|
1554
|
+
);
|
|
1555
|
+
}
|
|
1556
|
+
record.candidate = Object.freeze({ ...record.candidate, state: "retired" });
|
|
1557
|
+
publishedReceipts.delete(candidate.candidateId);
|
|
1558
|
+
retired += 1;
|
|
1559
|
+
return ok(void 0);
|
|
1560
|
+
},
|
|
1561
|
+
finalizeRetirement(candidate) {
|
|
1562
|
+
const record = current(candidate);
|
|
1563
|
+
if (record === void 0)
|
|
1564
|
+
return failure2(
|
|
1565
|
+
"dynamic-geometry-candidate-not-found",
|
|
1566
|
+
"retirement finalization uses a candidate retained by this lifecycle",
|
|
1567
|
+
"discard the stale credential or finish the current receipt-bound retirement"
|
|
1568
|
+
);
|
|
1569
|
+
if (!sameCandidateCredential(candidate, record.candidate))
|
|
1570
|
+
return failure2(
|
|
1571
|
+
"dynamic-geometry-receipt-mismatch",
|
|
1572
|
+
"retirement finalization uses the exact published candidate credential",
|
|
1573
|
+
"discard the altered credential and use the value returned by publication",
|
|
1574
|
+
{ candidateId: candidate.candidateId }
|
|
1575
|
+
);
|
|
1576
|
+
if (record.candidate.state !== "retired")
|
|
1577
|
+
return failure2(
|
|
1578
|
+
"dynamic-geometry-candidate-state",
|
|
1579
|
+
"only a retired candidate can release its deferred budget",
|
|
1580
|
+
"retire the published candidate before finalizing its receipt-bound cleanup",
|
|
1581
|
+
{ candidateId: candidate.candidateId }
|
|
1582
|
+
);
|
|
1583
|
+
records.delete(candidate.candidateId);
|
|
1584
|
+
meshBytes = Math.max(0, meshBytes - record.candidate.meshBytes);
|
|
1585
|
+
return ok(void 0);
|
|
1586
|
+
},
|
|
1587
|
+
publishFrame(frame, worlds, fixedStep, canPublish) {
|
|
1588
|
+
if (disposed || frame.deviceGeneration !== currentGeneration) return [];
|
|
1589
|
+
const receipts = [];
|
|
1590
|
+
for (const record of records.values()) {
|
|
1591
|
+
const canRepeatPublished = record.candidate.state === "published" && // Attached Renderer publication revalidates the entity binding in
|
|
1592
|
+
// `canPublish`, so a history-invalidated candidate can still record
|
|
1593
|
+
// a real draw for its live entity. Detached lifecycle publication
|
|
1594
|
+
// remains one-shot once that history is invalidated.
|
|
1595
|
+
(canPublish !== void 0 || !record.historyInvalidated);
|
|
1596
|
+
if (record.candidate.state !== "accepted" && !canRepeatPublished) continue;
|
|
1597
|
+
if (worlds !== void 0 && !worlds.includes(record.world)) continue;
|
|
1598
|
+
if (record.candidate.fixedStep !== void 0 && (fixedStep === void 0 || record.candidate.fixedStep > fixedStep)) {
|
|
1599
|
+
continue;
|
|
1600
|
+
}
|
|
1601
|
+
if (canPublish !== void 0 && !canPublish(record.candidate)) continue;
|
|
1602
|
+
record.candidate = Object.freeze({ ...record.candidate, state: "published" });
|
|
1603
|
+
const receipt = Object.freeze({
|
|
1604
|
+
candidateId: record.candidate.candidateId,
|
|
1605
|
+
generation: record.candidate.generation,
|
|
1606
|
+
revision: record.candidate.revision,
|
|
1607
|
+
topologyRevision: record.candidate.topologyRevision,
|
|
1608
|
+
...record.candidate.fixedStep === void 0 ? {} : { fixedStep: record.candidate.fixedStep },
|
|
1609
|
+
frameId: frame.frameId,
|
|
1610
|
+
deviceGeneration: frame.deviceGeneration,
|
|
1611
|
+
recordStageConsumed: canPublish !== void 0,
|
|
1612
|
+
...fixedStep === void 0 ? {} : { publicationFixedStep: fixedStep },
|
|
1613
|
+
frame: Object.freeze({ ...frame })
|
|
1614
|
+
});
|
|
1615
|
+
receipts.push(receipt);
|
|
1616
|
+
publishedReceipts.set(record.candidate.candidateId, receipt);
|
|
1617
|
+
latestRevision = record.candidate.revision;
|
|
1618
|
+
latestFrameId = frame.frameId;
|
|
1619
|
+
if (!latestRevisionByWorld.has(record.world))
|
|
1620
|
+
latestRevisionByWorld.set(record.world, /* @__PURE__ */ new Map());
|
|
1621
|
+
latestRevisionByWorld.get(record.world)?.set(record.candidate.entity, record.candidate.revision);
|
|
1622
|
+
if (!latestTopologyRevisionByWorld.has(record.world))
|
|
1623
|
+
latestTopologyRevisionByWorld.set(record.world, /* @__PURE__ */ new Map());
|
|
1624
|
+
latestTopologyRevisionByWorld.get(record.world)?.set(record.candidate.entity, record.candidate.topologyRevision);
|
|
1625
|
+
}
|
|
1626
|
+
return receipts;
|
|
1627
|
+
},
|
|
1628
|
+
invalidateWorld(world, completion) {
|
|
1629
|
+
for (const [id, record] of records) {
|
|
1630
|
+
if (record.world !== world) continue;
|
|
1631
|
+
if (record.candidate.state === "cancelled" || record.candidate.state === "retired")
|
|
1632
|
+
continue;
|
|
1633
|
+
publishedReceipts.delete(id);
|
|
1634
|
+
record.candidate = Object.freeze({ ...record.candidate, state: "cancelled" });
|
|
1635
|
+
const release = () => {
|
|
1636
|
+
if (records.get(id) !== record) return;
|
|
1637
|
+
records.delete(id);
|
|
1638
|
+
meshBytes = Math.max(0, meshBytes - record.candidate.meshBytes);
|
|
1639
|
+
};
|
|
1640
|
+
if (completion === void 0) release();
|
|
1641
|
+
else void completion.then(release, release);
|
|
1642
|
+
invalidated += 1;
|
|
1643
|
+
}
|
|
1644
|
+
latestRevisionByWorld.delete(world);
|
|
1645
|
+
latestTopologyRevisionByWorld.delete(world);
|
|
1646
|
+
},
|
|
1647
|
+
invalidateGeneration(generation) {
|
|
1648
|
+
if (generation === currentGeneration) return;
|
|
1649
|
+
currentGeneration = generation;
|
|
1650
|
+
const invalidatedWorlds = /* @__PURE__ */ new Set();
|
|
1651
|
+
for (const [id, record] of records) {
|
|
1652
|
+
if (record.candidate.generation !== generation) {
|
|
1653
|
+
records.delete(id);
|
|
1654
|
+
publishedReceipts.delete(id);
|
|
1655
|
+
meshBytes = Math.max(0, meshBytes - record.candidate.meshBytes);
|
|
1656
|
+
invalidatedWorlds.add(record.world);
|
|
1657
|
+
invalidated += 1;
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
for (const world of invalidatedWorlds) {
|
|
1661
|
+
latestRevisionByWorld.delete(world);
|
|
1662
|
+
latestTopologyRevisionByWorld.delete(world);
|
|
1663
|
+
}
|
|
1664
|
+
},
|
|
1665
|
+
receipt(candidate) {
|
|
1666
|
+
const receipt = publishedReceipts.get(candidate.candidateId);
|
|
1667
|
+
const record = records.get(candidate.candidateId);
|
|
1668
|
+
if (record === void 0 || !sameCandidateCredential(candidate, record.candidate)) {
|
|
1669
|
+
return void 0;
|
|
1670
|
+
}
|
|
1671
|
+
return receipt?.generation === candidate.generation ? receipt : void 0;
|
|
1672
|
+
},
|
|
1673
|
+
inspect() {
|
|
1674
|
+
let prepared = 0;
|
|
1675
|
+
let accepted = 0;
|
|
1676
|
+
let published = 0;
|
|
1677
|
+
for (const record of records.values()) {
|
|
1678
|
+
if (record.candidate.state === "prepared") prepared += 1;
|
|
1679
|
+
else if (record.candidate.state === "accepted") accepted += 1;
|
|
1680
|
+
else if (record.candidate.state === "published") published += 1;
|
|
1681
|
+
}
|
|
1682
|
+
return Object.freeze({
|
|
1683
|
+
generation: currentGeneration,
|
|
1684
|
+
prepared,
|
|
1685
|
+
accepted,
|
|
1686
|
+
published,
|
|
1687
|
+
retired,
|
|
1688
|
+
...latestRevision === void 0 ? {} : { latestRevision },
|
|
1689
|
+
...latestFrameId === void 0 ? {} : { latestFrameId },
|
|
1690
|
+
historyInvalidations,
|
|
1691
|
+
invalidated,
|
|
1692
|
+
meshBytes,
|
|
1693
|
+
maxMeshBytes
|
|
1694
|
+
});
|
|
1695
|
+
},
|
|
1696
|
+
dispose() {
|
|
1697
|
+
disposed = true;
|
|
1698
|
+
records.clear();
|
|
1699
|
+
publishedReceipts.clear();
|
|
1700
|
+
meshBytes = 0;
|
|
1701
|
+
}
|
|
998
1702
|
};
|
|
999
1703
|
}
|
|
1000
1704
|
|
|
1001
|
-
export { DEFAULT_REFLECTION_PROBE_LIMITS, LOD_OCCLUSION_INSPECTION_MAX_BYTES, LOD_OCCLUSION_INSPECTION_SCHEMA, ReflectionProbeProjection, SSR_FORMAT_PROFILE, SSR_FORMAT_STAGES, admitPointsLines, admitReflectionProbe, admitSsrM0, advanceProbeFilter, boxProjectReflectionDirection,
|
|
1002
|
-
//# sourceMappingURL=chunk-
|
|
1003
|
-
//# sourceMappingURL=chunk-
|
|
1705
|
+
export { DEFAULT_REFLECTION_PROBE_LIMITS, DynamicGeometryError, LOD_OCCLUSION_INSPECTION_MAX_BYTES, LOD_OCCLUSION_INSPECTION_SCHEMA, ReflectionProbeProjection, SSR_FORMAT_PROFILE, SSR_FORMAT_STAGES, admitPointsLines, admitReflectionProbe, admitSsrM0, admitSsrSpatial, advanceProbeFilter, boxProjectReflectionDirection, buildReflectionProbeTable, commitProbeFilterStep, consumeLodOcclusionInspection, createDynamicGeometryLifecycle, createProbeFilterState, deriveReflectionFallbackProjection, estimateReflectionProbeBytes, inspectLodOcclusion, inspectPointShadow, inspectReflectionFallback, inspectVolumetricFog, probeFilterIsSteady, projectSsrDependencies, projectSsrSpatialInspection, reflectionFallbackCoverage, reflectionFallbackProjectionSignature, reflectionFallbackSourceKey, reflectionProbeTableBytes, resolveReflectionFallbackSource, resolveSsrAdmissionGeneration, sameCandidateCredential, selectReflectionProbe, serializeLodOcclusionInspection, serializeSsrSpatialInspection, validateReflectionProbeInput, validateScreenSpaceReflection, zeroSsrAdmissionWork };
|
|
1706
|
+
//# sourceMappingURL=chunk-BQVQOQJH.mjs.map
|
|
1707
|
+
//# sourceMappingURL=chunk-BQVQOQJH.mjs.map
|