@forgeax/engine-render 0.1.3 → 0.1.6
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 +130 -641
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -1
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +6 -0
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -1
- package/dist/{gpu-driven/view-reference.d.ts → __tests__/gpu-driven-view-reference.d.ts} +4 -4
- package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -1
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
- package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
- package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
- package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
- package/dist/{renderer/backend-selection.d.ts → assembly/backend-contract.d.ts} +15 -4
- package/dist/assembly/backend-contract.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +207 -0
- package/dist/assembly/factory.d.ts.map +1 -0
- package/dist/assembly/host-contract.d.ts +84 -0
- package/dist/assembly/host-contract.d.ts.map +1 -0
- package/dist/{renderer → assembly}/material/assembly.d.ts +1 -2
- package/dist/{renderer → assembly}/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material/pipeline-projection.d.ts +30 -0
- package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
- package/dist/authoring.d.ts +10 -11
- package/dist/authoring.d.ts.map +1 -1
- package/dist/authoring.mjs +25 -3
- package/dist/authoring.mjs.map +1 -1
- package/dist/chunk-CQXZC5XI.mjs +182 -0
- package/dist/chunk-CQXZC5XI.mjs.map +1 -0
- package/dist/chunk-QC4VW3XJ.mjs +79 -0
- package/dist/chunk-QC4VW3XJ.mjs.map +1 -0
- package/dist/chunk-SCRSAK5B.mjs +480 -0
- package/dist/chunk-SCRSAK5B.mjs.map +1 -0
- package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
- package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
- package/dist/components/glyph-text.d.ts +1 -1
- package/dist/components/glyph-text.d.ts.map +1 -1
- package/dist/components/index.d.ts +2 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/instances.d.ts +1 -1
- package/dist/components/instances.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts +1 -1
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/mesh-filter.d.ts +7 -7
- package/dist/components/mesh-filter.d.ts.map +1 -1
- package/dist/components/scene-instance.d.ts +11 -11
- package/dist/components/skybox-background.d.ts +56 -0
- package/dist/components/skybox-background.d.ts.map +1 -0
- package/dist/components/skylight.d.ts +55 -0
- package/dist/components/skylight.d.ts.map +1 -0
- package/dist/components/sprite-animation.d.ts +2 -3
- package/dist/components/sprite-animation.d.ts.map +1 -1
- package/dist/components/sprite-instances.d.ts +1 -1
- package/dist/components/sprite-playback-mode.d.ts +6 -1
- package/dist/components/sprite-playback-mode.d.ts.map +1 -1
- package/dist/components/sprite-region-override.d.ts +2 -3
- package/dist/components/sprite-region-override.d.ts.map +1 -1
- package/dist/components/tile-layer.d.ts +5 -0
- package/dist/components/tile-layer.d.ts.map +1 -1
- package/dist/construct-renderer.d.ts +18 -1
- package/dist/construct-renderer.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +27008 -4
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/debug-draw-glue.d.ts +2 -53
- package/dist/debug-draw-glue.d.ts.map +1 -1
- package/dist/device/device-scope.d.ts +83 -0
- package/dist/device/device-scope.d.ts.map +1 -0
- package/dist/{gpu-resource-store.d.ts → device/gpu-residency.d.ts} +91 -48
- package/dist/device/gpu-residency.d.ts.map +1 -0
- package/dist/device/resource-types.d.ts +8 -0
- package/dist/device/resource-types.d.ts.map +1 -0
- package/dist/engine-metrics.d.ts +2 -2
- package/dist/engine-metrics.d.ts.map +1 -1
- package/dist/errors/recover.d.ts +28 -1
- package/dist/errors/recover.d.ts.map +1 -1
- package/dist/errors/render.d.ts +249 -258
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/features/fullscreen.d.ts +19 -0
- package/dist/features/fullscreen.d.ts.map +1 -0
- package/dist/features/host.d.ts +32 -26
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/morph/morph-feature.d.ts +39 -5
- package/dist/features/morph/morph-feature.d.ts.map +1 -1
- package/dist/features/plan.d.ts +182 -0
- package/dist/features/plan.d.ts.map +1 -0
- package/dist/features/prepared-gpu-work.d.ts +21 -17
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics-store.d.ts +2 -1
- package/dist/features/prepared-graphics-store.d.ts.map +1 -1
- package/dist/features/prepared-graphics.d.ts +11 -21
- package/dist/features/prepared-graphics.d.ts.map +1 -1
- package/dist/features/render-graph-compute.d.ts +2 -2
- package/dist/features/render-graph-compute.d.ts.map +1 -1
- package/dist/features/render-graph-contribution.d.ts +4 -7
- package/dist/features/render-graph-contribution.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +2 -2
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/render-graph-resources.d.ts +6 -6
- package/dist/features/render-graph-resources.d.ts.map +1 -1
- package/dist/features/targets.d.ts +5 -5
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +11 -190
- package/dist/features/types.d.ts.map +1 -1
- package/dist/features/vocabulary.d.ts +14 -0
- package/dist/features/vocabulary.d.ts.map +1 -0
- package/dist/fullscreen-post-process-pass.d.ts +4 -25
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/glyph-text-layout-system.d.ts +3 -2
- package/dist/glyph-text-layout-system.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts +6 -75
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +13 -112
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/view-gpu.d.ts +10 -66
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-resource.d.ts +3 -3
- package/dist/gpu-scene-schema.d.ts +1 -94
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +7 -33
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +3 -53
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +74 -180
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +1 -1
- package/dist/index.d.ts +13 -43
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +165 -3
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +69 -0
- package/dist/inspection-types.d.ts.map +1 -0
- package/dist/instance-buffer-cache.d.ts +1 -4
- package/dist/instance-buffer-cache.d.ts.map +1 -1
- package/dist/internal.d.ts +1 -73
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +1 -43
- package/dist/internal.mjs.map +1 -1
- package/dist/lifecycle.d.ts +36 -2
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/materials.d.ts +0 -3
- package/dist/materials.d.ts.map +1 -1
- package/dist/mesh-material-bindings.d.ts +0 -1
- package/dist/mesh-material-bindings.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +75 -29
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts +5 -0
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts +31 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
- package/dist/pipeline/standard-profile.d.ts +40 -0
- package/dist/pipeline/standard-profile.d.ts.map +1 -0
- package/dist/pipeline-builder.d.ts +3 -3
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec-types.d.ts +24 -0
- package/dist/pipeline-spec-types.d.ts.map +1 -0
- package/dist/pipeline-spec.d.ts +16 -155
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/plugin.d.ts +1 -14
- package/dist/plugin.d.ts.map +1 -1
- package/dist/post-process-errors.d.ts +18 -18
- package/dist/post-process-errors.d.ts.map +1 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts +2 -5
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +7 -73
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +44 -44
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts +5 -38
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +64 -52
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/helpers.d.ts +3 -2
- package/dist/record/helpers.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +5 -4
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +90 -59
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +28 -3
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +1 -1
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +276 -3
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +235 -0
- package/dist/record/render-context.d.ts.map +1 -0
- package/dist/record/shadow-pass.d.ts +15 -88
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +1 -1
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +29 -7
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +3 -3
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/render-contract.d.ts +416 -0
- package/dist/render-contract.d.ts.map +1 -0
- package/dist/render-data.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts +14 -362
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +25 -64
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +107 -338
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +21 -713
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene-types.d.ts +58 -0
- package/dist/scene/render-scene-types.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts +105 -0
- package/dist/scene/render-scene.d.ts.map +1 -0
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts +2 -5
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -1
- package/dist/ssao-buffers.d.ts +22 -3
- package/dist/ssao-buffers.d.ts.map +1 -1
- package/dist/systems/skin-palette-allocator.d.ts +2 -4
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
- package/dist/systems/skin-palette-types.d.ts +14 -0
- package/dist/systems/skin-palette-types.d.ts.map +1 -0
- package/dist/systems/transparent-sort-config.d.ts +23 -2
- package/dist/systems/transparent-sort-config.d.ts.map +1 -1
- package/dist/tilemap-chunk-extract-system.d.ts +4 -3
- package/dist/tilemap-chunk-extract-system.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +2 -4
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-passes.d.ts +3 -3
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/package.json +23 -23
- package/src/__tests__/backend-selection-rhi-capture.test-d.ts +1 -1
- package/src/__tests__/callback-inference.test-d.ts +6 -3
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -4
- package/src/__tests__/construct-renderer-identity.unit.test.ts +15 -2
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
- package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
- package/src/__tests__/direct-extract-consumer-contract.test-d.ts +8 -19
- package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -13
- package/src/__tests__/factory-contract.integration.test.ts +158 -209
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +1 -4
- package/src/__tests__/frame-observation.contract.test.ts +17 -8
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
- package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +6 -11
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +9 -16
- package/src/__tests__/gpu-driven-production.integration.test.ts +32 -205
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +4 -7
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +87 -8
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +170 -8
- package/src/{gpu-driven/view-reference.ts → __tests__/gpu-driven-view-reference.ts} +4 -3
- package/src/__tests__/gpu-driven-view.browser.test.ts +12 -1
- package/src/__tests__/gpu-driven-view.dawn.test.ts +12 -1
- package/src/__tests__/gpu-driven-view.unit.test.ts +11 -267
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +3 -3
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +2 -3
- package/src/__tests__/gpu-scene.dawn.test.ts +2 -6
- package/src/__tests__/gpu-scene.unit.test.ts +10 -24
- package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
- package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +34 -66
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -5
- package/src/__tests__/light-buffer-layout.unit.test.ts +4 -49
- package/src/__tests__/material-cooked-projection.unit.test.ts +2 -51
- package/src/__tests__/material-snapshot-mutation.integration.test.ts +10 -15
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +4 -23
- package/src/__tests__/material-stride-surface.unit.test.ts +2 -2
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +7 -8
- package/src/__tests__/morph-culling-reentry.dawn.test.ts +29 -38
- package/src/__tests__/morph-feature-gpu-work.integration.test.ts +45 -43
- package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
- package/src/__tests__/morph-visual-evidence.integration.test.ts +47 -33
- package/src/__tests__/nineslice-handle-surface.unit.test.ts +11 -6
- package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -13
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +6 -81
- package/src/__tests__/prepared-graphics-generation.unit.test.ts +3 -17
- package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +6 -74
- package/src/__tests__/prepared-graphics-resolver.unit.test.ts +1 -3
- package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +2 -2
- package/src/__tests__/profiler-default-off.test.ts +1 -1
- package/src/__tests__/profiler-phase-catalog.test.ts +2 -2
- package/src/__tests__/profiler-phase-integration.test.ts +5 -13
- package/src/__tests__/profiler-phase-token.test.ts +3 -8
- package/src/__tests__/public-surface.test-d.ts +65 -3
- package/src/__tests__/recover-error-policy-owner.unit.test.ts +1 -21
- package/src/__tests__/render-error-code-owner.test-d.ts +18 -23
- package/src/__tests__/render-error-detail-ssot.test-d.ts +0 -95
- package/src/__tests__/render-error-exhaustive.test-d.ts +8 -1
- package/src/__tests__/render-feature-assembly.test-d.ts +8 -16
- package/src/__tests__/render-feature-context.test-d.ts +16 -40
- package/src/__tests__/render-feature-contract.test-d.ts +9 -18
- package/src/__tests__/render-feature-diagnostics.unit.test.ts +6 -8
- package/src/__tests__/render-feature-docs.unit.test.ts +8 -7
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +14 -75
- package/src/__tests__/render-feature-plan.test-d.ts +161 -0
- package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
- package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +8 -19
- package/src/__tests__/render-feature-prepared-errors.test-d.ts +3 -6
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +10 -71
- package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +11 -61
- package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +20 -43
- package/src/__tests__/render-feature-prepared-graphics.test-d.ts +56 -78
- package/src/__tests__/render-feature-public-surface.test-d.ts +6 -24
- package/src/__tests__/render-feature-retry.unit.test.ts +7 -48
- package/src/__tests__/render-feature-scheduling.unit.test.ts +15 -27
- package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +0 -9
- package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +19 -109
- package/src/__tests__/render-feature-visibility-context.test-d.ts +1 -6
- package/src/__tests__/render-feature-visibility-context.unit.test.ts +1 -2
- package/src/__tests__/render-feature-zero-work.unit.test.ts +14 -20
- package/src/__tests__/render-scene-projection.unit.test.ts +73 -111
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +46 -50
- package/src/__tests__/renderer-lifecycle.integration.test.ts +49 -1
- package/src/__tests__/shader-stage-surface.unit.test.ts +14 -9
- package/src/__tests__/ssao-config.unit.test.ts +36 -0
- package/src/__tests__/ssao-kernel-surface.unit.test.ts +4 -5
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
- package/src/__tests__/standard-descriptors.test-d.ts +22 -0
- package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
- package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
- package/src/__tests__/surface-configuration.unit.test.ts +1 -2
- package/src/__tests__/texture-usage-surface.unit.test.ts +3 -6
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +40 -206
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +1 -11
- package/src/__tests__/urp-pipeline.unit.test.ts +2 -2
- package/src/__tests__/vertex-color-pipeline.unit.test.ts +10 -2
- package/src/__tests__/vertex-layout-consumer.unit.test.ts +1 -1
- package/src/__tests__/visibility-diagnostics.integration.test.ts +7 -11
- package/src/__tests__/visibility-extract.integration.test.ts +20 -11
- package/src/__tests__/visibility-extract.perf.test.ts +66 -32
- package/src/__tests__/visibility-feature-dedup.integration.test.ts +2 -4
- package/src/__tests__/visibility-hidden-report.unit.test.ts +1 -2
- package/src/__tests__/visibility-instances.integration.test.ts +7 -11
- package/src/__tests__/visibility-multi-world.integration.test.ts +38 -6
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +18 -41
- package/src/__tests__/visibility-public-surface.test-d.ts +10 -9
- package/src/__tests__/visibility-resolver.unit.test.ts +2 -1
- package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
- package/src/__tests__/visibility-snapshot-contract.unit.test.ts +2 -1
- package/src/__tests__/vocabulary.unit.test.ts +1 -1
- package/src/assembly/backend-contract.ts +57 -0
- package/src/{renderer/renderer-factory.ts → assembly/factory.ts} +1709 -2693
- package/src/assembly/host-contract.ts +101 -0
- package/src/{renderer → assembly}/material/assembly.ts +1 -3
- package/src/assembly/material/pipeline-projection.ts +63 -0
- package/src/authoring.ts +14 -22
- package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
- package/src/components/glyph-text.ts +3 -2
- package/src/components/index.ts +7 -9
- package/src/components/instances.ts +4 -5
- package/src/components/light-helpers.ts +1 -1
- package/src/components/mesh-filter.ts +11 -10
- package/src/components/post-process-params.ts +3 -3
- package/src/components/scene-instance.ts +12 -12
- package/src/components/skybox-background.ts +103 -0
- package/src/components/{environment.ts → skylight.ts} +2 -111
- package/src/components/sprite-animation.ts +3 -4
- package/src/components/sprite-instances.ts +2 -2
- package/src/components/sprite-playback-mode.ts +7 -1
- package/src/components/sprite-region-override.ts +2 -3
- package/src/components/tile-layer.ts +8 -2
- package/src/construct-renderer.ts +67 -4
- package/src/debug-draw-glue.ts +8 -129
- package/src/device/device-scope.ts +306 -0
- package/src/{gpu-resource-store.ts → device/gpu-residency.ts} +540 -639
- package/src/device/resource-types.ts +20 -0
- package/src/engine-metrics.ts +12 -19
- package/src/errors/recover.ts +45 -3
- package/src/errors/render.ts +357 -460
- package/src/features/fullscreen.ts +46 -0
- package/src/features/host.ts +575 -309
- package/src/features/morph/morph-feature.ts +195 -105
- package/src/features/plan.ts +447 -0
- package/src/features/prepared-gpu-work.ts +72 -15
- package/src/features/prepared-graphics-store.ts +20 -6
- package/src/features/prepared-graphics.ts +12 -71
- package/src/features/render-graph-compute.ts +14 -5
- package/src/features/render-graph-contribution.ts +43 -63
- package/src/features/render-graph-raster.ts +11 -6
- package/src/features/render-graph-resources.ts +25 -23
- package/src/features/targets.ts +8 -21
- package/src/features/types.ts +39 -227
- package/src/features/vocabulary.ts +24 -0
- package/src/fullscreen-post-process-pass.ts +14 -57
- package/src/glyph-text-layout-system.ts +70 -96
- package/src/gpu-driven/batch-topology.ts +24 -202
- package/src/gpu-driven/production-raster.ts +93 -1108
- package/src/gpu-driven/view-gpu.ts +46 -192
- package/src/gpu-resource.ts +4 -4
- package/src/gpu-scene-schema.ts +11 -99
- package/src/gpu-scene.ts +231 -364
- package/src/hdrp-buffers.ts +12 -221
- package/src/ibl/IblPipelineCache.ts +471 -711
- package/src/ibl/skylight-bind-group.ts +4 -4
- package/src/index.ts +58 -217
- package/src/inspection-types.ts +76 -0
- package/src/instance-buffer-cache.ts +1 -29
- package/src/internal.ts +6 -85
- package/src/lifecycle.ts +64 -19
- package/src/materials.ts +7 -29
- package/src/mesh-material-bindings.ts +0 -1
- package/src/pbr-pipeline.ts +434 -53
- package/src/{urp-pipeline.ts → pipeline/standard-forward-lane.ts} +38 -149
- package/src/{hdrp-pipeline.ts → pipeline/standard-pipeline.ts} +221 -191
- package/src/pipeline/standard-profile.ts +65 -0
- package/src/pipeline-builder.ts +60 -64
- package/src/pipeline-spec-types.ts +28 -0
- package/src/pipeline-spec.ts +72 -609
- package/src/plugin.ts +3 -75
- package/src/post-process-errors.ts +31 -33
- package/src/prepare/prepared-graphics-resolver.ts +5 -4
- package/src/record/__tests__/material-slot-plan.unit.test.ts +1 -33
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
- package/src/record/__tests__/video-texture-view.unit.test.ts +1 -1
- package/src/record/frame-lighting.ts +74 -195
- package/src/record/frame-snapshot.ts +45 -60
- package/src/record/frame-targets.ts +8 -243
- package/src/record/frame.ts +509 -796
- package/src/record/helpers.ts +6 -11
- package/src/record/main-pass-geometry.ts +106 -147
- package/src/record/main-pass-material.ts +517 -190
- package/src/record/main-pass-sprite-draws.ts +198 -117
- package/src/record/main-pass.ts +162 -143
- package/src/record/mesh-ssbo.ts +517 -38
- package/src/record/render-context.ts +364 -0
- package/src/record/shadow-pass.ts +138 -1838
- package/src/record/skybox-post-pass.ts +12 -14
- package/src/record/typed-frame-graph.ts +215 -254
- package/src/record/view-ubo.ts +6 -37
- package/src/render-contract.ts +571 -0
- package/src/render-data.ts +3 -3
- package/src/render-graph-primitives.ts +76 -851
- package/src/render-pipeline.ts +104 -188
- package/src/render-system-extract.ts +1048 -1729
- package/src/render-system.ts +330 -1957
- package/src/scene/render-scene-types.ts +64 -0
- package/src/scene/render-scene.ts +1032 -0
- package/src/scene-instances/post-spawn-resolve-joints.ts +4 -7
- package/src/ssao-buffers.ts +167 -8
- package/src/systems/skin-palette-allocator.ts +21 -64
- package/src/systems/skin-palette-types.ts +14 -0
- package/src/systems/transparent-sort-config.ts +25 -3
- package/src/tilemap-chunk-extract-system.ts +53 -70
- package/src/typed-render-graph-primitives.ts +35 -24
- package/src/typed-shadow-passes.ts +26 -56
- package/dist/__tests__/analytic-sky-contract.test.d.ts +0 -2
- package/dist/__tests__/analytic-sky-contract.test.d.ts.map +0 -1
- package/dist/__tests__/analytic-sky-falsify.test.d.ts +0 -2
- package/dist/__tests__/analytic-sky-falsify.test.d.ts.map +0 -1
- package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts +0 -2
- package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts.map +0 -1
- package/dist/__tests__/backend-selection.integration.test.d.ts +0 -2
- package/dist/__tests__/backend-selection.integration.test.d.ts.map +0 -1
- package/dist/__tests__/camera-temporal.test-d.d.ts +0 -2
- package/dist/__tests__/camera-temporal.test-d.d.ts.map +0 -1
- package/dist/__tests__/camera-temporal.test.d.ts +0 -2
- package/dist/__tests__/camera-temporal.test.d.ts.map +0 -1
- package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts +0 -2
- package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts.map +0 -1
- package/dist/__tests__/environment-inspection.test.d.ts +0 -2
- package/dist/__tests__/environment-inspection.test.d.ts.map +0 -1
- package/dist/__tests__/fog-ai-user.fixture.d.ts +0 -2
- package/dist/__tests__/fog-ai-user.fixture.d.ts.map +0 -1
- package/dist/__tests__/fog-custom-render-feature.fixture.d.ts +0 -16
- package/dist/__tests__/fog-custom-render-feature.fixture.d.ts.map +0 -1
- package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-inspection.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-inspection.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-owner-state.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-owner-state.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-public-surface.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-public-surface.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-ray-contract.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-ray-contract.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-source-absence.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-source-absence.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-temporal.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-temporal.integration.test.d.ts.map +0 -1
- package/dist/__tests__/frame-chain.unit.test.d.ts +0 -2
- package/dist/__tests__/frame-chain.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts +0 -2
- package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/hdrp-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/hdrp-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts +0 -2
- package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts +0 -2
- package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts.map +0 -1
- package/dist/__tests__/material-derived-payload.integration.test.d.ts +0 -2
- package/dist/__tests__/material-derived-payload.integration.test.d.ts.map +0 -1
- package/dist/__tests__/materials.unit.test.d.ts +0 -2
- package/dist/__tests__/materials.unit.test.d.ts.map +0 -1
- package/dist/__tests__/param-schema-projection-census.unit.test.d.ts +0 -2
- package/dist/__tests__/param-schema-projection-census.unit.test.d.ts.map +0 -1
- package/dist/__tests__/persistent-render-scene.unit.test.d.ts +0 -2
- package/dist/__tests__/persistent-render-scene.unit.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-pass-trace.test.d.ts +0 -2
- package/dist/__tests__/pipeline-pass-trace.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-stage-owner.test-d.d.ts +0 -2
- package/dist/__tests__/pipeline-stage-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/plugin.test.d.ts +0 -2
- package/dist/__tests__/plugin.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts.map +0 -1
- package/dist/__tests__/public-pipeline-id.test-d.d.ts +0 -2
- package/dist/__tests__/public-pipeline-id.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-dispatch-membership.unit.test.d.ts +0 -2
- package/dist/__tests__/render-dispatch-membership.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-construction.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-construction.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-graph.integration.test.d.ts +0 -2
- package/dist/__tests__/render-feature-graph.integration.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-order.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-order.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-staging.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-staging.unit.test.d.ts.map +0 -1
- package/dist/__tests__/renderer-render-scene-public.test-d.d.ts +0 -2
- package/dist/__tests__/renderer-render-scene-public.test-d.d.ts.map +0 -1
- package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts +0 -2
- package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts.map +0 -1
- package/dist/__tests__/sun-snapshot-consumers.test.d.ts +0 -2
- package/dist/__tests__/sun-snapshot-consumers.test.d.ts.map +0 -1
- package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts +0 -2
- package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/taa-history-store.unit.test.d.ts +0 -2
- package/dist/__tests__/taa-history-store.unit.test.d.ts.map +0 -1
- package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts +0 -2
- package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts.map +0 -1
- package/dist/__tests__/temporal-inspection.unit.test.d.ts +0 -2
- package/dist/__tests__/temporal-inspection.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/asset-decoders.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/asset-decoders.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/render-asset-port.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/render-asset-port.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts.map +0 -1
- package/dist/chunk-33UF5SAO.mjs +0 -7397
- package/dist/chunk-33UF5SAO.mjs.map +0 -1
- package/dist/chunk-A5QCJSNL.mjs +0 -29913
- package/dist/chunk-A5QCJSNL.mjs.map +0 -1
- package/dist/chunk-JMSB7AR4.mjs +0 -3
- package/dist/chunk-JMSB7AR4.mjs.map +0 -1
- package/dist/chunk-LXNGO6AO.mjs +0 -569
- package/dist/chunk-LXNGO6AO.mjs.map +0 -1
- package/dist/chunk-QRXPSX4X.mjs +0 -659
- package/dist/chunk-QRXPSX4X.mjs.map +0 -1
- package/dist/chunk-YAKEQPWO.mjs +0 -1439
- package/dist/chunk-YAKEQPWO.mjs.map +0 -1
- package/dist/components/__tests__/atmosphere-red.test.d.ts +0 -2
- package/dist/components/__tests__/atmosphere-red.test.d.ts.map +0 -1
- package/dist/components/__tests__/atmosphere.test.d.ts +0 -2
- package/dist/components/__tests__/atmosphere.test.d.ts.map +0 -1
- package/dist/components/__tests__/fog.test-d.d.ts +0 -2
- package/dist/components/__tests__/fog.test-d.d.ts.map +0 -1
- package/dist/components/__tests__/fog.test.d.ts +0 -2
- package/dist/components/__tests__/fog.test.d.ts.map +0 -1
- package/dist/components/atmosphere.d.ts +0 -18
- package/dist/components/atmosphere.d.ts.map +0 -1
- package/dist/components/environment.d.ts +0 -116
- package/dist/components/environment.d.ts.map +0 -1
- package/dist/deferred-lighting.d.ts +0 -13
- package/dist/deferred-lighting.d.ts.map +0 -1
- package/dist/dynamic-texture-store.d.ts +0 -42
- package/dist/dynamic-texture-store.d.ts.map +0 -1
- package/dist/environment/__tests__/failure-injection.test.d.ts +0 -2
- package/dist/environment/__tests__/failure-injection.test.d.ts.map +0 -1
- package/dist/environment/__tests__/generation-red.test.d.ts +0 -2
- package/dist/environment/__tests__/generation-red.test.d.ts.map +0 -1
- package/dist/environment/__tests__/generation.test.d.ts +0 -2
- package/dist/environment/__tests__/generation.test.d.ts.map +0 -1
- package/dist/environment/__tests__/graph-transaction.test.d.ts +0 -2
- package/dist/environment/__tests__/graph-transaction.test.d.ts.map +0 -1
- package/dist/environment/__tests__/inspection-red.test.d.ts +0 -2
- package/dist/environment/__tests__/inspection-red.test.d.ts.map +0 -1
- package/dist/environment/__tests__/lifecycle-evidence.test.d.ts +0 -2
- package/dist/environment/__tests__/lifecycle-evidence.test.d.ts.map +0 -1
- package/dist/environment/__tests__/pipeline-topology.test.d.ts +0 -2
- package/dist/environment/__tests__/pipeline-topology.test.d.ts.map +0 -1
- package/dist/environment/__tests__/readiness.test.d.ts +0 -2
- package/dist/environment/__tests__/readiness.test.d.ts.map +0 -1
- package/dist/environment/__tests__/recovery.test.d.ts +0 -2
- package/dist/environment/__tests__/recovery.test.d.ts.map +0 -1
- package/dist/environment/__tests__/resize-dispose.test.d.ts +0 -2
- package/dist/environment/__tests__/resize-dispose.test.d.ts.map +0 -1
- package/dist/environment/__tests__/signature-red.test.d.ts +0 -2
- package/dist/environment/__tests__/signature-red.test.d.ts.map +0 -1
- package/dist/environment/__tests__/signature.test.d.ts +0 -2
- package/dist/environment/__tests__/signature.test.d.ts.map +0 -1
- package/dist/environment/descriptors.d.ts +0 -2
- package/dist/environment/descriptors.d.ts.map +0 -1
- package/dist/environment/extracted-environment.d.ts +0 -53
- package/dist/environment/extracted-environment.d.ts.map +0 -1
- package/dist/environment/generation.d.ts +0 -62
- package/dist/environment/generation.d.ts.map +0 -1
- package/dist/environment/gpu-bundle.d.ts +0 -23
- package/dist/environment/gpu-bundle.d.ts.map +0 -1
- package/dist/environment/graph.d.ts +0 -108
- package/dist/environment/graph.d.ts.map +0 -1
- package/dist/environment/inspection.d.ts +0 -48
- package/dist/environment/inspection.d.ts.map +0 -1
- package/dist/environment/lifecycle.d.ts +0 -22
- package/dist/environment/lifecycle.d.ts.map +0 -1
- package/dist/environment/readiness.d.ts +0 -29
- package/dist/environment/readiness.d.ts.map +0 -1
- package/dist/environment/signature.d.ts +0 -70
- package/dist/environment/signature.d.ts.map +0 -1
- package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts +0 -2
- package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts.map +0 -1
- package/dist/extract/__tests__/environment-source.test.d.ts +0 -2
- package/dist/extract/__tests__/environment-source.test.d.ts.map +0 -1
- package/dist/extract/__tests__/schema-readers.unit.test.d.ts +0 -2
- package/dist/extract/__tests__/schema-readers.unit.test.d.ts.map +0 -1
- package/dist/extract/directional-csm.d.ts +0 -129
- package/dist/extract/directional-csm.d.ts.map +0 -1
- package/dist/extract/index.d.ts +0 -5
- package/dist/extract/index.d.ts.map +0 -1
- package/dist/extract/material-interface.d.ts +0 -56
- package/dist/extract/material-interface.d.ts.map +0 -1
- package/dist/extract/schema-readers.d.ts +0 -20
- package/dist/extract/schema-readers.d.ts.map +0 -1
- package/dist/features/graph-contribution.d.ts +0 -64
- package/dist/features/graph-contribution.d.ts.map +0 -1
- package/dist/features/index.d.ts +0 -21
- package/dist/features/index.d.ts.map +0 -1
- package/dist/features/morph/index.d.ts +0 -3
- package/dist/features/morph/index.d.ts.map +0 -1
- package/dist/features/morph/morph-bounds.d.ts +0 -42
- package/dist/features/morph/morph-bounds.d.ts.map +0 -1
- package/dist/features/scene-temporal.d.ts +0 -45
- package/dist/features/scene-temporal.d.ts.map +0 -1
- package/dist/features/taa-resolve.d.ts +0 -21
- package/dist/features/taa-resolve.d.ts.map +0 -1
- package/dist/frame-chain.d.ts +0 -14
- package/dist/frame-chain.d.ts.map +0 -1
- package/dist/gpu-driven/view-reference.d.ts.map +0 -1
- package/dist/gpu-resource-store.d.ts.map +0 -1
- package/dist/hdrp-cluster-membership.d.ts +0 -2
- package/dist/hdrp-cluster-membership.d.ts.map +0 -1
- package/dist/hdrp-pipeline.d.ts +0 -36
- package/dist/hdrp-pipeline.d.ts.map +0 -1
- package/dist/ibl/cubemap-projection.d.ts +0 -23
- package/dist/ibl/cubemap-projection.d.ts.map +0 -1
- package/dist/ibl/face-uniforms.d.ts +0 -65
- package/dist/ibl/face-uniforms.d.ts.map +0 -1
- package/dist/mesh-update-errors.d.ts +0 -71
- package/dist/mesh-update-errors.d.ts.map +0 -1
- package/dist/mipmap-generator.d.ts +0 -39
- package/dist/mipmap-generator.d.ts.map +0 -1
- package/dist/param-schema-projection-census.d.ts +0 -18
- package/dist/param-schema-projection-census.d.ts.map +0 -1
- package/dist/persistent-render-scene.d.ts +0 -158
- package/dist/persistent-render-scene.d.ts.map +0 -1
- package/dist/pipeline/index.d.ts +0 -11
- package/dist/pipeline/index.d.ts.map +0 -1
- package/dist/pipeline-errors.d.ts +0 -110
- package/dist/pipeline-errors.d.ts.map +0 -1
- package/dist/prepare/__tests__/schema-readers.unit.test.d.ts +0 -2
- package/dist/prepare/__tests__/schema-readers.unit.test.d.ts.map +0 -1
- package/dist/prepare/index.d.ts +0 -4
- package/dist/prepare/index.d.ts.map +0 -1
- package/dist/prepare/schema-readers.d.ts +0 -11
- package/dist/prepare/schema-readers.d.ts.map +0 -1
- package/dist/record/__tests__/environment-record.test.d.ts +0 -2
- package/dist/record/__tests__/environment-record.test.d.ts.map +0 -1
- package/dist/record/__tests__/frame-targets.unit.test.d.ts +0 -2
- package/dist/record/__tests__/frame-targets.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/membership-timing.unit.test.d.ts +0 -2
- package/dist/record/__tests__/membership-timing.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/render-submission.integration.test.d.ts +0 -2
- package/dist/record/__tests__/render-submission.integration.test.d.ts.map +0 -1
- package/dist/record/__tests__/render-submission.perf.test.d.ts +0 -2
- package/dist/record/__tests__/render-submission.perf.test.d.ts.map +0 -1
- package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts +0 -2
- package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts +0 -2
- package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts.map +0 -1
- package/dist/record/frame-observation.d.ts +0 -38
- package/dist/record/frame-observation.d.ts.map +0 -1
- package/dist/record/index.d.ts +0 -15
- package/dist/record/index.d.ts.map +0 -1
- package/dist/record/main-pass-skin.d.ts +0 -46
- package/dist/record/main-pass-skin.d.ts.map +0 -1
- package/dist/record/main-pass-sprite.d.ts +0 -69
- package/dist/record/main-pass-sprite.d.ts.map +0 -1
- package/dist/record/material-payload.d.ts +0 -43
- package/dist/record/material-payload.d.ts.map +0 -1
- package/dist/record/material-slot-plan.d.ts +0 -26
- package/dist/record/material-slot-plan.d.ts.map +0 -1
- package/dist/record/membership-timing.d.ts +0 -232
- package/dist/record/membership-timing.d.ts.map +0 -1
- package/dist/record/shadow-caster-uniform.d.ts +0 -8
- package/dist/record/shadow-caster-uniform.d.ts.map +0 -1
- package/dist/record/shadow-submit-mode.d.ts +0 -66
- package/dist/record/shadow-submit-mode.d.ts.map +0 -1
- package/dist/render-dispatch-membership.d.ts +0 -47
- package/dist/render-dispatch-membership.d.ts.map +0 -1
- package/dist/render-pipeline-context.d.ts +0 -289
- package/dist/render-pipeline-context.d.ts.map +0 -1
- package/dist/render-pipeline-target.d.ts +0 -16
- package/dist/render-pipeline-target.d.ts.map +0 -1
- package/dist/render-scene-projection.d.ts +0 -174
- package/dist/render-scene-projection.d.ts.map +0 -1
- package/dist/render-system-fold.d.ts +0 -266
- package/dist/render-system-fold.d.ts.map +0 -1
- package/dist/renderer/asset-service.d.ts +0 -10
- package/dist/renderer/asset-service.d.ts.map +0 -1
- package/dist/renderer/backend-selection.d.ts.map +0 -1
- package/dist/renderer/environment-classify.d.ts +0 -6
- package/dist/renderer/environment-classify.d.ts.map +0 -1
- package/dist/renderer/environment-error.d.ts +0 -13
- package/dist/renderer/environment-error.d.ts.map +0 -1
- package/dist/renderer/material/pipeline-projection.d.ts +0 -91
- package/dist/renderer/material/pipeline-projection.d.ts.map +0 -1
- package/dist/renderer/renderer-factory.d.ts +0 -283
- package/dist/renderer/renderer-factory.d.ts.map +0 -1
- package/dist/renderer.d.ts +0 -771
- package/dist/renderer.d.ts.map +0 -1
- package/dist/scene-utils/collect-subtree.d.ts +0 -11
- package/dist/scene-utils/collect-subtree.d.ts.map +0 -1
- package/dist/ssao-data.d.ts +0 -34
- package/dist/ssao-data.d.ts.map +0 -1
- package/dist/surface-format.d.ts +0 -10
- package/dist/surface-format.d.ts.map +0 -1
- package/dist/taa-history-store.d.ts +0 -88
- package/dist/taa-history-store.d.ts.map +0 -1
- package/dist/temporal-coverage.d.ts +0 -35
- package/dist/temporal-coverage.d.ts.map +0 -1
- package/dist/temporal-frame-transaction.d.ts +0 -92
- package/dist/temporal-frame-transaction.d.ts.map +0 -1
- package/dist/temporal-inspection.d.ts +0 -57
- package/dist/temporal-inspection.d.ts.map +0 -1
- package/dist/temporal-view.d.ts +0 -43
- package/dist/temporal-view.d.ts.map +0 -1
- package/dist/tilemap/resolve-tileset-runtime.d.ts +0 -23
- package/dist/tilemap/resolve-tileset-runtime.d.ts.map +0 -1
- package/dist/urp-pipeline.d.ts +0 -4
- package/dist/urp-pipeline.d.ts.map +0 -1
- package/src/__tests__/analytic-sky-contract.test.ts +0 -27
- package/src/__tests__/analytic-sky-falsify-carriers.mjs +0 -43
- package/src/__tests__/analytic-sky-falsify.test.ts +0 -94
- package/src/__tests__/assets-runtime-handoff.integration.test.ts +0 -36
- package/src/__tests__/backend-selection.integration.test.ts +0 -11
- package/src/__tests__/camera-temporal.test-d.ts +0 -8
- package/src/__tests__/camera-temporal.test.ts +0 -188
- package/src/__tests__/directional-shadow-probe-atlas-layout.unit.test.ts +0 -18
- package/src/__tests__/environment-inspection.test.ts +0 -45
- package/src/__tests__/fog-ai-user.fixture.ts +0 -350
- package/src/__tests__/fog-custom-render-feature.fixture.ts +0 -33
- package/src/__tests__/fog-custom-render-feature.integration.test.ts +0 -76
- package/src/__tests__/fog-inspection.integration.test.ts +0 -127
- package/src/__tests__/fog-owner-state.integration.test.ts +0 -112
- package/src/__tests__/fog-pipeline-topology.integration.test.ts +0 -93
- package/src/__tests__/fog-public-surface.integration.test.ts +0 -60
- package/src/__tests__/fog-ray-contract.integration.test.ts +0 -73
- package/src/__tests__/fog-source-absence.integration.test.ts +0 -51
- package/src/__tests__/fog-temporal.integration.test.ts +0 -115
- package/src/__tests__/frame-chain.unit.test.ts +0 -26
- package/src/__tests__/gpu-scene-field-type-owner.test-d.ts +0 -27
- package/src/__tests__/hdrp-pipeline.unit.test.ts +0 -100
- package/src/__tests__/ibl/ibl-fallback.unit.test.ts +0 -23
- package/src/__tests__/material-derived-error-stop-draw.integration.test.ts +0 -69
- package/src/__tests__/material-derived-payload.integration.test.ts +0 -164
- package/src/__tests__/materials.unit.test.ts +0 -25
- package/src/__tests__/param-schema-projection-census.unit.test.ts +0 -40
- package/src/__tests__/persistent-render-scene.unit.test.ts +0 -1311
- package/src/__tests__/pipeline-error-policy-owner.unit.test.ts +0 -167
- package/src/__tests__/pipeline-pass-trace.test.ts +0 -92
- package/src/__tests__/pipeline-stage-owner.test-d.ts +0 -13
- package/src/__tests__/plugin.test.ts +0 -25
- package/src/__tests__/prepared-graphics-backend-matrix.unit.test.ts +0 -129
- package/src/__tests__/prepared-graphics-resolver-recording.unit.test.ts +0 -180
- package/src/__tests__/public-pipeline-id.test-d.ts +0 -6
- package/src/__tests__/render-dispatch-membership.unit.test.ts +0 -117
- package/src/__tests__/render-feature-construction.unit.test.ts +0 -124
- package/src/__tests__/render-feature-error-code-owner.test-d.ts +0 -27
- package/src/__tests__/render-feature-gpu-buffer-usage-owner.test-d.ts +0 -46
- package/src/__tests__/render-feature-graph.integration.test.ts +0 -205
- package/src/__tests__/render-feature-graphics-staging.unit.test.ts +0 -200
- package/src/__tests__/render-feature-order.unit.test.ts +0 -66
- package/src/__tests__/render-feature-prepared-graphics-recording.unit.test.ts +0 -107
- package/src/__tests__/render-feature-staging.unit.test.ts +0 -94
- package/src/__tests__/renderer-render-scene-public.test-d.ts +0 -27
- package/src/__tests__/scene-temporal-coverage.unit.test.ts +0 -259
- package/src/__tests__/sun-snapshot-consumers.test.ts +0 -35
- package/src/__tests__/surface-backend-kind-owner.test-d.ts +0 -42
- package/src/__tests__/taa-history-store.unit.test.ts +0 -196
- package/src/__tests__/temporal-frame-transaction.integration.test.ts +0 -537
- package/src/__tests__/temporal-inspection.unit.test.ts +0 -138
- package/src/assets/__tests__/asset-decoders.unit.test.ts +0 -92
- package/src/assets/__tests__/mipmap-generator.unit.test.ts +0 -52
- package/src/assets/__tests__/render-asset-port.unit.test.ts +0 -54
- package/src/assets/__tests__/resolve-render-asset.unit.test.ts +0 -47
- package/src/components/__tests__/atmosphere-red.test.ts +0 -51
- package/src/components/__tests__/atmosphere.test.ts +0 -79
- package/src/components/__tests__/fog.test-d.ts +0 -49
- package/src/components/__tests__/fog.test.ts +0 -60
- package/src/components/atmosphere.ts +0 -64
- package/src/deferred-lighting.ts +0 -92
- package/src/dynamic-texture-store.ts +0 -111
- package/src/environment/README.md +0 -76
- package/src/environment/__tests__/failure-injection.test.ts +0 -50
- package/src/environment/__tests__/generation-red.test.ts +0 -64
- package/src/environment/__tests__/generation.test.ts +0 -37
- package/src/environment/__tests__/graph-transaction.test.ts +0 -85
- package/src/environment/__tests__/inspection-red.test.ts +0 -53
- package/src/environment/__tests__/lifecycle-evidence.test.ts +0 -40
- package/src/environment/__tests__/pipeline-topology.test.ts +0 -33
- package/src/environment/__tests__/readiness.test.ts +0 -42
- package/src/environment/__tests__/recovery.test.ts +0 -62
- package/src/environment/__tests__/resize-dispose.test.ts +0 -30
- package/src/environment/__tests__/signature-red.test.ts +0 -45
- package/src/environment/__tests__/signature.test.ts +0 -60
- package/src/environment/descriptors.ts +0 -7
- package/src/environment/extracted-environment.ts +0 -239
- package/src/environment/generation.ts +0 -158
- package/src/environment/gpu-bundle.ts +0 -144
- package/src/environment/graph.ts +0 -588
- package/src/environment/inspection.ts +0 -107
- package/src/environment/lifecycle.ts +0 -124
- package/src/environment/readiness.ts +0 -76
- package/src/environment/signature.ts +0 -185
- package/src/extract/__tests__/directional-csm-domain.unit.test.ts +0 -391
- package/src/extract/__tests__/environment-source.test.ts +0 -105
- package/src/extract/__tests__/schema-readers.unit.test.ts +0 -16
- package/src/extract/directional-csm.ts +0 -959
- package/src/extract/index.ts +0 -10
- package/src/extract/material-interface.ts +0 -604
- package/src/extract/schema-readers.ts +0 -27
- package/src/features/graph-contribution.ts +0 -577
- package/src/features/index.ts +0 -100
- package/src/features/morph/index.ts +0 -24
- package/src/features/morph/morph-bounds.ts +0 -123
- package/src/features/scene-temporal.ts +0 -274
- package/src/features/taa-resolve.ts +0 -244
- package/src/frame-chain.ts +0 -21
- package/src/hdrp-cluster-membership.ts +0 -70
- package/src/ibl/cubemap-projection.ts +0 -60
- package/src/ibl/face-uniforms.ts +0 -150
- package/src/mesh-update-errors.ts +0 -113
- package/src/mipmap-generator.ts +0 -244
- package/src/param-schema-projection-census.ts +0 -73
- package/src/persistent-render-scene.ts +0 -1752
- package/src/pipeline/index.ts +0 -40
- package/src/pipeline-errors.ts +0 -172
- package/src/prepare/__tests__/schema-readers.unit.test.ts +0 -16
- package/src/prepare/index.ts +0 -8
- package/src/prepare/schema-readers.ts +0 -20
- package/src/record/__tests__/environment-record.test.ts +0 -35
- package/src/record/__tests__/frame-targets.unit.test.ts +0 -54
- package/src/record/__tests__/membership-timing.unit.test.ts +0 -524
- package/src/record/__tests__/render-submission.integration.test.ts +0 -76
- package/src/record/__tests__/render-submission.perf.test.ts +0 -141
- package/src/record/__tests__/shadow-submit-mode.unit.test.ts +0 -88
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +0 -101
- package/src/record/frame-observation.ts +0 -122
- package/src/record/index.ts +0 -15
- package/src/record/main-pass-skin.ts +0 -51
- package/src/record/main-pass-sprite.ts +0 -166
- package/src/record/material-payload.ts +0 -292
- package/src/record/material-slot-plan.ts +0 -68
- package/src/record/membership-timing.ts +0 -1012
- package/src/record/shadow-caster-uniform.ts +0 -37
- package/src/record/shadow-submit-mode.ts +0 -277
- package/src/render-dispatch-membership.ts +0 -155
- package/src/render-pipeline-context.ts +0 -332
- package/src/render-pipeline-target.ts +0 -96
- package/src/render-scene-projection.ts +0 -1738
- package/src/render-system-fold.ts +0 -531
- package/src/renderer/asset-service.ts +0 -32
- package/src/renderer/backend-selection.ts +0 -121
- package/src/renderer/environment-classify.ts +0 -30
- package/src/renderer/environment-error.ts +0 -19
- package/src/renderer/material/pipeline-projection.ts +0 -140
- package/src/renderer.ts +0 -940
- package/src/scene-utils/collect-subtree.ts +0 -40
- package/src/ssao-data.ts +0 -106
- package/src/surface-format.ts +0 -37
- package/src/taa-history-store.ts +0 -429
- package/src/temporal-coverage.ts +0 -106
- package/src/temporal-frame-transaction.ts +0 -301
- package/src/temporal-inspection.ts +0 -194
- package/src/temporal-view.ts +0 -174
- package/src/tilemap/resolve-tileset-runtime.ts +0 -72
|
@@ -1,597 +1,62 @@
|
|
|
1
|
-
// @forgeax/engine-
|
|
2
|
-
// (feat-20260604-resource-owning-render-graph-and-fullscreen-postpr M3 / w19).
|
|
1
|
+
// @forgeax/engine-render - low-level record/encode graph primitives.
|
|
3
2
|
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// (AC-12 / AC-18). The internal recordXxxPass closures that do the actual GPU
|
|
8
|
-
// recording are package-private (no longer exported from
|
|
9
|
-
// `render-system-record.ts`); they are referenced here as the implementation
|
|
10
|
-
// detail of addScenePass / addFullscreenPass etc., satisfying plan-strategy D-5
|
|
11
|
-
// "per-entity logic stays as the addScenePass implementation detail; do NOT
|
|
12
|
-
// migrate it into the render-graph package (that would pollute its RHI-pure
|
|
13
|
-
// boundary)".
|
|
3
|
+
// Standard owns pass topology through typed-render-graph-primitives. This module
|
|
4
|
+
// retains the RHI-facing record helpers used by that typed graph: SSAO record
|
|
5
|
+
// closures, fullscreen dispatch, depth resolution, and encoding.
|
|
14
6
|
//
|
|
15
|
-
//
|
|
16
|
-
// - addColorTarget(name, desc) — allocate a graph-owned RT (M1)
|
|
17
|
-
// - addColorTargetAlias(name, src) — fold a logical key onto an existing RT
|
|
18
|
-
// - addScenePass(g, name, opts) — render the ECS scene into a colour target
|
|
19
|
-
// - addShadowPass(g, name, opts) — render shadow casters into a depth target
|
|
20
|
-
// - addSkyboxPass(g, name, opts) — render the skybox cube into a colour target
|
|
21
|
-
// - addBloomPasses(g, opts) — bloom bright + 2 blur + composite chain
|
|
22
|
-
// - addSsaoPasses(g, opts) — SSAO calc + blur chain (feat-20260612-hdrp-ssao)
|
|
23
|
-
// - addTonemapPass(g, name, opts) — HDR -> LDR tonemap
|
|
24
|
-
// - addFullscreenPass(g, name, opts) — generic fullscreen post-process
|
|
25
|
-
//
|
|
26
|
-
// PIPELINE ROLE: urp-pipeline.buildGraph composes these in the
|
|
27
|
-
// canonical 9-pass order; a custom pipeline picks any subset / order.
|
|
28
|
-
//
|
|
29
|
-
// ─── EXTENSION-POINT MAP (F-5 doc-clarify) ───────────────────────────────
|
|
30
|
-
//
|
|
31
|
-
// Of the eight primitives above, EXACTLY ONE is an AI-user extension point;
|
|
32
|
-
// the other seven are engine-built-ins that DO NOT accept user-supplied
|
|
33
|
-
// execute closures.
|
|
34
|
-
//
|
|
35
|
-
// addScenePass | engine-built-in | execute = recordMainPass (private)
|
|
36
|
-
// addShadowPass | engine-built-in | execute = recordShadowPass (private)
|
|
37
|
-
// addSkyboxPass | engine-built-in | execute = recordSkyboxPass (private)
|
|
38
|
-
// addBloomPasses | engine-built-in | execute = 4× private record* closures
|
|
39
|
-
// addSsaoPasses | engine-built-in | execute = 2× private record* closures
|
|
40
|
-
// addTonemapPass | engine-built-in | execute = dispatchFullscreenPass('forgeax::tonemap')
|
|
41
|
-
// addColorTarget | engine-built-in (resource decl)
|
|
42
|
-
// addColorTargetAlias | engine-built-in (resource decl)
|
|
43
|
-
// addFullscreenPass | EXTENSION POINT (the only one)
|
|
44
|
-
//
|
|
45
|
-
// AI users wanting to add a CUSTOM SCENE pass (a per-entity geometry walk
|
|
46
|
-
// with their own shading model) write `graph.addPass(name, {reads, writes,
|
|
47
|
-
// execute: theirOwnClosure})` directly through the `@forgeax/engine-render-graph`
|
|
48
|
-
// `RenderGraph` API. addScenePass is intentionally NOT a customisation
|
|
49
|
-
// hook — it is the engine's urp main pass, full stop.
|
|
50
|
-
//
|
|
51
|
-
// AI users wanting to add a FULLSCREEN POST-PROCESS pass (e.g. a custom
|
|
52
|
-
// vignette, chromatic aberration, color grading LUT) take the two-step
|
|
53
|
-
// extension idiom:
|
|
54
|
-
//
|
|
55
|
-
// // 1. Register the shader's WGSL source under a unique id (engine
|
|
56
|
-
// // builtins use `forgeax::` prefix; AI users use `<package>::<id>`).
|
|
57
|
-
// // Same-id re-register THROWS (programmer error, fail-fast).
|
|
58
|
-
// renderer.postProcess.register('mypkg::vignette', {
|
|
59
|
-
// source: vignetteWGSL, // composed WGSL fragment stage
|
|
60
|
-
// params: { byteSize: 16, defaultValue: ... }, // optional UBO
|
|
61
|
-
// reads: ['hdrComposited'], // optional graph resource keys
|
|
62
|
-
// });
|
|
63
|
-
//
|
|
64
|
-
// // 2. Reference the registered id from a custom pipeline's buildGraph.
|
|
65
|
-
// // The dispatcher looks the id up via runtime.lookupPostProcess;
|
|
66
|
-
// // a stale id THROWS PostProcessError{code:'post-process-not-found'}
|
|
67
|
-
// // inside the per-frame execute closure (charter P3 fail-fast).
|
|
68
|
-
// addFullscreenPass(graph, 'vignette', {
|
|
69
|
-
// program: { module: 'mypkg::vignette' },
|
|
70
|
-
// color: 'rt', // graph-owned scratch target
|
|
71
|
-
// reads: ['hdrComposited'],
|
|
72
|
-
// });
|
|
73
|
-
//
|
|
74
|
-
// The `'fxaa'` id is the engine-built-in special case: dispatcher delegates
|
|
75
|
-
// to `recordFxaaPass`, which samples graph-owned LDR and writes the surface.
|
|
76
|
-
// `addFullscreenPass(g, 'fxaa', ...)` is the
|
|
77
|
-
// canonical engine call site (used by urp-pipeline.buildGraph),
|
|
78
|
-
// not an AI user customisation lever.
|
|
79
|
-
|
|
7
|
+
// Public graph assembly does not depend on legacy add* wrappers.
|
|
80
8
|
import { mat4 } from '@forgeax/engine-math';
|
|
81
|
-
import type {
|
|
82
|
-
import {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
9
|
+
import type { ResolveContext } from '@forgeax/engine-render-graph';
|
|
10
|
+
import type {
|
|
11
|
+
Buffer,
|
|
12
|
+
RhiRenderPassEncoder,
|
|
13
|
+
Sampler,
|
|
14
|
+
Texture,
|
|
15
|
+
TextureFormat,
|
|
16
|
+
TextureView,
|
|
88
17
|
} from '@forgeax/engine-rhi';
|
|
89
|
-
import type { PassSelector } from '@forgeax/engine-types';
|
|
90
18
|
import {
|
|
91
19
|
buildFullscreenPostProcessPass,
|
|
92
20
|
createFullscreenBindGroup,
|
|
93
21
|
entryHasDepthRead,
|
|
94
22
|
} from './fullscreen-post-process-pass';
|
|
95
|
-
import { getOrCreateSsaoFallbackTexture } from './hdrp-buffers';
|
|
96
23
|
import { buildBeginRenderPassDescriptor } from './pipeline-spec';
|
|
97
24
|
import { PostProcessError } from './post-process-errors';
|
|
98
|
-
import {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
* Selects which passes of a material asset are rendered by addScenePass / addShadowPass.
|
|
126
|
-
*
|
|
127
|
-
* An empty selector `{}` matches every pass. The selector is pipeline-specific:
|
|
128
|
-
* the built-in URP uses `{ LightMode: ['Forward'] }` / `{ LightMode: ['ShadowCaster'] }`;
|
|
129
|
-
* a custom pipeline can define its own tag keys and values.
|
|
130
|
-
*
|
|
131
|
-
* Matching rule: every key in the selector must exist in the pass's `tags` and the
|
|
132
|
-
* pass's tag value must be in the selector's value list.
|
|
133
|
-
*/
|
|
134
|
-
|
|
135
|
-
export interface AddScenePassOptions {
|
|
136
|
-
/** Graph colour target to write (declared via g.addColorTarget). */
|
|
137
|
-
readonly color: string;
|
|
138
|
-
/** Graph depth target to write (declared via g.addColorTarget). */
|
|
139
|
-
readonly depth: string;
|
|
140
|
-
/**
|
|
141
|
-
* Optional single-sample resolve target for a multisample colour target.
|
|
142
|
-
* When `_routeFromOpts` is true and the active camera has MSAA enabled,
|
|
143
|
-
* `recordMainPass` resolves `color` into this graph-owned target before a
|
|
144
|
-
* downstream fullscreen pass samples it. Pass `null` to explicitly disable
|
|
145
|
-
* the default resolve in a custom-pipeline falsifier; omit it for
|
|
146
|
-
* single-sample scenes or to preserve the URP-owned resolve.
|
|
147
|
-
*/
|
|
148
|
-
readonly resolve?: string | null | undefined;
|
|
149
|
-
/** Resource keys this pass samples (typically 'shadowDepth' + an upstream colour). */
|
|
150
|
-
readonly reads?: readonly string[] | undefined;
|
|
151
|
-
/**
|
|
152
|
-
* Pass selector — a pipeline-specific filter for which material passes are
|
|
153
|
-
* rendered. An empty selector `{}` matches every pass. The built-in URP uses
|
|
154
|
-
* `{ LightMode: ['Forward'] }`; a custom pipeline defines its own tag keys.
|
|
155
|
-
*/
|
|
156
|
-
readonly selector: PassSelector;
|
|
157
|
-
/**
|
|
158
|
-
* @internal — feat-20260609 framebuffers demo M5 / T-12-a opt-in flag.
|
|
159
|
-
*
|
|
160
|
-
* When `true`, the pass execute closure resolves `opts.color` / `opts.depth`
|
|
161
|
-
* through the graph's resolveCtx and overrides the recordMainPass ctx so
|
|
162
|
-
* the geometry pass renders into those graph-owned views. When `false` (or
|
|
163
|
-
* unset, the default), recordMainPass picks the per-frame
|
|
164
|
-
* `geometryColorView` / `geometryDepthView` set by recordFrame's URP
|
|
165
|
-
* state-machine — this preserves byte-equivalence for urp-pipeline,
|
|
166
|
-
* which encodes its own MSAA / LDR-no-MSAA / HDR routing in recordFrame
|
|
167
|
-
* (where opts.color is a logical ordering token, not the physical write
|
|
168
|
-
* target).
|
|
169
|
-
*
|
|
170
|
-
* AI-user-defined custom pipelines declaring their own offscreen RT (the
|
|
171
|
-
* AC-11 "render scene to graph-owned colour + depth" contract) MUST set
|
|
172
|
-
* this flag to opt out of the URP state-machine and route opts.color
|
|
173
|
-
* directly. A future feat that migrates urp-pipeline off the recordFrame
|
|
174
|
-
* state-machine flips the default and removes this flag.
|
|
175
|
-
*/
|
|
176
|
-
readonly _routeFromOpts?: boolean | undefined;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* AC-11: render the ECS scene into a graph-owned colour + depth target.
|
|
181
|
-
*
|
|
182
|
-
* Adds a graph pass that, when executed, walks the per-frame validated
|
|
183
|
-
* renderable list and dispatches geometry into `opts.color` (with `opts.depth`
|
|
184
|
-
* as the depth attachment). The implementation detail (4-BGL chain, per-entity
|
|
185
|
-
* material UBO packing, pipeline cache lookup, MSAA variant selection) is
|
|
186
|
-
* package-private (`recordMainPass`); plan-strategy D-5 keeps it inside runtime
|
|
187
|
-
* so the render-graph package stays RHI-pure.
|
|
188
|
-
*
|
|
189
|
-
* The `reads` array threads dependency edges into the graph (so shadow ->
|
|
190
|
-
* skybox -> main is expressed in declaration order). The two writes are `opts.color`
|
|
191
|
-
* and `opts.depth`.
|
|
192
|
-
*/
|
|
193
|
-
export function addScenePass(
|
|
194
|
-
graph: RenderGraph<RenderPipelineContext>,
|
|
195
|
-
name: string,
|
|
196
|
-
opts: AddScenePassOptions,
|
|
197
|
-
): void {
|
|
198
|
-
graph.addPass(name, {
|
|
199
|
-
reads: opts.reads ?? [],
|
|
200
|
-
writes: [
|
|
201
|
-
opts.color,
|
|
202
|
-
opts.depth,
|
|
203
|
-
...(opts.resolve === undefined || opts.resolve === null ? [] : [opts.resolve]),
|
|
204
|
-
],
|
|
205
|
-
// feat-20260609 framebuffers demo M5 / T-12-a: route opts.color/opts.depth
|
|
206
|
-
// through the resolveCtx and override the geometry view fields on the ctx
|
|
207
|
-
// handed to recordMainPass when the caller is a non-URP custom pipeline.
|
|
208
|
-
// Without this routing, recordMainPass picks `c.geometryColorView` whose
|
|
209
|
-
// default (set by recordFrame) is the swap-chain `view`, only re-routed
|
|
210
|
-
// onto graph-owned targets via the URP state-machine
|
|
211
|
-
// (tonemapActive -> 'hdrColor' / msaaActive -> 'msaaColor' / etc.).
|
|
212
|
-
//
|
|
213
|
-
// URP byte-equivalence: urp-pipeline passes opts.color values that are
|
|
214
|
-
// logical ordering tokens whose actual physical view is selected per
|
|
215
|
-
// frame by recordFrame's state-machine (e.g. opts.color='hdrColor' but
|
|
216
|
-
// recordFrame may select hdrColorMsaa, msaaColor, or the swap-chain
|
|
217
|
-
// depending on tonemap+MSAA flags). Overriding from opts.color would
|
|
218
|
-
// drop those MSAA-specific / LDR-swap-chain RT picks. The discriminator
|
|
219
|
-
// is: URP keeps its state-machine because urp-pipeline does NOT pass
|
|
220
|
-
// `_routeFromOpts: true`; a non-URP custom pipeline declaring its own
|
|
221
|
-
// graph-owned RT opts in via the internal flag below.
|
|
222
|
-
//
|
|
223
|
-
// feat-20260609 selector: opts.selector is forwarded to recordMainPass for
|
|
224
|
-
// pass-tag filtering (e.g. URP's `{ LightMode: ['Forward'] }`).
|
|
225
|
-
execute: (ctx: RenderPipelineContext, resolveCtx?: ResolveContext) => {
|
|
226
|
-
const internalCtx = ctx as _InternalRenderPipelineContext;
|
|
227
|
-
if (!opts._routeFromOpts) {
|
|
228
|
-
recordMainPass(internalCtx, opts.selector);
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
const colorView = resolveCtx?.resolve(opts.color) as TextureView | undefined;
|
|
232
|
-
const depthView = resolveCtx?.resolve(opts.depth) as TextureView | undefined;
|
|
233
|
-
const resolveView =
|
|
234
|
-
opts.resolve === undefined
|
|
235
|
-
? undefined
|
|
236
|
-
: opts.resolve === null
|
|
237
|
-
? null
|
|
238
|
-
: (resolveCtx?.resolve(opts.resolve) as TextureView | undefined);
|
|
239
|
-
const overridden: _InternalRenderPipelineContext = {
|
|
240
|
-
...internalCtx,
|
|
241
|
-
geometryColorView: colorView ?? internalCtx.geometryColorView,
|
|
242
|
-
geometryDepthView: depthView ?? internalCtx.geometryDepthView,
|
|
243
|
-
...(resolveView !== undefined ? { geometryColorResolveView: resolveView } : {}),
|
|
244
|
-
};
|
|
245
|
-
recordMainPass(overridden, opts.selector);
|
|
246
|
-
},
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
export interface AddShadowPassOptions {
|
|
251
|
-
/** Graph depth target to write (declared via g.addColorTarget with depth format). */
|
|
252
|
-
readonly depth: string;
|
|
253
|
-
/**
|
|
254
|
-
* Pass selector — a pipeline-specific filter for which material passes are
|
|
255
|
-
* rendered as shadow casters. The built-in URP uses
|
|
256
|
-
* `{ LightMode: ['ShadowCaster'] }`.
|
|
257
|
-
*/
|
|
258
|
-
readonly selector: PassSelector;
|
|
259
|
-
/**
|
|
260
|
-
* Optional viewport for the shadow render pass. When set, the pass calls
|
|
261
|
-
* `setViewport(x, y, w, h, 0, 1)` before dispatch so the depth rasterization
|
|
262
|
-
* is clipped to the given sub-rectangle of the depth target. Undefined
|
|
263
|
-
* preserves the pre-CSM behavior (full-RT viewport). Used by the cascaded
|
|
264
|
-
* shadow map atlas: each cascade pass writes to one tile.
|
|
265
|
-
*
|
|
266
|
-
* @example viewport: { x: 0, y: 0, w: 2048, h: 2048 }
|
|
267
|
-
*/
|
|
268
|
-
readonly viewport?:
|
|
269
|
-
| { readonly x: number; readonly y: number; readonly w: number; readonly h: number }
|
|
270
|
-
| undefined;
|
|
271
|
-
/**
|
|
272
|
-
* Cascade index this pass renders into (0..3). The runtime writes the
|
|
273
|
-
* value to `shadowCasterCascadeBuffer` immediately before submit; the
|
|
274
|
-
* shadow_caster vertex shader reads it to pick the matching
|
|
275
|
-
* `view.lightViewProj_X`. Defaults to 0 when unset (preserves the
|
|
276
|
-
* single-cascade pre-CSM behaviour for any caller still calling
|
|
277
|
-
* addShadowPass without the field; the URP per-cascade loop sets it
|
|
278
|
-
* explicitly).
|
|
279
|
-
*
|
|
280
|
-
* @example cascadeIndex: 0 // first cascade (lightViewProj_A)
|
|
281
|
-
*/
|
|
282
|
-
readonly cascadeIndex?: number;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Render shadow casters into a depth-only graph target. Implementation detail:
|
|
287
|
-
* `recordShadowPass` (package-private) iterates DirectionalLight + caster
|
|
288
|
-
* renderables under their light-view + light-proj and writes the depth-32-float
|
|
289
|
-
* target consumed by `addScenePass.reads`.
|
|
290
|
-
*/
|
|
291
|
-
export function addShadowPass(
|
|
292
|
-
graph: RenderGraph<RenderPipelineContext>,
|
|
293
|
-
name: string,
|
|
294
|
-
opts: AddShadowPassOptions,
|
|
295
|
-
): void {
|
|
296
|
-
const cascadeIndex = opts.cascadeIndex ?? 0;
|
|
297
|
-
graph.addPass(name, {
|
|
298
|
-
reads: [],
|
|
299
|
-
writes: [opts.depth],
|
|
300
|
-
execute: (c: RenderPipelineContext) =>
|
|
301
|
-
recordShadowPass(
|
|
302
|
-
c as Parameters<typeof recordShadowPass>[0],
|
|
303
|
-
opts.selector,
|
|
304
|
-
opts.viewport,
|
|
305
|
-
cascadeIndex,
|
|
306
|
-
),
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
/**
|
|
311
|
-
* feat-20260612-point-light-shadows-urp-hdrp M3 / T-M3-4 (plan-strategy §D-1
|
|
312
|
-
* + AC-04 + AC-09). Render the 6 x N point-light shadow caster passes into
|
|
313
|
-
* the cube_array atlas owned by `frameState.pointShadowAtlas`. Implementation
|
|
314
|
-
* detail: `recordPointShadowPass` (package-private) iterates
|
|
315
|
-
* `frameState.pointShadowSnapshots` and emits one independent render pass
|
|
316
|
-
* per (layer, face), opening / submitting each on its own command encoder
|
|
317
|
-
* (RD-4 manual barrier between depth-write and the URP forward pass's
|
|
318
|
-
* cube_array sample).
|
|
319
|
-
*
|
|
320
|
-
* Resource model: the cube_array atlas is a runtime-owned resource (NOT a
|
|
321
|
-
* graph color target) because its size is `4 * 6 * faceSize^2` and per-face
|
|
322
|
-
* 2D views must be created with explicit `baseArrayLayer` indexing — the
|
|
323
|
-
* existing `addColorTarget` vocabulary is single-attachment-only. The pass
|
|
324
|
-
* therefore declares no `writes` (the dependency between this pass and the
|
|
325
|
-
* URP forward pass is enforced by the `addScenePass.reads` order — both
|
|
326
|
-
* sample shadowAtlas, and graph declaration order keeps shadow before
|
|
327
|
-
* forward). A future render-graph extension may model the cube_array as a
|
|
328
|
-
* first-class resource; for now the manual command-encoder boundary is the
|
|
329
|
-
* synchronization point.
|
|
330
|
-
*
|
|
331
|
-
* AC-09 zero-shadow zero-pass: the URP `buildGraph` gates the call to
|
|
332
|
-
* `addPointShadowPass` on `frameState.pointShadowSnapshots.length > 0` so
|
|
333
|
-
* the graph itself never declares the pass when no PointLightShadow exists.
|
|
334
|
-
* `recordPointShadowPass` re-checks at execute time as defence in depth.
|
|
335
|
-
*/
|
|
336
|
-
export function addPointShadowPass(graph: RenderGraph<RenderPipelineContext>, name: string): void {
|
|
337
|
-
graph.addPass(name, {
|
|
338
|
-
reads: [],
|
|
339
|
-
writes: [],
|
|
340
|
-
execute: recordPointShadowPass as (c: RenderPipelineContext) => void,
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
export interface AddSpotShadowPassOptions {
|
|
345
|
-
/** Graph depth target (depth32float 2x2 tile atlas) the spot casters write. */
|
|
346
|
-
readonly depth: string;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
/**
|
|
350
|
-
* feat-20260625-spot-light-shadow-mapping M2 / w9 + w11 (D-1 + D-2). Render the
|
|
351
|
-
* spot-light shadow caster passes into the graph-owned `spotShadowDepth` atlas
|
|
352
|
-
* (a single 2D depth32float texture of 2x2 tiles — NOT a 2d-array). One graph
|
|
353
|
-
* pass NODE; the execute closure (`recordSpotShadowPass`) loops the per-frame
|
|
354
|
-
* `frameState.spotShadowSnapshots`, rendering each castShadow spot's perspective
|
|
355
|
-
* depth into its tile (viewport keyed on `shadowAtlasTile`) with first-tile
|
|
356
|
-
* clear / rest load (independent of the directional cascadeIndex; D-2). Unlike
|
|
357
|
-
* `addPointShadowPass` the spot atlas IS a graph color target, so the pass
|
|
358
|
-
* declares `writes: [opts.depth]` — `addScenePass.reads` lists the same key to
|
|
359
|
-
* order spot-shadow -> main. The single-node-with-internal-loop shape keeps the
|
|
360
|
-
* memoized graph from rebuilding on spot-count drift (AC-03 zero-spot scenes
|
|
361
|
-
* record zero passes via the early-return inside recordSpotShadowPass).
|
|
362
|
-
*/
|
|
363
|
-
export function addSpotShadowPass(
|
|
364
|
-
graph: RenderGraph<RenderPipelineContext>,
|
|
365
|
-
name: string,
|
|
366
|
-
opts: AddSpotShadowPassOptions,
|
|
367
|
-
): void {
|
|
368
|
-
graph.addPass(name, {
|
|
369
|
-
reads: [],
|
|
370
|
-
writes: [opts.depth],
|
|
371
|
-
execute: recordSpotShadowPass as (c: RenderPipelineContext) => void,
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
export interface AddSkyboxPassOptions {
|
|
376
|
-
/** Graph colour target the skybox writes (typically the same target the scene pass writes). */
|
|
377
|
-
readonly color: string;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
/**
|
|
381
|
-
* Render a skybox cube into the declared colour target. Implementation detail:
|
|
382
|
-
* `recordSkyboxPass` (package-private) emits a single cube draw with a
|
|
383
|
-
* skybox-view matrix derived from the camera. Writes `opts.color` so the
|
|
384
|
-
* scene pass can declare it under `reads` to enforce skybox -> main order.
|
|
385
|
-
*/
|
|
386
|
-
export function addSkyboxPass(
|
|
387
|
-
graph: RenderGraph<RenderPipelineContext>,
|
|
388
|
-
name: string,
|
|
389
|
-
opts: AddSkyboxPassOptions,
|
|
390
|
-
): void {
|
|
391
|
-
graph.addPass(name, {
|
|
392
|
-
reads: [],
|
|
393
|
-
writes: [opts.color],
|
|
394
|
-
execute: recordSkyboxPass as (c: RenderPipelineContext) => void,
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
export interface AddBloomPassesOptions {
|
|
399
|
-
/** HDR colour target the bright-extract reads + the composite reads back. */
|
|
400
|
-
readonly hdrColor: string;
|
|
401
|
-
/** Logical key the composite WRITES (typically an alias of hdrColor). */
|
|
402
|
-
readonly hdrComposited: string;
|
|
403
|
-
/** Half-res bright target. */
|
|
404
|
-
readonly bright: string;
|
|
405
|
-
/** Half-res H blur target. */
|
|
406
|
-
readonly blurH: string;
|
|
407
|
-
/** Half-res V blur target. */
|
|
408
|
-
readonly blurV: string;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
/**
|
|
412
|
-
* Wire the 4-pass bloom chain (bright -> blur-h -> blur-v -> composite). All
|
|
413
|
-
* intermediate targets are half-resolution; the composite reads hdrColor +
|
|
414
|
-
* blurV and writes the alias `hdrComposited` (declared via
|
|
415
|
-
* `g.addColorTargetAlias` to fold onto the actual hdrColor texture, KB-1).
|
|
416
|
-
*/
|
|
417
|
-
export function addBloomPasses(
|
|
418
|
-
graph: RenderGraph<RenderPipelineContext>,
|
|
419
|
-
opts: AddBloomPassesOptions,
|
|
420
|
-
): void {
|
|
421
|
-
graph.addPass('bloom-bright', {
|
|
422
|
-
reads: [opts.hdrColor],
|
|
423
|
-
writes: [opts.bright],
|
|
424
|
-
colorConnections: [{ source: opts.hdrColor, destination: opts.bright }],
|
|
425
|
-
execute: recordBloomBrightPass as (c: RenderPipelineContext) => void,
|
|
426
|
-
});
|
|
427
|
-
graph.addPass('bloom-blur-h', {
|
|
428
|
-
reads: [opts.bright],
|
|
429
|
-
writes: [opts.blurH],
|
|
430
|
-
colorConnections: [{ source: opts.bright, destination: opts.blurH }],
|
|
431
|
-
execute: recordBloomBlurHPass as (c: RenderPipelineContext) => void,
|
|
432
|
-
});
|
|
433
|
-
graph.addPass('bloom-blur-v', {
|
|
434
|
-
reads: [opts.blurH],
|
|
435
|
-
writes: [opts.blurV],
|
|
436
|
-
colorConnections: [{ source: opts.blurH, destination: opts.blurV }],
|
|
437
|
-
execute: recordBloomBlurVPass as (c: RenderPipelineContext) => void,
|
|
438
|
-
});
|
|
439
|
-
graph.addPass('bloom-composite', {
|
|
440
|
-
reads: [opts.hdrColor, opts.blurV],
|
|
441
|
-
writes: [opts.hdrComposited],
|
|
442
|
-
colorConnections: [
|
|
443
|
-
{ source: opts.hdrColor, destination: opts.hdrComposited },
|
|
444
|
-
{ source: opts.blurV, destination: opts.hdrComposited },
|
|
445
|
-
],
|
|
446
|
-
execute: recordBloomCompositePass as (c: RenderPipelineContext) => void,
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
/**
|
|
451
|
-
* feat-20260612-hdrp-ssao M3 / w15: SSAO pass parameters.
|
|
452
|
-
*
|
|
453
|
-
* Defaults: radius=0.5, bias=0.025, intensity=1.0.
|
|
454
|
-
* Non-positive radius or negative bias triggers fail-fast PostProcessError
|
|
455
|
-
* inside the per-frame record closure (w16 boundary impl).
|
|
456
|
-
*/
|
|
457
|
-
export interface AddSsaoPassesParams {
|
|
458
|
-
/** SSAO sample radius in view-space units (default 0.5). */
|
|
459
|
-
readonly radius?: number | undefined;
|
|
460
|
-
/** SSAO depth bias to avoid self-occlusion (default 0.025). */
|
|
461
|
-
readonly bias?: number | undefined;
|
|
462
|
-
/** SSAO intensity blend factor (default 1.0). */
|
|
463
|
-
readonly intensity?: number | undefined;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
export type { ResolvedSsaoParameters, SsaoParameterConfig } from './ssao-config';
|
|
467
|
-
|
|
468
|
-
/**
|
|
469
|
-
* Options for `addSsaoPasses` (plan-strategy D-5, D-2).
|
|
470
|
-
*
|
|
471
|
-
* The caller (hdrp-pipeline.buildGraph) declares the color targets
|
|
472
|
-
* (ssaoRaw / ssaoBlurred as half-swapchain r8unorm) and passes their
|
|
473
|
-
* graph resource keys here. `gbuf0` and `hdrDepth` are g-buffer
|
|
474
|
-
* resources declared by the pipeline.
|
|
475
|
-
*/
|
|
476
|
-
export interface AddSsaoPassesOptions {
|
|
477
|
-
/** G-buffer RT0 (normal.rgb + roughness.a), rgba16float, swapchain. */
|
|
478
|
-
readonly gbuf0: string;
|
|
479
|
-
/** Hardware depth target, depth24plus-stencil8, swapchain. */
|
|
480
|
-
readonly hdrDepth: string;
|
|
481
|
-
/** SSAO calc output: half-res r8unorm transient target. */
|
|
482
|
-
readonly ssaoRaw: string;
|
|
483
|
-
/** SSAO blur output: half-res r8unorm transient target. */
|
|
484
|
-
readonly ssaoBlurred: string;
|
|
485
|
-
/** SSAO parameters (radius, bias, intensity). */
|
|
486
|
-
readonly params?: AddSsaoPassesParams | undefined;
|
|
487
|
-
/** Pipeline context for lazy SSAO buffer resolution. */
|
|
488
|
-
readonly ctx: RenderPipelineContext;
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
/**
|
|
492
|
-
* Wire the 2-pass SSAO chain (calc -> blur) into the render graph.
|
|
493
|
-
*
|
|
494
|
-
* plan-strategy D-2: exactly 2 pass (ssao-calc + ssao-blur).
|
|
495
|
-
* plan-strategy D-4: g-buffer missing -> graph-level skip.
|
|
496
|
-
* plan-strategy D-5: signature matches addBloomPasses pattern.
|
|
497
|
-
*
|
|
498
|
-
* ssao-calc: reads gbuf0 + hdrDepth + ssao-noise + ssao-kernel + ssao-uniform,
|
|
499
|
-
* writes ssaoRaw (half-res r8unorm).
|
|
500
|
-
* ssao-blur: reads ssaoRaw, writes ssaoBlurred (half-res r8unorm).
|
|
501
|
-
*
|
|
502
|
-
* Fail-fast: when SSAO buffers are unavailable (g-buffer not declared or
|
|
503
|
-
* kernel/noise generation fails), the
|
|
504
|
-
* function returns without wiring any pass nodes (graph-level skip).
|
|
505
|
-
* Param validation happens in the record closure (w16 boundary impl).
|
|
506
|
-
*/
|
|
507
|
-
export function addSsaoPasses(
|
|
508
|
-
graph: RenderGraph<RenderPipelineContext>,
|
|
509
|
-
opts: AddSsaoPassesOptions,
|
|
510
|
-
): void {
|
|
511
|
-
const ctx = opts.ctx as _InternalRenderPipelineContext;
|
|
512
|
-
|
|
513
|
-
// plan-strategy D-4: g-buffer missing -> graph-level skip.
|
|
514
|
-
// Check that gbuf0 + hdrDepth are declared as graph color targets.
|
|
515
|
-
const resources = graph.listResources();
|
|
516
|
-
const hasGbuf0 = resources.some((r) => r.key === opts.gbuf0);
|
|
517
|
-
const hasHdrDepth = resources.some((r) => r.key === opts.hdrDepth);
|
|
518
|
-
if (!hasGbuf0 || !hasHdrDepth) {
|
|
519
|
-
return;
|
|
520
|
-
}
|
|
25
|
+
import { computeProjectionMatrix, computeViewMatrix } from './record/helpers';
|
|
26
|
+
import { getOrCreateFromChain } from './record/mesh-ssbo';
|
|
27
|
+
import type { _InternalRenderPipelineContext } from './record/render-context';
|
|
28
|
+
import { recordFxaaPass } from './record/skybox-post-pass';
|
|
29
|
+
import type { RenderPipelineContext } from './render-contract';
|
|
30
|
+
import { getOrCreateSsaoBuffers, getOrCreateSsaoFallbackTexture } from './ssao-buffers';
|
|
31
|
+
import { getSsaoParameters } from './ssao-config';
|
|
32
|
+
|
|
33
|
+
type DepthResolutionContext = Pick<_InternalRenderPipelineContext, 'runtime'> & {
|
|
34
|
+
readonly frameState: {
|
|
35
|
+
readonly perFrameGraph?: {
|
|
36
|
+
readonly getColorTargetTexture: (key: string) => Texture | undefined;
|
|
37
|
+
} | null;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
type RenderGraphRecordContext = _InternalRenderPipelineContext & {
|
|
42
|
+
readonly frameState: _InternalRenderPipelineContext['frameState'] & {
|
|
43
|
+
readonly perFrameGraph?: {
|
|
44
|
+
readonly getColorTargetDescriptor: (
|
|
45
|
+
key: string,
|
|
46
|
+
) => { readonly format: TextureFormat } | undefined;
|
|
47
|
+
readonly getColorTargetView: (key: string) => TextureView | undefined;
|
|
48
|
+
readonly getColorTargetTexture: (key: string) => Texture | undefined;
|
|
49
|
+
} | null;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
521
52
|
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
if (ssaoBufs === null) {
|
|
526
|
-
return;
|
|
53
|
+
function requireRenderGraphRecordContext(ctx: RenderPipelineContext): RenderGraphRecordContext {
|
|
54
|
+
if (!('frameState' in ctx) || !('bindGroupCounts' in ctx) || !('geometryDepthKey' in ctx)) {
|
|
55
|
+
throw new Error('typed render graph frame lacks the built-in record context');
|
|
527
56
|
}
|
|
528
|
-
|
|
529
|
-
// Validate parameters (fail-fast on illegal values).
|
|
530
|
-
const params = resolveSsaoParameters(opts.params);
|
|
531
|
-
if (!params.ok) throw params.error;
|
|
532
|
-
|
|
533
|
-
// Pass 1: SSAO calculation — fullscreen pass that samples g-buffer
|
|
534
|
-
// RT0 + depth, computes 64-sample hemisphere occlusion, writes
|
|
535
|
-
// single-channel R8 result to half-resolution target.
|
|
536
|
-
// Kernel SSBO / noise texture / uniform UBO are runtime-owned
|
|
537
|
-
// (getOrCreateSsaoBuffers) and bound at record time, not
|
|
538
|
-
// through the graph resource system.
|
|
539
|
-
graph.addPass('ssao-calc', {
|
|
540
|
-
reads: [opts.gbuf0, opts.hdrDepth],
|
|
541
|
-
writes: [opts.ssaoRaw],
|
|
542
|
-
execute: (_c: RenderPipelineContext, resolveCtx?: ResolveContext) => {
|
|
543
|
-
const internalCtx = _c as _InternalRenderPipelineContext;
|
|
544
|
-
recordSsaoCalcPass(
|
|
545
|
-
internalCtx,
|
|
546
|
-
resolveCtx,
|
|
547
|
-
opts.ssaoRaw,
|
|
548
|
-
opts.gbuf0,
|
|
549
|
-
opts.hdrDepth,
|
|
550
|
-
undefined,
|
|
551
|
-
undefined,
|
|
552
|
-
params.value,
|
|
553
|
-
);
|
|
554
|
-
},
|
|
555
|
-
});
|
|
556
|
-
|
|
557
|
-
// Pass 2: SSAO blur — fullscreen pass that reads the half-res R8
|
|
558
|
-
// ssaoRaw texture, applies a 4x4 box blur (16 taps), writes the
|
|
559
|
-
// blurred result to ssaoBlurred.
|
|
560
|
-
//
|
|
561
|
-
// M8 / w38: gbuf0 + hdrDepth declared as reads even though the blur
|
|
562
|
-
// shader does not sample them. Reason: the SSAO BGL is shared with the
|
|
563
|
-
// calc pass (9 entries 0-8); WebGPU requires every BGL slot to carry a
|
|
564
|
-
// valid resource, so the blur bind group must bind real gbuffer_normal +
|
|
565
|
-
// hdr_depth views at slots 4 + 5 — declaring them as graph reads is the
|
|
566
|
-
// mechanism that makes resolveCtx return their views here.
|
|
567
|
-
graph.addPass('ssao-blur', {
|
|
568
|
-
reads: [opts.ssaoRaw, opts.gbuf0, opts.hdrDepth],
|
|
569
|
-
writes: [opts.ssaoBlurred],
|
|
570
|
-
execute: (_c: RenderPipelineContext, resolveCtx?: ResolveContext) => {
|
|
571
|
-
const internalCtx = _c as _InternalRenderPipelineContext;
|
|
572
|
-
recordSsaoBlurPass(
|
|
573
|
-
internalCtx,
|
|
574
|
-
resolveCtx,
|
|
575
|
-
opts.ssaoBlurred,
|
|
576
|
-
opts.ssaoRaw,
|
|
577
|
-
opts.gbuf0,
|
|
578
|
-
opts.hdrDepth,
|
|
579
|
-
);
|
|
580
|
-
},
|
|
581
|
-
});
|
|
57
|
+
return ctx as RenderGraphRecordContext;
|
|
582
58
|
}
|
|
583
59
|
|
|
584
|
-
/**
|
|
585
|
-
* Lazy-allocate the three constant SSAO record companions the first time the
|
|
586
|
-
* calc / blur closure runs: a filtering sampler (binding 3 + 8), a
|
|
587
|
-
* non-filtering depth sampler (binding 6, paired with hdr_depth — WebGPU
|
|
588
|
-
* validation rejects depth + filtering), and a 1x1 r8unorm fallback view bound
|
|
589
|
-
* at ssaoRaw (binding 7) in the calc pass (the calc shader never samples
|
|
590
|
-
* ssaoRaw, but the BGL still requires a valid view).
|
|
591
|
-
*
|
|
592
|
-
* Returns null if any underlying allocation fires a structured error onto
|
|
593
|
-
* runtime.errorRegistry; the caller then skips the pass.
|
|
594
|
-
*/
|
|
595
60
|
/**
|
|
596
61
|
* Resolve a depth-only view of a graph color target by key.
|
|
597
62
|
*
|
|
@@ -606,18 +71,12 @@ export function addSsaoPasses(
|
|
|
606
71
|
* or creation fires a structured error
|
|
607
72
|
*/
|
|
608
73
|
export function resolveDepthOnlyView(
|
|
609
|
-
internals:
|
|
74
|
+
internals: DepthResolutionContext,
|
|
610
75
|
key: string,
|
|
611
76
|
label: string,
|
|
612
77
|
preferredKey?: string | null,
|
|
613
78
|
): TextureView | null {
|
|
614
|
-
const graph =
|
|
615
|
-
internals.frameState as unknown as {
|
|
616
|
-
readonly perFrameGraph?: {
|
|
617
|
-
getColorTargetTexture(key: string): unknown;
|
|
618
|
-
} | null;
|
|
619
|
-
}
|
|
620
|
-
).perFrameGraph;
|
|
79
|
+
const graph = internals.frameState.perFrameGraph;
|
|
621
80
|
if (graph === null || graph === undefined) return null;
|
|
622
81
|
const preferredTexture =
|
|
623
82
|
preferredKey === null || preferredKey === undefined
|
|
@@ -650,7 +109,7 @@ export function resolveDepthOnlyView(
|
|
|
650
109
|
* untouched (OOS-4).
|
|
651
110
|
*/
|
|
652
111
|
function resolveHdrDepthDepthOnlyView(
|
|
653
|
-
internals:
|
|
112
|
+
internals: DepthResolutionContext,
|
|
654
113
|
hdrDepthKey: string,
|
|
655
114
|
): TextureView | null {
|
|
656
115
|
return resolveDepthOnlyView(internals, hdrDepthKey, 'ssao-hdr-depth-only-view');
|
|
@@ -727,19 +186,16 @@ function ensureSsaoRecordCompanions(internals: _InternalRenderPipelineContext):
|
|
|
727
186
|
}
|
|
728
187
|
|
|
729
188
|
/**
|
|
730
|
-
* Pack the 256B SSAO uniform payload from the camera + config.ssao.
|
|
189
|
+
* Pack the 256B SSAO uniform payload from the camera + config.ssao.
|
|
731
190
|
*
|
|
732
191
|
* Layout (plan-strategy D-1 + D-C):
|
|
733
192
|
* floats [0..15] view mat4
|
|
734
193
|
* floats [16..31] projection mat4
|
|
735
194
|
* floats [32..47] inverseProjection mat4
|
|
736
|
-
* floats [48..51] intensityPad vec4 (x=intensity,
|
|
195
|
+
* floats [48..51] intensityPad vec4 (x=intensity, y=radius, z=bias)
|
|
737
196
|
* floats [52..63] trailing zero-pad to round to 256B / 64f UBO alignment.
|
|
738
197
|
*/
|
|
739
|
-
function buildSsaoUniformPayload(
|
|
740
|
-
internals: _InternalRenderPipelineContext,
|
|
741
|
-
parameters?: ResolvedSsaoParameters,
|
|
742
|
-
): Float32Array {
|
|
198
|
+
function buildSsaoUniformPayload(internals: _InternalRenderPipelineContext): Float32Array {
|
|
743
199
|
const { camera, frameState } = internals;
|
|
744
200
|
const sProj = computeProjectionMatrix(camera);
|
|
745
201
|
const sView = computeViewMatrix(camera);
|
|
@@ -747,19 +203,17 @@ function buildSsaoUniformPayload(
|
|
|
747
203
|
mat4.invert(invProj, sProj);
|
|
748
204
|
|
|
749
205
|
const out = new Float32Array(64);
|
|
750
|
-
out.set(sView
|
|
751
|
-
out.set(sProj
|
|
752
|
-
out.set(invProj
|
|
206
|
+
out.set(sView, 0);
|
|
207
|
+
out.set(sProj, 16);
|
|
208
|
+
out.set(invProj, 32);
|
|
753
209
|
|
|
754
210
|
const ssaoConfig = frameState.installedPipelineConfig?.ssao;
|
|
755
|
-
const
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
out[
|
|
761
|
-
out[49] = resolved.radius;
|
|
762
|
-
out[50] = resolved.bias;
|
|
211
|
+
const parameters = getSsaoParameters(
|
|
212
|
+
ssaoConfig !== undefined && ssaoConfig.enabled === true ? ssaoConfig : undefined,
|
|
213
|
+
);
|
|
214
|
+
out[48] = parameters.intensity;
|
|
215
|
+
out[49] = parameters.radius;
|
|
216
|
+
out[50] = parameters.bias;
|
|
763
217
|
return out;
|
|
764
218
|
}
|
|
765
219
|
|
|
@@ -798,7 +252,6 @@ export function recordSsaoCalcPass(
|
|
|
798
252
|
hdrDepthKey?: string,
|
|
799
253
|
graphPass?: RhiRenderPassEncoder,
|
|
800
254
|
graphViews?: SsaoCalcPassViews,
|
|
801
|
-
parameters?: ResolvedSsaoParameters,
|
|
802
255
|
): void {
|
|
803
256
|
const { runtime, pipelineState, encoder } = _c;
|
|
804
257
|
const pp = pipelineState.perPassResources;
|
|
@@ -854,7 +307,7 @@ export function recordSsaoCalcPass(
|
|
|
854
307
|
|
|
855
308
|
// Per-frame uniform write (D-C: view+proj+invProj+intensity at one queue
|
|
856
309
|
// call). 256 B Float32Array (64 f32) lands in ssao_uniform UBO offset 0.
|
|
857
|
-
const payload = buildSsaoUniformPayload(_c
|
|
310
|
+
const payload = buildSsaoUniformPayload(_c);
|
|
858
311
|
const writeRes = runtime.device.queue.writeBuffer(ssaoBufs.uniformBuffer, 0, payload);
|
|
859
312
|
if (!writeRes.ok) {
|
|
860
313
|
runtime.errorRegistry.fire(writeRes.error);
|
|
@@ -872,7 +325,7 @@ export function recordSsaoCalcPass(
|
|
|
872
325
|
const ssaoBgl = pp.ssaoBgl;
|
|
873
326
|
const bindGroup = getOrCreateFromChain(
|
|
874
327
|
_c.frameState.postProcessBgCache,
|
|
875
|
-
[gbuf0View
|
|
328
|
+
[gbuf0View, hdrDepthPooledView],
|
|
876
329
|
'ssao-calc',
|
|
877
330
|
() => {
|
|
878
331
|
const bgRes = runtime.device.createBindGroup({
|
|
@@ -996,7 +449,7 @@ export function recordSsaoBlurPass(
|
|
|
996
449
|
// the calc pass): WebGPU requires every BGL slot carry a valid resource
|
|
997
450
|
// even when the active fragment entry does not statically reference it.
|
|
998
451
|
// gbuf0 + hdr_depth views are resolved from the graph; they must exist
|
|
999
|
-
// because
|
|
452
|
+
// because the typed SSAO graph declares them as reads on the blur node.
|
|
1000
453
|
if (gbuf0View === undefined || hdrDepthView === null || hdrDepthPooledView === undefined) return;
|
|
1001
454
|
// Identity-cached bind group keyed on the graph-pooled ssaoRaw + gbuf0 +
|
|
1002
455
|
// hdrDepth views (all retire + reallocate on resize). Replaces the prior
|
|
@@ -1004,11 +457,7 @@ export function recordSsaoBlurPass(
|
|
|
1004
457
|
const ssaoBgl = pp.ssaoBgl;
|
|
1005
458
|
const bindGroup = getOrCreateFromChain(
|
|
1006
459
|
_c.frameState.postProcessBgCache,
|
|
1007
|
-
[
|
|
1008
|
-
ssaoRawView as unknown as object,
|
|
1009
|
-
gbuf0View as unknown as object,
|
|
1010
|
-
hdrDepthPooledView as unknown as object,
|
|
1011
|
-
],
|
|
460
|
+
[ssaoRawView, gbuf0View, hdrDepthPooledView],
|
|
1012
461
|
'ssao-blur',
|
|
1013
462
|
() => {
|
|
1014
463
|
const bgRes = runtime.device.createBindGroup({
|
|
@@ -1050,199 +499,6 @@ export function recordSsaoBlurPass(
|
|
|
1050
499
|
if (graphPass === undefined) pass.end();
|
|
1051
500
|
}
|
|
1052
501
|
|
|
1053
|
-
export interface AddTonemapPassOptions {
|
|
1054
|
-
/** Logical HDR resource tonemap reads when bloom is on (the bloom composite output). */
|
|
1055
|
-
readonly hdrComposited: string;
|
|
1056
|
-
/**
|
|
1057
|
-
* Logical HDR resource tonemap reads when bloom is OFF (the bloom composite
|
|
1058
|
-
* pass is gated off and never writes hdrComposited). Defaults to
|
|
1059
|
-
* `hdrComposited` for pipelines where the two are the same texture (e.g.
|
|
1060
|
-
* HDRP passes `hdrColor` for both). URP passes `hdrColor` here so that with
|
|
1061
|
-
* bloom off, tonemap reads the main-rendered scene directly instead of an
|
|
1062
|
-
* unwritten hdrComposited target (bug-20260625).
|
|
1063
|
-
*/
|
|
1064
|
-
readonly hdrColorWhenBloomOff?: string;
|
|
1065
|
-
/** Logical LDR output; defaults to the swap-chain. */
|
|
1066
|
-
readonly color?: string;
|
|
1067
|
-
/** Run the final linear-LDR -> display-encoded output without tone mapping. */
|
|
1068
|
-
readonly outputOnly?: boolean;
|
|
1069
|
-
}
|
|
1070
|
-
|
|
1071
|
-
/**
|
|
1072
|
-
* Reserved post-process id for the engine built-in tonemap (feat-20260621 M-A3
|
|
1073
|
-
* / D-5). Registered at boot via `postProcess.register(TONEMAP_POST_PROCESS_ID,
|
|
1074
|
-
* { source, params })`; the extract stage bridges `Camera.exposure / whitePoint
|
|
1075
|
-
* / tonemap` onto the params channel under this key (render-system-extract.ts).
|
|
1076
|
-
*/
|
|
1077
|
-
export const TONEMAP_POST_PROCESS_ID = 'forgeax::tonemap';
|
|
1078
|
-
|
|
1079
|
-
/**
|
|
1080
|
-
* HDR -> LDR tonemap fullscreen pass. feat-20260621 M-A3 (D-5): the built-in
|
|
1081
|
-
* tonemap now flows through the SAME unified fullscreen post-process channel as
|
|
1082
|
-
* any custom post-process — registered at boot via `postProcess.register(
|
|
1083
|
-
* 'forgeax::tonemap', { source, params })`, its exposure/whitePoint/mode bridged
|
|
1084
|
-
* onto the per-frame params channel by the extract stage, and dispatched here
|
|
1085
|
-
* through `dispatchFullscreenPass`. This wrapper preserves two behaviours the
|
|
1086
|
-
* generic `addFullscreenPass` lacks:
|
|
1087
|
-
* - the per-frame `tonemapActive` gate (`camera.tonemap === 'none'` ->
|
|
1088
|
-
* zero-overhead skip), and
|
|
1089
|
-
* - graceful degradation (charter §9) on the empty-manifest path: when
|
|
1090
|
-
* `forgeax::tonemap` was never registered (Camera-only world, no manifest)
|
|
1091
|
-
* fire a structured `shader-compile-failed` instead of letting the
|
|
1092
|
-
* dispatcher throw `post-process-not-found`.
|
|
1093
|
-
* The output is a graph resource when FXAA is active, otherwise the reserved
|
|
1094
|
-
* `'swapchain'` key resolves to the current surface view.
|
|
1095
|
-
*/
|
|
1096
|
-
export function addTonemapPass(
|
|
1097
|
-
graph: RenderGraph<RenderPipelineContext>,
|
|
1098
|
-
name: string,
|
|
1099
|
-
opts: AddTonemapPassOptions,
|
|
1100
|
-
): void {
|
|
1101
|
-
// Declare both potential read sources so validation preserves tonemap after
|
|
1102
|
-
// BOTH the composite writer (hdrComposited) and the main writer (hdrColor),
|
|
1103
|
-
// regardless of which one the dispatch resolves at record time. resolveCtx
|
|
1104
|
-
// exposes every compiled texture, so the runtime pick below always resolves.
|
|
1105
|
-
const hdrColorWhenBloomOff = opts.hdrColorWhenBloomOff ?? opts.hdrComposited;
|
|
1106
|
-
const tonemapReads =
|
|
1107
|
-
hdrColorWhenBloomOff === opts.hdrComposited
|
|
1108
|
-
? [opts.hdrComposited]
|
|
1109
|
-
: [opts.hdrComposited, hdrColorWhenBloomOff];
|
|
1110
|
-
graph.addPass(name, {
|
|
1111
|
-
reads: tonemapReads,
|
|
1112
|
-
writes: [opts.color ?? 'swapchain'],
|
|
1113
|
-
...(opts.color !== undefined && opts.color !== 'swapchain'
|
|
1114
|
-
? {
|
|
1115
|
-
colorConnections: [
|
|
1116
|
-
{
|
|
1117
|
-
source: hdrColorWhenBloomOff,
|
|
1118
|
-
destination: opts.color,
|
|
1119
|
-
conversion: { kind: 'tone-map' as const },
|
|
1120
|
-
},
|
|
1121
|
-
],
|
|
1122
|
-
}
|
|
1123
|
-
: {}),
|
|
1124
|
-
execute: (ctx: RenderPipelineContext, resolveCtx?: ResolveContext) => {
|
|
1125
|
-
// Tonemap mode `none` still needs the final output encode when the scene
|
|
1126
|
-
// was rendered into the graph-owned linear-LDR target.
|
|
1127
|
-
if (ctx.camera.tonemap === 'none' && opts.outputOnly !== true) return;
|
|
1128
|
-
const registered = ctx.runtime.lookupPostProcess?.(TONEMAP_POST_PROCESS_ID);
|
|
1129
|
-
if (registered === undefined) {
|
|
1130
|
-
ctx.runtime.errorRegistry.fire(
|
|
1131
|
-
new RhiError({
|
|
1132
|
-
code: 'shader-compile-failed',
|
|
1133
|
-
expected:
|
|
1134
|
-
'manifest entries include pbr.wgsl + unlit.wgsl + tonemap.wgsl (engine SSOT triple)',
|
|
1135
|
-
hint: 'verify @forgeax/engine-vite-plugin-shader emits manifest.json with the 3 engine entries; check vite plugin engineEntries option',
|
|
1136
|
-
}),
|
|
1137
|
-
);
|
|
1138
|
-
return;
|
|
1139
|
-
}
|
|
1140
|
-
// Pick the read source by bloom state: when bloom is on the composite
|
|
1141
|
-
// pass wrote hdrComposited; when off it was gated and never ran, so read
|
|
1142
|
-
// the main-rendered hdrColor instead (bug-20260625). Same texture for
|
|
1143
|
-
// pipelines that pass identical keys (e.g. HDRP).
|
|
1144
|
-
const src =
|
|
1145
|
-
opts.outputOnly === true
|
|
1146
|
-
? hdrColorWhenBloomOff
|
|
1147
|
-
: ctx.camera.bloom === 'on'
|
|
1148
|
-
? opts.hdrComposited
|
|
1149
|
-
: hdrColorWhenBloomOff;
|
|
1150
|
-
dispatchFullscreenPass(
|
|
1151
|
-
ctx,
|
|
1152
|
-
name,
|
|
1153
|
-
TONEMAP_POST_PROCESS_ID,
|
|
1154
|
-
opts.color ?? 'swapchain',
|
|
1155
|
-
[src],
|
|
1156
|
-
resolveCtx,
|
|
1157
|
-
false,
|
|
1158
|
-
opts.outputOnly === true,
|
|
1159
|
-
);
|
|
1160
|
-
},
|
|
1161
|
-
});
|
|
1162
|
-
}
|
|
1163
|
-
|
|
1164
|
-
export interface AddFullscreenPassOptions {
|
|
1165
|
-
/**
|
|
1166
|
-
* Registered post-process shader id (via renderer.postProcess.register). The
|
|
1167
|
-
* built-in `'fxaa'` id is a hardwired dispatcher branch; any other id is an
|
|
1168
|
-
* AI-user effect whose WGSL declares `vs_main` + `fs_main` and samples the
|
|
1169
|
-
* input at `@group(1) @binding(0)` texture + `@binding(1)` sampler. With
|
|
1170
|
-
* `compositeOverSwapchain` this is how an effect layers over URP's final image
|
|
1171
|
-
* (see RenderPipelineAsset.config.postEffects).
|
|
1172
|
-
*/
|
|
1173
|
-
readonly shader: string;
|
|
1174
|
-
/** Graph resource key the pass writes (intermediate scratch RT for FXAA / the composite scratch). */
|
|
1175
|
-
readonly color: string;
|
|
1176
|
-
/** Graph resource keys the pass samples. Empty = use the current surface view. */
|
|
1177
|
-
readonly reads?: readonly string[] | undefined;
|
|
1178
|
-
/**
|
|
1179
|
-
* feat-20260621 M4': composite-over-swap-chain mode. When true, the pass
|
|
1180
|
-
* copies the CURRENT swap-chain into the `color` scratch target (so the effect
|
|
1181
|
-
* samples the already-composited final image), samples that scratch, then
|
|
1182
|
-
* writes the result back into the swap-chain through its non-srgb storage view
|
|
1183
|
-
* (R-COLORSPACE: the swap-chain is already sRGB-encoded, so writing through the
|
|
1184
|
-
* srgb view would double-encode). This is the generalisation of the built-in
|
|
1185
|
-
* `'fxaa'` copy idiom to AI-user effects — the mechanism that lets a built-in
|
|
1186
|
-
* pipeline layer a registered effect on top of its final image WITHOUT
|
|
1187
|
-
* replacing the pipeline (and dropping its shadow / tonemap passes). `color`
|
|
1188
|
-
* MUST be a `graph.addColorTarget` declared with the swap-chain storage format
|
|
1189
|
-
* + COPY_DST | TEXTURE_BINDING usage (it is both copy dst and sampled input);
|
|
1190
|
-
* `reads` stays empty.
|
|
1191
|
-
*
|
|
1192
|
-
* WebGPU backend only: the mid-frame swap-chain copy + non-srgb storage-view
|
|
1193
|
-
* write are not supported on the WebGL2 fallback swap-chain (no COPY_SRC, no
|
|
1194
|
-
* non-srgb reinterpret view) — the same constraint `recordFxaaPass` carries.
|
|
1195
|
-
*/
|
|
1196
|
-
readonly compositeOverSwapchain?: boolean | undefined;
|
|
1197
|
-
}
|
|
1198
|
-
|
|
1199
|
-
/**
|
|
1200
|
-
* AC-06 / AC-07: declare a generic fullscreen post-process pass. The shader is
|
|
1201
|
-
* looked up from `renderer.postProcess.register(shader, …)`; the primitive
|
|
1202
|
-
* builds the input-texture BGL + sampler + pipeline + ping-pong wiring. For
|
|
1203
|
-
* the FXAA case the implementation detail is `recordFxaaPass`
|
|
1204
|
-
* (package-private), which owns the graph-input-to-surface-output attachment
|
|
1205
|
-
* route.
|
|
1206
|
-
*
|
|
1207
|
-
* If `opts.reads` is empty the pass uses the current surface view (default).
|
|
1208
|
-
* Post-processes that read a graph-owned texture
|
|
1209
|
-
* (e.g. tonemap rebuilt as a fullscreen pass, OOS-3) will declare reads
|
|
1210
|
-
* explicitly.
|
|
1211
|
-
*
|
|
1212
|
-
* F-3 topology refactor (2026-06-08): the FXAA path now flows through this
|
|
1213
|
-
* dispatcher (`addFullscreenPass(g, 'fxaa', ...)` -> `dispatchFullscreenPass` ->
|
|
1214
|
-
* `recordFxaaPass`). The two-branch dispatcher is the load-bearing AC-09
|
|
1215
|
-
* "FXAA refactored as the first post-process instance" claim: at the
|
|
1216
|
-
* topology layer FXAA is a special-cased shader id; at the record layer
|
|
1217
|
-
* recordFxaaPass owns the backend-aware output attachment. The
|
|
1218
|
-
* dispatcher is extracted as a named function (`dispatchFullscreenPass`)
|
|
1219
|
-
* so an AI user reading the per-pass execute closure sees a single call
|
|
1220
|
-
* site — the if/else fan-out is in one place, not duplicated across
|
|
1221
|
-
* future fullscreen passes.
|
|
1222
|
-
*/
|
|
1223
|
-
export function addFullscreenPass(
|
|
1224
|
-
graph: RenderGraph<RenderPipelineContext>,
|
|
1225
|
-
name: string,
|
|
1226
|
-
opts: AddFullscreenPassOptions,
|
|
1227
|
-
): void {
|
|
1228
|
-
const reads = opts.reads ?? [];
|
|
1229
|
-
graph.addPass(name, {
|
|
1230
|
-
reads,
|
|
1231
|
-
writes: [opts.color],
|
|
1232
|
-
execute: (ctx: RenderPipelineContext, resolveCtx?: ResolveContext) => {
|
|
1233
|
-
dispatchFullscreenPass(
|
|
1234
|
-
ctx,
|
|
1235
|
-
name,
|
|
1236
|
-
opts.shader,
|
|
1237
|
-
opts.color,
|
|
1238
|
-
reads,
|
|
1239
|
-
resolveCtx,
|
|
1240
|
-
opts.compositeOverSwapchain ?? false,
|
|
1241
|
-
);
|
|
1242
|
-
},
|
|
1243
|
-
});
|
|
1244
|
-
}
|
|
1245
|
-
|
|
1246
502
|
/**
|
|
1247
503
|
* F-3 fix-up + feat-20260609 M1 / T-3 patch: per-frame fullscreen-post-process
|
|
1248
504
|
* dispatcher.
|
|
@@ -1255,9 +511,9 @@ export function addFullscreenPass(
|
|
|
1255
511
|
* body is intentionally unchanged across this refactor to preserve the
|
|
1256
512
|
* AC-09 dualPassDiff=1069 (hello-fxaa) / 768 (learn-render-4-10-MSAA)
|
|
1257
513
|
* byte-equivalence with the pre-feat baseline.
|
|
1258
|
-
* -
|
|
514
|
+
* - every other id (AI-user path): the M1 patch wires `reads[0]` through the
|
|
1259
515
|
* render-graph `resolveCtx` so the bind group samples the upstream
|
|
1260
|
-
* graph-owned color target (e.g.
|
|
516
|
+
* graph-owned color target (e.g. the typed scene pass writes `'offscreenColor'`,
|
|
1261
517
|
* a custom post-process pass declares `reads: ['offscreenColor']`).
|
|
1262
518
|
* Failure modes (charter P3 fail-fast):
|
|
1263
519
|
* - `lookupPostProcess(shader) === undefined` -> throw
|
|
@@ -1277,7 +533,7 @@ export function addFullscreenPass(
|
|
|
1277
533
|
* fullscreen-triangle vertex shader.
|
|
1278
534
|
*
|
|
1279
535
|
* Extracted from the addPass execute closure so the topology fan-out is in
|
|
1280
|
-
* one named place;
|
|
536
|
+
* one named place; the typed graph has a single
|
|
1281
537
|
* call site, and future post-process branches (e.g. tonemap migrated onto
|
|
1282
538
|
* this dispatcher per OOS-3) extend this function rather than the addPass
|
|
1283
539
|
* inline closure.
|
|
@@ -1302,7 +558,7 @@ function dispatchFullscreenPass(
|
|
|
1302
558
|
detail: { readsKey: reads[0] ?? 'ldrColor', passName: name },
|
|
1303
559
|
});
|
|
1304
560
|
}
|
|
1305
|
-
recordFxaaPass(ctx
|
|
561
|
+
recordFxaaPass(requireRenderGraphRecordContext(ctx), resolveCtx, graphPass);
|
|
1306
562
|
return;
|
|
1307
563
|
}
|
|
1308
564
|
const lookup = ctx.runtime.lookupPostProcess;
|
|
@@ -1313,7 +569,6 @@ function dispatchFullscreenPass(
|
|
|
1313
569
|
detail: { id: shader },
|
|
1314
570
|
});
|
|
1315
571
|
}
|
|
1316
|
-
|
|
1317
572
|
// feat-20260621 M4' composite-over-swap-chain: copy the current swap-chain
|
|
1318
573
|
// into the `color` scratch target BEFORE sampling, so the effect reads the
|
|
1319
574
|
// already-composited final image (shadows + tonemap + fxaa). Generalises the
|
|
@@ -1378,7 +633,7 @@ function dispatchFullscreenPass(
|
|
|
1378
633
|
let depthTexView: TextureView | null = graphDepthView ?? null;
|
|
1379
634
|
let depthSampler: Sampler | null = null;
|
|
1380
635
|
if (entry.reads && entry.reads.length > 0) {
|
|
1381
|
-
const internals = ctx
|
|
636
|
+
const internals = requireRenderGraphRecordContext(ctx);
|
|
1382
637
|
for (const read of entry.reads) {
|
|
1383
638
|
if (typeof read !== 'string' && read.sampleType === 'depth') {
|
|
1384
639
|
const depthKey = read.key;
|
|
@@ -1399,20 +654,6 @@ function dispatchFullscreenPass(
|
|
|
1399
654
|
}
|
|
1400
655
|
}
|
|
1401
656
|
|
|
1402
|
-
const gbufferReadKeys = (entry.reads ?? [])
|
|
1403
|
-
.map((read) => (typeof read === 'string' ? read : read.key))
|
|
1404
|
-
.filter((key) => key === 'gbuffer-normal-roughness' || key === 'gbuffer-emissive-ao');
|
|
1405
|
-
const gbufferViews = gbufferReadKeys.map((key) => {
|
|
1406
|
-
const resolved = resolveCtx?.resolve(key);
|
|
1407
|
-
if (resolved === undefined) {
|
|
1408
|
-
throw new PostProcessError({
|
|
1409
|
-
code: 'fullscreen-input-not-found',
|
|
1410
|
-
detail: { readsKey: key, passName: name },
|
|
1411
|
-
});
|
|
1412
|
-
}
|
|
1413
|
-
return resolved as TextureView;
|
|
1414
|
-
});
|
|
1415
|
-
|
|
1416
657
|
// feat-20260621 M4' composite-over-swap-chain write target: the swap-chain's
|
|
1417
658
|
// NON-srgb storage view (R-COLORSPACE — the scratch holds an already-sRGB-
|
|
1418
659
|
// encoded copy, so writing through the srgb view would double-encode; mirrors
|
|
@@ -1424,7 +665,7 @@ function dispatchFullscreenPass(
|
|
|
1424
665
|
// the swap-chain path uses the backend-selected surface view format.
|
|
1425
666
|
let writeFormat = ctx.pipelineState?.colorAttachmentFormat ?? 'rgba8unorm-srgb';
|
|
1426
667
|
if (graphPass !== undefined) {
|
|
1427
|
-
writeView =
|
|
668
|
+
writeView = ctx.view;
|
|
1428
669
|
writeFormat = graphOutputFormat ?? writeFormat;
|
|
1429
670
|
} else if (rawSwapchainOutput && color === 'swapchain') {
|
|
1430
671
|
const rawViewRes = ctx.runtime.device.createTextureView(ctx.currentTexture, {});
|
|
@@ -1443,17 +684,7 @@ function dispatchFullscreenPass(
|
|
|
1443
684
|
writeView = storageViewRes.value;
|
|
1444
685
|
writeFormat = ctx.pipelineState?.format ?? 'rgba8unorm';
|
|
1445
686
|
} else {
|
|
1446
|
-
const
|
|
1447
|
-
const legacyGraph = (
|
|
1448
|
-
internalCtx.frameState as unknown as
|
|
1449
|
-
| {
|
|
1450
|
-
readonly perFrameGraph?: {
|
|
1451
|
-
getColorTargetDescriptor(key: string): { readonly format: string } | undefined;
|
|
1452
|
-
getColorTargetView(key: string): TextureView | undefined;
|
|
1453
|
-
} | null;
|
|
1454
|
-
}
|
|
1455
|
-
| undefined
|
|
1456
|
-
)?.perFrameGraph;
|
|
687
|
+
const legacyGraph = requireRenderGraphRecordContext(ctx).frameState.perFrameGraph;
|
|
1457
688
|
const graphColorFormat = legacyGraph?.getColorTargetDescriptor(color)?.format;
|
|
1458
689
|
if (graphColorFormat !== undefined) writeFormat = graphColorFormat;
|
|
1459
690
|
const resolvedColor = (resolveCtx?.resolve(color) as TextureView | undefined) ?? null;
|
|
@@ -1502,15 +733,13 @@ function dispatchFullscreenPass(
|
|
|
1502
733
|
paramsBuffer,
|
|
1503
734
|
depthTexView,
|
|
1504
735
|
depthSampler,
|
|
1505
|
-
gbufferViews[0] ?? null,
|
|
1506
|
-
gbufferViews[1] ?? null,
|
|
1507
736
|
);
|
|
1508
737
|
if (bindGroup === null) return;
|
|
1509
738
|
|
|
1510
739
|
// Pipeline source-of-truth (M4 / T-10-a, solving M1 CONCERN-1):
|
|
1511
740
|
// RenderSystemRuntime.getPostProcessPipeline is the sync wrapper over the
|
|
1512
741
|
// shared shader-module adapter (1-frame warmup). First frame after
|
|
1513
|
-
//
|
|
742
|
+
// fullscreen effect registration: shader compile is in flight -> returns null -> we
|
|
1514
743
|
// skip the pass for that frame. Second frame onward: cached pipeline is
|
|
1515
744
|
// returned synchronously.
|
|
1516
745
|
//
|
|
@@ -1521,9 +750,11 @@ function dispatchFullscreenPass(
|
|
|
1521
750
|
// tonemap -> FXAA), while preserving the native surface storage/sRGB split.
|
|
1522
751
|
const lookupPipeline = ctx.runtime.getPostProcessPipeline;
|
|
1523
752
|
if (lookupPipeline === undefined) return;
|
|
1524
|
-
const postColorFormat = writeFormat
|
|
753
|
+
const postColorFormat = writeFormat;
|
|
1525
754
|
const pipeline = lookupPipeline(shader, built.bindGroupLayout, postColorFormat);
|
|
1526
|
-
if (pipeline === null)
|
|
755
|
+
if (pipeline === null) {
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
1527
758
|
const handle = built.createHandle(name, pipeline, paramsBuffer);
|
|
1528
759
|
|
|
1529
760
|
// Open a render pass writing into the resolved color target. Fullscreen
|
|
@@ -1537,7 +768,7 @@ function dispatchFullscreenPass(
|
|
|
1537
768
|
ctx.encoder.beginRenderPass(
|
|
1538
769
|
buildBeginRenderPassDescriptor(
|
|
1539
770
|
{
|
|
1540
|
-
colorFormats: [writeFormat
|
|
771
|
+
colorFormats: [writeFormat],
|
|
1541
772
|
depthFormat: undefined,
|
|
1542
773
|
sampleCount: 1,
|
|
1543
774
|
},
|
|
@@ -1545,12 +776,6 @@ function dispatchFullscreenPass(
|
|
|
1545
776
|
'post-process',
|
|
1546
777
|
) as never,
|
|
1547
778
|
);
|
|
1548
|
-
if (
|
|
1549
|
-
/@group\(0\)\s*@binding\(0\)\s*var<uniform>\s+view\b/.test(entry.source) &&
|
|
1550
|
-
ctx.viewBindGroup
|
|
1551
|
-
) {
|
|
1552
|
-
pass.setBindGroup(0, ctx.viewBindGroup);
|
|
1553
|
-
}
|
|
1554
779
|
pass.setBindGroup(1, bindGroup);
|
|
1555
780
|
handle.draw(pass, inputView);
|
|
1556
781
|
if (graphPass === undefined) pass.end();
|