@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
package/src/record/mesh-ssbo.ts
CHANGED
|
@@ -325,6 +325,8 @@ export function isMeshSsboDevMode(): boolean {
|
|
|
325
325
|
* @internal
|
|
326
326
|
*/
|
|
327
327
|
let _meshSsboScratch = new Uint8Array(0);
|
|
328
|
+
/** @internal */
|
|
329
|
+
let _meshSsboScratchFloats = new Float32Array(0);
|
|
328
330
|
|
|
329
331
|
/**
|
|
330
332
|
* feat-20260704 M3/w21: per-renderable `entity_world` upload (batched). All N
|
|
@@ -358,60 +360,69 @@ export function uploadMeshSsboBatch(
|
|
|
358
360
|
// Grow the module-scoped scratch monotonically; zero the used range.
|
|
359
361
|
if (_meshSsboScratch.length < neededBytes) {
|
|
360
362
|
_meshSsboScratch = new Uint8Array(neededBytes);
|
|
363
|
+
_meshSsboScratchFloats = new Float32Array(_meshSsboScratch.buffer);
|
|
361
364
|
} else {
|
|
362
365
|
_meshSsboScratch.fill(0, 0, neededBytes);
|
|
363
366
|
}
|
|
364
367
|
const normalMatrixScratch = mat3.create();
|
|
368
|
+
const strideFloats = MESH_PER_ENTITY_STRIDE / Float32Array.BYTES_PER_ELEMENT;
|
|
365
369
|
for (let i = 0; i < slotCount; i++) {
|
|
366
370
|
const entry = validatedOrdered[i];
|
|
367
371
|
if (entry === undefined) continue;
|
|
368
|
-
//
|
|
369
|
-
//
|
|
370
|
-
//
|
|
371
|
-
|
|
372
|
-
const slot = new Float32Array(_meshSsboScratch.buffer, i * MESH_PER_ENTITY_STRIDE, 48);
|
|
372
|
+
// Address the reusable flat view directly. Constructing one typed-array
|
|
373
|
+
// wrapper per visible entity made this otherwise contiguous upload create
|
|
374
|
+
// tens of thousands of short-lived JS objects every frame.
|
|
375
|
+
const slot = i * strideFloats;
|
|
373
376
|
const isFoldHead = foldDispatchPlan?.headBuckets.has(i) === true;
|
|
374
377
|
if (isFoldHead) {
|
|
375
378
|
// identity mat4
|
|
376
|
-
slot
|
|
377
|
-
slot
|
|
378
|
-
slot
|
|
379
|
-
slot
|
|
379
|
+
_meshSsboScratchFloats[slot] = 1;
|
|
380
|
+
_meshSsboScratchFloats[slot + 5] = 1;
|
|
381
|
+
_meshSsboScratchFloats[slot + 10] = 1;
|
|
382
|
+
_meshSsboScratchFloats[slot + 15] = 1;
|
|
380
383
|
// identity mat3 normal (cols at slot offsets 16/20/24)
|
|
381
|
-
slot
|
|
382
|
-
slot
|
|
383
|
-
slot
|
|
384
|
+
_meshSsboScratchFloats[slot + 16] = 1;
|
|
385
|
+
_meshSsboScratchFloats[slot + 20] = 1;
|
|
386
|
+
_meshSsboScratchFloats[slot + 24] = 1;
|
|
384
387
|
// Fold heads use the instance storage path; keep the mesh temporal
|
|
385
388
|
// fields deterministic for shader variants that still read the slot.
|
|
386
|
-
slot
|
|
387
|
-
slot
|
|
388
|
-
slot
|
|
389
|
-
slot
|
|
390
|
-
slot
|
|
389
|
+
_meshSsboScratchFloats[slot + 28] = 1;
|
|
390
|
+
_meshSsboScratchFloats[slot + 33] = 1;
|
|
391
|
+
_meshSsboScratchFloats[slot + 38] = 1;
|
|
392
|
+
_meshSsboScratchFloats[slot + 43] = 1;
|
|
393
|
+
_meshSsboScratchFloats[slot + 44] = 1;
|
|
391
394
|
} else {
|
|
392
395
|
const worldFromLocal = entry.source.transform.world;
|
|
393
|
-
for (let k = 0; k < 16; k++) slot
|
|
396
|
+
for (let k = 0; k < 16; k++) _meshSsboScratchFloats[slot + k] = worldFromLocal[k] ?? 0;
|
|
394
397
|
const normal = mat3.normalMatrix(normalMatrixScratch, worldFromLocal);
|
|
395
|
-
slot
|
|
396
|
-
slot
|
|
397
|
-
slot
|
|
398
|
-
slot
|
|
399
|
-
slot
|
|
400
|
-
slot
|
|
401
|
-
slot
|
|
402
|
-
slot
|
|
403
|
-
slot
|
|
398
|
+
_meshSsboScratchFloats[slot + 16] = normal[0] ?? 0;
|
|
399
|
+
_meshSsboScratchFloats[slot + 17] = normal[1] ?? 0;
|
|
400
|
+
_meshSsboScratchFloats[slot + 18] = normal[2] ?? 0;
|
|
401
|
+
_meshSsboScratchFloats[slot + 20] = normal[3] ?? 0;
|
|
402
|
+
_meshSsboScratchFloats[slot + 21] = normal[4] ?? 0;
|
|
403
|
+
_meshSsboScratchFloats[slot + 22] = normal[5] ?? 0;
|
|
404
|
+
_meshSsboScratchFloats[slot + 24] = normal[6] ?? 0;
|
|
405
|
+
_meshSsboScratchFloats[slot + 25] = normal[7] ?? 0;
|
|
406
|
+
_meshSsboScratchFloats[slot + 26] = normal[8] ?? 0;
|
|
404
407
|
const previousWorld = entry.source.temporal?.previousTransform.world ?? worldFromLocal;
|
|
405
|
-
for (let k = 0; k < 16; k++)
|
|
406
|
-
|
|
407
|
-
|
|
408
|
+
for (let k = 0; k < 16; k++) {
|
|
409
|
+
_meshSsboScratchFloats[slot + 28 + k] = previousWorld[k] ?? 0;
|
|
410
|
+
}
|
|
411
|
+
let reactiveMaterial = false;
|
|
412
|
+
for (const material of entry.source.materials) {
|
|
413
|
+
const shader = material.materialShaderId;
|
|
414
|
+
if (
|
|
408
415
|
material.transparent === true ||
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
(
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
416
|
+
shader === 'forgeax::sprite' ||
|
|
417
|
+
shader === 'forgeax::sprite-lit' ||
|
|
418
|
+
(shader !== undefined && !shader.startsWith('forgeax::'))
|
|
419
|
+
) {
|
|
420
|
+
reactiveMaterial = true;
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
_meshSsboScratchFloats[slot + 44] =
|
|
425
|
+
entry.source.temporal?.reactive === true || reactiveMaterial ? 1 : 0;
|
|
415
426
|
}
|
|
416
427
|
}
|
|
417
428
|
if (neededBytes > 0) {
|
|
@@ -11,6 +11,7 @@ import type {
|
|
|
11
11
|
PipelineLayout,
|
|
12
12
|
Result,
|
|
13
13
|
RhiCanvasContext,
|
|
14
|
+
RhiCommandEncoder,
|
|
14
15
|
RhiDevice,
|
|
15
16
|
RenderPipeline as RhiRenderPipeline,
|
|
16
17
|
Sampler,
|
|
@@ -19,7 +20,7 @@ import type {
|
|
|
19
20
|
TextureView,
|
|
20
21
|
} from '@forgeax/engine-rhi';
|
|
21
22
|
import { err, ok, RhiError } from '@forgeax/engine-rhi';
|
|
22
|
-
import type { MaterialRuntimeArtifact } from '@forgeax/engine-shader';
|
|
23
|
+
import type { MaterialRuntimeArtifact, MaterialShaderArtifact } from '@forgeax/engine-shader';
|
|
23
24
|
import type {
|
|
24
25
|
MaterialRenderState,
|
|
25
26
|
ParamSchemaEntry,
|
|
@@ -41,10 +42,21 @@ import {
|
|
|
41
42
|
import type { SkylightFallback } from '../ibl/skylight-bind-group';
|
|
42
43
|
import type { BloomInspection } from '../inspection-types';
|
|
43
44
|
import type { HealthListenerRegistry, RhiErrorListenerRegistry } from '../lifecycle';
|
|
45
|
+
import type { PipelineGroup2Contract } from '../pbr-pipeline';
|
|
46
|
+
import type { StandardTopologyInputValue } from '../pipeline/standard-lighting/topology';
|
|
44
47
|
import type { StandardProfile } from '../pipeline/standard-profile';
|
|
45
48
|
import type { PipelineBuilderShaderModuleFactory } from '../pipeline-builder';
|
|
46
49
|
import type { PointsLinesInspection } from '../points-lines/inspection';
|
|
47
50
|
import type { PointsLinesRecordPlan } from '../points-lines/record';
|
|
51
|
+
import type { ReflectionProbeTable } from '../reflection/gpu-table';
|
|
52
|
+
import type { ReflectionProbeSelectionResult } from '../reflection/projection';
|
|
53
|
+
import type { SsrAdmissionIdentity } from '../ssr/identity';
|
|
54
|
+
import type { GpuPassTimingReason } from './gpu-pass-timing/errors';
|
|
55
|
+
import type {
|
|
56
|
+
GpuPassTimingCapture,
|
|
57
|
+
GpuPassTimingFrameIdentity,
|
|
58
|
+
GpuPassTimingSession,
|
|
59
|
+
} from './gpu-pass-timing/session';
|
|
48
60
|
|
|
49
61
|
export interface PointsLinesRecordSubmission {
|
|
50
62
|
readonly plan: PointsLinesRecordPlan;
|
|
@@ -53,6 +65,44 @@ export interface PointsLinesRecordSubmission {
|
|
|
53
65
|
readonly layoutProjection: VertexLayoutProjection;
|
|
54
66
|
}
|
|
55
67
|
|
|
68
|
+
export interface ReflectionProbeRecordState {
|
|
69
|
+
readonly table: ReflectionProbeTable;
|
|
70
|
+
readonly selections: ReadonlyMap<string, ReflectionProbeSelectionResult>;
|
|
71
|
+
readonly graph: import('./typed-frame-graph').ReflectionProbeGraphState;
|
|
72
|
+
/** Detached committed fallback projections joined by main-pass renderable key. */
|
|
73
|
+
readonly fallbackProjections?: ReadonlyMap<
|
|
74
|
+
string,
|
|
75
|
+
import('../inspection-types').ReflectionFallbackReceipt
|
|
76
|
+
>;
|
|
77
|
+
/** Demand is derived from this frame's renderable/source selection. */
|
|
78
|
+
readonly fallbackDemand?: boolean;
|
|
79
|
+
/** True when at least one selected row must prove a non-zero readback. */
|
|
80
|
+
readonly fallbackHasNonNeutral?: boolean;
|
|
81
|
+
readonly completeSubmission: (
|
|
82
|
+
submitted: boolean,
|
|
83
|
+
completed?: Promise<unknown>,
|
|
84
|
+
fallbackOutput?: {
|
|
85
|
+
readonly format: TextureFormat;
|
|
86
|
+
readonly size: { readonly width: number; readonly height: number };
|
|
87
|
+
readonly frameId: number;
|
|
88
|
+
readonly graphGeneration: number;
|
|
89
|
+
readonly textureIdentity: number;
|
|
90
|
+
readonly readback?: Promise<{
|
|
91
|
+
readonly linearHdr: readonly [number, number, number, number];
|
|
92
|
+
readonly hash: string;
|
|
93
|
+
readonly graphGeneration: number;
|
|
94
|
+
readonly textureIdentity: number;
|
|
95
|
+
}>;
|
|
96
|
+
},
|
|
97
|
+
fallbackRequested?: boolean,
|
|
98
|
+
) => Promise<void>;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface MaterialShaderPipelineEntry {
|
|
102
|
+
readonly pipeline: RhiRenderPipeline;
|
|
103
|
+
readonly group2Contract: PipelineGroup2Contract;
|
|
104
|
+
}
|
|
105
|
+
|
|
56
106
|
import type {
|
|
57
107
|
RenderDebugOverlay,
|
|
58
108
|
RenderPipelineContext,
|
|
@@ -66,6 +116,8 @@ import type {
|
|
|
66
116
|
SkylightSnapshot,
|
|
67
117
|
} from '../render-system-extract';
|
|
68
118
|
import type { SkinPaletteAllocator } from '../systems/skin-palette-allocator';
|
|
119
|
+
import type { RenderTarget } from '../targets/contracts';
|
|
120
|
+
import type { RenderTargetPhysical } from '../targets/physical';
|
|
69
121
|
import type {
|
|
70
122
|
BindGroupCounts,
|
|
71
123
|
BloomFrameReceipts,
|
|
@@ -78,12 +130,18 @@ import type { FoldDispatchPlan } from './mesh-ssbo';
|
|
|
78
130
|
|
|
79
131
|
export interface RenderSystemRuntime {
|
|
80
132
|
readonly device: RhiDevice;
|
|
133
|
+
/** Internal backend-fixture hook evaluated at the submit transaction edge. */
|
|
134
|
+
readonly beforeSubmit?: ((device: RhiDevice) => RhiError | undefined) | undefined;
|
|
81
135
|
readonly deviceScope: DeviceScope;
|
|
82
136
|
readonly errorRegistry: RhiErrorListenerRegistry;
|
|
83
137
|
readonly debugOverlay?: RenderDebugOverlay | undefined;
|
|
84
138
|
readonly healthRegistry: HealthListenerRegistry;
|
|
85
139
|
readonly getMaterialProjection?: (materialGuid: string) => MaterialRenderProjection | undefined;
|
|
86
140
|
readonly getMaterialArtifact?: (specializationKey: string) => MaterialRuntimeArtifact | undefined;
|
|
141
|
+
/** Producer-owned cooked Standard PBR artifact used by GPU-driven projection. */
|
|
142
|
+
readonly getMaterialShaderArtifact?: (
|
|
143
|
+
materialShaderId: string,
|
|
144
|
+
) => MaterialShaderArtifact | undefined;
|
|
87
145
|
readonly getMaterialShaderPipeline?: (
|
|
88
146
|
materialShaderId: string,
|
|
89
147
|
isHdr: boolean,
|
|
@@ -101,7 +159,27 @@ export interface RenderSystemRuntime {
|
|
|
101
159
|
vertexLayoutProjection?: VertexLayoutProjection,
|
|
102
160
|
shaderModuleMode?: RenderFeatureShaderModuleMode,
|
|
103
161
|
layoutKindOverride?: 'pbr' | 'pbr-skin',
|
|
162
|
+
additionalColorFormats?: readonly GPUTextureFormat[],
|
|
104
163
|
) => RhiRenderPipeline | null;
|
|
164
|
+
readonly getMaterialShaderPipelineEntry?: (
|
|
165
|
+
materialShaderId: string,
|
|
166
|
+
isHdr: boolean,
|
|
167
|
+
renderState?: MaterialRenderState,
|
|
168
|
+
topology?: PrimitiveTopology,
|
|
169
|
+
indexFormat?: 'uint16' | 'uint32',
|
|
170
|
+
variantSet?: string,
|
|
171
|
+
passKind?: PassKind,
|
|
172
|
+
meshAttributes?: VertexAttributeMap,
|
|
173
|
+
sampleCount?: number,
|
|
174
|
+
colorFormatOverride?: GPUTextureFormat,
|
|
175
|
+
shaderUvSetCount?: number,
|
|
176
|
+
depthFormatOverride?: GPUTextureFormat | null,
|
|
177
|
+
vertexLayout?: string,
|
|
178
|
+
vertexLayoutProjection?: VertexLayoutProjection,
|
|
179
|
+
shaderModuleMode?: RenderFeatureShaderModuleMode,
|
|
180
|
+
layoutKindOverride?: 'pbr' | 'pbr-skin',
|
|
181
|
+
additionalColorFormats?: readonly GPUTextureFormat[],
|
|
182
|
+
) => MaterialShaderPipelineEntry | null;
|
|
105
183
|
readonly getMaterialShaderBindingContract?: (
|
|
106
184
|
materialShaderId: string,
|
|
107
185
|
) => 'group-0' | 'group-0-resource' | 'view-only' | 'view-and-scene-depth' | 'render-material';
|
|
@@ -116,10 +194,15 @@ export interface RenderSystemRuntime {
|
|
|
116
194
|
id: string,
|
|
117
195
|
bgl: BindGroupLayout,
|
|
118
196
|
colorFormat: GPUTextureFormat,
|
|
197
|
+
entry?: import('../fullscreen-post-process-pass').PostProcessShaderEntry,
|
|
119
198
|
) => RhiRenderPipeline | null;
|
|
120
199
|
readonly clearPostProcessPipelineCache?: (id: string) => void;
|
|
121
200
|
readonly invalidateShaderModule?: (label: string) => void;
|
|
122
201
|
readonly dynamicTextureStore?: DynamicTextureStore | undefined;
|
|
202
|
+
/** Resolves a render-target source to the active generation-owned GPU view. */
|
|
203
|
+
readonly resolveRenderTargetTextureSource?: (
|
|
204
|
+
source: import('../targets/contracts').RenderTargetTextureSource,
|
|
205
|
+
) => import('../targets/material-source').RenderTargetMaterialSourceBinding | undefined;
|
|
123
206
|
}
|
|
124
207
|
|
|
125
208
|
/** Renderer-owned bridge from retained Points/Lines facts into main geometry. */
|
|
@@ -231,6 +314,8 @@ export interface BloomPersistentBundle {
|
|
|
231
314
|
}
|
|
232
315
|
|
|
233
316
|
export interface PipelineState {
|
|
317
|
+
/** Device that owns every opaque handle in this pipeline state. */
|
|
318
|
+
readonly device: RhiDevice;
|
|
234
319
|
readonly meshes: ReadonlyMap<number, MeshGpuHandles>;
|
|
235
320
|
readonly format: TextureFormat;
|
|
236
321
|
readonly colorAttachmentFormat: TextureFormat;
|
|
@@ -246,9 +331,9 @@ export interface PipelineState {
|
|
|
246
331
|
readonly shadowCasterCascadeBuffer: Buffer;
|
|
247
332
|
readonly materialUniformBuffer: { readonly buffer: Buffer; readonly sizeInBytes: number };
|
|
248
333
|
readonly meshStorageBuffer: { readonly buffer: Buffer; readonly sizeInBytes: number };
|
|
249
|
-
readonly pointLightsBuffer: Buffer;
|
|
250
|
-
readonly spotLightsBuffer: Buffer;
|
|
251
334
|
readonly instancesBindGroupLayout: BindGroupLayout;
|
|
335
|
+
/** Probe-enabled slot-3 layout; omitted from no-probe bind groups. */
|
|
336
|
+
readonly probeInstancesBindGroupLayout?: BindGroupLayout;
|
|
252
337
|
readonly identityInstanceBuffer: Buffer;
|
|
253
338
|
readonly defaultSampler: Sampler;
|
|
254
339
|
readonly nearestSampler: Sampler;
|
|
@@ -258,17 +343,35 @@ export interface PipelineState {
|
|
|
258
343
|
readonly unlitPipelineMsaa: RhiRenderPipeline | null;
|
|
259
344
|
readonly unlitPipelineHdrMsaa: RhiRenderPipeline | null;
|
|
260
345
|
readonly pbrPipelineLayout: PipelineLayout | null;
|
|
346
|
+
readonly pbrProbePipelineLayout?: PipelineLayout | null;
|
|
261
347
|
readonly hdrpPbrPipelineLayout: PipelineLayout | null;
|
|
348
|
+
readonly hdrpProbePbrPipelineLayout?: PipelineLayout | null;
|
|
262
349
|
readonly hdrpClusterMembershipPipeline: ComputePipeline | null;
|
|
263
350
|
readonly hdrpClusterMembershipBindGroupLayout: BindGroupLayout | null;
|
|
264
351
|
readonly pbrSkinPipelineLayout: PipelineLayout | null;
|
|
352
|
+
readonly pbrSkinProbePipelineLayout?: PipelineLayout | null;
|
|
265
353
|
readonly pbrSkinMeshBindGroupLayout: BindGroupLayout | null;
|
|
354
|
+
readonly hdrpSkinPipelineLayout: PipelineLayout | null;
|
|
355
|
+
readonly hdrpSkinMeshBindGroupLayout: BindGroupLayout | null;
|
|
266
356
|
readonly skinPaletteAllocator: SkinPaletteAllocator | null;
|
|
267
357
|
readonly defaultWhiteTextureView: TextureView;
|
|
268
358
|
readonly defaultNormalTextureView: TextureView;
|
|
269
359
|
readonly unlitPipelineHdr: RhiRenderPipeline | null;
|
|
270
360
|
readonly shadowFallbackTextureView: TextureView;
|
|
271
361
|
readonly shadowAtlasFallbackTextureView: TextureView;
|
|
362
|
+
readonly extendedLightingAvailable?: boolean;
|
|
363
|
+
readonly iesProfileTexture?: Texture;
|
|
364
|
+
readonly cookieTexture?: Texture;
|
|
365
|
+
readonly cookieMatrixBuffer?: Buffer;
|
|
366
|
+
spotModifierUploadState?: {
|
|
367
|
+
readonly ies: Map<number, number>;
|
|
368
|
+
readonly cookie: Map<number, number>;
|
|
369
|
+
readonly cookieMatrix: Map<number, number>;
|
|
370
|
+
};
|
|
371
|
+
readonly iesProfileTextureView?: TextureView;
|
|
372
|
+
readonly cookieTextureView?: TextureView;
|
|
373
|
+
readonly ltcLambertTextureView?: TextureView;
|
|
374
|
+
readonly ltcGgxTextureView?: TextureView;
|
|
272
375
|
readonly shadowParamsBuffer: Buffer;
|
|
273
376
|
readonly skylightFallback: SkylightFallback | null;
|
|
274
377
|
readonly perPassResources: PerPassResources;
|
|
@@ -276,10 +379,20 @@ export interface PipelineState {
|
|
|
276
379
|
|
|
277
380
|
export interface RenderSystemInternals extends RenderSystemRuntime {
|
|
278
381
|
readonly canvas: HTMLCanvasElement | OffscreenCanvas;
|
|
382
|
+
/** Build identity injected by the host's build-tool adapter. */
|
|
383
|
+
readonly build?: string | undefined;
|
|
384
|
+
/** Host identity binding for the renderer-owned SSR dependency seam. */
|
|
385
|
+
readonly ssrIdentity?: SsrAdmissionIdentity | undefined;
|
|
279
386
|
readonly standardProfile?: StandardProfile | undefined;
|
|
280
387
|
readonly standardPipeline: RenderFrameState['activePipeline'];
|
|
281
388
|
readonly featureHost?: RenderFeatureHost | undefined;
|
|
282
389
|
readonly shaderModuleFactory?: PipelineBuilderShaderModuleFactory;
|
|
390
|
+
readonly createShaderModule?: (
|
|
391
|
+
device: import('@forgeax/engine-rhi').RhiDevice,
|
|
392
|
+
descriptor: { readonly code: string; readonly label?: string },
|
|
393
|
+
) => Promise<
|
|
394
|
+
Result<import('@forgeax/engine-rhi').ShaderModule, import('@forgeax/engine-rhi').RhiError>
|
|
395
|
+
>;
|
|
283
396
|
/** Optional handle-first factory for feature-owned generated shader programs. */
|
|
284
397
|
readonly immediateShaderModuleFactory?: PipelineBuilderShaderModuleFactory;
|
|
285
398
|
readonly profiler?: Profiler | undefined;
|
|
@@ -305,6 +418,16 @@ export interface RenderSystemInternals extends RenderSystemRuntime {
|
|
|
305
418
|
label: string,
|
|
306
419
|
) => RhiRenderPipeline | null)
|
|
307
420
|
| undefined;
|
|
421
|
+
gpuPassTimingSession?: GpuPassTimingSession | undefined;
|
|
422
|
+
gpuPassTimingCapture?: GpuPassTimingCapture | undefined;
|
|
423
|
+
gpuPassTimingSubmittedWork?: Promise<void> | undefined;
|
|
424
|
+
gpuPassTimingFrameIdentity?: GpuPassTimingFrameIdentity | undefined;
|
|
425
|
+
gpuPassTimingBeginReason?: GpuPassTimingReason | undefined;
|
|
426
|
+
readonly getRenderTargetPhysical?: (target: RenderTarget) => RenderTargetPhysical | undefined;
|
|
427
|
+
readonly encodeRenderTargetReadbacks?: (
|
|
428
|
+
encoder: RhiCommandEncoder,
|
|
429
|
+
faces?: readonly number[],
|
|
430
|
+
) => void;
|
|
308
431
|
/** Composed renderer utility sources installed atomically at build-ready. */
|
|
309
432
|
volumetricFogShaders?: VolumetricFogShaderSources | undefined;
|
|
310
433
|
}
|
|
@@ -318,6 +441,8 @@ export interface _StandardForwardSceneView {
|
|
|
318
441
|
readonly validated: readonly ValidatedRenderable[];
|
|
319
442
|
readonly validatedOrdered: readonly ValidatedRenderable[];
|
|
320
443
|
readonly viewBindGroup: BindGroup | null;
|
|
444
|
+
/** Dynamic View-UBO slot used by auxiliary cube/probe face cameras. */
|
|
445
|
+
readonly viewBindGroupDynamicOffset?: number;
|
|
321
446
|
readonly meshBindGroup: BindGroup | null;
|
|
322
447
|
readonly frameState: RenderFrameState;
|
|
323
448
|
readonly dispatchCounts: DispatchCounts;
|
|
@@ -329,6 +454,8 @@ export interface _StandardForwardSceneView {
|
|
|
329
454
|
readonly directionalShadowCacheReuse: boolean;
|
|
330
455
|
readonly world: World;
|
|
331
456
|
readonly gpuDrivenEntityKeys: ReadonlySet<number>;
|
|
457
|
+
/** Renderer-local world namespace paired with gpuDrivenEntityKeys. */
|
|
458
|
+
readonly gpuDrivenWorldKeys?: readonly number[];
|
|
332
459
|
readonly tonemapActive: boolean;
|
|
333
460
|
readonly geometryColorView: TextureView | null;
|
|
334
461
|
readonly geometryDepthView: TextureView | null;
|
|
@@ -337,9 +464,13 @@ export interface _StandardForwardSceneView {
|
|
|
337
464
|
readonly splitLdrSprite: boolean;
|
|
338
465
|
readonly ldrSpritePassView: TextureView | null;
|
|
339
466
|
readonly transparentColorFormat?: GPUTextureFormat;
|
|
467
|
+
/** Second Standard main-pass attachment used by the fallback producer. */
|
|
468
|
+
readonly reflectionFallbackColorFormat?: GPUTextureFormat;
|
|
340
469
|
readonly dispatch: readonly DispatchEntry[];
|
|
341
470
|
readonly hdrpClusterBindGroup: BindGroup | null;
|
|
342
471
|
readonly hdrpClusterMembershipBindGroup: BindGroup | null;
|
|
472
|
+
/** Prepared Standard lighting declaration accepted by this graph frame. */
|
|
473
|
+
readonly standardLighting?: StandardTopologyInputValue;
|
|
343
474
|
readonly foldDispatchPlan: FoldDispatchPlan | null;
|
|
344
475
|
readonly materialSlotIndices: readonly (readonly number[])[];
|
|
345
476
|
readonly materialSlots: readonly MaterialSnapshot[];
|
|
@@ -347,12 +478,14 @@ export interface _StandardForwardSceneView {
|
|
|
347
478
|
readonly materialSlotCount: number;
|
|
348
479
|
readonly pointsLines: PointsLinesRecordOwner | undefined;
|
|
349
480
|
readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;
|
|
481
|
+
readonly reflectionProbes?: ReflectionProbeRecordState;
|
|
350
482
|
materialUboPayloadCache?: {
|
|
351
483
|
readonly materialSlots: readonly MaterialSnapshot[];
|
|
352
484
|
readonly materialSlotCount: number;
|
|
353
485
|
readonly payload: Uint8Array;
|
|
354
486
|
};
|
|
355
487
|
hdrpSsaoBlurredView?: TextureView;
|
|
488
|
+
readonly occlusion?: import('../scene/visibility/occlusion-runtime').OcclusionFrameProjection;
|
|
356
489
|
}
|
|
357
490
|
|
|
358
491
|
export type _InternalRenderPipelineContext = RenderPipelineContext & _StandardForwardSceneView;
|
|
@@ -18,15 +18,18 @@ import { assembleMaterialWithSkylightEntries } from '../ibl/skylight-bind-group'
|
|
|
18
18
|
import type { InstanceBufferCacheEntry } from '../instance-buffer-cache';
|
|
19
19
|
import {
|
|
20
20
|
buildPbrMaterialUserRegionEntries,
|
|
21
|
+
createPbrSkinMeshBindGroupEntries,
|
|
22
|
+
pbrSkinMeshDynamicOffsets,
|
|
21
23
|
SHADOW_CASTER_SHADER_ID,
|
|
22
24
|
shadowCasterVariantSet,
|
|
23
25
|
} from '../pbr-pipeline';
|
|
26
|
+
import { COOKIE_MATRIX_BYTES } from '../prepare/extended-lighting/resources';
|
|
24
27
|
import type { DispatchEntry, ExtractedLights } from '../render-system-extract';
|
|
25
28
|
import { matchPass } from '../systems/pass-selector';
|
|
26
29
|
import { worldEntityKey } from './frame-snapshot';
|
|
30
|
+
import { resolveGeometryInstancesBindGroup } from './main-pass-geometry';
|
|
27
31
|
import {
|
|
28
32
|
getOrCreateFromChain,
|
|
29
|
-
getOrCreatePerEntity,
|
|
30
33
|
MAX_UNIFORM_INSTANCES,
|
|
31
34
|
MESH_PER_ENTITY_STRIDE,
|
|
32
35
|
MESH_SSBO_BYTES,
|
|
@@ -81,23 +84,79 @@ function ensureTypedShadowViewBg(
|
|
|
81
84
|
const { runtime, frameState, pipelineState } = c;
|
|
82
85
|
const shadowSampler = pipelineState.perPassResources.shadowSampler;
|
|
83
86
|
if (shadowSampler === null) return null;
|
|
87
|
+
const extendedLighting = pipelineState.extendedLightingAvailable ?? false;
|
|
88
|
+
const iesProfileTextureView = pipelineState.iesProfileTextureView;
|
|
89
|
+
const cookieTextureView = pipelineState.cookieTextureView;
|
|
90
|
+
const cookieMatrixBuffer = pipelineState.cookieMatrixBuffer;
|
|
91
|
+
const ltcLambertTextureView = pipelineState.ltcLambertTextureView;
|
|
92
|
+
const ltcGgxTextureView = pipelineState.ltcGgxTextureView;
|
|
93
|
+
const extendedLightingCacheKeys: object[] = [];
|
|
94
|
+
const extendedLightingEntries: BindGroupEntry[] = [];
|
|
95
|
+
if (extendedLighting) {
|
|
96
|
+
if (
|
|
97
|
+
iesProfileTextureView === undefined ||
|
|
98
|
+
cookieTextureView === undefined ||
|
|
99
|
+
cookieMatrixBuffer === undefined ||
|
|
100
|
+
ltcLambertTextureView === undefined ||
|
|
101
|
+
ltcGgxTextureView === undefined
|
|
102
|
+
) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
extendedLightingCacheKeys.push(
|
|
106
|
+
pipelineState.defaultSampler,
|
|
107
|
+
iesProfileTextureView,
|
|
108
|
+
cookieTextureView,
|
|
109
|
+
ltcLambertTextureView,
|
|
110
|
+
ltcGgxTextureView,
|
|
111
|
+
cookieMatrixBuffer,
|
|
112
|
+
);
|
|
113
|
+
extendedLightingEntries.push(
|
|
114
|
+
{
|
|
115
|
+
binding: 9,
|
|
116
|
+
resource: { kind: 'sampler', value: pipelineState.defaultSampler },
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
binding: 11,
|
|
120
|
+
resource: { kind: 'textureView', value: iesProfileTextureView },
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
binding: 12,
|
|
124
|
+
resource: { kind: 'textureView', value: cookieTextureView },
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
binding: 13,
|
|
128
|
+
resource: { kind: 'textureView', value: ltcLambertTextureView },
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
binding: 14,
|
|
132
|
+
resource: { kind: 'textureView', value: ltcGgxTextureView },
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
binding: 15,
|
|
136
|
+
resource: {
|
|
137
|
+
kind: 'buffer',
|
|
138
|
+
value: { buffer: cookieMatrixBuffer, size: COOKIE_MATRIX_BYTES },
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
);
|
|
142
|
+
}
|
|
84
143
|
const projectorAvailable = pipelineState.projectorAvailable !== false;
|
|
85
144
|
try {
|
|
86
145
|
return getOrCreateFromChain(
|
|
87
146
|
frameState.viewBindGroupCache,
|
|
88
147
|
[
|
|
89
148
|
pipelineState.viewUniformBuffer,
|
|
90
|
-
pipelineState.pointLightsBuffer,
|
|
91
|
-
pipelineState.spotLightsBuffer,
|
|
92
149
|
pipelineState.shadowFallbackTextureView,
|
|
93
150
|
shadowSampler,
|
|
94
151
|
pipelineState.shadowAtlasFallbackTextureView,
|
|
95
152
|
pipelineState.shadowParamsBuffer,
|
|
96
153
|
pipelineState.shadowCasterCascadeBuffer,
|
|
97
154
|
pipelineState.shadowFallbackTextureView,
|
|
98
|
-
...(
|
|
99
|
-
?
|
|
100
|
-
:
|
|
155
|
+
...(extendedLighting
|
|
156
|
+
? extendedLightingCacheKeys
|
|
157
|
+
: projectorAvailable
|
|
158
|
+
? [pipelineState.defaultWhiteTextureView, pipelineState.defaultSampler]
|
|
159
|
+
: []),
|
|
101
160
|
pipelineState.pointsLinesViewBuffer ?? pipelineState.viewUniformBuffer,
|
|
102
161
|
],
|
|
103
162
|
variant,
|
|
@@ -117,14 +176,6 @@ function ensureTypedShadowViewBg(
|
|
|
117
176
|
},
|
|
118
177
|
},
|
|
119
178
|
},
|
|
120
|
-
{
|
|
121
|
-
binding: 1,
|
|
122
|
-
resource: { kind: 'buffer', value: { buffer: pipelineState.pointLightsBuffer } },
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
binding: 2,
|
|
126
|
-
resource: { kind: 'buffer', value: { buffer: pipelineState.spotLightsBuffer } },
|
|
127
|
-
},
|
|
128
179
|
{
|
|
129
180
|
binding: 3,
|
|
130
181
|
resource: { kind: 'textureView', value: pipelineState.shadowFallbackTextureView },
|
|
@@ -159,6 +210,7 @@ function ensureTypedShadowViewBg(
|
|
|
159
210
|
binding: 8,
|
|
160
211
|
resource: { kind: 'textureView', value: pipelineState.shadowFallbackTextureView },
|
|
161
212
|
},
|
|
213
|
+
...extendedLightingEntries,
|
|
162
214
|
{
|
|
163
215
|
binding: 10,
|
|
164
216
|
resource: {
|
|
@@ -169,7 +221,7 @@ function ensureTypedShadowViewBg(
|
|
|
169
221
|
},
|
|
170
222
|
},
|
|
171
223
|
},
|
|
172
|
-
...(projectorAvailable
|
|
224
|
+
...(!extendedLighting && projectorAvailable
|
|
173
225
|
? [
|
|
174
226
|
{
|
|
175
227
|
binding: 11,
|
|
@@ -290,27 +342,12 @@ function skinnedShadowMeshBindGroup(
|
|
|
290
342
|
const created = c.runtime.device.createBindGroup({
|
|
291
343
|
label: 'shadow-pbr-skin-mesh-bg',
|
|
292
344
|
layout,
|
|
293
|
-
entries:
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
buffer: c.pipelineState.meshStorageBuffer.buffer,
|
|
300
|
-
size: c.runtime.device.caps.storageBuffer
|
|
301
|
-
? MESH_SSBO_BYTES
|
|
302
|
-
: MESH_UBO_FULL_ARRAY_BYTES,
|
|
303
|
-
},
|
|
304
|
-
},
|
|
305
|
-
},
|
|
306
|
-
{
|
|
307
|
-
binding: 1,
|
|
308
|
-
resource: {
|
|
309
|
-
kind: 'buffer',
|
|
310
|
-
value: { buffer: skin.buffer, size: allocator.bindingWindowBytes },
|
|
311
|
-
},
|
|
312
|
-
},
|
|
313
|
-
],
|
|
345
|
+
entries: createPbrSkinMeshBindGroupEntries(
|
|
346
|
+
c.pipelineState.meshStorageBuffer.buffer,
|
|
347
|
+
c.runtime.device.caps.storageBuffer ? MESH_SSBO_BYTES : MESH_UBO_FULL_ARRAY_BYTES,
|
|
348
|
+
skin.buffer,
|
|
349
|
+
allocator.bindingWindowBytes,
|
|
350
|
+
),
|
|
314
351
|
});
|
|
315
352
|
if (!created.ok) throw created.error;
|
|
316
353
|
return created.value;
|
|
@@ -338,7 +375,7 @@ export function encodeDirectionalShadowPass(
|
|
|
338
375
|
c.frameState.directionalShadowCacheRecorded = true;
|
|
339
376
|
pass.setViewport(viewport.x, viewport.y, viewport.w, viewport.h, 0, 1);
|
|
340
377
|
pass.setPipeline(pipeline);
|
|
341
|
-
pass.setBindGroup(0, viewBg, [0]);
|
|
378
|
+
pass.setBindGroup(0, viewBg, [0, 0]);
|
|
342
379
|
pass.setBindGroup(1, materialBg, [0]);
|
|
343
380
|
recordShadowCasterDraws(
|
|
344
381
|
c,
|
|
@@ -368,7 +405,7 @@ export function encodePointShadowPass(
|
|
|
368
405
|
const materialBg = ensureSpotShadowMaterialBg(c);
|
|
369
406
|
if (pipeline === null || viewBg === null || materialBg === null) return;
|
|
370
407
|
pass.setPipeline(pipeline);
|
|
371
|
-
pass.setBindGroup(0, viewBg, [0]);
|
|
408
|
+
pass.setBindGroup(0, viewBg, [0, 0]);
|
|
372
409
|
pass.setBindGroup(1, materialBg, [0]);
|
|
373
410
|
recordShadowCasterDraws(
|
|
374
411
|
c,
|
|
@@ -416,7 +453,7 @@ export function encodeSpotShadowPass(
|
|
|
416
453
|
1,
|
|
417
454
|
);
|
|
418
455
|
pass.setPipeline(pipeline);
|
|
419
|
-
pass.setBindGroup(0, viewBg, [0]);
|
|
456
|
+
pass.setBindGroup(0, viewBg, [0, 0]);
|
|
420
457
|
pass.setBindGroup(1, materialBg, [0]);
|
|
421
458
|
// Reuse the shared caster recorder. The compact spot-only loop used to
|
|
422
459
|
// depend on instance bindings created by a directional pass, so a scene
|
|
@@ -594,10 +631,11 @@ function recordShadowCasterDraws(
|
|
|
594
631
|
if (entry.source.skin !== undefined) {
|
|
595
632
|
const skinMeshBindGroup = skinnedShadowMeshBindGroup(c, entry);
|
|
596
633
|
if (skinMeshBindGroup === null) continue;
|
|
597
|
-
shadowPass.setBindGroup(
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
634
|
+
shadowPass.setBindGroup(
|
|
635
|
+
2,
|
|
636
|
+
skinMeshBindGroup,
|
|
637
|
+
pbrSkinMeshDynamicOffsets(i * MESH_PER_ENTITY_STRIDE, entry.source.skin.byteOffset),
|
|
638
|
+
);
|
|
601
639
|
} else {
|
|
602
640
|
shadowPass.setBindGroup(2, shadowMeshBindGroup, [i * MESH_PER_ENTITY_STRIDE]);
|
|
603
641
|
}
|
|
@@ -606,6 +644,7 @@ function recordShadowCasterDraws(
|
|
|
606
644
|
let shadowInstanceBuffer: Buffer = pipelineState.identityInstanceBuffer;
|
|
607
645
|
let shadowInstanceCount = 1;
|
|
608
646
|
const shadowInst = entry.source.instances;
|
|
647
|
+
if (shadowInst?.instanceCount === 0) continue;
|
|
609
648
|
if (shadowInst !== undefined) {
|
|
610
649
|
const uniformFallback = runtime.device.caps.storageBuffer === false;
|
|
611
650
|
// Over-cap uniform fallback can't fit the per-instance window — bind
|
|
@@ -682,31 +721,7 @@ function recordShadowCasterDraws(
|
|
|
682
721
|
// handle = shadowInstanceBuffer; the HDRP main pass read end (:3820 below)
|
|
683
722
|
// must look up the same (compositeKey, instBuffer) leaf or the shadow
|
|
684
723
|
// instances silently drop.
|
|
685
|
-
const shadowInstancesBg =
|
|
686
|
-
c.frameState.instancesBgPerEntity,
|
|
687
|
-
worldEntityKey(entry.source.worldId, entry.source.entityKey),
|
|
688
|
-
[shadowInstanceBuffer],
|
|
689
|
-
'shadow-instances',
|
|
690
|
-
() => {
|
|
691
|
-
const result = runtime.device.createBindGroup({
|
|
692
|
-
label: 'shadow-instances-bg',
|
|
693
|
-
layout: pipelineState.instancesBindGroupLayout,
|
|
694
|
-
entries: [
|
|
695
|
-
{
|
|
696
|
-
binding: 0,
|
|
697
|
-
resource: {
|
|
698
|
-
kind: 'buffer',
|
|
699
|
-
value: { buffer: shadowInstanceBuffer },
|
|
700
|
-
},
|
|
701
|
-
},
|
|
702
|
-
],
|
|
703
|
-
});
|
|
704
|
-
if (!result.ok) throw result.error;
|
|
705
|
-
return result.value;
|
|
706
|
-
},
|
|
707
|
-
c.bindGroupCounts,
|
|
708
|
-
);
|
|
709
|
-
|
|
724
|
+
const shadowInstancesBg = resolveGeometryInstancesBindGroup(c, shadowInstanceBuffer);
|
|
710
725
|
shadowPass.setBindGroup(3, shadowInstancesBg);
|
|
711
726
|
// feat-20260608 M4 / w16: per-submesh shadow draw loop.
|
|
712
727
|
// Only draw submeshes whose topology is triangle-list or triangle-strip
|