@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
|
@@ -2,12 +2,13 @@ import type { EntityHandle, World } from '@forgeax/engine-ecs';
|
|
|
2
2
|
import { FixedTime } from '@forgeax/engine-ecs';
|
|
3
3
|
import { AssetGuid } from '@forgeax/engine-pack/guid';
|
|
4
4
|
import { Transform } from '@forgeax/engine-scene';
|
|
5
|
-
import { err, type Handle, type Result } from '@forgeax/engine-types';
|
|
5
|
+
import { err, type Handle, ok, type Result } from '@forgeax/engine-types';
|
|
6
6
|
import { MeshFilter } from '../components/mesh-filter';
|
|
7
7
|
import { MeshRenderer } from '../components/mesh-renderer';
|
|
8
8
|
import type { GpuResidencyCache } from '../device/gpu-residency';
|
|
9
9
|
import type { MeshResidencyLease } from '../device/mesh-residency-lifetime';
|
|
10
10
|
import {
|
|
11
|
+
createDynamicGeometryLifecycle,
|
|
11
12
|
type DynamicGeometryCandidate,
|
|
12
13
|
DynamicGeometryError,
|
|
13
14
|
type DynamicGeometryLifecycle,
|
|
@@ -25,6 +26,15 @@ export interface DynamicGeometryHostImplementation {
|
|
|
25
26
|
candidate: DynamicGeometryCandidate,
|
|
26
27
|
ordering: DynamicGeometryOrdering,
|
|
27
28
|
): Result<DynamicGeometryCandidate, DynamicGeometryError>;
|
|
29
|
+
/**
|
|
30
|
+
* Atomically swap distinct entities in one attached World. Returned failures
|
|
31
|
+
* retain old bindings; an uncertain rollback throws to require paired rebuild.
|
|
32
|
+
* Invoke inside PhysicsWorld.admitDerivedShapeCandidates commitGeometry.
|
|
33
|
+
*/
|
|
34
|
+
acceptDynamicGeometryCandidates(
|
|
35
|
+
candidates: readonly DynamicGeometryCandidate[],
|
|
36
|
+
ordering: DynamicGeometryOrdering,
|
|
37
|
+
): Result<readonly DynamicGeometryCandidate[], DynamicGeometryError>;
|
|
28
38
|
dynamicGeometryReceipt(candidate: DynamicGeometryCandidate): DynamicGeometryReceipt | undefined;
|
|
29
39
|
cancelDynamicGeometry(candidate: DynamicGeometryCandidate): Result<void, DynamicGeometryError>;
|
|
30
40
|
retireDynamicGeometry(candidate: DynamicGeometryCandidate): Result<void, DynamicGeometryError>;
|
|
@@ -269,7 +279,188 @@ export function createDynamicGeometryHost(options: {
|
|
|
269
279
|
else void completion.then(finish, finish);
|
|
270
280
|
return completion;
|
|
271
281
|
};
|
|
272
|
-
|
|
282
|
+
const acceptCandidate = (
|
|
283
|
+
candidate: DynamicGeometryCandidate,
|
|
284
|
+
ordering: DynamicGeometryOrdering,
|
|
285
|
+
deferredSupersession?: Set<HostCandidateRecord>,
|
|
286
|
+
): Result<DynamicGeometryCandidate, DynamicGeometryError> => {
|
|
287
|
+
synchronizeGeneration();
|
|
288
|
+
const world = candidate.world as World;
|
|
289
|
+
const hostRecordById = hostCandidates.get(candidate.candidateId);
|
|
290
|
+
const hostRecord = candidateRecord(candidate);
|
|
291
|
+
if (hostRecord === undefined && hostRecordById !== undefined)
|
|
292
|
+
return err(
|
|
293
|
+
new DynamicGeometryError(
|
|
294
|
+
'dynamic-geometry-receipt-mismatch',
|
|
295
|
+
'admission uses the exact host candidate owner and lifecycle credential',
|
|
296
|
+
'discard the altered credential and use the value returned by preparation',
|
|
297
|
+
{ candidateId: candidate.candidateId },
|
|
298
|
+
),
|
|
299
|
+
);
|
|
300
|
+
if (hostRecord !== undefined && candidate.state !== 'prepared')
|
|
301
|
+
return err(
|
|
302
|
+
new DynamicGeometryError(
|
|
303
|
+
'dynamic-geometry-candidate-state',
|
|
304
|
+
'admission consumes a prepared candidate exactly once',
|
|
305
|
+
'retain the accepted or published candidate receipt instead of admitting it again',
|
|
306
|
+
{ candidateId: candidate.candidateId },
|
|
307
|
+
),
|
|
308
|
+
);
|
|
309
|
+
if (ordering === undefined || !attachedWorlds.has(world) || ordering.world !== candidate.world)
|
|
310
|
+
return err(
|
|
311
|
+
new DynamicGeometryError(
|
|
312
|
+
'dynamic-geometry-world-not-attached',
|
|
313
|
+
'candidate and fixed-step ordering belong to the same attached World',
|
|
314
|
+
'attach the World and submit its PhysicsWorld ordering before accepting geometry',
|
|
315
|
+
{ candidateId: candidate.candidateId },
|
|
316
|
+
),
|
|
317
|
+
);
|
|
318
|
+
if (!candidate.gpuReady)
|
|
319
|
+
return err(
|
|
320
|
+
new DynamicGeometryError(
|
|
321
|
+
'dynamic-geometry-gpu-not-ready',
|
|
322
|
+
'candidate has standard GPU residency before acceptance',
|
|
323
|
+
'prepare with an existing MeshAsset shared handle and repair residency failures',
|
|
324
|
+
{ candidateId: candidate.candidateId },
|
|
325
|
+
),
|
|
326
|
+
);
|
|
327
|
+
if (
|
|
328
|
+
hostRecord === undefined ||
|
|
329
|
+
!hasRenderableBinding(world, candidate.entity) ||
|
|
330
|
+
!hasMaterialIdentity(world, candidate.entity, candidate.mesh, candidate.materialIdentity)
|
|
331
|
+
)
|
|
332
|
+
return err(
|
|
333
|
+
new DynamicGeometryError(
|
|
334
|
+
'dynamic-geometry-invalid',
|
|
335
|
+
'the candidate is bound to a live ECS MeshFilter and MeshRenderer',
|
|
336
|
+
'keep the candidate MeshFilter binding intact until the consuming draw',
|
|
337
|
+
{ candidateId: candidate.candidateId },
|
|
338
|
+
),
|
|
339
|
+
);
|
|
340
|
+
if (meshHandleOf(world, candidate.entity) !== hostRecord.previousMeshHandle)
|
|
341
|
+
return err(
|
|
342
|
+
new DynamicGeometryError(
|
|
343
|
+
'dynamic-geometry-invalid',
|
|
344
|
+
'the old MeshFilter binding remains visible until candidate acceptance',
|
|
345
|
+
'do not replace the live ECS binding while geometry is prepared',
|
|
346
|
+
{ candidateId: candidate.candidateId },
|
|
347
|
+
),
|
|
348
|
+
);
|
|
349
|
+
const currentFixedStep = fixedStepOf(world);
|
|
350
|
+
if (
|
|
351
|
+
currentFixedStep === undefined ||
|
|
352
|
+
candidate.fixedStep === undefined ||
|
|
353
|
+
candidate.fixedStep > currentFixedStep ||
|
|
354
|
+
ordering.fixedStep !== currentFixedStep
|
|
355
|
+
)
|
|
356
|
+
return err(
|
|
357
|
+
new DynamicGeometryError(
|
|
358
|
+
'dynamic-geometry-ordering-required',
|
|
359
|
+
'ordering matches the current World tick, no earlier than preparation',
|
|
360
|
+
'accept a prepared candidate during the current fixed-step admission',
|
|
361
|
+
{
|
|
362
|
+
candidateId: candidate.candidateId,
|
|
363
|
+
actual: {
|
|
364
|
+
candidate: candidate.fixedStep,
|
|
365
|
+
currentFixedStep,
|
|
366
|
+
ordering: ordering.fixedStep,
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
),
|
|
370
|
+
);
|
|
371
|
+
if (candidate.physicsEntity !== undefined) {
|
|
372
|
+
const publication = physicsPublicationOf(world, candidate.physicsEntity, true);
|
|
373
|
+
if (
|
|
374
|
+
publication === undefined ||
|
|
375
|
+
publication.fixedStep !== currentFixedStep ||
|
|
376
|
+
publication.revision !== candidate.revision
|
|
377
|
+
)
|
|
378
|
+
return err(
|
|
379
|
+
new DynamicGeometryError(
|
|
380
|
+
'dynamic-geometry-ordering-required',
|
|
381
|
+
'candidate physicsEntity has the active paired PhysicsWorld admission',
|
|
382
|
+
'accept geometry inside admitDerivedShapeCandidate commitGeometry, before physics step',
|
|
383
|
+
{ candidateId: candidate.candidateId, actual: publication },
|
|
384
|
+
),
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
// One ECS MeshFilter has one visible geometry owner. Once this
|
|
388
|
+
// candidate is accepted, any older prepared/accepted candidate for the
|
|
389
|
+
// same entity can no longer become a receipt-bearing draw. Cancel it
|
|
390
|
+
// after the new ECS swap so its candidate-only residency is no longer
|
|
391
|
+
// protected as the live draw owner. Published candidates stay
|
|
392
|
+
// receipt-bound and are retired independently.
|
|
393
|
+
const superseded = [...hostCandidates.values()].filter(
|
|
394
|
+
(record) =>
|
|
395
|
+
record.candidate.candidateId !== candidate.candidateId &&
|
|
396
|
+
record.world === world &&
|
|
397
|
+
record.entity === candidate.entity &&
|
|
398
|
+
!record.published,
|
|
399
|
+
);
|
|
400
|
+
const accepted = lifecycle.accept(candidate, ordering);
|
|
401
|
+
if (!accepted.ok) return accepted;
|
|
402
|
+
const swapped = world.set(candidate.entity as EntityHandle, MeshFilter, {
|
|
403
|
+
assetHandle: hostRecord.meshHandle,
|
|
404
|
+
});
|
|
405
|
+
if (!swapped.ok) {
|
|
406
|
+
lifecycle.cancel(accepted.value);
|
|
407
|
+
hostCandidates.delete(candidate.candidateId);
|
|
408
|
+
cleanupCandidateResidency(hostRecord);
|
|
409
|
+
const released = releaseMeshLeases(hostRecord);
|
|
410
|
+
if (released !== undefined) return err(released);
|
|
411
|
+
return err(
|
|
412
|
+
new DynamicGeometryError(
|
|
413
|
+
'dynamic-geometry-invalid',
|
|
414
|
+
'the candidate MeshFilter swap commits through the ECS write barrier',
|
|
415
|
+
'restore the live entity and retry from a fresh candidate',
|
|
416
|
+
{ candidateId: candidate.candidateId, actual: swapped.error },
|
|
417
|
+
),
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
hostRecord.candidate = accepted.value;
|
|
421
|
+
hostRecord.accepted = true;
|
|
422
|
+
if (deferredSupersession === undefined) options.onTopologyChanged?.();
|
|
423
|
+
// Keep the World handle leased through the final GPU submission; its slot
|
|
424
|
+
// must not be reused while a retired frame still references the old mesh.
|
|
425
|
+
// Cleanup happens only after the new ECS MeshFilter is visible. Before
|
|
426
|
+
// the swap, hasMeshBinding intentionally protects the older candidate's
|
|
427
|
+
// GPU copy because it is still the live draw owner.
|
|
428
|
+
if (deferredSupersession !== undefined) {
|
|
429
|
+
for (const record of superseded) deferredSupersession.add(record);
|
|
430
|
+
return accepted;
|
|
431
|
+
}
|
|
432
|
+
for (const record of superseded) {
|
|
433
|
+
const completion = cleanupCandidateResidency(record);
|
|
434
|
+
const cancelled = lifecycle.cancel(record.candidate, completion);
|
|
435
|
+
if (!cancelled.ok && cancelled.error.code !== 'dynamic-geometry-candidate-not-found') {
|
|
436
|
+
const restored = world.set(candidate.entity as EntityHandle, MeshFilter, {
|
|
437
|
+
assetHandle: hostRecord.previousMeshHandle,
|
|
438
|
+
});
|
|
439
|
+
lifecycle.cancel(accepted.value);
|
|
440
|
+
hostCandidates.delete(candidate.candidateId);
|
|
441
|
+
cleanupCandidateResidency(hostRecord);
|
|
442
|
+
releasePreviousMeshLease(hostRecord);
|
|
443
|
+
return err(
|
|
444
|
+
new DynamicGeometryError(
|
|
445
|
+
'dynamic-geometry-invalid',
|
|
446
|
+
'candidate supersession cancels the prior credential atomically',
|
|
447
|
+
'keep the prior ECS binding and candidate lifecycle intact when supersession fails',
|
|
448
|
+
{
|
|
449
|
+
candidateId: candidate.candidateId,
|
|
450
|
+
actual: {
|
|
451
|
+
cancelled: cancelled.error,
|
|
452
|
+
restored: restored.ok ? undefined : restored.error,
|
|
453
|
+
},
|
|
454
|
+
},
|
|
455
|
+
),
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
hostCandidates.delete(record.candidate.candidateId);
|
|
459
|
+
scheduleCandidateCleanup(record);
|
|
460
|
+
}
|
|
461
|
+
return accepted;
|
|
462
|
+
};
|
|
463
|
+
const host: DynamicGeometryHostImplementation = {
|
|
273
464
|
prepareDynamicGeometry(input) {
|
|
274
465
|
const generation = synchronizeGeneration();
|
|
275
466
|
const world = input.world as World;
|
|
@@ -463,182 +654,64 @@ export function createDynamicGeometryHost(options: {
|
|
|
463
654
|
});
|
|
464
655
|
return prepared;
|
|
465
656
|
},
|
|
466
|
-
acceptDynamicGeometry(candidate, ordering)
|
|
657
|
+
acceptDynamicGeometry: (candidate, ordering) => acceptCandidate(candidate, ordering),
|
|
658
|
+
acceptDynamicGeometryCandidates(candidates, ordering) {
|
|
467
659
|
synchronizeGeneration();
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
const hostRecord = candidateRecord(candidate);
|
|
471
|
-
if (hostRecord === undefined && hostRecordById !== undefined)
|
|
472
|
-
return err(
|
|
473
|
-
new DynamicGeometryError(
|
|
474
|
-
'dynamic-geometry-receipt-mismatch',
|
|
475
|
-
'admission uses the exact host candidate owner and lifecycle credential',
|
|
476
|
-
'discard the altered credential and use the value returned by preparation',
|
|
477
|
-
{ candidateId: candidate.candidateId },
|
|
478
|
-
),
|
|
479
|
-
);
|
|
480
|
-
if (hostRecord !== undefined && candidate.state !== 'prepared')
|
|
481
|
-
return err(
|
|
482
|
-
new DynamicGeometryError(
|
|
483
|
-
'dynamic-geometry-candidate-state',
|
|
484
|
-
'admission consumes a prepared candidate exactly once',
|
|
485
|
-
'retain the accepted or published candidate receipt instead of admitting it again',
|
|
486
|
-
{ candidateId: candidate.candidateId },
|
|
487
|
-
),
|
|
488
|
-
);
|
|
489
|
-
if (
|
|
490
|
-
ordering === undefined ||
|
|
491
|
-
!attachedWorlds.has(world) ||
|
|
492
|
-
ordering.world !== candidate.world
|
|
493
|
-
)
|
|
494
|
-
return err(
|
|
495
|
-
new DynamicGeometryError(
|
|
496
|
-
'dynamic-geometry-world-not-attached',
|
|
497
|
-
'candidate and fixed-step ordering belong to the same attached World',
|
|
498
|
-
'attach the World and submit its PhysicsWorld ordering before accepting geometry',
|
|
499
|
-
{ candidateId: candidate.candidateId },
|
|
500
|
-
),
|
|
501
|
-
);
|
|
502
|
-
if (!candidate.gpuReady)
|
|
503
|
-
return err(
|
|
504
|
-
new DynamicGeometryError(
|
|
505
|
-
'dynamic-geometry-gpu-not-ready',
|
|
506
|
-
'candidate has standard GPU residency before acceptance',
|
|
507
|
-
'prepare with an existing MeshAsset shared handle and repair residency failures',
|
|
508
|
-
{ candidateId: candidate.candidateId },
|
|
509
|
-
),
|
|
510
|
-
);
|
|
660
|
+
// The existing lifecycle's candidate budget bounds this group; there is
|
|
661
|
+
// no second queue or independently tunable batch allocation limit.
|
|
511
662
|
if (
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
663
|
+
candidates.length === 0 ||
|
|
664
|
+
candidates.length > hostCandidates.size ||
|
|
665
|
+
new Set(candidates.map((candidate) => candidate.entity)).size !== candidates.length ||
|
|
666
|
+
candidates.some(
|
|
667
|
+
(candidate) =>
|
|
668
|
+
candidate.world !== ordering?.world || candidateRecord(candidate) === undefined,
|
|
669
|
+
)
|
|
515
670
|
)
|
|
516
671
|
return err(
|
|
517
672
|
new DynamicGeometryError(
|
|
518
673
|
'dynamic-geometry-invalid',
|
|
519
|
-
'
|
|
520
|
-
'
|
|
521
|
-
{ candidateId: candidate.candidateId },
|
|
674
|
+
'a geometry group contains owned candidates for distinct entities in one World',
|
|
675
|
+
'prepare one candidate per entity and accept the nonempty group in its paired physics admission',
|
|
522
676
|
),
|
|
523
677
|
);
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
678
|
+
const accepted: DynamicGeometryCandidate[] = [];
|
|
679
|
+
const superseded = new Set<HostCandidateRecord>();
|
|
680
|
+
const rollback = (): void => {
|
|
681
|
+
const failures: DynamicGeometryError[] = [];
|
|
682
|
+
for (const candidate of [...accepted].reverse()) {
|
|
683
|
+
const result = host.cancelDynamicGeometry(candidate);
|
|
684
|
+
if (!result.ok) failures.push(result.error);
|
|
685
|
+
}
|
|
686
|
+
// A returned failure promises old state. A throw deliberately routes
|
|
687
|
+
// the paired PhysicsWorld into rebuild-required when that proof fails.
|
|
688
|
+
if (failures.length > 0)
|
|
689
|
+
throw new DynamicGeometryError(
|
|
527
690
|
'dynamic-geometry-invalid',
|
|
528
|
-
'
|
|
529
|
-
'
|
|
530
|
-
{
|
|
531
|
-
),
|
|
532
|
-
);
|
|
533
|
-
const currentFixedStep = fixedStepOf(world);
|
|
534
|
-
if (
|
|
535
|
-
currentFixedStep === undefined ||
|
|
536
|
-
candidate.fixedStep === undefined ||
|
|
537
|
-
candidate.fixedStep > currentFixedStep ||
|
|
538
|
-
ordering.fixedStep !== currentFixedStep
|
|
539
|
-
)
|
|
540
|
-
return err(
|
|
541
|
-
new DynamicGeometryError(
|
|
542
|
-
'dynamic-geometry-ordering-required',
|
|
543
|
-
'ordering matches the current World tick, no earlier than preparation',
|
|
544
|
-
'accept a prepared candidate during the current fixed-step admission',
|
|
545
|
-
{
|
|
546
|
-
candidateId: candidate.candidateId,
|
|
547
|
-
actual: {
|
|
548
|
-
candidate: candidate.fixedStep,
|
|
549
|
-
currentFixedStep,
|
|
550
|
-
ordering: ordering.fixedStep,
|
|
551
|
-
},
|
|
552
|
-
},
|
|
553
|
-
),
|
|
554
|
-
);
|
|
555
|
-
if (candidate.physicsEntity !== undefined) {
|
|
556
|
-
const publication = physicsPublicationOf(world, candidate.physicsEntity, true);
|
|
557
|
-
if (
|
|
558
|
-
publication === undefined ||
|
|
559
|
-
publication.fixedStep !== currentFixedStep ||
|
|
560
|
-
publication.revision !== candidate.revision
|
|
561
|
-
)
|
|
562
|
-
return err(
|
|
563
|
-
new DynamicGeometryError(
|
|
564
|
-
'dynamic-geometry-ordering-required',
|
|
565
|
-
'candidate physicsEntity has the active paired PhysicsWorld admission',
|
|
566
|
-
'accept geometry inside admitDerivedShapeCandidate commitGeometry, before physics step',
|
|
567
|
-
{ candidateId: candidate.candidateId, actual: publication },
|
|
568
|
-
),
|
|
691
|
+
'a failed geometry group restores every previous ECS binding',
|
|
692
|
+
'rebuild the paired World and Renderer before rendering or querying physics',
|
|
693
|
+
{ actual: failures },
|
|
569
694
|
);
|
|
695
|
+
};
|
|
696
|
+
for (const candidate of candidates) {
|
|
697
|
+
const result = acceptCandidate(candidate, ordering, superseded);
|
|
698
|
+
if (!result.ok) {
|
|
699
|
+
rollback();
|
|
700
|
+
return err(result.error);
|
|
701
|
+
}
|
|
702
|
+
accepted.push(result.value);
|
|
570
703
|
}
|
|
571
|
-
//
|
|
572
|
-
//
|
|
573
|
-
// same entity can no longer become a receipt-bearing draw. Cancel it
|
|
574
|
-
// after the new ECS swap so its candidate-only residency is no longer
|
|
575
|
-
// protected as the live draw owner. Published candidates stay
|
|
576
|
-
// receipt-bound and are retired independently.
|
|
577
|
-
const superseded = [...hostCandidates.values()].filter(
|
|
578
|
-
(record) =>
|
|
579
|
-
record.candidate.candidateId !== candidate.candidateId &&
|
|
580
|
-
record.world === world &&
|
|
581
|
-
record.entity === candidate.entity &&
|
|
582
|
-
!record.published,
|
|
583
|
-
);
|
|
584
|
-
const accepted = lifecycle.accept(candidate, ordering);
|
|
585
|
-
if (!accepted.ok) return accepted;
|
|
586
|
-
const swapped = world.set(candidate.entity as EntityHandle, MeshFilter, {
|
|
587
|
-
assetHandle: hostRecord.meshHandle,
|
|
588
|
-
});
|
|
589
|
-
if (!swapped.ok) {
|
|
590
|
-
lifecycle.cancel(accepted.value);
|
|
591
|
-
hostCandidates.delete(candidate.candidateId);
|
|
592
|
-
cleanupCandidateResidency(hostRecord);
|
|
593
|
-
const released = releaseMeshLeases(hostRecord);
|
|
594
|
-
if (released !== undefined) return err(released);
|
|
595
|
-
return err(
|
|
596
|
-
new DynamicGeometryError(
|
|
597
|
-
'dynamic-geometry-invalid',
|
|
598
|
-
'the candidate MeshFilter swap commits through the ECS write barrier',
|
|
599
|
-
'restore the live entity and retry from a fresh candidate',
|
|
600
|
-
{ candidateId: candidate.candidateId, actual: swapped.error },
|
|
601
|
-
),
|
|
602
|
-
);
|
|
603
|
-
}
|
|
604
|
-
hostRecord.candidate = accepted.value;
|
|
605
|
-
hostRecord.accepted = true;
|
|
606
|
-
options.onTopologyChanged?.();
|
|
607
|
-
// Keep the World handle leased through the final GPU submission; its slot
|
|
608
|
-
// must not be reused while a retired frame still references the old mesh.
|
|
609
|
-
// Cleanup happens only after the new ECS MeshFilter is visible. Before
|
|
610
|
-
// the swap, hasMeshBinding intentionally protects the older candidate's
|
|
611
|
-
// GPU copy because it is still the live draw owner.
|
|
704
|
+
// Keep all previous unpublished credentials and leases until every ECS
|
|
705
|
+
// swap succeeds, so a kth-member rejection can still draw the old group.
|
|
612
706
|
for (const record of superseded) {
|
|
613
707
|
const completion = cleanupCandidateResidency(record);
|
|
614
|
-
const
|
|
615
|
-
if (!
|
|
616
|
-
|
|
617
|
-
assetHandle: hostRecord.previousMeshHandle,
|
|
618
|
-
});
|
|
619
|
-
lifecycle.cancel(accepted.value);
|
|
620
|
-
hostCandidates.delete(candidate.candidateId);
|
|
621
|
-
cleanupCandidateResidency(hostRecord);
|
|
622
|
-
releasePreviousMeshLease(hostRecord);
|
|
623
|
-
return err(
|
|
624
|
-
new DynamicGeometryError(
|
|
625
|
-
'dynamic-geometry-invalid',
|
|
626
|
-
'candidate supersession cancels the prior credential atomically',
|
|
627
|
-
'keep the prior ECS binding and candidate lifecycle intact when supersession fails',
|
|
628
|
-
{
|
|
629
|
-
candidateId: candidate.candidateId,
|
|
630
|
-
actual: {
|
|
631
|
-
cancelled: cancelled.error,
|
|
632
|
-
restored: restored.ok ? undefined : restored.error,
|
|
633
|
-
},
|
|
634
|
-
},
|
|
635
|
-
),
|
|
636
|
-
);
|
|
637
|
-
}
|
|
638
|
-
hostCandidates.delete(record.candidate.candidateId);
|
|
708
|
+
const result = lifecycle.cancel(record.candidate, completion);
|
|
709
|
+
if (!result.ok && result.error.code !== 'dynamic-geometry-candidate-not-found')
|
|
710
|
+
throw result.error;
|
|
639
711
|
scheduleCandidateCleanup(record);
|
|
640
712
|
}
|
|
641
|
-
|
|
713
|
+
options.onTopologyChanged?.();
|
|
714
|
+
return ok(Object.freeze(accepted));
|
|
642
715
|
},
|
|
643
716
|
dynamicGeometryReceipt(candidate) {
|
|
644
717
|
synchronizeGeneration();
|
|
@@ -836,4 +909,52 @@ export function createDynamicGeometryHost(options: {
|
|
|
836
909
|
return receipts;
|
|
837
910
|
},
|
|
838
911
|
};
|
|
912
|
+
return host;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
/**
|
|
916
|
+
* Renderer assembly adapter for the host's temporal geometry owner.
|
|
917
|
+
*
|
|
918
|
+
* Keeping the render-system callback at this boundary prevents the concrete
|
|
919
|
+
* WebGPU assembly from growing another owner-specific block while preserving
|
|
920
|
+
* the same lifecycle and residency contracts.
|
|
921
|
+
*/
|
|
922
|
+
export function createRendererDynamicGeometryHost(options: {
|
|
923
|
+
readonly lifecycle: DynamicGeometryLifecycle;
|
|
924
|
+
readonly attachedWorlds: ReadonlySet<World>;
|
|
925
|
+
readonly getGpuStore: () => GpuResidencyCache;
|
|
926
|
+
readonly currentGeneration: () => number;
|
|
927
|
+
readonly renderSystem: {
|
|
928
|
+
readonly invalidateGeometryHistory: () => void;
|
|
929
|
+
readonly isDynamicGeometryConsumed: (
|
|
930
|
+
world: World,
|
|
931
|
+
entity: number,
|
|
932
|
+
meshHandle: DynamicGeometryCandidate['meshHandle'],
|
|
933
|
+
) => boolean;
|
|
934
|
+
};
|
|
935
|
+
}): DynamicGeometryHostImplementation {
|
|
936
|
+
const { renderSystem, ...hostOptions } = options;
|
|
937
|
+
return createDynamicGeometryHost({
|
|
938
|
+
...hostOptions,
|
|
939
|
+
onTopologyChanged: () => renderSystem.invalidateGeometryHistory(),
|
|
940
|
+
isConsumedByRenderFrame: (candidate) =>
|
|
941
|
+
renderSystem.isDynamicGeometryConsumed(
|
|
942
|
+
candidate.world as World,
|
|
943
|
+
candidate.entity ?? -1,
|
|
944
|
+
candidate.meshHandle,
|
|
945
|
+
),
|
|
946
|
+
});
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
export function createRendererDynamicGeometryController(
|
|
950
|
+
options: Omit<Parameters<typeof createRendererDynamicGeometryHost>[0], 'lifecycle'>,
|
|
951
|
+
): {
|
|
952
|
+
readonly lifecycle: DynamicGeometryLifecycle;
|
|
953
|
+
readonly host: DynamicGeometryHostImplementation;
|
|
954
|
+
} {
|
|
955
|
+
const lifecycle = createDynamicGeometryLifecycle();
|
|
956
|
+
return {
|
|
957
|
+
lifecycle,
|
|
958
|
+
host: createRendererDynamicGeometryHost({ ...options, lifecycle }),
|
|
959
|
+
};
|
|
839
960
|
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { World } from '@forgeax/engine-ecs';
|
|
2
|
+
import type { GpuResidencyCache } from '../device/gpu-residency';
|
|
3
|
+
import {
|
|
4
|
+
createDynamicGeometryLifecycle,
|
|
5
|
+
type DynamicGeometryCandidate,
|
|
6
|
+
type DynamicGeometryLifecycle,
|
|
7
|
+
} from '../dynamic-geometry';
|
|
8
|
+
import { RendererContractFailureError, RendererOperationError } from '../errors/render';
|
|
9
|
+
import type { RenderSystem } from '../render-system';
|
|
10
|
+
import {
|
|
11
|
+
createDynamicGeometryHost,
|
|
12
|
+
type DynamicGeometryHostImplementation,
|
|
13
|
+
} from './dynamic-geometry-host';
|
|
14
|
+
|
|
15
|
+
export interface DynamicGeometryRuntime {
|
|
16
|
+
readonly lifecycle: DynamicGeometryLifecycle;
|
|
17
|
+
readonly host: DynamicGeometryHostImplementation;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Assemble the renderer-owned candidate lifecycle and its device host. */
|
|
21
|
+
export function createDynamicGeometryRuntime(options: {
|
|
22
|
+
readonly attachedWorlds: ReadonlySet<World>;
|
|
23
|
+
readonly getGpuStore: () => GpuResidencyCache;
|
|
24
|
+
readonly currentGeneration: () => number;
|
|
25
|
+
readonly renderSystem: Pick<
|
|
26
|
+
RenderSystem,
|
|
27
|
+
'invalidateGeometryHistory' | 'isDynamicGeometryConsumed'
|
|
28
|
+
>;
|
|
29
|
+
}): DynamicGeometryRuntime {
|
|
30
|
+
const lifecycle = createDynamicGeometryLifecycle();
|
|
31
|
+
const host = createDynamicGeometryHost({
|
|
32
|
+
lifecycle,
|
|
33
|
+
attachedWorlds: options.attachedWorlds,
|
|
34
|
+
getGpuStore: options.getGpuStore,
|
|
35
|
+
currentGeneration: options.currentGeneration,
|
|
36
|
+
onTopologyChanged: () => options.renderSystem.invalidateGeometryHistory(),
|
|
37
|
+
isConsumedByRenderFrame: (candidate: DynamicGeometryCandidate) =>
|
|
38
|
+
options.renderSystem.isDynamicGeometryConsumed(
|
|
39
|
+
candidate.world as World,
|
|
40
|
+
candidate.entity ?? -1,
|
|
41
|
+
candidate.meshHandle,
|
|
42
|
+
),
|
|
43
|
+
});
|
|
44
|
+
return { lifecycle, host };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Reject a draw while a derived-physics publication is still unsettled. */
|
|
48
|
+
export function validateDerivedPhysicsFrame(
|
|
49
|
+
worlds: readonly World[],
|
|
50
|
+
): RendererOperationError<'frame-input-invalid'> | undefined {
|
|
51
|
+
for (const world of worlds) {
|
|
52
|
+
if (!world.hasResource('PhysicsWorld')) continue;
|
|
53
|
+
const physics = world.getResource<{
|
|
54
|
+
readonly getDerivedAdmission?: () => unknown;
|
|
55
|
+
readonly getDerivedRecoveryState?: () => string;
|
|
56
|
+
}>('PhysicsWorld');
|
|
57
|
+
if (
|
|
58
|
+
physics?.getDerivedAdmission?.() !== undefined ||
|
|
59
|
+
physics?.getDerivedRecoveryState?.() === 'rebuild-required'
|
|
60
|
+
) {
|
|
61
|
+
return new RendererOperationError('frame-input-invalid', {
|
|
62
|
+
operation: 'draw',
|
|
63
|
+
cause: new RendererContractFailureError(
|
|
64
|
+
'draw',
|
|
65
|
+
'paired geometry admission must finish physics step and writeback in a healthy World before draw',
|
|
66
|
+
),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
package/src/assembly/factory.ts
CHANGED
|
@@ -9,6 +9,9 @@ import type { RendererAssemblyImplementation } from './host-contract';
|
|
|
9
9
|
import { toError } from './renderer-facade';
|
|
10
10
|
import { tryCreateWebGPURenderer } from './webgpu-renderer';
|
|
11
11
|
|
|
12
|
+
export { disposeObservationCaptureSet } from './webgpu-renderer';
|
|
13
|
+
export { particleMaterialInputVertexBuffers } from './webgpu-vertex-layouts';
|
|
14
|
+
|
|
12
15
|
/*
|
|
13
16
|
* Renderer ownership stays explicit even though the implementation is split:
|
|
14
17
|
* the delegated target owner comes from './render-target-host'. The concrete
|
|
@@ -69,6 +72,7 @@ export {
|
|
|
69
72
|
resolveMaterialShaderUvSetCount,
|
|
70
73
|
resolveMaterialShaderVariantSet,
|
|
71
74
|
resolveMaterialShaderVertexInputContract,
|
|
75
|
+
selectGpuDrivenSceneIndexVariant,
|
|
72
76
|
selectHdrpPbrPrewarmVariants,
|
|
73
77
|
selectNoColorPbrVariant,
|
|
74
78
|
selectPipelineLayoutForVariant,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { err, type RhiDevice, RhiError } from '@forgeax/engine-rhi';
|
|
2
|
+
import { GpuDrivenProduction } from '../gpu-driven/production-raster';
|
|
3
|
+
import type { PipelineBuilderShaderModuleFactory } from '../pipeline-builder';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Renderer-owned GPU-driven frame state boundary. The production object owns
|
|
7
|
+
* view resources and prepared generations; callers only supply the backend
|
|
8
|
+
* and shader factory and must not create a parallel frame loop.
|
|
9
|
+
*/
|
|
10
|
+
export function createGpuDrivenOwner(
|
|
11
|
+
device: RhiDevice,
|
|
12
|
+
shaderModuleFactory?: PipelineBuilderShaderModuleFactory,
|
|
13
|
+
recoveryCount = 0,
|
|
14
|
+
): GpuDrivenProduction {
|
|
15
|
+
return new GpuDrivenProduction(
|
|
16
|
+
device,
|
|
17
|
+
shaderModuleFactory ?? {
|
|
18
|
+
createShaderModule: () =>
|
|
19
|
+
err(
|
|
20
|
+
new RhiError({
|
|
21
|
+
code: 'rhi-not-available',
|
|
22
|
+
expected: 'the renderer backend exposes shader module creation',
|
|
23
|
+
hint: 'construct the renderer through the backend pack before activating GPU-driven rendering',
|
|
24
|
+
}),
|
|
25
|
+
),
|
|
26
|
+
},
|
|
27
|
+
recoveryCount,
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -13,6 +13,7 @@ import type { RecoverFailure } from '../errors/recover';
|
|
|
13
13
|
import type { ObservationUnavailableError, RenderError } from '../errors/render';
|
|
14
14
|
import type { RenderFeature, RenderFeatureDiagnostics } from '../features/types';
|
|
15
15
|
import type { GpuDrivenProductionInspection, LodOcclusionInspection } from '../inspection-types';
|
|
16
|
+
import type { InstanceCollectionStore } from '../instances';
|
|
16
17
|
import type { MeshMaterialBindingObservation } from '../mesh-material-bindings';
|
|
17
18
|
import type { FrameObservation, FrameObservationOptions } from '../record/frame';
|
|
18
19
|
import type { CurrentGraphTarget, GraphTargetCaptureRequest } from '../record/frame-snapshot';
|
|
@@ -33,6 +34,7 @@ import type {
|
|
|
33
34
|
RenderWorldLease,
|
|
34
35
|
} from '../render-contract';
|
|
35
36
|
import type { RenderSceneInspection } from '../render-system';
|
|
37
|
+
import type { RenderSceneBounds } from '../scene/render-scene-types';
|
|
36
38
|
import type {
|
|
37
39
|
RenderTarget,
|
|
38
40
|
RenderTargetDescriptor,
|
|
@@ -60,6 +62,8 @@ export type RendererHostEventListener = (event: RendererHostEvent) => void;
|
|
|
60
62
|
* the public Renderer type.
|
|
61
63
|
*/
|
|
62
64
|
export interface RendererHostImplementation {
|
|
65
|
+
/** Renderer-owned authoring and update path for large instance collections. */
|
|
66
|
+
readonly instances: InstanceCollectionStore;
|
|
63
67
|
attach(world: World): RenderResult<RenderWorldLease, RenderError>;
|
|
64
68
|
prepareDynamicGeometry(
|
|
65
69
|
input: DynamicGeometryPrepareInput,
|
|
@@ -68,6 +72,15 @@ export interface RendererHostImplementation {
|
|
|
68
72
|
candidate: DynamicGeometryCandidate,
|
|
69
73
|
ordering: DynamicGeometryOrdering,
|
|
70
74
|
): Result<DynamicGeometryCandidate, DynamicGeometryError>;
|
|
75
|
+
/**
|
|
76
|
+
* Atomically swap distinct entities in one attached World. Returned failures
|
|
77
|
+
* retain old bindings; an uncertain rollback throws to require paired rebuild.
|
|
78
|
+
* Invoke inside PhysicsWorld.admitDerivedShapeCandidates commitGeometry.
|
|
79
|
+
*/
|
|
80
|
+
acceptDynamicGeometryCandidates(
|
|
81
|
+
candidates: readonly DynamicGeometryCandidate[],
|
|
82
|
+
ordering: DynamicGeometryOrdering,
|
|
83
|
+
): Result<readonly DynamicGeometryCandidate[], DynamicGeometryError>;
|
|
71
84
|
dynamicGeometryReceipt(candidate: DynamicGeometryCandidate): DynamicGeometryReceipt | undefined;
|
|
72
85
|
cancelDynamicGeometry(candidate: DynamicGeometryCandidate): Result<void, DynamicGeometryError>;
|
|
73
86
|
retireDynamicGeometry(candidate: DynamicGeometryCandidate): Result<void, DynamicGeometryError>;
|
|
@@ -95,6 +108,8 @@ export interface RendererHostImplementation {
|
|
|
95
108
|
): RenderResult<RenderTargetReadbackTicket, RenderError>;
|
|
96
109
|
destroyRenderTarget(target: RenderTarget): RenderResult<void, RenderError>;
|
|
97
110
|
setProfile(profile: RenderProfile): RenderResult<void, RenderError>;
|
|
111
|
+
/** Detached world bounds for one record in the last extracted World; undefined if unavailable. */
|
|
112
|
+
bounds(world: World, entity: number): RenderSceneBounds | undefined;
|
|
98
113
|
inspect(): RenderInspection;
|
|
99
114
|
/**
|
|
100
115
|
* Internal bounded inspection for high-cardinality producers. The public
|
|
@@ -106,6 +121,10 @@ export interface RendererHostImplementation {
|
|
|
106
121
|
readonly gpuDriven: GpuDrivenProductionInspection;
|
|
107
122
|
};
|
|
108
123
|
drawFrame(request: RenderFrameInput): RenderResult<FrameReceipt, RhiError | RenderError>;
|
|
124
|
+
/** Arm one upcoming frame for receipt-bound color observations. */
|
|
125
|
+
requestObservation?: (
|
|
126
|
+
domains: readonly import('../render-contract').FrameObservationDomain[],
|
|
127
|
+
) => RenderResult<void, RenderError>;
|
|
109
128
|
observe(
|
|
110
129
|
receipt: FrameReceipt,
|
|
111
130
|
request: FrameObservationRequest,
|