@forgeax/engine-render 0.1.20 → 0.1.23
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 +365 -29
- package/dist/assembly/backend-contract.d.ts +13 -0
- package/dist/assembly/backend-contract.d.ts.map +1 -1
- package/dist/assembly/device-feature-admission.d.ts +18 -0
- package/dist/assembly/device-feature-admission.d.ts.map +1 -0
- package/dist/assembly/directional-shadow-inspection.d.ts +38 -0
- package/dist/assembly/directional-shadow-inspection.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +30 -19
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +19 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/render-target-host.d.ts +46 -0
- package/dist/assembly/render-target-host.d.ts.map +1 -0
- package/dist/assets/render-asset-port.d.ts.map +1 -1
- package/dist/authoring.mjs +4 -1
- package/dist/authoring.mjs.map +1 -1
- package/dist/capture/cube-views.d.ts +21 -0
- package/dist/capture/cube-views.d.ts.map +1 -0
- package/dist/capture/scheduler.d.ts +54 -0
- package/dist/capture/scheduler.d.ts.map +1 -0
- package/dist/{chunk-PCHBPYML.mjs → chunk-4L3P6DT5.mjs} +2 -2
- package/dist/chunk-4L3P6DT5.mjs.map +1 -0
- package/dist/{chunk-VFPLTKCU.mjs → chunk-4NPUASZR.mjs} +15 -4
- package/dist/chunk-4NPUASZR.mjs.map +1 -0
- package/dist/chunk-DIYW3M5D.mjs +5085 -0
- package/dist/chunk-DIYW3M5D.mjs.map +1 -0
- package/dist/chunk-FBC4R44J.mjs +1003 -0
- package/dist/chunk-FBC4R44J.mjs.map +1 -0
- package/dist/{chunk-CDTWTHZR.mjs → chunk-FF7K3FSO.mjs} +474 -168
- package/dist/chunk-FF7K3FSO.mjs.map +1 -0
- package/dist/chunk-HZUPSYW7.mjs +1104 -0
- package/dist/chunk-HZUPSYW7.mjs.map +1 -0
- package/dist/{chunk-TBQJOK2L.mjs → chunk-QODA5UKU.mjs} +321 -269
- package/dist/chunk-QODA5UKU.mjs.map +1 -0
- package/dist/chunk-YALPS44A.mjs +296 -0
- package/dist/chunk-YALPS44A.mjs.map +1 -0
- package/dist/{chunk-4XINDLAY.mjs → chunk-ZUWKAZ2I.mjs} +1963 -2178
- package/dist/chunk-ZUWKAZ2I.mjs.map +1 -0
- package/dist/cluster-binner.d.ts +5 -0
- package/dist/cluster-binner.d.ts.map +1 -1
- package/dist/components/camera.d.ts +1 -0
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/cube-camera.d.ts +20 -0
- package/dist/components/cube-camera.d.ts.map +1 -0
- package/dist/components/directional-light.d.ts +11 -2
- package/dist/components/directional-light.d.ts.map +1 -1
- package/dist/components/directional-shadow-filter.d.ts +25 -0
- package/dist/components/directional-shadow-filter.d.ts.map +1 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts +4 -0
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/light-probe.d.ts +9 -0
- package/dist/components/light-probe.d.ts.map +1 -0
- package/dist/components/rect-area-light.d.ts +12 -0
- package/dist/components/rect-area-light.d.ts.map +1 -0
- package/dist/components/reflection-probe.d.ts +17 -0
- package/dist/components/reflection-probe.d.ts.map +1 -0
- package/dist/components/scene-instance.d.ts +4 -0
- package/dist/components/scene-instance.d.ts.map +1 -1
- package/dist/components/spot-light.d.ts +3 -0
- package/dist/components/spot-light.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +14836 -9620
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +8 -1
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/device/lifecycle-transaction.d.ts +2 -0
- package/dist/device/lifecycle-transaction.d.ts.map +1 -0
- package/dist/environment/frame.d.ts.map +1 -1
- package/dist/environment/lifecycle.d.ts +5 -0
- package/dist/environment/lifecycle.d.ts.map +1 -1
- package/dist/errors/gpu-driven.d.ts +26 -0
- package/dist/errors/gpu-driven.d.ts.map +1 -0
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/recover.d.ts +9 -1
- package/dist/errors/recover.d.ts.map +1 -1
- package/dist/errors/render.d.ts +166 -93
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/directional-shadow-projection.d.ts +23 -0
- package/dist/extract/directional-shadow-projection.d.ts.map +1 -0
- package/dist/extract/environment.d.ts +14 -0
- package/dist/extract/environment.d.ts.map +1 -1
- package/dist/extract/gpu-driven.d.ts +50 -0
- package/dist/extract/gpu-driven.d.ts.map +1 -0
- package/dist/extract/visibility.d.ts.map +1 -1
- package/dist/features/fullscreen.d.ts.map +1 -1
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +10 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +13 -2
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts +34 -0
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/prepared-draw.d.ts +63 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -0
- package/dist/gpu-driven/production-raster.d.ts +97 -2
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/view-gpu.d.ts +64 -1
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-scene-schema.d.ts +14 -0
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +8 -1
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-usage.d.ts +0 -1
- package/dist/gpu-usage.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +21 -19
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +4 -0
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/kernel-cache.d.ts +36 -0
- package/dist/ibl/kernel-cache.d.ts.map +1 -0
- package/dist/index.d.ts +39 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +91 -6
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +214 -1
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instances-derived-bounds.d.ts +50 -0
- package/dist/instances-derived-bounds.d.ts.map +1 -0
- package/dist/internal.d.ts +9 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +23 -2
- package/dist/internal.mjs.map +1 -1
- package/dist/light-buffer-layout.d.ts +58 -140
- package/dist/light-buffer-layout.d.ts.map +1 -1
- package/dist/materials.d.ts.map +1 -1
- package/dist/mesh-material-bindings.d.ts +54 -0
- package/dist/mesh-material-bindings.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +38 -14
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts +2 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-lighting/errors.d.ts +4 -0
- package/dist/pipeline/standard-lighting/errors.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/graph.d.ts +24 -0
- package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/inspection.d.ts +38 -0
- package/dist/pipeline/standard-lighting/inspection.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/layout.d.ts +28 -0
- package/dist/pipeline/standard-lighting/layout.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/light-frame.d.ts +33 -0
- package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/membership.d.ts +14 -0
- package/dist/pipeline/standard-lighting/membership.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/prepare.d.ts +16 -0
- package/dist/pipeline/standard-lighting/prepare.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/topology.d.ts +45 -0
- package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -0
- package/dist/pipeline/standard-lighting/transport.d.ts +36 -0
- package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts +4 -13
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline/standard-profile.d.ts +5 -26
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +2 -0
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +40 -7
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/point-shadow-inspection.d.ts +21 -0
- package/dist/point-shadow-inspection.d.ts.map +1 -0
- package/dist/prepare/extended-lighting/ltc-resources.d.ts +31 -0
- package/dist/prepare/extended-lighting/ltc-resources.d.ts.map +1 -0
- package/dist/prepare/extended-lighting/resources.d.ts +72 -0
- package/dist/prepare/extended-lighting/resources.d.ts.map +1 -0
- package/dist/prepare/extended-lighting/spot-modifiers.d.ts +42 -0
- package/dist/prepare/extended-lighting/spot-modifiers.d.ts.map +1 -0
- package/dist/prepare/extended-lighting/state.d.ts +24 -0
- package/dist/prepare/extended-lighting/state.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +33 -36
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +78 -24
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts +5 -0
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +16 -6
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/gpu-pass-timing/contract.d.ts +96 -0
- package/dist/record/gpu-pass-timing/contract.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/errors.d.ts +18 -0
- package/dist/record/gpu-pass-timing/errors.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/index.d.ts +8 -0
- package/dist/record/gpu-pass-timing/index.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/parser.d.ts +11 -0
- package/dist/record/gpu-pass-timing/parser.d.ts.map +1 -0
- package/dist/record/gpu-pass-timing/session.d.ts +43 -0
- package/dist/record/gpu-pass-timing/session.d.ts.map +1 -0
- package/dist/record/gpu-timing.d.ts +20 -3
- package/dist/record/gpu-timing.d.ts.map +1 -1
- package/dist/record/helpers.d.ts +0 -20
- package/dist/record/helpers.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +6 -1
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +25 -2
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +2 -0
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +98 -6
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +119 -4
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +7 -5
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/reflection/filter.d.ts +22 -0
- package/dist/reflection/filter.d.ts.map +1 -0
- package/dist/reflection/gpu-table.d.ts +25 -0
- package/dist/reflection/gpu-table.d.ts.map +1 -0
- package/dist/reflection/inspection.d.ts +10 -0
- package/dist/reflection/inspection.d.ts.map +1 -0
- package/dist/reflection/projection.d.ts +140 -0
- package/dist/reflection/projection.d.ts.map +1 -0
- package/dist/reflection/record-owner.d.ts +60 -0
- package/dist/reflection/record-owner.d.ts.map +1 -0
- package/dist/render-contract.d.ts +62 -14
- 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 +49 -2
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +160 -31
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +28 -2
- package/dist/render-system.d.ts.map +1 -1
- package/dist/renderer.d.ts +43 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/scene/probe-blend-record.d.ts +22 -0
- package/dist/scene/probe-blend-record.d.ts.map +1 -0
- package/dist/scene/probe-blend.d.ts +142 -0
- package/dist/scene/probe-blend.d.ts.map +1 -0
- package/dist/scene/render-scene-types.d.ts +0 -6
- package/dist/scene/render-scene-types.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +117 -9
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/scene/visibility/bounds.d.ts +20 -0
- package/dist/scene/visibility/bounds.d.ts.map +1 -0
- package/dist/scene/visibility/budget.d.ts +16 -0
- package/dist/scene/visibility/budget.d.ts.map +1 -0
- package/dist/scene/visibility/facet.d.ts +73 -0
- package/dist/scene/visibility/facet.d.ts.map +1 -0
- package/dist/scene/visibility/gpu-frame-timing.d.ts +41 -0
- package/dist/scene/visibility/gpu-frame-timing.d.ts.map +1 -0
- package/dist/scene/visibility/gpu-lod.d.ts +46 -0
- package/dist/scene/visibility/gpu-lod.d.ts.map +1 -0
- package/dist/scene/visibility/inspection.d.ts +132 -0
- package/dist/scene/visibility/inspection.d.ts.map +1 -0
- package/dist/scene/visibility/lod-selector.d.ts +25 -0
- package/dist/scene/visibility/lod-selector.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-confidence.d.ts +81 -0
- package/dist/scene/visibility/occlusion-confidence.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-pass.d.ts +57 -0
- package/dist/scene/visibility/occlusion-pass.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-query-pool.d.ts +57 -0
- package/dist/scene/visibility/occlusion-query-pool.d.ts.map +1 -0
- package/dist/scene/visibility/occlusion-runtime.d.ts +96 -0
- package/dist/scene/visibility/occlusion-runtime.d.ts.map +1 -0
- package/dist/scene/visibility/types.d.ts +34 -0
- package/dist/scene/visibility/types.d.ts.map +1 -0
- package/dist/shadow-atlas.d.ts +3 -3
- package/dist/shadow-atlas.d.ts.map +1 -1
- package/dist/ssao-buffers.d.ts +3 -0
- package/dist/ssao-buffers.d.ts.map +1 -1
- package/dist/ssr/admission.d.ts +122 -0
- package/dist/ssr/admission.d.ts.map +1 -0
- package/dist/ssr/composition.d.ts +32 -0
- package/dist/ssr/composition.d.ts.map +1 -0
- package/dist/ssr/errors.d.ts +39 -0
- package/dist/ssr/errors.d.ts.map +1 -0
- package/dist/ssr/identity.d.ts +13 -0
- package/dist/ssr/identity.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts +1 -1
- package/dist/targets/contracts.d.ts +66 -0
- package/dist/targets/contracts.d.ts.map +1 -0
- package/dist/targets/graph-projection.d.ts +29 -0
- package/dist/targets/graph-projection.d.ts.map +1 -0
- package/dist/targets/material-source.d.ts +34 -0
- package/dist/targets/material-source.d.ts.map +1 -0
- package/dist/targets/owner.d.ts +32 -0
- package/dist/targets/owner.d.ts.map +1 -0
- package/dist/targets/physical.d.ts +18 -0
- package/dist/targets/physical.d.ts.map +1 -0
- package/dist/targets/readback.d.ts +39 -0
- package/dist/targets/readback.d.ts.map +1 -0
- package/dist/temporal/frame-coordinator.d.ts +13 -0
- package/dist/temporal/frame-coordinator.d.ts.map +1 -1
- package/dist/temporal/frame.d.ts +2 -0
- package/dist/temporal/frame.d.ts.map +1 -1
- package/dist/temporal/index.mjs +6 -5
- package/dist/temporal/view.d.ts +7 -0
- package/dist/temporal/view.d.ts.map +1 -1
- package/dist/tilemap-chunk-extract-system.d.ts +1 -1
- package/dist/typed-render-graph-primitives.d.ts +5 -1
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-passes.d.ts +1 -1
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/passes.d.ts +9 -5
- package/dist/volume/passes.d.ts.map +1 -1
- package/package.json +20 -20
- package/src/__tests__/bloom-exact-zero.unit.test.ts +48 -19
- package/src/__tests__/bloom-lifecycle.integration.test.ts +41 -13
- package/src/__tests__/camera-target-consumption.unit.test.ts +53 -0
- package/src/__tests__/cluster-binner.unit.test.ts +35 -0
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +12 -2
- package/src/__tests__/cube-camera-scheduler.unit.test.ts +70 -0
- package/src/__tests__/cube-camera-single-submit.perf.test.ts +75 -0
- package/src/__tests__/cube-camera-view-matrices.unit.test.ts +41 -0
- package/src/__tests__/cube-camera-vocabulary.unit.test.ts +47 -0
- package/src/__tests__/cube-camera.integration.test.ts +42 -0
- package/src/__tests__/detached-inspection.integration.test.ts +6 -0
- package/src/__tests__/device-feature-admission.unit.test.ts +85 -0
- package/src/__tests__/direct-light-snapshot.unit.test.ts +62 -6
- package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
- package/src/__tests__/environment-generation.integration.test.ts +16 -0
- package/src/__tests__/evidence-identity.ts +13 -0
- package/src/__tests__/evidence-identity.unit.test.ts +24 -0
- package/src/__tests__/extended-lighting-recovery.browser.test.ts +14 -0
- package/src/__tests__/extended-lighting-recovery.dawn.test.ts +14 -0
- package/src/__tests__/extended-lighting-recovery.integration.test.ts +81 -0
- package/src/__tests__/extended-lighting-resources.unit.test.ts +51 -0
- package/src/__tests__/extended-lighting-zero-feature.integration.test.ts +52 -0
- package/src/__tests__/factory-contract.integration.test.ts +288 -29
- package/src/__tests__/fog-component.unit.test.ts +67 -0
- package/src/__tests__/fog.integration.test.ts +86 -0
- package/src/__tests__/frame-observation.contract.test.ts +15 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +146 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -8
- package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +18 -1
- package/src/__tests__/gpu-driven-production.integration.test.ts +579 -17
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +66 -2
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +26 -1
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +101 -6
- package/src/__tests__/gpu-driven-view.browser.test.ts +3 -3
- package/src/__tests__/gpu-driven-view.dawn.test.ts +3 -3
- package/src/__tests__/gpu-driven-view.unit.test.ts +50 -0
- package/src/__tests__/gpu-lod-evidence.ts +188 -0
- package/src/__tests__/gpu-lod-fallback.integration.test.ts +10 -0
- package/src/__tests__/gpu-lod-indirect.integration.test.ts +40 -0
- package/src/__tests__/gpu-lod-parity.dawn.test.ts +29 -0
- package/src/__tests__/gpu-lod-readiness.integration.test.ts +52 -0
- package/src/__tests__/gpu-lod-schema.unit.test.ts +66 -0
- package/src/__tests__/gpu-lod-selector.unit.test.ts +28 -0
- package/src/__tests__/gpu-lod-silhouette.browser.test.ts +13 -0
- package/src/__tests__/gpu-pass-timing-browser-runner.ts +281 -0
- package/src/__tests__/gpu-pass-timing-coexistence.integration.test.ts +80 -0
- package/src/__tests__/gpu-pass-timing-contract.unit.test.ts +243 -0
- package/src/__tests__/gpu-pass-timing-exact-zero.unit.test.ts +131 -0
- package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +230 -0
- package/src/__tests__/gpu-pass-timing-observation.unit.test.ts +233 -0
- package/src/__tests__/gpu-pass-timing-session.unit.test.ts +438 -0
- package/src/__tests__/gpu-pass-timing.browser.test.ts +26 -0
- package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +125 -0
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +66 -1
- package/src/__tests__/gpu-scene.dawn.test.ts +8 -1
- package/src/__tests__/gpu-scene.unit.test.ts +49 -3
- package/src/__tests__/hdrp-group2-visibility.unit.test.ts +24 -0
- package/src/__tests__/instances-culling.integration.test.ts +94 -0
- package/src/__tests__/instances-derived-bounds.unit.test.ts +118 -0
- package/src/__tests__/light-buffer-layout.unit.test.ts +113 -3
- package/src/__tests__/light-inspection.unit.test.ts +55 -0
- package/src/__tests__/light-resource-error.unit.test.ts +43 -0
- package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +109 -0
- package/src/__tests__/lod-bounds.unit.test.ts +42 -0
- package/src/__tests__/lod-cpu-lane.integration.test.ts +55 -0
- package/src/__tests__/lod-cpu-no-change.perf.test.ts +19 -0
- package/src/__tests__/lod-gpu-frame-timing.unit.test.ts +49 -0
- package/src/__tests__/lod-multi-view.integration.test.ts +63 -0
- package/src/__tests__/lod-occlusion-device-loss.integration.test.ts +27 -0
- package/src/__tests__/lod-occlusion-final-decision.integration.test.ts +47 -0
- package/src/__tests__/lod-occlusion-inspection.integration.test.ts +217 -0
- package/src/__tests__/lod-occlusion-inspection.schema.test-d.ts +14 -0
- package/src/__tests__/lod-occlusion-inspection.unit.test.ts +72 -0
- package/src/__tests__/lod-occlusion-visual-evidence.ts +91 -0
- package/src/__tests__/lod-occlusion.browser.test.ts +15 -0
- package/src/__tests__/lod-occlusion.dawn.test.ts +20 -0
- package/src/__tests__/lod-selector.profile.test.ts +35 -0
- package/src/__tests__/lod-selector.unit.test.ts +68 -0
- package/src/__tests__/lod-visibility-identity.unit.test.ts +198 -0
- package/src/__tests__/lod-visibility-lifecycle.integration.test.ts +132 -0
- package/src/__tests__/ltc-resources.unit.test.ts +32 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +17 -0
- package/src/__tests__/material-observation.integration.test.ts +101 -0
- package/src/__tests__/occlusion-confidence.unit.test.ts +168 -0
- package/src/__tests__/occlusion-invalidation.integration.test.ts +37 -0
- package/src/__tests__/occlusion-pass-routing.unit.test.ts +16 -0
- package/src/__tests__/occlusion-pass.dawn.test.ts +20 -0
- package/src/__tests__/occlusion-pass.integration.test.ts +43 -0
- package/src/__tests__/occlusion-pass.rhi-null.test.ts +22 -0
- package/src/__tests__/occlusion-query-pool.rhi-null.test.ts +21 -0
- package/src/__tests__/occlusion-query-pool.unit.test.ts +95 -0
- package/src/__tests__/occlusion-query-ticket.integration.test.ts +47 -0
- package/src/__tests__/occlusion-query.dawn.test.ts +16 -0
- package/src/__tests__/occlusion-query.evidence.ts +178 -0
- package/src/__tests__/occlusion-query.rhi-null.test.ts +31 -0
- package/src/__tests__/occlusion-runtime.unit.test.ts +120 -0
- package/src/__tests__/pbr-view-layout.unit.test.ts +16 -0
- package/src/__tests__/point-shadow-inspection.unit.test.ts +60 -0
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +196 -0
- package/src/__tests__/probe-bindings.unit.test.ts +200 -0
- package/src/__tests__/probe-blend-numeric.unit.test.ts +67 -0
- package/src/__tests__/probe-blend-oracle.unit.test.ts +136 -0
- package/src/__tests__/probe-capacity.integration.test.ts +97 -0
- package/src/__tests__/probe-recovery.integration.test.ts +104 -0
- package/src/__tests__/probe-scene-dirty.integration.test.ts +211 -0
- package/src/__tests__/profiler-phase-catalog.test.ts +4 -1
- package/src/__tests__/profiler-phase-token.test.ts +1 -0
- package/src/__tests__/public-surface.test-d.ts +10 -0
- package/src/__tests__/rect-area-boundary.unit.test.ts +24 -0
- package/src/__tests__/reflection-fallback-graph.unit.test.ts +67 -0
- package/src/__tests__/reflection-fallback-inspection.unit.test.ts +77 -0
- package/src/__tests__/reflection-fallback-lifecycle.integration.test.ts +21 -0
- package/src/__tests__/reflection-fallback-projection.unit.test.ts +90 -0
- package/src/__tests__/reflection-fallback-source.unit.test.ts +32 -0
- package/src/__tests__/reflection-probe-authoring.unit.test.ts +71 -0
- package/src/__tests__/reflection-probe-filter.unit.test.ts +54 -0
- package/src/__tests__/reflection-probe-ibl-topology.unit.test.ts +45 -0
- package/src/__tests__/reflection-probe-owner-placement.unit.test.ts +39 -0
- package/src/__tests__/reflection-probe-pass-encode.integration.test.ts +101 -0
- package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -0
- package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +120 -0
- package/src/__tests__/reflection-probe-recovery.integration.test.ts +55 -0
- package/src/__tests__/reflection-probe-selection.unit.test.ts +46 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +19 -3
- package/src/__tests__/render-feature-docs.unit.test.ts +12 -7
- package/src/__tests__/render-graph-fallback.integration.test.ts +24 -0
- package/src/__tests__/render-perf/extended-lighting.bench.test.ts +66 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +447 -18
- package/src/__tests__/render-target-admission.unit.test.ts +80 -0
- package/src/__tests__/render-target-graph-projection.unit.test.ts +102 -0
- package/src/__tests__/render-target-inspection.unit.test.ts +52 -0
- package/src/__tests__/render-target-material-source.test-d.ts +30 -0
- package/src/__tests__/render-target-material-source.unit.test.ts +97 -0
- package/src/__tests__/render-target-owner-placement.unit.test.ts +203 -0
- package/src/__tests__/render-target-owner.unit.test.ts +122 -0
- package/src/__tests__/render-target-probe-soak.perf.test.ts +94 -0
- package/src/__tests__/render-target-public-schema.json +107 -0
- package/src/__tests__/render-target-public-schema.unit.test.ts +91 -0
- package/src/__tests__/render-target-public-surface.test-d.ts +83 -0
- package/src/__tests__/render-target-readback.integration.test.ts +90 -0
- package/src/__tests__/render-target-recovery.integration.test.ts +85 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +124 -0
- package/src/__tests__/renderer-lifecycle.integration.test.ts +14 -0
- package/src/__tests__/shader-stage-surface.unit.test.ts +19 -4
- package/src/__tests__/skin-motion-regression.unit.test.ts +154 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +13 -4
- package/src/__tests__/spot-modifier-projection.unit.test.ts +70 -0
- package/src/__tests__/ssr-admission-matrix.integration.test.ts +206 -0
- package/src/__tests__/ssr-composition.unit.test.ts +46 -0
- package/src/__tests__/ssr-fallback-zero-work.bench.test.ts +94 -0
- package/src/__tests__/ssr-recovery-errors.unit.test.ts +58 -0
- package/src/__tests__/standard-cluster-capability.integration.test.ts +63 -0
- package/src/__tests__/standard-cluster-transport.unit.test.ts +121 -0
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +299 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +15 -5
- package/src/__tests__/standard-lighting-inspection.integration.test.ts +138 -0
- package/src/__tests__/standard-lighting-ssot.unit.test.ts +18 -0
- package/src/__tests__/standard-lighting-write.unit.test.ts +441 -0
- package/src/__tests__/standard-lighting.integration.test.ts +67 -0
- package/src/__tests__/standard-pipeline.dawn.test.ts +206 -5
- package/src/__tests__/standard-pipeline.integration.test.ts +181 -150
- package/src/__tests__/standard-probe-binding.unit.test.ts +25 -0
- package/src/__tests__/standard-profile-oracle.unit.test.ts +23 -38
- package/src/__tests__/temporal-fallback-generation.integration.test.ts +16 -0
- package/src/__tests__/temporal-view.unit.test.ts +3 -3
- package/src/__tests__/transmission-prewarm.unit.test.ts +69 -0
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +395 -14
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
- package/src/__tests__/visibility-budget.integration.test.ts +140 -0
- package/src/__tests__/visibility-budget.unit.test.ts +70 -0
- package/src/__tests__/visibility-extract.integration.test.ts +11 -6
- package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
- package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +6 -3
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +31 -28
- package/src/assembly/backend-contract.ts +13 -0
- package/src/assembly/device-feature-admission.ts +80 -0
- package/src/assembly/directional-shadow-inspection.ts +122 -0
- package/src/assembly/factory.ts +1411 -366
- package/src/assembly/host-contract.ts +35 -0
- package/src/assembly/render-target-host.ts +847 -0
- package/src/assets/asset-decoders.ts +1 -1
- package/src/assets/render-asset-port.ts +7 -1
- package/src/capture/cube-views.ts +69 -0
- package/src/capture/scheduler.ts +265 -0
- package/src/cluster-binner.ts +31 -0
- package/src/components/__tests__/lighting-authoring.unit.test.ts +39 -0
- package/src/components/__tests__/rect-area-light.unit.test.ts +33 -0
- package/src/components/__tests__/schema-contract.unit.test.ts +12 -0
- package/src/components/__tests__/schema-parity.unit.test.ts +9 -0
- package/src/components/camera.ts +4 -0
- package/src/components/cube-camera.ts +52 -0
- package/src/components/directional-light.ts +22 -2
- package/src/components/directional-shadow-filter.ts +57 -0
- package/src/components/index.ts +5 -0
- package/src/components/light-helpers.ts +133 -8
- package/src/components/light-probe.ts +13 -0
- package/src/components/rect-area-light.ts +15 -0
- package/src/components/reflection-probe.ts +49 -0
- package/src/components/scene-instance.ts +6 -0
- package/src/components/spot-light.ts +3 -0
- package/src/device/__tests__/extended-lighting-recovery.unit.test.ts +24 -0
- package/src/device/gpu-residency.ts +140 -9
- package/src/device/lifecycle-transaction.ts +12 -0
- package/src/environment/frame.ts +6 -24
- package/src/environment/lifecycle.ts +20 -1
- package/src/errors/gpu-driven.ts +92 -0
- package/src/errors/index.ts +1 -0
- package/src/errors/recover.ts +32 -0
- package/src/errors/render.ts +341 -143
- package/src/extract/camera.ts +3 -3
- package/src/extract/directional-shadow-projection.ts +61 -0
- package/src/extract/environment.ts +57 -0
- package/src/extract/gpu-driven.ts +108 -0
- package/src/extract/visibility.ts +2 -1
- package/src/features/fullscreen.ts +3 -0
- package/src/features/targets.ts +4 -1
- package/src/features/types.ts +10 -0
- package/src/fullscreen-post-process-pass.ts +43 -2
- package/src/gpu-driven/batch-topology.ts +207 -28
- package/src/gpu-driven/prepared-draw.ts +208 -0
- package/src/gpu-driven/production-raster.ts +953 -43
- package/src/gpu-driven/view-gpu.ts +411 -29
- package/src/gpu-scene-schema.ts +13 -0
- package/src/gpu-scene.ts +140 -64
- package/src/gpu-usage.ts +0 -1
- package/src/hdrp-buffers.ts +169 -63
- package/src/ibl/IblPipelineCache.ts +11 -0
- package/src/ibl/kernel-cache.ts +88 -0
- package/src/index.ts +222 -0
- package/src/inspection-types.ts +276 -1
- package/src/instances-derived-bounds.ts +171 -0
- package/src/internal.ts +38 -0
- package/src/light-buffer-layout.ts +155 -310
- package/src/materials.ts +16 -2
- package/src/mesh-material-bindings.ts +132 -0
- package/src/pbr-pipeline.ts +255 -60
- package/src/pipeline/standard-forward-lane.ts +93 -16
- package/src/pipeline/standard-lighting/errors.ts +6 -0
- package/src/pipeline/standard-lighting/graph.ts +158 -0
- package/src/pipeline/standard-lighting/inspection.ts +88 -0
- package/src/pipeline/standard-lighting/layout.ts +31 -0
- package/src/pipeline/standard-lighting/light-frame.ts +35 -0
- package/src/pipeline/standard-lighting/membership.ts +43 -0
- package/src/pipeline/standard-lighting/prepare.ts +37 -0
- package/src/pipeline/standard-lighting/topology.ts +120 -0
- package/src/pipeline/standard-lighting/transport.ts +78 -0
- package/src/pipeline/standard-pipeline.ts +124 -193
- package/src/pipeline/standard-post.ts +26 -7
- package/src/pipeline/standard-profile.ts +17 -47
- package/src/pipeline-builder.ts +5 -2
- package/src/pipeline-spec.ts +95 -21
- package/src/plugin.ts +4 -0
- package/src/point-shadow-inspection.ts +55 -0
- package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +56 -0
- package/src/prepare/extended-lighting/ltc-resources.ts +136 -0
- package/src/prepare/extended-lighting/resources.ts +389 -0
- package/src/prepare/extended-lighting/spot-modifiers.ts +194 -0
- package/src/prepare/extended-lighting/state.ts +92 -0
- package/src/record/__tests__/gpu-timing.unit.test.ts +177 -0
- package/src/record/__tests__/temporal-payload.unit.test.ts +64 -1
- package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +20 -1
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
- package/src/record/frame-lighting.ts +591 -452
- package/src/record/frame-snapshot.ts +92 -39
- package/src/record/frame-targets.ts +17 -0
- package/src/record/frame.ts +662 -158
- package/src/record/gpu-pass-timing/contract.ts +180 -0
- package/src/record/gpu-pass-timing/errors.ts +34 -0
- package/src/record/gpu-pass-timing/index.ts +37 -0
- package/src/record/gpu-pass-timing/parser.ts +97 -0
- package/src/record/gpu-pass-timing/session.ts +938 -0
- package/src/record/gpu-timing.ts +112 -39
- package/src/record/helpers.ts +0 -58
- package/src/record/main-pass-geometry.ts +324 -119
- package/src/record/main-pass-material.ts +103 -10
- package/src/record/main-pass-sprite-draws.ts +99 -103
- package/src/record/main-pass.ts +71 -15
- package/src/record/mesh-ssbo.ts +47 -36
- package/src/record/render-context.ts +136 -3
- package/src/record/shadow-pass.ts +83 -68
- package/src/record/skybox-post-pass.ts +20 -4
- package/src/record/typed-frame-graph.ts +1034 -43
- package/src/record/view-ubo.ts +72 -47
- package/src/reflection/filter.ts +81 -0
- package/src/reflection/gpu-table.ts +44 -0
- package/src/reflection/inspection.ts +67 -0
- package/src/reflection/projection.ts +476 -0
- package/src/reflection/record-owner.ts +1283 -0
- package/src/render-contract.ts +93 -10
- package/src/render-graph-primitives.ts +9 -4
- package/src/render-pipeline.ts +122 -2
- package/src/render-system-extract.ts +1041 -225
- package/src/render-system.ts +1310 -85
- package/src/renderer.ts +222 -0
- package/src/scene/__tests__/changed-block-summary.candidate.test.ts +36 -0
- package/src/scene/probe-blend-record.ts +54 -0
- package/src/scene/probe-blend.ts +813 -0
- package/src/scene/render-scene-types.ts +0 -7
- package/src/scene/render-scene.ts +942 -171
- package/src/scene/visibility/bounds.ts +57 -0
- package/src/scene/visibility/budget.ts +40 -0
- package/src/scene/visibility/facet.ts +400 -0
- package/src/scene/visibility/gpu-frame-timing.ts +101 -0
- package/src/scene/visibility/gpu-lod.ts +119 -0
- package/src/scene/visibility/inspection.ts +313 -0
- package/src/scene/visibility/lod-selector.ts +84 -0
- package/src/scene/visibility/occlusion-confidence.ts +478 -0
- package/src/scene/visibility/occlusion-pass.ts +165 -0
- package/src/scene/visibility/occlusion-query-pool.ts +178 -0
- package/src/scene/visibility/occlusion-runtime.ts +672 -0
- package/src/scene/visibility/types.ts +50 -0
- package/src/shadow-atlas.ts +5 -5
- package/src/ssao-buffers.ts +9 -2
- package/src/ssr/admission.ts +451 -0
- package/src/ssr/composition.ts +73 -0
- package/src/ssr/errors.ts +76 -0
- package/src/ssr/identity.ts +12 -0
- package/src/systems/skin-palette-allocator.ts +1 -1
- package/src/targets/contracts.ts +182 -0
- package/src/targets/graph-projection.ts +169 -0
- package/src/targets/material-source.ts +143 -0
- package/src/targets/owner.ts +214 -0
- package/src/targets/physical.ts +18 -0
- package/src/targets/readback.ts +153 -0
- package/src/temporal/frame-coordinator.ts +26 -0
- package/src/temporal/frame.ts +14 -1
- package/src/temporal/view.ts +11 -0
- package/src/tilemap-chunk-extract-system.ts +4 -4
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +59 -20
- package/src/typed-render-graph-primitives.ts +53 -3
- package/src/typed-shadow-passes.ts +46 -40
- package/src/volume/passes.ts +61 -58
- package/dist/.tsbuildinfo +0 -1
- package/dist/chunk-4XINDLAY.mjs.map +0 -1
- package/dist/chunk-CDTWTHZR.mjs.map +0 -1
- package/dist/chunk-M2MP4ZOU.mjs +0 -73
- package/dist/chunk-M2MP4ZOU.mjs.map +0 -1
- package/dist/chunk-PCHBPYML.mjs.map +0 -1
- package/dist/chunk-TBQJOK2L.mjs.map +0 -1
- package/dist/chunk-VFPLTKCU.mjs.map +0 -1
|
@@ -17,12 +17,144 @@ export interface ResolvedMeshMaterialBinding {
|
|
|
17
17
|
readonly source: MeshMaterialBindingSource;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
/** Lifecycle values projected from an already prepared resident binding. */
|
|
21
|
+
export type MeshMaterialBindingReadiness = 'ready' | 'pending' | 'failed' | 'last-known-good';
|
|
22
|
+
|
|
23
|
+
/** Structured producer failure retained by the renderer's bounded projection. */
|
|
24
|
+
export interface MeshMaterialBindingPreparationFailure {
|
|
25
|
+
readonly code: string;
|
|
26
|
+
readonly expected: string;
|
|
27
|
+
readonly hint: string;
|
|
28
|
+
readonly detail?: Readonly<Record<string, unknown>>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface MeshMaterialBindingSamplerObservation {
|
|
32
|
+
readonly handle: number;
|
|
33
|
+
readonly resident: boolean;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface MeshMaterialBindingTextureObservation {
|
|
37
|
+
readonly handle: number;
|
|
38
|
+
readonly mipLevelCount: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* One material-slot's bounded resident projection. The renderer reports only
|
|
43
|
+
* resources it actually resolved for the slot; Pack/AssetRegistry lifecycle
|
|
44
|
+
* records stay owned by the producer and are never copied here.
|
|
45
|
+
*/
|
|
46
|
+
export interface MeshMaterialBindingResidency {
|
|
47
|
+
readonly readiness: MeshMaterialBindingReadiness;
|
|
48
|
+
readonly samplers: readonly MeshMaterialBindingSamplerObservation[];
|
|
49
|
+
readonly textures: readonly MeshMaterialBindingTextureObservation[];
|
|
50
|
+
readonly preparationFailure?: MeshMaterialBindingPreparationFailure;
|
|
51
|
+
}
|
|
52
|
+
|
|
20
53
|
/** Public read-only observation of the bindings used by the last frame. */
|
|
21
54
|
export interface MeshMaterialBindingObservation {
|
|
22
55
|
readonly worldId: number;
|
|
23
56
|
readonly entityKey: number;
|
|
24
57
|
readonly bindings: readonly ResolvedMeshMaterialBinding[];
|
|
25
58
|
readonly diagnostics: readonly MeshMaterialBindingDiagnostic[];
|
|
59
|
+
/** One resident projection per resolved material slot. */
|
|
60
|
+
readonly residency: readonly MeshMaterialBindingResidency[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface MeshMaterialBindingSummary {
|
|
64
|
+
readonly total: number;
|
|
65
|
+
readonly ready: number;
|
|
66
|
+
readonly pending: number;
|
|
67
|
+
readonly failed: number;
|
|
68
|
+
readonly lastKnownGood: number;
|
|
69
|
+
readonly textureCount: number;
|
|
70
|
+
readonly samplerCount: number;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const EMPTY_RESIDENCY: MeshMaterialBindingResidency = Object.freeze({
|
|
74
|
+
readiness: 'pending',
|
|
75
|
+
samplers: Object.freeze([]),
|
|
76
|
+
textures: Object.freeze([]),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Build the sole renderer observation projection from the resident seam.
|
|
81
|
+
* Missing facts remain `pending`; they are never guessed from a URL, asset
|
|
82
|
+
* name, or authoring field. Slot cardinality is normalized so aggregation is
|
|
83
|
+
* deterministic even while a preparation candidate is incomplete.
|
|
84
|
+
*/
|
|
85
|
+
export function projectMeshMaterialBindingObservation(input: {
|
|
86
|
+
readonly worldId: number;
|
|
87
|
+
readonly entityKey: number;
|
|
88
|
+
readonly bindings: readonly ResolvedMeshMaterialBinding[];
|
|
89
|
+
readonly diagnostics: readonly MeshMaterialBindingDiagnostic[];
|
|
90
|
+
readonly residency?: readonly MeshMaterialBindingResidency[];
|
|
91
|
+
}): MeshMaterialBindingObservation {
|
|
92
|
+
const residency = input.bindings.map((_, index) => {
|
|
93
|
+
const value = input.residency?.[index] ?? EMPTY_RESIDENCY;
|
|
94
|
+
return Object.freeze({
|
|
95
|
+
...value,
|
|
96
|
+
samplers: Object.freeze(value.samplers.map((sampler) => Object.freeze({ ...sampler }))),
|
|
97
|
+
textures: Object.freeze(value.textures.map((texture) => Object.freeze({ ...texture }))),
|
|
98
|
+
...(value.preparationFailure === undefined
|
|
99
|
+
? {}
|
|
100
|
+
: {
|
|
101
|
+
preparationFailure: Object.freeze({
|
|
102
|
+
...value.preparationFailure,
|
|
103
|
+
...(value.preparationFailure.detail === undefined
|
|
104
|
+
? {}
|
|
105
|
+
: { detail: Object.freeze({ ...value.preparationFailure.detail }) }),
|
|
106
|
+
}),
|
|
107
|
+
}),
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
worldId: input.worldId,
|
|
112
|
+
entityKey: input.entityKey,
|
|
113
|
+
bindings: Object.freeze([...input.bindings]),
|
|
114
|
+
diagnostics: Object.freeze([...input.diagnostics]),
|
|
115
|
+
residency: Object.freeze(residency),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Recompute bounded readiness/resource counts from retained observations. */
|
|
120
|
+
export function summarizeMeshMaterialBindings(
|
|
121
|
+
observations: readonly MeshMaterialBindingObservation[],
|
|
122
|
+
): MeshMaterialBindingSummary {
|
|
123
|
+
let ready = 0;
|
|
124
|
+
let pending = 0;
|
|
125
|
+
let failed = 0;
|
|
126
|
+
let lastKnownGood = 0;
|
|
127
|
+
let textureCount = 0;
|
|
128
|
+
let samplerCount = 0;
|
|
129
|
+
for (const observation of observations) {
|
|
130
|
+
for (const residency of observation.residency) {
|
|
131
|
+
switch (residency.readiness) {
|
|
132
|
+
case 'ready':
|
|
133
|
+
ready += 1;
|
|
134
|
+
break;
|
|
135
|
+
case 'pending':
|
|
136
|
+
pending += 1;
|
|
137
|
+
break;
|
|
138
|
+
case 'failed':
|
|
139
|
+
failed += 1;
|
|
140
|
+
break;
|
|
141
|
+
case 'last-known-good':
|
|
142
|
+
lastKnownGood += 1;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
textureCount += residency.textures.length;
|
|
146
|
+
samplerCount += residency.samplers.length;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
total: ready + pending + failed + lastKnownGood,
|
|
151
|
+
ready,
|
|
152
|
+
pending,
|
|
153
|
+
failed,
|
|
154
|
+
lastKnownGood,
|
|
155
|
+
textureCount,
|
|
156
|
+
samplerCount,
|
|
157
|
+
};
|
|
26
158
|
}
|
|
27
159
|
|
|
28
160
|
export type ResolveMeshMaterialBindingsResult =
|
package/src/pbr-pipeline.ts
CHANGED
|
@@ -25,11 +25,11 @@ import type {
|
|
|
25
25
|
BindGroup,
|
|
26
26
|
BindGroupEntry,
|
|
27
27
|
BindGroupLayout,
|
|
28
|
-
BindGroupLayoutDescriptor,
|
|
29
28
|
Buffer,
|
|
30
29
|
PipelineLayout,
|
|
31
30
|
RhiDevice,
|
|
32
31
|
Sampler,
|
|
32
|
+
TextureFormat,
|
|
33
33
|
TextureView,
|
|
34
34
|
} from '@forgeax/engine-rhi';
|
|
35
35
|
import { DEFAULT_STANDARD_PBR_PARAM_SCHEMA, type ShaderCatalog } from '@forgeax/engine-shader';
|
|
@@ -72,6 +72,10 @@ export interface PbrPipelineLayoutBundle {
|
|
|
72
72
|
readonly meshArrayBgl: BindGroupLayout;
|
|
73
73
|
/** Per-instance storage BindGroupLayout (slot 3). */
|
|
74
74
|
readonly instancesBgl: BindGroupLayout;
|
|
75
|
+
/** Probe-enabled slot-3 BGL; aliases `instancesBgl` when probes are unavailable. */
|
|
76
|
+
readonly probeInstancesBgl: BindGroupLayout;
|
|
77
|
+
/** Same pipeline layout with the probe-enabled slot-3 BGL, when supported. */
|
|
78
|
+
readonly probePipelineLayout: PipelineLayout | null;
|
|
75
79
|
/**
|
|
76
80
|
* Same 4 layouts in slot order. Useful for assertion sites that check the
|
|
77
81
|
* pipeline-layout `bindGroupLayouts` array shape (t57 (a) + (d)).
|
|
@@ -84,6 +88,14 @@ export interface PbrPipelineLayoutBundle {
|
|
|
84
88
|
];
|
|
85
89
|
}
|
|
86
90
|
|
|
91
|
+
/** Derives the Standard PBR attachment list without allocating a closed path. */
|
|
92
|
+
export function standardPbrColorFormats(
|
|
93
|
+
baseFormat: TextureFormat,
|
|
94
|
+
fallbackDemand: boolean,
|
|
95
|
+
): readonly TextureFormat[] {
|
|
96
|
+
return fallbackDemand ? [baseFormat, 'rgba16float'] : [baseFormat];
|
|
97
|
+
}
|
|
98
|
+
|
|
87
99
|
// ─── Base entries (round-4 SSOT) ────────────────────────────────────────────
|
|
88
100
|
|
|
89
101
|
/**
|
|
@@ -325,14 +337,21 @@ export const INJECTION_KIND_LENGTHS = {
|
|
|
325
337
|
*/
|
|
326
338
|
export interface PbrCaps {
|
|
327
339
|
readonly storageBuffer: boolean;
|
|
340
|
+
/**
|
|
341
|
+
* Whether the selected material variant declares the optional extended
|
|
342
|
+
* lighting view resources. The default keeps the historical helper shape
|
|
343
|
+
* for callers that build the canonical full PBR layout; the renderer passes
|
|
344
|
+
* the device/variant decision explicitly.
|
|
345
|
+
*/
|
|
346
|
+
readonly extendedLighting?: boolean;
|
|
347
|
+
/** Selects the optional binding(1) ProbeBlendRecord lane. */
|
|
348
|
+
readonly probeBlend?: boolean;
|
|
328
349
|
/** Whether the device can carry the optional SpotLight projector texture. */
|
|
329
350
|
readonly projectorAvailable?: boolean;
|
|
330
351
|
}
|
|
331
352
|
|
|
332
353
|
/**
|
|
333
354
|
* The view BGL entry list. binding 0 = view UBO (vertex + fragment);
|
|
334
|
-
* binding 1 = pointLights (storage or uniform, per caps);
|
|
335
|
-
* binding 2 = spotLights (storage or uniform, per caps);
|
|
336
355
|
* binding 3 = directional shadowMap atlas (texture_depth_2d, vertex+fragment).
|
|
337
356
|
* feat-20260613-csm-cascaded-shadow-maps: this is the CSM atlas — N
|
|
338
357
|
* cascades tiled into one 2D depth texture, sampled via per-cascade UV
|
|
@@ -372,27 +391,18 @@ export interface PbrCaps {
|
|
|
372
391
|
* layout and consumed only by the dedicated points-lines shader).
|
|
373
392
|
* Isolated here so M4 round-4 tests can recreate the layout.
|
|
374
393
|
*
|
|
375
|
-
*
|
|
376
|
-
*
|
|
377
|
-
*
|
|
394
|
+
* Local lights are not part of the view group. Standard material variants
|
|
395
|
+
* consume the one Cluster payload in group(2), while this group retains only
|
|
396
|
+
* camera and shadow resources.
|
|
378
397
|
*/
|
|
379
398
|
export function buildPbrViewBglEntries(caps: PbrCaps): GPUBindGroupLayoutEntry[] {
|
|
380
|
-
const lightBufType: GPUBufferBindingType = caps.storageBuffer ? 'read-only-storage' : 'uniform';
|
|
381
399
|
const entries: GPUBindGroupLayoutEntry[] = [
|
|
382
400
|
{
|
|
383
401
|
binding: 0,
|
|
384
402
|
visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
binding: 1,
|
|
389
|
-
visibility: GPU_SHADER_STAGE_FRAGMENT,
|
|
390
|
-
buffer: { type: lightBufType },
|
|
391
|
-
},
|
|
392
|
-
{
|
|
393
|
-
binding: 2,
|
|
394
|
-
visibility: GPU_SHADER_STAGE_FRAGMENT,
|
|
395
|
-
buffer: { type: lightBufType },
|
|
403
|
+
// View captures use the same bind group with a per-face view slot.
|
|
404
|
+
// Keeping this dynamic is also valid for the display slot at offset 0.
|
|
405
|
+
buffer: { type: 'uniform', hasDynamicOffset: true },
|
|
396
406
|
},
|
|
397
407
|
{
|
|
398
408
|
binding: 3,
|
|
@@ -420,9 +430,9 @@ export function buildPbrViewBglEntries(caps: PbrCaps): GPUBindGroupLayoutEntry[]
|
|
|
420
430
|
// shadow-casting point light slot (shadowAtlasLayer in [0, 4)). Each
|
|
421
431
|
// lane stores `(near, far, 1/(far-near), 0)` so the fragment-shader
|
|
422
432
|
// depth-ref reconstruction (lighting-punctual.wgsl evalPointShadowed)
|
|
423
|
-
// can avoid sampling
|
|
424
|
-
//
|
|
425
|
-
// HDRP shaders even though the BGL declares it (charter P4 single SSOT
|
|
433
|
+
// can avoid sampling DirectLightSlot for the URP path. The shared
|
|
434
|
+
// DirectLightSlot metadata remains the identity owner, so binding 6 is
|
|
435
|
+
// unused on HDRP shaders even though the BGL declares it (charter P4 single SSOT
|
|
426
436
|
// BGL across pipelines; the HDRP variant simply doesn't reference the
|
|
427
437
|
// binding in WGSL, which is allowed).
|
|
428
438
|
{
|
|
@@ -472,12 +482,41 @@ export function buildPbrViewBglEntries(caps: PbrCaps): GPUBindGroupLayoutEntry[]
|
|
|
472
482
|
texture: { sampleType: 'depth', viewDimension: '2d' },
|
|
473
483
|
},
|
|
474
484
|
];
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
485
|
+
const extendedLighting = caps.extendedLighting ?? true;
|
|
486
|
+
if (extendedLighting) {
|
|
487
|
+
entries.push(
|
|
488
|
+
{
|
|
489
|
+
binding: 9,
|
|
490
|
+
visibility: GPU_SHADER_STAGE_FRAGMENT,
|
|
491
|
+
sampler: { type: 'filtering' },
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
binding: 11,
|
|
495
|
+
visibility: GPU_SHADER_STAGE_FRAGMENT,
|
|
496
|
+
texture: { sampleType: 'float', viewDimension: '2d-array' },
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
binding: 12,
|
|
500
|
+
visibility: GPU_SHADER_STAGE_FRAGMENT,
|
|
501
|
+
texture: { sampleType: 'float', viewDimension: '2d-array' },
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
binding: 13,
|
|
505
|
+
visibility: GPU_SHADER_STAGE_FRAGMENT,
|
|
506
|
+
texture: { sampleType: 'float', viewDimension: '2d' },
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
binding: 14,
|
|
510
|
+
visibility: GPU_SHADER_STAGE_FRAGMENT,
|
|
511
|
+
texture: { sampleType: 'float', viewDimension: '2d' },
|
|
512
|
+
},
|
|
513
|
+
{
|
|
514
|
+
binding: 15,
|
|
515
|
+
visibility: GPU_SHADER_STAGE_FRAGMENT,
|
|
516
|
+
buffer: { type: 'uniform' },
|
|
517
|
+
},
|
|
518
|
+
);
|
|
519
|
+
} else if (caps.projectorAvailable !== false) {
|
|
481
520
|
entries.push(
|
|
482
521
|
{
|
|
483
522
|
binding: 11,
|
|
@@ -506,8 +545,8 @@ export function buildPbrViewBglEntries(caps: PbrCaps): GPUBindGroupLayoutEntry[]
|
|
|
506
545
|
* material, mesh-array, instances]`; the material BGL is derived from the
|
|
507
546
|
* standard material schema and engine injection chain.
|
|
508
547
|
*
|
|
509
|
-
* `caps.storageBuffer===false` switches
|
|
510
|
-
*
|
|
548
|
+
* `caps.storageBuffer===false` switches the mesh-array and instances entries
|
|
549
|
+
* to `uniform`; local-light resources are never part of this view group.
|
|
511
550
|
*
|
|
512
551
|
* Throws on each `createBindGroupLayout` / `createPipelineLayout` Result
|
|
513
552
|
* failure -- the engine bootstrap path (createRenderer) wraps the call in
|
|
@@ -543,9 +582,27 @@ export function buildPbrPipelineLayouts(
|
|
|
543
582
|
|
|
544
583
|
// instances BGL.
|
|
545
584
|
const instancesBglRes = device.createBindGroupLayout(
|
|
546
|
-
buildBindGroupLayoutDescriptor(BGL_ONLY_SPEC_STUB, {
|
|
585
|
+
buildBindGroupLayoutDescriptor(BGL_ONLY_SPEC_STUB, {
|
|
586
|
+
kind: 'pbr-instances',
|
|
587
|
+
caps: { ...caps, probeBlend: false },
|
|
588
|
+
}),
|
|
547
589
|
);
|
|
548
590
|
if (!instancesBglRes.ok) throw instancesBglRes.error;
|
|
591
|
+
// ProbeBlendRecord is a storage-buffer-only ABI extension. A uniform
|
|
592
|
+
// fallback cannot afford the extra fragment-stage uniform binding on
|
|
593
|
+
// WebGL2/GLES, so do not even construct the probe BGL on that capability
|
|
594
|
+
// route. The record stage gates the matching variant and bind group with
|
|
595
|
+
// the same storage capability; aliasing the ordinary BGL keeps the bundle
|
|
596
|
+
// total and makes an accidental probe request fail closed at layout select.
|
|
597
|
+
const probeInstancesBglRes = caps.storageBuffer
|
|
598
|
+
? device.createBindGroupLayout(
|
|
599
|
+
buildBindGroupLayoutDescriptor(BGL_ONLY_SPEC_STUB, {
|
|
600
|
+
kind: 'pbr-instances',
|
|
601
|
+
caps: { ...caps, probeBlend: true },
|
|
602
|
+
}),
|
|
603
|
+
)
|
|
604
|
+
: { ok: true as const, value: instancesBglRes.value };
|
|
605
|
+
if (!probeInstancesBglRes.ok) throw probeInstancesBglRes.error;
|
|
549
606
|
|
|
550
607
|
// Pipeline layout (4 slots).
|
|
551
608
|
const layouts: readonly [BindGroupLayout, BindGroupLayout, BindGroupLayout, BindGroupLayout] = [
|
|
@@ -559,6 +616,21 @@ export function buildPbrPipelineLayouts(
|
|
|
559
616
|
bindGroupLayouts: layouts,
|
|
560
617
|
});
|
|
561
618
|
if (!pipelineLayoutRes.ok) throw pipelineLayoutRes.error;
|
|
619
|
+
const probeLayouts: readonly [
|
|
620
|
+
BindGroupLayout,
|
|
621
|
+
BindGroupLayout,
|
|
622
|
+
BindGroupLayout,
|
|
623
|
+
BindGroupLayout,
|
|
624
|
+
] = [viewBglRes.value, materialBglRes.value, meshArrayBglRes.value, probeInstancesBglRes.value];
|
|
625
|
+
let probePipelineLayout: PipelineLayout | null = null;
|
|
626
|
+
if (caps.storageBuffer) {
|
|
627
|
+
const probePipelineLayoutRes = device.createPipelineLayout({
|
|
628
|
+
label: 'pbr-probe-pl',
|
|
629
|
+
bindGroupLayouts: probeLayouts,
|
|
630
|
+
});
|
|
631
|
+
if (!probePipelineLayoutRes.ok) throw probePipelineLayoutRes.error;
|
|
632
|
+
probePipelineLayout = probePipelineLayoutRes.value;
|
|
633
|
+
}
|
|
562
634
|
|
|
563
635
|
return {
|
|
564
636
|
pipelineLayout: pipelineLayoutRes.value,
|
|
@@ -566,6 +638,8 @@ export function buildPbrPipelineLayouts(
|
|
|
566
638
|
materialBgl: materialBglRes.value,
|
|
567
639
|
meshArrayBgl: meshArrayBglRes.value,
|
|
568
640
|
instancesBgl: instancesBglRes.value,
|
|
641
|
+
probeInstancesBgl: probeInstancesBglRes.value,
|
|
642
|
+
probePipelineLayout,
|
|
569
643
|
bindGroupLayouts: layouts,
|
|
570
644
|
};
|
|
571
645
|
}
|
|
@@ -600,6 +674,22 @@ export function isSkinnedShadowCasterVariant(
|
|
|
600
674
|
);
|
|
601
675
|
}
|
|
602
676
|
|
|
677
|
+
export type PipelineGroup2Contract = 'mesh' | 'skin' | 'cluster' | 'skin-cluster';
|
|
678
|
+
|
|
679
|
+
/** Resolve group(2) from the composed WGSL artifact used to build the PSO. */
|
|
680
|
+
export function resolvePipelineGroup2Contract(source: string): PipelineGroup2Contract {
|
|
681
|
+
const withoutComments = source.replace(/\/\*[\s\S]*?\*\//gu, '').replace(/\/\/.*$/gmu, '');
|
|
682
|
+
const bindings = [
|
|
683
|
+
...withoutComments.matchAll(/@group\s*\(\s*2\s*\)\s*@binding\s*\(\s*(\d+)\s*\)/gu),
|
|
684
|
+
].map((match) => Number(match[1]));
|
|
685
|
+
const hasSkinBindings = bindings.includes(1) || bindings.includes(2);
|
|
686
|
+
const hasClusterBindings = bindings.some((binding) => binding >= 3);
|
|
687
|
+
if (hasSkinBindings && hasClusterBindings) return 'skin-cluster';
|
|
688
|
+
if (hasSkinBindings) return 'skin';
|
|
689
|
+
if (hasClusterBindings) return 'cluster';
|
|
690
|
+
return 'mesh';
|
|
691
|
+
}
|
|
692
|
+
|
|
603
693
|
/** Returns true for the engine-shipped standard-PBR material shader family. */
|
|
604
694
|
export function isStandardPbrMaterialShader(shaderId: string | undefined): boolean {
|
|
605
695
|
return (
|
|
@@ -631,9 +721,10 @@ export function isStandardPbrMaterialShader(shaderId: string | undefined): boole
|
|
|
631
721
|
|
|
632
722
|
/**
|
|
633
723
|
* Build the PBR skin pipeline layout (4 slots `[view, material,
|
|
634
|
-
* mesh-array(
|
|
724
|
+
* mesh-array(3-entry), instances]`). View / material / instances BGLs are
|
|
635
725
|
* shared with the standard-PBR layout (passed in via `pbr` bundle); the only
|
|
636
|
-
* new BGL is the
|
|
726
|
+
* new BGL is the 3-entry mesh-array slot for `meshes` + current/previous
|
|
727
|
+
* `palette` buffers.
|
|
637
728
|
*
|
|
638
729
|
* Throws on each `createBindGroupLayout` / `createPipelineLayout` Result
|
|
639
730
|
* failure -- the engine bootstrap path wraps the call in `runShimSyncStep`
|
|
@@ -644,8 +735,9 @@ export function buildPbrSkinLayouts(
|
|
|
644
735
|
caps: PbrCaps,
|
|
645
736
|
pbr: PbrPipelineLayoutBundle,
|
|
646
737
|
): PbrPipelineLayoutBundle {
|
|
647
|
-
//
|
|
648
|
-
//
|
|
738
|
+
// 3-entry mesh-array BGL: binding 0 meshes + binding 1 current palette
|
|
739
|
+
// + binding 2 previous palette. All use dynamic offsets for the same
|
|
740
|
+
// per-entity window contract.
|
|
649
741
|
const skinMeshArrayBglRes = device.createBindGroupLayout(
|
|
650
742
|
buildBindGroupLayoutDescriptor(BGL_ONLY_SPEC_STUB, {
|
|
651
743
|
kind: 'pbr-skin-mesh-array',
|
|
@@ -665,6 +757,21 @@ export function buildPbrSkinLayouts(
|
|
|
665
757
|
bindGroupLayouts: layouts,
|
|
666
758
|
});
|
|
667
759
|
if (!pipelineLayoutRes.ok) throw pipelineLayoutRes.error;
|
|
760
|
+
const probeLayouts: readonly [
|
|
761
|
+
BindGroupLayout,
|
|
762
|
+
BindGroupLayout,
|
|
763
|
+
BindGroupLayout,
|
|
764
|
+
BindGroupLayout,
|
|
765
|
+
] = [pbr.viewBgl, pbr.materialBgl, skinMeshArrayBglRes.value, pbr.probeInstancesBgl];
|
|
766
|
+
let probePipelineLayout: PipelineLayout | null = null;
|
|
767
|
+
if (caps.storageBuffer) {
|
|
768
|
+
const probePipelineLayoutRes = device.createPipelineLayout({
|
|
769
|
+
label: 'pbr-skin-probe-pl',
|
|
770
|
+
bindGroupLayouts: probeLayouts,
|
|
771
|
+
});
|
|
772
|
+
if (!probePipelineLayoutRes.ok) throw probePipelineLayoutRes.error;
|
|
773
|
+
probePipelineLayout = probePipelineLayoutRes.value;
|
|
774
|
+
}
|
|
668
775
|
|
|
669
776
|
return {
|
|
670
777
|
pipelineLayout: pipelineLayoutRes.value,
|
|
@@ -672,10 +779,46 @@ export function buildPbrSkinLayouts(
|
|
|
672
779
|
materialBgl: pbr.materialBgl,
|
|
673
780
|
meshArrayBgl: skinMeshArrayBglRes.value,
|
|
674
781
|
instancesBgl: pbr.instancesBgl,
|
|
782
|
+
probeInstancesBgl: pbr.probeInstancesBgl,
|
|
783
|
+
probePipelineLayout,
|
|
675
784
|
bindGroupLayouts: layouts,
|
|
676
785
|
};
|
|
677
786
|
}
|
|
678
787
|
|
|
788
|
+
/** Project the canonical group(2) resources for a PBR skin draw. */
|
|
789
|
+
export function createPbrSkinMeshBindGroupEntries(
|
|
790
|
+
meshBuffer: Buffer,
|
|
791
|
+
meshSize: number,
|
|
792
|
+
paletteBuffer: Buffer,
|
|
793
|
+
paletteWindowBytes: number,
|
|
794
|
+
): BindGroupEntry[] {
|
|
795
|
+
return [
|
|
796
|
+
{
|
|
797
|
+
binding: 0,
|
|
798
|
+
resource: { kind: 'buffer', value: { buffer: meshBuffer, offset: 0, size: meshSize } },
|
|
799
|
+
},
|
|
800
|
+
...[1, 2].map((binding) => ({
|
|
801
|
+
binding,
|
|
802
|
+
resource: {
|
|
803
|
+
kind: 'buffer' as const,
|
|
804
|
+
value: {
|
|
805
|
+
buffer: paletteBuffer,
|
|
806
|
+
offset: 0,
|
|
807
|
+
size: paletteWindowBytes,
|
|
808
|
+
},
|
|
809
|
+
},
|
|
810
|
+
})),
|
|
811
|
+
];
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
/** Project all dynamic offsets for the canonical PBR skin group(2) shape. */
|
|
815
|
+
export function pbrSkinMeshDynamicOffsets(
|
|
816
|
+
meshOffset: number,
|
|
817
|
+
paletteOffset: number,
|
|
818
|
+
): readonly [number, number, number] {
|
|
819
|
+
return [meshOffset, paletteOffset, paletteOffset];
|
|
820
|
+
}
|
|
821
|
+
|
|
679
822
|
// ─── Unlit material BGL factory ─────────────────────────────────────────────
|
|
680
823
|
|
|
681
824
|
/**
|
|
@@ -763,7 +906,7 @@ export type { BindGroup };
|
|
|
763
906
|
// existing behaviour (plan-strategy D-4 "pbr / unlit / sprite-atlas
|
|
764
907
|
// behaviour unchanged" / requirements Edge Cases).
|
|
765
908
|
//
|
|
766
|
-
// Variant set string format mirrors the
|
|
909
|
+
// Variant set string format mirrors the Standard boot variant /
|
|
767
910
|
// HDRP variant set string idiom in `pipeline-spec.ts` (`+`-separated kv
|
|
768
911
|
// pairs); the record stage threads this string through the per-shader
|
|
769
912
|
// pipeline-cache key + lazy-build `getMaterialShaderPipeline` lookup.
|
|
@@ -806,13 +949,14 @@ export const SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET = '';
|
|
|
806
949
|
* - `'unlit-material'` — 7 entries: base PBR material only (no inject)
|
|
807
950
|
* - `'hdrp-7-slot'` — 7 entries (binding 0 + 3..8): HDRP cluster + SSAO group(2) BGL
|
|
808
951
|
* 2. Caps-driven literal shapes (no shader):
|
|
809
|
-
* - `'pbr-view'` —
|
|
810
|
-
*
|
|
952
|
+
* - `'pbr-view'` — camera/shadow bindings, optional projector
|
|
953
|
+
* texture/sampler (11/12), and the Points/Lines UBO (10). Local lights
|
|
954
|
+
* are carried exclusively by the Standard Cluster group(2).
|
|
811
955
|
* (directional 3/4, point 5/6, cascade 7, spot atlas 8; the former
|
|
812
956
|
* spot lightViewProj matrices moved into the View UBO)
|
|
813
957
|
* - `'pbr-mesh-array'` — 1 entry: per-entity mesh SSBO (dynamic-offset)
|
|
814
958
|
* - `'pbr-instances'` — 1 entry: per-instance SSBO (no dynamic-offset)
|
|
815
|
-
* - `'pbr-skin-mesh-array'` —
|
|
959
|
+
* - `'pbr-skin-mesh-array'` — 3 entries: meshes + current/previous palette
|
|
816
960
|
* 3. Attachment-driven (fullscreen post-process):
|
|
817
961
|
* - `'fullscreen-post'` — 2 entries: input texture + sampler. The texture
|
|
818
962
|
* `sampleType` is derived from `spec.attachments` (plan §R3 fix):
|
|
@@ -855,17 +999,20 @@ export interface BindGroupLayoutDescriptorOutput {
|
|
|
855
999
|
}
|
|
856
1000
|
|
|
857
1001
|
/** Build the canonical HDRP group(2) bind-group layout. */
|
|
858
|
-
export function createHdrpBindGroupLayoutDescriptor(
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
const meshBufType: GPUBufferBindingType = storageBuffer ? 'read-only-storage' : 'uniform';
|
|
862
|
-
const clusterBufType: GPUBufferBindingType = storageBuffer ? 'read-only-storage' : 'uniform';
|
|
1002
|
+
export function createHdrpBindGroupLayoutDescriptor(): BindGroupLayoutDescriptorOutput {
|
|
1003
|
+
const meshBufType: GPUBufferBindingType = 'read-only-storage';
|
|
1004
|
+
const clusterBufType: GPUBufferBindingType = 'read-only-storage';
|
|
863
1005
|
return {
|
|
864
1006
|
label: 'hdrp-unified-bgl-group2',
|
|
865
1007
|
entries: [
|
|
866
1008
|
{
|
|
867
1009
|
binding: 0,
|
|
868
|
-
|
|
1010
|
+
// Standard fragment lighting (transmission/refraction and clustered
|
|
1011
|
+
// evaluation) reads the same mesh transform window as the vertex
|
|
1012
|
+
// stage. Keep this visibility in the HDRP descriptor aligned with
|
|
1013
|
+
// the URP mesh-array descriptor; restricting it to vertex makes the
|
|
1014
|
+
// HDRP pipeline invalid when fs_main accesses `meshes[0]`.
|
|
1015
|
+
visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
|
|
869
1016
|
buffer: { type: meshBufType, hasDynamicOffset: true },
|
|
870
1017
|
},
|
|
871
1018
|
// Bindings 1 and 2 stay absent for the URP physical isolation gap.
|
|
@@ -903,6 +1050,33 @@ export function createHdrpBindGroupLayoutDescriptor(
|
|
|
903
1050
|
};
|
|
904
1051
|
}
|
|
905
1052
|
|
|
1053
|
+
/** Build the HDRP group(2) layout for the clustered skin variant. */
|
|
1054
|
+
export function createHdrpSkinBindGroupLayoutDescriptor(): BindGroupLayoutDescriptorOutput {
|
|
1055
|
+
const base = createHdrpBindGroupLayoutDescriptor();
|
|
1056
|
+
const baseEntries = base.entries;
|
|
1057
|
+
if (baseEntries === undefined || baseEntries[0] === undefined) {
|
|
1058
|
+
throw new Error('HDRP base group(2) layout must declare mesh binding 0');
|
|
1059
|
+
}
|
|
1060
|
+
const paletteType: GPUBufferBindingType = 'read-only-storage';
|
|
1061
|
+
return {
|
|
1062
|
+
label: 'hdrp-skin-unified-bgl-group2',
|
|
1063
|
+
entries: [
|
|
1064
|
+
baseEntries[0],
|
|
1065
|
+
{
|
|
1066
|
+
binding: 1,
|
|
1067
|
+
visibility: GPU_SHADER_STAGE_VERTEX,
|
|
1068
|
+
buffer: { type: paletteType, hasDynamicOffset: true },
|
|
1069
|
+
},
|
|
1070
|
+
{
|
|
1071
|
+
binding: 2,
|
|
1072
|
+
visibility: GPU_SHADER_STAGE_VERTEX,
|
|
1073
|
+
buffer: { type: paletteType, hasDynamicOffset: true },
|
|
1074
|
+
},
|
|
1075
|
+
...baseEntries.slice(1),
|
|
1076
|
+
],
|
|
1077
|
+
};
|
|
1078
|
+
}
|
|
1079
|
+
|
|
906
1080
|
/**
|
|
907
1081
|
* Build a `GPUBindGroupLayoutDescriptor` from a PipelineSpec, dispatching on
|
|
908
1082
|
* `options.kind` to one of 9 closed BGL shapes (D-13 round-2).
|
|
@@ -1004,19 +1178,35 @@ export function buildBindGroupLayoutDescriptor(
|
|
|
1004
1178
|
const meshBufType: GPUBufferBindingType = caps.storageBuffer
|
|
1005
1179
|
? 'read-only-storage'
|
|
1006
1180
|
: 'uniform';
|
|
1181
|
+
const entries: GPUBindGroupLayoutEntry[] = [
|
|
1182
|
+
{
|
|
1183
|
+
binding: 0,
|
|
1184
|
+
visibility: GPU_SHADER_STAGE_VERTEX,
|
|
1185
|
+
buffer: { type: meshBufType, hasDynamicOffset: false },
|
|
1186
|
+
},
|
|
1187
|
+
...(caps.probeBlend === true
|
|
1188
|
+
? [
|
|
1189
|
+
{
|
|
1190
|
+
// Per-object fragment lane; the record is always exactly 160B.
|
|
1191
|
+
binding: 1,
|
|
1192
|
+
visibility: GPU_SHADER_STAGE_FRAGMENT,
|
|
1193
|
+
buffer: { type: meshBufType, hasDynamicOffset: true },
|
|
1194
|
+
},
|
|
1195
|
+
]
|
|
1196
|
+
: []),
|
|
1197
|
+
];
|
|
1007
1198
|
return {
|
|
1008
|
-
label: 'pbr-instances-bgl',
|
|
1009
|
-
entries:
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
],
|
|
1199
|
+
label: caps.probeBlend === true ? 'pbr-probe-instances-bgl' : 'pbr-instances-bgl',
|
|
1200
|
+
entries: entries.map((entry) =>
|
|
1201
|
+
entry.binding === 0
|
|
1202
|
+
? {
|
|
1203
|
+
...entry,
|
|
1204
|
+
// Standard transmission reads the same per-instance transform in
|
|
1205
|
+
// fs_main to convert glTF unit-space thickness into world metres.
|
|
1206
|
+
visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
|
|
1207
|
+
}
|
|
1208
|
+
: entry,
|
|
1209
|
+
),
|
|
1020
1210
|
};
|
|
1021
1211
|
}
|
|
1022
1212
|
case 'pbr-skin-mesh-array': {
|
|
@@ -1037,6 +1227,11 @@ export function buildBindGroupLayoutDescriptor(
|
|
|
1037
1227
|
visibility: GPU_SHADER_STAGE_VERTEX,
|
|
1038
1228
|
buffer: { type: meshBufType, hasDynamicOffset: true },
|
|
1039
1229
|
},
|
|
1230
|
+
{
|
|
1231
|
+
binding: 2,
|
|
1232
|
+
visibility: GPU_SHADER_STAGE_VERTEX,
|
|
1233
|
+
buffer: { type: meshBufType, hasDynamicOffset: true },
|
|
1234
|
+
},
|
|
1040
1235
|
],
|
|
1041
1236
|
};
|
|
1042
1237
|
}
|
|
@@ -1068,10 +1263,10 @@ export function buildBindGroupLayoutDescriptor(
|
|
|
1068
1263
|
};
|
|
1069
1264
|
}
|
|
1070
1265
|
case 'hdrp-7-slot': {
|
|
1071
|
-
//
|
|
1072
|
-
//
|
|
1073
|
-
|
|
1074
|
-
const desc = createHdrpBindGroupLayoutDescriptor(
|
|
1266
|
+
// Standard unified BGL for group(2): 9 entries (binding 0 + 3..8).
|
|
1267
|
+
// Cluster variants are admitted only when storage buffers are present;
|
|
1268
|
+
// there is no uniform-backed cluster shape.
|
|
1269
|
+
const desc = createHdrpBindGroupLayoutDescriptor();
|
|
1075
1270
|
return {
|
|
1076
1271
|
label: desc.label ?? 'hdrp-unified-bgl-group2',
|
|
1077
1272
|
entries: [...(desc.entries ?? [])],
|