@forgeax/engine-render 0.1.21 → 0.1.24
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 +281 -38
- package/dist/assembly/backend-contract.d.ts +13 -0
- package/dist/assembly/backend-contract.d.ts.map +1 -1
- package/dist/assembly/bundler-contract.d.ts +9 -0
- package/dist/assembly/bundler-contract.d.ts.map +1 -0
- package/dist/assembly/device-feature-admission.d.ts +8 -0
- package/dist/assembly/device-feature-admission.d.ts.map +1 -1
- package/dist/assembly/extended-lighting-fallback.d.ts +13 -0
- package/dist/assembly/extended-lighting-fallback.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +7 -235
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +10 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts +3 -2
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material/standard-layer-projection.d.ts +10 -0
- package/dist/assembly/material/standard-layer-projection.d.ts.map +1 -0
- package/dist/assembly/material-shader-policy.d.ts +168 -0
- package/dist/assembly/material-shader-policy.d.ts.map +1 -0
- package/dist/assembly/material-shader-prewarm.d.ts +21 -0
- package/dist/assembly/material-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/mesh-ssbo-grow.d.ts +88 -0
- package/dist/assembly/mesh-ssbo-grow.d.ts.map +1 -0
- package/dist/assembly/recovery/device-loss-fanout.d.ts +14 -0
- package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -0
- package/dist/assembly/recovery/generation.d.ts +46 -0
- package/dist/assembly/recovery/generation.d.ts.map +1 -0
- package/dist/assembly/recovery/recovery-attempt.d.ts +63 -0
- package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -0
- package/dist/assembly/recovery/renderer-recover.d.ts +115 -0
- package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -0
- package/dist/assembly/renderer-facade.d.ts +10 -0
- package/dist/assembly/renderer-facade.d.ts.map +1 -0
- package/dist/assembly/renderer-frame-transaction.d.ts +17 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
- package/dist/assembly/renderer-helpers.d.ts +19 -0
- package/dist/assembly/renderer-helpers.d.ts.map +1 -0
- package/dist/assembly/renderer-lifecycle.d.ts +34 -0
- package/dist/assembly/renderer-lifecycle.d.ts.map +1 -1
- package/dist/assembly/shader-prewarm-policy.d.ts +15 -0
- package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready-contract.d.ts +9 -0
- package/dist/assembly/webgpu-ready-contract.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready.d.ts +55 -0
- package/dist/assembly/webgpu-ready.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer.d.ts +152 -0
- package/dist/assembly/webgpu-renderer.d.ts.map +1 -0
- package/dist/authoring.mjs +1 -1
- package/dist/{chunk-PCHBPYML.mjs → chunk-GE3SDD72.mjs} +37 -5
- package/dist/chunk-GE3SDD72.mjs.map +1 -0
- package/dist/chunk-KZFTK6DO.mjs +1191 -0
- package/dist/chunk-KZFTK6DO.mjs.map +1 -0
- package/dist/{chunk-FS2KNUQH.mjs → chunk-Q752SHI5.mjs} +332 -568
- package/dist/chunk-Q752SHI5.mjs.map +1 -0
- package/dist/{chunk-6OPXDQ2E.mjs → chunk-RR5L4SRS.mjs} +33 -294
- package/dist/chunk-RR5L4SRS.mjs.map +1 -0
- package/dist/chunk-TFH5I7JJ.mjs +296 -0
- package/dist/chunk-TFH5I7JJ.mjs.map +1 -0
- package/dist/chunk-UQYS7FRM.mjs +1003 -0
- package/dist/chunk-UQYS7FRM.mjs.map +1 -0
- package/dist/chunk-YKB5DQV7.mjs +345 -0
- package/dist/chunk-YKB5DQV7.mjs.map +1 -0
- package/dist/{chunk-5YADUCA7.mjs → chunk-YRUYGA4A.mjs} +1189 -1217
- package/dist/chunk-YRUYGA4A.mjs.map +1 -0
- package/dist/chunk-Z3YYH2MB.mjs +5082 -0
- package/dist/chunk-Z3YYH2MB.mjs.map +1 -0
- package/dist/cluster-binner.d.ts +5 -0
- package/dist/cluster-binner.d.ts.map +1 -1
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts +4 -0
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/light-probe.d.ts +9 -0
- package/dist/components/light-probe.d.ts.map +1 -0
- package/dist/components/rect-area-light.d.ts +12 -0
- package/dist/components/rect-area-light.d.ts.map +1 -0
- package/dist/components/scene-instance.d.ts +4 -0
- package/dist/components/scene-instance.d.ts.map +1 -1
- package/dist/components/spot-light.d.ts +3 -0
- package/dist/components/spot-light.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +27276 -23232
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/device-scope.d.ts +2 -0
- package/dist/device/device-scope.d.ts.map +1 -1
- package/dist/device/gpu-residency.d.ts +32 -5
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/device/lifecycle-transaction.d.ts +2 -0
- package/dist/device/lifecycle-transaction.d.ts.map +1 -0
- package/dist/environment/frame.d.ts +5 -0
- package/dist/environment/frame.d.ts.map +1 -1
- package/dist/environment/inspection.d.ts +7 -0
- package/dist/environment/inspection.d.ts.map +1 -1
- package/dist/environment/lifecycle.d.ts +20 -2
- package/dist/environment/lifecycle.d.ts.map +1 -1
- package/dist/errors/gpu-driven.d.ts +26 -0
- package/dist/errors/gpu-driven.d.ts.map +1 -0
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/recover.d.ts +67 -3
- package/dist/errors/recover.d.ts.map +1 -1
- package/dist/errors/render.d.ts +39 -1
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/contracts.d.ts +899 -0
- package/dist/extract/contracts.d.ts.map +1 -0
- package/dist/extract/gpu-driven.d.ts +50 -0
- package/dist/extract/gpu-driven.d.ts.map +1 -0
- package/dist/extract/visibility.d.ts.map +1 -1
- package/dist/features/host.d.ts +2 -0
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +3 -0
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics-store.d.ts +2 -0
- package/dist/features/prepared-graphics-store.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts +34 -0
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/prepared-draw.d.ts +63 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -0
- package/dist/gpu-driven/production-raster.d.ts +126 -2
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/view-gpu.d.ts +64 -1
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-scene-schema.d.ts +14 -0
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +9 -1
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-usage.d.ts +0 -1
- package/dist/gpu-usage.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +3 -3
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +7 -6
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +7 -1
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +90 -5
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +163 -1
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/internal.d.ts +9 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +23 -2
- package/dist/internal.mjs.map +1 -1
- package/dist/light-buffer-layout.d.ts +60 -148
- package/dist/light-buffer-layout.d.ts.map +1 -1
- package/dist/materials.d.ts +34 -10
- package/dist/materials.d.ts.map +1 -1
- package/dist/mesh-material-bindings.d.ts +56 -0
- package/dist/mesh-material-bindings.d.ts.map +1 -1
- package/dist/occlusion-proxy.d.ts +4 -0
- package/dist/occlusion-proxy.d.ts.map +1 -0
- package/dist/pbr-pipeline.d.ts +58 -21
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -1
- package/dist/pipeline/standard-lighting/light-frame.d.ts +3 -3
- package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -1
- package/dist/pipeline/standard-lighting/topology.d.ts +1 -1
- package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -1
- package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -1
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +2 -0
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +1 -1
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/points-lines/prepare.d.ts +3 -0
- package/dist/points-lines/prepare.d.ts.map +1 -1
- package/dist/points-lines/standard-owner.d.ts +33 -0
- package/dist/points-lines/standard-owner.d.ts.map +1 -0
- package/dist/prepare/extended-lighting/ltc-resources.d.ts +31 -0
- package/dist/prepare/extended-lighting/ltc-resources.d.ts.map +1 -0
- package/dist/prepare/extended-lighting/resources.d.ts +72 -0
- package/dist/prepare/extended-lighting/resources.d.ts.map +1 -0
- package/dist/prepare/extended-lighting/spot-modifiers.d.ts +42 -0
- package/dist/prepare/extended-lighting/spot-modifiers.d.ts.map +1 -0
- package/dist/prepare/extended-lighting/state.d.ts +24 -0
- package/dist/prepare/extended-lighting/state.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +8 -6
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +55 -10
- 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 +21 -5
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/gpu-timing.d.ts +19 -7
- package/dist/record/gpu-timing.d.ts.map +1 -1
- package/dist/record/helpers.d.ts +0 -20
- package/dist/record/helpers.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +20 -2
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +10 -18
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +11 -3
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/recovery-pipeline.d.ts +30 -0
- package/dist/record/recovery-pipeline.d.ts.map +1 -0
- package/dist/record/render-context.d.ts +82 -9
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +49 -2
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +1 -2
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/recovery/render-system-candidate.d.ts +65 -0
- package/dist/recovery/render-system-candidate.d.ts.map +1 -0
- package/dist/reflection/inspection.d.ts +10 -0
- package/dist/reflection/inspection.d.ts.map +1 -0
- package/dist/reflection/projection.d.ts +49 -0
- package/dist/reflection/projection.d.ts.map +1 -1
- package/dist/reflection/record-owner.d.ts +60 -0
- package/dist/reflection/record-owner.d.ts.map +1 -0
- package/dist/render-contract.d.ts +78 -15
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +7 -0
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts +12 -0
- package/dist/render-system-extract-tail.d.ts.map +1 -0
- package/dist/render-system-extract.d.ts +252 -30
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +140 -5
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/probe-blend-record.d.ts +22 -0
- package/dist/scene/probe-blend-record.d.ts.map +1 -0
- package/dist/scene/probe-blend.d.ts +142 -0
- package/dist/scene/probe-blend.d.ts.map +1 -0
- package/dist/scene/render-scene-types.d.ts +0 -6
- package/dist/scene/render-scene-types.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +122 -9
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/scene/visibility/bounds.d.ts +20 -0
- package/dist/scene/visibility/bounds.d.ts.map +1 -0
- package/dist/scene/visibility/budget.d.ts +16 -0
- package/dist/scene/visibility/budget.d.ts.map +1 -0
- package/dist/scene/visibility/facet.d.ts +73 -0
- package/dist/scene/visibility/facet.d.ts.map +1 -0
- package/dist/scene/visibility/gpu-frame-timing.d.ts +41 -0
- package/dist/scene/visibility/gpu-frame-timing.d.ts.map +1 -0
- package/dist/scene/visibility/gpu-lod.d.ts +46 -0
- package/dist/scene/visibility/gpu-lod.d.ts.map +1 -0
- package/dist/scene/visibility/inspection.d.ts +132 -0
- package/dist/scene/visibility/inspection.d.ts.map +1 -0
- package/dist/scene/visibility/lod-selector.d.ts +25 -0
- package/dist/scene/visibility/lod-selector.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-confidence.d.ts +81 -0
- package/dist/scene/visibility/occlusion-confidence.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-pass.d.ts +57 -0
- package/dist/scene/visibility/occlusion-pass.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-query-pool.d.ts +57 -0
- package/dist/scene/visibility/occlusion-query-pool.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-runtime.d.ts +96 -0
- package/dist/scene/visibility/occlusion-runtime.d.ts.map +1 -0
- package/dist/scene/visibility/types.d.ts +34 -0
- package/dist/scene/visibility/types.d.ts.map +1 -0
- package/dist/ssr/admission.d.ts +122 -0
- package/dist/ssr/admission.d.ts.map +1 -0
- package/dist/ssr/composition.d.ts +32 -0
- package/dist/ssr/composition.d.ts.map +1 -0
- package/dist/ssr/errors.d.ts +39 -0
- package/dist/ssr/errors.d.ts.map +1 -0
- package/dist/ssr/identity.d.ts +13 -0
- package/dist/ssr/identity.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts +1 -1
- package/dist/temporal/frame-coordinator.d.ts +13 -0
- package/dist/temporal/frame-coordinator.d.ts.map +1 -1
- package/dist/temporal/frame.d.ts +2 -0
- package/dist/temporal/frame.d.ts.map +1 -1
- package/dist/temporal/index.mjs +6 -5
- package/dist/temporal/taa-history-store.d.ts +15 -1
- package/dist/temporal/taa-history-store.d.ts.map +1 -1
- package/dist/temporal/transaction.d.ts +5 -0
- package/dist/temporal/transaction.d.ts.map +1 -1
- package/dist/temporal/view.d.ts +7 -0
- package/dist/temporal/view.d.ts.map +1 -1
- package/dist/tilemap-chunk-extract-system.d.ts +1 -1
- package/dist/typed-render-graph-primitives.d.ts +4 -0
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/volume/passes.d.ts +8 -4
- package/dist/volume/passes.d.ts.map +1 -1
- package/package.json +20 -20
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +5 -0
- package/src/__tests__/detached-inspection.integration.test.ts +6 -0
- package/src/__tests__/device-feature-admission.unit.test.ts +19 -1
- package/src/__tests__/device-loss-fanout.unit.test.ts +107 -0
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +21 -0
- package/src/__tests__/direct-light-snapshot.unit.test.ts +59 -3
- package/src/__tests__/environment-generation.integration.test.ts +39 -0
- package/src/__tests__/evidence-identity.ts +13 -0
- package/src/__tests__/evidence-identity.unit.test.ts +24 -0
- package/src/__tests__/expose-renderer-errors.unit.test.ts +34 -0
- package/src/__tests__/extended-lighting-recovery.browser.test.ts +14 -0
- package/src/__tests__/extended-lighting-recovery.dawn.test.ts +14 -0
- package/src/__tests__/extended-lighting-recovery.integration.test.ts +81 -0
- package/src/__tests__/extended-lighting-resources.unit.test.ts +51 -0
- package/src/__tests__/extended-lighting-zero-feature.integration.test.ts +52 -0
- package/src/__tests__/factory-contract.integration.test.ts +154 -6
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +4 -1
- package/src/__tests__/frame-observation.contract.test.ts +15 -0
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +146 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +1 -0
- package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +1 -0
- package/src/__tests__/gpu-driven-production.integration.test.ts +572 -9
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +66 -2
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +26 -1
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +89 -2
- package/src/__tests__/gpu-driven-view.browser.test.ts +3 -3
- package/src/__tests__/gpu-driven-view.dawn.test.ts +3 -3
- package/src/__tests__/gpu-driven-view.unit.test.ts +50 -0
- package/src/__tests__/gpu-lod-evidence.ts +188 -0
- package/src/__tests__/gpu-lod-fallback.integration.test.ts +10 -0
- package/src/__tests__/gpu-lod-indirect.integration.test.ts +40 -0
- package/src/__tests__/gpu-lod-parity.dawn.test.ts +29 -0
- package/src/__tests__/gpu-lod-readiness.integration.test.ts +52 -0
- package/src/__tests__/gpu-lod-schema.unit.test.ts +66 -0
- package/src/__tests__/gpu-lod-selector.unit.test.ts +28 -0
- package/src/__tests__/gpu-lod-silhouette.browser.test.ts +13 -0
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +66 -1
- package/src/__tests__/gpu-scene.dawn.test.ts +8 -1
- package/src/__tests__/gpu-scene.unit.test.ts +49 -3
- package/src/__tests__/ibl/face-uniforms.unit.test.ts +2 -0
- package/src/__tests__/ibl-residency-publication.unit.test.ts +113 -0
- package/src/__tests__/light-buffer-layout.unit.test.ts +113 -3
- package/src/__tests__/light-inspection.unit.test.ts +55 -0
- package/src/__tests__/light-resource-error.unit.test.ts +43 -0
- package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +109 -0
- package/src/__tests__/lod-bounds.unit.test.ts +42 -0
- package/src/__tests__/lod-cpu-lane.integration.test.ts +55 -0
- package/src/__tests__/lod-cpu-no-change.perf.test.ts +19 -0
- package/src/__tests__/lod-gpu-frame-timing.unit.test.ts +49 -0
- package/src/__tests__/lod-multi-view.integration.test.ts +63 -0
- package/src/__tests__/lod-occlusion-device-loss.integration.test.ts +27 -0
- package/src/__tests__/lod-occlusion-final-decision.integration.test.ts +47 -0
- package/src/__tests__/lod-occlusion-inspection.integration.test.ts +217 -0
- package/src/__tests__/lod-occlusion-inspection.schema.test-d.ts +14 -0
- package/src/__tests__/lod-occlusion-inspection.unit.test.ts +72 -0
- package/src/__tests__/lod-occlusion-visual-evidence.ts +91 -0
- package/src/__tests__/lod-occlusion.browser.test.ts +15 -0
- package/src/__tests__/lod-occlusion.dawn.test.ts +20 -0
- package/src/__tests__/lod-selector.profile.test.ts +35 -0
- package/src/__tests__/lod-selector.unit.test.ts +68 -0
- package/src/__tests__/lod-visibility-identity.unit.test.ts +198 -0
- package/src/__tests__/lod-visibility-lifecycle.integration.test.ts +132 -0
- package/src/__tests__/ltc-resources.unit.test.ts +32 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +41 -9
- package/src/__tests__/material-cooked-projection.unit.test.ts +19 -1
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +29 -0
- package/src/__tests__/material-stride-surface.unit.test.ts +7 -3
- package/src/__tests__/materials-standard-contract.unit.test.ts +104 -0
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
- package/src/__tests__/occlusion-confidence.unit.test.ts +168 -0
- package/src/__tests__/occlusion-invalidation.integration.test.ts +37 -0
- package/src/__tests__/occlusion-pass-routing.unit.test.ts +16 -0
- package/src/__tests__/occlusion-pass.dawn.test.ts +20 -0
- package/src/__tests__/occlusion-pass.integration.test.ts +43 -0
- package/src/__tests__/occlusion-pass.rhi-null.test.ts +22 -0
- package/src/__tests__/occlusion-query-pool.rhi-null.test.ts +21 -0
- package/src/__tests__/occlusion-query-pool.unit.test.ts +95 -0
- package/src/__tests__/occlusion-query-ticket.integration.test.ts +47 -0
- package/src/__tests__/occlusion-query.dawn.test.ts +16 -0
- package/src/__tests__/occlusion-query.evidence.ts +178 -0
- package/src/__tests__/occlusion-query.rhi-null.test.ts +31 -0
- package/src/__tests__/occlusion-runtime.unit.test.ts +120 -0
- package/src/__tests__/physical-clearcoat.integration.test.ts +89 -0
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +196 -0
- package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +1 -1
- package/src/__tests__/probe-bindings.unit.test.ts +200 -0
- package/src/__tests__/probe-blend-numeric.unit.test.ts +67 -0
- package/src/__tests__/probe-blend-oracle.unit.test.ts +136 -0
- package/src/__tests__/probe-capacity.integration.test.ts +97 -0
- package/src/__tests__/probe-recovery.integration.test.ts +104 -0
- package/src/__tests__/probe-scene-dirty.integration.test.ts +211 -0
- package/src/__tests__/profiler-phase-catalog.test.ts +4 -1
- package/src/__tests__/profiler-phase-token.test.ts +1 -0
- package/src/__tests__/recover-error-policy-owner.unit.test.ts +6 -3
- package/src/__tests__/recovery-candidate-prepare.contract.test.ts +140 -0
- package/src/__tests__/rect-area-boundary.unit.test.ts +24 -0
- package/src/__tests__/reflection-fallback-graph.unit.test.ts +67 -0
- package/src/__tests__/reflection-fallback-inspection.unit.test.ts +77 -0
- package/src/__tests__/reflection-fallback-lifecycle.integration.test.ts +21 -0
- package/src/__tests__/reflection-fallback-projection.unit.test.ts +90 -0
- package/src/__tests__/reflection-fallback-source.unit.test.ts +32 -0
- package/src/__tests__/reflection-probe-owner-placement.unit.test.ts +39 -0
- package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +120 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +1 -0
- package/src/__tests__/render-feature-docs.unit.test.ts +12 -7
- package/src/__tests__/render-graph-fallback.integration.test.ts +24 -0
- package/src/__tests__/render-perf/extended-lighting.bench.test.ts +66 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +447 -18
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +160 -17
- package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +47 -0
- package/src/__tests__/renderer-generation-assembly.unit.test.ts +77 -0
- package/src/__tests__/renderer-generation-failure.unit.test.ts +108 -0
- package/src/__tests__/renderer-producer-root-matrix.integration.test.ts +33 -0
- package/src/__tests__/renderer-recovery-capability-matrix.unit.test.ts +59 -0
- package/src/__tests__/renderer-recovery-contract.unit.test.ts +73 -0
- package/src/__tests__/renderer-recovery-lifecycle.unit.test.ts +216 -0
- package/src/__tests__/renderer-target-history-recovery.integration.test.ts +80 -0
- package/src/__tests__/shader-manifest-fixture.ts +13 -16
- package/src/__tests__/shader-stage-surface.unit.test.ts +1 -1
- package/src/__tests__/skin-motion-regression.unit.test.ts +22 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +2 -2
- package/src/__tests__/spot-modifier-projection.unit.test.ts +70 -0
- package/src/__tests__/ssr-admission-matrix.integration.test.ts +206 -0
- package/src/__tests__/ssr-composition.unit.test.ts +46 -0
- package/src/__tests__/ssr-fallback-zero-work.bench.test.ts +94 -0
- package/src/__tests__/ssr-recovery-errors.unit.test.ts +58 -0
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +67 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +7 -0
- package/src/__tests__/standard-layer-projection.unit.test.ts +23 -0
- package/src/__tests__/standard-lighting-inspection.integration.test.ts +1 -1
- package/src/__tests__/standard-lighting-write.unit.test.ts +66 -2
- package/src/__tests__/temporal-fallback-generation.integration.test.ts +16 -0
- package/src/__tests__/temporal-view.unit.test.ts +3 -3
- package/src/__tests__/transmission-prewarm.unit.test.ts +111 -32
- package/src/__tests__/visibility-budget.integration.test.ts +140 -0
- package/src/__tests__/visibility-budget.unit.test.ts +70 -0
- package/src/__tests__/visibility-extract.integration.test.ts +11 -6
- package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +6 -3
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +31 -28
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +3 -1
- package/src/assembly/backend-contract.ts +13 -0
- package/src/assembly/bundler-contract.ts +9 -0
- package/src/assembly/device-feature-admission.ts +26 -9
- package/src/assembly/extended-lighting-fallback.ts +216 -0
- package/src/assembly/factory.ts +81 -9634
- package/src/assembly/host-contract.ts +10 -0
- package/src/assembly/material/assembly.ts +18 -2
- package/src/assembly/material/standard-layer-projection.ts +16 -0
- package/src/assembly/material-shader-policy.ts +854 -0
- package/src/assembly/material-shader-prewarm.ts +88 -0
- package/src/assembly/mesh-ssbo-grow.ts +270 -0
- package/src/assembly/recovery/device-loss-fanout.ts +89 -0
- package/src/assembly/recovery/generation.ts +141 -0
- package/src/assembly/recovery/recovery-attempt.ts +800 -0
- package/src/assembly/recovery/renderer-recover.ts +906 -0
- package/src/assembly/renderer-facade.ts +342 -0
- package/src/assembly/renderer-frame-transaction.ts +45 -0
- package/src/assembly/renderer-helpers.ts +99 -0
- package/src/assembly/renderer-lifecycle.ts +159 -0
- package/src/assembly/shader-prewarm-policy.ts +157 -0
- package/src/assembly/webgpu-ready-contract.ts +14 -0
- package/src/assembly/webgpu-ready.ts +4079 -0
- package/src/assembly/webgpu-renderer.ts +4095 -0
- package/src/cluster-binner.ts +31 -0
- package/src/components/__tests__/lighting-authoring.unit.test.ts +39 -0
- package/src/components/__tests__/rect-area-light.unit.test.ts +33 -0
- package/src/components/camera.ts +1 -1
- package/src/components/index.ts +3 -0
- package/src/components/light-helpers.ts +52 -1
- package/src/components/light-probe.ts +13 -0
- package/src/components/rect-area-light.ts +15 -0
- package/src/components/scene-instance.ts +6 -0
- package/src/components/spot-light.ts +3 -0
- package/src/debug-draw-glue.ts +1 -1
- package/src/device/__tests__/extended-lighting-recovery.unit.test.ts +24 -0
- package/src/device/device-scope.ts +35 -6
- package/src/device/gpu-residency.ts +334 -35
- package/src/device/lifecycle-transaction.ts +12 -0
- package/src/environment/frame.ts +6 -0
- package/src/environment/inspection.ts +10 -0
- package/src/environment/lifecycle.ts +122 -9
- package/src/errors/gpu-driven.ts +92 -0
- package/src/errors/index.ts +1 -0
- package/src/errors/recover.ts +108 -5
- package/src/errors/render.ts +72 -1
- package/src/extract/camera.ts +3 -3
- package/src/extract/contracts.ts +974 -0
- package/src/extract/gpu-driven.ts +108 -0
- package/src/extract/visibility.ts +0 -23
- package/src/features/host.ts +16 -0
- package/src/features/prepared-gpu-work.ts +20 -2
- package/src/features/prepared-graphics-store.ts +17 -0
- package/src/gpu-driven/batch-topology.ts +206 -28
- package/src/gpu-driven/prepared-draw.ts +208 -0
- package/src/gpu-driven/production-raster.ts +1046 -39
- package/src/gpu-driven/view-gpu.ts +411 -29
- package/src/gpu-scene-schema.ts +13 -0
- package/src/gpu-scene.ts +137 -67
- package/src/gpu-usage.ts +0 -1
- package/src/hdrp-buffers.ts +6 -6
- package/src/ibl/IblPipelineCache.ts +134 -50
- package/src/ibl/skylight-bind-group.ts +26 -0
- package/src/index.ts +83 -1
- package/src/inspection-types.ts +220 -1
- package/src/internal.ts +38 -0
- package/src/light-buffer-layout.ts +157 -324
- package/src/materials.ts +278 -47
- package/src/mesh-material-bindings.ts +59 -0
- package/src/occlusion-proxy.ts +64 -0
- package/src/pbr-pipeline.ts +290 -60
- package/src/pipeline/standard-forward-lane.ts +47 -0
- package/src/pipeline/standard-lighting/graph.ts +2 -1
- package/src/pipeline/standard-lighting/light-frame.ts +3 -2
- package/src/pipeline/standard-lighting/topology.ts +1 -1
- package/src/pipeline/standard-lighting/transport.ts +2 -1
- package/src/pipeline/standard-pipeline.ts +2 -0
- package/src/pipeline-builder.ts +5 -2
- package/src/pipeline-spec.ts +12 -1
- package/src/plugin.ts +4 -0
- package/src/points-lines/__tests__/cache-recovery.unit.test.ts +22 -0
- package/src/points-lines/prepare.ts +9 -0
- package/src/points-lines/standard-owner.ts +403 -0
- package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +56 -0
- package/src/prepare/extended-lighting/ltc-resources.ts +136 -0
- package/src/prepare/extended-lighting/resources.ts +389 -0
- package/src/prepare/extended-lighting/spot-modifiers.ts +194 -0
- package/src/prepare/extended-lighting/state.ts +92 -0
- package/src/record/__tests__/frame-targets-recovery.unit.test.ts +60 -0
- package/src/record/__tests__/gpu-timing.unit.test.ts +177 -0
- package/src/record/__tests__/main-pass-geometry.unit.test.ts +26 -1
- package/src/record/__tests__/mesh-ssbo.unit.test.ts +38 -0
- package/src/record/__tests__/recovery-pipeline.unit.test.ts +124 -0
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +28 -13
- package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +47 -4
- package/src/record/__tests__/temporal-payload.unit.test.ts +29 -28
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +21 -2
- package/src/record/frame-lighting.ts +252 -53
- package/src/record/frame-snapshot.ts +72 -12
- package/src/record/frame-targets.ts +11 -1
- package/src/record/frame.ts +416 -95
- package/src/record/gpu-timing.ts +108 -44
- package/src/record/helpers.ts +1 -59
- package/src/record/main-pass-geometry.ts +434 -44
- package/src/record/main-pass-material.ts +324 -210
- package/src/record/main-pass-sprite-draws.ts +58 -92
- package/src/record/main-pass.ts +94 -6
- package/src/record/mesh-ssbo.ts +79 -46
- package/src/record/recovery-pipeline.ts +695 -0
- package/src/record/render-context.ts +99 -7
- package/src/record/shadow-pass.ts +66 -40
- package/src/record/typed-frame-graph.ts +270 -84
- package/src/record/view-ubo.ts +17 -27
- package/src/recovery/render-system-candidate.ts +839 -0
- package/src/reflection/inspection.ts +67 -0
- package/src/reflection/projection.ts +196 -1
- package/src/reflection/record-owner.ts +1283 -0
- package/src/render-contract.ts +82 -12
- package/src/render-pipeline.ts +5 -0
- package/src/render-system-extract-tail.ts +2983 -0
- package/src/render-system-extract.ts +290 -2784
- package/src/render-system.ts +1597 -1192
- package/src/scene/__tests__/changed-block-summary.candidate.test.ts +36 -0
- package/src/scene/probe-blend-record.ts +54 -0
- package/src/scene/probe-blend.ts +813 -0
- package/src/scene/render-scene-types.ts +0 -7
- package/src/scene/render-scene.ts +972 -184
- package/src/scene/visibility/bounds.ts +57 -0
- package/src/scene/visibility/budget.ts +40 -0
- package/src/scene/visibility/facet.ts +400 -0
- package/src/scene/visibility/gpu-frame-timing.ts +101 -0
- package/src/scene/visibility/gpu-lod.ts +119 -0
- package/src/scene/visibility/inspection.ts +313 -0
- package/src/scene/visibility/lod-selector.ts +84 -0
- package/src/scene/visibility/occlusion-confidence.ts +478 -0
- package/src/scene/visibility/occlusion-pass.ts +165 -0
- package/src/scene/visibility/occlusion-query-pool.ts +178 -0
- package/src/scene/visibility/occlusion-runtime.ts +672 -0
- package/src/scene/visibility/types.ts +50 -0
- package/src/ssr/admission.ts +451 -0
- package/src/ssr/composition.ts +73 -0
- package/src/ssr/errors.ts +76 -0
- package/src/ssr/identity.ts +12 -0
- package/src/systems/skin-palette-allocator.ts +1 -1
- package/src/temporal/frame-coordinator.ts +30 -1
- package/src/temporal/frame.ts +14 -1
- package/src/temporal/taa-history-store.ts +46 -2
- package/src/temporal/temporal-view.ts +1 -1
- package/src/temporal/transaction.ts +9 -0
- package/src/temporal/view.ts +11 -0
- package/src/tilemap-chunk-extract-system.ts +5 -5
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +19 -12
- package/src/typed-render-graph-primitives.ts +48 -0
- package/src/volume/passes.ts +46 -49
- package/dist/.tsbuildinfo +0 -1
- package/dist/chunk-5YADUCA7.mjs.map +0 -1
- package/dist/chunk-6OPXDQ2E.mjs.map +0 -1
- package/dist/chunk-BXBQQKFQ.mjs +0 -67
- package/dist/chunk-BXBQQKFQ.mjs.map +0 -1
- package/dist/chunk-FS2KNUQH.mjs.map +0 -1
- package/dist/chunk-PCHBPYML.mjs.map +0 -1
- package/dist/chunk-VFPLTKCU.mjs +0 -192
- package/dist/chunk-VFPLTKCU.mjs.map +0 -1
|
@@ -70,6 +70,32 @@ export interface TemporalFrameReceipt<T = unknown> {
|
|
|
70
70
|
readonly historyDirection: 'a-to-b' | 'b-to-a';
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
export type ReflectionFallbackTemporalReset =
|
|
74
|
+
| { readonly reset: false }
|
|
75
|
+
| { readonly reset: true; readonly reason: 'reflection-fallback-generation' };
|
|
76
|
+
|
|
77
|
+
/** Maps committed producer generations into the existing temporal reset seam. */
|
|
78
|
+
export function resolveReflectionFallbackTemporalReset(
|
|
79
|
+
previousGeneration: number | undefined,
|
|
80
|
+
nextGeneration: number | undefined,
|
|
81
|
+
): ReflectionFallbackTemporalReset {
|
|
82
|
+
if (previousGeneration === undefined || nextGeneration === undefined) return { reset: false };
|
|
83
|
+
return previousGeneration === nextGeneration
|
|
84
|
+
? { reset: false }
|
|
85
|
+
: { reset: true, reason: 'reflection-fallback-generation' };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Keeps SSR admission on the existing producer-generation reset seam. The
|
|
90
|
+
* admission path never allocates or resolves temporal history itself.
|
|
91
|
+
*/
|
|
92
|
+
export function resolveSsrAdmissionTemporalReset(
|
|
93
|
+
previousGeneration: number | undefined,
|
|
94
|
+
nextGeneration: number | undefined,
|
|
95
|
+
): ReflectionFallbackTemporalReset {
|
|
96
|
+
return resolveReflectionFallbackTemporalReset(previousGeneration, nextGeneration);
|
|
97
|
+
}
|
|
98
|
+
|
|
73
99
|
function failure(code: TemporalFrameErrorCode, hint: string): TemporalFrameError {
|
|
74
100
|
return {
|
|
75
101
|
code,
|
|
@@ -176,7 +202,10 @@ export class TemporalFrameCoordinator<T = unknown> {
|
|
|
176
202
|
}
|
|
177
203
|
this.historyDirection = candidate.history.direction === 'a-to-b' ? 'b-to-a' : 'a-to-b';
|
|
178
204
|
const historyAttempt = this.historyAttempts.get(candidate);
|
|
179
|
-
historyAttempt?.commit(
|
|
205
|
+
historyAttempt?.commit({
|
|
206
|
+
deviceGeneration: this.historyStore.inspect().deviceGeneration,
|
|
207
|
+
completed: true,
|
|
208
|
+
});
|
|
180
209
|
this.coverage = classifySceneDataCoverage({
|
|
181
210
|
contributors: candidate.contributors,
|
|
182
211
|
requiredContributorIds: candidate.requiredContributorIds,
|
package/src/temporal/frame.ts
CHANGED
|
@@ -44,6 +44,8 @@ export interface TemporalFrameTransaction {
|
|
|
44
44
|
stage(input: TemporalFrameInput): void;
|
|
45
45
|
commit(submit: TemporalSubmitResult): Result<TemporalFrame, TemporalFrameSubmitError>;
|
|
46
46
|
snapshot(): TemporalFrame;
|
|
47
|
+
/** Drop accepted/staged history after a producer or device generation cut. */
|
|
48
|
+
reset(reason?: Extract<TemporalResetReason, 'signature-change' | 'device-recovery'>): void;
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
function copyInput(input: TemporalFrameInput): TemporalFrameInput {
|
|
@@ -82,6 +84,7 @@ export function createTemporalFrameTransaction(options: {
|
|
|
82
84
|
let accepted: TemporalFrame | undefined;
|
|
83
85
|
let staged: TemporalFrameInput | undefined;
|
|
84
86
|
let historyEpoch = 0;
|
|
87
|
+
let pendingResetReason: Exclude<TemporalResetReason, 'none' | 'queue-submit-failed'> | undefined;
|
|
85
88
|
|
|
86
89
|
return {
|
|
87
90
|
stage(input) {
|
|
@@ -96,7 +99,7 @@ export function createTemporalFrameTransaction(options: {
|
|
|
96
99
|
return err(new TemporalFrameSubmitError('queue-submit-failed'));
|
|
97
100
|
}
|
|
98
101
|
|
|
99
|
-
const resetReason = submit.resetReason ?? staged.resetReason ?? 'none';
|
|
102
|
+
const resetReason = submit.resetReason ?? staged.resetReason ?? pendingResetReason ?? 'none';
|
|
100
103
|
const shouldReset = resetReason !== 'none';
|
|
101
104
|
if (shouldReset) historyEpoch += 1;
|
|
102
105
|
const next: TemporalFrame = {
|
|
@@ -117,6 +120,7 @@ export function createTemporalFrameTransaction(options: {
|
|
|
117
120
|
};
|
|
118
121
|
accepted = next;
|
|
119
122
|
staged = undefined;
|
|
123
|
+
pendingResetReason = undefined;
|
|
120
124
|
return ok(copyFrame(next));
|
|
121
125
|
},
|
|
122
126
|
snapshot() {
|
|
@@ -124,5 +128,14 @@ export function createTemporalFrameTransaction(options: {
|
|
|
124
128
|
throw new Error('TemporalFrame snapshot is unavailable before commit');
|
|
125
129
|
return copyFrame(accepted);
|
|
126
130
|
},
|
|
131
|
+
reset(reason = 'signature-change') {
|
|
132
|
+
accepted = undefined;
|
|
133
|
+
staged = undefined;
|
|
134
|
+
historyEpoch += 1;
|
|
135
|
+
// The reason is carried into the next accepted frame while clearing the
|
|
136
|
+
// committed frame prevents stale motion vectors from crossing the
|
|
137
|
+
// producer/device boundary.
|
|
138
|
+
pendingResetReason = reason;
|
|
139
|
+
},
|
|
127
140
|
};
|
|
128
141
|
}
|
|
@@ -6,6 +6,11 @@ export type TaaHistoryResetReason =
|
|
|
6
6
|
| 'device-generation';
|
|
7
7
|
|
|
8
8
|
export interface TaaHistoryInspection {
|
|
9
|
+
readonly token: number;
|
|
10
|
+
readonly deviceGeneration: number;
|
|
11
|
+
readonly content: 'uninitialized' | 'active';
|
|
12
|
+
readonly fallback: 'neutral-texture';
|
|
13
|
+
readonly requestVersion: number;
|
|
9
14
|
readonly generation: number;
|
|
10
15
|
readonly seed: number;
|
|
11
16
|
readonly attempt: 'none' | 'active' | 'committed' | 'aborted';
|
|
@@ -13,15 +18,26 @@ export interface TaaHistoryInspection {
|
|
|
13
18
|
readonly resetReason: TaaHistoryResetReason | undefined;
|
|
14
19
|
}
|
|
15
20
|
|
|
21
|
+
export interface TaaHistoryReceipt {
|
|
22
|
+
readonly deviceGeneration: number;
|
|
23
|
+
readonly completed: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
16
26
|
export interface TaaHistoryAttempt {
|
|
17
27
|
readonly generation: number;
|
|
18
28
|
readonly seed: number;
|
|
19
|
-
commit(): void;
|
|
29
|
+
commit(receipt?: TaaHistoryReceipt): void;
|
|
20
30
|
abort(): void;
|
|
21
31
|
}
|
|
22
32
|
|
|
33
|
+
let nextHistoryToken = 1;
|
|
34
|
+
|
|
23
35
|
/** TAA-only history owner. No global registry or backend handle crosses this boundary. */
|
|
24
36
|
export class TaaHistoryStore {
|
|
37
|
+
private readonly token = nextHistoryToken++;
|
|
38
|
+
private deviceGeneration = 0;
|
|
39
|
+
private content: TaaHistoryInspection['content'] = 'uninitialized';
|
|
40
|
+
private requestVersion = 0;
|
|
25
41
|
private generation = 0;
|
|
26
42
|
private seed = 0;
|
|
27
43
|
private valid = false;
|
|
@@ -36,11 +52,21 @@ export class TaaHistoryStore {
|
|
|
36
52
|
return {
|
|
37
53
|
generation,
|
|
38
54
|
seed,
|
|
39
|
-
commit: () => {
|
|
55
|
+
commit: (receipt) => {
|
|
40
56
|
if (state !== 'active') return;
|
|
57
|
+
if (
|
|
58
|
+
receipt !== undefined &&
|
|
59
|
+
(!receipt.completed || receipt.deviceGeneration !== this.deviceGeneration)
|
|
60
|
+
) {
|
|
61
|
+
state = 'aborted';
|
|
62
|
+
this.attempt = 'aborted';
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
41
65
|
state = 'committed';
|
|
42
66
|
this.attempt = 'committed';
|
|
43
67
|
this.valid = true;
|
|
68
|
+
this.content = 'active';
|
|
69
|
+
this.requestVersion += 1;
|
|
44
70
|
this.generation += 1;
|
|
45
71
|
this.seed += 1;
|
|
46
72
|
this.resetReason = reason;
|
|
@@ -55,6 +81,7 @@ export class TaaHistoryStore {
|
|
|
55
81
|
|
|
56
82
|
seedHistory(reason: TaaHistoryResetReason = 'first-frame'): void {
|
|
57
83
|
this.valid = false;
|
|
84
|
+
this.content = 'uninitialized';
|
|
58
85
|
this.resetReason = reason;
|
|
59
86
|
this.attempt = 'none';
|
|
60
87
|
}
|
|
@@ -63,12 +90,29 @@ export class TaaHistoryStore {
|
|
|
63
90
|
this.generation = 0;
|
|
64
91
|
this.seed = 0;
|
|
65
92
|
this.valid = false;
|
|
93
|
+
this.content = 'uninitialized';
|
|
66
94
|
this.attempt = 'none';
|
|
67
95
|
this.resetReason = reason;
|
|
68
96
|
}
|
|
69
97
|
|
|
98
|
+
recoverForGeneration(deviceGeneration: number): void {
|
|
99
|
+
if (!Number.isSafeInteger(deviceGeneration) || deviceGeneration < 0) {
|
|
100
|
+
throw new RangeError('deviceGeneration must be a non-negative safe integer.');
|
|
101
|
+
}
|
|
102
|
+
this.deviceGeneration = deviceGeneration;
|
|
103
|
+
this.valid = false;
|
|
104
|
+
this.content = 'uninitialized';
|
|
105
|
+
this.attempt = 'none';
|
|
106
|
+
this.resetReason = 'device-generation';
|
|
107
|
+
}
|
|
108
|
+
|
|
70
109
|
inspect(): TaaHistoryInspection {
|
|
71
110
|
return {
|
|
111
|
+
token: this.token,
|
|
112
|
+
deviceGeneration: this.deviceGeneration,
|
|
113
|
+
content: this.content,
|
|
114
|
+
fallback: 'neutral-texture',
|
|
115
|
+
requestVersion: this.requestVersion,
|
|
72
116
|
generation: this.generation,
|
|
73
117
|
seed: this.seed,
|
|
74
118
|
attempt: this.attempt,
|
|
@@ -10,6 +10,15 @@ export interface TemporalFrameCandidate {
|
|
|
10
10
|
readonly history: TemporalHistory;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
export interface TemporalGenerationFence {
|
|
14
|
+
readonly capturedGeneration: number;
|
|
15
|
+
readonly currentGeneration: () => number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function temporalGenerationIsCurrent(fence: TemporalGenerationFence): boolean {
|
|
19
|
+
return fence.currentGeneration() === fence.capturedGeneration;
|
|
20
|
+
}
|
|
21
|
+
|
|
13
22
|
export function stageTemporalFrame(
|
|
14
23
|
candidate: TemporalFrameCandidate,
|
|
15
24
|
): RendererFrameTransaction<TemporalFrameCandidate> {
|
package/src/temporal/view.ts
CHANGED
|
@@ -38,6 +38,8 @@ export interface TemporalViewInput {
|
|
|
38
38
|
readonly historyValid?: boolean;
|
|
39
39
|
readonly currentUnjitteredViewProjection?: ArrayLike<number> | undefined;
|
|
40
40
|
readonly previousUnjitteredViewProjection?: ArrayLike<number> | undefined;
|
|
41
|
+
readonly currentCameraPosition?: readonly [number, number, number] | undefined;
|
|
42
|
+
readonly previousCameraPosition?: readonly [number, number, number] | undefined;
|
|
41
43
|
readonly resetReason?: TemporalResetReason | undefined;
|
|
42
44
|
}
|
|
43
45
|
|
|
@@ -55,6 +57,8 @@ interface TemporalViewSnapshot {
|
|
|
55
57
|
readonly historyValid: boolean;
|
|
56
58
|
readonly currentUnjitteredViewProjection: ArrayLike<number> | undefined;
|
|
57
59
|
readonly previousUnjitteredViewProjection: ArrayLike<number> | undefined;
|
|
60
|
+
readonly currentCameraPosition: readonly [number, number, number] | undefined;
|
|
61
|
+
readonly previousCameraPosition: readonly [number, number, number] | undefined;
|
|
58
62
|
readonly resetReason: TemporalResetReason | undefined;
|
|
59
63
|
}
|
|
60
64
|
|
|
@@ -70,6 +74,9 @@ export interface TemporalView {
|
|
|
70
74
|
/** Unjittered matrices are supplied by the renderer projection owner. */
|
|
71
75
|
readonly currentUnjitteredViewProjection: ArrayLike<number> | undefined;
|
|
72
76
|
readonly previousUnjitteredViewProjection: ArrayLike<number> | undefined;
|
|
77
|
+
/** Camera origins follow the same accepted-submit boundary as the matrices. */
|
|
78
|
+
readonly currentCameraPosition: readonly [number, number, number] | undefined;
|
|
79
|
+
readonly previousCameraPosition: readonly [number, number, number] | undefined;
|
|
73
80
|
readonly currentProjection: 'jittered' | 'unjittered';
|
|
74
81
|
readonly previousProjection: 'unjittered';
|
|
75
82
|
readonly historyRequired: boolean;
|
|
@@ -112,6 +119,8 @@ export function createTemporalView(input: TemporalViewInput): TemporalView {
|
|
|
112
119
|
historyValid: input.historyValid ?? false,
|
|
113
120
|
currentUnjitteredViewProjection: input.currentUnjitteredViewProjection,
|
|
114
121
|
previousUnjitteredViewProjection: input.previousUnjitteredViewProjection,
|
|
122
|
+
currentCameraPosition: input.currentCameraPosition,
|
|
123
|
+
previousCameraPosition: input.previousCameraPosition,
|
|
115
124
|
resetReason: input.resetReason,
|
|
116
125
|
});
|
|
117
126
|
const taa = input.antialias === 'taa';
|
|
@@ -135,6 +144,8 @@ export function createTemporalView(input: TemporalViewInput): TemporalView {
|
|
|
135
144
|
temporalFrameIndex: frameIndex,
|
|
136
145
|
currentUnjitteredViewProjection: input.currentUnjitteredViewProjection,
|
|
137
146
|
previousUnjitteredViewProjection: input.previousUnjitteredViewProjection,
|
|
147
|
+
currentCameraPosition: input.currentCameraPosition,
|
|
148
|
+
previousCameraPosition: input.previousCameraPosition,
|
|
138
149
|
currentProjection: taa ? 'jittered' : 'unjittered',
|
|
139
150
|
previousProjection: 'unjittered',
|
|
140
151
|
historyRequired: taa,
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
import type { EntityHandle, World } from '@forgeax/engine-ecs';
|
|
58
58
|
import { decodeTileBits } from '@forgeax/engine-graphics-extras';
|
|
59
59
|
import { type box3, frustum, mat4 } from '@forgeax/engine-math';
|
|
60
|
-
import { ChildOf, Children, Transform } from '@forgeax/engine-scene';
|
|
60
|
+
import { ChildOf, Children, GlobalTransform, Transform } from '@forgeax/engine-scene';
|
|
61
61
|
import {
|
|
62
62
|
type Handle,
|
|
63
63
|
type MaterialAsset,
|
|
@@ -874,13 +874,13 @@ function bucketTileLayer(
|
|
|
874
874
|
* cull paths use byte-identical planes (charter P4 consistent abstraction).
|
|
875
875
|
*/
|
|
876
876
|
function buildCameraFrustumPlanes(world: World): frustum.Frustum | null {
|
|
877
|
-
const query = world.query({ with: [Camera, Transform] }).unwrap();
|
|
877
|
+
const query = world.query({ with: [Camera, Transform, GlobalTransform] }).unwrap();
|
|
878
878
|
let result: frustum.Frustum | null = null;
|
|
879
879
|
for (const row of query) {
|
|
880
880
|
const camEntity = row.entity;
|
|
881
881
|
|
|
882
882
|
const camRes = world.get(camEntity, Camera);
|
|
883
|
-
const trRes = world.get(camEntity,
|
|
883
|
+
const trRes = world.get(camEntity, GlobalTransform);
|
|
884
884
|
if (!camRes.ok || !trRes.ok) continue;
|
|
885
885
|
|
|
886
886
|
const cam = camRes.value;
|
|
@@ -895,8 +895,8 @@ function buildCameraFrustumPlanes(world: World): frustum.Frustum | null {
|
|
|
895
895
|
proj as Parameters<typeof mat4.orthographic>[0],
|
|
896
896
|
cam.left,
|
|
897
897
|
cam.right,
|
|
898
|
-
cam.bottom,
|
|
899
898
|
cam.top,
|
|
899
|
+
cam.bottom,
|
|
900
900
|
near,
|
|
901
901
|
far,
|
|
902
902
|
);
|
|
@@ -1081,7 +1081,7 @@ function evictDeadPerCellStreamingCaches(work: readonly LayerWork[], world: Worl
|
|
|
1081
1081
|
/**
|
|
1082
1082
|
* Walk every TileLayer ChildOf-ing a Tilemap, extract its non-zero cells
|
|
1083
1083
|
* into derived render entities. A Renderer attaches this system to FrameEnd;
|
|
1084
|
-
* World's final publication then resolves newly-created
|
|
1084
|
+
* World's final publication then resolves newly-created GlobalTransform.world values before the
|
|
1085
1085
|
* read-only render walk begins.
|
|
1086
1086
|
*
|
|
1087
1087
|
* Two paths based on `TileLayer.sortScope`:
|
|
@@ -29,6 +29,7 @@ const BUFFER_USAGE_MAP_READ = 0x0001;
|
|
|
29
29
|
const BUFFER_USAGE_COPY_DST = 0x0008;
|
|
30
30
|
const GPU_MAP_MODE_READ = 0x0001;
|
|
31
31
|
const TEST_REACTIVE = 0;
|
|
32
|
+
const LIGHTWEIGHT_DAWN = process.env.FORGEAX_DAWN_LIGHTWEIGHT === '1';
|
|
32
33
|
|
|
33
34
|
const ENGINE_MANIFEST = await (async () => {
|
|
34
35
|
const { buildEngineShaderManifest } = await import('@forgeax/engine-vite-plugin-shader');
|
|
@@ -377,8 +378,8 @@ describe('Standard transmission Dawn ROI', () => {
|
|
|
377
378
|
}, 120_000);
|
|
378
379
|
|
|
379
380
|
it('keeps IOR, thickness, and roughness monotonic in a finite linear ROI', async () => {
|
|
380
|
-
const
|
|
381
|
-
|
|
381
|
+
const fullCases = [
|
|
382
|
+
{
|
|
382
383
|
name: 'ior-low',
|
|
383
384
|
transmission: 1,
|
|
384
385
|
ior: 1.1,
|
|
@@ -386,8 +387,8 @@ describe('Standard transmission Dawn ROI', () => {
|
|
|
386
387
|
roughness: 0.1,
|
|
387
388
|
attenuationColor: [0.8, 0.8, 0.8],
|
|
388
389
|
attenuationDistance: 4,
|
|
389
|
-
}
|
|
390
|
-
|
|
390
|
+
},
|
|
391
|
+
{
|
|
391
392
|
name: 'ior-high',
|
|
392
393
|
transmission: 1,
|
|
393
394
|
ior: 2.2,
|
|
@@ -395,8 +396,8 @@ describe('Standard transmission Dawn ROI', () => {
|
|
|
395
396
|
roughness: 0.1,
|
|
396
397
|
attenuationColor: [0.8, 0.8, 0.8],
|
|
397
398
|
attenuationDistance: 4,
|
|
398
|
-
}
|
|
399
|
-
|
|
399
|
+
},
|
|
400
|
+
{
|
|
400
401
|
name: 'thick',
|
|
401
402
|
transmission: 1,
|
|
402
403
|
ior: 1.5,
|
|
@@ -404,8 +405,8 @@ describe('Standard transmission Dawn ROI', () => {
|
|
|
404
405
|
roughness: 0.1,
|
|
405
406
|
attenuationColor: [0.1, 0.1, 0.1],
|
|
406
407
|
attenuationDistance: 1,
|
|
407
|
-
}
|
|
408
|
-
|
|
408
|
+
},
|
|
409
|
+
{
|
|
409
410
|
name: 'rough',
|
|
410
411
|
transmission: 1,
|
|
411
412
|
ior: 1.5,
|
|
@@ -413,12 +414,18 @@ describe('Standard transmission Dawn ROI', () => {
|
|
|
413
414
|
roughness: 0.9,
|
|
414
415
|
attenuationColor: [0.8, 0.8, 0.8],
|
|
415
416
|
attenuationDistance: 4,
|
|
416
|
-
}
|
|
417
|
-
]
|
|
417
|
+
},
|
|
418
|
+
] as const;
|
|
419
|
+
// Browser parity still exercises every transmission fixture. The PR
|
|
420
|
+
// Dawn lane keeps the low/high IOR and roughness boundaries, while the
|
|
421
|
+
// full local/nightly lane retains the thickness case as well.
|
|
422
|
+
const selectedCases = LIGHTWEIGHT_DAWN ? [fullCases[0], fullCases[1], fullCases[3]] : fullCases;
|
|
423
|
+
const cases = await Promise.all(selectedCases.map((testCase) => renderCase(testCase)));
|
|
418
424
|
for (const result of cases) expect(result.pixel.every(Number.isFinite)).toBe(true);
|
|
419
425
|
expect(cases[1]?.pixel).not.toEqual(cases[0]?.pixel);
|
|
420
|
-
expect(cases[2]?.pixel).not.toEqual(cases[0]?.pixel);
|
|
421
|
-
|
|
426
|
+
if (!LIGHTWEIGHT_DAWN) expect(cases[2]?.pixel).not.toEqual(cases[0]?.pixel);
|
|
427
|
+
const rough = LIGHTWEIGHT_DAWN ? cases[2] : cases[3];
|
|
428
|
+
expect(luma(rough?.pixel ?? [0, 0, 0, 0])).toBeLessThanOrEqual(
|
|
422
429
|
luma(cases[0]?.pixel ?? [0, 0, 0, 0]) + 2,
|
|
423
430
|
);
|
|
424
431
|
}, 120_000);
|
|
@@ -34,6 +34,7 @@ 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 type { OcclusionFrameProjection } from './scene/visibility/occlusion-runtime';
|
|
37
38
|
import {
|
|
38
39
|
getTemporalBindGroupResources,
|
|
39
40
|
getTemporalGpuState,
|
|
@@ -136,6 +137,7 @@ export interface TypedScenePassOptions {
|
|
|
136
137
|
readonly transmissionBackdrop?: GraphTextureView | undefined;
|
|
137
138
|
readonly extraAccesses?: readonly GraphAccess[] | undefined;
|
|
138
139
|
readonly gpuDriven?: RenderPipelineGpuDrivenProjection | undefined;
|
|
140
|
+
readonly occlusion?: OcclusionFrameProjection | undefined;
|
|
139
141
|
}
|
|
140
142
|
|
|
141
143
|
export function addTypedScenePass(
|
|
@@ -187,6 +189,7 @@ export function addTypedScenePass(
|
|
|
187
189
|
stencilLoadOp: options.depthLoadOp ?? 'clear',
|
|
188
190
|
stencilStoreOp: 'store',
|
|
189
191
|
},
|
|
192
|
+
occlusionQuerySet: options.occlusion?.querySet,
|
|
190
193
|
encode: ({ pass, frame, resources }) => {
|
|
191
194
|
const colorViews = colorTargets.map((target) => resolvedView(resources, target.view));
|
|
192
195
|
const depthView = resolvedView(resources, options.depth.view);
|
|
@@ -228,13 +231,23 @@ export function addTypedScenePass(
|
|
|
228
231
|
if (groups.viewBindGroup !== null) {
|
|
229
232
|
options.gpuDriven?.encode(groups.viewBindGroup, pass, resources);
|
|
230
233
|
}
|
|
234
|
+
// The context carries the frame's primary occlusion projection for
|
|
235
|
+
// pipeline construction, but only the pass that owns that projection
|
|
236
|
+
// may begin its query. Forwarding it to deferred/temporal scene passes
|
|
237
|
+
// leaves their descriptors without an occlusionQuerySet and makes Dawn
|
|
238
|
+
// reject beginOcclusionQuery in those passes.
|
|
239
|
+
const activeOcclusion = options.occlusion;
|
|
231
240
|
encodeMainPass(
|
|
232
241
|
{
|
|
233
242
|
...internal,
|
|
243
|
+
...(activeOcclusion === undefined ? {} : { occlusion: activeOcclusion }),
|
|
234
244
|
geometryColorView: colorViews[0] ?? null,
|
|
235
245
|
geometryDepthView: depthView,
|
|
236
246
|
geometryColorResolveView: resolveView,
|
|
237
247
|
transparentColorFormat: colorTargets[0]?.format as GPUTextureFormat,
|
|
248
|
+
...(colorTargets[1]?.format === 'rgba16float'
|
|
249
|
+
? { reflectionFallbackColorFormat: 'rgba16float' as const }
|
|
250
|
+
: {}),
|
|
238
251
|
msaaActive: colorTargets[0]?.sampleCount === 4,
|
|
239
252
|
viewBindGroup: groups.viewBindGroup,
|
|
240
253
|
meshBindGroup: groups.meshBindGroup,
|
|
@@ -256,6 +269,10 @@ export function addTypedScenePass(
|
|
|
256
269
|
: { transmissionBackdropView: transmissionBackdrop }),
|
|
257
270
|
},
|
|
258
271
|
);
|
|
272
|
+
if (activeOcclusion !== undefined) {
|
|
273
|
+
const proxyResult = activeOcclusion.encodeProxyBounds(pass);
|
|
274
|
+
if (!proxyResult.ok) throw proxyResult.error;
|
|
275
|
+
}
|
|
259
276
|
},
|
|
260
277
|
});
|
|
261
278
|
}
|
|
@@ -291,6 +308,37 @@ export function addTypedFrameObservationPass(
|
|
|
291
308
|
});
|
|
292
309
|
}
|
|
293
310
|
|
|
311
|
+
/** Publish the same-frame fallback MRT as a detached, copy-readable source. */
|
|
312
|
+
export function addReflectionFallbackObservationPass(
|
|
313
|
+
graph: RenderGraphBuilder<RenderPipelineFrame>,
|
|
314
|
+
target: RenderPipelineTarget,
|
|
315
|
+
): Result<void, RenderGraphError> {
|
|
316
|
+
return graph.addCopyPass('reflection-fallback-observation', {
|
|
317
|
+
accesses: [{ resource: target.view, usage: 'copy-src' }],
|
|
318
|
+
encode: ({ frame, resources }) => {
|
|
319
|
+
const internal = frame as _InternalRenderPipelineContext;
|
|
320
|
+
const texture = resources.texture(target.texture);
|
|
321
|
+
if (!texture.ok) throw texture.error;
|
|
322
|
+
internal.frameState.reflectionFallbackObservationSource = {
|
|
323
|
+
texture: texture.value,
|
|
324
|
+
descriptor: {
|
|
325
|
+
texture: texture.value,
|
|
326
|
+
format: target.format,
|
|
327
|
+
size: { width: frame.targetW, height: frame.targetH },
|
|
328
|
+
usage:
|
|
329
|
+
GPU_TEXTURE_USAGE_COPY_SRC |
|
|
330
|
+
GPU_TEXTURE_USAGE_RENDER_ATTACHMENT |
|
|
331
|
+
GPU_TEXTURE_USAGE_TEXTURE_BINDING,
|
|
332
|
+
sample: target.sampleCount,
|
|
333
|
+
},
|
|
334
|
+
frameId: internal.frameState.frameNumber,
|
|
335
|
+
pipelineId: 'forgeax::standard',
|
|
336
|
+
backendId: internal.runtime.device.caps.backendKind,
|
|
337
|
+
};
|
|
338
|
+
},
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
|
|
294
342
|
export interface TypedBloomTargets {
|
|
295
343
|
readonly scene: RenderPipelineTarget;
|
|
296
344
|
readonly composited: RenderPipelineTarget;
|