@forgeax/engine-render 0.1.7 → 0.1.20
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 +140 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/assembly/backend-contract.d.ts +12 -0
- package/dist/assembly/backend-contract.d.ts.map +1 -1
- package/dist/assembly/factory.d.ts +26 -5
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +4 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
- package/dist/assembly/renderer-inspection.d.ts +22 -0
- package/dist/assembly/renderer-inspection.d.ts.map +1 -0
- package/dist/assembly/renderer-lifecycle.d.ts +4 -0
- package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
- package/dist/authoring.mjs +4 -2
- package/dist/authoring.mjs.map +1 -1
- package/dist/chunk-4XINDLAY.mjs +9404 -0
- package/dist/chunk-4XINDLAY.mjs.map +1 -0
- package/dist/chunk-CDTWTHZR.mjs +752 -0
- package/dist/chunk-CDTWTHZR.mjs.map +1 -0
- package/dist/chunk-FJ6P52EE.mjs +46 -0
- package/dist/chunk-FJ6P52EE.mjs.map +1 -0
- package/dist/chunk-JDWARUOI.mjs +44 -0
- package/dist/chunk-JDWARUOI.mjs.map +1 -0
- package/dist/chunk-M2MP4ZOU.mjs +73 -0
- package/dist/chunk-M2MP4ZOU.mjs.map +1 -0
- package/dist/chunk-PCHBPYML.mjs +385 -0
- package/dist/chunk-PCHBPYML.mjs.map +1 -0
- package/dist/chunk-RXZ3RGOU.mjs +53 -0
- package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
- package/dist/{chunk-YEJIUW7D.mjs → chunk-TBQJOK2L.mjs} +356 -543
- package/dist/chunk-TBQJOK2L.mjs.map +1 -0
- package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
- package/dist/chunk-VFPLTKCU.mjs.map +1 -0
- package/dist/components/atmosphere.d.ts +9 -0
- package/dist/components/atmosphere.d.ts.map +1 -0
- package/dist/components/camera.d.ts +2 -1
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/fog.d.ts +8 -0
- package/dist/components/fog.d.ts.map +1 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/motion-blur.d.ts +7 -0
- package/dist/components/motion-blur.d.ts.map +1 -0
- package/dist/components/spot-light.d.ts +12 -0
- package/dist/components/spot-light.d.ts.map +1 -1
- package/dist/construct-renderer.d.ts +2 -2
- package/dist/construct-renderer.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +11146 -14507
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/device-scope.d.ts +4 -0
- package/dist/device/device-scope.d.ts.map +1 -1
- package/dist/device/gpu-residency.d.ts +19 -2
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/environment/frame.d.ts +60 -0
- package/dist/environment/frame.d.ts.map +1 -0
- package/dist/environment/generation.d.ts +21 -0
- package/dist/environment/generation.d.ts.map +1 -0
- package/dist/environment/graph.d.ts +4 -0
- package/dist/environment/graph.d.ts.map +1 -0
- package/dist/environment/inspection.d.ts +48 -0
- package/dist/environment/inspection.d.ts.map +1 -0
- package/dist/environment/lifecycle.d.ts +39 -0
- package/dist/environment/lifecycle.d.ts.map +1 -0
- package/dist/environment/signature.d.ts +25 -0
- package/dist/environment/signature.d.ts.map +1 -0
- package/dist/errors/render.d.ts +204 -1
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/camera.d.ts +5 -0
- package/dist/extract/camera.d.ts.map +1 -0
- package/dist/extract/environment.d.ts +74 -0
- package/dist/extract/environment.d.ts.map +1 -0
- package/dist/extract/visibility.d.ts +1 -1
- package/dist/extract/visibility.d.ts.map +1 -1
- package/dist/features/host.d.ts +9 -2
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
- package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
- package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
- package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
- package/dist/features/plan.d.ts +17 -2
- package/dist/features/plan.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +3 -1
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics.d.ts +2 -1
- package/dist/features/prepared-graphics.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +2 -1
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/targets.d.ts +3 -0
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +12 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +7 -1
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +2 -0
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-usage.d.ts +2 -0
- package/dist/gpu-usage.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +5 -6
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +24 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +6 -4
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +43 -1
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +2 -0
- package/dist/light-buffer-layout.d.ts +20 -12
- package/dist/light-buffer-layout.d.ts.map +1 -1
- package/dist/materials.d.ts +22 -0
- package/dist/materials.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +16 -9
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-pipeline.d.ts +3 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts +48 -0
- package/dist/pipeline/standard-post.d.ts.map +1 -0
- package/dist/pipeline/standard-profile.d.ts +12 -2
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +18 -0
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/record/frame-lighting.d.ts +2 -0
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +137 -6
- 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 +6 -3
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/gpu-timing.d.ts +32 -0
- package/dist/record/gpu-timing.d.ts.map +1 -0
- package/dist/record/main-pass-geometry.d.ts +11 -0
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +9 -6
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +8 -1
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +2 -0
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +81 -19
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +1 -11
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +36 -4
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +4 -1
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/render-contract.d.ts +157 -8
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-data.d.ts +10 -6
- package/dist/render-data.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +86 -6
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +84 -8
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +30 -5
- package/dist/render-system.d.ts.map +1 -1
- package/dist/renderer-inspect.d.ts +29 -0
- package/dist/renderer-inspect.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts +36 -2
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/temporal/coverage.d.ts +42 -0
- package/dist/temporal/coverage.d.ts.map +1 -0
- package/dist/temporal/frame-coordinator.d.ts +99 -0
- package/dist/temporal/frame-coordinator.d.ts.map +1 -0
- package/dist/temporal/frame.d.ts +44 -0
- package/dist/temporal/frame.d.ts.map +1 -0
- package/dist/temporal/gpu.d.ts +39 -0
- package/dist/temporal/gpu.d.ts.map +1 -0
- package/dist/temporal/history.d.ts +37 -0
- package/dist/temporal/history.d.ts.map +1 -0
- package/dist/temporal/index.d.ts +7 -0
- package/dist/temporal/index.d.ts.map +1 -0
- package/dist/temporal/index.mjs +8 -0
- package/dist/temporal/index.mjs.map +1 -0
- package/dist/temporal/inspection.d.ts +36 -0
- package/dist/temporal/inspection.d.ts.map +1 -0
- package/dist/temporal/scene-data-catalog.d.ts +48 -0
- package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
- package/dist/temporal/scene-data.d.ts +43 -0
- package/dist/temporal/scene-data.d.ts.map +1 -0
- package/dist/temporal/standard-scene-data.d.ts +61 -0
- package/dist/temporal/standard-scene-data.d.ts.map +1 -0
- package/dist/temporal/taa-history-resources.d.ts +22 -0
- package/dist/temporal/taa-history-resources.d.ts.map +1 -0
- package/dist/temporal/taa-history-store.d.ts +27 -0
- package/dist/temporal/taa-history-store.d.ts.map +1 -0
- package/dist/temporal/taa-resolve.d.ts +15 -0
- package/dist/temporal/taa-resolve.d.ts.map +1 -0
- package/dist/temporal/temporal-view.d.ts +40 -0
- package/dist/temporal/temporal-view.d.ts.map +1 -0
- package/dist/temporal/transaction.d.ts +9 -0
- package/dist/temporal/transaction.d.ts.map +1 -0
- package/dist/temporal/view.d.ts +56 -0
- package/dist/temporal/view.d.ts.map +1 -0
- package/dist/transmission/backdrop.d.ts +147 -0
- package/dist/transmission/backdrop.d.ts.map +1 -0
- package/dist/transmission/inspection.d.ts +57 -0
- package/dist/transmission/inspection.d.ts.map +1 -0
- package/dist/transmission/oracle.d.ts +42 -0
- package/dist/transmission/oracle.d.ts.map +1 -0
- package/dist/transmission/projection.d.ts +37 -0
- package/dist/transmission/projection.d.ts.map +1 -0
- package/dist/typed-render-graph-primitives.d.ts +30 -2
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-atlas.d.ts +10 -0
- package/dist/typed-shadow-atlas.d.ts.map +1 -0
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/capability.d.ts +57 -0
- package/dist/volume/capability.d.ts.map +1 -0
- package/dist/volume/component.d.ts +61 -0
- package/dist/volume/component.d.ts.map +1 -0
- package/dist/volume/extract.d.ts +11 -0
- package/dist/volume/extract.d.ts.map +1 -0
- package/dist/volume/inspection.d.ts +38 -0
- package/dist/volume/inspection.d.ts.map +1 -0
- package/dist/volume/passes.d.ts +38 -0
- package/dist/volume/passes.d.ts.map +1 -0
- package/dist/volume/recovery.d.ts +38 -0
- package/dist/volume/recovery.d.ts.map +1 -0
- package/dist/volume/resources.d.ts +57 -0
- package/dist/volume/resources.d.ts.map +1 -0
- package/dist/volume/temporal.d.ts +35 -0
- package/dist/volume/temporal.d.ts.map +1 -0
- package/package.json +24 -19
- package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
- package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
- package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
- package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
- package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
- package/src/__tests__/detached-inspection.integration.test.ts +177 -0
- package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
- package/src/__tests__/environment-generation.integration.test.ts +141 -0
- package/src/__tests__/environment-selection.unit.test.ts +245 -0
- package/src/__tests__/factory-contract.integration.test.ts +1380 -9
- package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
- package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
- package/src/__tests__/gpu-scene.unit.test.ts +10 -0
- package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
- package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
- package/src/__tests__/material-cooked-projection.unit.test.ts +18 -146
- package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
- package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
- package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
- package/src/__tests__/public-surface.test-d.ts +15 -1
- package/src/__tests__/render-error-code-owner.test-d.ts +14 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
- package/src/__tests__/render-error-exhaustive.test-d.ts +3 -0
- package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
- package/src/__tests__/render-feature-plan.test-d.ts +22 -89
- package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
- package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
- package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +423 -1
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
- package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
- package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
- package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
- package/src/__tests__/scene-data-contract.test-d.ts +35 -0
- package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
- package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
- package/src/__tests__/shader-manifest-fixture.ts +111 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +123 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
- package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
- package/src/__tests__/standard-profile-oracle.unit.test.ts +12 -2
- package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
- package/src/__tests__/surface-configuration.unit.test.ts +211 -12
- package/src/__tests__/taa-transaction.integration.test.ts +30 -0
- package/src/__tests__/temporal-admission.integration.test.ts +40 -0
- package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
- package/src/__tests__/temporal-demand.unit.test.ts +44 -0
- package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
- package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
- package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
- package/src/__tests__/temporal-performance.integration.test.ts +615 -0
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
- package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
- package/src/__tests__/temporal-view.unit.test.ts +152 -0
- package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
- package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
- package/src/__tests__/visibility-extract.integration.test.ts +27 -1
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
- package/src/__tests__/volume-optics-oracle.unit.test.ts +85 -0
- package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
- package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
- package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
- package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
- package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
- package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
- package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
- package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
- package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
- package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
- package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
- package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
- package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
- package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
- package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
- package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
- package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
- package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
- package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
- package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
- package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
- package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
- package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
- package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
- package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
- package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
- package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
- package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
- package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
- package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
- package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
- package/src/assembly/backend-contract.ts +47 -1
- package/src/assembly/factory.ts +1480 -505
- package/src/assembly/host-contract.ts +4 -0
- package/src/assembly/renderer-frame-transaction.ts +75 -0
- package/src/assembly/renderer-inspection.ts +112 -0
- package/src/assembly/renderer-lifecycle.ts +6 -0
- package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
- package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
- package/src/components/atmosphere.ts +10 -0
- package/src/components/camera.ts +2 -1
- package/src/components/fog.ts +9 -0
- package/src/components/index.ts +3 -0
- package/src/components/light-helpers.ts +4 -0
- package/src/components/motion-blur.ts +8 -0
- package/src/components/spot-light.ts +22 -3
- package/src/construct-renderer.ts +40 -3
- package/src/device/device-scope.ts +15 -1
- package/src/device/gpu-residency.ts +168 -58
- package/src/environment/frame.ts +185 -0
- package/src/environment/generation.ts +23 -0
- package/src/environment/graph.ts +9 -0
- package/src/environment/inspection.ts +87 -0
- package/src/environment/lifecycle.ts +250 -0
- package/src/environment/signature.ts +55 -0
- package/src/errors/render.ts +404 -1
- package/src/extract/camera.ts +78 -0
- package/src/extract/environment.ts +171 -0
- package/src/extract/visibility.ts +38 -19
- package/src/features/host.ts +36 -5
- package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
- package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
- package/src/features/motion-blur/motion-blur-feature.ts +119 -0
- package/src/features/motion-blur/motion-blur-params.ts +89 -0
- package/src/features/plan.ts +32 -3
- package/src/features/prepared-gpu-work.ts +21 -6
- package/src/features/prepared-graphics.ts +2 -1
- package/src/features/render-graph-raster.ts +2 -1
- package/src/features/targets.ts +24 -2
- package/src/features/types.ts +13 -0
- package/src/fullscreen-post-process-pass.ts +34 -4
- package/src/gpu-scene.ts +24 -0
- package/src/gpu-usage.ts +2 -0
- package/src/ibl/skylight-bind-group.ts +30 -38
- package/src/index.ts +104 -7
- package/src/inspection-types.ts +48 -0
- package/src/internal.ts +5 -0
- package/src/light-buffer-layout.ts +59 -26
- package/src/materials.ts +119 -24
- package/src/pbr-pipeline.ts +91 -29
- package/src/pipeline/standard-forward-lane.ts +178 -101
- package/src/pipeline/standard-pipeline.ts +176 -105
- package/src/pipeline/standard-post.ts +373 -0
- package/src/pipeline/standard-profile.ts +26 -3
- package/src/pipeline-builder.ts +102 -12
- package/src/pipeline-spec.ts +9 -0
- package/src/plugin.ts +2 -0
- package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
- package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
- package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
- package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
- package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
- package/src/record/frame-lighting.ts +103 -89
- package/src/record/frame-snapshot.ts +170 -6
- package/src/record/frame-targets.ts +21 -8
- package/src/record/frame.ts +1014 -7
- package/src/record/gpu-timing.ts +224 -0
- package/src/record/main-pass-geometry.ts +86 -40
- package/src/record/main-pass-material.ts +120 -68
- package/src/record/main-pass-sprite-draws.ts +78 -101
- package/src/record/main-pass.ts +77 -4
- package/src/record/mesh-ssbo.ts +22 -3
- package/src/record/render-context.ts +194 -23
- package/src/record/shadow-pass.ts +197 -58
- package/src/record/skybox-post-pass.ts +97 -41
- package/src/record/typed-frame-graph.ts +704 -30
- package/src/record/view-ubo.ts +52 -4
- package/src/render-contract.ts +181 -6
- package/src/render-data.ts +50 -22
- package/src/render-graph-primitives.ts +18 -1
- package/src/render-pipeline.ts +144 -27
- package/src/render-system-extract.ts +522 -72
- package/src/render-system.ts +561 -41
- package/src/renderer-inspect.ts +66 -0
- package/src/scene/render-scene.ts +252 -7
- package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
- package/src/temporal/coverage.ts +76 -0
- package/src/temporal/frame-coordinator.ts +311 -0
- package/src/temporal/frame.ts +128 -0
- package/src/temporal/gpu.ts +287 -0
- package/src/temporal/history.ts +92 -0
- package/src/temporal/index.ts +6 -0
- package/src/temporal/inspection.ts +97 -0
- package/src/temporal/scene-data-catalog.ts +200 -0
- package/src/temporal/scene-data.ts +149 -0
- package/src/temporal/standard-scene-data.ts +182 -0
- package/src/temporal/taa-history-resources.ts +128 -0
- package/src/temporal/taa-history-store.ts +79 -0
- package/src/temporal/taa-resolve.ts +34 -0
- package/src/temporal/temporal-view.ts +169 -0
- package/src/temporal/transaction.ts +17 -0
- package/src/temporal/view.ts +161 -0
- package/src/transmission/__tests__/capability.unit.test.ts +83 -0
- package/src/transmission/__tests__/composition.integration.test.ts +161 -0
- package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
- package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
- package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
- package/src/transmission/__tests__/projection.unit.test.ts +71 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +437 -0
- package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
- package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
- package/src/transmission/backdrop.ts +572 -0
- package/src/transmission/inspection.ts +190 -0
- package/src/transmission/oracle.ts +141 -0
- package/src/transmission/projection.ts +83 -0
- package/src/typed-render-graph-primitives.ts +194 -11
- package/src/typed-shadow-atlas.ts +17 -0
- package/src/typed-shadow-passes.ts +6 -5
- package/src/volume/capability.ts +173 -0
- package/src/volume/component.ts +110 -0
- package/src/volume/extract.ts +21 -0
- package/src/volume/inspection.ts +78 -0
- package/src/volume/passes.ts +680 -0
- package/src/volume/recovery.ts +86 -0
- package/src/volume/resources.ts +236 -0
- package/src/volume/temporal.ts +89 -0
- package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
- package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
- package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
- package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
- package/dist/__tests__/cluster-binner.test.d.ts +0 -2
- package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
- package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
- package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
- package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
- package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
- package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
- package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
- package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
- package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
- package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
- package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
- package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
- package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
- package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
- package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
- package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
- package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
- package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
- package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
- package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
- package/dist/__tests__/public-surface.test-d.d.ts +0 -2
- package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
- package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
- package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
- package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
- package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
- package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
- package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
- package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
- package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
- package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
- package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
- package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
- package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
- package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
- package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
- package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
- package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
- package/dist/chunk-CQXZC5XI.mjs.map +0 -1
- package/dist/chunk-HCOGPHKS.mjs +0 -93
- package/dist/chunk-HCOGPHKS.mjs.map +0 -1
- package/dist/chunk-YEJIUW7D.mjs.map +0 -1
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +0 -2
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +0 -1
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +0 -2
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +0 -1
- package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
- package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
- package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
- package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/bounds.unit.test.d.ts +0 -2
- package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +0 -2
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +0 -2
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts +0 -2
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +0 -2
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/points-lines.bench.d.ts +0 -2
- package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +0 -1
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +0 -2
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +0 -2
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +0 -2
- package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
- package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { vec3 } from '@forgeax/engine-math';
|
|
2
|
+
|
|
3
|
+
// src/record/frame-snapshot.ts
|
|
4
|
+
function worldEntityKey(worldId, entityKey) {
|
|
5
|
+
return worldId * 4294967296 + entityKey;
|
|
6
|
+
}
|
|
7
|
+
var ZERO_CAMERA_CLEAR_FALLBACK = [0, 0, 0, 1];
|
|
8
|
+
var textureIdentities = /* @__PURE__ */ new WeakMap();
|
|
9
|
+
var nextTextureIdentity = 1;
|
|
10
|
+
function getTextureIdentity(texture) {
|
|
11
|
+
const object = texture;
|
|
12
|
+
const existing = textureIdentities.get(object);
|
|
13
|
+
if (existing !== void 0) return existing;
|
|
14
|
+
const identity = nextTextureIdentity++;
|
|
15
|
+
textureIdentities.set(object, identity);
|
|
16
|
+
return identity;
|
|
17
|
+
}
|
|
18
|
+
function validateGraphTargetCaptureReadback(input) {
|
|
19
|
+
const { bytes, expectedByteLength, sentinel } = input;
|
|
20
|
+
if (bytes.byteLength !== expectedByteLength)
|
|
21
|
+
return { ok: false, code: "capture-readback-length" };
|
|
22
|
+
if (sentinel?.every((value, index) => bytes[index] === value)) {
|
|
23
|
+
return { ok: false, code: "capture-readback-untouched-sentinel" };
|
|
24
|
+
}
|
|
25
|
+
if (bytes.every((value) => value === 0)) return { ok: false, code: "capture-readback-empty" };
|
|
26
|
+
for (let index = 0; index + 1 < bytes.length; index += 2) {
|
|
27
|
+
const exponent = (bytes[index + 1] ?? 0) >>> 2 & 31;
|
|
28
|
+
if (exponent === 31) return { ok: false, code: "capture-readback-non-finite" };
|
|
29
|
+
}
|
|
30
|
+
return { ok: true };
|
|
31
|
+
}
|
|
32
|
+
function makeZeroCameraFallbackSnapshot() {
|
|
33
|
+
const identityWorld = new Float32Array(16);
|
|
34
|
+
identityWorld[0] = 1;
|
|
35
|
+
identityWorld[5] = 1;
|
|
36
|
+
identityWorld[10] = 1;
|
|
37
|
+
identityWorld[15] = 1;
|
|
38
|
+
return {
|
|
39
|
+
position: vec3.create(0, 0, 0),
|
|
40
|
+
world: identityWorld,
|
|
41
|
+
fov: Math.PI / 4,
|
|
42
|
+
aspect: 1,
|
|
43
|
+
near: 0.1,
|
|
44
|
+
far: 100,
|
|
45
|
+
// feat-20260613 M6 / w20: synthetic camera defaults to perspective so
|
|
46
|
+
// the CSM extract path stays consistent with the previously-implicit
|
|
47
|
+
// perspective shape (unchanged behavior; explicit field).
|
|
48
|
+
projection: "perspective",
|
|
49
|
+
orthoLeft: -1,
|
|
50
|
+
orthoRight: 1,
|
|
51
|
+
orthoBottom: -1,
|
|
52
|
+
orthoTop: 1,
|
|
53
|
+
tonemap: "none",
|
|
54
|
+
exposure: 1,
|
|
55
|
+
whitePoint: 4,
|
|
56
|
+
antialias: "none",
|
|
57
|
+
bloom: "off",
|
|
58
|
+
bloomThreshold: 1,
|
|
59
|
+
bloomIntensity: 1,
|
|
60
|
+
bloomBlurRadius: 4,
|
|
61
|
+
clearColor: ZERO_CAMERA_CLEAR_FALLBACK
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function clampPcfKernelSize(value) {
|
|
65
|
+
if (value === void 0) return 3;
|
|
66
|
+
if (value <= 1) return 1;
|
|
67
|
+
if (value <= 3) return 3;
|
|
68
|
+
return 5;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { clampPcfKernelSize, getTextureIdentity, makeZeroCameraFallbackSnapshot, validateGraphTargetCaptureReadback, worldEntityKey };
|
|
72
|
+
//# sourceMappingURL=chunk-M2MP4ZOU.mjs.map
|
|
73
|
+
//# sourceMappingURL=chunk-M2MP4ZOU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/record/frame-snapshot.ts"],"names":[],"mappings":"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","file":"chunk-M2MP4ZOU.mjs","sourcesContent":["// @forgeax/engine-runtime - RenderSystem record stage: frame-snapshot.\n// Extracted from render-system-record.ts (feat-20260704 M3/w17, pure move).\n\nimport type { World } from '@forgeax/engine-ecs';\nimport { vec3 } from '@forgeax/engine-math';\nimport type { ResolvedColorTargetDescriptor } from '@forgeax/engine-render-graph';\nimport type { Texture } from '@forgeax/engine-rhi';\nimport type { ClusterBinScratch } from '../cluster-binner';\nimport type { EnvironmentGeneration } from '../environment/generation';\nimport type { EnvironmentLifecycle } from '../environment/lifecycle';\nimport type { GpuBuffer } from '../gpu-resource';\nimport type { TemporalGpuState } from '../temporal/gpu';\nimport type { TemporalView } from '../temporal/view';\n\nexport type TemporalCommitOutcome =\n | { readonly kind: 'none' }\n | { readonly kind: 'off'; readonly view: TemporalView }\n | { readonly kind: 'taa'; readonly view: TemporalView };\n\n/**\n * feat-20260708-composited-multi-world-rendering M1 / D-1 / D-9:\n * worldId-entityKey composite key helper. Formula: `worldId * 2^32 + entityKey`.\n *\n * worldId is the index into `worlds[]` (the `draw` call argument). entityKey\n * is the packed Entity u32 (encodeEntity(indexSlot, generation)) surfaced\n * through `RenderableSnapshot.entityKey`.\n *\n * Key properties:\n * - worldId=0 identity: `worldEntityKey(0, k) === k` — single-world path\n * cache behavior is bit-for-bit unchanged (AC-03 regression guarantee).\n * - JS safe integer: worldId < 2^21 keeps the composite key below\n * Number.MAX_SAFE_INTEGER (2^53).\n * - SSOT: all cache-key compositing consumers import this single helper;\n * no inline `worldId * 2^32 + k` duplication (D-9).\n *\n * @internal — exported for unit test + glyph/tilemap/record consumers;\n * not part of the public @forgeax/engine-runtime API surface.\n */\nexport function worldEntityKey(worldId: number, entityKey: number): number {\n return worldId * 4294967296 + entityKey; // 2^32 = 4294967296\n}\n\n/**\n * Cross-frame cache entry for a material bind group whose source material and\n * all resolved GPU resources are stable. The material snapshot identity is\n * the extract-layer invalidation token; the builder only stores entries after\n * all explicit resource handles resolved to resident GPU objects.\n */\nexport interface MaterialBgAssemblyCacheEntry {\n readonly material: MaterialSnapshot;\n /** Invalidates when a texture/sampler residency identity changes. */\n readonly materialResourceEpoch: number;\n readonly materialBgl: BindGroupLayout;\n /** Buffer identity changes when the shared material capacity grows. */\n readonly materialBuffer: Buffer;\n readonly skylightResources: SkylightBindGroupResources;\n readonly bindGroup: BindGroup;\n}\n\nimport type { CompiledRenderGraph } from '@forgeax/engine-render-graph';\nimport type { BindGroup, BindGroupLayout, Buffer, TextureView } from '@forgeax/engine-rhi';\nimport type { MaterialRenderState, RenderPipelineAsset } from '@forgeax/engine-types';\nimport type { MeshGpuHandles } from '../device/gpu-residency';\nimport type { SkylightBindGroupResources } from '../ibl/skylight-bind-group';\nimport type { InstanceBufferCacheEntry } from '../instance-buffer-cache';\nimport type { CameraSnapshot, VolumetricFogFrameContext } from '../render-contract';\nimport type { RenderPipeline as RenderPipelineDef, RenderPipelineFrame } from '../render-pipeline';\nimport type {\n DispatchEntry,\n MaterialSnapshot,\n PointShadowSnapshot,\n RenderableSnapshot,\n SpotLightSnapshot,\n} from '../render-system-extract';\nimport type { ShadowAtlas } from '../shadow-atlas';\nimport type {\n TemporalFrame,\n TemporalFrameInput,\n TemporalFrameTransaction,\n} from '../temporal/frame';\nimport type { VolumetricFogInspection } from '../volume/inspection';\nimport type { VolumeTemporalSignature } from '../volume/temporal';\n\n/**\n * feat-20260608-create-app-param-surface-trim / M1 / D-8 (q8 user lock):\n * fallback clear color when the world carries no Camera entity. Opaque\n * black `[0, 0, 0, 1]`, replacing the historical\n * `[0.06, 0.06, 0.08, 1.0]` dark-slate sentinel. Single SSOT consumed by\n * the synthetic CameraSnapshot built when `cameras.length === 0`\n * (Case B in `recordFrame`) and read directly by tests\n * (`zero-camera-clear-fallback.test.ts`). AC-05.\n */\nexport const ZERO_CAMERA_CLEAR_FALLBACK: readonly [number, number, number, number] = [0, 0, 0, 1];\n\nexport interface FrameObservationSource {\n readonly texture: Texture;\n readonly descriptor: ResolvedColorTargetDescriptor;\n readonly frameId: number;\n readonly pipelineId: 'forgeax::standard';\n readonly backendId: string;\n}\n\n/** Internal test/diagnostic view of one compiled graph color target. */\nexport interface CurrentGraphTarget {\n readonly name: string;\n readonly texture: Texture;\n /** Stable opaque identity for this RHI handle during the renderer lifetime. */\n readonly textureIdentity: number;\n readonly descriptor: ResolvedColorTargetDescriptor;\n readonly frameId: number;\n /** Monotonic identity of the compiled graph that owns this texture. */\n readonly graphGeneration: number;\n}\n\nconst textureIdentities = new WeakMap<object, number>();\nlet nextTextureIdentity = 1;\n\n/**\n * Project an opaque RHI texture handle to a stable diagnostic identity.\n * RHI handles intentionally expose no serializable fields; object identity is\n * the only valid comparison boundary for a copy-time capture.\n */\nexport function getTextureIdentity(texture: Texture): number {\n const object = texture as object;\n const existing = textureIdentities.get(object);\n if (existing !== undefined) return existing;\n const identity = nextTextureIdentity++;\n textureIdentities.set(object, identity);\n return identity;\n}\n\nexport type GraphTargetCaptureReadbackValidation =\n | { readonly ok: true }\n | {\n readonly ok: false;\n readonly code:\n | 'capture-readback-length'\n | 'capture-readback-untouched-sentinel'\n | 'capture-readback-empty'\n | 'capture-readback-non-finite';\n };\n\n/** Validate a mapped rgba16float capture before a consumer decodes its values. */\nexport function validateGraphTargetCaptureReadback(input: {\n readonly bytes: Uint8Array;\n readonly expectedByteLength: number;\n readonly sentinel?: Uint8Array;\n}): GraphTargetCaptureReadbackValidation {\n const { bytes, expectedByteLength, sentinel } = input;\n if (bytes.byteLength !== expectedByteLength)\n return { ok: false, code: 'capture-readback-length' };\n if (sentinel?.every((value, index) => bytes[index] === value)) {\n return { ok: false, code: 'capture-readback-untouched-sentinel' };\n }\n if (bytes.every((value) => value === 0)) return { ok: false, code: 'capture-readback-empty' };\n for (let index = 0; index + 1 < bytes.length; index += 2) {\n const exponent = ((bytes[index + 1] ?? 0) >>> 2) & 0x1f;\n if (exponent === 0x1f) return { ok: false, code: 'capture-readback-non-finite' };\n }\n return { ok: true };\n}\n\n/** Internal readback request consumed by the record encoder in the same submit. */\nexport interface GraphTargetCaptureRequest {\n readonly name: string;\n readonly buffer: Buffer;\n readonly bytesPerRow: number;\n readonly width: number;\n readonly height: number;\n /** Descriptor contract checked against the resolved target at copy time. */\n readonly expected: {\n readonly format: ResolvedColorTargetDescriptor['format'];\n readonly width: number;\n readonly height: number;\n readonly usage: number;\n /** Optional caller binding; when present it is checked at copy time. */\n readonly identity?: {\n readonly graphGeneration: number;\n readonly frameId: number;\n readonly textureIdentity: number;\n };\n };\n}\n\n/**\n * Build a synthetic CameraSnapshot the record stage uses when the world\n * carries no Camera entity. Identity-shaped projection / view inputs\n * keep the existing matrix math numerically stable; clear-color quartet\n * sourced from `ZERO_CAMERA_CLEAR_FALLBACK` so the swap-chain still\n * paints `[0, 0, 0, 1]` (AI-user friendly observable signal that the\n * `'render-system-no-camera'` diagnostic fired without leaving stale\n * pixels on screen).\n */\nexport function makeZeroCameraFallbackSnapshot(): CameraSnapshot {\n // Identity world mat4 so `mat4.invert(world)` yields identity view.\n const identityWorld = new Float32Array(16);\n identityWorld[0] = 1;\n identityWorld[5] = 1;\n identityWorld[10] = 1;\n identityWorld[15] = 1;\n return {\n position: vec3.create(0, 0, 0),\n world: identityWorld,\n fov: Math.PI / 4,\n aspect: 1,\n near: 0.1,\n far: 100,\n // feat-20260613 M6 / w20: synthetic camera defaults to perspective so\n // the CSM extract path stays consistent with the previously-implicit\n // perspective shape (unchanged behavior; explicit field).\n projection: 'perspective',\n orthoLeft: -1,\n orthoRight: 1,\n orthoBottom: -1,\n orthoTop: 1,\n tonemap: 'none',\n exposure: 1.0,\n whitePoint: 4.0,\n antialias: 'none',\n bloom: 'off',\n bloomThreshold: 1.0,\n bloomIntensity: 1.0,\n bloomBlurRadius: 4.0,\n clearColor: ZERO_CAMERA_CLEAR_FALLBACK,\n };\n}\n\n// feat-20260621-merge-directionallightshadow-into-directionallight M3 / m3-t2\n// (D-7): host-clamp the merged DirectionalLight's pcfKernelSize to the nearest\n// valid odd kernel in {1,3,5} before it reaches the View UBO float [128].\n// lighting-directional.wgsl runs a constant-trip-count loop to MAX_PCF_HALF=2\n// (merged 5.3-production-shadow-demos AC-14 variant-free pattern) and clips each\n// iteration to half = (pcfKernelSize-1)/2, so the supported kernel set is\n// {1,3,5} (cap 5). undefined (no shadow fields) defaults to 3.\nexport function clampPcfKernelSize(value: number | undefined): number {\n if (value === undefined) return 3;\n if (value <= 1) return 1;\n if (value <= 3) return 3;\n return 5;\n}\n\n/**\n * Per-RenderSystem mutable frame state.\n *\n * Owned by the `createRenderSystem` closure; advanced once per\n * `recordFrame` invocation. The `instanceBuffers` map holds the per-entity\n * GPU storage buffers for Instances-bearing entities (cache key = the\n * packed Entity u32 surfaced via `InstancesSnapshot.cacheKey`); entries\n * are recreated when the `archVersion` bumps or `byteLength` changes.\n *\n * feat-20260518-pbr-direct-lighting-mvp M3 / w14 (AC-17 a): the\n * `warnedZeroLightStandard` flag latches the first-frame warning that\n * fires when the world contains a StandardMaterial entity but zero\n * DirectionalLight entries — once latched the next 100 frames suppress\n * the warning so the AI user is not flooded with repeated noise (charter\n * P3 silent failure -> explicit warning at most once per RenderSystem\n * lifetime).\n */\nexport interface RenderFrameState {\n frameNumber: number;\n /** Monotonic compiled-graph identity used by diagnostic readbacks. */\n graphGeneration: number;\n /** Number of successfully submitted TAA frames; failed attempts do not advance it. */\n successfulTemporalFrameIndex?: number;\n /** The renderer-owned accepted-submit temporal fact consumed by consumers. */\n temporalFrame?: TemporalFrame;\n /** The sole transaction that advances temporal history after queue.submit. */\n readonly temporalFrameTransaction: TemporalFrameTransaction;\n /** Staged input is consumed only by the graph submit owner. */\n temporalFrameInput: TemporalFrameInput | undefined;\n /** Optional graph resource lookup used by low-level record helpers and tests. */\n perFrameGraph?: {\n readonly getColorTargetDescriptor: (key: string) => ResolvedColorTargetDescriptor | undefined;\n readonly getColorTargetView: (key: string) => TextureView | undefined;\n readonly getColorTargetTexture: (key: string) => Texture | undefined;\n readonly graphGeneration: number;\n } | null;\n graphTargetCapture?: GraphTargetCaptureRequest | undefined;\n /** Last successfully rendered static directional shadow atlas token. */\n directionalShadowCache: DirectionalShadowCache | null;\n /** Last successfully submitted camera post-process mode. */\n lastSuccessfulBloom: 'off' | 'on';\n /** Bloom record receipts staged by this frame; cleared on abort. */\n bloomFrameReceipts?: BloomFrameReceipts | undefined;\n /** Set by a directional shadow pass when this frame refreshed the atlas. */\n directionalShadowCacheRecorded: boolean;\n /** The sole compiled owner for compute, copy, feature, and raster work. */\n compiledFrameGraph: CompiledRenderGraph<RenderPipelineFrame> | null;\n compiledFrameGraphTopologyKey: string | null;\n /**\n * Last-known-good graph held while a volume topology candidate is tested.\n * The candidate is promoted only after its command buffer is submitted;\n * failed encoding/finish/submit restores this graph and its topology key.\n */\n volumetricFogPreviousGraph: CompiledRenderGraph<RenderPipelineFrame> | null;\n volumetricFogPreviousGraphKey: string | null;\n volumetricFogCandidateGraph: CompiledRenderGraph<RenderPipelineFrame> | null;\n /** Two renderer-owned parameter slots; only the pending slot is writable. */\n volumetricFogParamsBuffers: [Buffer | null, Buffer | null];\n /** Candidate parameter slot, promoted only after queue submission succeeds. */\n volumetricFogParamsPendingSlot: 0 | 1 | null;\n /** Parameter slot consumed by the last accepted volume frame. */\n volumetricFogParamsAcceptedSlot: 0 | 1 | null;\n /** CPU copy of the accepted parameter payload for degraded-frame staging. */\n volumetricFogAcceptedParams: Float32Array | undefined;\n /** CPU copy of the current candidate payload before submit. */\n volumetricFogPendingParams: Float32Array | undefined;\n /** Last candidate/accepted volume projection exposed through inspect(). */\n volumetricFogInspection: VolumetricFogInspection;\n /** Accepted volume POD/context retained while a later candidate degrades. */\n volumetricFogAccepted: import('../render-system-extract').ExtractedVolumetricFog | undefined;\n volumetricFogAcceptedContext: VolumetricFogFrameContext | undefined;\n /** Accepted graph identity and ping-pong slot for temporal volume history. */\n volumetricFogHistoryGraph: CompiledRenderGraph<RenderPipelineFrame> | null;\n volumetricFogHistorySlot: 0 | 1 | null;\n volumetricFogHistorySignature: VolumeTemporalSignature | null;\n readonly retiredCompiledFrameGraphs: Set<CompiledRenderGraph<RenderPipelineFrame>>;\n /** Physical outputs projected by typed graph passes for downstream observers. */\n currentFrameObservationSource: FrameObservationSource | undefined;\n /** Camera antialias mode for the last successfully submitted graph. */\n lastSuccessfulCameraAntialias: CameraSnapshot['antialias'] | undefined;\n /** Staged TAA GPU state is promoted only after queue.submit succeeds. */\n temporalGpuState: TemporalGpuState | undefined;\n /** Last successful TAA GPU state; candidate replacement stays staged until submit. */\n activeTemporalGpuState: TemporalGpuState | undefined;\n /** Submitted temporal generations retained until their queue fence resolves. */\n readonly retiringTemporalGpuStates: Set<TemporalGpuState>;\n /** Last successful projection; candidate frames never overwrite it. */\n lastSuccessfulTemporalView: TemporalView | undefined;\n pendingTemporalCommit: TemporalCommitOutcome;\n /** Staged environment generation is promoted only after queue.submit succeeds. */\n environmentGeneration: EnvironmentGeneration | undefined;\n readonly environmentLifecycle: EnvironmentLifecycle | undefined;\n currentDirectionalShadowView: TextureView | null;\n currentSpotShadowView: TextureView | null;\n readonly instanceBuffers: Map<number, InstanceBufferCacheEntry>;\n /** Per-entity vertex buffers for the Standard CPU morph lane. */\n readonly morphBuffers?: Map<number, MorphBufferCacheEntry>;\n readonly hdrpClusterBinScratch: ClusterBinScratch;\n /** Reusable HDRP cluster output buffers; sized once and grown only if the grid/cap changes. */\n hdrpClusterGridScratch: Uint32Array | null;\n hdrpLightIndexListScratch: Uint32Array | null;\n /** Compute bind group for the optional WebGPU HDRP membership producer. */\n hdrpClusterMembershipBindGroup: BindGroup | null;\n transientInstanceBuffers: InstanceBufferCacheEntry[];\n warnedZeroLightStandard: boolean;\n /**\n * feax-20260608-multi-light-warn-once M3: once-warn latch for multi-light\n * overrun per bucket (directional N>1 / point N>4 / spot N>4). Fires at\n * most once per RenderSystem lifetime per bucket so AI users see a single\n * actionable console.warn without per-frame flooding (charter P3 explicit\n * failure: warn-once preserves signal/noise floor).\n */\n warnedMultiLightDirectional: boolean;\n warnedMultiLightPoint: boolean;\n warnedMultiLightSpot: boolean;\n /**\n * feat-20260630-equirect-kind-internalized-ibl-declarative-skyligh M3 / w19:\n * once-warn latches for >1 Skylight / >1 SkyboxBackground entity. Fire at most\n * once per RenderSystem lifetime so the multi-entity warn (which names the\n * winning entity handle, F-8) does not flood the console every frame.\n */\n warnedMultiSkylight: boolean;\n warnedMultiSkybox: boolean;\n /** feat-20260531-skybox-env-background M3 / w20: once-warn when camera\n * tonemap is 'none' but a SkyboxBackground entity exists. Skybox needs\n * the HDR render target allocated by the tonemap path; without it the\n * skybox pass is skipped (plan-strategy D-2 NOTE). */\n warnedSkyboxTonemapNone: boolean;\n /**\n * Per-handle warn-once anchor for the missing baseColor-texture fallback,\n * shared by every textured material path (sprite / sprite-lit / standard-pbr\n * / pbr-skin / unlit — feat-20260520-2d-sprite-layer-mvp M-3 / w25 seeded it\n * for sprites; feat-future-pbr-missing-texture-fallback-explicit generalised\n * it to PBR/skin so GLB textures that fail to reach the GPU no longer render\n * silently flat). A `Set<number>` keyed by the raw Handle<TextureAsset> id -\n * the writer fires `console.warn` exactly once per missing texture handle per\n * RenderSystem lifetime so AI users see a single actionable message without\n * per-frame log flooding. The set lives across frames so the second frame on\n * the same missing handle stays silent (charter P3 explicit failure:\n * warn-once preserves signal / noise floor while structured RhiError below\n * stays per-frame fire).\n *\n * Note on the WeakSet/Set choice: plan-strategy mentions WeakSet but\n * Handle values are numeric brand u32s (not object references), so\n * WeakSet<object> is not applicable; Set<number> gives identical\n * warn-once-per-handle semantics at zero additional cost (charter F1\n * minimal surface; the per-RenderSystem lifetime cap is the upper\n * bound).\n */\n readonly warnedMissingBaseColorTextureHandles: Set<number>;\n /**\n * feat-20260527-sprite-nineslice M2 / w11 + M4 / w16 (AC-16): once-per-\n * renderable guard for the `nineslice.scale-too-small` metric increment.\n * Keyed by `renderableIndex` so the second frame on the same mis-scaled\n * entity does NOT keep bumping the counter — AI users see one counter\n * tick per offending entity per RenderSystem lifetime, matching the\n * single-event semantics of the structured fail-fast (charter P3:\n * machine-readable signal, not a per-frame inflation). M4 retired the\n * placeholder console.warn; the increment lands on the per-Renderer\n * EngineMetrics through `runtime.metrics.increment(...)`.\n */\n readonly warnedNineSliceScaleEntities: Set<number>;\n /**\n * feat-20260630-equirect-kind-internalized-ibl-declarative-skyligh M3 / w18:\n * per-handle fire-once anchor for the lazy equirect-to-cubemap projection\n * failure. A `Set<number>` keyed by the raw Handle<EquirectAsset> id - the\n * record arm fires the structured `EquirectProjectionFailedError` exactly\n * once per failed source per RenderSystem lifetime (the store records\n * `status:'failed'` permanently and never retries, R-2 / AC-09; without this\n * latch the record arm would re-fire the error every frame). The set lives\n * across frames so the second frame on the same failed handle stays silent\n * (charter P3: warn-once preserves signal / noise floor).\n */\n readonly firedEquirectProjectionFailedHandles: Set<number>;\n /**\n * feat-20260622-handle-to-id-allocator-elimination M1 / w3: per-frame\n * bind group caches converted to nested WeakMap chain roots (D-3).\n * Each root is a WeakMap<object, WeakMap<...>> walked by\n * getOrCreateFromChain; the chain depth varies by variant\n * (view-main = 7, mesh = 1, hdrp-unified = 5, skin = 2).\n * Roots are stable between device recoveries and replaced when the renderer\n * swaps to a fresh device. Chain keys are always inner buffer handles, never\n * wrappers (D-3).\n */\n viewBindGroupCache: WeakMap<object, unknown>;\n meshBindGroupCache: WeakMap<object, unknown>;\n /**\n * feat-20260622-handle-to-id-allocator-elimination M1 / w2: per-entity\n * bind group caches scoped by entityKey (packed u32 as number).\n * Outer Map<number, WeakMap<handle, ...>> lets GC collect entries for\n * destroyed entities whose handles are unreachable; per-entity material\n * and instances share the same two-level shape (D-1). The inner WeakMap\n * value is opaque (`unknown`) because `getOrCreateFromChain` walks a\n * variable-depth chain — intermediate handles map to nested WeakMaps and\n * only the final handle maps to the variant->BindGroup leaf Map. Direct\n * readers (HDRP shadow-instances read end) assert the leaf shape locally.\n */\n /**\n * feat-20260708-composited-multi-world-rendering M1 / D-1a #2: outer Map\n * keyed by `worldEntityKey(worldId, entityKey)`. Inner WeakMap unchanged.\n */\n readonly materialBgPerEntity: Map<number, WeakMap<object, unknown>>;\n /**\n * feat-20260708-composited-multi-world-rendering M1 / D-1a #3: outer Map\n * keyed by `worldEntityKey(worldId, entityKey)`. Inner WeakMap unchanged.\n */\n readonly instancesBgPerEntity: Map<number, WeakMap<object, unknown>>;\n /** Identity-keyed instances BGs shared across entities using the same buffer. */\n readonly instancesBgShared: WeakMap<object, unknown>;\n /**\n * feat-20260622-handle-to-id-allocator-elimination M1 / w2: cross-entity\n * shared material bind group cache (OQ-1 option A). Outer key is the\n * material shaderId string; inner chain is a WeakMap keyed by the same\n * handle objects used in per-entity chains. Reuses the generic\n * `getOrCreatePerEntity` helper with outerKey string|number (D-1).\n */\n readonly materialBgShared: Map<string, WeakMap<object, unknown>>;\n /** Cross-frame fast path for fully-resident, immutable material snapshots. */\n readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;\n /**\n * feat-20260622-handle-to-id-allocator-elimination M1 / w2: singleton\n * material bind group cache (D-6). Single flat Map<variant, BindGroup>\n * for the one true singleton in production: shadow-material-singleton.\n * shadow-instances-singleton is a test fixture fiction (research F3);\n * no second singleton field is needed.\n */\n readonly singletonMaterialCache: Map<string, BindGroup>;\n /**\n * Post-process bind group cache: nested WeakMap chain root shared by the\n * built-in bloom (bright / blur-H / blur-V / composite), FXAA, and HDRP SSAO\n * (calc / blur) fullscreen passes. Each of these passes samples graph-owned\n * transient render targets (hdrColor / ldrColor / bloom* / ssaoRaw /\n * gbuf0 / hdrDepth); on canvas resize the graph retires the old physical\n * textures and allocates new ones, so the bind group must be rebuilt to\n * reference the new TextureView identity. Keying the cache on the physical\n * TextureView (or `::tex` texture handle for passes that recreate their bound\n * view every frame) makes invalidation automatic: a resized target yields a\n * new key object -> WeakMap miss -> factory rebuild, and dead views are GC'd\n * (same identity-invalidation mechanism as view/mesh caches, D-3). Replaces\n * the pre-fix `pp.*BindGroup === null` single-slot caches that never\n * invalidated on resize and submitted destroyed textures.\n */\n postProcessBgCache: WeakMap<object, unknown>;\n /**\n * Raw handle of the currently installed RenderPipelineAsset (0 = builtin).\n * Installation brands the next candidate topology; the prior compiled graph\n * remains last-known-good until the candidate compiles successfully.\n */\n installedPipelineHandle: number;\n /**\n * Active topology declaration resolved from the pipeline registry.\n */\n activePipeline: RenderPipelineDef;\n /**\n * Install-time config projected into `RenderPipelineTopology.config`.\n */\n installedPipelineConfig: RenderPipelineAsset['config'];\n /**\n * Whether the configured standard graph resolved to the clustered lane.\n * Capability gating keeps URP forward bindings on WebGL2 fallback even\n * when a clustered profile was requested.\n */\n isHdrpActive: boolean;\n /**\n * feat-20260608-cluster-lighting M5 / w20 + M6 / w23 + M5 / w22:\n * once-per-frame fire dedup set for HDRP per-frame fail-soft errors\n * (`hdrp-light-budget-exceeded`, `hdrp-index-list-overflow`). Cleared\n * at the end of each frame so the next frame re-fires if the condition\n * persists. Set<string> keyed by RuntimeErrorCode literal.\n */\n hdrpOncePerFrameFired: Set<string>;\n /**\n * feat-20260612-point-light-shadows-urp-hdrp M3 / T-M3-2 (plan-strategy §D-1).\n * Lazily-allocated cube_array shadow atlas owned by the RenderSystem\n * lifetime. `null` until the first frame whose `lights.pointShadow` is\n * non-empty (zero-shadow scenes never allocate; AC-09). The atlas is\n * disposed by the renderer dispose path; subsequent frames with a non-empty\n * snapshot list re-allocate.\n */\n pointShadowAtlas: ShadowAtlas | null;\n /**\n * feat-20260612-point-light-shadows-urp-hdrp M3 / T-M3-2 (plan-strategy §D-3):\n * per-frame projection of `lights.pointShadow` from the extract stage. The\n * typed point-shadow pass reads this list to drive the 6 x N face iteration.\n * Empty array means the topology declares no point-shadow passes.\n */\n pointShadowSnapshots: readonly PointShadowSnapshot[];\n /**\n * feat-20260622-chunk-gpu-instancing-sprite-tilemap M1 / w4 (D-1):\n * last fold-pass output, computed at `recordFrame` entry from the\n * transparent-sort-ordered dispatch + mode-gate (D-5: only mode 0\n * folds; other modes yield singleton buckets). Currently an\n * observational compute — the drawIndexed swap (1 instanced draw per\n * fold bucket) is the follow-on integration that wires each bucket\n * into the sprite-pass / geometry-pass dispatch loops. The bucket\n * count is the source of truth for `render.instancing.foldedDraws`\n * metric (M3 / w13) — every fold-eligible bucket (bucketSize >= 1\n * under mode 0 AND not bypassed) contributes one increment.\n */\n lastFoldBucketCount: number;\n /**\n * feat-20260625-spot-light-shadow-mapping M2 / w9 (D-2): per-frame projection\n * of `lights.spot` from the extract stage. The typed spot-shadow graph\n * pass reads this list to render each\n * castShadow spot's perspective depth into its `spotShadowDepth` atlas tile\n * (viewport keyed on `shadowAtlasTile`). `recordFrame` writes it before\n * graph execution. Spots with `shadowAtlasTile < 0` (castShadow:false,\n * degenerate direction, or clipped beyond cap 4) are skipped — zero\n * shadow-casting spots means zero spot shadow passes (AC-03).\n */\n spotShadowSnapshots: readonly SpotLightSnapshot[];\n}\n\nexport interface MorphBufferCacheEntry {\n readonly buffer: GpuBuffer;\n readonly byteLength: number;\n}\n\n/**\n * feat-20260518-pbr-direct-lighting-mvp M5 / w22.11 (D-2 + D-10 + AC-06):\n * mutable per-frame dispatch counter object owned by `createRenderSystem`\n * and bumped here at the actual `pass.setPipeline(...)` call site (the\n * only point with both `mat.materialShaderId` and `mesh.layoutProjection` in scope).\n * Unlit / custom shader pipeline dispatch tracked here.\n */\nexport interface DispatchCounts {\n unlit: number;\n /** feat-20260523 M4-T07: 'standard' counter removed; schema-driven\n * materials are tracked via materialShaderId in the pipeline cache. */\n}\n\n/**\n * feat-20260531-per-frame-bind-group-cache M1 / w4: per-frame\n * createBindGroup counter. Closure-mutable object aligned with\n * DispatchCounts precedent. Reset in draw(world) entry, bumped on\n * cache-miss createBindGroup calls (M2-M4).\n */\nexport interface BindGroupCounts {\n createBindGroup: number;\n /**\n * Debug-only: records the variant of every cache-miss BindGroup created via\n * `getOrCreateFromChain` for unit-test observability. Production paths do\n * not read this array.\n */\n keys: string[];\n}\n\n/**\n * Successful Bloom record operations staged for the current frame. These\n * counters are promoted only after the shared renderer queue submission.\n */\nexport interface BloomFrameReceipts {\n readonly uploadCount: number;\n readonly bindGroupCount: number;\n readonly encodeCount: number;\n}\n\n/**\n * A renderable resolved against the AssetRegistry for the current frame:\n * its source snapshot, the GPU mesh handles, the row index used to correlate\n * transparent-sort output back to this entry, and an optional per-material\n * renderState override (bug-20260527-renderstate-pipeline-dispatch-gap D-4).\n * Module-scoped so RenderPipelineContext can type `validated` / `validatedOrdered`\n * without a dynamic type escape (was a recordFrame-local interface before F-4).\n */\nexport interface ValidatedRenderable {\n readonly source: RenderableSnapshot;\n /** World that owns the renderable's asset handles and material snapshots. */\n readonly world?: World;\n readonly mesh: MeshGpuHandles;\n readonly renderableIndex: number;\n readonly renderState: MaterialRenderState | undefined;\n /**\n * Canonical authored material-variant request folded from the selected\n * pass's `defines` map. Capability axes are merged at the renderer seam;\n * this field carries only the pass-owned selection into record.\n */\n readonly variantSet?: string | undefined;\n /**\n * w10: per-pass stencil reference value folded from\n * {@link DispatchEntry.stencilReference} (draw-call dynamic state). The draw\n * loop calls `pass.setStencilReference(stencilReference ?? 0)` before each\n * draw; `undefined` falls back to the WebGPU default 0 (semantic no-op).\n */\n readonly stencilReference: number | undefined;\n}\n\n/**\n * Cross-frame validity token for the directional shadow atlas.\n *\n * The atlas is a render target, not authored state. Keeping its validity\n * token beside the other RenderFrameState caches lets recordFrame skip a\n * static caster submission without teaching the public render-pipeline\n * contract about caching. Every source that can change caster depth is part\n * of the token: world mutation, asset catalogue, graph/target identity, CSM\n * matrices, and the GPU mesh-residency epoch.\n *\n * @internal\n */\nexport interface DirectionalShadowCache {\n readonly worlds: readonly World[];\n readonly worldStateTokens: readonly DirectionalShadowWorldState[];\n readonly assetCatalogEpoch: number;\n readonly pipelineHandle: number;\n readonly graphTopologyKey: string | null;\n readonly shadowMapSize: number;\n readonly cascadeCount: number;\n readonly lightViewProj: readonly Float32Array[];\n readonly meshResidencyEpoch: number;\n}\n\n/**\n * ECS state that can change the contents of a directional shadow map.\n *\n * The ECS-owned RenderReadLease is the only render-facing mutation boundary.\n * Its cursor is intentionally conservative: any published World change\n * invalidates the cached atlas, while render never reaches through World for\n * component-clock storage.\n */\nexport interface DirectionalShadowWorldState {\n readonly worldIdentity: string;\n readonly changeCursor: number;\n}\n"]}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import { mat4 } from '@forgeax/engine-math';
|
|
2
|
+
import { ok, err } from '@forgeax/engine-types';
|
|
3
|
+
|
|
4
|
+
// src/temporal/coverage.ts
|
|
5
|
+
function createTemporalCoverage(width, height) {
|
|
6
|
+
if (!Number.isSafeInteger(width) || width <= 0) throw new RangeError("width must be positive.");
|
|
7
|
+
if (!Number.isSafeInteger(height) || height <= 0)
|
|
8
|
+
throw new RangeError("height must be positive.");
|
|
9
|
+
return Object.freeze({ width, height, bytes: 32 * width * height, fullScreen: true });
|
|
10
|
+
}
|
|
11
|
+
function classifySceneDataCoverage(input) {
|
|
12
|
+
const exactContributorIds = input.contributors.filter((c) => c.kind === "exact").map((c) => c.id);
|
|
13
|
+
const reactiveContributorIds = input.contributors.filter((c) => c.kind === "reactive").map((c) => c.id);
|
|
14
|
+
const available = new Set(input.contributors.map((c) => c.id));
|
|
15
|
+
const missing = input.requiredContributorIds.filter((id) => !available.has(id));
|
|
16
|
+
return {
|
|
17
|
+
exactContributorIds: Object.freeze(exactContributorIds),
|
|
18
|
+
reactiveContributorIds: Object.freeze(reactiveContributorIds),
|
|
19
|
+
missingContributorIds: Object.freeze(missing.slice(0, 32)),
|
|
20
|
+
omittedMissingContributorCount: Math.max(0, missing.length - 32),
|
|
21
|
+
complete: missing.length === 0
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function scanSceneDataCoverage(input) {
|
|
25
|
+
const classification = classifySceneDataCoverage({
|
|
26
|
+
contributors: input.contributorIds.map((id) => ({ id, kind: "exact" })),
|
|
27
|
+
requiredContributorIds: input.requiredContributorIds
|
|
28
|
+
});
|
|
29
|
+
return Object.freeze({
|
|
30
|
+
schema: input.schema,
|
|
31
|
+
lane: input.lane,
|
|
32
|
+
producerId: input.producerId,
|
|
33
|
+
...classification,
|
|
34
|
+
contributorIds: Object.freeze([...input.contributorIds])
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
var TEMPORAL_JITTER_SAMPLE_COUNT = 8;
|
|
38
|
+
function temporalViewId(worldId, entityKey) {
|
|
39
|
+
const raw = entityKey >>> 0;
|
|
40
|
+
const index = raw & 16777215;
|
|
41
|
+
const generation = raw >>> 24 & 255;
|
|
42
|
+
return `${worldId}:${index}:${generation}`;
|
|
43
|
+
}
|
|
44
|
+
function halton(index, base) {
|
|
45
|
+
let result = 0;
|
|
46
|
+
let fraction = 1 / base;
|
|
47
|
+
let value = index;
|
|
48
|
+
while (value > 0) {
|
|
49
|
+
result += fraction * (value % base);
|
|
50
|
+
value = Math.floor(value / base);
|
|
51
|
+
fraction /= base;
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
function temporalJitterSample(temporalFrameIndex) {
|
|
56
|
+
const sampleIndex = (Math.trunc(temporalFrameIndex) % TEMPORAL_JITTER_SAMPLE_COUNT + TEMPORAL_JITTER_SAMPLE_COUNT) % TEMPORAL_JITTER_SAMPLE_COUNT;
|
|
57
|
+
const haltonIndex = sampleIndex + 1;
|
|
58
|
+
return [halton(haltonIndex, 2) - 0.5, halton(haltonIndex, 3) - 0.5];
|
|
59
|
+
}
|
|
60
|
+
function temporalJitterUv(temporalFrameIndex, surfaceWidth, surfaceHeight) {
|
|
61
|
+
const sample = temporalJitterSample(temporalFrameIndex);
|
|
62
|
+
return [sample[0] / Math.max(1, surfaceWidth), sample[1] / Math.max(1, surfaceHeight)];
|
|
63
|
+
}
|
|
64
|
+
function cameraProjection(camera) {
|
|
65
|
+
const projection = mat4.create();
|
|
66
|
+
if (camera.projection === "orthographic") {
|
|
67
|
+
mat4.orthographic(
|
|
68
|
+
projection,
|
|
69
|
+
camera.orthoLeft,
|
|
70
|
+
camera.orthoRight,
|
|
71
|
+
camera.orthoBottom,
|
|
72
|
+
camera.orthoTop,
|
|
73
|
+
camera.near,
|
|
74
|
+
camera.far
|
|
75
|
+
);
|
|
76
|
+
} else {
|
|
77
|
+
mat4.perspective(projection, camera.fov, camera.aspect, camera.near, camera.far);
|
|
78
|
+
}
|
|
79
|
+
return projection;
|
|
80
|
+
}
|
|
81
|
+
function resetReason(current, viewId, previous) {
|
|
82
|
+
if (previous === void 0) return "first-frame";
|
|
83
|
+
if (previous.viewId !== viewId) return "camera-switch";
|
|
84
|
+
if (previous.historyVersion !== (current.historyVersion ?? 0)) {
|
|
85
|
+
return "history-version-changed";
|
|
86
|
+
}
|
|
87
|
+
if (previous.projection !== current.projection) return "projection-kind-changed";
|
|
88
|
+
if (!Object.is(previous.near, current.near) || !Object.is(previous.far, current.far)) {
|
|
89
|
+
return "projection-range-changed";
|
|
90
|
+
}
|
|
91
|
+
return void 0;
|
|
92
|
+
}
|
|
93
|
+
function projectTemporalView(input) {
|
|
94
|
+
const { camera } = input;
|
|
95
|
+
const viewId = temporalViewId(camera.worldId ?? 0, camera.entityKey ?? 0);
|
|
96
|
+
const currentJitterUv = temporalJitterUv(
|
|
97
|
+
input.temporalFrameIndex,
|
|
98
|
+
input.surfaceWidth,
|
|
99
|
+
input.surfaceHeight
|
|
100
|
+
);
|
|
101
|
+
const view = mat4.invert(mat4.create(), camera.world);
|
|
102
|
+
const projection = cameraProjection(camera);
|
|
103
|
+
const currentUnjitteredViewProjection = mat4.multiply(mat4.create(), projection, view);
|
|
104
|
+
const clipJitter = mat4.identity(mat4.create());
|
|
105
|
+
clipJitter[12] = currentJitterUv[0] * 2;
|
|
106
|
+
clipJitter[13] = currentJitterUv[1] * -2;
|
|
107
|
+
const jitteredProjection = mat4.multiply(mat4.create(), clipJitter, projection);
|
|
108
|
+
const currentJitteredViewProjection = mat4.multiply(mat4.create(), jitteredProjection, view);
|
|
109
|
+
const reason = resetReason(camera, viewId, input.lastSubmitted);
|
|
110
|
+
const historyValid = reason === void 0;
|
|
111
|
+
return {
|
|
112
|
+
viewId,
|
|
113
|
+
historyVersion: camera.historyVersion ?? 0,
|
|
114
|
+
temporalFrameIndex: input.temporalFrameIndex,
|
|
115
|
+
historyValid,
|
|
116
|
+
resetReason: reason,
|
|
117
|
+
currentJitterUv,
|
|
118
|
+
previousJitterUv: historyValid ? input.lastSubmitted?.jitterUv ?? currentJitterUv : currentJitterUv,
|
|
119
|
+
currentJitteredViewProjection,
|
|
120
|
+
currentUnjitteredViewProjection,
|
|
121
|
+
previousUnjitteredViewProjection: historyValid ? input.lastSubmitted?.unjitteredViewProjection ?? currentUnjitteredViewProjection : currentUnjitteredViewProjection,
|
|
122
|
+
projection: camera.projection,
|
|
123
|
+
near: camera.near,
|
|
124
|
+
far: camera.far
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function snapshotSubmittedTemporalView(view) {
|
|
128
|
+
return {
|
|
129
|
+
viewId: view.viewId,
|
|
130
|
+
historyVersion: view.historyVersion,
|
|
131
|
+
projection: view.projection,
|
|
132
|
+
near: view.near,
|
|
133
|
+
far: view.far,
|
|
134
|
+
jitterUv: [view.currentJitterUv[0], view.currentJitterUv[1]],
|
|
135
|
+
unjitteredViewProjection: new Float32Array(view.currentUnjitteredViewProjection)
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// src/temporal/taa-history-store.ts
|
|
140
|
+
var TaaHistoryStore = class {
|
|
141
|
+
generation = 0;
|
|
142
|
+
seed = 0;
|
|
143
|
+
valid = false;
|
|
144
|
+
attempt = "none";
|
|
145
|
+
resetReason;
|
|
146
|
+
begin(reason = void 0) {
|
|
147
|
+
const generation = this.generation;
|
|
148
|
+
const seed = this.seed;
|
|
149
|
+
this.attempt = "active";
|
|
150
|
+
let state = "active";
|
|
151
|
+
return {
|
|
152
|
+
generation,
|
|
153
|
+
seed,
|
|
154
|
+
commit: () => {
|
|
155
|
+
if (state !== "active") return;
|
|
156
|
+
state = "committed";
|
|
157
|
+
this.attempt = "committed";
|
|
158
|
+
this.valid = true;
|
|
159
|
+
this.generation += 1;
|
|
160
|
+
this.seed += 1;
|
|
161
|
+
this.resetReason = reason;
|
|
162
|
+
},
|
|
163
|
+
abort: () => {
|
|
164
|
+
if (state !== "active") return;
|
|
165
|
+
state = "aborted";
|
|
166
|
+
this.attempt = "aborted";
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
seedHistory(reason = "first-frame") {
|
|
171
|
+
this.valid = false;
|
|
172
|
+
this.resetReason = reason;
|
|
173
|
+
this.attempt = "none";
|
|
174
|
+
}
|
|
175
|
+
reset(reason) {
|
|
176
|
+
this.generation = 0;
|
|
177
|
+
this.seed = 0;
|
|
178
|
+
this.valid = false;
|
|
179
|
+
this.attempt = "none";
|
|
180
|
+
this.resetReason = reason;
|
|
181
|
+
}
|
|
182
|
+
inspect() {
|
|
183
|
+
return {
|
|
184
|
+
generation: this.generation,
|
|
185
|
+
seed: this.seed,
|
|
186
|
+
attempt: this.attempt,
|
|
187
|
+
valid: this.valid,
|
|
188
|
+
resetReason: this.resetReason
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
// src/temporal/frame-coordinator.ts
|
|
194
|
+
function failure(code, hint) {
|
|
195
|
+
return {
|
|
196
|
+
code,
|
|
197
|
+
expected: code === "taa-unavailable" ? "TAA resources and capability are available" : "one temporal frame is active",
|
|
198
|
+
hint
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
var TemporalFrameCoordinator = class {
|
|
202
|
+
historyStore;
|
|
203
|
+
epoch;
|
|
204
|
+
previous;
|
|
205
|
+
active;
|
|
206
|
+
attempt = "none";
|
|
207
|
+
historyAttempt = "none";
|
|
208
|
+
lastFailure;
|
|
209
|
+
historyDirection = "a-to-b";
|
|
210
|
+
temporalFrameIndex = 0;
|
|
211
|
+
lastSubmittedView;
|
|
212
|
+
coverage = {
|
|
213
|
+
exactContributorIds: [],
|
|
214
|
+
reactiveContributorIds: [],
|
|
215
|
+
missingContributorIds: [],
|
|
216
|
+
omittedMissingContributorCount: 0
|
|
217
|
+
};
|
|
218
|
+
historyAttempts = /* @__PURE__ */ new WeakMap();
|
|
219
|
+
constructor(initial = {}) {
|
|
220
|
+
this.historyStore = initial.historyStore ?? new TaaHistoryStore();
|
|
221
|
+
this.epoch = initial.epoch ?? 0;
|
|
222
|
+
this.previous = initial.previous;
|
|
223
|
+
}
|
|
224
|
+
begin(input) {
|
|
225
|
+
const demanded = input.antialias === "taa" || input.temporalDemand === true;
|
|
226
|
+
if (!demanded) {
|
|
227
|
+
return ok({
|
|
228
|
+
epoch: this.epoch,
|
|
229
|
+
current: input.current,
|
|
230
|
+
previous: this.previous,
|
|
231
|
+
history: { direction: this.historyDirection, valid: false },
|
|
232
|
+
contributors: Object.freeze([...input.contributors ?? []]),
|
|
233
|
+
requiredContributorIds: Object.freeze([...input.requiredContributorIds ?? []]),
|
|
234
|
+
...input.temporalView === void 0 ? {} : { temporalView: input.temporalView }
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
if (input.available === false) {
|
|
238
|
+
return err(
|
|
239
|
+
failure("taa-unavailable", "enable rgba16float temporal targets and retry the frame")
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
if (this.active !== void 0) {
|
|
243
|
+
return err(
|
|
244
|
+
failure(
|
|
245
|
+
"temporal-active",
|
|
246
|
+
"commit or abort the active temporal frame before beginning another"
|
|
247
|
+
)
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
const candidate = {
|
|
251
|
+
epoch: this.epoch + 1,
|
|
252
|
+
current: input.current,
|
|
253
|
+
previous: this.previous,
|
|
254
|
+
history: { direction: this.historyDirection, valid: this.previous !== void 0 },
|
|
255
|
+
contributors: Object.freeze([...input.contributors ?? []]),
|
|
256
|
+
requiredContributorIds: Object.freeze([...input.requiredContributorIds ?? []]),
|
|
257
|
+
...input.temporalView === void 0 ? {} : { temporalView: input.temporalView }
|
|
258
|
+
};
|
|
259
|
+
if (input.antialias === "taa") {
|
|
260
|
+
this.historyAttempts.set(candidate, this.historyStore.begin());
|
|
261
|
+
}
|
|
262
|
+
this.active = candidate;
|
|
263
|
+
this.attempt = "active";
|
|
264
|
+
this.historyAttempt = input.antialias === "taa" ? "active" : "none";
|
|
265
|
+
this.lastFailure = void 0;
|
|
266
|
+
return ok(candidate);
|
|
267
|
+
}
|
|
268
|
+
commit(candidate) {
|
|
269
|
+
if (this.active !== candidate) {
|
|
270
|
+
return err(failure("temporal-not-active", "commit the candidate returned by begin"));
|
|
271
|
+
}
|
|
272
|
+
this.epoch = candidate.epoch;
|
|
273
|
+
this.previous = candidate.current;
|
|
274
|
+
if (candidate.temporalView !== void 0) {
|
|
275
|
+
this.lastSubmittedView = snapshotSubmittedTemporalView(candidate.temporalView);
|
|
276
|
+
this.temporalFrameIndex += 1;
|
|
277
|
+
}
|
|
278
|
+
this.historyDirection = candidate.history.direction === "a-to-b" ? "b-to-a" : "a-to-b";
|
|
279
|
+
const historyAttempt = this.historyAttempts.get(candidate);
|
|
280
|
+
historyAttempt?.commit();
|
|
281
|
+
this.coverage = classifySceneDataCoverage({
|
|
282
|
+
contributors: candidate.contributors,
|
|
283
|
+
requiredContributorIds: candidate.requiredContributorIds
|
|
284
|
+
});
|
|
285
|
+
this.active = void 0;
|
|
286
|
+
historyAttempt?.abort();
|
|
287
|
+
this.historyAttempts.delete(candidate);
|
|
288
|
+
this.attempt = "committed";
|
|
289
|
+
this.historyAttempt = historyAttempt === void 0 ? "none" : "committed";
|
|
290
|
+
return ok({
|
|
291
|
+
epoch: this.epoch,
|
|
292
|
+
previous: candidate.current,
|
|
293
|
+
historyDirection: candidate.history.direction
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
abort(candidate, stage = "submit") {
|
|
297
|
+
if (this.active !== candidate) return;
|
|
298
|
+
this.historyAttempts.get(candidate)?.abort();
|
|
299
|
+
this.historyAttempts.delete(candidate);
|
|
300
|
+
this.active = void 0;
|
|
301
|
+
this.attempt = "aborted";
|
|
302
|
+
this.historyAttempt = "aborted";
|
|
303
|
+
this.lastFailure = stage;
|
|
304
|
+
}
|
|
305
|
+
run(input, phases) {
|
|
306
|
+
const started = this.begin(input);
|
|
307
|
+
if (!started.ok) return started;
|
|
308
|
+
const candidate = started.value;
|
|
309
|
+
if (input.antialias !== "taa" && input.temporalDemand !== true) return ok(void 0);
|
|
310
|
+
try {
|
|
311
|
+
const built = phases.build();
|
|
312
|
+
phases.encode(built);
|
|
313
|
+
phases.finish();
|
|
314
|
+
phases.submit();
|
|
315
|
+
} catch (cause) {
|
|
316
|
+
const stage = this.stageFromError(cause);
|
|
317
|
+
this.abort(candidate, stage);
|
|
318
|
+
return err({
|
|
319
|
+
code: "temporal-not-active",
|
|
320
|
+
expected: `temporal ${stage} succeeds before commit`,
|
|
321
|
+
hint: "inspect the underlying stage failure and retry the frame",
|
|
322
|
+
detail: { stage, cause }
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
return this.commit(candidate);
|
|
326
|
+
}
|
|
327
|
+
inspect() {
|
|
328
|
+
return {
|
|
329
|
+
epoch: this.epoch,
|
|
330
|
+
previous: this.previous,
|
|
331
|
+
historyAttempt: this.historyAttempt,
|
|
332
|
+
attempt: this.attempt,
|
|
333
|
+
lastFailure: this.lastFailure,
|
|
334
|
+
coverage: this.coverage
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Derive the current/previous camera matrices without mutating history.
|
|
339
|
+
* `commit()` is the only operation that publishes the returned view, so a
|
|
340
|
+
* graph/finish/submit failure leaves the last successful view intact.
|
|
341
|
+
*/
|
|
342
|
+
prepareTemporalView(camera, surfaceWidth, surfaceHeight) {
|
|
343
|
+
const demanded = camera.antialias === "taa" || camera.motionBlur?.shutterAngle !== void 0 && camera.motionBlur.shutterAngle > 0;
|
|
344
|
+
if (!demanded) return void 0;
|
|
345
|
+
return projectTemporalView({
|
|
346
|
+
camera,
|
|
347
|
+
temporalFrameIndex: this.temporalFrameIndex,
|
|
348
|
+
surfaceWidth,
|
|
349
|
+
surfaceHeight,
|
|
350
|
+
...this.lastSubmittedView === void 0 ? {} : { lastSubmitted: this.lastSubmittedView }
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
reset(reason = "recover") {
|
|
354
|
+
this.active = void 0;
|
|
355
|
+
this.epoch = 0;
|
|
356
|
+
this.previous = void 0;
|
|
357
|
+
this.temporalFrameIndex = 0;
|
|
358
|
+
this.lastSubmittedView = void 0;
|
|
359
|
+
this.historyDirection = "a-to-b";
|
|
360
|
+
this.historyStore.reset(
|
|
361
|
+
reason === "cut" || reason === "camera-switch" ? "camera-cut" : reason === "resize" ? "resize" : reason === "device-generation" || reason === "device-loss" ? "device-generation" : "recover"
|
|
362
|
+
);
|
|
363
|
+
this.attempt = "none";
|
|
364
|
+
this.historyAttempt = "none";
|
|
365
|
+
this.lastFailure = void 0;
|
|
366
|
+
this.coverage = {
|
|
367
|
+
exactContributorIds: [],
|
|
368
|
+
reactiveContributorIds: [],
|
|
369
|
+
missingContributorIds: [],
|
|
370
|
+
omittedMissingContributorCount: 0
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
stageFromError(cause) {
|
|
374
|
+
if (typeof cause === "object" && cause !== null && "stage" in cause) {
|
|
375
|
+
const stage = cause.stage;
|
|
376
|
+
if (stage === "build" || stage === "encode" || stage === "finish" || stage === "submit")
|
|
377
|
+
return stage;
|
|
378
|
+
}
|
|
379
|
+
return "submit";
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
export { TEMPORAL_JITTER_SAMPLE_COUNT, TemporalFrameCoordinator, classifySceneDataCoverage, createTemporalCoverage, projectTemporalView, scanSceneDataCoverage, snapshotSubmittedTemporalView, temporalJitterSample, temporalViewId };
|
|
384
|
+
//# sourceMappingURL=chunk-PCHBPYML.mjs.map
|
|
385
|
+
//# sourceMappingURL=chunk-PCHBPYML.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/temporal/coverage.ts","../src/temporal/temporal-view.ts","../src/temporal/taa-history-store.ts","../src/temporal/frame-coordinator.ts"],"names":[],"mappings":";;;;AAqBO,SAAS,sBAAA,CAAuB,OAAe,MAAA,EAAkC;AACtF,EAAA,IAAI,CAAC,MAAA,CAAO,aAAA,CAAc,KAAK,CAAA,IAAK,SAAS,CAAA,EAAG,MAAM,IAAI,UAAA,CAAW,yBAAyB,CAAA;AAC9F,EAAA,IAAI,CAAC,MAAA,CAAO,aAAA,CAAc,MAAM,KAAK,MAAA,IAAU,CAAA;AAC7C,IAAA,MAAM,IAAI,WAAW,0BAA0B,CAAA;AACjD,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,EAAA,GAAK,KAAA,GAAQ,MAAA,EAAQ,UAAA,EAAY,IAAA,EAAe,CAAA;AAC/F;AAOO,SAAS,0BAA0B,KAAA,EASxC;AACA,EAAA,MAAM,mBAAA,GAAsB,KAAA,CAAM,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAChG,EAAA,MAAM,sBAAA,GAAyB,KAAA,CAAM,YAAA,CAClC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,CACnC,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAClB,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,sBAAA,CAAuB,MAAA,CAAO,CAAC,OAAO,CAAC,SAAA,CAAU,GAAA,CAAI,EAAE,CAAC,CAAA;AAC9E,EAAA,OAAO;AAAA,IACL,mBAAA,EAAqB,MAAA,CAAO,MAAA,CAAO,mBAAmB,CAAA;AAAA,IACtD,sBAAA,EAAwB,MAAA,CAAO,MAAA,CAAO,sBAAsB,CAAA;AAAA,IAC5D,uBAAuB,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACzD,gCAAgC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,IAC/D,QAAA,EAAU,QAAQ,MAAA,KAAW;AAAA,GAC/B;AACF;AACO,SAAS,sBAAsB,KAAA,EAMhB;AACpB,EAAA,MAAM,iBAAiB,yBAAA,CAA0B;AAAA,IAC/C,YAAA,EAAc,KAAA,CAAM,cAAA,CAAe,GAAA,CAAI,CAAC,QAAQ,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAiB,CAAE,CAAA;AAAA,IAC/E,wBAAwB,KAAA,CAAM;AAAA,GAC/B,CAAA;AACD,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,GAAG,cAAA;AAAA,IACH,gBAAgB,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,KAAA,CAAM,cAAc,CAAC;AAAA,GACxD,CAAA;AACH;ACvEO,IAAM,4BAAA,GAA+B;AA2CrC,SAAS,cAAA,CAAe,SAAiB,SAAA,EAA2B;AACzE,EAAA,MAAM,MAAM,SAAA,KAAc,CAAA;AAC1B,EAAA,MAAM,QAAQ,GAAA,GAAM,QAAA;AACpB,EAAA,MAAM,UAAA,GAAc,QAAQ,EAAA,GAAM,GAAA;AAClC,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,IAAI,UAAU,CAAA,CAAA;AAC1C;AAEA,SAAS,MAAA,CAAO,OAAe,IAAA,EAAsB;AACnD,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,WAAW,CAAA,GAAI,IAAA;AACnB,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,OAAO,QAAQ,CAAA,EAAG;AAChB,IAAA,MAAA,IAAU,YAAY,KAAA,GAAQ,IAAA,CAAA;AAC9B,IAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,IAAI,CAAA;AAC/B,IAAA,QAAA,IAAY,IAAA;AAAA,EACd;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,qBAAqB,kBAAA,EAAuD;AAC1F,EAAA,MAAM,eACF,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA,GAAI,+BACjC,4BAAA,IACF,4BAAA;AACF,EAAA,MAAM,cAAc,WAAA,GAAc,CAAA;AAClC,EAAA,OAAO,CAAC,MAAA,CAAO,WAAA,EAAa,CAAC,CAAA,GAAI,KAAK,MAAA,CAAO,WAAA,EAAa,CAAC,CAAA,GAAI,GAAG,CAAA;AACpE;AAEA,SAAS,gBAAA,CACP,kBAAA,EACA,YAAA,EACA,aAAA,EAC2B;AAC3B,EAAA,MAAM,MAAA,GAAS,qBAAqB,kBAAkB,CAAA;AACtD,EAAA,OAAO,CAAC,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,YAAY,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAa,CAAC,CAAA;AACvF;AAEA,SAAS,iBAAiB,MAAA,EAAsC;AAC9D,EAAA,MAAM,UAAA,GAAa,KAAK,MAAA,EAAO;AAC/B,EAAA,IAAI,MAAA,CAAO,eAAe,cAAA,EAAgB;AACxC,IAAA,IAAA,CAAK,YAAA;AAAA,MACH,UAAA;AAAA,MACA,MAAA,CAAO,SAAA;AAAA,MACP,MAAA,CAAO,UAAA;AAAA,MACP,MAAA,CAAO,WAAA;AAAA,MACP,MAAA,CAAO,QAAA;AAAA,MACP,MAAA,CAAO,IAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,WAAA,CAAY,YAAY,MAAA,CAAO,GAAA,EAAK,OAAO,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,GAAG,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,WAAA,CACP,OAAA,EACA,MAAA,EACA,QAAA,EACqC;AACrC,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,aAAA;AACnC,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,MAAA,EAAQ,OAAO,eAAA;AACvC,EAAA,IAAI,QAAA,CAAS,cAAA,MAAoB,OAAA,CAAQ,cAAA,IAAkB,CAAA,CAAA,EAAI;AAC7D,IAAA,OAAO,yBAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,UAAA,KAAe,OAAA,CAAQ,UAAA,EAAY,OAAO,yBAAA;AACvD,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,CAAG,QAAA,CAAS,MAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAC,OAAO,EAAA,CAAG,QAAA,CAAS,GAAA,EAAK,OAAA,CAAQ,GAAG,CAAA,EAAG;AACpF,IAAA,OAAO,0BAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,oBAAoB,KAAA,EAAwC;AAC1E,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AACnB,EAAA,MAAM,SAAS,cAAA,CAAe,MAAA,CAAO,WAAW,CAAA,EAAG,MAAA,CAAO,aAAa,CAAC,CAAA;AACxE,EAAA,MAAM,eAAA,GAAkB,gBAAA;AAAA,IACtB,KAAA,CAAM,kBAAA;AAAA,IACN,KAAA,CAAM,YAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AACA,EAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,KAAK,MAAA,EAAO,EAAG,OAAO,KAAK,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,iBAAiB,MAAM,CAAA;AAC1C,EAAA,MAAM,kCAAkC,IAAA,CAAK,QAAA,CAAS,KAAK,MAAA,EAAO,EAAG,YAAY,IAAI,CAAA;AACrF,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA;AAC9C,EAAA,UAAA,CAAW,EAAE,CAAA,GAAI,eAAA,CAAgB,CAAC,CAAA,GAAI,CAAA;AACtC,EAAA,UAAA,CAAW,EAAE,CAAA,GAAI,eAAA,CAAgB,CAAC,CAAA,GAAI,EAAA;AACtC,EAAA,MAAM,qBAAqB,IAAA,CAAK,QAAA,CAAS,KAAK,MAAA,EAAO,EAAG,YAAY,UAAU,CAAA;AAC9E,EAAA,MAAM,gCAAgC,IAAA,CAAK,QAAA,CAAS,KAAK,MAAA,EAAO,EAAG,oBAAoB,IAAI,CAAA;AAC3F,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,EAAQ,MAAA,EAAQ,MAAM,aAAa,CAAA;AAC9D,EAAA,MAAM,eAAe,MAAA,KAAW,MAAA;AAChC,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,cAAA,EAAgB,OAAO,cAAA,IAAkB,CAAA;AAAA,IACzC,oBAAoB,KAAA,CAAM,kBAAA;AAAA,IAC1B,YAAA;AAAA,IACA,WAAA,EAAa,MAAA;AAAA,IACb,eAAA;AAAA,IACA,gBAAA,EAAkB,YAAA,GACb,KAAA,CAAM,aAAA,EAAe,YAAY,eAAA,GAClC,eAAA;AAAA,IACJ,6BAAA;AAAA,IACA,+BAAA;AAAA,IACA,gCAAA,EAAkC,YAAA,GAC7B,KAAA,CAAM,aAAA,EAAe,4BAA4B,+BAAA,GAClD,+BAAA;AAAA,IACJ,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,KAAK,MAAA,CAAO;AAAA,GACd;AACF;AAEO,SAAS,8BAA8B,IAAA,EAA2C;AACvF,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,QAAA,EAAU,CAAC,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAA,EAAG,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,IAC3D,wBAAA,EAA0B,IAAI,YAAA,CAAa,IAAA,CAAK,+BAA+B;AAAA,GACjF;AACF;;;ACjJO,IAAM,kBAAN,MAAsB;AAAA,EACnB,UAAA,GAAa,CAAA;AAAA,EACb,IAAA,GAAO,CAAA;AAAA,EACP,KAAA,GAAQ,KAAA;AAAA,EACR,OAAA,GAA2C,MAAA;AAAA,EAC3C,WAAA;AAAA,EAER,KAAA,CAAM,SAA4C,MAAA,EAA8B;AAC9E,IAAA,MAAM,aAAa,IAAA,CAAK,UAAA;AACxB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA;AACf,IAAA,IAAI,KAAA,GAA4C,QAAA;AAChD,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAQ,MAAM;AACZ,QAAA,IAAI,UAAU,QAAA,EAAU;AACxB,QAAA,KAAA,GAAQ,WAAA;AACR,QAAA,IAAA,CAAK,OAAA,GAAU,WAAA;AACf,QAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,QAAA,IAAA,CAAK,UAAA,IAAc,CAAA;AACnB,QAAA,IAAA,CAAK,IAAA,IAAQ,CAAA;AACb,QAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAAA,MACrB,CAAA;AAAA,MACA,OAAO,MAAM;AACX,QAAA,IAAI,UAAU,QAAA,EAAU;AACxB,QAAA,KAAA,GAAQ,SAAA;AACR,QAAA,IAAA,CAAK,OAAA,GAAU,SAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF;AAAA,EAEA,WAAA,CAAY,SAAgC,aAAA,EAAqB;AAC/D,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA,EAEA,MAAM,MAAA,EAAqC;AACzC,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAAA,EACrB;AAAA,EAEA,OAAA,GAAgC;AAC9B,IAAA,OAAO;AAAA,MACL,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AACF,CAAA;;;ACNA,SAAS,OAAA,CAAQ,MAA8B,IAAA,EAAkC;AAC/E,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,QAAA,EACE,IAAA,KAAS,iBAAA,GACL,4CAAA,GACA,8BAAA;AAAA,IACN;AAAA,GACF;AACF;AAOO,IAAM,2BAAN,MAA4C;AAAA,EACxC,YAAA;AAAA,EACD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAA+C,MAAA;AAAA,EAC/C,cAAA,GAA6D,MAAA;AAAA,EAC7D,WAAA;AAAA,EACA,gBAAA,GAAwC,QAAA;AAAA,EACxC,kBAAA,GAAqB,CAAA;AAAA,EACrB,iBAAA;AAAA,EACA,QAAA,GAAiD;AAAA,IACvD,qBAAqB,EAAC;AAAA,IACtB,wBAAwB,EAAC;AAAA,IACzB,uBAAuB,EAAC;AAAA,IACxB,8BAAA,EAAgC;AAAA,GAClC;AAAA,EACiB,eAAA,uBAAsB,OAAA,EAAmC;AAAA,EAE1E,WAAA,CACE,OAAA,GAII,EAAC,EACL;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA,CAAQ,YAAA,IAAgB,IAAI,eAAA,EAAgB;AAChE,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA;AAC9B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,KAAA,EAA0F;AAC9F,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,KAAc,KAAA,IAAS,MAAM,cAAA,KAAmB,IAAA;AACvE,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAA,CAAG;AAAA,QACR,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,SAAS,EAAE,SAAA,EAAW,IAAA,CAAK,gBAAA,EAAkB,OAAO,KAAA,EAAM;AAAA,QAC1D,YAAA,EAAc,OAAO,MAAA,CAAO,CAAC,GAAI,KAAA,CAAM,YAAA,IAAgB,EAAG,CAAC,CAAA;AAAA,QAC3D,sBAAA,EAAwB,OAAO,MAAA,CAAO,CAAC,GAAI,KAAA,CAAM,sBAAA,IAA0B,EAAG,CAAC,CAAA;AAAA,QAC/E,GAAI,MAAM,YAAA,KAAiB,MAAA,GAAY,EAAC,GAAI,EAAE,YAAA,EAAc,KAAA,CAAM,YAAA;AAAa,OAChF,CAAA;AAAA,IACH;AACA,IAAA,IAAI,KAAA,CAAM,cAAc,KAAA,EAAO;AAC7B,MAAA,OAAO,GAAA;AAAA,QACL,OAAA,CAAQ,mBAAmB,yDAAyD;AAAA,OACtF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,MAAA,OAAO,GAAA;AAAA,QACL,OAAA;AAAA,UACE,iBAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAuC;AAAA,MAC3C,KAAA,EAAO,KAAK,KAAA,GAAQ,CAAA;AAAA,MACpB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAA,EAAS,EAAE,SAAA,EAAW,IAAA,CAAK,kBAAkB,KAAA,EAAO,IAAA,CAAK,aAAa,MAAA,EAAU;AAAA,MAChF,YAAA,EAAc,OAAO,MAAA,CAAO,CAAC,GAAI,KAAA,CAAM,YAAA,IAAgB,EAAG,CAAC,CAAA;AAAA,MAC3D,sBAAA,EAAwB,OAAO,MAAA,CAAO,CAAC,GAAI,KAAA,CAAM,sBAAA,IAA0B,EAAG,CAAC,CAAA;AAAA,MAC/E,GAAI,MAAM,YAAA,KAAiB,MAAA,GAAY,EAAC,GAAI,EAAE,YAAA,EAAc,KAAA,CAAM,YAAA;AAAa,KACjF;AACA,IAAA,IAAI,KAAA,CAAM,cAAc,KAAA,EAAO;AAC7B,MAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAAA,IAC/D;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA;AACf,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA,CAAM,SAAA,KAAc,KAAA,GAAQ,QAAA,GAAW,MAAA;AAC7D,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,OAAO,GAAG,SAAS,CAAA;AAAA,EACrB;AAAA,EAEA,OACE,SAAA,EACqD;AACrD,IAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,MAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,wCAAwC,CAAC,CAAA;AAAA,IACrF;AACA,IAAA,IAAA,CAAK,QAAQ,SAAA,CAAU,KAAA;AACvB,IAAA,IAAA,CAAK,WAAW,SAAA,CAAU,OAAA;AAC1B,IAAA,IAAI,SAAA,CAAU,iBAAiB,MAAA,EAAW;AACxC,MAAA,IAAA,CAAK,iBAAA,GAAoB,6BAAA,CAA8B,SAAA,CAAU,YAAY,CAAA;AAC7E,MAAA,IAAA,CAAK,kBAAA,IAAsB,CAAA;AAAA,IAC7B;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,SAAA,CAAU,OAAA,CAAQ,SAAA,KAAc,WAAW,QAAA,GAAW,QAAA;AAC9E,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA;AACzD,IAAA,cAAA,EAAgB,MAAA,EAAO;AACvB,IAAA,IAAA,CAAK,WAAW,yBAAA,CAA0B;AAAA,MACxC,cAAc,SAAA,CAAU,YAAA;AAAA,MACxB,wBAAwB,SAAA,CAAU;AAAA,KACnC,CAAA;AACD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,cAAA,EAAgB,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,SAAS,CAAA;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,WAAA;AACf,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA,KAAmB,MAAA,GAAY,MAAA,GAAS,WAAA;AAC9D,IAAA,OAAO,EAAA,CAAG;AAAA,MACR,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,SAAA,CAAU,OAAA;AAAA,MACpB,gBAAA,EAAkB,UAAU,OAAA,CAAQ;AAAA,KACrC,CAAA;AAAA,EACH;AAAA,EAEA,KAAA,CAAM,SAAA,EAAsC,KAAA,GAA4B,QAAA,EAAgB;AACtF,IAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC/B,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,EAAG,KAAA,EAAM;AAC3C,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,SAAS,CAAA;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,SAAA;AACf,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAA;AACtB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,EACrB;AAAA,EAEA,GAAA,CACE,OACA,MAAA,EACiE;AACjE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAChC,IAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,EAAI,OAAO,OAAA;AACxB,IAAA,MAAM,YAAY,OAAA,CAAQ,KAAA;AAC1B,IAAA,IAAI,KAAA,CAAM,cAAc,KAAA,IAAS,KAAA,CAAM,mBAAmB,IAAA,EAAM,OAAO,GAAG,MAAS,CAAA;AACnF,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,EAAM;AAC3B,MAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AACnB,MAAA,MAAA,CAAO,MAAA,EAAO;AACd,MAAA,MAAA,CAAO,MAAA,EAAO;AAAA,IAChB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACvC,MAAA,IAAA,CAAK,KAAA,CAAM,WAAW,KAAK,CAAA;AAC3B,MAAA,OAAO,GAAA,CAAI;AAAA,QACT,IAAA,EAAM,qBAAA;AAAA,QACN,QAAA,EAAU,YAAY,KAAK,CAAA,uBAAA,CAAA;AAAA,QAC3B,IAAA,EAAM,0DAAA;AAAA,QACN,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA;AAAM,OACxB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,EAC9B;AAAA,EAEA,OAAA,GAAoC;AAClC,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAA,CACE,MAAA,EACA,YAAA,EACA,aAAA,EAC0B;AAC1B,IAAA,MAAM,QAAA,GACJ,MAAA,CAAO,SAAA,KAAc,KAAA,IACpB,MAAA,CAAO,YAAY,YAAA,KAAiB,MAAA,IAAa,MAAA,CAAO,UAAA,CAAW,YAAA,GAAe,CAAA;AACrF,IAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,IAAA,OAAO,mBAAA,CAAoB;AAAA,MACzB,MAAA;AAAA,MACA,oBAAoB,IAAA,CAAK,kBAAA;AAAA,MACzB,YAAA;AAAA,MACA,aAAA;AAAA,MACA,GAAI,KAAK,iBAAA,KAAsB,MAAA,GAAY,EAAC,GAAI,EAAE,aAAA,EAAe,IAAA,CAAK,iBAAA;AAAkB,KACzF,CAAA;AAAA,EACH;AAAA,EAEA,KAAA,CACE,SAO0B,SAAA,EACpB;AAEN,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAChB,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AACzB,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAA;AACxB,IAAA,IAAA,CAAK,YAAA,CAAa,KAAA;AAAA,MAChB,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,eAAA,GAC3B,YAAA,GACA,MAAA,KAAW,QAAA,GACT,QAAA,GACA,MAAA,KAAW,mBAAA,IAAuB,MAAA,KAAW,aAAA,GAC3C,mBAAA,GACA;AAAA,KACV;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AACtB,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACd,qBAAqB,EAAC;AAAA,MACtB,wBAAwB,EAAC;AAAA,MACzB,uBAAuB,EAAC;AAAA,MACxB,8BAAA,EAAgC;AAAA,KAClC;AAAA,EACF;AAAA,EAEQ,eAAe,KAAA,EAAoC;AACzD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,WAAW,KAAA,EAAO;AACnE,MAAA,MAAM,QAAS,KAAA,CAA8B,KAAA;AAC7C,MAAA,IAAI,UAAU,OAAA,IAAW,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,YAAY,KAAA,KAAU,QAAA;AAC7E,QAAA,OAAO,KAAA;AAAA,IACX;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACF","file":"chunk-PCHBPYML.mjs","sourcesContent":["import type { SceneDataLane, SceneDataSchemaId } from './scene-data';\n\nexport interface SceneDataCoverage {\n readonly schema: SceneDataSchemaId;\n readonly lane: SceneDataLane;\n readonly producerId: string;\n readonly complete: boolean;\n readonly contributorIds: readonly string[];\n readonly exactContributorIds: readonly string[];\n readonly reactiveContributorIds: readonly string[];\n readonly missingContributorIds: readonly string[];\n readonly omittedMissingContributorCount: number;\n}\n\nexport interface TemporalCoverage {\n readonly width: number;\n readonly height: number;\n readonly bytes: number;\n readonly fullScreen: true;\n}\n\nexport function createTemporalCoverage(width: number, height: number): TemporalCoverage {\n if (!Number.isSafeInteger(width) || width <= 0) throw new RangeError('width must be positive.');\n if (!Number.isSafeInteger(height) || height <= 0)\n throw new RangeError('height must be positive.');\n return Object.freeze({ width, height, bytes: 32 * width * height, fullScreen: true as const });\n}\n\nexport type SceneDataContributorKind = 'exact' | 'reactive';\nexport interface SceneDataContributor {\n readonly id: string;\n readonly kind: SceneDataContributorKind;\n}\nexport function classifySceneDataCoverage(input: {\n readonly contributors: readonly SceneDataContributor[];\n readonly requiredContributorIds: readonly string[];\n}): {\n readonly exactContributorIds: readonly string[];\n readonly reactiveContributorIds: readonly string[];\n readonly missingContributorIds: readonly string[];\n readonly omittedMissingContributorCount: number;\n readonly complete: boolean;\n} {\n const exactContributorIds = input.contributors.filter((c) => c.kind === 'exact').map((c) => c.id);\n const reactiveContributorIds = input.contributors\n .filter((c) => c.kind === 'reactive')\n .map((c) => c.id);\n const available = new Set(input.contributors.map((c) => c.id));\n const missing = input.requiredContributorIds.filter((id) => !available.has(id));\n return {\n exactContributorIds: Object.freeze(exactContributorIds),\n reactiveContributorIds: Object.freeze(reactiveContributorIds),\n missingContributorIds: Object.freeze(missing.slice(0, 32)),\n omittedMissingContributorCount: Math.max(0, missing.length - 32),\n complete: missing.length === 0,\n };\n}\nexport function scanSceneDataCoverage(input: {\n readonly schema: SceneDataSchemaId;\n readonly lane: SceneDataLane;\n readonly producerId: string;\n readonly contributorIds: readonly string[];\n readonly requiredContributorIds: readonly string[];\n}): SceneDataCoverage {\n const classification = classifySceneDataCoverage({\n contributors: input.contributorIds.map((id) => ({ id, kind: 'exact' as const })),\n requiredContributorIds: input.requiredContributorIds,\n });\n return Object.freeze({\n schema: input.schema,\n lane: input.lane,\n producerId: input.producerId,\n ...classification,\n contributorIds: Object.freeze([...input.contributorIds]),\n });\n}\n","import { mat4 } from '@forgeax/engine-math';\nimport type { CameraProjection } from '../components/camera';\nimport type { CameraSnapshot } from '../render-contract';\n\nexport const TEMPORAL_JITTER_SAMPLE_COUNT = 8;\n\nexport type TemporalViewResetReason =\n | 'first-frame'\n | 'camera-switch'\n | 'history-version-changed'\n | 'projection-kind-changed'\n | 'projection-range-changed';\n\nexport interface SubmittedTemporalView {\n readonly viewId: string;\n readonly historyVersion: number;\n readonly projection: CameraProjection;\n readonly near: number;\n readonly far: number;\n readonly jitterUv: readonly [number, number];\n readonly unjitteredViewProjection: Float32Array;\n}\n\nexport interface TemporalView {\n readonly viewId: string;\n readonly historyVersion: number;\n readonly temporalFrameIndex: number;\n readonly historyValid: boolean;\n readonly resetReason: TemporalViewResetReason | undefined;\n readonly currentJitterUv: readonly [number, number];\n readonly previousJitterUv: readonly [number, number];\n readonly currentJitteredViewProjection: Float32Array;\n readonly currentUnjitteredViewProjection: Float32Array;\n readonly previousUnjitteredViewProjection: Float32Array;\n readonly projection: CameraProjection;\n readonly near: number;\n readonly far: number;\n}\n\nexport interface TemporalViewInput {\n readonly camera: CameraSnapshot;\n readonly temporalFrameIndex: number;\n readonly surfaceWidth: number;\n readonly surfaceHeight: number;\n readonly lastSubmitted?: SubmittedTemporalView;\n}\n\nexport function temporalViewId(worldId: number, entityKey: number): string {\n const raw = entityKey >>> 0;\n const index = raw & 0x00ffffff;\n const generation = (raw >>> 24) & 0xff;\n return `${worldId}:${index}:${generation}`;\n}\n\nfunction halton(index: number, base: number): number {\n let result = 0;\n let fraction = 1 / base;\n let value = index;\n while (value > 0) {\n result += fraction * (value % base);\n value = Math.floor(value / base);\n fraction /= base;\n }\n return result;\n}\n\nexport function temporalJitterSample(temporalFrameIndex: number): readonly [number, number] {\n const sampleIndex =\n ((Math.trunc(temporalFrameIndex) % TEMPORAL_JITTER_SAMPLE_COUNT) +\n TEMPORAL_JITTER_SAMPLE_COUNT) %\n TEMPORAL_JITTER_SAMPLE_COUNT;\n const haltonIndex = sampleIndex + 1;\n return [halton(haltonIndex, 2) - 0.5, halton(haltonIndex, 3) - 0.5];\n}\n\nfunction temporalJitterUv(\n temporalFrameIndex: number,\n surfaceWidth: number,\n surfaceHeight: number,\n): readonly [number, number] {\n const sample = temporalJitterSample(temporalFrameIndex);\n return [sample[0] / Math.max(1, surfaceWidth), sample[1] / Math.max(1, surfaceHeight)];\n}\n\nfunction cameraProjection(camera: CameraSnapshot): Float32Array {\n const projection = mat4.create();\n if (camera.projection === 'orthographic') {\n mat4.orthographic(\n projection,\n camera.orthoLeft,\n camera.orthoRight,\n camera.orthoBottom,\n camera.orthoTop,\n camera.near,\n camera.far,\n );\n } else {\n mat4.perspective(projection, camera.fov, camera.aspect, camera.near, camera.far);\n }\n return projection;\n}\n\nfunction resetReason(\n current: CameraSnapshot,\n viewId: string,\n previous: SubmittedTemporalView | undefined,\n): TemporalViewResetReason | undefined {\n if (previous === undefined) return 'first-frame';\n if (previous.viewId !== viewId) return 'camera-switch';\n if (previous.historyVersion !== (current.historyVersion ?? 0)) {\n return 'history-version-changed';\n }\n if (previous.projection !== current.projection) return 'projection-kind-changed';\n if (!Object.is(previous.near, current.near) || !Object.is(previous.far, current.far)) {\n return 'projection-range-changed';\n }\n return undefined;\n}\n\nexport function projectTemporalView(input: TemporalViewInput): TemporalView {\n const { camera } = input;\n const viewId = temporalViewId(camera.worldId ?? 0, camera.entityKey ?? 0);\n const currentJitterUv = temporalJitterUv(\n input.temporalFrameIndex,\n input.surfaceWidth,\n input.surfaceHeight,\n );\n const view = mat4.invert(mat4.create(), camera.world);\n const projection = cameraProjection(camera);\n const currentUnjitteredViewProjection = mat4.multiply(mat4.create(), projection, view);\n const clipJitter = mat4.identity(mat4.create());\n clipJitter[12] = currentJitterUv[0] * 2;\n clipJitter[13] = currentJitterUv[1] * -2;\n const jitteredProjection = mat4.multiply(mat4.create(), clipJitter, projection);\n const currentJitteredViewProjection = mat4.multiply(mat4.create(), jitteredProjection, view);\n const reason = resetReason(camera, viewId, input.lastSubmitted);\n const historyValid = reason === undefined;\n return {\n viewId,\n historyVersion: camera.historyVersion ?? 0,\n temporalFrameIndex: input.temporalFrameIndex,\n historyValid,\n resetReason: reason,\n currentJitterUv,\n previousJitterUv: historyValid\n ? (input.lastSubmitted?.jitterUv ?? currentJitterUv)\n : currentJitterUv,\n currentJitteredViewProjection,\n currentUnjitteredViewProjection,\n previousUnjitteredViewProjection: historyValid\n ? (input.lastSubmitted?.unjitteredViewProjection ?? currentUnjitteredViewProjection)\n : currentUnjitteredViewProjection,\n projection: camera.projection,\n near: camera.near,\n far: camera.far,\n };\n}\n\nexport function snapshotSubmittedTemporalView(view: TemporalView): SubmittedTemporalView {\n return {\n viewId: view.viewId,\n historyVersion: view.historyVersion,\n projection: view.projection,\n near: view.near,\n far: view.far,\n jitterUv: [view.currentJitterUv[0], view.currentJitterUv[1]],\n unjitteredViewProjection: new Float32Array(view.currentUnjitteredViewProjection),\n };\n}\n","export type TaaHistoryResetReason =\n | 'first-frame'\n | 'camera-cut'\n | 'resize'\n | 'recover'\n | 'device-generation';\n\nexport interface TaaHistoryInspection {\n readonly generation: number;\n readonly seed: number;\n readonly attempt: 'none' | 'active' | 'committed' | 'aborted';\n readonly valid: boolean;\n readonly resetReason: TaaHistoryResetReason | undefined;\n}\n\nexport interface TaaHistoryAttempt {\n readonly generation: number;\n readonly seed: number;\n commit(): void;\n abort(): void;\n}\n\n/** TAA-only history owner. No global registry or backend handle crosses this boundary. */\nexport class TaaHistoryStore {\n private generation = 0;\n private seed = 0;\n private valid = false;\n private attempt: TaaHistoryInspection['attempt'] = 'none';\n private resetReason: TaaHistoryResetReason | undefined;\n\n begin(reason: TaaHistoryResetReason | undefined = undefined): TaaHistoryAttempt {\n const generation = this.generation;\n const seed = this.seed;\n this.attempt = 'active';\n let state: 'active' | 'committed' | 'aborted' = 'active';\n return {\n generation,\n seed,\n commit: () => {\n if (state !== 'active') return;\n state = 'committed';\n this.attempt = 'committed';\n this.valid = true;\n this.generation += 1;\n this.seed += 1;\n this.resetReason = reason;\n },\n abort: () => {\n if (state !== 'active') return;\n state = 'aborted';\n this.attempt = 'aborted';\n },\n };\n }\n\n seedHistory(reason: TaaHistoryResetReason = 'first-frame'): void {\n this.valid = false;\n this.resetReason = reason;\n this.attempt = 'none';\n }\n\n reset(reason: TaaHistoryResetReason): void {\n this.generation = 0;\n this.seed = 0;\n this.valid = false;\n this.attempt = 'none';\n this.resetReason = reason;\n }\n\n inspect(): TaaHistoryInspection {\n return {\n generation: this.generation,\n seed: this.seed,\n attempt: this.attempt,\n valid: this.valid,\n resetReason: this.resetReason,\n };\n }\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport type { CameraSnapshot } from '../render-contract';\nimport { classifySceneDataCoverage, type SceneDataContributor } from './coverage';\nimport { type TaaHistoryAttempt, TaaHistoryStore } from './taa-history-store';\nimport {\n projectTemporalView,\n type SubmittedTemporalView,\n snapshotSubmittedTemporalView,\n type TemporalView,\n} from './temporal-view';\n\n/** The only stages that may publish a temporal frame. */\nexport type TemporalFrameStage = 'build' | 'encode' | 'finish' | 'submit';\n\nexport type TemporalFrameErrorCode = 'taa-unavailable' | 'temporal-active' | 'temporal-not-active';\n\nexport interface TemporalFrameError {\n readonly code: TemporalFrameErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail?: Readonly<Record<string, unknown>>;\n}\n\nexport interface TemporalFrameSnapshot<T = unknown> {\n readonly epoch: number;\n readonly previous: T | undefined;\n readonly historyAttempt: 'none' | 'active' | 'committed' | 'aborted';\n readonly attempt: 'none' | 'active' | 'committed' | 'aborted';\n readonly lastFailure: TemporalFrameStage | undefined;\n readonly coverage: {\n readonly exactContributorIds: readonly string[];\n readonly reactiveContributorIds: readonly string[];\n readonly missingContributorIds: readonly string[];\n readonly omittedMissingContributorCount: number;\n };\n}\n\nexport interface TemporalFrameBeginInput<T = unknown> {\n readonly current: T;\n readonly antialias: 'none' | 'fxaa' | 'msaa' | 'taa';\n /** Enables the shared transaction for a temporal feature without TAA. */\n readonly temporalDemand?: boolean;\n readonly available?: boolean;\n readonly contributors?: readonly SceneDataContributor[];\n readonly requiredContributorIds?: readonly string[];\n /** Projection produced before record uploads; it commits with the frame. */\n readonly temporalView?: TemporalView;\n}\n\nexport interface TemporalFrameCandidate<T = unknown> {\n readonly epoch: number;\n readonly current: T;\n readonly previous: T | undefined;\n readonly history: { readonly direction: 'a-to-b' | 'b-to-a'; readonly valid: boolean };\n readonly contributors: readonly SceneDataContributor[];\n readonly requiredContributorIds: readonly string[];\n readonly temporalView?: TemporalView;\n}\n\nexport interface TemporalFramePhases<T = unknown> {\n readonly build: () => T;\n readonly encode: (built: T) => void;\n readonly finish: () => void;\n readonly submit: () => void;\n}\n\nexport interface TemporalFrameReceipt<T = unknown> {\n readonly epoch: number;\n readonly previous: T;\n readonly historyDirection: 'a-to-b' | 'b-to-a';\n}\n\nfunction failure(code: TemporalFrameErrorCode, hint: string): TemporalFrameError {\n return {\n code,\n expected:\n code === 'taa-unavailable'\n ? 'TAA resources and capability are available'\n : 'one temporal frame is active',\n hint,\n };\n}\n\n/**\n * Renderer-owned temporal transaction. It has no graph or backend dependency:\n * graph assembly supplies the four phase callbacks and only submit publishes\n * the candidate snapshot.\n */\nexport class TemporalFrameCoordinator<T = unknown> {\n readonly historyStore: TaaHistoryStore;\n private epoch: number;\n private previous: T | undefined;\n private active: TemporalFrameCandidate<T> | undefined;\n private attempt: TemporalFrameSnapshot<T>['attempt'] = 'none';\n private historyAttempt: TemporalFrameSnapshot<T>['historyAttempt'] = 'none';\n private lastFailure: TemporalFrameStage | undefined;\n private historyDirection: 'a-to-b' | 'b-to-a' = 'a-to-b';\n private temporalFrameIndex = 0;\n private lastSubmittedView: SubmittedTemporalView | undefined;\n private coverage: TemporalFrameSnapshot<T>['coverage'] = {\n exactContributorIds: [],\n reactiveContributorIds: [],\n missingContributorIds: [],\n omittedMissingContributorCount: 0,\n };\n private readonly historyAttempts = new WeakMap<object, TaaHistoryAttempt>();\n\n constructor(\n initial: {\n readonly epoch?: number;\n readonly previous?: T;\n readonly historyStore?: TaaHistoryStore;\n } = {},\n ) {\n this.historyStore = initial.historyStore ?? new TaaHistoryStore();\n this.epoch = initial.epoch ?? 0;\n this.previous = initial.previous;\n }\n\n begin(input: TemporalFrameBeginInput<T>): Result<TemporalFrameCandidate<T>, TemporalFrameError> {\n const demanded = input.antialias === 'taa' || input.temporalDemand === true;\n if (!demanded) {\n return ok({\n epoch: this.epoch,\n current: input.current,\n previous: this.previous,\n history: { direction: this.historyDirection, valid: false },\n contributors: Object.freeze([...(input.contributors ?? [])]),\n requiredContributorIds: Object.freeze([...(input.requiredContributorIds ?? [])]),\n ...(input.temporalView === undefined ? {} : { temporalView: input.temporalView }),\n });\n }\n if (input.available === false) {\n return err(\n failure('taa-unavailable', 'enable rgba16float temporal targets and retry the frame'),\n );\n }\n if (this.active !== undefined) {\n return err(\n failure(\n 'temporal-active',\n 'commit or abort the active temporal frame before beginning another',\n ),\n );\n }\n const candidate: TemporalFrameCandidate<T> = {\n epoch: this.epoch + 1,\n current: input.current,\n previous: this.previous,\n history: { direction: this.historyDirection, valid: this.previous !== undefined },\n contributors: Object.freeze([...(input.contributors ?? [])]),\n requiredContributorIds: Object.freeze([...(input.requiredContributorIds ?? [])]),\n ...(input.temporalView === undefined ? {} : { temporalView: input.temporalView }),\n };\n if (input.antialias === 'taa') {\n this.historyAttempts.set(candidate, this.historyStore.begin());\n }\n this.active = candidate;\n this.attempt = 'active';\n this.historyAttempt = input.antialias === 'taa' ? 'active' : 'none';\n this.lastFailure = undefined;\n return ok(candidate);\n }\n\n commit(\n candidate: TemporalFrameCandidate<T>,\n ): Result<TemporalFrameReceipt<T>, TemporalFrameError> {\n if (this.active !== candidate) {\n return err(failure('temporal-not-active', 'commit the candidate returned by begin'));\n }\n this.epoch = candidate.epoch;\n this.previous = candidate.current;\n if (candidate.temporalView !== undefined) {\n this.lastSubmittedView = snapshotSubmittedTemporalView(candidate.temporalView);\n this.temporalFrameIndex += 1;\n }\n this.historyDirection = candidate.history.direction === 'a-to-b' ? 'b-to-a' : 'a-to-b';\n const historyAttempt = this.historyAttempts.get(candidate);\n historyAttempt?.commit();\n this.coverage = classifySceneDataCoverage({\n contributors: candidate.contributors,\n requiredContributorIds: candidate.requiredContributorIds,\n });\n this.active = undefined;\n historyAttempt?.abort();\n this.historyAttempts.delete(candidate);\n this.attempt = 'committed';\n this.historyAttempt = historyAttempt === undefined ? 'none' : 'committed';\n return ok({\n epoch: this.epoch,\n previous: candidate.current,\n historyDirection: candidate.history.direction,\n });\n }\n\n abort(candidate: TemporalFrameCandidate<T>, stage: TemporalFrameStage = 'submit'): void {\n if (this.active !== candidate) return;\n this.historyAttempts.get(candidate)?.abort();\n this.historyAttempts.delete(candidate);\n this.active = undefined;\n this.attempt = 'aborted';\n this.historyAttempt = 'aborted';\n this.lastFailure = stage;\n }\n\n run(\n input: TemporalFrameBeginInput<T>,\n phases: TemporalFramePhases<T>,\n ): Result<TemporalFrameReceipt<T> | undefined, TemporalFrameError> {\n const started = this.begin(input);\n if (!started.ok) return started;\n const candidate = started.value;\n if (input.antialias !== 'taa' && input.temporalDemand !== true) return ok(undefined);\n try {\n const built = phases.build();\n phases.encode(built);\n phases.finish();\n phases.submit();\n } catch (cause) {\n const stage = this.stageFromError(cause);\n this.abort(candidate, stage);\n return err({\n code: 'temporal-not-active',\n expected: `temporal ${stage} succeeds before commit`,\n hint: 'inspect the underlying stage failure and retry the frame',\n detail: { stage, cause },\n });\n }\n return this.commit(candidate);\n }\n\n inspect(): TemporalFrameSnapshot<T> {\n return {\n epoch: this.epoch,\n previous: this.previous,\n historyAttempt: this.historyAttempt,\n attempt: this.attempt,\n lastFailure: this.lastFailure,\n coverage: this.coverage,\n };\n }\n\n /**\n * Derive the current/previous camera matrices without mutating history.\n * `commit()` is the only operation that publishes the returned view, so a\n * graph/finish/submit failure leaves the last successful view intact.\n */\n prepareTemporalView(\n camera: CameraSnapshot,\n surfaceWidth: number,\n surfaceHeight: number,\n ): TemporalView | undefined {\n const demanded =\n camera.antialias === 'taa' ||\n (camera.motionBlur?.shutterAngle !== undefined && camera.motionBlur.shutterAngle > 0);\n if (!demanded) return undefined;\n return projectTemporalView({\n camera,\n temporalFrameIndex: this.temporalFrameIndex,\n surfaceWidth,\n surfaceHeight,\n ...(this.lastSubmittedView === undefined ? {} : { lastSubmitted: this.lastSubmittedView }),\n });\n }\n\n reset(\n reason:\n | 'cut'\n | 'resize'\n | 'camera-switch'\n | 'detach'\n | 'recover'\n | 'device-loss'\n | 'device-generation' = 'recover',\n ): void {\n void reason;\n this.active = undefined;\n this.epoch = 0;\n this.previous = undefined;\n this.temporalFrameIndex = 0;\n this.lastSubmittedView = undefined;\n this.historyDirection = 'a-to-b';\n this.historyStore.reset(\n reason === 'cut' || reason === 'camera-switch'\n ? 'camera-cut'\n : reason === 'resize'\n ? 'resize'\n : reason === 'device-generation' || reason === 'device-loss'\n ? 'device-generation'\n : 'recover',\n );\n this.attempt = 'none';\n this.historyAttempt = 'none';\n this.lastFailure = undefined;\n this.coverage = {\n exactContributorIds: [],\n reactiveContributorIds: [],\n missingContributorIds: [],\n omittedMissingContributorCount: 0,\n };\n }\n\n private stageFromError(cause: unknown): TemporalFrameStage {\n if (typeof cause === 'object' && cause !== null && 'stage' in cause) {\n const stage = (cause as { stage?: unknown }).stage;\n if (stage === 'build' || stage === 'encode' || stage === 'finish' || stage === 'submit')\n return stage;\n }\n return 'submit';\n }\n}\n"]}
|