@forgeax/engine-render 0.1.28 → 0.1.30
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 +856 -126
- package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
- package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/device-feature-admission.d.ts +4 -3
- package/dist/assembly/device-feature-admission.d.ts.map +1 -1
- package/dist/assembly/dynamic-geometry-host.d.ts +27 -0
- package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
- package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
- package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +3 -1
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/gpu-driven-owner.d.ts +10 -0
- package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
- package/dist/assembly/host-contract.d.ts +14 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts +31 -1
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material/pipeline-helpers.d.ts +24 -0
- package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -0
- package/dist/assembly/material-shader-policy.d.ts +3 -1
- package/dist/assembly/material-shader-policy.d.ts.map +1 -1
- package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
- package/dist/assembly/recovery/failure-location.d.ts +12 -0
- package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
- package/dist/assembly/recovery/recovery-attempt.d.ts +1 -6
- package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -1
- package/dist/assembly/recovery/renderer-recover.d.ts +7 -4
- package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
- package/dist/assembly/renderer-facade.d.ts.map +1 -1
- package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
- package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
- package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
- package/dist/assembly/renderer-helpers.d.ts +3 -0
- package/dist/assembly/renderer-helpers.d.ts.map +1 -1
- package/dist/assembly/renderer-inspection.d.ts +4 -0
- package/dist/assembly/renderer-inspection.d.ts.map +1 -1
- package/dist/assembly/shader-prewarm-policy.d.ts +7 -1
- package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
- package/dist/assembly/skin-palette-owner.d.ts +8 -0
- package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
- package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
- package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/webgpu-device-loss.d.ts +15 -0
- package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
- package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready.d.ts +7 -3
- package/dist/assembly/webgpu-ready.d.ts.map +1 -1
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
- package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
- package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
- package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
- package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer.d.ts +7 -141
- package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
- package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
- package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
- package/dist/authoring.mjs +2 -2
- package/dist/capture/scene-projection.d.ts +41 -0
- package/dist/capture/scene-projection.d.ts.map +1 -0
- package/dist/{chunk-J52NMQKR.mjs → chunk-7MQ3XBSP.mjs} +1098 -844
- package/dist/chunk-7MQ3XBSP.mjs.map +1 -0
- package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
- package/dist/chunk-BLXGONR2.mjs.map +1 -0
- package/dist/{chunk-VSL23LZE.mjs → chunk-C3DDSXYK.mjs} +1188 -463
- package/dist/chunk-C3DDSXYK.mjs.map +1 -0
- package/dist/{chunk-IQMKJLNU.mjs → chunk-FUUO4UND.mjs} +443 -30
- package/dist/chunk-FUUO4UND.mjs.map +1 -0
- package/dist/{chunk-J6KACNOH.mjs → chunk-JRBDO2KB.mjs} +617 -7
- package/dist/chunk-JRBDO2KB.mjs.map +1 -0
- package/dist/{chunk-GE3SDD72.mjs → chunk-MDQJPY3T.mjs} +20 -40
- package/dist/chunk-MDQJPY3T.mjs.map +1 -0
- package/dist/{chunk-MYJ5RPJO.mjs → chunk-NO4WZCAH.mjs} +3 -3
- package/dist/chunk-NO4WZCAH.mjs.map +1 -0
- package/dist/{chunk-RBDBZ5R7.mjs → chunk-PA5DRJNI.mjs} +2 -2
- package/dist/chunk-PA5DRJNI.mjs.map +1 -0
- package/dist/{chunk-MBU4ZVE7.mjs → chunk-PSEQ6QPH.mjs} +4655 -892
- package/dist/chunk-PSEQ6QPH.mjs.map +1 -0
- package/dist/{chunk-JAASCMXA.mjs → chunk-S5UE2T5P.mjs} +289 -41
- package/dist/chunk-S5UE2T5P.mjs.map +1 -0
- package/dist/components/camera.d.ts +62 -2
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/directional-light.d.ts +2 -2
- package/dist/components/dynamic-resolution.d.ts +15 -0
- package/dist/components/dynamic-resolution.d.ts.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/instances.d.ts +6 -20
- package/dist/components/instances.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/reflection-probe.d.ts +1 -0
- package/dist/components/reflection-probe.d.ts.map +1 -1
- package/dist/components/scene-instance.d.ts +2 -1
- package/dist/components/scene-instance.d.ts.map +1 -1
- package/dist/components/screen-space-reflection.d.ts +14 -0
- package/dist/components/screen-space-reflection.d.ts.map +1 -0
- package/dist/components/skylight.d.ts +4 -1
- package/dist/components/skylight.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +14809 -7570
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/device-scope.d.ts +2 -0
- package/dist/device/device-scope.d.ts.map +1 -1
- package/dist/device/gpu-residency.d.ts +3 -14
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/dynamic-geometry.d.ts.map +1 -1
- package/dist/environment/background.d.ts +7 -0
- package/dist/environment/background.d.ts.map +1 -0
- package/dist/environment/ibl.d.ts +11 -0
- package/dist/environment/ibl.d.ts.map +1 -0
- package/dist/environment/storage.d.ts +14 -0
- package/dist/environment/storage.d.ts.map +1 -0
- package/dist/errors/gpu-driven.d.ts +6 -3
- package/dist/errors/gpu-driven.d.ts.map +1 -1
- package/dist/errors/render.d.ts +41 -4
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/camera.d.ts.map +1 -1
- package/dist/extract/contracts.d.ts +7 -0
- package/dist/extract/contracts.d.ts.map +1 -1
- package/dist/extract/gpu-driven.d.ts +50 -3
- package/dist/extract/gpu-driven.d.ts.map +1 -1
- package/dist/features/host.d.ts +23 -1
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/noise-texture.d.ts +17 -0
- package/dist/features/noise-texture.d.ts.map +1 -0
- package/dist/features/plan.d.ts +83 -2
- package/dist/features/plan.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +37 -4
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics-store.d.ts.map +1 -1
- package/dist/features/prepared-graphics.d.ts +5 -0
- package/dist/features/prepared-graphics.d.ts.map +1 -1
- package/dist/features/render-graph-compute.d.ts +5 -3
- package/dist/features/render-graph-compute.d.ts.map +1 -1
- package/dist/features/render-graph-contribution.d.ts +11 -3
- package/dist/features/render-graph-contribution.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +19 -3
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/types.d.ts +11 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +2 -0
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts +34 -1
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/material-artifacts.d.ts +24 -0
- package/dist/gpu-driven/material-artifacts.d.ts.map +1 -0
- package/dist/gpu-driven/material-bindings.d.ts +7 -0
- package/dist/gpu-driven/material-bindings.d.ts.map +1 -0
- package/dist/gpu-driven/pbr-program.d.ts +10 -0
- package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
- package/dist/gpu-driven/prepared-draw.d.ts +2 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +169 -27
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/shadow-views.d.ts +126 -0
- package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
- package/dist/gpu-driven/view-gpu.d.ts +18 -2
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-resource.d.ts +5 -2
- package/dist/gpu-resource.d.ts.map +1 -1
- package/dist/gpu-scene-schema.d.ts +2 -8
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +14 -0
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-texture-usage.d.ts +1 -0
- package/dist/gpu-texture-usage.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +9 -0
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +2 -0
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/frame-resources.d.ts +8 -0
- package/dist/ibl/frame-resources.d.ts.map +1 -0
- package/dist/ibl/skylight-bind-group.d.ts +3 -1
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +87 -75
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +10 -8
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +180 -1
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instances-derived-bounds.d.ts +11 -0
- package/dist/instances-derived-bounds.d.ts.map +1 -1
- package/dist/instances.d.ts +89 -44
- package/dist/instances.d.ts.map +1 -1
- package/dist/internal.d.ts +3 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +117 -9
- package/dist/internal.mjs.map +1 -1
- package/dist/lifecycle.d.ts +2 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/material-row.d.ts +15 -0
- package/dist/material-row.d.ts.map +1 -0
- package/dist/materials.d.ts +15 -0
- package/dist/materials.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +23 -5
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/render-extent.d.ts +51 -0
- package/dist/pipeline/render-extent.d.ts.map +1 -0
- package/dist/pipeline/standard-build-context.d.ts +7 -0
- package/dist/pipeline/standard-build-context.d.ts.map +1 -0
- package/dist/pipeline/standard-forward-lane.d.ts +3 -2
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
- package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
- package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
- package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
- package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
- package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
- package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
- package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
- package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
- package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
- package/dist/pipeline/standard-output/graph.d.ts +15 -0
- package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
- package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
- package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
- package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
- package/dist/pipeline/standard-output/resources.d.ts +10 -0
- package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
- package/dist/pipeline/standard-output/types.d.ts +39 -0
- package/dist/pipeline/standard-output/types.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts +2 -2
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline/standard-profile.d.ts +2 -1
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +5 -2
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec-types.d.ts +4 -0
- package/dist/pipeline-spec-types.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +1 -9
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/points-lines/standard-owner.d.ts +1 -1
- package/dist/points-lines/standard-owner.d.ts.map +1 -1
- package/dist/post-process-errors.d.ts +9 -2
- package/dist/post-process-errors.d.ts.map +1 -1
- package/dist/prepare/extended-lighting/resources.d.ts +3 -3
- package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
- package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
- package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +3 -3
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +109 -13
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +41 -5
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +13 -9
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +43 -3
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +2 -10
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +14 -2
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +15 -6
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/prepared-material-bindings.d.ts +19 -0
- package/dist/record/prepared-material-bindings.d.ts.map +1 -0
- package/dist/record/recovery-pipeline.d.ts +1 -0
- package/dist/record/recovery-pipeline.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +101 -22
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts +62 -7
- 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 +39 -8
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +1 -0
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/recovery/render-system-candidate.d.ts +10 -2
- package/dist/recovery/render-system-candidate.d.ts.map +1 -1
- package/dist/recovery/render-system-roots.d.ts +11 -0
- package/dist/recovery/render-system-roots.d.ts.map +1 -0
- package/dist/recovery/types.d.ts +76 -0
- package/dist/recovery/types.d.ts.map +1 -0
- package/dist/reflection/background.d.ts +14 -0
- package/dist/reflection/background.d.ts.map +1 -0
- package/dist/reflection/filter.d.ts.map +1 -1
- package/dist/reflection/projection.d.ts +1 -0
- package/dist/reflection/projection.d.ts.map +1 -1
- package/dist/reflection/record-owner.d.ts +4 -4
- package/dist/reflection/record-owner.d.ts.map +1 -1
- package/dist/render-contract.d.ts +211 -53
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts +1 -0
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +81 -6
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts +15 -6
- package/dist/render-system-extract-tail.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +128 -41
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system-projections.d.ts +22 -0
- package/dist/render-system-projections.d.ts.map +1 -0
- package/dist/render-system.d.ts +27 -77
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene-types.d.ts +14 -7
- package/dist/scene/render-scene-types.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +31 -11
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/scene/shadow-visibility.d.ts +5 -0
- package/dist/scene/shadow-visibility.d.ts.map +1 -0
- package/dist/ssao-config.d.ts +8 -6
- package/dist/ssao-config.d.ts.map +1 -1
- package/dist/ssr/admission.d.ts +70 -1
- package/dist/ssr/admission.d.ts.map +1 -1
- package/dist/ssr/compose.d.ts +13 -0
- package/dist/ssr/compose.d.ts.map +1 -0
- package/dist/ssr/errors.d.ts +35 -0
- package/dist/ssr/errors.d.ts.map +1 -1
- package/dist/ssr/graph.d.ts +60 -0
- package/dist/ssr/graph.d.ts.map +1 -0
- package/dist/ssr/history.d.ts +97 -0
- package/dist/ssr/history.d.ts.map +1 -0
- package/dist/ssr/hiz.d.ts +37 -0
- package/dist/ssr/hiz.d.ts.map +1 -0
- package/dist/ssr/inspection.d.ts +42 -0
- package/dist/ssr/inspection.d.ts.map +1 -0
- package/dist/ssr/resources.d.ts +58 -0
- package/dist/ssr/resources.d.ts.map +1 -0
- package/dist/ssr/temporal.d.ts +38 -0
- package/dist/ssr/temporal.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts +32 -10
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
- package/dist/systems/skin-palette-types.d.ts +15 -0
- package/dist/systems/skin-palette-types.d.ts.map +1 -1
- package/dist/systems/transparent-dispatch.d.ts +9 -0
- package/dist/systems/transparent-dispatch.d.ts.map +1 -0
- package/dist/targets/material-source.d.ts +7 -0
- package/dist/targets/material-source.d.ts.map +1 -1
- package/dist/temporal/frame-coordinator.d.ts +7 -0
- package/dist/temporal/frame-coordinator.d.ts.map +1 -1
- package/dist/temporal/gpu.d.ts +8 -0
- package/dist/temporal/gpu.d.ts.map +1 -1
- package/dist/temporal/history.d.ts.map +1 -1
- package/dist/temporal/index.mjs +6 -6
- package/dist/temporal/inspection.d.ts.map +1 -1
- package/dist/temporal/standard-scene-data.d.ts +4 -2
- package/dist/temporal/standard-scene-data.d.ts.map +1 -1
- package/dist/temporal/target-coverage-attachment.d.ts +15 -0
- package/dist/temporal/target-coverage-attachment.d.ts.map +1 -0
- package/dist/temporal/temporal-view.d.ts +6 -0
- package/dist/temporal/temporal-view.d.ts.map +1 -1
- package/dist/temporal/view.d.ts +6 -0
- package/dist/temporal/view.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +41 -1
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-passes.d.ts +3 -1
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/component.d.ts +1 -0
- package/dist/volume/component.d.ts.map +1 -1
- package/dist/volume/temporal.d.ts +6 -0
- package/dist/volume/temporal.d.ts.map +1 -1
- package/package.json +21 -20
- package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
- package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
- package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
- package/src/__tests__/auto-exposure.browser.test.ts +33 -0
- package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
- package/src/__tests__/capture-scene-projection.unit.test.ts +24 -0
- package/src/__tests__/detached-inspection.integration.test.ts +5 -0
- package/src/__tests__/device-feature-admission.unit.test.ts +15 -24
- package/src/__tests__/device-loss-fanout.unit.test.ts +43 -0
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
- package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
- package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
- package/src/__tests__/dynamic-geometry-batch.unit.test.ts +157 -0
- package/src/__tests__/dynamic-geometry.unit.test.ts +36 -0
- package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +81 -0
- package/src/__tests__/factory-contract.integration.test.ts +231 -9
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
- package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
- package/src/__tests__/feature-noise.unit.test.ts +38 -0
- package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
- package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
- package/src/__tests__/frame-observation.contract.test.ts +21 -0
- package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
- package/src/__tests__/frame-targets.unit.test.ts +24 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
- package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +307 -7
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
- package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
- package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +261 -0
- package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +346 -0
- package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1422 -0
- package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
- package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
- package/src/__tests__/gpu-driven-production.integration.test.ts +1076 -106
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
- package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
- package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
- package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
- package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
- package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
- package/src/__tests__/gpu-driven-view.unit.test.ts +160 -52
- package/src/__tests__/gpu-pass-timing-browser-runner.ts +15 -0
- package/src/__tests__/gpu-pass-timing.browser.test.ts +20 -2
- package/src/__tests__/gpu-resource-scope.unit.test.ts +71 -0
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
- package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
- package/src/__tests__/gpu-scene.unit.test.ts +613 -33
- package/src/__tests__/instances-culling.integration.test.ts +36 -10
- package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
- package/src/__tests__/instances-store.unit.test.ts +242 -39
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
- package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
- package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
- package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
- package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
- package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
- package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
- package/src/__tests__/material-texture-source.unit.test.ts +87 -0
- package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
- package/src/__tests__/materials-standard-contract.unit.test.ts +57 -3
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
- package/src/__tests__/mesh-submission-lifetime.unit.test.ts +8 -0
- package/src/__tests__/morph-neutral-admission.unit.test.ts +19 -0
- package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
- package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
- package/src/__tests__/physical-clearcoat.integration.test.ts +42 -3
- package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
- package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
- package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -5
- package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
- package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +251 -9
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
- package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
- package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
- package/src/__tests__/public-surface.test-d.ts +3 -0
- package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
- package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +171 -0
- package/src/__tests__/reflection-probe-authoring.unit.test.ts +12 -10
- package/src/__tests__/reflection-probe-box.dawn.test.ts +71 -0
- package/src/__tests__/reflection-probe-filter.unit.test.ts +9 -0
- package/src/__tests__/reflection-probe-orientation.dawn.test.ts +294 -0
- package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +5 -14
- package/src/__tests__/reflection-probe-updates.unit.test.ts +129 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +7 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +27 -1
- package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
- package/src/__tests__/render-extent.unit.test.ts +63 -0
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
- package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
- package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
- package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
- package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
- package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
- package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +915 -23
- package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
- package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
- package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
- package/src/__tests__/render-target-material-source.test-d.ts +27 -3
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +233 -9
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
- package/src/__tests__/shader-manifest-fixture.ts +45 -0
- package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
- package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
- package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +125 -14
- package/src/__tests__/specular-environment-scale.dawn.test.ts +158 -0
- package/src/__tests__/ssao-config.unit.test.ts +7 -0
- package/src/__tests__/ssao-surface.dawn.test.ts +252 -0
- package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
- package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
- package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
- package/src/__tests__/ssr-cube-silhouette.dawn.test.ts +270 -0
- package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
- package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +99 -0
- package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +116 -0
- package/src/__tests__/ssr-gpu-dispatch.ts +951 -0
- package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
- package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
- package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
- package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
- package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
- package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
- package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
- package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
- package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
- package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
- package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
- package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
- package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
- package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
- package/src/__tests__/ssr-reprojection-probe.ts +90 -0
- package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
- package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
- package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
- package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
- package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
- package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
- package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +84 -12
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
- package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
- package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
- package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
- package/src/__tests__/standard-output.browser.test.ts +15 -0
- package/src/__tests__/standard-output.dawn.test.ts +15 -0
- package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +275 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
- package/src/__tests__/standard-profile-oracle.unit.test.ts +49 -0
- package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
- package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
- package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
- package/src/__tests__/taa-coverage-edge.dawn.test.ts +199 -0
- package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
- package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +782 -0
- package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
- package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
- package/src/__tests__/taa-stability-feedback.ts +342 -0
- package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
- package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
- package/src/__tests__/temporal-view.unit.test.ts +17 -0
- package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
- package/src/__tests__/transmission-prewarm.unit.test.ts +57 -0
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
- package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
- package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
- package/src/__tests__/visibility-extract.perf.test.ts +20 -8
- package/src/__tests__/visibility-instances.integration.test.ts +19 -7
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +62 -13
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +7 -7
- package/src/assembly/atmosphere-shader-prewarm.ts +39 -0
- package/src/assembly/device-feature-admission.ts +9 -4
- package/src/assembly/dynamic-geometry-host.ts +284 -163
- package/src/assembly/dynamic-geometry-runtime.ts +71 -0
- package/src/assembly/factory.ts +4 -0
- package/src/assembly/gpu-driven-owner.ts +29 -0
- package/src/assembly/host-contract.ts +19 -0
- package/src/assembly/material/assembly.ts +383 -1
- package/src/assembly/material/pipeline-helpers.ts +100 -0
- package/src/assembly/material-shader-policy.ts +110 -46
- package/src/assembly/recovery/device-loss-fanout.ts +5 -0
- package/src/assembly/recovery/failure-location.ts +62 -0
- package/src/assembly/recovery/recovery-attempt.ts +2 -29
- package/src/assembly/recovery/renderer-recover.ts +16 -17
- package/src/assembly/renderer-facade.ts +34 -1
- package/src/assembly/renderer-feature-inspection.ts +13 -0
- package/src/assembly/renderer-frame-transaction.ts +63 -0
- package/src/assembly/renderer-helpers.ts +26 -0
- package/src/assembly/renderer-inspection.ts +6 -0
- package/src/assembly/shader-prewarm-policy.ts +46 -1
- package/src/assembly/skin-palette-owner.ts +21 -0
- package/src/assembly/ssr-shader-prewarm.ts +41 -0
- package/src/assembly/webgpu-device-loss.ts +75 -0
- package/src/assembly/webgpu-pbr-ready.ts +232 -0
- package/src/assembly/webgpu-ready-mipmap.ts +26 -0
- package/src/assembly/webgpu-ready.ts +161 -131
- package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
- package/src/assembly/webgpu-renderer-contract.ts +69 -0
- package/src/assembly/webgpu-renderer-guards.ts +32 -0
- package/src/assembly/webgpu-renderer-observation.ts +43 -0
- package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
- package/src/assembly/webgpu-renderer.ts +744 -730
- package/src/assembly/webgpu-vertex-layouts.ts +233 -87
- package/src/capture/scene-projection.ts +37 -0
- package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
- package/src/components/__tests__/dynamic-resolution-schema.unit.test.ts +65 -0
- package/src/components/__tests__/light-radius.integration.test.ts +59 -0
- package/src/components/camera.ts +287 -7
- package/src/components/directional-light.ts +3 -3
- package/src/components/dynamic-resolution.ts +67 -0
- package/src/components/index.ts +2 -0
- package/src/components/instances.ts +45 -18
- package/src/components/light-helpers.ts +6 -1
- package/src/components/reflection-probe.ts +1 -0
- package/src/components/scene-instance.ts +2 -1
- package/src/components/screen-space-reflection.ts +21 -0
- package/src/components/skylight.ts +4 -1
- package/src/components/sprite-animation.ts +2 -2
- package/src/components/sprite-instances.ts +1 -1
- package/src/device/device-scope.ts +13 -7
- package/src/device/gpu-residency.ts +45 -42
- package/src/dynamic-geometry.ts +13 -8
- package/src/environment/background.ts +281 -0
- package/src/environment/ibl.ts +211 -0
- package/src/environment/storage.ts +63 -0
- package/src/errors/gpu-driven.ts +49 -8
- package/src/errors/render.ts +91 -3
- package/src/extract/camera.ts +37 -1
- package/src/extract/contracts.ts +10 -0
- package/src/extract/gpu-driven.ts +240 -10
- package/src/features/host.ts +237 -19
- package/src/features/noise-texture.ts +91 -0
- package/src/features/plan.ts +553 -24
- package/src/features/prepared-gpu-work.ts +631 -49
- package/src/features/prepared-graphics-store.ts +31 -0
- package/src/features/prepared-graphics.ts +5 -0
- package/src/features/render-graph-compute.ts +41 -8
- package/src/features/render-graph-contribution.ts +141 -3
- package/src/features/render-graph-raster.ts +143 -30
- package/src/features/types.ts +11 -0
- package/src/fullscreen-post-process-pass.ts +3 -0
- package/src/gpu-driven/batch-topology.ts +452 -108
- package/src/gpu-driven/material-artifacts.ts +179 -0
- package/src/gpu-driven/material-bindings.ts +41 -0
- package/src/gpu-driven/pbr-program.ts +31 -0
- package/src/gpu-driven/prepared-draw.ts +42 -6
- package/src/gpu-driven/production-raster.ts +2806 -716
- package/src/gpu-driven/shadow-views.ts +539 -0
- package/src/gpu-driven/view-gpu.ts +188 -41
- package/src/gpu-resource.ts +21 -2
- package/src/gpu-scene-schema.ts +61 -11
- package/src/gpu-scene.ts +197 -99
- package/src/gpu-texture-usage.ts +1 -0
- package/src/hdrp-buffers.ts +141 -36
- package/src/ibl/IblPipelineCache.ts +5 -0
- package/src/ibl/frame-resources.ts +38 -0
- package/src/ibl/skylight-bind-group.ts +32 -21
- package/src/index.ts +194 -75
- package/src/inspection-types.ts +207 -1
- package/src/instances-derived-bounds.ts +258 -34
- package/src/instances.ts +459 -150
- package/src/internal.ts +22 -0
- package/src/lifecycle.ts +2 -0
- package/src/material-row.ts +194 -0
- package/src/materials.ts +44 -8
- package/src/pbr-pipeline.ts +172 -19
- package/src/pipeline/render-extent.ts +111 -0
- package/src/pipeline/standard-build-context.ts +7 -0
- package/src/pipeline/standard-forward-lane.ts +74 -29
- package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
- package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
- package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
- package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
- package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
- package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
- package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
- package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
- package/src/pipeline/standard-output/color-transform.ts +124 -0
- package/src/pipeline/standard-output/graph.ts +139 -0
- package/src/pipeline/standard-output/lut-admission.ts +121 -0
- package/src/pipeline/standard-output/lut-gpu.ts +399 -0
- package/src/pipeline/standard-output/lut-state.ts +176 -0
- package/src/pipeline/standard-output/resources.ts +121 -0
- package/src/pipeline/standard-output/types.ts +58 -0
- package/src/pipeline/standard-pipeline.ts +232 -70
- package/src/pipeline/standard-post.ts +190 -27
- package/src/pipeline/standard-profile.ts +2 -1
- package/src/pipeline-builder.ts +28 -9
- package/src/pipeline-spec-types.ts +4 -0
- package/src/pipeline-spec.ts +37 -29
- package/src/plugin.ts +4 -0
- package/src/points-lines/standard-owner.ts +6 -14
- package/src/post-process-errors.ts +26 -18
- package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +2 -2
- package/src/prepare/extended-lighting/resources.ts +3 -3
- package/src/prepare/prepared-graphics-resolver.ts +9 -2
- package/src/record/__tests__/main-pass-geometry.unit.test.ts +68 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +45 -0
- package/src/record/__tests__/material-slot-plan.unit.test.ts +57 -0
- package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
- package/src/record/__tests__/recovery-pipeline.unit.test.ts +20 -1
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +41 -6
- package/src/record/__tests__/temporal-payload.unit.test.ts +2 -0
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
- package/src/record/dynamic-geometry-consumption.ts +59 -0
- package/src/record/frame-lighting.ts +15 -12
- package/src/record/frame-snapshot.ts +146 -34
- package/src/record/frame-targets.ts +9 -0
- package/src/record/frame.ts +838 -170
- package/src/record/main-pass-geometry.ts +209 -103
- package/src/record/main-pass-material.ts +157 -40
- package/src/record/main-pass-sprite-draws.ts +16 -107
- package/src/record/main-pass.ts +141 -12
- package/src/record/material-uniforms.ts +1 -1
- package/src/record/mesh-ssbo.ts +59 -15
- package/src/record/prepared-material-bindings.ts +238 -0
- package/src/record/recovery-pipeline.ts +69 -90
- package/src/record/render-context.ts +123 -24
- package/src/record/shadow-pass.ts +1389 -230
- package/src/record/skybox-post-pass.ts +14 -3
- package/src/record/typed-frame-graph.ts +1064 -47
- package/src/record/view-ubo.ts +12 -1
- package/src/recovery/render-system-candidate.ts +135 -68
- package/src/recovery/render-system-roots.ts +113 -0
- package/src/recovery/types.ts +77 -0
- package/src/reflection/background.ts +151 -0
- package/src/reflection/filter.ts +3 -0
- package/src/reflection/projection.ts +16 -6
- package/src/reflection/record-owner.ts +308 -140
- package/src/render-contract.ts +237 -49
- package/src/render-graph-primitives.ts +34 -5
- package/src/render-pipeline.ts +90 -2
- package/src/render-system-extract-tail.ts +431 -162
- package/src/render-system-extract.ts +478 -119
- package/src/render-system-projections.ts +241 -0
- package/src/render-system.ts +715 -828
- package/src/scene/render-scene-types.ts +13 -4
- package/src/scene/render-scene.ts +577 -355
- package/src/scene/shadow-visibility.ts +21 -0
- package/src/ssao-config.ts +25 -8
- package/src/ssr/admission.ts +380 -14
- package/src/ssr/compose.ts +144 -0
- package/src/ssr/errors.ts +48 -0
- package/src/ssr/graph.ts +797 -0
- package/src/ssr/history.ts +436 -0
- package/src/ssr/hiz.ts +124 -0
- package/src/ssr/inspection.ts +124 -0
- package/src/ssr/resources.ts +202 -0
- package/src/ssr/temporal.ts +164 -0
- package/src/systems/skin-palette-allocator.ts +495 -148
- package/src/systems/skin-palette-types.ts +17 -0
- package/src/systems/transparent-dispatch.ts +90 -0
- package/src/targets/material-source.ts +34 -0
- package/src/temporal/coverage.ts +1 -1
- package/src/temporal/frame-coordinator.ts +23 -2
- package/src/temporal/gpu.ts +79 -12
- package/src/temporal/history.ts +3 -1
- package/src/temporal/inspection.ts +2 -1
- package/src/temporal/standard-scene-data.ts +10 -2
- package/src/temporal/target-coverage-attachment.ts +72 -0
- package/src/temporal/temporal-view.ts +11 -2
- package/src/temporal/view.ts +12 -2
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +219 -139
- package/src/typed-render-graph-primitives.ts +304 -74
- package/src/typed-shadow-passes.ts +122 -12
- package/src/volume/component.ts +1 -0
- package/src/volume/passes.ts +3 -3
- package/src/volume/temporal.ts +10 -0
- package/dist/chunk-GE3SDD72.mjs.map +0 -1
- package/dist/chunk-GF523LHF.mjs.map +0 -1
- package/dist/chunk-IQMKJLNU.mjs.map +0 -1
- package/dist/chunk-J52NMQKR.mjs.map +0 -1
- package/dist/chunk-J6KACNOH.mjs.map +0 -1
- package/dist/chunk-JAASCMXA.mjs.map +0 -1
- package/dist/chunk-MBU4ZVE7.mjs.map +0 -1
- package/dist/chunk-MYJ5RPJO.mjs.map +0 -1
- package/dist/chunk-RBDBZ5R7.mjs.map +0 -1
- package/dist/chunk-VSL23LZE.mjs.map +0 -1
- package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
- package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
package/src/internal.ts
CHANGED
|
@@ -49,4 +49,26 @@ export {
|
|
|
49
49
|
type OcclusionRuntimeTestHooks,
|
|
50
50
|
setOcclusionRuntimeTestHooks,
|
|
51
51
|
} from './scene/visibility/occlusion-runtime';
|
|
52
|
+
export {
|
|
53
|
+
createSsrHistoryOwner,
|
|
54
|
+
SSR_HISTORY_FORMAT,
|
|
55
|
+
type SsrHistoryCandidate,
|
|
56
|
+
type SsrHistoryError,
|
|
57
|
+
type SsrHistoryFailureStage,
|
|
58
|
+
type SsrHistoryInspection,
|
|
59
|
+
SsrHistoryOwner,
|
|
60
|
+
type SsrHistoryResetReason,
|
|
61
|
+
type SsrHistoryResources,
|
|
62
|
+
type SsrHistorySlot,
|
|
63
|
+
type SsrHistoryState,
|
|
64
|
+
} from './ssr/history';
|
|
65
|
+
export { estimateSsrSpatialMemory } from './ssr/resources';
|
|
66
|
+
export {
|
|
67
|
+
createSsrTemporalConsumer,
|
|
68
|
+
type SsrTemporalCandidate,
|
|
69
|
+
SsrTemporalConsumer,
|
|
70
|
+
type SsrTemporalError,
|
|
71
|
+
type SsrTemporalExecutionError,
|
|
72
|
+
type SsrTemporalInspection,
|
|
73
|
+
} from './ssr/temporal';
|
|
52
74
|
export { TemporalFrameCoordinator } from './temporal/frame-coordinator';
|
package/src/lifecycle.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { RenderGraphError } from '@forgeax/engine-render-graph';
|
|
|
3
3
|
import type { RhiError } from '@forgeax/engine-rhi';
|
|
4
4
|
import type { SkinError } from '@forgeax/engine-skinning';
|
|
5
5
|
import type { ImageError } from '@forgeax/engine-types';
|
|
6
|
+
import type { GpuDrivenPreparationError } from './errors/gpu-driven';
|
|
6
7
|
import type { RenderError } from './errors/render';
|
|
7
8
|
import type { PostProcessError } from './post-process-errors';
|
|
8
9
|
|
|
@@ -18,6 +19,7 @@ export type RendererError =
|
|
|
18
19
|
| RenderGraphError
|
|
19
20
|
| ImageError
|
|
20
21
|
| RenderError
|
|
22
|
+
| GpuDrivenPreparationError
|
|
21
23
|
| AssetRuntimeError
|
|
22
24
|
| SkinError
|
|
23
25
|
| PostProcessError;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type MaterialShaderArtifactReceipt,
|
|
3
|
+
STANDARD_PIPELINE_PARAM_SCHEMA,
|
|
4
|
+
} from '@forgeax/engine-shader';
|
|
5
|
+
import { derive, type ParamSchemaEntry, type UboFieldLayout } from '@forgeax/engine-types';
|
|
6
|
+
import { GPU_SCENE_LAYOUTS } from './gpu-scene-schema';
|
|
7
|
+
import type { MaterialSnapshot } from './render-system-extract';
|
|
8
|
+
|
|
9
|
+
const ROW = GPU_SCENE_LAYOUTS.material;
|
|
10
|
+
const STANDARD_PIPELINE_DERIVED = derive(STANDARD_PIPELINE_PARAM_SCHEMA);
|
|
11
|
+
|
|
12
|
+
function isNumericValue(value: unknown): value is number | readonly number[] {
|
|
13
|
+
return typeof value === 'number' || Array.isArray(value);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function numericFallback(
|
|
17
|
+
name: string,
|
|
18
|
+
material: MaterialSnapshot,
|
|
19
|
+
): number | readonly number[] | undefined {
|
|
20
|
+
switch (name) {
|
|
21
|
+
case 'baseColor':
|
|
22
|
+
return [
|
|
23
|
+
material.baseColor[0] ?? 0,
|
|
24
|
+
material.baseColor[1] ?? 0,
|
|
25
|
+
material.baseColor[2] ?? 0,
|
|
26
|
+
1,
|
|
27
|
+
];
|
|
28
|
+
case 'metallic':
|
|
29
|
+
return material.metallic;
|
|
30
|
+
case 'roughness':
|
|
31
|
+
return material.roughness;
|
|
32
|
+
case 'emissive':
|
|
33
|
+
return material.emissive ?? [0, 0, 0];
|
|
34
|
+
case 'emissiveIntensity':
|
|
35
|
+
return material.emissiveIntensity ?? 0;
|
|
36
|
+
case 'occlusionStrength':
|
|
37
|
+
return material.occlusionStrength ?? 1;
|
|
38
|
+
case 'normalScale':
|
|
39
|
+
return material.normalScale ?? 1;
|
|
40
|
+
case 'specularColor':
|
|
41
|
+
return material.specularColor ?? [1, 1, 1];
|
|
42
|
+
default:
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function numericValue(
|
|
48
|
+
name: string,
|
|
49
|
+
material: MaterialSnapshot,
|
|
50
|
+
schema: readonly ParamSchemaEntry[],
|
|
51
|
+
allowStandardFallback = false,
|
|
52
|
+
): number | readonly number[] | undefined {
|
|
53
|
+
const snapshotValue = material.paramSnapshot?.[name];
|
|
54
|
+
if (isNumericValue(snapshotValue)) return snapshotValue;
|
|
55
|
+
if (allowStandardFallback) {
|
|
56
|
+
const materialValue = numericFallback(name, material);
|
|
57
|
+
if (materialValue !== undefined) return materialValue;
|
|
58
|
+
}
|
|
59
|
+
const defaultValue = schema.find((entry) => entry.name === name)?.default;
|
|
60
|
+
if (isNumericValue(defaultValue)) return defaultValue;
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function writeScalar(view: DataView, member: UboFieldLayout, value: number): void {
|
|
65
|
+
switch (member.type) {
|
|
66
|
+
case 'f32':
|
|
67
|
+
case 'vec2':
|
|
68
|
+
case 'vec3':
|
|
69
|
+
case 'vec4':
|
|
70
|
+
case 'color':
|
|
71
|
+
view.setFloat32(member.offset, value, true);
|
|
72
|
+
return;
|
|
73
|
+
case 'i32':
|
|
74
|
+
view.setInt32(member.offset, value, true);
|
|
75
|
+
return;
|
|
76
|
+
case 'u32':
|
|
77
|
+
view.setUint32(member.offset, value, true);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function writeNumeric(
|
|
83
|
+
view: DataView,
|
|
84
|
+
member: UboFieldLayout,
|
|
85
|
+
value: number | readonly number[] | undefined,
|
|
86
|
+
): void {
|
|
87
|
+
if (member.type === 'f32' || member.type === 'i32' || member.type === 'u32') {
|
|
88
|
+
writeScalar(view, member, typeof value === 'number' ? value : (value?.[0] ?? 0));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const values = Array.isArray(value) ? value : [];
|
|
92
|
+
const count = member.type === 'vec2' ? 2 : member.type === 'vec3' ? 3 : 4;
|
|
93
|
+
for (let index = 0; index < count; index += 1) {
|
|
94
|
+
writeScalar(
|
|
95
|
+
view,
|
|
96
|
+
{ ...member, offset: member.offset + index * 4, type: 'f32' },
|
|
97
|
+
values[index] ?? 0,
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function writeVec4(view: DataView, offset: number, values: readonly number[]): void {
|
|
103
|
+
for (let index = 0; index < 4; index += 1) {
|
|
104
|
+
view.setFloat32(offset + index * 4, values[index] ?? 0, true);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function validateReceipt(receipt: MaterialShaderArtifactReceipt): void {
|
|
109
|
+
const expectedFields = ROW.fields
|
|
110
|
+
.filter((field) => !field.name.startsWith('_gpuDrivenPadding'))
|
|
111
|
+
.map((field) => field.name);
|
|
112
|
+
if (
|
|
113
|
+
receipt.materialRow.byteLength !== ROW.stride ||
|
|
114
|
+
receipt.materialRow.fields.length !== expectedFields.length ||
|
|
115
|
+
receipt.materialRow.fields.some((field, index) => field !== expectedFields[index])
|
|
116
|
+
) {
|
|
117
|
+
throw new RangeError(
|
|
118
|
+
`Standard PBR material row receipt must match the ${ROW.stride}-byte canonical ABI`,
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Pack the producer receipt's numeric Standard PBR row into the GPU Scene table. */
|
|
124
|
+
export function packStandardPbrMaterialRow(
|
|
125
|
+
receipt: MaterialShaderArtifactReceipt,
|
|
126
|
+
material: MaterialSnapshot,
|
|
127
|
+
): Uint8Array {
|
|
128
|
+
validateReceipt(receipt);
|
|
129
|
+
const payload = new Uint8Array(ROW.stride);
|
|
130
|
+
const view = new DataView(payload.buffer);
|
|
131
|
+
for (const member of STANDARD_PIPELINE_DERIVED.numericMembers) {
|
|
132
|
+
writeNumeric(
|
|
133
|
+
view,
|
|
134
|
+
member,
|
|
135
|
+
numericValue(member.name, material, STANDARD_PIPELINE_PARAM_SCHEMA, true),
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
for (const record of STANDARD_PIPELINE_DERIVED.coordinateRecords) {
|
|
139
|
+
const coordinates = material.textureCoordinates?.get(record.parameter);
|
|
140
|
+
const transform = coordinates?.transform;
|
|
141
|
+
writeVec4(view, record.offset, [
|
|
142
|
+
transform?.offset?.[0] ?? 0,
|
|
143
|
+
transform?.offset?.[1] ?? 0,
|
|
144
|
+
transform?.scale?.[0] ?? 1,
|
|
145
|
+
transform?.scale?.[1] ?? 1,
|
|
146
|
+
]);
|
|
147
|
+
writeVec4(view, record.offset + 16, [
|
|
148
|
+
coordinates?.set ?? 0,
|
|
149
|
+
transform?.rotation ?? 0,
|
|
150
|
+
coordinates?.physicalUvScale?.[0] ?? 1,
|
|
151
|
+
coordinates?.physicalUvScale?.[1] ?? 1,
|
|
152
|
+
]);
|
|
153
|
+
}
|
|
154
|
+
return payload;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Pack any producer-owned numeric/coordinate schema into the shared GPU Scene
|
|
159
|
+
* row page. Resource handles are intentionally absent: the scene-index shader
|
|
160
|
+
* reads texture/sampler bindings from the ordinary material group while this
|
|
161
|
+
* row carries only the values its generated `MaterialParameters` struct owns.
|
|
162
|
+
* `undefined` means the schema exceeds the page and must remain outside the
|
|
163
|
+
* capable lane.
|
|
164
|
+
*/
|
|
165
|
+
export function packMaterialProgramRow(
|
|
166
|
+
schema: readonly ParamSchemaEntry[],
|
|
167
|
+
material: MaterialSnapshot,
|
|
168
|
+
rowStride = ROW.stride,
|
|
169
|
+
): Uint8Array | undefined {
|
|
170
|
+
const derived = derive(schema);
|
|
171
|
+
if (derived.totalBytes > rowStride || rowStride < 16 || rowStride % 16 !== 0) return undefined;
|
|
172
|
+
const payload = new Uint8Array(rowStride);
|
|
173
|
+
const view = new DataView(payload.buffer);
|
|
174
|
+
for (const member of derived.numericMembers) {
|
|
175
|
+
writeNumeric(view, member, numericValue(member.name, material, schema));
|
|
176
|
+
}
|
|
177
|
+
for (const record of derived.coordinateRecords) {
|
|
178
|
+
const coordinates = material.textureCoordinates?.get(record.parameter);
|
|
179
|
+
const transform = coordinates?.transform;
|
|
180
|
+
writeVec4(view, record.offset, [
|
|
181
|
+
transform?.offset?.[0] ?? 0,
|
|
182
|
+
transform?.offset?.[1] ?? 0,
|
|
183
|
+
transform?.scale?.[0] ?? 1,
|
|
184
|
+
transform?.scale?.[1] ?? 1,
|
|
185
|
+
]);
|
|
186
|
+
writeVec4(view, record.offset + 16, [
|
|
187
|
+
coordinates?.set ?? 0,
|
|
188
|
+
transform?.rotation ?? 0,
|
|
189
|
+
coordinates?.physicalUvScale?.[0] ?? 1,
|
|
190
|
+
coordinates?.physicalUvScale?.[1] ?? 1,
|
|
191
|
+
]);
|
|
192
|
+
}
|
|
193
|
+
return payload;
|
|
194
|
+
}
|
package/src/materials.ts
CHANGED
|
@@ -21,6 +21,36 @@ export type MaterialTransmissionValidationReason =
|
|
|
21
21
|
| 'blend'
|
|
22
22
|
| 'depth-write';
|
|
23
23
|
|
|
24
|
+
export type MaterialAuthoringValidationReason = 'non-finite' | 'range';
|
|
25
|
+
|
|
26
|
+
/** Structured authoring failure for a built-in Standard material parameter. */
|
|
27
|
+
export class MaterialAuthoringContractError extends Error {
|
|
28
|
+
readonly code = 'material-authoring-contract-invalid' as const;
|
|
29
|
+
readonly expected =
|
|
30
|
+
'Standard material authoring values are finite and within their declared ranges';
|
|
31
|
+
readonly hint =
|
|
32
|
+
'repair the named Standard material parameter alphaCutoff before publishing the material';
|
|
33
|
+
readonly detail: {
|
|
34
|
+
readonly code: 'material-authoring-contract-invalid';
|
|
35
|
+
readonly material: 'Standard';
|
|
36
|
+
readonly parameter: 'alphaCutoff';
|
|
37
|
+
readonly reason: MaterialAuthoringValidationReason;
|
|
38
|
+
readonly actual?: unknown;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
constructor(reason: MaterialAuthoringValidationReason, actual?: unknown) {
|
|
42
|
+
super(`Materials.standard: alphaCutoff violates the authoring contract (${reason})`);
|
|
43
|
+
this.name = 'MaterialAuthoringContractError';
|
|
44
|
+
this.detail = {
|
|
45
|
+
code: 'material-authoring-contract-invalid',
|
|
46
|
+
material: 'Standard',
|
|
47
|
+
parameter: 'alphaCutoff',
|
|
48
|
+
reason,
|
|
49
|
+
...(actual === undefined ? {} : { actual }),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
24
54
|
/** Structured authoring failure for the Standard transmission contract. */
|
|
25
55
|
export class MaterialTransmissionContractError extends Error {
|
|
26
56
|
readonly code = 'material-transmission-contract-invalid' as const;
|
|
@@ -195,11 +225,6 @@ function standardParameters(
|
|
|
195
225
|
'occlusionStrength',
|
|
196
226
|
'alphaCutoff',
|
|
197
227
|
'normalScale',
|
|
198
|
-
'baseColorTexture',
|
|
199
|
-
'metallicRoughnessTexture',
|
|
200
|
-
'normalTexture',
|
|
201
|
-
'emissiveTexture',
|
|
202
|
-
'occlusionTexture',
|
|
203
228
|
'specular',
|
|
204
229
|
'specularColor',
|
|
205
230
|
// IOR is part of the always-present dielectric F0 contract. The
|
|
@@ -224,12 +249,20 @@ function standardParameters(
|
|
|
224
249
|
'thickness',
|
|
225
250
|
'attenuationColor',
|
|
226
251
|
'attenuationDistance',
|
|
227
|
-
'transmissionTexture',
|
|
228
|
-
'thicknessTexture',
|
|
229
252
|
]) {
|
|
230
253
|
baseNames.add(name);
|
|
231
254
|
}
|
|
232
255
|
}
|
|
256
|
+
// A texture declaration selects its compiled sampling path. Loading state
|
|
257
|
+
// does not: an authored but not-yet-resident slot still needs its fallback.
|
|
258
|
+
for (const parameter of DEFAULT_STANDARD_PBR_PARAM_SCHEMA) {
|
|
259
|
+
if (
|
|
260
|
+
parameter.type === 'texture2d' &&
|
|
261
|
+
opts[parameter.name as keyof StandardOpts] !== undefined
|
|
262
|
+
) {
|
|
263
|
+
baseNames.add(parameter.name);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
233
266
|
// All Standard fields come from one root schema. Physical fields are
|
|
234
267
|
// projected by the authored option membership above; appending a second
|
|
235
268
|
// physical schema would create a parallel ABI authority.
|
|
@@ -487,8 +520,11 @@ function standardDefault(opts: DefaultStandardOptions): MaterialAsset {
|
|
|
487
520
|
`Materials.standard: occlusionStrength must be in [0, 1], got ${occlusionStrength}`,
|
|
488
521
|
);
|
|
489
522
|
}
|
|
523
|
+
if (opts.alphaCutoff !== undefined && !Number.isFinite(opts.alphaCutoff)) {
|
|
524
|
+
throw new MaterialAuthoringContractError('non-finite', opts.alphaCutoff);
|
|
525
|
+
}
|
|
490
526
|
if (opts.alphaCutoff !== undefined && (opts.alphaCutoff < 0 || opts.alphaCutoff > 1)) {
|
|
491
|
-
throw new
|
|
527
|
+
throw new MaterialAuthoringContractError('range', opts.alphaCutoff);
|
|
492
528
|
}
|
|
493
529
|
validateChannel('metallicChannel', opts.metallicChannel);
|
|
494
530
|
validateChannel('roughnessChannel', opts.roughnessChannel);
|
package/src/pbr-pipeline.ts
CHANGED
|
@@ -34,6 +34,7 @@ import type {
|
|
|
34
34
|
} from '@forgeax/engine-rhi';
|
|
35
35
|
import {
|
|
36
36
|
type ShaderCatalog,
|
|
37
|
+
STANDARD_PHYSICAL_TEXTURE_FIELDS,
|
|
37
38
|
STANDARD_PIPELINE_PARAM_SCHEMA,
|
|
38
39
|
standardPhysicalTextureFields,
|
|
39
40
|
} from '@forgeax/engine-shader';
|
|
@@ -154,7 +155,7 @@ export function buildPbrMaterialUserRegionEntries(
|
|
|
154
155
|
// Project the engine-owned entry shape into the DOM WebGPU descriptor. Omit
|
|
155
156
|
// absent optional members so exactOptionalPropertyTypes remains true at the
|
|
156
157
|
// boundary instead of leaking an `undefined` property into the descriptor.
|
|
157
|
-
|
|
158
|
+
let entries = derived.bglEntries.map(
|
|
158
159
|
(entry): GPUBindGroupLayoutEntry => ({
|
|
159
160
|
binding: entry.binding,
|
|
160
161
|
visibility: entry.visibility,
|
|
@@ -164,9 +165,11 @@ export function buildPbrMaterialUserRegionEntries(
|
|
|
164
165
|
...(entry.storageTexture === undefined ? {} : { storageTexture: entry.storageTexture }),
|
|
165
166
|
}),
|
|
166
167
|
);
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
//
|
|
168
|
+
// The record path always owns one dynamic material-UBO slot, even when an
|
|
169
|
+
// authored shader declares no numeric parameters (an empty paramSchema).
|
|
170
|
+
// Reserve that slot here so the IBL/transmission injection starts at the
|
|
171
|
+
// same binding used by `buildPerSubmeshMaterialBg`; otherwise binding 0 in
|
|
172
|
+
// the layout is a cube texture while the record path submits a UBO.
|
|
170
173
|
const ubo = entries[0];
|
|
171
174
|
if (ubo !== undefined && ubo.binding === 0 && ubo.buffer?.type === 'uniform') {
|
|
172
175
|
entries[0] = {
|
|
@@ -174,6 +177,15 @@ export function buildPbrMaterialUserRegionEntries(
|
|
|
174
177
|
visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
|
|
175
178
|
buffer: { type: 'uniform', hasDynamicOffset: true },
|
|
176
179
|
};
|
|
180
|
+
} else {
|
|
181
|
+
entries = [
|
|
182
|
+
{
|
|
183
|
+
binding: 0,
|
|
184
|
+
visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
|
|
185
|
+
buffer: { type: 'uniform', hasDynamicOffset: true },
|
|
186
|
+
},
|
|
187
|
+
...entries.map((entry) => ({ ...entry, binding: entry.binding + 1 })),
|
|
188
|
+
];
|
|
177
189
|
}
|
|
178
190
|
return entries;
|
|
179
191
|
}
|
|
@@ -351,16 +363,22 @@ export function physicalTextureFields(paramSchema: readonly ParamSchemaEntry[]):
|
|
|
351
363
|
}
|
|
352
364
|
|
|
353
365
|
export function appendTextureInjection(
|
|
354
|
-
|
|
366
|
+
_bgl: readonly GPUBindGroupLayoutEntry[],
|
|
355
367
|
fields: readonly string[],
|
|
356
368
|
): GPUBindGroupLayoutEntry[] {
|
|
357
|
-
const start = bgl.length;
|
|
358
369
|
const fieldSet = new Set(fields);
|
|
370
|
+
// Physical resources use the Standard root's fixed slots (26 + canonical
|
|
371
|
+
// index * 2). Do not compact an authored subset: the shader template and
|
|
372
|
+
// scene-index receipt share these canonical bindings, while gaps simply
|
|
373
|
+
// represent physical axes omitted by the selected root contract.
|
|
359
374
|
return standardPhysicalTextureFields(
|
|
360
|
-
|
|
361
|
-
|
|
375
|
+
STANDARD_PIPELINE_PARAM_SCHEMA.concat(
|
|
376
|
+
fields.map((name) => ({ name, type: 'texture2d' as const })),
|
|
377
|
+
),
|
|
378
|
+
).flatMap((field) => {
|
|
362
379
|
if (!fieldSet.has(field)) return [];
|
|
363
|
-
const
|
|
380
|
+
const canonicalIndex = STANDARD_PHYSICAL_TEXTURE_FIELDS.indexOf(field);
|
|
381
|
+
const binding = 26 + canonicalIndex * 2;
|
|
364
382
|
return [
|
|
365
383
|
{
|
|
366
384
|
binding,
|
|
@@ -426,6 +444,8 @@ export interface PbrCaps {
|
|
|
426
444
|
readonly probeBlend?: boolean;
|
|
427
445
|
/** Whether the device can carry the optional SpotLight projector texture. */
|
|
428
446
|
readonly projectorAvailable?: boolean;
|
|
447
|
+
/** Omit unused backdrop slots on minimum-limit devices; physical slots stay fixed. */
|
|
448
|
+
readonly transmissionBackdrop?: boolean;
|
|
429
449
|
}
|
|
430
450
|
|
|
431
451
|
/**
|
|
@@ -441,7 +461,7 @@ export interface PbrCaps {
|
|
|
441
461
|
* fragment-only). feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1.
|
|
442
462
|
* binding 6 = point shadow params UBO (`array<vec4<f32>, 4>`, 64 B;
|
|
443
463
|
* fragment-only). One lane per shadow-casting point light slot
|
|
444
|
-
* (shadowAtlasLayer in [0, 4)) carrying `(near, far,
|
|
464
|
+
* (shadowAtlasLayer in [0, 4)) carrying `(near, far, depthBias, normalBias)`.
|
|
445
465
|
* binding 7 = shadowCasterCascade UBO (16 B; vertex + fragment). Per-pass
|
|
446
466
|
* cascade-index uniform consumed exclusively by `shadow_caster.wgsl` to
|
|
447
467
|
* pick `view.lightViewProj_X` for the cascade currently being rasterized
|
|
@@ -506,7 +526,7 @@ export function buildPbrViewBglEntries(caps: PbrCaps): GPUBindGroupLayoutEntry[]
|
|
|
506
526
|
// feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1: point shadow
|
|
507
527
|
// params UBO. Carries `array<vec4<f32>, 4>` = 64 B with one lane per
|
|
508
528
|
// shadow-casting point light slot (shadowAtlasLayer in [0, 4)). Each
|
|
509
|
-
// lane stores `(near, far,
|
|
529
|
+
// lane stores `(near, far, depthBias, normalBias)` so the fragment-shader
|
|
510
530
|
// depth-ref reconstruction (lighting-punctual.wgsl evalPointShadowed)
|
|
511
531
|
// can avoid sampling DirectLightSlot for the URP path. The shared
|
|
512
532
|
// DirectLightSlot metadata remains the identity owner, so binding 6 is
|
|
@@ -648,7 +668,10 @@ export function buildPbrPipelineLayouts(
|
|
|
648
668
|
// The transmission start binding is computed from the post-Skylight BGL
|
|
649
669
|
// length (= 22 for the canonical Standard schema) by appendInjection.
|
|
650
670
|
const materialBglRes = device.createBindGroupLayout(
|
|
651
|
-
buildBindGroupLayoutDescriptor(BGL_ONLY_SPEC_STUB, {
|
|
671
|
+
buildBindGroupLayoutDescriptor(BGL_ONLY_SPEC_STUB, {
|
|
672
|
+
kind: 'pbr-material-merged',
|
|
673
|
+
caps,
|
|
674
|
+
}),
|
|
652
675
|
);
|
|
653
676
|
if (!materialBglRes.ok) throw materialBglRes.error;
|
|
654
677
|
|
|
@@ -751,10 +774,26 @@ export function isStandardPbrSkinMaterialShader(shaderId: string | undefined): b
|
|
|
751
774
|
);
|
|
752
775
|
}
|
|
753
776
|
|
|
754
|
-
export function shadowCasterVariantSet(
|
|
777
|
+
export function shadowCasterVariantSet(
|
|
778
|
+
storageBuffer: boolean,
|
|
779
|
+
skinned: boolean,
|
|
780
|
+
gpuDrivenSceneIndex = false,
|
|
781
|
+
alphaMask = false,
|
|
782
|
+
vertexColorAvailable = false,
|
|
783
|
+
): string {
|
|
755
784
|
const skinningDisabled = !skinned;
|
|
756
|
-
|
|
757
|
-
|
|
785
|
+
const defines: Record<string, boolean> = {
|
|
786
|
+
ALPHA_MASK: alphaMask,
|
|
787
|
+
GPU_DRIVEN_SCENE_INDEX_AVAILABLE: gpuDrivenSceneIndex,
|
|
788
|
+
GPU_DRIVEN_SCENE_INDEX_EXPLICIT: false,
|
|
789
|
+
SKINNING_DISABLED: skinningDisabled,
|
|
790
|
+
STORAGE_BUFFER_AVAILABLE: storageBuffer,
|
|
791
|
+
};
|
|
792
|
+
if (vertexColorAvailable) defines.VERTEX_COLOR_AVAILABLE = true;
|
|
793
|
+
return Object.entries(defines)
|
|
794
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
795
|
+
.map(([name, value]) => `${name}=${String(value)}`)
|
|
796
|
+
.join('+');
|
|
758
797
|
}
|
|
759
798
|
|
|
760
799
|
export function isSkinnedShadowCasterVariant(
|
|
@@ -894,6 +933,65 @@ export function buildPbrSkinLayouts(
|
|
|
894
933
|
};
|
|
895
934
|
}
|
|
896
935
|
|
|
936
|
+
/**
|
|
937
|
+
* Build the dedicated slot-3 layout used by scene-index GPU-driven draws.
|
|
938
|
+
*
|
|
939
|
+
* Direct material draws deliberately keep `pbr-instances-bgl` at binding(0),
|
|
940
|
+
* and ProbeBlend deliberately owns binding(1). The scene-index stream is
|
|
941
|
+
* therefore a separate BGL at binding(2), rather than an optional entry added
|
|
942
|
+
* to the direct layout. This keeps every bind group complete for its shader
|
|
943
|
+
* and prevents a direct draw from having to bind a dummy visible stream.
|
|
944
|
+
*/
|
|
945
|
+
export function buildGpuDrivenPbrInstancesBindGroupLayout(
|
|
946
|
+
device: PbrPipelineDevice,
|
|
947
|
+
caps: PbrCaps,
|
|
948
|
+
): BindGroupLayout {
|
|
949
|
+
if (!caps.storageBuffer) {
|
|
950
|
+
throw new Error('GPU-driven PBR instances layout requires storage-buffer capability');
|
|
951
|
+
}
|
|
952
|
+
const result = device.createBindGroupLayout(
|
|
953
|
+
buildBindGroupLayoutDescriptor(BGL_ONLY_SPEC_STUB, {
|
|
954
|
+
kind: 'pbr-gpu-driven-instances',
|
|
955
|
+
caps,
|
|
956
|
+
}),
|
|
957
|
+
);
|
|
958
|
+
if (!result.ok) throw result.error;
|
|
959
|
+
return result.value;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
/** Build the four-slot rigid scene-index pipeline layout. */
|
|
963
|
+
export function buildGpuDrivenPbrPipelineLayout(
|
|
964
|
+
device: PbrPipelineDevice,
|
|
965
|
+
pbr: PbrPipelineLayoutBundle,
|
|
966
|
+
gpuDrivenInstancesBgl: BindGroupLayout,
|
|
967
|
+
): PipelineLayout {
|
|
968
|
+
const result = device.createPipelineLayout({
|
|
969
|
+
label: 'pbr-gpu-driven-pl',
|
|
970
|
+
bindGroupLayouts: [pbr.viewBgl, pbr.materialBgl, pbr.meshArrayBgl, gpuDrivenInstancesBgl],
|
|
971
|
+
});
|
|
972
|
+
if (!result.ok) throw result.error;
|
|
973
|
+
return result.value;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
/** Build the four-slot skinned scene-index pipeline layout. */
|
|
977
|
+
export function buildGpuDrivenPbrSkinPipelineLayout(
|
|
978
|
+
device: PbrPipelineDevice,
|
|
979
|
+
pbrSkin: PbrPipelineLayoutBundle,
|
|
980
|
+
gpuDrivenInstancesBgl: BindGroupLayout,
|
|
981
|
+
): PipelineLayout {
|
|
982
|
+
const result = device.createPipelineLayout({
|
|
983
|
+
label: 'pbr-skin-gpu-driven-pl',
|
|
984
|
+
bindGroupLayouts: [
|
|
985
|
+
pbrSkin.viewBgl,
|
|
986
|
+
pbrSkin.materialBgl,
|
|
987
|
+
pbrSkin.meshArrayBgl,
|
|
988
|
+
gpuDrivenInstancesBgl,
|
|
989
|
+
],
|
|
990
|
+
});
|
|
991
|
+
if (!result.ok) throw result.error;
|
|
992
|
+
return result.value;
|
|
993
|
+
}
|
|
994
|
+
|
|
897
995
|
/** Project the canonical group(2) resources for a PBR skin draw. */
|
|
898
996
|
export function createPbrSkinMeshBindGroupEntries(
|
|
899
997
|
meshBuffer: Buffer,
|
|
@@ -1064,7 +1162,9 @@ export const SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET = '';
|
|
|
1064
1162
|
* (directional 3/4, point 5/6, cascade 7, spot atlas 8; the former
|
|
1065
1163
|
* spot lightViewProj matrices moved into the View UBO)
|
|
1066
1164
|
* - `'pbr-mesh-array'` — 1 entry: per-entity mesh SSBO (dynamic-offset)
|
|
1067
|
-
* - `'pbr-instances'` —
|
|
1165
|
+
* - `'pbr-instances'` — 2 entries: per-instance SSBO plus the compact
|
|
1166
|
+
* visible-item index stream (the second entry is used only by the
|
|
1167
|
+
* scene-index vertex entry and shares the frame's instance bind group)
|
|
1068
1168
|
* - `'pbr-skin-mesh-array'` — 3 entries: meshes + current/previous palette
|
|
1069
1169
|
* 3. Attachment-driven (fullscreen post-process):
|
|
1070
1170
|
* - `'fullscreen-post'` — 2 entries: input texture + sampler. The texture
|
|
@@ -1084,6 +1184,7 @@ export type BglKind =
|
|
|
1084
1184
|
| 'pbr-material-merged'
|
|
1085
1185
|
| 'pbr-mesh-array'
|
|
1086
1186
|
| 'pbr-instances'
|
|
1187
|
+
| 'pbr-gpu-driven-instances'
|
|
1087
1188
|
| 'pbr-skin-mesh-array'
|
|
1088
1189
|
| 'unlit-material'
|
|
1089
1190
|
| 'hdrp-7-slot'
|
|
@@ -1318,6 +1419,41 @@ export function buildBindGroupLayoutDescriptor(
|
|
|
1318
1419
|
),
|
|
1319
1420
|
};
|
|
1320
1421
|
}
|
|
1422
|
+
case 'pbr-gpu-driven-instances': {
|
|
1423
|
+
const caps = options.caps ?? { storageBuffer: true };
|
|
1424
|
+
const meshBufType: GPUBufferBindingType = caps.storageBuffer
|
|
1425
|
+
? 'read-only-storage'
|
|
1426
|
+
: 'uniform';
|
|
1427
|
+
// GPU-driven scene-index draws use a physically distinct slot-3 layout.
|
|
1428
|
+
// The ordinary instances BGL intentionally stays one-entry for direct
|
|
1429
|
+
// draws, while ProbeBlend owns binding(1). Keep the compact visible
|
|
1430
|
+
// `(meshRow, materialRow)` stream at binding(2) so a future probe-enabled
|
|
1431
|
+
// GPU variant can coexist without colliding with the probe record.
|
|
1432
|
+
return {
|
|
1433
|
+
label: 'pbr-gpu-driven-instances-bgl',
|
|
1434
|
+
entries: [
|
|
1435
|
+
{
|
|
1436
|
+
binding: 0,
|
|
1437
|
+
visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
|
|
1438
|
+
buffer: { type: meshBufType, hasDynamicOffset: false },
|
|
1439
|
+
},
|
|
1440
|
+
{
|
|
1441
|
+
// ShadowCaster's scene-index entry still reads the visible row
|
|
1442
|
+
// through binding(1). Keep this alias in the dedicated layout so
|
|
1443
|
+
// the shared visible bind group can serve both the Standard PBR
|
|
1444
|
+
// (binding(2)) and depth-only shadow (binding(1)) consumers.
|
|
1445
|
+
binding: 1,
|
|
1446
|
+
visibility: GPU_SHADER_STAGE_VERTEX,
|
|
1447
|
+
buffer: { type: meshBufType, hasDynamicOffset: false },
|
|
1448
|
+
},
|
|
1449
|
+
{
|
|
1450
|
+
binding: 2,
|
|
1451
|
+
visibility: GPU_SHADER_STAGE_VERTEX,
|
|
1452
|
+
buffer: { type: meshBufType, hasDynamicOffset: false },
|
|
1453
|
+
},
|
|
1454
|
+
],
|
|
1455
|
+
};
|
|
1456
|
+
}
|
|
1321
1457
|
case 'pbr-skin-mesh-array': {
|
|
1322
1458
|
const caps = options.caps ?? { storageBuffer: true };
|
|
1323
1459
|
const meshBufType: GPUBufferBindingType = caps.storageBuffer
|
|
@@ -1328,7 +1464,7 @@ export function buildBindGroupLayoutDescriptor(
|
|
|
1328
1464
|
entries: [
|
|
1329
1465
|
{
|
|
1330
1466
|
binding: 0,
|
|
1331
|
-
visibility: GPU_SHADER_STAGE_VERTEX,
|
|
1467
|
+
visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
|
|
1332
1468
|
buffer: { type: meshBufType, hasDynamicOffset: true },
|
|
1333
1469
|
},
|
|
1334
1470
|
{
|
|
@@ -1369,12 +1505,29 @@ export function buildBindGroupLayoutDescriptor(
|
|
|
1369
1505
|
const afterIbl = [...userRegion, ...appendInjection(userRegion, 'ibl')];
|
|
1370
1506
|
const afterTransmission = [...afterIbl, ...appendInjection(afterIbl, 'transmission')];
|
|
1371
1507
|
const merged = [
|
|
1372
|
-
...afterTransmission,
|
|
1508
|
+
...(options.caps?.transmissionBackdrop === false ? afterIbl : afterTransmission),
|
|
1373
1509
|
...appendTextureInjection(afterTransmission, physicalFields),
|
|
1374
1510
|
];
|
|
1511
|
+
// Scene-index Standard variants consume one producer-owned material row
|
|
1512
|
+
// after the complete fixed physical range. Keeping it at binding 46
|
|
1513
|
+
// prevents any authored physical subset from aliasing the row.
|
|
1514
|
+
if (options.caps?.storageBuffer ?? true) {
|
|
1515
|
+
merged.push({
|
|
1516
|
+
binding: 46,
|
|
1517
|
+
visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
|
|
1518
|
+
buffer: { type: 'read-only-storage', hasDynamicOffset: false },
|
|
1519
|
+
});
|
|
1520
|
+
}
|
|
1375
1521
|
return {
|
|
1376
1522
|
label: 'pbr-material-skylight-bgl',
|
|
1377
|
-
entries:
|
|
1523
|
+
entries: [
|
|
1524
|
+
...merged,
|
|
1525
|
+
{
|
|
1526
|
+
binding: 47,
|
|
1527
|
+
visibility: GPU_SHADER_STAGE_FRAGMENT,
|
|
1528
|
+
texture: { sampleType: 'float', viewDimension: 'cube' },
|
|
1529
|
+
},
|
|
1530
|
+
],
|
|
1378
1531
|
};
|
|
1379
1532
|
}
|
|
1380
1533
|
case 'unlit-material': {
|