@forgeax/engine-render 0.1.20 → 0.1.21
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 +215 -0
- package/dist/.tsbuildinfo +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 +21 -18
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +9 -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 +3 -0
- 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-4XINDLAY.mjs → chunk-5YADUCA7.mjs} +1552 -1361
- package/dist/chunk-5YADUCA7.mjs.map +1 -0
- package/dist/{chunk-TBQJOK2L.mjs → chunk-6OPXDQ2E.mjs} +364 -51
- package/dist/chunk-6OPXDQ2E.mjs.map +1 -0
- package/dist/{chunk-M2MP4ZOU.mjs → chunk-BXBQQKFQ.mjs} +3 -9
- package/dist/chunk-BXBQQKFQ.mjs.map +1 -0
- package/dist/{chunk-CDTWTHZR.mjs → chunk-FS2KNUQH.mjs} +548 -6
- package/dist/chunk-FS2KNUQH.mjs.map +1 -0
- 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 +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/reflection-probe.d.ts +17 -0
- package/dist/components/reflection-probe.d.ts.map +1 -0
- package/dist/construct-renderer.mjs +5826 -1003
- package/dist/construct-renderer.mjs.map +1 -1
- 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/render.d.ts +141 -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/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.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +0 -1
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +19 -17
- 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 +28 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +51 -0
- 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.mjs +1 -1
- package/dist/light-buffer-layout.d.ts +10 -1
- package/dist/light-buffer-layout.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 +14 -4
- 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-spec.d.ts +40 -7
- package/dist/pipeline-spec.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/record/frame-lighting.d.ts +27 -32
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +28 -14
- 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 +10 -4
- 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 +8 -3
- package/dist/record/gpu-timing.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +22 -1
- 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/render-context.d.ts +43 -2
- 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 +72 -4
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +7 -4
- 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/projection.d.ts +91 -0
- package/dist/reflection/projection.d.ts.map +1 -0
- package/dist/render-contract.d.ts +49 -7
- 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 +42 -2
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +58 -17
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +17 -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/render-scene.d.ts +14 -0
- package/dist/scene/render-scene.d.ts.map +1 -1
- 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/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/index.mjs +3 -3
- package/dist/typed-render-graph-primitives.d.ts +1 -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 +2 -2
- 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 +7 -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__/device-feature-admission.unit.test.ts +73 -0
- package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -3
- package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
- package/src/__tests__/factory-contract.integration.test.ts +255 -29
- package/src/__tests__/fog-component.unit.test.ts +67 -0
- package/src/__tests__/fog.integration.test.ts +86 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -9
- package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +17 -1
- package/src/__tests__/gpu-driven-production.integration.test.ts +16 -17
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +12 -4
- 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__/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__/material-observation.integration.test.ts +101 -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__/public-surface.test-d.ts +10 -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-pass-encode.integration.test.ts +101 -0
- package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -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 +18 -3
- package/src/__tests__/render-feature-docs.unit.test.ts +1 -1
- 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 +48 -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 +132 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +11 -2
- 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 +232 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +8 -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 +377 -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__/typed-pipeline-topology.unit.test.ts +395 -14
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
- package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
- package/src/assembly/device-feature-admission.ts +73 -0
- package/src/assembly/directional-shadow-inspection.ts +122 -0
- package/src/assembly/factory.ts +877 -286
- package/src/assembly/host-contract.ts +25 -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/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 +2 -0
- package/src/components/light-helpers.ts +81 -7
- package/src/components/reflection-probe.ts +49 -0
- package/src/environment/frame.ts +6 -24
- package/src/environment/lifecycle.ts +12 -0
- package/src/errors/render.ts +286 -142
- package/src/extract/directional-shadow-projection.ts +61 -0
- package/src/extract/environment.ts +57 -0
- package/src/extract/visibility.ts +25 -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 +1 -0
- package/src/gpu-driven/production-raster.ts +1 -3
- package/src/gpu-scene.ts +8 -1
- package/src/hdrp-buffers.ts +165 -59
- package/src/ibl/IblPipelineCache.ts +11 -0
- package/src/ibl/kernel-cache.ts +88 -0
- package/src/index.ts +148 -0
- package/src/inspection-types.ts +56 -0
- package/src/instances-derived-bounds.ts +171 -0
- package/src/light-buffer-layout.ts +20 -5
- package/src/mesh-material-bindings.ts +132 -0
- package/src/pbr-pipeline.ts +106 -17
- package/src/pipeline/standard-forward-lane.ts +46 -16
- package/src/pipeline/standard-lighting/errors.ts +6 -0
- package/src/pipeline/standard-lighting/graph.ts +157 -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 +34 -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 +77 -0
- package/src/pipeline/standard-pipeline.ts +122 -193
- package/src/pipeline/standard-post.ts +26 -7
- package/src/pipeline/standard-profile.ts +17 -47
- package/src/pipeline-spec.ts +84 -21
- package/src/point-shadow-inspection.ts +55 -0
- package/src/record/__tests__/temporal-payload.unit.test.ts +42 -1
- package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
- package/src/record/frame-lighting.ts +367 -427
- package/src/record/frame-snapshot.ts +35 -27
- package/src/record/frame-targets.ts +17 -0
- package/src/record/frame.ts +261 -74
- 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 +21 -12
- package/src/record/main-pass-geometry.ts +120 -80
- package/src/record/main-pass-material.ts +95 -9
- package/src/record/main-pass-sprite-draws.ts +54 -25
- package/src/record/main-pass.ts +71 -15
- package/src/record/render-context.ts +72 -0
- package/src/record/shadow-pass.ts +17 -28
- package/src/record/skybox-post-pass.ts +20 -4
- package/src/record/typed-frame-graph.ts +893 -44
- package/src/record/view-ubo.ts +63 -28
- package/src/reflection/filter.ts +81 -0
- package/src/reflection/gpu-table.ts +44 -0
- package/src/reflection/projection.ts +281 -0
- package/src/render-contract.ts +76 -5
- package/src/render-graph-primitives.ts +9 -4
- package/src/render-pipeline.ts +117 -2
- package/src/render-system-extract.ts +557 -100
- package/src/render-system.ts +1095 -66
- package/src/renderer.ts +222 -0
- package/src/scene/render-scene.ts +115 -9
- package/src/shadow-atlas.ts +5 -5
- package/src/ssao-buffers.ts +9 -2
- 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/transmission/__tests__/standard-transmission.dawn.test.ts +59 -20
- package/src/typed-render-graph-primitives.ts +5 -3
- package/src/typed-shadow-passes.ts +46 -40
- package/src/volume/passes.ts +15 -9
- package/dist/chunk-4XINDLAY.mjs.map +0 -1
- package/dist/chunk-CDTWTHZR.mjs.map +0 -1
- package/dist/chunk-M2MP4ZOU.mjs.map +0 -1
- package/dist/chunk-TBQJOK2L.mjs.map +0 -1
|
@@ -1,4 +1,57 @@
|
|
|
1
1
|
import { err, ok } from '@forgeax/engine-types';
|
|
2
|
+
import { cubeArrayDepthDescriptor, comparisonSamplerDescriptor, cubeArrayDepthFaceView } from '@forgeax/engine-rhi';
|
|
3
|
+
|
|
4
|
+
// src/ibl/kernel-cache.ts
|
|
5
|
+
var REFLECTION_PROBE_IBL_STAGES = ["raw", "filtered", "publish"];
|
|
6
|
+
var kernelCaches = /* @__PURE__ */ new Map();
|
|
7
|
+
function createIblKernelCache(generation) {
|
|
8
|
+
const existing = kernelCaches.get(generation);
|
|
9
|
+
if (existing !== void 0) return existing;
|
|
10
|
+
const created = {
|
|
11
|
+
generation,
|
|
12
|
+
pipelineIdentity: {},
|
|
13
|
+
samplerIdentity: {},
|
|
14
|
+
brdfLutIdentity: {}
|
|
15
|
+
};
|
|
16
|
+
kernelCaches.set(generation, created);
|
|
17
|
+
return created;
|
|
18
|
+
}
|
|
19
|
+
function createProbeIblOutput(input) {
|
|
20
|
+
return {
|
|
21
|
+
...input,
|
|
22
|
+
raw: {},
|
|
23
|
+
filtered: {},
|
|
24
|
+
rawGeneration: 0,
|
|
25
|
+
filteredGeneration: 0,
|
|
26
|
+
lkg: true
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function beginProbeIblUpdate(output) {
|
|
30
|
+
return {
|
|
31
|
+
...output,
|
|
32
|
+
stages: REFLECTION_PROBE_IBL_STAGES,
|
|
33
|
+
nextStage: "raw",
|
|
34
|
+
candidateGeneration: output.filteredGeneration + 1
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function publishProbeIblOutput(update, result) {
|
|
38
|
+
if (!result.ok || result.stage !== update.nextStage) return update;
|
|
39
|
+
if (result.stage === "raw") {
|
|
40
|
+
return {
|
|
41
|
+
...update,
|
|
42
|
+
rawGeneration: update.candidateGeneration
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (result.stage === "filtered") return update;
|
|
46
|
+
return {
|
|
47
|
+
...update,
|
|
48
|
+
filteredGeneration: update.candidateGeneration,
|
|
49
|
+
lkg: true
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function resetIblKernelCaches() {
|
|
53
|
+
kernelCaches.clear();
|
|
54
|
+
}
|
|
2
55
|
|
|
3
56
|
// src/errors/render.ts
|
|
4
57
|
var LifecycleConstructionError = class extends Error {
|
|
@@ -28,23 +81,42 @@ var ShadowInvalidConfigError = class extends Error {
|
|
|
28
81
|
expected;
|
|
29
82
|
hint;
|
|
30
83
|
detail;
|
|
31
|
-
constructor(field,
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
const expected =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
);
|
|
84
|
+
constructor(field, actual, minOrBound, maxOrComparator, reason) {
|
|
85
|
+
const bound = typeof minOrBound === "number" ? typeof maxOrComparator === "number" ? { kind: "range", min: minOrBound, max: maxOrComparator } : {
|
|
86
|
+
kind: "lower-bound",
|
|
87
|
+
operator: maxOrComparator === ">" ? ">" : ">=",
|
|
88
|
+
value: minOrBound
|
|
89
|
+
} : minOrBound;
|
|
90
|
+
const resolvedReason = reason ?? shadowBoundReason(bound);
|
|
91
|
+
const expected = shadowBoundExpected(field, bound);
|
|
92
|
+
const hint = `set ${field} to ${resolvedReason}; got ${actual}`;
|
|
93
|
+
super(`shadow component .${field} is invalid: ${resolvedReason}; got ${actual}`);
|
|
42
94
|
this.name = "ShadowInvalidConfigError";
|
|
43
95
|
this.hint = hint;
|
|
44
96
|
this.expected = expected;
|
|
45
|
-
this.detail = { field,
|
|
97
|
+
this.detail = { field, actual, bound, reason: resolvedReason };
|
|
46
98
|
}
|
|
47
99
|
};
|
|
100
|
+
function shadowBoundExpected(field, bound) {
|
|
101
|
+
switch (bound.kind) {
|
|
102
|
+
case "range":
|
|
103
|
+
return `${field} in [${bound.min}, ${bound.max}]`;
|
|
104
|
+
case "lower-bound":
|
|
105
|
+
return `${field} ${bound.operator} ${bound.value}`;
|
|
106
|
+
case "allowed-values":
|
|
107
|
+
return `${field} in {${bound.values.join(", ")}}`;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function shadowBoundReason(bound) {
|
|
111
|
+
switch (bound.kind) {
|
|
112
|
+
case "range":
|
|
113
|
+
return `a value in [${bound.min}, ${bound.max}]`;
|
|
114
|
+
case "lower-bound":
|
|
115
|
+
return `a value ${bound.operator} ${bound.value}`;
|
|
116
|
+
case "allowed-values":
|
|
117
|
+
return `one of [${bound.values.join(", ")}]`;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
48
120
|
var EquirectProjectionFailedError = class extends Error {
|
|
49
121
|
code = "equirect-projection-failed";
|
|
50
122
|
expected;
|
|
@@ -60,52 +132,64 @@ var EquirectProjectionFailedError = class extends Error {
|
|
|
60
132
|
this.detail = { handle };
|
|
61
133
|
}
|
|
62
134
|
};
|
|
63
|
-
var
|
|
64
|
-
code = "
|
|
135
|
+
var StandardLightBudgetExceededError = class extends Error {
|
|
136
|
+
code = "standard-light-budget-exceeded";
|
|
65
137
|
expected;
|
|
66
138
|
hint;
|
|
67
139
|
detail;
|
|
68
140
|
constructor(actual, budget) {
|
|
69
141
|
const expected = `light count <= ${budget}`;
|
|
70
|
-
const hint = `${actual} lights exceed
|
|
71
|
-
super(`
|
|
72
|
-
this.name = "
|
|
142
|
+
const hint = `${actual} finite local lights exceed Standard budget ${budget}; reduce the local-light set or select a profile with a supported budget`;
|
|
143
|
+
super(`Standard light budget exceeded: ${actual} > ${budget}`);
|
|
144
|
+
this.name = "StandardLightBudgetExceededError";
|
|
73
145
|
this.expected = expected;
|
|
74
146
|
this.hint = hint;
|
|
75
147
|
this.detail = { actual, budget };
|
|
76
148
|
}
|
|
77
149
|
};
|
|
78
|
-
var
|
|
79
|
-
code = "
|
|
150
|
+
var StandardClusterIndexOverflowError = class extends Error {
|
|
151
|
+
code = "standard-cluster-index-overflow";
|
|
80
152
|
expected;
|
|
81
153
|
hint;
|
|
82
154
|
detail;
|
|
83
155
|
constructor(actual, capacity) {
|
|
84
156
|
const expected = `light index list entries <= ${capacity}`;
|
|
85
|
-
const hint = `cluster binner overflow: writeCount ${actual} exceeds capacity ${capacity}; reduce lights
|
|
86
|
-
super(`
|
|
87
|
-
this.name = "
|
|
157
|
+
const hint = `cluster binner overflow: writeCount ${actual} exceeds capacity ${capacity}; reduce finite local lights or choose a supported cluster layout`;
|
|
158
|
+
super(`Standard cluster index list overflow: ${actual} > ${capacity}`);
|
|
159
|
+
this.name = "StandardClusterIndexOverflowError";
|
|
88
160
|
this.expected = expected;
|
|
89
161
|
this.hint = hint;
|
|
90
162
|
this.detail = { actual, capacity };
|
|
91
163
|
}
|
|
92
164
|
};
|
|
93
|
-
var
|
|
94
|
-
code = "
|
|
95
|
-
expected;
|
|
165
|
+
var StandardClusterTransportUnavailableError = class extends Error {
|
|
166
|
+
code = "standard-cluster-transport-unavailable";
|
|
167
|
+
expected = "all requested local lights have a proven Cluster transport";
|
|
96
168
|
hint;
|
|
97
169
|
detail;
|
|
98
|
-
constructor(
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const hint = `WebGPU maxColorAttachments = ${actual} (need >= ${_expected}). Upgrade browser to latest Chrome/Edge/Safari, or use URP (forgeax::urp) instead of HDRP.`;
|
|
102
|
-
super(
|
|
103
|
-
`HDRP deferred caps insufficient: maxColorAttachments = ${actual} (need >= ${_expected})`
|
|
104
|
-
);
|
|
105
|
-
this.name = "HdrpDeferredCapsInsufficientError";
|
|
106
|
-
this.expected = _expectedStr;
|
|
170
|
+
constructor(requested, hint = "enable a proven Cluster storage transport before drawing") {
|
|
171
|
+
super(`Standard Cluster transport unavailable for ${requested} local lights`);
|
|
172
|
+
this.name = "StandardClusterTransportUnavailableError";
|
|
107
173
|
this.hint = hint;
|
|
108
|
-
this.detail = {
|
|
174
|
+
this.detail = { requested, admitted: 0 };
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
var StandardProfileInvalidError = class extends Error {
|
|
178
|
+
code = "standard-profile-invalid";
|
|
179
|
+
expected;
|
|
180
|
+
hint;
|
|
181
|
+
detail;
|
|
182
|
+
constructor(message, detail) {
|
|
183
|
+
super(message);
|
|
184
|
+
this.name = "StandardProfileInvalidError";
|
|
185
|
+
this.detail = detail ?? { field: "profile", actual: message };
|
|
186
|
+
if (this.detail.field === "clusterGrid") {
|
|
187
|
+
this.expected = "clusterGrid.{x,y,z} each positive integer in [1, 64]";
|
|
188
|
+
this.hint = "set clusterGrid.x, clusterGrid.y, and clusterGrid.z to positive integers in [1, 64]";
|
|
189
|
+
} else {
|
|
190
|
+
this.expected = "StandardProfile contains only supported fields and values";
|
|
191
|
+
this.hint = "repair the Standard profile fields and retry setProfile";
|
|
192
|
+
}
|
|
109
193
|
}
|
|
110
194
|
};
|
|
111
195
|
var PointShadowAtlasUninitializedError = class extends Error {
|
|
@@ -602,6 +686,73 @@ var PointsLinesPrepareFailedError = class extends Error {
|
|
|
602
686
|
this.detail = detail;
|
|
603
687
|
}
|
|
604
688
|
};
|
|
689
|
+
var RenderTargetDescriptorInvalidError = class extends Error {
|
|
690
|
+
code = "render-target-descriptor-invalid";
|
|
691
|
+
expected;
|
|
692
|
+
hint;
|
|
693
|
+
detail;
|
|
694
|
+
constructor(detail) {
|
|
695
|
+
super(`render-target-descriptor-invalid: ${detail.field} does not satisfy ${detail.expected}`);
|
|
696
|
+
this.name = "RenderTargetDescriptorInvalidError";
|
|
697
|
+
this.expected = detail.expected;
|
|
698
|
+
this.hint = `set RenderTargetDescriptor.${detail.field} to the expected value, then retry create or resize`;
|
|
699
|
+
this.detail = detail;
|
|
700
|
+
}
|
|
701
|
+
};
|
|
702
|
+
var RenderTargetCapabilityMissingError = class extends Error {
|
|
703
|
+
code = "render-target-capability-missing";
|
|
704
|
+
expected;
|
|
705
|
+
hint;
|
|
706
|
+
detail;
|
|
707
|
+
constructor(detail) {
|
|
708
|
+
super(
|
|
709
|
+
`render-target-capability-missing: ${detail.capability} does not admit ${detail.requested}`
|
|
710
|
+
);
|
|
711
|
+
this.name = "RenderTargetCapabilityMissingError";
|
|
712
|
+
this.expected = `${detail.capability} admits ${detail.requested}`;
|
|
713
|
+
this.hint = `choose an admitted target descriptor or use a backend providing ${detail.capability}`;
|
|
714
|
+
this.detail = detail;
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
var RenderTargetStateInvalidError = class extends Error {
|
|
718
|
+
code = "render-target-state-invalid";
|
|
719
|
+
expected;
|
|
720
|
+
hint;
|
|
721
|
+
detail;
|
|
722
|
+
constructor(detail) {
|
|
723
|
+
super(`render-target-state-invalid: ${detail.operation} cannot use ${detail.reason}`);
|
|
724
|
+
this.name = "RenderTargetStateInvalidError";
|
|
725
|
+
this.expected = `target state permits ${detail.operation}`;
|
|
726
|
+
this.hint = "use the Renderer that created the target, then initialize, recover, or stop using the destroyed token";
|
|
727
|
+
this.detail = detail;
|
|
728
|
+
}
|
|
729
|
+
};
|
|
730
|
+
var RenderTargetOperationFailedError = class extends Error {
|
|
731
|
+
code = "render-target-operation-failed";
|
|
732
|
+
expected;
|
|
733
|
+
hint;
|
|
734
|
+
detail;
|
|
735
|
+
constructor(detail) {
|
|
736
|
+
super(`render-target-operation-failed: ${detail.operation} failed during ${detail.stage}`);
|
|
737
|
+
this.name = "RenderTargetOperationFailedError";
|
|
738
|
+
this.expected = `${detail.operation} completes ${detail.stage}`;
|
|
739
|
+
this.hint = "inspect detail.cause, then retry, recover the Renderer, or retain the last-known-good generation";
|
|
740
|
+
this.detail = detail;
|
|
741
|
+
}
|
|
742
|
+
};
|
|
743
|
+
var RenderIntentInvalidError = class extends Error {
|
|
744
|
+
code = "render-intent-invalid";
|
|
745
|
+
expected;
|
|
746
|
+
hint;
|
|
747
|
+
detail;
|
|
748
|
+
constructor(component, value) {
|
|
749
|
+
super(`render-intent-invalid: ${component}.updateIntent is not an admitted value`);
|
|
750
|
+
this.name = "RenderIntentInvalidError";
|
|
751
|
+
this.expected = `${component}.updateIntent is one of 0, 1, or 2`;
|
|
752
|
+
this.hint = `set ${component}.updateIntent to 0, 1, or 2`;
|
|
753
|
+
this.detail = { component, field: "updateIntent", value, allowed: [0, 1, 2] };
|
|
754
|
+
}
|
|
755
|
+
};
|
|
605
756
|
var VolumeOwnerConflictError = class extends Error {
|
|
606
757
|
code = "volume-owner-conflict";
|
|
607
758
|
expected = "exactly one global VolumetricFog owner is authored";
|
|
@@ -843,13 +994,28 @@ function createSceneDataCatalog(options) {
|
|
|
843
994
|
};
|
|
844
995
|
}
|
|
845
996
|
|
|
846
|
-
// src/pipeline/standard-
|
|
847
|
-
var STANDARD_PIPELINE_ID = "forgeax::standard";
|
|
848
|
-
var STANDARD_LIGHT_COUNTS = [1, 32, 256];
|
|
997
|
+
// src/pipeline/standard-lighting/layout.ts
|
|
849
998
|
var DEFAULT_CLUSTER_GRID = { x: 16, y: 9, z: 24 };
|
|
850
999
|
var CLUSTER_GRID_STRIDE_U32 = 2;
|
|
851
1000
|
var LIGHT_INDEX_LIST_CAPACITY = 1048576;
|
|
852
1001
|
var MAX_LIGHTS = 256;
|
|
1002
|
+
function createStandardClusterLayout(grid = DEFAULT_CLUSTER_GRID) {
|
|
1003
|
+
const clusterCount = grid.x * grid.y * grid.z;
|
|
1004
|
+
return Object.freeze({
|
|
1005
|
+
grid,
|
|
1006
|
+
clusterCount,
|
|
1007
|
+
clusterGridStrideU32: CLUSTER_GRID_STRIDE_U32,
|
|
1008
|
+
clusterGridU32Length: clusterCount * CLUSTER_GRID_STRIDE_U32,
|
|
1009
|
+
lightIndexListCapacity: LIGHT_INDEX_LIST_CAPACITY,
|
|
1010
|
+
lightDataSlotCount: MAX_LIGHTS,
|
|
1011
|
+
lightBoundsInt32Length: MAX_LIGHTS * 6
|
|
1012
|
+
});
|
|
1013
|
+
}
|
|
1014
|
+
createStandardClusterLayout();
|
|
1015
|
+
|
|
1016
|
+
// src/pipeline/standard-profile.ts
|
|
1017
|
+
var STANDARD_PIPELINE_ID = "forgeax::standard";
|
|
1018
|
+
var STANDARD_LIGHT_COUNTS = [1, 32, 256];
|
|
853
1019
|
var STANDARD_POST_STAGE_NAMES = [
|
|
854
1020
|
"transparent-blend",
|
|
855
1021
|
"bloom",
|
|
@@ -861,28 +1027,175 @@ var STANDARD_POST_STAGE_NAMES = [
|
|
|
861
1027
|
var DEFAULT_STANDARD_PROFILE = Object.freeze({
|
|
862
1028
|
pipelineId: STANDARD_PIPELINE_ID,
|
|
863
1029
|
lightCount: 32,
|
|
864
|
-
|
|
1030
|
+
renderPath: "forward",
|
|
865
1031
|
shadows: "filtered",
|
|
866
1032
|
pbr: true,
|
|
867
1033
|
ibl: true,
|
|
868
1034
|
ssao: false,
|
|
869
|
-
bloom: true,
|
|
870
|
-
tone: "aces-filmic",
|
|
871
|
-
antialias: "fxaa",
|
|
872
|
-
sky: true,
|
|
873
|
-
fallback: "native",
|
|
874
1035
|
postStages: STANDARD_POST_STAGE_NAMES
|
|
875
1036
|
});
|
|
876
1037
|
function resolveVolumetricFogProfile(profile) {
|
|
877
1038
|
return profile.volumetricFog ?? { quality: "high", depth: 64, tileSize: 4 };
|
|
878
1039
|
}
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
1040
|
+
|
|
1041
|
+
// src/gpu-texture-usage.ts
|
|
1042
|
+
var GPU_TEXTURE_USAGE_COPY_SRC = 1;
|
|
1043
|
+
var GPU_TEXTURE_USAGE_COPY_DST = 2;
|
|
1044
|
+
var GPU_TEXTURE_USAGE_TEXTURE_BINDING = 4;
|
|
1045
|
+
var GPU_TEXTURE_USAGE_RENDER_ATTACHMENT = 16;
|
|
1046
|
+
var GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING = GPU_TEXTURE_USAGE_RENDER_ATTACHMENT | GPU_TEXTURE_USAGE_TEXTURE_BINDING;
|
|
1047
|
+
|
|
1048
|
+
// src/shadow-atlas.ts
|
|
1049
|
+
var SHADOW_ATLAS_DEFAULT_FACE_SIZE = 512;
|
|
1050
|
+
var SHADOW_ATLAS_DEFAULT_LAYERS = 4;
|
|
1051
|
+
var ShadowAtlas = class {
|
|
1052
|
+
/** Backing cube_array depth texture. `null` until `ensure()` has run. */
|
|
1053
|
+
texture = null;
|
|
1054
|
+
/**
|
|
1055
|
+
* Whole-atlas cube_array sampling view used by URP shaders that bind the
|
|
1056
|
+
* atlas at `@group(0) @binding(5)`. `null` until `ensure()` has run.
|
|
1057
|
+
*/
|
|
1058
|
+
cubeArrayView = null;
|
|
1059
|
+
/** Comparison sampler for `texture_depth_cube_array`. */
|
|
1060
|
+
compareSampler = null;
|
|
1061
|
+
/** Per-face 2D depth view cache, keyed by `layer * 6 + face`. */
|
|
1062
|
+
faceViews = /* @__PURE__ */ new Map();
|
|
1063
|
+
/** Per-face label cache (debug aid). Reused on re-creation. */
|
|
1064
|
+
device;
|
|
1065
|
+
/** Per-face square size in pixels. */
|
|
1066
|
+
faceSize;
|
|
1067
|
+
/** Cube layer count. */
|
|
1068
|
+
layers;
|
|
1069
|
+
constructor(device, options = {}) {
|
|
1070
|
+
this.device = device;
|
|
1071
|
+
this.faceSize = options.faceSize ?? SHADOW_ATLAS_DEFAULT_FACE_SIZE;
|
|
1072
|
+
this.layers = options.layers ?? SHADOW_ATLAS_DEFAULT_LAYERS;
|
|
1073
|
+
}
|
|
1074
|
+
/**
|
|
1075
|
+
* Returns `true` once the atlas texture is allocated. Used by the extract /
|
|
1076
|
+
* record path to gate "no PointLightShadow → no allocation" (AC-09) — the
|
|
1077
|
+
* caller calls {@link ensure} on a frame that has at least one snapshot;
|
|
1078
|
+
* before that, `isAllocated()` stays `false` and tests can assert no GPU
|
|
1079
|
+
* resources were created.
|
|
1080
|
+
*/
|
|
1081
|
+
isAllocated() {
|
|
1082
|
+
return this.texture !== null;
|
|
1083
|
+
}
|
|
1084
|
+
/**
|
|
1085
|
+
* Lazy-allocate the atlas texture + cube_array sampling view + comparison
|
|
1086
|
+
* sampler. Idempotent: subsequent calls are zero-cost no-ops once the
|
|
1087
|
+
* resources exist.
|
|
1088
|
+
*
|
|
1089
|
+
* Throws (via the RHI error registry) on allocation failure. This is the
|
|
1090
|
+
* only path that touches the GPU — keeping it inside one method makes the
|
|
1091
|
+
* "zero-shadow scene = zero allocation" gate easy to enforce: the renderer
|
|
1092
|
+
* never calls this method on a frame with no PointLightShadow entities.
|
|
1093
|
+
*/
|
|
1094
|
+
ensure() {
|
|
1095
|
+
if (this.texture !== null) return;
|
|
1096
|
+
const usage = GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING;
|
|
1097
|
+
const texDesc = cubeArrayDepthDescriptor(this.faceSize, this.layers, usage);
|
|
1098
|
+
const texRes = this.device.createTexture(texDesc);
|
|
1099
|
+
if (!texRes.ok) throw texRes.error;
|
|
1100
|
+
this.texture = texRes.value;
|
|
1101
|
+
const viewRes = this.device.createTextureView(this.texture, {
|
|
1102
|
+
label: "shadow-atlas-cube-array-view",
|
|
1103
|
+
dimension: "cube-array",
|
|
1104
|
+
aspect: "depth-only",
|
|
1105
|
+
baseArrayLayer: 0,
|
|
1106
|
+
arrayLayerCount: 6 * this.layers,
|
|
1107
|
+
baseMipLevel: 0,
|
|
1108
|
+
mipLevelCount: 1
|
|
1109
|
+
});
|
|
1110
|
+
if (!viewRes.ok) {
|
|
1111
|
+
this.device.destroyTexture(this.texture);
|
|
1112
|
+
this.texture = null;
|
|
1113
|
+
throw viewRes.error;
|
|
1114
|
+
}
|
|
1115
|
+
this.cubeArrayView = viewRes.value;
|
|
1116
|
+
const sampRes = this.device.createSampler(comparisonSamplerDescriptor());
|
|
1117
|
+
if (!sampRes.ok) {
|
|
1118
|
+
this.device.destroyTexture(this.texture);
|
|
1119
|
+
this.texture = null;
|
|
1120
|
+
this.cubeArrayView = null;
|
|
1121
|
+
throw sampRes.error;
|
|
1122
|
+
}
|
|
1123
|
+
this.compareSampler = sampRes.value;
|
|
1124
|
+
}
|
|
1125
|
+
/**
|
|
1126
|
+
* Whole-atlas cube_array sampling view (`texture_depth_cube_array`). Returns
|
|
1127
|
+
* `null` if the atlas is not yet allocated; the caller should gate on a
|
|
1128
|
+
* non-null pointShadow array before calling {@link ensure} + this getter.
|
|
1129
|
+
*/
|
|
1130
|
+
getAtlasView() {
|
|
1131
|
+
return this.cubeArrayView;
|
|
1132
|
+
}
|
|
1133
|
+
/**
|
|
1134
|
+
* Comparison sampler (`compare: 'less'`) for cube_array depth sampling.
|
|
1135
|
+
* Returns `null` if the atlas is not yet allocated.
|
|
1136
|
+
*/
|
|
1137
|
+
getComparisonSampler() {
|
|
1138
|
+
return this.compareSampler;
|
|
1139
|
+
}
|
|
1140
|
+
/**
|
|
1141
|
+
* Backing texture handle. Returns `null` if the atlas is not yet allocated.
|
|
1142
|
+
*/
|
|
1143
|
+
getTexture() {
|
|
1144
|
+
return this.texture;
|
|
1145
|
+
}
|
|
1146
|
+
/**
|
|
1147
|
+
* Lazy 2D depth view selecting `(layer, face)` (the caller passes
|
|
1148
|
+
* `shadowAtlasLayer` from the snapshot and a face index 0..5). Used as the
|
|
1149
|
+
* depth attachment of the shadow-caster render pass for one cube face.
|
|
1150
|
+
*
|
|
1151
|
+
* Caches per `(layer, face)` so the per-frame shadow loop pays zero
|
|
1152
|
+
* `createTextureView` cost after the first allocation. Cache is cleared on
|
|
1153
|
+
* {@link dispose}.
|
|
1154
|
+
*
|
|
1155
|
+
* @throws PointShadowAtlasUninitializedError if the atlas is not yet
|
|
1156
|
+
* allocated (caller must call {@link ensure} first).
|
|
1157
|
+
* @throws PointShadowAtlasBoundsViolationError if `layer` or `face` is out
|
|
1158
|
+
* of range.
|
|
1159
|
+
* @throws RhiError if the underlying `createTextureView` fails.
|
|
1160
|
+
*/
|
|
1161
|
+
faceView(layer, face) {
|
|
1162
|
+
if (this.texture === null) {
|
|
1163
|
+
throw new PointShadowAtlasUninitializedError();
|
|
1164
|
+
}
|
|
1165
|
+
if (layer < 0 || layer >= this.layers) {
|
|
1166
|
+
throw new PointShadowAtlasBoundsViolationError("layer", layer, this.layers);
|
|
1167
|
+
}
|
|
1168
|
+
if (face < 0 || face >= 6) {
|
|
1169
|
+
throw new PointShadowAtlasBoundsViolationError("face", face, 6);
|
|
1170
|
+
}
|
|
1171
|
+
const key = layer * 6 + face;
|
|
1172
|
+
const cached = this.faceViews.get(key);
|
|
1173
|
+
if (cached !== void 0) return cached;
|
|
1174
|
+
const desc = cubeArrayDepthFaceView(layer, face);
|
|
1175
|
+
const r = this.device.createTextureView(this.texture, desc);
|
|
1176
|
+
if (!r.ok) throw r.error;
|
|
1177
|
+
this.faceViews.set(key, r.value);
|
|
1178
|
+
return r.value;
|
|
1179
|
+
}
|
|
1180
|
+
/**
|
|
1181
|
+
* Release the GPU resources and clear the per-face view cache. Idempotent;
|
|
1182
|
+
* subsequent calls are zero-cost. After dispose, `isAllocated()` returns
|
|
1183
|
+
* `false` and the next `ensure()` re-allocates from scratch.
|
|
1184
|
+
*/
|
|
1185
|
+
dispose() {
|
|
1186
|
+
this.faceViews.clear();
|
|
1187
|
+
if (this.texture !== null) {
|
|
1188
|
+
this.device.destroyTexture(this.texture);
|
|
1189
|
+
this.texture = null;
|
|
1190
|
+
}
|
|
1191
|
+
this.cubeArrayView = null;
|
|
1192
|
+
this.compareSampler = null;
|
|
1193
|
+
}
|
|
1194
|
+
};
|
|
883
1195
|
|
|
884
1196
|
// src/render-contract.ts
|
|
885
1197
|
var STANDARD_OUTPUT_TRANSFORM_FEATURE_ID = "forgeax::standard::output-transform";
|
|
1198
|
+
var FXAA_POST_PROCESS_ID = "forgeax::post::fxaa";
|
|
886
1199
|
var RENDER_GRAPH_EXECUTION_PHASE_CATALOG = [
|
|
887
1200
|
"record/graph-execute/point-shadow",
|
|
888
1201
|
"record/graph-execute/cluster-binner-upload",
|
|
@@ -960,6 +1273,6 @@ var RENDER_PHASE_CATALOG = [
|
|
|
960
1273
|
...RENDER_RECORD_PHASE_CATALOG
|
|
961
1274
|
];
|
|
962
1275
|
|
|
963
|
-
export { AtmosphereInvalidParameterError, CLUSTER_GRID_STRIDE_U32, DEFAULT_CLUSTER_GRID, DEFAULT_STANDARD_PROFILE, EnvironmentGenerationFailedError, EnvironmentSourceConflictError, EquirectProjectionFailedError, FogCardinalityError, FrameReceiptStaleError,
|
|
964
|
-
//# sourceMappingURL=chunk-
|
|
965
|
-
//# sourceMappingURL=chunk-
|
|
1276
|
+
export { AtmosphereInvalidParameterError, CLUSTER_GRID_STRIDE_U32, DEFAULT_CLUSTER_GRID, DEFAULT_STANDARD_PROFILE, EnvironmentGenerationFailedError, EnvironmentSourceConflictError, EquirectProjectionFailedError, FXAA_POST_PROCESS_ID, FogCardinalityError, FrameReceiptStaleError, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_COPY_SRC, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING, GPU_TEXTURE_USAGE_TEXTURE_BINDING, LIGHT_INDEX_LIST_CAPACITY, LifecycleConstructionError, MAX_LIGHTS, MaterialSkinAttrMissingError, ObservationUnavailableError, OwnerStageFailedError, PointShadowAtlasBoundsViolationError, PointShadowAtlasUninitializedError, PointsLinesBudgetExceededError, PointsLinesInvalidStyleError, PointsLinesMaterialUnsupportedError, PointsLinesPrepareFailedError, PointsLinesStyleUnsupportedError, PointsLinesTopologyMismatchError, REFLECTION_PROBE_IBL_STAGES, RENDER_PHASE_CATALOG, RenderFeatureCapabilityMissingError, RenderFeatureDrawRecordingFailedError, RenderFeaturePreparationFailedError, RenderFeaturePreparedStateMismatchError, RenderFeatureRegistrationConflictError, RenderFeatureStageFailedError, RenderIntentInvalidError, RenderTargetCapabilityMissingError, RenderTargetDescriptorInvalidError, RenderTargetOperationFailedError, RenderTargetStateInvalidError, RendererContractFailureError, RendererOperationError, SCENE_DATA_TEMPORAL_V1_DESCRIPTOR, SCENE_DATA_TEMPORAL_V1_SCHEMA, SHADOW_ATLAS_DEFAULT_FACE_SIZE, SHADOW_ATLAS_DEFAULT_LAYERS, STANDARD_LIGHT_COUNTS, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, STANDARD_PIPELINE_ID, STANDARD_POST_STAGE_NAMES, SceneDataUnavailableError, ShadowAtlas, ShadowInvalidConfigError, SkinMaterialMismatchError, SkinPaletteOverflowError, StandardClusterIndexOverflowError, StandardClusterTransportUnavailableError, StandardLightBudgetExceededError, StandardProfileInvalidError, TaaCapsInsufficientError, TemporalFrameSubmitError, TransmissionCapabilityMissingError, VertexColorVariantConflictError, VideoUploadUnsupportedError, VolumeDensityShapeMismatchError, VolumeInvalidBoundsError, VolumeInvalidParametersError, VolumeOwnerConflictError, beginProbeIblUpdate, createIblKernelCache, createProbeIblOutput, createSceneDataCatalog, createStandardClusterLayout, isSceneDataTarget, publishProbeIblOutput, registerSceneDataTarget, resetIblKernelCaches, resolveVolumetricFogProfile, sceneDataError, sceneDataTargetAsAttachment, sceneDataTargetOwner, sceneDataTokenMismatch };
|
|
1277
|
+
//# sourceMappingURL=chunk-6OPXDQ2E.mjs.map
|
|
1278
|
+
//# sourceMappingURL=chunk-6OPXDQ2E.mjs.map
|