@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
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
TransmissionBackdropExtent,
|
|
3
|
+
TransmissionBackdropTopology,
|
|
4
|
+
TransmissionCandidateAdmissionInspection,
|
|
5
|
+
TransmissionCapabilityFact,
|
|
6
|
+
TransmissionCapabilityVerdict,
|
|
7
|
+
TransmissionLifecycleState,
|
|
8
|
+
TransmissionRecoveryState,
|
|
9
|
+
} from './backdrop';
|
|
10
|
+
import type { TransmissionDemand } from './projection';
|
|
11
|
+
|
|
12
|
+
export type {
|
|
13
|
+
TransmissionBackdropExtent,
|
|
14
|
+
TransmissionCandidateAdmissionInspection,
|
|
15
|
+
TransmissionLifecycleState,
|
|
16
|
+
TransmissionRecoveryState,
|
|
17
|
+
} from './backdrop';
|
|
18
|
+
|
|
19
|
+
export interface TransmissionInspection {
|
|
20
|
+
readonly activeCount: number;
|
|
21
|
+
readonly needsRoughMips: boolean;
|
|
22
|
+
readonly extent: TransmissionBackdropExtent;
|
|
23
|
+
readonly format: string;
|
|
24
|
+
/** Total resident mip levels, including level zero. */
|
|
25
|
+
readonly mipCount: number;
|
|
26
|
+
readonly bytes: number;
|
|
27
|
+
readonly copyCount: number;
|
|
28
|
+
readonly transmissionDrawCount: number;
|
|
29
|
+
readonly fallbackCount: number;
|
|
30
|
+
readonly generation: number;
|
|
31
|
+
readonly singleLayer: true;
|
|
32
|
+
readonly lifecycle: TransmissionLifecycleState;
|
|
33
|
+
readonly lastKnownGood: boolean;
|
|
34
|
+
readonly recovery: TransmissionRecoveryState;
|
|
35
|
+
readonly capability: TransmissionCapabilityVerdict;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface TransmissionInspectionInput {
|
|
39
|
+
readonly demand: TransmissionDemand;
|
|
40
|
+
readonly topology: Pick<TransmissionBackdropTopology, 'active' | 'copyCount' | 'mipCount'>;
|
|
41
|
+
readonly extent: TransmissionBackdropExtent;
|
|
42
|
+
readonly generation: number;
|
|
43
|
+
readonly lastKnownGood: boolean;
|
|
44
|
+
readonly recovery: TransmissionRecoveryState;
|
|
45
|
+
readonly lifecycle?: TransmissionLifecycleState;
|
|
46
|
+
/** Whether a committed physical backdrop is resident on the active device. */
|
|
47
|
+
readonly resourcePresent?: boolean;
|
|
48
|
+
readonly format?: string;
|
|
49
|
+
/** Override only when the resource receipt reports the actual total. */
|
|
50
|
+
readonly mipCount?: number;
|
|
51
|
+
/** Override only when the resource receipt reports the actual allocation. */
|
|
52
|
+
readonly bytes?: number;
|
|
53
|
+
readonly transmissionDrawCount?: number;
|
|
54
|
+
readonly fallbackCount?: number;
|
|
55
|
+
readonly capability?: TransmissionCapabilityVerdict;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface TransmissionInspectionFromAdmissionInput {
|
|
59
|
+
readonly admission: TransmissionCandidateAdmissionInspection;
|
|
60
|
+
readonly topology: TransmissionInspectionInput['topology'];
|
|
61
|
+
readonly extent: TransmissionBackdropExtent;
|
|
62
|
+
readonly transmissionDrawCount?: number;
|
|
63
|
+
readonly fallbackCount?: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const RGBA16FLOAT_BYTES_PER_PIXEL = 8;
|
|
67
|
+
|
|
68
|
+
function assertNonNegativeInteger(name: string, value: number): void {
|
|
69
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
70
|
+
throw new Error(`${name} must be a non-negative integer`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function assertExtent(extent: TransmissionBackdropExtent): void {
|
|
75
|
+
if (!Number.isInteger(extent.width) || extent.width <= 0) {
|
|
76
|
+
throw new Error('transmission inspection extent.width must be a positive integer');
|
|
77
|
+
}
|
|
78
|
+
if (!Number.isInteger(extent.height) || extent.height <= 0) {
|
|
79
|
+
throw new Error('transmission inspection extent.height must be a positive integer');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function mipExtent(value: number, level: number): number {
|
|
84
|
+
return Math.max(1, Math.floor(value / 2 ** level));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function estimateTransmissionBackdropBytes(
|
|
88
|
+
extent: TransmissionBackdropExtent,
|
|
89
|
+
mipCount: number,
|
|
90
|
+
format = 'rgba16float',
|
|
91
|
+
): number {
|
|
92
|
+
assertExtent(extent);
|
|
93
|
+
assertNonNegativeInteger('transmission inspection mipCount', mipCount);
|
|
94
|
+
if (format !== 'rgba16float' || mipCount === 0) return 0;
|
|
95
|
+
|
|
96
|
+
let bytes = 0;
|
|
97
|
+
for (let level = 0; level < mipCount; level += 1) {
|
|
98
|
+
bytes += mipExtent(extent.width, level) * mipExtent(extent.height, level);
|
|
99
|
+
}
|
|
100
|
+
return bytes * RGBA16FLOAT_BYTES_PER_PIXEL;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function copyCapability(capability: TransmissionCapabilityVerdict): TransmissionCapabilityVerdict {
|
|
104
|
+
return capability.ok
|
|
105
|
+
? { ok: true, missing: [] }
|
|
106
|
+
: { ok: false, missing: [...capability.missing] as TransmissionCapabilityFact[] };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function defaultLifecycle(active: boolean, lastKnownGood: boolean): TransmissionLifecycleState {
|
|
110
|
+
if (!active) return 'inactive';
|
|
111
|
+
return lastKnownGood ? 'resident' : 'failed';
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Project the last completed backdrop facts into a detached, stable POD.
|
|
116
|
+
* Demand and copy/mip topology are read from their existing owners; this
|
|
117
|
+
* function never accepts a texture, view, encoder, queue, or graph handle.
|
|
118
|
+
*/
|
|
119
|
+
export function inspectTransmission(input: TransmissionInspectionInput): TransmissionInspection {
|
|
120
|
+
const active = input.demand.activeCount > 0;
|
|
121
|
+
if (input.topology.active !== active) {
|
|
122
|
+
throw new Error('transmission inspection demand and topology are inconsistent');
|
|
123
|
+
}
|
|
124
|
+
assertNonNegativeInteger('transmission inspection generation', input.generation);
|
|
125
|
+
assertNonNegativeInteger(
|
|
126
|
+
'transmission inspection transmissionDrawCount',
|
|
127
|
+
input.transmissionDrawCount ?? 0,
|
|
128
|
+
);
|
|
129
|
+
assertNonNegativeInteger('transmission inspection fallbackCount', input.fallbackCount ?? 0);
|
|
130
|
+
assertExtent(input.extent);
|
|
131
|
+
|
|
132
|
+
const format = input.format ?? 'rgba16float';
|
|
133
|
+
const resourcePresent = input.resourcePresent ?? input.lastKnownGood;
|
|
134
|
+
const mipCount = resourcePresent ? (input.mipCount ?? input.topology.mipCount + 1) : 0;
|
|
135
|
+
assertNonNegativeInteger('transmission inspection mipCount', mipCount);
|
|
136
|
+
const bytes = resourcePresent
|
|
137
|
+
? (input.bytes ?? estimateTransmissionBackdropBytes(input.extent, mipCount, format))
|
|
138
|
+
: 0;
|
|
139
|
+
assertNonNegativeInteger('transmission inspection bytes', bytes);
|
|
140
|
+
const copyCount = resourcePresent ? input.topology.copyCount : 0;
|
|
141
|
+
if (copyCount !== (resourcePresent ? 1 : 0)) {
|
|
142
|
+
throw new Error('transmission inspection copy count does not match backdrop topology');
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return Object.freeze({
|
|
146
|
+
activeCount: input.demand.activeCount,
|
|
147
|
+
needsRoughMips: active && input.demand.needsRoughMips,
|
|
148
|
+
extent: Object.freeze({ ...input.extent }),
|
|
149
|
+
format,
|
|
150
|
+
mipCount,
|
|
151
|
+
bytes,
|
|
152
|
+
copyCount,
|
|
153
|
+
transmissionDrawCount: input.transmissionDrawCount ?? 0,
|
|
154
|
+
fallbackCount: input.fallbackCount ?? 0,
|
|
155
|
+
generation: input.generation,
|
|
156
|
+
singleLayer: true,
|
|
157
|
+
lifecycle: input.lifecycle ?? defaultLifecycle(active, input.lastKnownGood),
|
|
158
|
+
lastKnownGood: input.lastKnownGood,
|
|
159
|
+
recovery: input.recovery,
|
|
160
|
+
capability: copyCapability(input.capability ?? { ok: true, missing: [] }),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function inspectTransmissionFromAdmission(
|
|
165
|
+
input: TransmissionInspectionFromAdmissionInput,
|
|
166
|
+
): TransmissionInspection {
|
|
167
|
+
const resource = input.admission.resource;
|
|
168
|
+
return inspectTransmission({
|
|
169
|
+
demand: input.admission.demand,
|
|
170
|
+
topology: input.topology,
|
|
171
|
+
extent: resource?.extent ?? input.extent,
|
|
172
|
+
...(resource === undefined
|
|
173
|
+
? {}
|
|
174
|
+
: { format: resource.format, mipCount: resource.mipCount, bytes: resource.bytes }),
|
|
175
|
+
resourcePresent: resource !== undefined,
|
|
176
|
+
generation: input.admission.generation,
|
|
177
|
+
lifecycle: input.admission.lifecycle,
|
|
178
|
+
lastKnownGood: input.admission.lastKnownGood,
|
|
179
|
+
recovery: input.admission.recovery,
|
|
180
|
+
capability: input.admission.capability,
|
|
181
|
+
...(input.transmissionDrawCount === undefined
|
|
182
|
+
? {}
|
|
183
|
+
: { transmissionDrawCount: input.transmissionDrawCount }),
|
|
184
|
+
...(input.fallbackCount === undefined ? {} : { fallbackCount: input.fallbackCount }),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export function transmissionInspectionToJson(inspection: TransmissionInspection): string {
|
|
189
|
+
return JSON.stringify(inspection);
|
|
190
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/** Pure CPU expectations for transmission math; this module has no GPU ownership. */
|
|
2
|
+
|
|
3
|
+
export type Color3 = readonly [number, number, number];
|
|
4
|
+
export type Uv2 = readonly [number, number];
|
|
5
|
+
|
|
6
|
+
export const DEFAULT_IOR = 1.5;
|
|
7
|
+
export const DEFAULT_GUARD_BAND = 0.02;
|
|
8
|
+
|
|
9
|
+
export interface TransmissionEnergy {
|
|
10
|
+
readonly reflection: number;
|
|
11
|
+
readonly transmission: number;
|
|
12
|
+
readonly diffuse: number;
|
|
13
|
+
readonly metallicResidual: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface BackdropResolution {
|
|
17
|
+
readonly source: 'refracted' | 'environment' | 'unrefracted';
|
|
18
|
+
readonly color: Color3;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface BackdropInputs {
|
|
22
|
+
readonly uv: Uv2;
|
|
23
|
+
readonly refracted?: Color3;
|
|
24
|
+
readonly environment?: Color3;
|
|
25
|
+
readonly unrefracted: Color3;
|
|
26
|
+
readonly guardBand?: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const clamp01 = (value: number): number => Math.min(Math.max(value, 0), 1);
|
|
30
|
+
|
|
31
|
+
const finiteOr = (value: number, fallback: number): number =>
|
|
32
|
+
Number.isFinite(value) ? value : fallback;
|
|
33
|
+
|
|
34
|
+
const safeIor = (ior: number): number => {
|
|
35
|
+
const candidate = finiteOr(ior, DEFAULT_IOR);
|
|
36
|
+
return candidate >= 1 ? candidate : DEFAULT_IOR;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/** Returns dielectric F0 for air to a material with the supplied IOR. */
|
|
40
|
+
export function fresnelF0(ior: number): number {
|
|
41
|
+
const ratio = (safeIor(ior) - 1) / (safeIor(ior) + 1);
|
|
42
|
+
return ratio * ratio;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Returns unpolarized dielectric reflectance. `eta` is incident IOR divided
|
|
47
|
+
* by transmitted IOR, so values above one can produce total internal
|
|
48
|
+
* reflection. This is a CPU oracle only; it does not sample a GPU resource.
|
|
49
|
+
*/
|
|
50
|
+
export function fresnelReflectance(cosTheta: number, eta: number): number {
|
|
51
|
+
if (!Number.isFinite(cosTheta) || !Number.isFinite(eta) || eta <= 0) return 1;
|
|
52
|
+
|
|
53
|
+
const cosIncident = clamp01(cosTheta);
|
|
54
|
+
const sinTransmittedSquared = eta * eta * (1 - cosIncident * cosIncident);
|
|
55
|
+
if (sinTransmittedSquared >= 1) return 1;
|
|
56
|
+
|
|
57
|
+
const cosTransmitted = Math.sqrt(Math.max(0, 1 - sinTransmittedSquared));
|
|
58
|
+
const perpendicularDenominator = cosIncident + eta * cosTransmitted;
|
|
59
|
+
const parallelDenominator = eta * cosIncident + cosTransmitted;
|
|
60
|
+
if (perpendicularDenominator === 0 || parallelDenominator === 0) return 1;
|
|
61
|
+
|
|
62
|
+
const perpendicular = (cosIncident - eta * cosTransmitted) / perpendicularDenominator;
|
|
63
|
+
const parallel = (eta * cosIncident - cosTransmitted) / parallelDenominator;
|
|
64
|
+
return clamp01((perpendicular * perpendicular + parallel * parallel) / 2);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function splitTransmissionEnergy(input: {
|
|
68
|
+
readonly transmission: number;
|
|
69
|
+
readonly metallic: number;
|
|
70
|
+
readonly cosTheta: number;
|
|
71
|
+
readonly ior: number;
|
|
72
|
+
}): TransmissionEnergy {
|
|
73
|
+
const transmission = clamp01(finiteOr(input.transmission, 0));
|
|
74
|
+
const metallic = clamp01(finiteOr(input.metallic, 0));
|
|
75
|
+
const reflectance = fresnelReflectance(input.cosTheta, 1 / safeIor(input.ior));
|
|
76
|
+
const nonMetal = 1 - metallic;
|
|
77
|
+
const refracted = (1 - reflectance) * nonMetal;
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
reflection: reflectance,
|
|
81
|
+
transmission: refracted * transmission,
|
|
82
|
+
diffuse: refracted * (1 - transmission),
|
|
83
|
+
metallicResidual: (1 - reflectance) * metallic,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function beerLambertAttenuation(
|
|
88
|
+
color: Color3,
|
|
89
|
+
thickness: number,
|
|
90
|
+
distance?: number,
|
|
91
|
+
): Color3 {
|
|
92
|
+
if (
|
|
93
|
+
!Number.isFinite(thickness) ||
|
|
94
|
+
thickness <= 0 ||
|
|
95
|
+
distance === undefined ||
|
|
96
|
+
!Number.isFinite(distance) ||
|
|
97
|
+
distance <= 0
|
|
98
|
+
) {
|
|
99
|
+
return [1, 1, 1];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const exponent = thickness / distance;
|
|
103
|
+
const attenuate = (component: number): number => {
|
|
104
|
+
const safeComponent = clamp01(finiteOr(component, 0));
|
|
105
|
+
return Math.min(Math.max(safeComponent ** exponent, 0), 1);
|
|
106
|
+
};
|
|
107
|
+
return [attenuate(color[0]), attenuate(color[1]), attenuate(color[2])];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function roughnessToLod(roughness: number, maxLod: number): number {
|
|
111
|
+
const safeRoughness = clamp01(finiteOr(roughness, 0));
|
|
112
|
+
const safeMaxLod = Math.max(finiteOr(maxLod, 0), 0);
|
|
113
|
+
return safeRoughness * safeRoughness * safeMaxLod;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function isWithinGuardBand(uv: Uv2, guardBand = DEFAULT_GUARD_BAND): boolean {
|
|
117
|
+
if (!uv.every(Number.isFinite) || !Number.isFinite(guardBand)) return false;
|
|
118
|
+
const band = clamp01(guardBand);
|
|
119
|
+
return uv.every((coordinate) => coordinate >= band && coordinate <= 1 - band);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function resolveRefractionBackdrop(input: BackdropInputs): BackdropResolution {
|
|
123
|
+
if (
|
|
124
|
+
isWithinGuardBand(input.uv, input.guardBand) &&
|
|
125
|
+
input.refracted !== undefined &&
|
|
126
|
+
isFiniteColor(input.refracted)
|
|
127
|
+
) {
|
|
128
|
+
return { source: 'refracted', color: input.refracted };
|
|
129
|
+
}
|
|
130
|
+
if (input.environment !== undefined && isFiniteColor(input.environment)) {
|
|
131
|
+
return { source: 'environment', color: input.environment };
|
|
132
|
+
}
|
|
133
|
+
if (isFiniteColor(input.unrefracted)) {
|
|
134
|
+
return { source: 'unrefracted', color: input.unrefracted };
|
|
135
|
+
}
|
|
136
|
+
return { source: 'unrefracted', color: [0, 0, 0] };
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function isFiniteColor(color: Color3): boolean {
|
|
140
|
+
return color.length === 3 && color.every(Number.isFinite);
|
|
141
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/** The two CPU facts that are allowed to influence transmission topology. */
|
|
2
|
+
export interface TransmissionDemand {
|
|
3
|
+
readonly activeCount: number;
|
|
4
|
+
readonly needsRoughMips: boolean;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/** Detached material facts supplied by the persistent render-scene owner. */
|
|
8
|
+
export interface TransmissionDemandCandidate {
|
|
9
|
+
readonly attached: boolean;
|
|
10
|
+
readonly ready: boolean;
|
|
11
|
+
readonly transmission: number;
|
|
12
|
+
readonly roughness: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type TransmissionDemandOperation =
|
|
16
|
+
| {
|
|
17
|
+
readonly kind: 'upsert';
|
|
18
|
+
readonly key: string;
|
|
19
|
+
readonly candidate: TransmissionDemandCandidate;
|
|
20
|
+
}
|
|
21
|
+
| { readonly kind: 'remove'; readonly key: string };
|
|
22
|
+
|
|
23
|
+
interface CandidateRecord {
|
|
24
|
+
readonly active: boolean;
|
|
25
|
+
readonly rough: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function candidateRecord(candidate: TransmissionDemandCandidate): CandidateRecord {
|
|
29
|
+
const active =
|
|
30
|
+
candidate.attached &&
|
|
31
|
+
candidate.ready &&
|
|
32
|
+
Number.isFinite(candidate.transmission) &&
|
|
33
|
+
candidate.transmission > 0;
|
|
34
|
+
return {
|
|
35
|
+
active,
|
|
36
|
+
rough: active && Number.isFinite(candidate.roughness) && candidate.roughness > 0,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Incremental CPU projection for transmission topology.
|
|
42
|
+
*
|
|
43
|
+
* The projection stores no material, visibility, camera, or GPU object. Each
|
|
44
|
+
* operation updates the two counters directly; an empty operation list is a
|
|
45
|
+
* no-scan steady-state frame.
|
|
46
|
+
*/
|
|
47
|
+
export class PersistentTransmissionDemandProjection {
|
|
48
|
+
private readonly records = new Map<string, CandidateRecord>();
|
|
49
|
+
private activeCount = 0;
|
|
50
|
+
private roughCount = 0;
|
|
51
|
+
|
|
52
|
+
apply(operations: readonly TransmissionDemandOperation[]): TransmissionDemand {
|
|
53
|
+
for (const operation of operations) {
|
|
54
|
+
const previous = this.records.get(operation.key);
|
|
55
|
+
if (previous !== undefined) this.removeCounts(previous);
|
|
56
|
+
if (operation.kind === 'remove') {
|
|
57
|
+
this.records.delete(operation.key);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const next = candidateRecord(operation.candidate);
|
|
61
|
+
this.records.set(operation.key, next);
|
|
62
|
+
this.addCounts(next);
|
|
63
|
+
}
|
|
64
|
+
return this.inspect();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
inspect(): TransmissionDemand {
|
|
68
|
+
return {
|
|
69
|
+
activeCount: this.activeCount,
|
|
70
|
+
needsRoughMips: this.roughCount > 0,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private addCounts(record: CandidateRecord): void {
|
|
75
|
+
if (record.active) this.activeCount += 1;
|
|
76
|
+
if (record.rough) this.roughCount += 1;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private removeCounts(record: CandidateRecord): void {
|
|
80
|
+
if (record.active) this.activeCount -= 1;
|
|
81
|
+
if (record.rough) this.roughCount -= 1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -6,7 +6,7 @@ import type {
|
|
|
6
6
|
RenderGraphError,
|
|
7
7
|
ResolveContext,
|
|
8
8
|
} from '@forgeax/engine-render-graph';
|
|
9
|
-
import type
|
|
9
|
+
import { RhiError, type TextureView } from '@forgeax/engine-rhi';
|
|
10
10
|
import { ok, type PassKind, type PassSelector, type Result } from '@forgeax/engine-types';
|
|
11
11
|
import {
|
|
12
12
|
GPU_TEXTURE_USAGE_COPY_SRC,
|
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
recordBloomBrightPass,
|
|
27
27
|
recordBloomCompositePass,
|
|
28
28
|
} from './record/skybox-post-pass';
|
|
29
|
-
import {
|
|
29
|
+
import { STANDARD_OUTPUT_TRANSFORM_FEATURE_ID } from './render-contract';
|
|
30
30
|
import {
|
|
31
31
|
encodeFullscreenPass,
|
|
32
32
|
recordSsaoBlurPass,
|
|
@@ -34,6 +34,12 @@ import {
|
|
|
34
34
|
} from './render-graph-primitives';
|
|
35
35
|
import type { RenderPipelineFrame, RenderPipelineGpuDrivenProjection } from './render-pipeline';
|
|
36
36
|
import { createRenderPipelineTarget, type RenderPipelineTarget } from './render-pipeline';
|
|
37
|
+
import {
|
|
38
|
+
getTemporalBindGroupResources,
|
|
39
|
+
getTemporalGpuState,
|
|
40
|
+
getTemporalParamsBuffer,
|
|
41
|
+
stageTemporalGpuSubmit,
|
|
42
|
+
} from './temporal/gpu';
|
|
37
43
|
|
|
38
44
|
function resolvedView(resources: GraphResourceResolver, view: GraphTextureView): TextureView {
|
|
39
45
|
const result = resources.textureView(view);
|
|
@@ -41,6 +47,17 @@ function resolvedView(resources: GraphResourceResolver, view: GraphTextureView):
|
|
|
41
47
|
return result.value;
|
|
42
48
|
}
|
|
43
49
|
|
|
50
|
+
function throwTemporalEncodeFailure(expected: string, cause?: unknown): never {
|
|
51
|
+
throw new RhiError({
|
|
52
|
+
code: 'webgpu-runtime-error',
|
|
53
|
+
expected,
|
|
54
|
+
hint:
|
|
55
|
+
cause === undefined
|
|
56
|
+
? 'retry the temporal frame after repairing its GPU resource'
|
|
57
|
+
: String(cause),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
44
61
|
export function typedFrameClearColor(frame: RenderPipelineFrame): GPUColor {
|
|
45
62
|
return {
|
|
46
63
|
r: frame.clear[0] ?? 0,
|
|
@@ -115,6 +132,8 @@ export interface TypedScenePassOptions {
|
|
|
115
132
|
readonly clearColor?: readonly [number, number, number, number] | undefined;
|
|
116
133
|
readonly colorLoadOp?: GPULoadOp | undefined;
|
|
117
134
|
readonly depthLoadOp?: GPULoadOp | undefined;
|
|
135
|
+
readonly recordMode?: 'opaque' | 'transmission' | 'transparent' | undefined;
|
|
136
|
+
readonly transmissionBackdrop?: GraphTextureView | undefined;
|
|
118
137
|
readonly extraAccesses?: readonly GraphAccess[] | undefined;
|
|
119
138
|
readonly gpuDriven?: RenderPipelineGpuDrivenProjection | undefined;
|
|
120
139
|
}
|
|
@@ -134,6 +153,9 @@ export function addTypedScenePass(
|
|
|
134
153
|
resource: target.view,
|
|
135
154
|
usage: 'sampled-read' as const,
|
|
136
155
|
})),
|
|
156
|
+
...(options.transmissionBackdrop === undefined
|
|
157
|
+
? []
|
|
158
|
+
: [{ resource: options.transmissionBackdrop, usage: 'sampled-read' as const }]),
|
|
137
159
|
...(options.extraAccesses ?? []),
|
|
138
160
|
...(options.gpuDriven?.accesses ?? []),
|
|
139
161
|
];
|
|
@@ -181,6 +203,10 @@ export function addTypedScenePass(
|
|
|
181
203
|
: resolvedView(resources, options.spotShadow.view);
|
|
182
204
|
const ssao =
|
|
183
205
|
options.ssao === undefined ? undefined : resolvedView(resources, options.ssao.view);
|
|
206
|
+
const transmissionBackdrop =
|
|
207
|
+
options.transmissionBackdrop === undefined
|
|
208
|
+
? null
|
|
209
|
+
: resolvedView(resources, options.transmissionBackdrop);
|
|
184
210
|
internal.frameState.currentDirectionalShadowView = directionalShadow ?? null;
|
|
185
211
|
internal.frameState.currentSpotShadowView = spotShadow ?? null;
|
|
186
212
|
const groups = buildPerFrameBindGroups(
|
|
@@ -216,6 +242,10 @@ export function addTypedScenePass(
|
|
|
216
242
|
depthView,
|
|
217
243
|
passKind: options.passKind ?? 'forward',
|
|
218
244
|
...(options.clearColor === undefined ? {} : { clearColor: options.clearColor }),
|
|
245
|
+
...(options.recordMode === undefined ? {} : { recordMode: options.recordMode }),
|
|
246
|
+
...(options.transmissionBackdrop === undefined
|
|
247
|
+
? {}
|
|
248
|
+
: { transmissionBackdropView: transmissionBackdrop }),
|
|
219
249
|
},
|
|
220
250
|
);
|
|
221
251
|
},
|
|
@@ -261,6 +291,14 @@ export interface TypedBloomTargets {
|
|
|
261
291
|
readonly blurV: RenderPipelineTarget;
|
|
262
292
|
}
|
|
263
293
|
|
|
294
|
+
/** The semantic Bloom pass owner; graph inspection consumes these same identities. */
|
|
295
|
+
export const TYPED_BLOOM_PASS_NAMES = {
|
|
296
|
+
bright: 'bloom-bright',
|
|
297
|
+
blurH: 'bloom-blur-h',
|
|
298
|
+
blurV: 'bloom-blur-v',
|
|
299
|
+
composite: 'bloom-composite',
|
|
300
|
+
} as const;
|
|
301
|
+
|
|
264
302
|
export function addTypedBloomPasses(
|
|
265
303
|
graph: RenderGraphBuilder<RenderPipelineFrame>,
|
|
266
304
|
targets: TypedBloomTargets,
|
|
@@ -274,25 +312,25 @@ export function addTypedBloomPasses(
|
|
|
274
312
|
};
|
|
275
313
|
const descriptors = [
|
|
276
314
|
{
|
|
277
|
-
name:
|
|
315
|
+
name: TYPED_BLOOM_PASS_NAMES.bright,
|
|
278
316
|
reads: [targets.scene],
|
|
279
317
|
write: targets.bright,
|
|
280
318
|
encode: recordBloomBrightPass,
|
|
281
319
|
},
|
|
282
320
|
{
|
|
283
|
-
name:
|
|
321
|
+
name: TYPED_BLOOM_PASS_NAMES.blurH,
|
|
284
322
|
reads: [targets.bright],
|
|
285
323
|
write: targets.blurH,
|
|
286
324
|
encode: recordBloomBlurHPass,
|
|
287
325
|
},
|
|
288
326
|
{
|
|
289
|
-
name:
|
|
327
|
+
name: TYPED_BLOOM_PASS_NAMES.blurV,
|
|
290
328
|
reads: [targets.blurH],
|
|
291
329
|
write: targets.blurV,
|
|
292
330
|
encode: recordBloomBlurVPass,
|
|
293
331
|
},
|
|
294
332
|
{
|
|
295
|
-
name:
|
|
333
|
+
name: TYPED_BLOOM_PASS_NAMES.composite,
|
|
296
334
|
reads: [targets.scene, targets.blurV],
|
|
297
335
|
write: targets.composited,
|
|
298
336
|
encode: recordBloomCompositePass,
|
|
@@ -419,6 +457,112 @@ export interface TypedFullscreenPassOptions {
|
|
|
419
457
|
readonly outputOnly?: boolean | undefined;
|
|
420
458
|
readonly rawSwapchainOutput?: boolean | undefined;
|
|
421
459
|
readonly depth?: RenderPipelineTarget | undefined;
|
|
460
|
+
readonly additionalReads?: readonly {
|
|
461
|
+
readonly key: string;
|
|
462
|
+
readonly target: RenderPipelineTarget;
|
|
463
|
+
}[];
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
export interface TypedTemporalResolveTargets {
|
|
467
|
+
readonly scene: RenderPipelineTarget;
|
|
468
|
+
readonly currentTemporal: RenderPipelineTarget;
|
|
469
|
+
readonly depth: RenderPipelineTarget;
|
|
470
|
+
readonly historyColor: RenderPipelineTarget;
|
|
471
|
+
readonly historyTemporal: RenderPipelineTarget;
|
|
472
|
+
readonly writeColor: RenderPipelineTarget;
|
|
473
|
+
readonly writeTemporal: RenderPipelineTarget;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
export function addTypedTemporalResolvePass(
|
|
477
|
+
graph: RenderGraphBuilder<RenderPipelineFrame>,
|
|
478
|
+
targets: TypedTemporalResolveTargets,
|
|
479
|
+
): Result<void, RenderGraphError> {
|
|
480
|
+
const added = graph.addRasterPass('taa-resolve', {
|
|
481
|
+
accesses: [
|
|
482
|
+
{ resource: targets.scene.view, usage: 'sampled-read' },
|
|
483
|
+
{ resource: targets.currentTemporal.view, usage: 'sampled-read' },
|
|
484
|
+
{ resource: targets.historyColor.view, usage: 'sampled-read' },
|
|
485
|
+
{ resource: targets.historyTemporal.view, usage: 'sampled-read' },
|
|
486
|
+
{ resource: targets.writeColor.view, usage: 'color-attachment' },
|
|
487
|
+
{ resource: targets.writeTemporal.view, usage: 'color-attachment' },
|
|
488
|
+
],
|
|
489
|
+
colorAttachments: [
|
|
490
|
+
{
|
|
491
|
+
view: targets.writeColor.view,
|
|
492
|
+
loadOp: 'clear',
|
|
493
|
+
storeOp: 'store',
|
|
494
|
+
clearValue: { r: 0, g: 0, b: 0, a: 1 },
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
view: targets.writeTemporal.view,
|
|
498
|
+
loadOp: 'clear',
|
|
499
|
+
storeOp: 'store',
|
|
500
|
+
clearValue: { r: 0, g: 0, b: 0, a: 0 },
|
|
501
|
+
},
|
|
502
|
+
],
|
|
503
|
+
encode: ({ pass, frame, resources }) => {
|
|
504
|
+
const internal = frame as _InternalRenderPipelineContext;
|
|
505
|
+
const state = getTemporalGpuState(
|
|
506
|
+
internal.frameState,
|
|
507
|
+
frame.runtime.device,
|
|
508
|
+
(frame.runtime as import('./record/render-context').RenderSystemRuntime).deviceScope,
|
|
509
|
+
frame.targetW,
|
|
510
|
+
frame.targetH,
|
|
511
|
+
);
|
|
512
|
+
const built = getTemporalBindGroupResources(state);
|
|
513
|
+
const current = resolvedView(resources, targets.scene.view);
|
|
514
|
+
const currentTemporal = resolvedView(resources, targets.currentTemporal.view);
|
|
515
|
+
const historyColor = resolvedView(resources, targets.historyColor.view);
|
|
516
|
+
const historyTemporal = resolvedView(resources, targets.historyTemporal.view);
|
|
517
|
+
const params = getTemporalParamsBuffer(state);
|
|
518
|
+
if (params === undefined || built.sampler === null) {
|
|
519
|
+
throwTemporalEncodeFailure('TAA resolve has an admitted params buffer and sampler');
|
|
520
|
+
}
|
|
521
|
+
const payload = new ArrayBuffer(16);
|
|
522
|
+
new Float32Array(payload).set([
|
|
523
|
+
frame.camera.temporal?.currentJitterUv?.[0] ?? 0,
|
|
524
|
+
frame.camera.temporal?.currentJitterUv?.[1] ?? 0,
|
|
525
|
+
]);
|
|
526
|
+
const words = new Uint32Array(payload);
|
|
527
|
+
words[2] = state.valid && (frame.camera.temporal?.historyValid ?? true) ? 1 : 0;
|
|
528
|
+
words[3] = frame.camera.temporal?.temporalFrameIndex ?? 0;
|
|
529
|
+
const written = frame.runtime.device.queue.writeBuffer(params, 0, new Uint8Array(payload));
|
|
530
|
+
if (!written.ok)
|
|
531
|
+
throwTemporalEncodeFailure('TAA resolve params upload succeeds', written.error);
|
|
532
|
+
const bindGroup = frame.runtime.device.createBindGroup({
|
|
533
|
+
label: 'taa-resolve-bind-group',
|
|
534
|
+
layout: built.layout,
|
|
535
|
+
entries: [
|
|
536
|
+
{ binding: 0, resource: { kind: 'textureView', value: current } },
|
|
537
|
+
{ binding: 1, resource: { kind: 'sampler', value: built.sampler } },
|
|
538
|
+
{ binding: 2, resource: { kind: 'textureView', value: historyColor } },
|
|
539
|
+
{ binding: 3, resource: { kind: 'sampler', value: built.sampler } },
|
|
540
|
+
{ binding: 4, resource: { kind: 'textureView', value: historyTemporal } },
|
|
541
|
+
{ binding: 5, resource: { kind: 'sampler', value: built.sampler } },
|
|
542
|
+
{ binding: 6, resource: { kind: 'textureView', value: currentTemporal } },
|
|
543
|
+
{ binding: 7, resource: { kind: 'sampler', value: built.sampler } },
|
|
544
|
+
{ binding: 8, resource: { kind: 'buffer', value: { buffer: params } } },
|
|
545
|
+
] as never,
|
|
546
|
+
});
|
|
547
|
+
if (!bindGroup.ok) {
|
|
548
|
+
throwTemporalEncodeFailure('TAA resolve bind group creation succeeds', bindGroup.error);
|
|
549
|
+
}
|
|
550
|
+
const pipeline = frame.runtime.getPostProcessPipeline?.(
|
|
551
|
+
'forgeax.taa-resolve',
|
|
552
|
+
built.layout,
|
|
553
|
+
targets.writeColor.format as GPUTextureFormat,
|
|
554
|
+
);
|
|
555
|
+
if (pipeline === null || pipeline === undefined) {
|
|
556
|
+
throwTemporalEncodeFailure('TAA resolve pipeline is ready before frame encoding');
|
|
557
|
+
}
|
|
558
|
+
pass.setPipeline(pipeline);
|
|
559
|
+
pass.setBindGroup(1, bindGroup.value);
|
|
560
|
+
pass.draw(3, 1, 0, 0);
|
|
561
|
+
stageTemporalGpuSubmit(state);
|
|
562
|
+
internal.frameState.temporalGpuState = state;
|
|
563
|
+
},
|
|
564
|
+
});
|
|
565
|
+
return added;
|
|
422
566
|
}
|
|
423
567
|
|
|
424
568
|
export function addTypedFullscreenPass(
|
|
@@ -432,6 +576,10 @@ export function addTypedFullscreenPass(
|
|
|
432
576
|
...(options.depth === undefined
|
|
433
577
|
? []
|
|
434
578
|
: [{ resource: options.depth.view, usage: 'sampled-read' as const }]),
|
|
579
|
+
...(options.additionalReads?.map((read) => ({
|
|
580
|
+
resource: read.target.view,
|
|
581
|
+
usage: 'sampled-read' as const,
|
|
582
|
+
})) ?? []),
|
|
435
583
|
],
|
|
436
584
|
colorAttachments: [
|
|
437
585
|
{
|
|
@@ -454,6 +602,11 @@ export function addTypedFullscreenPass(
|
|
|
454
602
|
input: options.input,
|
|
455
603
|
output: options.output,
|
|
456
604
|
ldrColor: options.input,
|
|
605
|
+
'scene-color': options.input,
|
|
606
|
+
...(options.depth === undefined ? {} : { 'scene-depth': options.depth }),
|
|
607
|
+
...(options.additionalReads === undefined
|
|
608
|
+
? {}
|
|
609
|
+
: Object.fromEntries(options.additionalReads.map((read) => [read.key, read.target]))),
|
|
457
610
|
}),
|
|
458
611
|
outputFormat: options.output.format as GPUTextureFormat,
|
|
459
612
|
...(options.depth === undefined
|
|
@@ -524,15 +677,15 @@ export function addTypedCompositePostEffects(
|
|
|
524
677
|
return ok(undefined);
|
|
525
678
|
}
|
|
526
679
|
|
|
527
|
-
export function
|
|
680
|
+
export function addTypedOutputTransformPass(
|
|
528
681
|
graph: RenderGraphBuilder<RenderPipelineFrame>,
|
|
529
682
|
input: RenderPipelineTarget,
|
|
530
683
|
output: RenderPipelineTarget,
|
|
531
684
|
outputOnly = false,
|
|
532
685
|
): Result<void, RenderGraphError> {
|
|
533
686
|
return addTypedFullscreenPass(graph, {
|
|
534
|
-
name: outputOnly ? '
|
|
535
|
-
shader:
|
|
687
|
+
name: outputOnly ? 'present' : 'output-transform',
|
|
688
|
+
shader: STANDARD_OUTPUT_TRANSFORM_FEATURE_ID,
|
|
536
689
|
input,
|
|
537
690
|
output,
|
|
538
691
|
outputOnly,
|