@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,66 @@
|
|
|
1
|
+
import type { TextureFormat } from '@forgeax/engine-rhi';
|
|
2
|
+
import type { TemporalFrame, TemporalResetReason } from './temporal/frame';
|
|
3
|
+
|
|
4
|
+
export type TemporalInspectionStatus =
|
|
5
|
+
| 'authored-off'
|
|
6
|
+
| 'available'
|
|
7
|
+
| 'capability-unavailable'
|
|
8
|
+
| 'temporal-degraded';
|
|
9
|
+
|
|
10
|
+
export interface TemporalInspection {
|
|
11
|
+
readonly status: TemporalInspectionStatus;
|
|
12
|
+
readonly resetReason: TemporalResetReason;
|
|
13
|
+
readonly historyEpoch: number;
|
|
14
|
+
readonly deviceEpoch: number;
|
|
15
|
+
readonly backend: string | undefined;
|
|
16
|
+
readonly format: TextureFormat | undefined;
|
|
17
|
+
readonly limits: Readonly<{
|
|
18
|
+
readonly maxTextureDimension2D?: number;
|
|
19
|
+
readonly maxTextureDimension3D?: number;
|
|
20
|
+
readonly maxTextureArrayLayers?: number;
|
|
21
|
+
}>;
|
|
22
|
+
readonly compute: 'available' | 'unavailable';
|
|
23
|
+
readonly storage: 'available' | 'unavailable';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface TemporalInspectionInput {
|
|
27
|
+
readonly authored: boolean;
|
|
28
|
+
readonly capability: 'available' | 'unavailable';
|
|
29
|
+
readonly degraded?: boolean;
|
|
30
|
+
readonly frame?: TemporalFrame;
|
|
31
|
+
readonly backend?: string;
|
|
32
|
+
readonly format?: TextureFormat;
|
|
33
|
+
readonly limits?: Readonly<Record<string, number>>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function inspectTemporalFrame(input: TemporalInspectionInput): TemporalInspection {
|
|
37
|
+
const frame = input.frame;
|
|
38
|
+
const status: TemporalInspectionStatus = !input.authored
|
|
39
|
+
? 'authored-off'
|
|
40
|
+
: input.capability === 'unavailable'
|
|
41
|
+
? 'capability-unavailable'
|
|
42
|
+
: input.degraded === true
|
|
43
|
+
? 'temporal-degraded'
|
|
44
|
+
: 'available';
|
|
45
|
+
return Object.freeze({
|
|
46
|
+
status,
|
|
47
|
+
resetReason: frame?.resetReason ?? 'none',
|
|
48
|
+
historyEpoch: frame?.historyEpoch ?? 0,
|
|
49
|
+
deviceEpoch: frame?.deviceEpoch ?? 0,
|
|
50
|
+
backend: input.backend,
|
|
51
|
+
format: input.format,
|
|
52
|
+
limits: Object.freeze({
|
|
53
|
+
...(typeof input.limits?.maxTextureDimension2D === 'number'
|
|
54
|
+
? { maxTextureDimension2D: input.limits.maxTextureDimension2D }
|
|
55
|
+
: {}),
|
|
56
|
+
...(typeof input.limits?.maxTextureDimension3D === 'number'
|
|
57
|
+
? { maxTextureDimension3D: input.limits.maxTextureDimension3D }
|
|
58
|
+
: {}),
|
|
59
|
+
...(typeof input.limits?.maxTextureArrayLayers === 'number'
|
|
60
|
+
? { maxTextureArrayLayers: input.limits.maxTextureArrayLayers }
|
|
61
|
+
: {}),
|
|
62
|
+
}),
|
|
63
|
+
compute: input.capability === 'available' ? 'available' : 'unavailable',
|
|
64
|
+
storage: input.capability === 'available' ? 'available' : 'unavailable',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
@@ -2,9 +2,10 @@ import type { EntityHandle, World } from '@forgeax/engine-ecs';
|
|
|
2
2
|
import { componentId } from '@forgeax/engine-ecs/internal';
|
|
3
3
|
import type { RenderReadLease } from '@forgeax/engine-ecs/projection';
|
|
4
4
|
import { box3, frustum, mat4 } from '@forgeax/engine-math';
|
|
5
|
-
import type
|
|
5
|
+
import { type RhiDevice, RhiError } from '@forgeax/engine-rhi';
|
|
6
6
|
import { ChildOf, Transform } from '@forgeax/engine-scene';
|
|
7
7
|
import { Skin } from '@forgeax/engine-skinning';
|
|
8
|
+
import { err, ok, type Result } from '@forgeax/engine-types';
|
|
8
9
|
import {
|
|
9
10
|
Camera,
|
|
10
11
|
DirectionalLight,
|
|
@@ -35,9 +36,18 @@ import type { CameraSnapshot } from '../render-contract';
|
|
|
35
36
|
import type {
|
|
36
37
|
DispatchEntry,
|
|
37
38
|
ExtractedFrame,
|
|
39
|
+
MaterialSnapshot,
|
|
38
40
|
MaterialSnapshotCachesByWorld,
|
|
41
|
+
RenderableReactiveReason,
|
|
39
42
|
RenderableSnapshot,
|
|
43
|
+
RenderableTemporalSnapshot,
|
|
40
44
|
} from '../render-system-extract';
|
|
45
|
+
import {
|
|
46
|
+
PersistentTransmissionDemandProjection,
|
|
47
|
+
type TransmissionDemand,
|
|
48
|
+
type TransmissionDemandOperation,
|
|
49
|
+
} from '../transmission/projection';
|
|
50
|
+
import { VolumetricFog } from '../volume/component';
|
|
41
51
|
import type {
|
|
42
52
|
RenderSceneApplyResult,
|
|
43
53
|
RenderSceneBounds,
|
|
@@ -69,13 +79,63 @@ interface PendingIdentity {
|
|
|
69
79
|
removed: boolean;
|
|
70
80
|
}
|
|
71
81
|
|
|
82
|
+
export interface RenderSceneSubmissionCapture {
|
|
83
|
+
readonly revision: number;
|
|
84
|
+
readonly slots: readonly {
|
|
85
|
+
readonly slot: number;
|
|
86
|
+
readonly current: RenderSceneSlot | undefined;
|
|
87
|
+
}[];
|
|
88
|
+
readonly visible: ReadonlySet<string>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface RenderSceneSubmissionDelta {
|
|
92
|
+
readonly epoch: number;
|
|
93
|
+
readonly slots: readonly number[];
|
|
94
|
+
}
|
|
95
|
+
|
|
72
96
|
function identityKey(worldId: number, entityKey: number): string {
|
|
73
97
|
return `${worldId}:${entityKey}`;
|
|
74
98
|
}
|
|
75
99
|
|
|
100
|
+
const STANDARD_TRANSMISSION_SHADER = 'forgeax::default-standard-pbr';
|
|
101
|
+
|
|
102
|
+
function transmissionValue(material: MaterialSnapshot): number {
|
|
103
|
+
const value = material.paramSnapshot?.transmission;
|
|
104
|
+
return typeof value === 'number' ? value : 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function transmissionRoughness(material: MaterialSnapshot): number {
|
|
108
|
+
const value = material.paramSnapshot?.roughness;
|
|
109
|
+
return typeof value === 'number' ? value : material.roughness;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function transmissionDemandOperations(
|
|
113
|
+
renderables: readonly RenderableSnapshot[],
|
|
114
|
+
): readonly TransmissionDemandOperation[] {
|
|
115
|
+
const operations: TransmissionDemandOperation[] = [];
|
|
116
|
+
for (const renderable of renderables) {
|
|
117
|
+
for (const [materialIndex, material] of renderable.materials.entries()) {
|
|
118
|
+
operations.push({
|
|
119
|
+
kind: 'upsert',
|
|
120
|
+
key: `${renderable.worldId}:${renderable.entityKey}:${materialIndex}`,
|
|
121
|
+
candidate: {
|
|
122
|
+
attached: true,
|
|
123
|
+
ready:
|
|
124
|
+
material.materialShaderId === STANDARD_TRANSMISSION_SHADER &&
|
|
125
|
+
material.paramSnapshot !== undefined,
|
|
126
|
+
transmission: transmissionValue(material),
|
|
127
|
+
roughness: transmissionRoughness(material),
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return operations;
|
|
133
|
+
}
|
|
134
|
+
|
|
76
135
|
function ownSnapshot(snapshot: RenderableSnapshot): RenderableSnapshot {
|
|
136
|
+
const { temporal: _temporal, ...current } = snapshot;
|
|
77
137
|
return {
|
|
78
|
-
...
|
|
138
|
+
...current,
|
|
79
139
|
transform: { ...snapshot.transform, world: new Float32Array(snapshot.transform.world) },
|
|
80
140
|
...(snapshot.localAabb === undefined
|
|
81
141
|
? {}
|
|
@@ -169,10 +229,14 @@ function worldBounds(snapshot: RenderableSnapshot): RenderSceneBounds | undefine
|
|
|
169
229
|
*/
|
|
170
230
|
export class RenderScene {
|
|
171
231
|
private readonly slots: Array<RenderSceneSlot | undefined> = [];
|
|
232
|
+
private readonly lastSubmittedSlots: Array<RenderSceneSlot | undefined> = [];
|
|
172
233
|
private readonly generations: number[] = [];
|
|
173
234
|
private readonly freeSlots: number[] = [];
|
|
174
235
|
private readonly slotsByWorld = new Map<number, Map<number, number>>();
|
|
175
236
|
private readonly slotsByMaterial = new Map<number, Set<number>>();
|
|
237
|
+
private readonly dirtySinceSubmitted = new Set<number>();
|
|
238
|
+
private lastSubmittedVisible = new Set<string>();
|
|
239
|
+
private submittedEpoch = 0;
|
|
176
240
|
// World bounds are a pure projection of each immutable snapshot. Cache the
|
|
177
241
|
// derived value by snapshot identity so repeated view queries do not redo
|
|
178
242
|
// the eight-corner transform for every view in the same frame.
|
|
@@ -188,6 +252,11 @@ export class RenderScene {
|
|
|
188
252
|
private resyncs = 0;
|
|
189
253
|
private lastResyncReason: RenderSceneResyncReason | undefined;
|
|
190
254
|
|
|
255
|
+
/** Bounded current-scene facts for the Standard temporal producer. */
|
|
256
|
+
temporalContributorCount(): number {
|
|
257
|
+
return this.orderedSlots.length;
|
|
258
|
+
}
|
|
259
|
+
|
|
191
260
|
apply(operations: readonly RenderSceneOperation[]): RenderSceneApplyResult {
|
|
192
261
|
if (operations.length === 0) {
|
|
193
262
|
this.noChangeFrames += 1;
|
|
@@ -253,19 +322,25 @@ export class RenderScene {
|
|
|
253
322
|
for (const pending of pendingOrder) {
|
|
254
323
|
if (pending.initial === undefined) {
|
|
255
324
|
if (pending.current === undefined) continue;
|
|
256
|
-
|
|
325
|
+
const createdSlot = this.allocate(pending.current);
|
|
326
|
+
this.dirtySinceSubmitted.add(createdSlot.slot);
|
|
327
|
+
createdSlots.push(createdSlot);
|
|
257
328
|
created += 1;
|
|
258
329
|
continue;
|
|
259
330
|
}
|
|
260
331
|
if (pending.current === undefined) {
|
|
332
|
+
this.dirtySinceSubmitted.add(pending.initial.slot);
|
|
261
333
|
this.release(pending.initial);
|
|
262
334
|
removedSlots.push(pending.initial);
|
|
263
335
|
removed += 1;
|
|
264
336
|
continue;
|
|
265
337
|
}
|
|
266
338
|
if (pending.removed) {
|
|
339
|
+
this.dirtySinceSubmitted.add(pending.initial.slot);
|
|
267
340
|
this.release(pending.initial);
|
|
268
|
-
|
|
341
|
+
const recreatedSlot = this.allocate(pending.current);
|
|
342
|
+
this.dirtySinceSubmitted.add(recreatedSlot.slot);
|
|
343
|
+
recreatedSlots.push(recreatedSlot);
|
|
269
344
|
recreated += 1;
|
|
270
345
|
continue;
|
|
271
346
|
}
|
|
@@ -276,6 +351,7 @@ export class RenderScene {
|
|
|
276
351
|
this.unindexMaterials(pending.initial);
|
|
277
352
|
this.slots[pending.initial.slot] = updatedSlot;
|
|
278
353
|
this.indexMaterials(updatedSlot);
|
|
354
|
+
this.dirtySinceSubmitted.add(updatedSlot.slot);
|
|
279
355
|
updatedSlots.push(updatedSlot);
|
|
280
356
|
updated += 1;
|
|
281
357
|
}
|
|
@@ -316,6 +392,12 @@ export class RenderScene {
|
|
|
316
392
|
|
|
317
393
|
/** Reconcile the current identity set while retaining slots for survivors. */
|
|
318
394
|
reset(snapshots: readonly RenderableSnapshot[], countAsRebuild = true): void {
|
|
395
|
+
// A full reconciliation is a temporal cut. Survivors may keep their
|
|
396
|
+
// stable slot, but no prior slot is valid until this frame submits.
|
|
397
|
+
this.lastSubmittedSlots.length = 0;
|
|
398
|
+
this.lastSubmittedVisible.clear();
|
|
399
|
+
this.dirtySinceSubmitted.clear();
|
|
400
|
+
this.submittedEpoch = 0;
|
|
319
401
|
const desired = new Map<string, RenderableSnapshot>();
|
|
320
402
|
for (const snapshot of snapshots) {
|
|
321
403
|
desired.set(identityKey(snapshot.worldId, snapshot.entityKey), snapshot);
|
|
@@ -330,7 +412,8 @@ export class RenderScene {
|
|
|
330
412
|
for (const snapshot of desired.values()) {
|
|
331
413
|
const existing = this.lookup(snapshot.worldId, snapshot.entityKey);
|
|
332
414
|
if (existing === undefined) {
|
|
333
|
-
this.allocate(snapshot);
|
|
415
|
+
const created = this.allocate(snapshot);
|
|
416
|
+
this.dirtySinceSubmitted.add(created.slot);
|
|
334
417
|
continue;
|
|
335
418
|
}
|
|
336
419
|
const updated: RenderSceneSlot = {
|
|
@@ -340,6 +423,7 @@ export class RenderScene {
|
|
|
340
423
|
this.unindexMaterials(existing);
|
|
341
424
|
this.slots[existing.slot] = updated;
|
|
342
425
|
this.indexMaterials(updated);
|
|
426
|
+
this.dirtySinceSubmitted.add(updated.slot);
|
|
343
427
|
this.orderedSlots.push(existing.slot);
|
|
344
428
|
}
|
|
345
429
|
|
|
@@ -363,6 +447,59 @@ export class RenderScene {
|
|
|
363
447
|
return this.materialized;
|
|
364
448
|
}
|
|
365
449
|
|
|
450
|
+
lastSubmittedSlotByIndex(slot: number): RenderSceneSlot | undefined {
|
|
451
|
+
return this.lastSubmittedSlots[slot];
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
temporalSnapshotBySlot(slot: number): RenderableTemporalSnapshot | undefined {
|
|
455
|
+
const current = this.slots[slot];
|
|
456
|
+
return current === undefined ? undefined : this.temporalSnapshot(current);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
withTemporal(snapshot: RenderableSnapshot): RenderableSnapshot {
|
|
460
|
+
const slot = this.lookup(snapshot.worldId, snapshot.entityKey);
|
|
461
|
+
return slot === undefined ? snapshot : { ...snapshot, temporal: this.temporalSnapshot(slot) };
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
wasLastSubmittedVisible(slot: number, generation: number): boolean {
|
|
465
|
+
return this.lastSubmittedVisible.has(`${slot}:${generation}`);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
captureSubmission(
|
|
469
|
+
visible: readonly Pick<RenderableSnapshot, 'worldId' | 'entityKey'>[],
|
|
470
|
+
): RenderSceneSubmissionCapture {
|
|
471
|
+
const visibleSlots = new Set<string>();
|
|
472
|
+
for (const snapshot of visible) {
|
|
473
|
+
const slot = this.lookup(snapshot.worldId, snapshot.entityKey);
|
|
474
|
+
if (slot !== undefined) visibleSlots.add(`${slot.slot}:${slot.generation}`);
|
|
475
|
+
}
|
|
476
|
+
return {
|
|
477
|
+
revision: this.revision,
|
|
478
|
+
slots: [...this.dirtySinceSubmitted].map((slot) => ({
|
|
479
|
+
slot,
|
|
480
|
+
current: this.slots[slot],
|
|
481
|
+
})),
|
|
482
|
+
visible: visibleSlots,
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
commitSubmission(capture: RenderSceneSubmissionCapture): RenderSceneSubmissionDelta {
|
|
487
|
+
if (capture.revision !== this.revision) {
|
|
488
|
+
throw new RangeError('render scene changed while its temporal submission was active');
|
|
489
|
+
}
|
|
490
|
+
for (const update of capture.slots) {
|
|
491
|
+
this.lastSubmittedSlots[update.slot] = update.current;
|
|
492
|
+
this.dirtySinceSubmitted.delete(update.slot);
|
|
493
|
+
}
|
|
494
|
+
this.lastSubmittedVisible = new Set(capture.visible);
|
|
495
|
+
this.submittedEpoch += 1;
|
|
496
|
+
this.invalidateSnapshots();
|
|
497
|
+
return {
|
|
498
|
+
epoch: this.submittedEpoch,
|
|
499
|
+
slots: capture.slots.map((update) => update.slot),
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
|
|
366
503
|
slotsSnapshot(): readonly RenderSceneSlot[] {
|
|
367
504
|
if (this.slotSnapshot !== undefined) return this.slotSnapshot;
|
|
368
505
|
const records: RenderSceneSlot[] = [];
|
|
@@ -522,6 +659,49 @@ export class RenderScene {
|
|
|
522
659
|
}
|
|
523
660
|
}
|
|
524
661
|
|
|
662
|
+
private temporalSnapshot(slot: RenderSceneSlot): RenderableTemporalSnapshot {
|
|
663
|
+
const submitted = this.lastSubmittedSlots[slot.slot];
|
|
664
|
+
const sameGeneration = submitted?.generation === slot.generation;
|
|
665
|
+
const wasVisible =
|
|
666
|
+
sameGeneration && this.lastSubmittedVisible.has(`${slot.slot}:${slot.generation}`);
|
|
667
|
+
const reasons: RenderableReactiveReason[] = [];
|
|
668
|
+
if (!sameGeneration) {
|
|
669
|
+
reasons.push(submitted === undefined ? 'new-slot' : 'generation-reuse');
|
|
670
|
+
} else if (!wasVisible) {
|
|
671
|
+
reasons.push('reentered');
|
|
672
|
+
}
|
|
673
|
+
if (
|
|
674
|
+
sameGeneration &&
|
|
675
|
+
submitted !== undefined &&
|
|
676
|
+
submitted.snapshot.assetHandle !== slot.snapshot.assetHandle
|
|
677
|
+
) {
|
|
678
|
+
reasons.push('geometry-revision');
|
|
679
|
+
}
|
|
680
|
+
if (
|
|
681
|
+
sameGeneration &&
|
|
682
|
+
submitted !== undefined &&
|
|
683
|
+
submitted.snapshot.materials !== slot.snapshot.materials
|
|
684
|
+
) {
|
|
685
|
+
reasons.push('material-revision');
|
|
686
|
+
}
|
|
687
|
+
const seedCurrent =
|
|
688
|
+
!sameGeneration ||
|
|
689
|
+
!wasVisible ||
|
|
690
|
+
reasons.includes('geometry-revision') ||
|
|
691
|
+
reasons.includes('material-revision');
|
|
692
|
+
const previous = seedCurrent || submitted === undefined ? slot.snapshot : submitted.snapshot;
|
|
693
|
+
return {
|
|
694
|
+
previousEpoch: seedCurrent ? undefined : this.submittedEpoch,
|
|
695
|
+
previousSource: seedCurrent ? 'current-seed' : 'last-submitted',
|
|
696
|
+
reactive: reasons.length > 0,
|
|
697
|
+
reactiveReasons: reasons,
|
|
698
|
+
previousTransform: previous.transform,
|
|
699
|
+
previousInstances: previous.instances,
|
|
700
|
+
previousSkin: previous.skin,
|
|
701
|
+
previousMorphWeights: previous.morph?.weights,
|
|
702
|
+
};
|
|
703
|
+
}
|
|
704
|
+
|
|
525
705
|
private invalidateSnapshots(): void {
|
|
526
706
|
this.materialized = undefined;
|
|
527
707
|
this.slotSnapshot = undefined;
|
|
@@ -554,6 +734,7 @@ interface PersistentCompositionEntry {
|
|
|
554
734
|
readonly resourceOwner: number;
|
|
555
735
|
readonly projection: RenderScene;
|
|
556
736
|
readonly topology: BatchTopology;
|
|
737
|
+
readonly transmissionDemand: PersistentTransmissionDemandProjection;
|
|
557
738
|
readonly readCursors: number[];
|
|
558
739
|
readonly leaseIdentities: readonly string[];
|
|
559
740
|
catalogEpoch: number;
|
|
@@ -581,6 +762,7 @@ const RENDER_RELEVANT_COMPONENT_IDS = new Set([
|
|
|
581
762
|
componentId(Skylight),
|
|
582
763
|
componentId(SkyboxBackground),
|
|
583
764
|
componentId(PostProcessParams),
|
|
765
|
+
componentId(VolumetricFog),
|
|
584
766
|
]);
|
|
585
767
|
|
|
586
768
|
const NON_RENDERABLE_TRANSFORM_CONSUMERS = [
|
|
@@ -693,6 +875,9 @@ export class PersistentRenderScene {
|
|
|
693
875
|
private gpuDevice: RhiDevice | undefined;
|
|
694
876
|
private gpuStatus: 'inactive' | 'unsupported' | 'resident' | 'rebuild-pending' | 'error' =
|
|
695
877
|
'inactive';
|
|
878
|
+
private temporalCapture:
|
|
879
|
+
| { readonly projection: RenderScene; readonly capture: RenderSceneSubmissionCapture }
|
|
880
|
+
| undefined;
|
|
696
881
|
private pointsLinesInspections: readonly PointsLinesInspection[] = [];
|
|
697
882
|
|
|
698
883
|
constructor(private readonly options: PersistentRenderSceneOptions = {}) {}
|
|
@@ -817,7 +1002,11 @@ export class PersistentRenderScene {
|
|
|
817
1002
|
});
|
|
818
1003
|
continue;
|
|
819
1004
|
}
|
|
1005
|
+
// Camera snapshots are rebuilt from the current candidate frame and
|
|
1006
|
+
// drive culling there; moving a camera must not invalidate the
|
|
1007
|
+
// retained scene projection or recreate its GPU tables.
|
|
820
1008
|
if (
|
|
1009
|
+
!world.hasComponent(entity, Camera) &&
|
|
821
1010
|
NON_RENDERABLE_TRANSFORM_CONSUMERS.some((component) =>
|
|
822
1011
|
world.hasComponent(entity, component),
|
|
823
1012
|
)
|
|
@@ -848,6 +1037,7 @@ export class PersistentRenderScene {
|
|
|
848
1037
|
|
|
849
1038
|
invalidate(): void {
|
|
850
1039
|
this.composition = undefined;
|
|
1040
|
+
this.temporalCapture = undefined;
|
|
851
1041
|
this.lastResyncReason = 'explicit-invalidate';
|
|
852
1042
|
}
|
|
853
1043
|
|
|
@@ -864,6 +1054,7 @@ export class PersistentRenderScene {
|
|
|
864
1054
|
? this.composition
|
|
865
1055
|
: undefined;
|
|
866
1056
|
if (detachedComposition !== undefined) this.composition = undefined;
|
|
1057
|
+
if (detachedComposition !== undefined) this.temporalCapture = undefined;
|
|
867
1058
|
if (this.gpuOwner !== world && this.gpuOwner !== detachedComposition?.token) return;
|
|
868
1059
|
this.gpuScene?.dispose();
|
|
869
1060
|
this.gpuScene = undefined;
|
|
@@ -896,6 +1087,7 @@ export class PersistentRenderScene {
|
|
|
896
1087
|
this.gpuDevice = undefined;
|
|
897
1088
|
this.gpuStatus = 'inactive';
|
|
898
1089
|
this.composition = undefined;
|
|
1090
|
+
this.temporalCapture = undefined;
|
|
899
1091
|
this.pointsLinesInspections = [];
|
|
900
1092
|
}
|
|
901
1093
|
|
|
@@ -937,6 +1129,40 @@ export class PersistentRenderScene {
|
|
|
937
1129
|
};
|
|
938
1130
|
}
|
|
939
1131
|
|
|
1132
|
+
/** Publish renderer-owned previous transforms after queue submission. */
|
|
1133
|
+
commitTemporalFrame(): Result<void, RhiError> {
|
|
1134
|
+
const gpuCommit = this.gpuScene?.commitTemporalFrame();
|
|
1135
|
+
if (gpuCommit !== undefined && !gpuCommit.ok) return gpuCommit;
|
|
1136
|
+
const temporalCapture = this.temporalCapture;
|
|
1137
|
+
if (temporalCapture !== undefined) {
|
|
1138
|
+
try {
|
|
1139
|
+
temporalCapture.projection.commitSubmission(temporalCapture.capture);
|
|
1140
|
+
} catch (cause) {
|
|
1141
|
+
void cause;
|
|
1142
|
+
return err(
|
|
1143
|
+
new RhiError({
|
|
1144
|
+
code: 'internal-error',
|
|
1145
|
+
expected: 'render scene remains unchanged while a submitted temporal frame commits',
|
|
1146
|
+
hint: 'retry the temporal frame after the renderer-owned scene snapshot is stable',
|
|
1147
|
+
}),
|
|
1148
|
+
);
|
|
1149
|
+
}
|
|
1150
|
+
this.temporalCapture = undefined;
|
|
1151
|
+
}
|
|
1152
|
+
return ok(undefined);
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
/** Capture current CPU scene facts; commitTemporalFrame publishes them only after submit. */
|
|
1156
|
+
prepareTemporalFrame(
|
|
1157
|
+
visible: readonly Pick<RenderableSnapshot, 'worldId' | 'entityKey'>[],
|
|
1158
|
+
): void {
|
|
1159
|
+
const projection = this.composition?.projection;
|
|
1160
|
+
this.temporalCapture =
|
|
1161
|
+
projection === undefined
|
|
1162
|
+
? undefined
|
|
1163
|
+
: { projection, capture: projection.captureSubmission(visible) };
|
|
1164
|
+
}
|
|
1165
|
+
|
|
940
1166
|
pointsLinesSnapshots(): readonly PointsLinesRetainedSnapshot[] {
|
|
941
1167
|
return this.composition?.projection.pointsLinesSnapshots() ?? [];
|
|
942
1168
|
}
|
|
@@ -961,9 +1187,12 @@ export class PersistentRenderScene {
|
|
|
961
1187
|
leases?: readonly RenderReadLease[],
|
|
962
1188
|
): ExtractedFrame {
|
|
963
1189
|
const candidateFrame = buildCandidateFrame();
|
|
1190
|
+
this.temporalCapture = undefined;
|
|
964
1191
|
this.worldEntitiesScanned = candidateFrame.renderables.length;
|
|
965
1192
|
const projection = new RenderScene();
|
|
966
1193
|
projection.reset(candidateFrame.renderables);
|
|
1194
|
+
const transmissionDemand = new PersistentTransmissionDemandProjection();
|
|
1195
|
+
transmissionDemand.apply(transmissionDemandOperations(candidateFrame.renderables));
|
|
967
1196
|
const topology = new BatchTopology();
|
|
968
1197
|
topology.rebuild(projection.slotsSnapshot());
|
|
969
1198
|
const token = {};
|
|
@@ -974,6 +1203,7 @@ export class PersistentRenderScene {
|
|
|
974
1203
|
resourceOwner: owner.resourceOwner,
|
|
975
1204
|
projection,
|
|
976
1205
|
topology,
|
|
1206
|
+
transmissionDemand,
|
|
977
1207
|
readCursors:
|
|
978
1208
|
leases === undefined || leases.length !== worlds.length
|
|
979
1209
|
? []
|
|
@@ -991,7 +1221,20 @@ export class PersistentRenderScene {
|
|
|
991
1221
|
this.syncGpuOwner(token, projection, undefined, true);
|
|
992
1222
|
this.fullRebuilds += 1;
|
|
993
1223
|
this.lastResyncReason = 'attach';
|
|
994
|
-
|
|
1224
|
+
const candidates = projection
|
|
1225
|
+
.materialize()
|
|
1226
|
+
.map((snapshot) => projection.withTemporal(snapshot));
|
|
1227
|
+
return cullPersistentFrame({ ...candidateFrame, renderables: [...candidates] }, candidates);
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
/** Internal topology fact; the renderer does not expose demand as public API. */
|
|
1231
|
+
transmissionTopologyDemand(): TransmissionDemand {
|
|
1232
|
+
return (
|
|
1233
|
+
this.composition?.transmissionDemand.inspect() ?? {
|
|
1234
|
+
activeCount: 0,
|
|
1235
|
+
needsRoughMips: false,
|
|
1236
|
+
}
|
|
1237
|
+
);
|
|
995
1238
|
}
|
|
996
1239
|
|
|
997
1240
|
/**
|
|
@@ -1003,7 +1246,9 @@ export class PersistentRenderScene {
|
|
|
1003
1246
|
buildCandidateFrame: () => ExtractedFrame,
|
|
1004
1247
|
): ExtractedFrame {
|
|
1005
1248
|
const candidateFrame = buildCandidateFrame();
|
|
1006
|
-
const candidates = entry.projection
|
|
1249
|
+
const candidates = entry.projection
|
|
1250
|
+
.materialize()
|
|
1251
|
+
.map((snapshot) => entry.projection.withTemporal(snapshot));
|
|
1007
1252
|
return cullPersistentFrame({ ...candidateFrame, renderables: [...candidates] }, candidates);
|
|
1008
1253
|
}
|
|
1009
1254
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { RhiDevice } from '@forgeax/engine-rhi';
|
|
2
|
+
import { rhi } from '@forgeax/engine-rhi-null';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import { createTaaHistoryResources, type TaaHistoryResources } from '../taa-history-resources';
|
|
5
|
+
|
|
6
|
+
async function nullDevice(): Promise<RhiDevice> {
|
|
7
|
+
const adapter = await rhi.requestAdapter();
|
|
8
|
+
if (!adapter.ok) throw adapter.error;
|
|
9
|
+
const device = await adapter.value.requestDevice();
|
|
10
|
+
if (!device.ok) throw device.error;
|
|
11
|
+
return device.value;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
describe('TAA GPU history resources', () => {
|
|
15
|
+
it('allocates two rgba16float slots with sampled/render/copy usage', async () => {
|
|
16
|
+
const device = await nullDevice();
|
|
17
|
+
const resources = createTaaHistoryResources(device, 64, 32);
|
|
18
|
+
expect(resources.ok).toBe(true);
|
|
19
|
+
if (!resources.ok) return;
|
|
20
|
+
expect(resources.value.slots).toHaveLength(2);
|
|
21
|
+
expect(resources.value.descriptor.format).toBe('rgba16float');
|
|
22
|
+
expect(resources.value.descriptor.usage).toBe(0x17);
|
|
23
|
+
resources.value.dispose();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('swaps only on commit and preserves the previous slot on abort', async () => {
|
|
27
|
+
const device = await nullDevice();
|
|
28
|
+
const resources = createTaaHistoryResources(device, 8, 8);
|
|
29
|
+
expect(resources.ok).toBe(true);
|
|
30
|
+
if (!resources.ok) return;
|
|
31
|
+
const state: TaaHistoryResources = resources.value;
|
|
32
|
+
expect(state.previousIndex).toBe(1);
|
|
33
|
+
expect(state.valid).toBe(false);
|
|
34
|
+
state.beginFrame();
|
|
35
|
+
state.abortFrame();
|
|
36
|
+
expect(state.currentIndex).toBe(0);
|
|
37
|
+
expect(state.valid).toBe(false);
|
|
38
|
+
state.beginFrame();
|
|
39
|
+
state.commitFrame();
|
|
40
|
+
expect(state.currentIndex).toBe(1);
|
|
41
|
+
expect(state.previousIndex).toBe(0);
|
|
42
|
+
expect(state.valid).toBe(true);
|
|
43
|
+
state.dispose();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { SceneDataLane, SceneDataSchemaId } from './scene-data';
|
|
2
|
+
|
|
3
|
+
export interface SceneDataCoverage {
|
|
4
|
+
readonly schema: SceneDataSchemaId;
|
|
5
|
+
readonly lane: SceneDataLane;
|
|
6
|
+
readonly producerId: string;
|
|
7
|
+
readonly complete: boolean;
|
|
8
|
+
readonly contributorIds: readonly string[];
|
|
9
|
+
readonly exactContributorIds: readonly string[];
|
|
10
|
+
readonly reactiveContributorIds: readonly string[];
|
|
11
|
+
readonly missingContributorIds: readonly string[];
|
|
12
|
+
readonly omittedMissingContributorCount: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface TemporalCoverage {
|
|
16
|
+
readonly width: number;
|
|
17
|
+
readonly height: number;
|
|
18
|
+
readonly bytes: number;
|
|
19
|
+
readonly fullScreen: true;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function createTemporalCoverage(width: number, height: number): TemporalCoverage {
|
|
23
|
+
if (!Number.isSafeInteger(width) || width <= 0) throw new RangeError('width must be positive.');
|
|
24
|
+
if (!Number.isSafeInteger(height) || height <= 0)
|
|
25
|
+
throw new RangeError('height must be positive.');
|
|
26
|
+
return Object.freeze({ width, height, bytes: 32 * width * height, fullScreen: true as const });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type SceneDataContributorKind = 'exact' | 'reactive';
|
|
30
|
+
export interface SceneDataContributor {
|
|
31
|
+
readonly id: string;
|
|
32
|
+
readonly kind: SceneDataContributorKind;
|
|
33
|
+
}
|
|
34
|
+
export function classifySceneDataCoverage(input: {
|
|
35
|
+
readonly contributors: readonly SceneDataContributor[];
|
|
36
|
+
readonly requiredContributorIds: readonly string[];
|
|
37
|
+
}): {
|
|
38
|
+
readonly exactContributorIds: readonly string[];
|
|
39
|
+
readonly reactiveContributorIds: readonly string[];
|
|
40
|
+
readonly missingContributorIds: readonly string[];
|
|
41
|
+
readonly omittedMissingContributorCount: number;
|
|
42
|
+
readonly complete: boolean;
|
|
43
|
+
} {
|
|
44
|
+
const exactContributorIds = input.contributors.filter((c) => c.kind === 'exact').map((c) => c.id);
|
|
45
|
+
const reactiveContributorIds = input.contributors
|
|
46
|
+
.filter((c) => c.kind === 'reactive')
|
|
47
|
+
.map((c) => c.id);
|
|
48
|
+
const available = new Set(input.contributors.map((c) => c.id));
|
|
49
|
+
const missing = input.requiredContributorIds.filter((id) => !available.has(id));
|
|
50
|
+
return {
|
|
51
|
+
exactContributorIds: Object.freeze(exactContributorIds),
|
|
52
|
+
reactiveContributorIds: Object.freeze(reactiveContributorIds),
|
|
53
|
+
missingContributorIds: Object.freeze(missing.slice(0, 32)),
|
|
54
|
+
omittedMissingContributorCount: Math.max(0, missing.length - 32),
|
|
55
|
+
complete: missing.length === 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function scanSceneDataCoverage(input: {
|
|
59
|
+
readonly schema: SceneDataSchemaId;
|
|
60
|
+
readonly lane: SceneDataLane;
|
|
61
|
+
readonly producerId: string;
|
|
62
|
+
readonly contributorIds: readonly string[];
|
|
63
|
+
readonly requiredContributorIds: readonly string[];
|
|
64
|
+
}): SceneDataCoverage {
|
|
65
|
+
const classification = classifySceneDataCoverage({
|
|
66
|
+
contributors: input.contributorIds.map((id) => ({ id, kind: 'exact' as const })),
|
|
67
|
+
requiredContributorIds: input.requiredContributorIds,
|
|
68
|
+
});
|
|
69
|
+
return Object.freeze({
|
|
70
|
+
schema: input.schema,
|
|
71
|
+
lane: input.lane,
|
|
72
|
+
producerId: input.producerId,
|
|
73
|
+
...classification,
|
|
74
|
+
contributorIds: Object.freeze([...input.contributorIds]),
|
|
75
|
+
});
|
|
76
|
+
}
|