@forgeax/engine-render 0.1.6 → 0.1.19
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 +279 -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 +19 -2
- 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/material/assembly.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.d.ts +1 -0
- package/dist/authoring.d.ts.map +1 -1
- package/dist/authoring.mjs +4 -2
- package/dist/authoring.mjs.map +1 -1
- package/dist/chunk-FJ6P52EE.mjs +46 -0
- package/dist/chunk-FJ6P52EE.mjs.map +1 -0
- package/dist/chunk-IPXCABEP.mjs +73 -0
- package/dist/chunk-IPXCABEP.mjs.map +1 -0
- package/dist/chunk-JDWARUOI.mjs +44 -0
- package/dist/chunk-JDWARUOI.mjs.map +1 -0
- package/dist/chunk-LOSO4CTV.mjs +901 -0
- package/dist/chunk-LOSO4CTV.mjs.map +1 -0
- package/dist/chunk-PCHBPYML.mjs +385 -0
- package/dist/chunk-PCHBPYML.mjs.map +1 -0
- package/dist/chunk-RJRUS55L.mjs +9323 -0
- package/dist/chunk-RJRUS55L.mjs.map +1 -0
- package/dist/{chunk-QC4VW3XJ.mjs → chunk-RXZ3RGOU.mjs} +4 -30
- package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
- package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
- package/dist/chunk-VFPLTKCU.mjs.map +1 -0
- package/dist/{chunk-SCRSAK5B.mjs → chunk-YTQ5C7YQ.mjs} +231 -127
- package/dist/chunk-YTQ5C7YQ.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 +5 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/lines.d.ts +5 -0
- package/dist/components/lines.d.ts.map +1 -0
- package/dist/components/motion-blur.d.ts +7 -0
- package/dist/components/motion-blur.d.ts.map +1 -0
- package/dist/components/points.d.ts +15 -0
- package/dist/components/points.d.ts.map +1 -0
- package/dist/construct-renderer.d.ts +2 -2
- package/dist/construct-renderer.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +11419 -16442
- 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/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 +217 -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 +7 -2
- 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-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +2 -0
- package/dist/gpu-scene.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 +21 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +8 -4
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +46 -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/materials.d.ts +22 -0
- package/dist/materials.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +12 -6
- 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 +3 -6
- 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/points-lines/admission.d.ts +36 -0
- package/dist/points-lines/admission.d.ts.map +1 -0
- package/dist/points-lines/bounds.d.ts +8 -0
- package/dist/points-lines/bounds.d.ts.map +1 -0
- package/dist/points-lines/expansion-cache.d.ts +28 -0
- package/dist/points-lines/expansion-cache.d.ts.map +1 -0
- package/dist/points-lines/inspection.d.ts +53 -0
- package/dist/points-lines/inspection.d.ts.map +1 -0
- package/dist/points-lines/prepare.d.ts +67 -0
- package/dist/points-lines/prepare.d.ts.map +1 -0
- package/dist/points-lines/record.d.ts +60 -0
- package/dist/points-lines/record.d.ts.map +1 -0
- package/dist/points-lines/snapshot.d.ts +49 -0
- package/dist/points-lines/snapshot.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +100 -5
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +4 -2
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +18 -0
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +8 -5
- 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 +93 -18
- 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 +26 -2
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +10 -1
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/render-contract.d.ts +102 -10
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +50 -6
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +32 -5
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +27 -5
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene-types.d.ts +3 -0
- package/dist/scene/render-scene-types.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +43 -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/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 +25 -2
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- 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__/authoring-path.unit.test.ts +9 -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-indirect-raster-evidence.ts +12 -2
- 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__/material-contract-inventory.unit.test.ts +62 -0
- package/src/__tests__/material-cooked-projection.unit.test.ts +18 -124
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +28 -28
- package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
- 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 +15 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
- package/src/__tests__/render-error-exhaustive.test-d.ts +22 -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 +433 -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 +102 -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 +10 -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/assembly/backend-contract.ts +47 -1
- package/src/assembly/factory.ts +1295 -507
- package/src/assembly/host-contract.ts +4 -0
- package/src/assembly/material/assembly.ts +2 -5
- 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/authoring.ts +1 -0
- package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
- package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
- package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -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 +10 -0
- package/src/components/lines.ts +18 -0
- package/src/components/motion-blur.ts +8 -0
- package/src/components/points.ts +40 -0
- package/src/construct-renderer.ts +40 -3
- package/src/device/device-scope.ts +15 -1
- 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 +429 -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 +24 -4
- 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-driven/production-raster.ts +6 -1
- package/src/gpu-scene.ts +24 -0
- package/src/ibl/skylight-bind-group.ts +30 -38
- package/src/index.ts +83 -6
- package/src/inspection-types.ts +52 -0
- package/src/internal.ts +5 -0
- package/src/materials.ts +119 -24
- package/src/pbr-pipeline.ts +66 -20
- package/src/pipeline/standard-forward-lane.ts +158 -101
- package/src/pipeline/standard-pipeline.ts +156 -105
- package/src/pipeline/standard-post.ts +373 -0
- package/src/pipeline/standard-profile.ts +11 -11
- package/src/pipeline-builder.ts +102 -12
- package/src/pipeline-spec.ts +9 -0
- package/src/plugin.ts +6 -0
- package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
- package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
- package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
- package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
- package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
- package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
- package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
- package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
- package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
- package/src/points-lines/admission.ts +238 -0
- package/src/points-lines/bounds.ts +23 -0
- package/src/points-lines/expansion-cache.ts +215 -0
- package/src/points-lines/inspection.ts +97 -0
- package/src/points-lines/prepare.ts +177 -0
- package/src/points-lines/record.ts +125 -0
- package/src/points-lines/snapshot.ts +130 -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 +14 -2
- package/src/record/frame-snapshot.ts +129 -5
- package/src/record/frame-targets.ts +15 -6
- package/src/record/frame.ts +119 -4
- package/src/record/main-pass-geometry.ts +178 -40
- package/src/record/main-pass-material.ts +114 -66
- package/src/record/main-pass-sprite-draws.ts +79 -102
- package/src/record/main-pass.ts +83 -7
- package/src/record/mesh-ssbo.ts +22 -3
- package/src/record/render-context.ts +209 -23
- package/src/record/shadow-pass.ts +129 -28
- package/src/record/skybox-post-pass.ts +99 -42
- package/src/record/typed-frame-graph.ts +582 -42
- package/src/record/view-ubo.ts +99 -4
- package/src/render-contract.ts +121 -7
- package/src/render-graph-primitives.ts +18 -1
- package/src/render-pipeline.ts +100 -27
- package/src/render-system-extract.ts +264 -77
- package/src/render-system.ts +786 -43
- package/src/scene/render-scene-types.ts +3 -0
- package/src/scene/render-scene.ts +307 -9
- 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/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 +438 -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 +162 -9
- 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-QC4VW3XJ.mjs.map +0 -1
- package/dist/chunk-SCRSAK5B.mjs.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/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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { RenderSceneResyncReason } from '../inspection-types';
|
|
2
|
+
import type { PointsLinesRetainedSnapshot } from '../points-lines/snapshot';
|
|
2
3
|
import type { RenderableSnapshot } from '../render-system-extract';
|
|
3
4
|
|
|
4
5
|
export type { RenderSceneResyncReason } from '../inspection-types';
|
|
@@ -23,6 +24,8 @@ export interface RenderSceneRecord extends RenderSceneIdentity {
|
|
|
23
24
|
|
|
24
25
|
export interface RenderSceneSlot extends RenderSceneRecord {
|
|
25
26
|
readonly snapshot: RenderableSnapshot;
|
|
27
|
+
/** Optional detached projection carried with the retained render slot. */
|
|
28
|
+
readonly pointsLines?: PointsLinesRetainedSnapshot;
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
export interface RenderSceneApplyResult {
|
|
@@ -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,
|
|
@@ -29,13 +30,23 @@ import {
|
|
|
29
30
|
} from '../gpu-driven/batch-topology';
|
|
30
31
|
import { GpuScene } from '../gpu-scene';
|
|
31
32
|
import type { PersistentRenderSceneInspection } from '../inspection-types';
|
|
33
|
+
import type { PointsLinesInspection } from '../points-lines/inspection';
|
|
34
|
+
import type { PointsLinesRetainedSnapshot } from '../points-lines/snapshot';
|
|
32
35
|
import type { CameraSnapshot } from '../render-contract';
|
|
33
36
|
import type {
|
|
34
37
|
DispatchEntry,
|
|
35
38
|
ExtractedFrame,
|
|
39
|
+
MaterialSnapshot,
|
|
36
40
|
MaterialSnapshotCachesByWorld,
|
|
41
|
+
RenderableReactiveReason,
|
|
37
42
|
RenderableSnapshot,
|
|
43
|
+
RenderableTemporalSnapshot,
|
|
38
44
|
} from '../render-system-extract';
|
|
45
|
+
import {
|
|
46
|
+
PersistentTransmissionDemandProjection,
|
|
47
|
+
type TransmissionDemand,
|
|
48
|
+
type TransmissionDemandOperation,
|
|
49
|
+
} from '../transmission/projection';
|
|
39
50
|
import type {
|
|
40
51
|
RenderSceneApplyResult,
|
|
41
52
|
RenderSceneBounds,
|
|
@@ -67,13 +78,63 @@ interface PendingIdentity {
|
|
|
67
78
|
removed: boolean;
|
|
68
79
|
}
|
|
69
80
|
|
|
81
|
+
export interface RenderSceneSubmissionCapture {
|
|
82
|
+
readonly revision: number;
|
|
83
|
+
readonly slots: readonly {
|
|
84
|
+
readonly slot: number;
|
|
85
|
+
readonly current: RenderSceneSlot | undefined;
|
|
86
|
+
}[];
|
|
87
|
+
readonly visible: ReadonlySet<string>;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface RenderSceneSubmissionDelta {
|
|
91
|
+
readonly epoch: number;
|
|
92
|
+
readonly slots: readonly number[];
|
|
93
|
+
}
|
|
94
|
+
|
|
70
95
|
function identityKey(worldId: number, entityKey: number): string {
|
|
71
96
|
return `${worldId}:${entityKey}`;
|
|
72
97
|
}
|
|
73
98
|
|
|
99
|
+
const STANDARD_TRANSMISSION_SHADER = 'forgeax::default-standard-pbr';
|
|
100
|
+
|
|
101
|
+
function transmissionValue(material: MaterialSnapshot): number {
|
|
102
|
+
const value = material.paramSnapshot?.transmission;
|
|
103
|
+
return typeof value === 'number' ? value : 0;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function transmissionRoughness(material: MaterialSnapshot): number {
|
|
107
|
+
const value = material.paramSnapshot?.roughness;
|
|
108
|
+
return typeof value === 'number' ? value : material.roughness;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function transmissionDemandOperations(
|
|
112
|
+
renderables: readonly RenderableSnapshot[],
|
|
113
|
+
): readonly TransmissionDemandOperation[] {
|
|
114
|
+
const operations: TransmissionDemandOperation[] = [];
|
|
115
|
+
for (const renderable of renderables) {
|
|
116
|
+
for (const [materialIndex, material] of renderable.materials.entries()) {
|
|
117
|
+
operations.push({
|
|
118
|
+
kind: 'upsert',
|
|
119
|
+
key: `${renderable.worldId}:${renderable.entityKey}:${materialIndex}`,
|
|
120
|
+
candidate: {
|
|
121
|
+
attached: true,
|
|
122
|
+
ready:
|
|
123
|
+
material.materialShaderId === STANDARD_TRANSMISSION_SHADER &&
|
|
124
|
+
material.paramSnapshot !== undefined,
|
|
125
|
+
transmission: transmissionValue(material),
|
|
126
|
+
roughness: transmissionRoughness(material),
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return operations;
|
|
132
|
+
}
|
|
133
|
+
|
|
74
134
|
function ownSnapshot(snapshot: RenderableSnapshot): RenderableSnapshot {
|
|
135
|
+
const { temporal: _temporal, ...current } = snapshot;
|
|
75
136
|
return {
|
|
76
|
-
...
|
|
137
|
+
...current,
|
|
77
138
|
transform: { ...snapshot.transform, world: new Float32Array(snapshot.transform.world) },
|
|
78
139
|
...(snapshot.localAabb === undefined
|
|
79
140
|
? {}
|
|
@@ -95,6 +156,21 @@ function ownSnapshot(snapshot: RenderableSnapshot): RenderableSnapshot {
|
|
|
95
156
|
regions: new Float32Array(snapshot.spriteInstances.regions),
|
|
96
157
|
},
|
|
97
158
|
}),
|
|
159
|
+
...(snapshot.pointsLines === undefined
|
|
160
|
+
? {}
|
|
161
|
+
: { pointsLines: ownPointsLinesSnapshot(snapshot.pointsLines) }),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function ownPointsLinesSnapshot(
|
|
166
|
+
snapshot: PointsLinesRetainedSnapshot,
|
|
167
|
+
): PointsLinesRetainedSnapshot {
|
|
168
|
+
return {
|
|
169
|
+
...snapshot,
|
|
170
|
+
style: snapshot.style === undefined ? undefined : { ...snapshot.style },
|
|
171
|
+
sourceBounds: new Float32Array(snapshot.sourceBounds),
|
|
172
|
+
viewport: { ...snapshot.viewport },
|
|
173
|
+
projection: new Float32Array(snapshot.projection),
|
|
98
174
|
};
|
|
99
175
|
}
|
|
100
176
|
|
|
@@ -152,10 +228,18 @@ function worldBounds(snapshot: RenderableSnapshot): RenderSceneBounds | undefine
|
|
|
152
228
|
*/
|
|
153
229
|
export class RenderScene {
|
|
154
230
|
private readonly slots: Array<RenderSceneSlot | undefined> = [];
|
|
231
|
+
private readonly lastSubmittedSlots: Array<RenderSceneSlot | undefined> = [];
|
|
155
232
|
private readonly generations: number[] = [];
|
|
156
233
|
private readonly freeSlots: number[] = [];
|
|
157
234
|
private readonly slotsByWorld = new Map<number, Map<number, number>>();
|
|
158
235
|
private readonly slotsByMaterial = new Map<number, Set<number>>();
|
|
236
|
+
private readonly dirtySinceSubmitted = new Set<number>();
|
|
237
|
+
private lastSubmittedVisible = new Set<string>();
|
|
238
|
+
private submittedEpoch = 0;
|
|
239
|
+
// World bounds are a pure projection of each immutable snapshot. Cache the
|
|
240
|
+
// derived value by snapshot identity so repeated view queries do not redo
|
|
241
|
+
// the eight-corner transform for every view in the same frame.
|
|
242
|
+
private readonly worldBoundsCache = new WeakMap<RenderableSnapshot, RenderSceneBounds | null>();
|
|
159
243
|
private orderedSlots: number[] = [];
|
|
160
244
|
private materialized: readonly RenderableSnapshot[] | undefined;
|
|
161
245
|
private slotSnapshot: readonly RenderSceneSlot[] | undefined;
|
|
@@ -167,6 +251,11 @@ export class RenderScene {
|
|
|
167
251
|
private resyncs = 0;
|
|
168
252
|
private lastResyncReason: RenderSceneResyncReason | undefined;
|
|
169
253
|
|
|
254
|
+
/** Bounded current-scene facts for the Standard temporal producer. */
|
|
255
|
+
temporalContributorCount(): number {
|
|
256
|
+
return this.orderedSlots.length;
|
|
257
|
+
}
|
|
258
|
+
|
|
170
259
|
apply(operations: readonly RenderSceneOperation[]): RenderSceneApplyResult {
|
|
171
260
|
if (operations.length === 0) {
|
|
172
261
|
this.noChangeFrames += 1;
|
|
@@ -232,19 +321,25 @@ export class RenderScene {
|
|
|
232
321
|
for (const pending of pendingOrder) {
|
|
233
322
|
if (pending.initial === undefined) {
|
|
234
323
|
if (pending.current === undefined) continue;
|
|
235
|
-
|
|
324
|
+
const createdSlot = this.allocate(pending.current);
|
|
325
|
+
this.dirtySinceSubmitted.add(createdSlot.slot);
|
|
326
|
+
createdSlots.push(createdSlot);
|
|
236
327
|
created += 1;
|
|
237
328
|
continue;
|
|
238
329
|
}
|
|
239
330
|
if (pending.current === undefined) {
|
|
331
|
+
this.dirtySinceSubmitted.add(pending.initial.slot);
|
|
240
332
|
this.release(pending.initial);
|
|
241
333
|
removedSlots.push(pending.initial);
|
|
242
334
|
removed += 1;
|
|
243
335
|
continue;
|
|
244
336
|
}
|
|
245
337
|
if (pending.removed) {
|
|
338
|
+
this.dirtySinceSubmitted.add(pending.initial.slot);
|
|
246
339
|
this.release(pending.initial);
|
|
247
|
-
|
|
340
|
+
const recreatedSlot = this.allocate(pending.current);
|
|
341
|
+
this.dirtySinceSubmitted.add(recreatedSlot.slot);
|
|
342
|
+
recreatedSlots.push(recreatedSlot);
|
|
248
343
|
recreated += 1;
|
|
249
344
|
continue;
|
|
250
345
|
}
|
|
@@ -255,6 +350,7 @@ export class RenderScene {
|
|
|
255
350
|
this.unindexMaterials(pending.initial);
|
|
256
351
|
this.slots[pending.initial.slot] = updatedSlot;
|
|
257
352
|
this.indexMaterials(updatedSlot);
|
|
353
|
+
this.dirtySinceSubmitted.add(updatedSlot.slot);
|
|
258
354
|
updatedSlots.push(updatedSlot);
|
|
259
355
|
updated += 1;
|
|
260
356
|
}
|
|
@@ -295,6 +391,12 @@ export class RenderScene {
|
|
|
295
391
|
|
|
296
392
|
/** Reconcile the current identity set while retaining slots for survivors. */
|
|
297
393
|
reset(snapshots: readonly RenderableSnapshot[], countAsRebuild = true): void {
|
|
394
|
+
// A full reconciliation is a temporal cut. Survivors may keep their
|
|
395
|
+
// stable slot, but no prior slot is valid until this frame submits.
|
|
396
|
+
this.lastSubmittedSlots.length = 0;
|
|
397
|
+
this.lastSubmittedVisible.clear();
|
|
398
|
+
this.dirtySinceSubmitted.clear();
|
|
399
|
+
this.submittedEpoch = 0;
|
|
298
400
|
const desired = new Map<string, RenderableSnapshot>();
|
|
299
401
|
for (const snapshot of snapshots) {
|
|
300
402
|
desired.set(identityKey(snapshot.worldId, snapshot.entityKey), snapshot);
|
|
@@ -309,7 +411,8 @@ export class RenderScene {
|
|
|
309
411
|
for (const snapshot of desired.values()) {
|
|
310
412
|
const existing = this.lookup(snapshot.worldId, snapshot.entityKey);
|
|
311
413
|
if (existing === undefined) {
|
|
312
|
-
this.allocate(snapshot);
|
|
414
|
+
const created = this.allocate(snapshot);
|
|
415
|
+
this.dirtySinceSubmitted.add(created.slot);
|
|
313
416
|
continue;
|
|
314
417
|
}
|
|
315
418
|
const updated: RenderSceneSlot = {
|
|
@@ -319,6 +422,7 @@ export class RenderScene {
|
|
|
319
422
|
this.unindexMaterials(existing);
|
|
320
423
|
this.slots[existing.slot] = updated;
|
|
321
424
|
this.indexMaterials(updated);
|
|
425
|
+
this.dirtySinceSubmitted.add(updated.slot);
|
|
322
426
|
this.orderedSlots.push(existing.slot);
|
|
323
427
|
}
|
|
324
428
|
|
|
@@ -342,6 +446,59 @@ export class RenderScene {
|
|
|
342
446
|
return this.materialized;
|
|
343
447
|
}
|
|
344
448
|
|
|
449
|
+
lastSubmittedSlotByIndex(slot: number): RenderSceneSlot | undefined {
|
|
450
|
+
return this.lastSubmittedSlots[slot];
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
temporalSnapshotBySlot(slot: number): RenderableTemporalSnapshot | undefined {
|
|
454
|
+
const current = this.slots[slot];
|
|
455
|
+
return current === undefined ? undefined : this.temporalSnapshot(current);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
withTemporal(snapshot: RenderableSnapshot): RenderableSnapshot {
|
|
459
|
+
const slot = this.lookup(snapshot.worldId, snapshot.entityKey);
|
|
460
|
+
return slot === undefined ? snapshot : { ...snapshot, temporal: this.temporalSnapshot(slot) };
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
wasLastSubmittedVisible(slot: number, generation: number): boolean {
|
|
464
|
+
return this.lastSubmittedVisible.has(`${slot}:${generation}`);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
captureSubmission(
|
|
468
|
+
visible: readonly Pick<RenderableSnapshot, 'worldId' | 'entityKey'>[],
|
|
469
|
+
): RenderSceneSubmissionCapture {
|
|
470
|
+
const visibleSlots = new Set<string>();
|
|
471
|
+
for (const snapshot of visible) {
|
|
472
|
+
const slot = this.lookup(snapshot.worldId, snapshot.entityKey);
|
|
473
|
+
if (slot !== undefined) visibleSlots.add(`${slot.slot}:${slot.generation}`);
|
|
474
|
+
}
|
|
475
|
+
return {
|
|
476
|
+
revision: this.revision,
|
|
477
|
+
slots: [...this.dirtySinceSubmitted].map((slot) => ({
|
|
478
|
+
slot,
|
|
479
|
+
current: this.slots[slot],
|
|
480
|
+
})),
|
|
481
|
+
visible: visibleSlots,
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
commitSubmission(capture: RenderSceneSubmissionCapture): RenderSceneSubmissionDelta {
|
|
486
|
+
if (capture.revision !== this.revision) {
|
|
487
|
+
throw new RangeError('render scene changed while its temporal submission was active');
|
|
488
|
+
}
|
|
489
|
+
for (const update of capture.slots) {
|
|
490
|
+
this.lastSubmittedSlots[update.slot] = update.current;
|
|
491
|
+
this.dirtySinceSubmitted.delete(update.slot);
|
|
492
|
+
}
|
|
493
|
+
this.lastSubmittedVisible = new Set(capture.visible);
|
|
494
|
+
this.submittedEpoch += 1;
|
|
495
|
+
this.invalidateSnapshots();
|
|
496
|
+
return {
|
|
497
|
+
epoch: this.submittedEpoch,
|
|
498
|
+
slots: capture.slots.map((update) => update.slot),
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
|
|
345
502
|
slotsSnapshot(): readonly RenderSceneSlot[] {
|
|
346
503
|
if (this.slotSnapshot !== undefined) return this.slotSnapshot;
|
|
347
504
|
const records: RenderSceneSlot[] = [];
|
|
@@ -365,6 +522,18 @@ export class RenderScene {
|
|
|
365
522
|
return this.lookup(worldId, entityKey)?.snapshot;
|
|
366
523
|
}
|
|
367
524
|
|
|
525
|
+
pointsLinesSnapshots(): readonly PointsLinesRetainedSnapshot[] {
|
|
526
|
+
const snapshots: PointsLinesRetainedSnapshot[] = [];
|
|
527
|
+
for (const slot of this.orderedSlots) {
|
|
528
|
+
const record = this.slots[slot];
|
|
529
|
+
const snapshot = record?.snapshot.pointsLines;
|
|
530
|
+
if (record !== undefined && snapshot !== undefined) {
|
|
531
|
+
snapshots.push(ownPointsLinesSnapshot({ ...snapshot, worldId: record.worldId }));
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
return Object.freeze(snapshots);
|
|
535
|
+
}
|
|
536
|
+
|
|
368
537
|
slotsForMaterial(materialHandle: number): readonly RenderSceneSlot[] {
|
|
369
538
|
const slots = this.slotsByMaterial.get(materialHandle);
|
|
370
539
|
if (slots === undefined) return [];
|
|
@@ -381,8 +550,14 @@ export class RenderScene {
|
|
|
381
550
|
for (const slot of this.orderedSlots) {
|
|
382
551
|
const record = this.slots[slot];
|
|
383
552
|
if (record === undefined) continue;
|
|
384
|
-
const
|
|
385
|
-
|
|
553
|
+
const snapshot = record.snapshot;
|
|
554
|
+
let candidate = this.worldBoundsCache.get(snapshot);
|
|
555
|
+
if (candidate === undefined && !this.worldBoundsCache.has(snapshot)) {
|
|
556
|
+
candidate = worldBounds(snapshot) ?? null;
|
|
557
|
+
this.worldBoundsCache.set(snapshot, candidate);
|
|
558
|
+
}
|
|
559
|
+
if (candidate === null || candidate === undefined) continue;
|
|
560
|
+
if (intersects(candidate, bounds)) records.push(record);
|
|
386
561
|
}
|
|
387
562
|
return records;
|
|
388
563
|
}
|
|
@@ -483,6 +658,49 @@ export class RenderScene {
|
|
|
483
658
|
}
|
|
484
659
|
}
|
|
485
660
|
|
|
661
|
+
private temporalSnapshot(slot: RenderSceneSlot): RenderableTemporalSnapshot {
|
|
662
|
+
const submitted = this.lastSubmittedSlots[slot.slot];
|
|
663
|
+
const sameGeneration = submitted?.generation === slot.generation;
|
|
664
|
+
const wasVisible =
|
|
665
|
+
sameGeneration && this.lastSubmittedVisible.has(`${slot.slot}:${slot.generation}`);
|
|
666
|
+
const reasons: RenderableReactiveReason[] = [];
|
|
667
|
+
if (!sameGeneration) {
|
|
668
|
+
reasons.push(submitted === undefined ? 'new-slot' : 'generation-reuse');
|
|
669
|
+
} else if (!wasVisible) {
|
|
670
|
+
reasons.push('reentered');
|
|
671
|
+
}
|
|
672
|
+
if (
|
|
673
|
+
sameGeneration &&
|
|
674
|
+
submitted !== undefined &&
|
|
675
|
+
submitted.snapshot.assetHandle !== slot.snapshot.assetHandle
|
|
676
|
+
) {
|
|
677
|
+
reasons.push('geometry-revision');
|
|
678
|
+
}
|
|
679
|
+
if (
|
|
680
|
+
sameGeneration &&
|
|
681
|
+
submitted !== undefined &&
|
|
682
|
+
submitted.snapshot.materials !== slot.snapshot.materials
|
|
683
|
+
) {
|
|
684
|
+
reasons.push('material-revision');
|
|
685
|
+
}
|
|
686
|
+
const seedCurrent =
|
|
687
|
+
!sameGeneration ||
|
|
688
|
+
!wasVisible ||
|
|
689
|
+
reasons.includes('geometry-revision') ||
|
|
690
|
+
reasons.includes('material-revision');
|
|
691
|
+
const previous = seedCurrent || submitted === undefined ? slot.snapshot : submitted.snapshot;
|
|
692
|
+
return {
|
|
693
|
+
previousEpoch: seedCurrent ? undefined : this.submittedEpoch,
|
|
694
|
+
previousSource: seedCurrent ? 'current-seed' : 'last-submitted',
|
|
695
|
+
reactive: reasons.length > 0,
|
|
696
|
+
reactiveReasons: reasons,
|
|
697
|
+
previousTransform: previous.transform,
|
|
698
|
+
previousInstances: previous.instances,
|
|
699
|
+
previousSkin: previous.skin,
|
|
700
|
+
previousMorphWeights: previous.morph?.weights,
|
|
701
|
+
};
|
|
702
|
+
}
|
|
703
|
+
|
|
486
704
|
private invalidateSnapshots(): void {
|
|
487
705
|
this.materialized = undefined;
|
|
488
706
|
this.slotSnapshot = undefined;
|
|
@@ -515,6 +733,7 @@ interface PersistentCompositionEntry {
|
|
|
515
733
|
readonly resourceOwner: number;
|
|
516
734
|
readonly projection: RenderScene;
|
|
517
735
|
readonly topology: BatchTopology;
|
|
736
|
+
readonly transmissionDemand: PersistentTransmissionDemandProjection;
|
|
518
737
|
readonly readCursors: number[];
|
|
519
738
|
readonly leaseIdentities: readonly string[];
|
|
520
739
|
catalogEpoch: number;
|
|
@@ -654,6 +873,10 @@ export class PersistentRenderScene {
|
|
|
654
873
|
private gpuDevice: RhiDevice | undefined;
|
|
655
874
|
private gpuStatus: 'inactive' | 'unsupported' | 'resident' | 'rebuild-pending' | 'error' =
|
|
656
875
|
'inactive';
|
|
876
|
+
private temporalCapture:
|
|
877
|
+
| { readonly projection: RenderScene; readonly capture: RenderSceneSubmissionCapture }
|
|
878
|
+
| undefined;
|
|
879
|
+
private pointsLinesInspections: readonly PointsLinesInspection[] = [];
|
|
657
880
|
|
|
658
881
|
constructor(private readonly options: PersistentRenderSceneOptions = {}) {}
|
|
659
882
|
|
|
@@ -777,7 +1000,11 @@ export class PersistentRenderScene {
|
|
|
777
1000
|
});
|
|
778
1001
|
continue;
|
|
779
1002
|
}
|
|
1003
|
+
// Camera snapshots are rebuilt from the current candidate frame and
|
|
1004
|
+
// drive culling there; moving a camera must not invalidate the
|
|
1005
|
+
// retained scene projection or recreate its GPU tables.
|
|
780
1006
|
if (
|
|
1007
|
+
!world.hasComponent(entity, Camera) &&
|
|
781
1008
|
NON_RENDERABLE_TRANSFORM_CONSUMERS.some((component) =>
|
|
782
1009
|
world.hasComponent(entity, component),
|
|
783
1010
|
)
|
|
@@ -808,6 +1035,7 @@ export class PersistentRenderScene {
|
|
|
808
1035
|
|
|
809
1036
|
invalidate(): void {
|
|
810
1037
|
this.composition = undefined;
|
|
1038
|
+
this.temporalCapture = undefined;
|
|
811
1039
|
this.lastResyncReason = 'explicit-invalidate';
|
|
812
1040
|
}
|
|
813
1041
|
|
|
@@ -824,6 +1052,7 @@ export class PersistentRenderScene {
|
|
|
824
1052
|
? this.composition
|
|
825
1053
|
: undefined;
|
|
826
1054
|
if (detachedComposition !== undefined) this.composition = undefined;
|
|
1055
|
+
if (detachedComposition !== undefined) this.temporalCapture = undefined;
|
|
827
1056
|
if (this.gpuOwner !== world && this.gpuOwner !== detachedComposition?.token) return;
|
|
828
1057
|
this.gpuScene?.dispose();
|
|
829
1058
|
this.gpuScene = undefined;
|
|
@@ -841,6 +1070,14 @@ export class PersistentRenderScene {
|
|
|
841
1070
|
this.gpuStatus = this.options.getDevice === undefined ? 'inactive' : 'rebuild-pending';
|
|
842
1071
|
}
|
|
843
1072
|
|
|
1073
|
+
setPointsLinesInspections(inspections: readonly PointsLinesInspection[]): void {
|
|
1074
|
+
this.pointsLinesInspections = inspections.map((inspection) => ({
|
|
1075
|
+
...inspection,
|
|
1076
|
+
cache: { ...inspection.cache },
|
|
1077
|
+
...(inspection.refusal === undefined ? {} : { refusal: { ...inspection.refusal } }),
|
|
1078
|
+
}));
|
|
1079
|
+
}
|
|
1080
|
+
|
|
844
1081
|
dispose(): void {
|
|
845
1082
|
this.gpuScene?.dispose();
|
|
846
1083
|
this.gpuScene = undefined;
|
|
@@ -848,10 +1085,13 @@ export class PersistentRenderScene {
|
|
|
848
1085
|
this.gpuDevice = undefined;
|
|
849
1086
|
this.gpuStatus = 'inactive';
|
|
850
1087
|
this.composition = undefined;
|
|
1088
|
+
this.temporalCapture = undefined;
|
|
1089
|
+
this.pointsLinesInspections = [];
|
|
851
1090
|
}
|
|
852
1091
|
|
|
853
1092
|
inspect(): PersistentRenderSceneInspection {
|
|
854
1093
|
const entry = this.composition;
|
|
1094
|
+
const pointsLines = this.pointsLinesInspections;
|
|
855
1095
|
return {
|
|
856
1096
|
worldEntitiesScanned: this.worldEntitiesScanned,
|
|
857
1097
|
fullRebuilds: this.fullRebuilds,
|
|
@@ -871,6 +1111,7 @@ export class PersistentRenderScene {
|
|
|
871
1111
|
ineligible: 0,
|
|
872
1112
|
} satisfies BatchTopologyInspection),
|
|
873
1113
|
gpu: this.inspectGpu(),
|
|
1114
|
+
pointsLines,
|
|
874
1115
|
};
|
|
875
1116
|
}
|
|
876
1117
|
|
|
@@ -886,6 +1127,44 @@ export class PersistentRenderScene {
|
|
|
886
1127
|
};
|
|
887
1128
|
}
|
|
888
1129
|
|
|
1130
|
+
/** Publish renderer-owned previous transforms after queue submission. */
|
|
1131
|
+
commitTemporalFrame(): Result<void, RhiError> {
|
|
1132
|
+
const gpuCommit = this.gpuScene?.commitTemporalFrame();
|
|
1133
|
+
if (gpuCommit !== undefined && !gpuCommit.ok) return gpuCommit;
|
|
1134
|
+
const temporalCapture = this.temporalCapture;
|
|
1135
|
+
if (temporalCapture !== undefined) {
|
|
1136
|
+
try {
|
|
1137
|
+
temporalCapture.projection.commitSubmission(temporalCapture.capture);
|
|
1138
|
+
} catch (cause) {
|
|
1139
|
+
void cause;
|
|
1140
|
+
return err(
|
|
1141
|
+
new RhiError({
|
|
1142
|
+
code: 'internal-error',
|
|
1143
|
+
expected: 'render scene remains unchanged while a submitted temporal frame commits',
|
|
1144
|
+
hint: 'retry the temporal frame after the renderer-owned scene snapshot is stable',
|
|
1145
|
+
}),
|
|
1146
|
+
);
|
|
1147
|
+
}
|
|
1148
|
+
this.temporalCapture = undefined;
|
|
1149
|
+
}
|
|
1150
|
+
return ok(undefined);
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
/** Capture current CPU scene facts; commitTemporalFrame publishes them only after submit. */
|
|
1154
|
+
prepareTemporalFrame(
|
|
1155
|
+
visible: readonly Pick<RenderableSnapshot, 'worldId' | 'entityKey'>[],
|
|
1156
|
+
): void {
|
|
1157
|
+
const projection = this.composition?.projection;
|
|
1158
|
+
this.temporalCapture =
|
|
1159
|
+
projection === undefined
|
|
1160
|
+
? undefined
|
|
1161
|
+
: { projection, capture: projection.captureSubmission(visible) };
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
pointsLinesSnapshots(): readonly PointsLinesRetainedSnapshot[] {
|
|
1165
|
+
return this.composition?.projection.pointsLinesSnapshots() ?? [];
|
|
1166
|
+
}
|
|
1167
|
+
|
|
889
1168
|
private inspectGpu(): PersistentGpuSceneInspection {
|
|
890
1169
|
if (this.gpuStatus === 'resident' && this.gpuScene !== undefined) {
|
|
891
1170
|
return { status: 'resident', ...this.gpuScene.inspect() };
|
|
@@ -906,9 +1185,12 @@ export class PersistentRenderScene {
|
|
|
906
1185
|
leases?: readonly RenderReadLease[],
|
|
907
1186
|
): ExtractedFrame {
|
|
908
1187
|
const candidateFrame = buildCandidateFrame();
|
|
1188
|
+
this.temporalCapture = undefined;
|
|
909
1189
|
this.worldEntitiesScanned = candidateFrame.renderables.length;
|
|
910
1190
|
const projection = new RenderScene();
|
|
911
1191
|
projection.reset(candidateFrame.renderables);
|
|
1192
|
+
const transmissionDemand = new PersistentTransmissionDemandProjection();
|
|
1193
|
+
transmissionDemand.apply(transmissionDemandOperations(candidateFrame.renderables));
|
|
912
1194
|
const topology = new BatchTopology();
|
|
913
1195
|
topology.rebuild(projection.slotsSnapshot());
|
|
914
1196
|
const token = {};
|
|
@@ -919,6 +1201,7 @@ export class PersistentRenderScene {
|
|
|
919
1201
|
resourceOwner: owner.resourceOwner,
|
|
920
1202
|
projection,
|
|
921
1203
|
topology,
|
|
1204
|
+
transmissionDemand,
|
|
922
1205
|
readCursors:
|
|
923
1206
|
leases === undefined || leases.length !== worlds.length
|
|
924
1207
|
? []
|
|
@@ -936,7 +1219,20 @@ export class PersistentRenderScene {
|
|
|
936
1219
|
this.syncGpuOwner(token, projection, undefined, true);
|
|
937
1220
|
this.fullRebuilds += 1;
|
|
938
1221
|
this.lastResyncReason = 'attach';
|
|
939
|
-
|
|
1222
|
+
const candidates = projection
|
|
1223
|
+
.materialize()
|
|
1224
|
+
.map((snapshot) => projection.withTemporal(snapshot));
|
|
1225
|
+
return cullPersistentFrame({ ...candidateFrame, renderables: [...candidates] }, candidates);
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
/** Internal topology fact; the renderer does not expose demand as public API. */
|
|
1229
|
+
transmissionTopologyDemand(): TransmissionDemand {
|
|
1230
|
+
return (
|
|
1231
|
+
this.composition?.transmissionDemand.inspect() ?? {
|
|
1232
|
+
activeCount: 0,
|
|
1233
|
+
needsRoughMips: false,
|
|
1234
|
+
}
|
|
1235
|
+
);
|
|
940
1236
|
}
|
|
941
1237
|
|
|
942
1238
|
/**
|
|
@@ -948,7 +1244,9 @@ export class PersistentRenderScene {
|
|
|
948
1244
|
buildCandidateFrame: () => ExtractedFrame,
|
|
949
1245
|
): ExtractedFrame {
|
|
950
1246
|
const candidateFrame = buildCandidateFrame();
|
|
951
|
-
const candidates = entry.projection
|
|
1247
|
+
const candidates = entry.projection
|
|
1248
|
+
.materialize()
|
|
1249
|
+
.map((snapshot) => entry.projection.withTemporal(snapshot));
|
|
952
1250
|
return cullPersistentFrame({ ...candidateFrame, renderables: [...candidates] }, candidates);
|
|
953
1251
|
}
|
|
954
1252
|
|
|
@@ -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
|
+
}
|