@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/errors/render.ts
CHANGED
|
@@ -116,6 +116,60 @@ export function createRenderSurfaceError(
|
|
|
116
116
|
return new RenderSurfaceError(`surface-${kind}-failed` as SurfaceFailureCode, detail);
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
+
export type LightResourceFailureReason = 'asset' | 'format' | 'capability' | 'capacity';
|
|
120
|
+
|
|
121
|
+
export interface LightResourceUnavailableDetail {
|
|
122
|
+
readonly entity: number;
|
|
123
|
+
readonly feature: 'ies' | 'cookie' | 'probe';
|
|
124
|
+
readonly generation: number;
|
|
125
|
+
readonly sourceKey: string;
|
|
126
|
+
readonly reason: LightResourceFailureReason;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export class LightResourceUnavailableError extends Error {
|
|
130
|
+
readonly code = 'light-resource-unavailable' as const;
|
|
131
|
+
readonly expected: string;
|
|
132
|
+
readonly hint: string;
|
|
133
|
+
readonly detail: LightResourceUnavailableDetail;
|
|
134
|
+
|
|
135
|
+
constructor(
|
|
136
|
+
detail: LightResourceUnavailableDetail,
|
|
137
|
+
expected: string,
|
|
138
|
+
actual: string,
|
|
139
|
+
hint: string,
|
|
140
|
+
) {
|
|
141
|
+
super(`light-resource-unavailable: ${detail.feature} ${actual}`);
|
|
142
|
+
this.name = 'LightResourceUnavailableError';
|
|
143
|
+
this.expected = expected;
|
|
144
|
+
this.hint = hint;
|
|
145
|
+
this.detail = detail;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function createLightResourceUnavailable(input: {
|
|
150
|
+
readonly entity: number;
|
|
151
|
+
readonly feature: LightResourceUnavailableDetail['feature'];
|
|
152
|
+
readonly generation: number;
|
|
153
|
+
readonly sourceKey: string;
|
|
154
|
+
readonly reason: LightResourceFailureReason;
|
|
155
|
+
readonly expected: string;
|
|
156
|
+
readonly actual: string;
|
|
157
|
+
readonly hint: string;
|
|
158
|
+
}): LightResourceUnavailableError {
|
|
159
|
+
return new LightResourceUnavailableError(
|
|
160
|
+
{
|
|
161
|
+
entity: input.entity,
|
|
162
|
+
feature: input.feature,
|
|
163
|
+
generation: input.generation,
|
|
164
|
+
sourceKey: input.sourceKey,
|
|
165
|
+
reason: input.reason,
|
|
166
|
+
},
|
|
167
|
+
input.expected,
|
|
168
|
+
input.actual,
|
|
169
|
+
input.hint,
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
119
173
|
export interface TemporalFrameSubmitDetail {
|
|
120
174
|
readonly reason: 'queue-submit-failed';
|
|
121
175
|
}
|
|
@@ -132,55 +186,38 @@ export class TemporalFrameSubmitError extends Error {
|
|
|
132
186
|
this.detail = { reason };
|
|
133
187
|
}
|
|
134
188
|
}
|
|
135
|
-
|
|
136
189
|
// ── ShadowInvalidConfigError ──────────────────────────────────────────────
|
|
137
190
|
|
|
138
191
|
/**
|
|
139
192
|
* Detail for `RuntimeErrorCode 'shadow-invalid-config'`.
|
|
140
193
|
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
* AI users access `.detail.field` / `.detail.value` / `.detail.min` /
|
|
144
|
-
* `.detail.max` via property access — no string parsing.
|
|
145
|
-
*
|
|
146
|
-
* `max` is `undefined` for lower-bound-only validations (e.g. mapSize < 1).
|
|
147
|
-
* feat-20260613-csm: max added for upper-bound cascade validations
|
|
148
|
-
* (cascadeCount max=4, splitLambda max=1, cascadeBlend max=0.5).
|
|
194
|
+
* The four fields are the only recovery surface: AI users read the invalid
|
|
195
|
+
* field, actual value, structured bound, and reason without parsing prose.
|
|
149
196
|
*/
|
|
197
|
+
export type ShadowInvalidConfigBound =
|
|
198
|
+
| { readonly kind: 'range'; readonly min: number; readonly max: number }
|
|
199
|
+
| { readonly kind: 'lower-bound'; readonly operator: '>' | '>='; readonly value: number }
|
|
200
|
+
| { readonly kind: 'allowed-values'; readonly values: readonly number[] };
|
|
201
|
+
|
|
150
202
|
export interface ShadowInvalidConfigDetail {
|
|
151
203
|
readonly field: string;
|
|
152
|
-
readonly
|
|
153
|
-
readonly
|
|
154
|
-
readonly
|
|
204
|
+
readonly actual: number;
|
|
205
|
+
readonly bound: ShadowInvalidConfigBound;
|
|
206
|
+
readonly reason: string;
|
|
155
207
|
}
|
|
156
208
|
|
|
157
209
|
/**
|
|
158
210
|
* Structured error for shadow component config validation failures.
|
|
159
211
|
*
|
|
160
|
-
* Emitted by
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
* `RuntimeErrorCode` only needs one branch (charter P4 — closed-union SSOT).
|
|
165
|
-
* Four-field surface per AGENTS.md error model:
|
|
212
|
+
* Emitted by Directional, Point, and Spot shadow validation. All three
|
|
213
|
+
* component owners share this error class so `switch (err.code)` on
|
|
214
|
+
* `RuntimeErrorCode` needs one branch (charter P4 — closed-union SSOT).
|
|
215
|
+
* Four-field surface:
|
|
166
216
|
* - `.code = 'shadow-invalid-config'` (closed RuntimeErrorCode)
|
|
167
217
|
* - `.expected` — expected-state description (programmatic predicate form)
|
|
168
218
|
* - `.hint` — actionable recovery guidance (imperative; AI users paste into
|
|
169
|
-
* spawn calls).
|
|
170
|
-
*
|
|
171
|
-
* "<comparator> min".
|
|
172
|
-
* - `.detail = { field, value, min, max? }` — structured values (charter P4)
|
|
173
|
-
*
|
|
174
|
-
* 4th constructor parameter is a union over the two range shapes:
|
|
175
|
-
* - `number` — `max` for a closed `[min, max]` range (CSM cascadeCount /
|
|
176
|
-
* splitLambda / cascadeBlend). hint uses "in [min, max]"; integer-typed
|
|
177
|
-
* fields get "integer in [min, max]".
|
|
178
|
-
* - `'>' | '>='` — comparator for an open lower-bound predicate. `'>'` is
|
|
179
|
-
* used when `min` carries dynamic context (e.g. `farPlane > nearPlane` —
|
|
180
|
-
* the surfaced hint reads "must be > nearPlane" so AI users setting
|
|
181
|
-
* farPlane=nearPlane don't re-fail the spawn loop with the wrong cue).
|
|
182
|
-
* - `undefined` — defaults to `'>='`. Callsites for mapSize < 1 validation
|
|
183
|
-
* stay backward-compatible (3-arg form).
|
|
219
|
+
* spawn calls).
|
|
220
|
+
* - `.detail = { field, actual, bound, reason }` — structured values.
|
|
184
221
|
*/
|
|
185
222
|
export class ShadowInvalidConfigError extends Error {
|
|
186
223
|
readonly code = 'shadow-invalid-config' as const;
|
|
@@ -188,35 +225,53 @@ export class ShadowInvalidConfigError extends Error {
|
|
|
188
225
|
readonly hint: string;
|
|
189
226
|
readonly detail: ShadowInvalidConfigDetail;
|
|
190
227
|
|
|
191
|
-
constructor(
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
const expected =
|
|
210
|
-
|
|
211
|
-
super(
|
|
212
|
-
max !== undefined
|
|
213
|
-
? `shadow component .${field} must be in [${min}, ${max}], got ${value}`
|
|
214
|
-
: `shadow component .${field} must be ${comparator} ${min}, got ${value}`,
|
|
215
|
-
);
|
|
228
|
+
constructor(
|
|
229
|
+
field: string,
|
|
230
|
+
actual: number,
|
|
231
|
+
minOrBound: number | ShadowInvalidConfigBound,
|
|
232
|
+
maxOrComparator?: number | '>' | '>=',
|
|
233
|
+
reason?: string,
|
|
234
|
+
) {
|
|
235
|
+
const bound: ShadowInvalidConfigBound =
|
|
236
|
+
typeof minOrBound === 'number'
|
|
237
|
+
? typeof maxOrComparator === 'number'
|
|
238
|
+
? { kind: 'range', min: minOrBound, max: maxOrComparator }
|
|
239
|
+
: {
|
|
240
|
+
kind: 'lower-bound',
|
|
241
|
+
operator: maxOrComparator === '>' ? '>' : '>=',
|
|
242
|
+
value: minOrBound,
|
|
243
|
+
}
|
|
244
|
+
: minOrBound;
|
|
245
|
+
const resolvedReason = reason ?? shadowBoundReason(bound);
|
|
246
|
+
const expected = shadowBoundExpected(field, bound);
|
|
247
|
+
const hint = `set ${field} to ${resolvedReason}; got ${actual}`;
|
|
248
|
+
super(`shadow component .${field} is invalid: ${resolvedReason}; got ${actual}`);
|
|
216
249
|
this.name = 'ShadowInvalidConfigError';
|
|
217
250
|
this.hint = hint;
|
|
218
251
|
this.expected = expected;
|
|
219
|
-
this.detail = { field,
|
|
252
|
+
this.detail = { field, actual, bound, reason: resolvedReason };
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function shadowBoundExpected(field: string, bound: ShadowInvalidConfigBound): string {
|
|
257
|
+
switch (bound.kind) {
|
|
258
|
+
case 'range':
|
|
259
|
+
return `${field} in [${bound.min}, ${bound.max}]`;
|
|
260
|
+
case 'lower-bound':
|
|
261
|
+
return `${field} ${bound.operator} ${bound.value}`;
|
|
262
|
+
case 'allowed-values':
|
|
263
|
+
return `${field} in {${bound.values.join(', ')}}`;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function shadowBoundReason(bound: ShadowInvalidConfigBound): string {
|
|
268
|
+
switch (bound.kind) {
|
|
269
|
+
case 'range':
|
|
270
|
+
return `a value in [${bound.min}, ${bound.max}]`;
|
|
271
|
+
case 'lower-bound':
|
|
272
|
+
return `a value ${bound.operator} ${bound.value}`;
|
|
273
|
+
case 'allowed-values':
|
|
274
|
+
return `one of [${bound.values.join(', ')}]`;
|
|
220
275
|
}
|
|
221
276
|
}
|
|
222
277
|
|
|
@@ -270,133 +325,125 @@ export class EquirectProjectionFailedError extends Error {
|
|
|
270
325
|
}
|
|
271
326
|
}
|
|
272
327
|
|
|
273
|
-
// ──
|
|
328
|
+
// ── StandardLightBudgetExceededError ──────────────────────────────────────
|
|
274
329
|
|
|
275
|
-
/**
|
|
276
|
-
|
|
277
|
-
*
|
|
278
|
-
* Emitted per-frame (once-per-frame fire) when light count exceeds HDRP budget.
|
|
279
|
-
*/
|
|
280
|
-
export interface HdrpLightBudgetExceededDetail {
|
|
330
|
+
/** The finite local-light budget that a Standard frame agreed to admit. */
|
|
331
|
+
export interface StandardLightBudgetExceededDetail {
|
|
281
332
|
readonly actual: number;
|
|
282
333
|
readonly budget: number;
|
|
283
334
|
}
|
|
284
335
|
|
|
285
336
|
/**
|
|
286
|
-
* Structured
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
* exceeds the HDRP budget (256). Fail-soft: fire once per frame, truncate to 256.
|
|
290
|
-
* - `.code = 'hdrp-light-budget-exceeded'` (closed RuntimeErrorCode)
|
|
291
|
-
* - `.expected` — 'light count <= 256'
|
|
292
|
-
* - `.hint` — 'reduce world light count or increase budget (OOS-hdrp-larger-budget)'
|
|
293
|
-
* - `.detail = { actual, budget }`
|
|
337
|
+
* Structured refusal for a Standard frame whose finite local-light set is
|
|
338
|
+
* outside the selected profile budget. The frame is rejected as a whole; the
|
|
339
|
+
* record owner must not slice the input or submit a partial membership set.
|
|
294
340
|
*/
|
|
295
|
-
export class
|
|
296
|
-
readonly code = '
|
|
341
|
+
export class StandardLightBudgetExceededError extends Error {
|
|
342
|
+
readonly code = 'standard-light-budget-exceeded' as const;
|
|
297
343
|
readonly expected: string;
|
|
298
344
|
readonly hint: string;
|
|
299
|
-
readonly detail:
|
|
345
|
+
readonly detail: StandardLightBudgetExceededDetail;
|
|
300
346
|
|
|
301
347
|
constructor(actual: number, budget: number) {
|
|
302
348
|
const expected = `light count <= ${budget}`;
|
|
303
349
|
const hint =
|
|
304
|
-
`${actual} lights exceed
|
|
305
|
-
'
|
|
306
|
-
super(`
|
|
307
|
-
this.name = '
|
|
350
|
+
`${actual} finite local lights exceed Standard budget ${budget}; ` +
|
|
351
|
+
'reduce the local-light set or select a profile with a supported budget';
|
|
352
|
+
super(`Standard light budget exceeded: ${actual} > ${budget}`);
|
|
353
|
+
this.name = 'StandardLightBudgetExceededError';
|
|
308
354
|
this.expected = expected;
|
|
309
355
|
this.hint = hint;
|
|
310
356
|
this.detail = { actual, budget };
|
|
311
357
|
}
|
|
312
358
|
}
|
|
313
359
|
|
|
314
|
-
// ──
|
|
360
|
+
// ── StandardClusterIndexOverflowError ──────────────────────────────────────
|
|
315
361
|
|
|
316
|
-
/**
|
|
317
|
-
|
|
318
|
-
*
|
|
319
|
-
* Emitted per-frame (once-per-frame fire) when the cluster binner overflows
|
|
320
|
-
* the light index list capacity (65536). Upgraded from ClusterBinError.
|
|
321
|
-
*/
|
|
322
|
-
export interface HdrpIndexListOverflowDetail {
|
|
362
|
+
/** Cluster membership entries that could not fit the single shared index list. */
|
|
363
|
+
export interface StandardClusterIndexOverflowDetail {
|
|
323
364
|
readonly actual: number;
|
|
324
365
|
readonly capacity: number;
|
|
325
366
|
}
|
|
326
367
|
|
|
327
368
|
/**
|
|
328
|
-
* Structured
|
|
329
|
-
*
|
|
330
|
-
*
|
|
331
|
-
* `ClusterBinError('index-overflow')`. Fail-soft: fire once per frame,
|
|
332
|
-
* continue rendering with what fit.
|
|
333
|
-
* - `.code = 'hdrp-index-list-overflow'` (closed RuntimeErrorCode)
|
|
334
|
-
* - `.expected` — 'light index list entries <= 65536'
|
|
335
|
-
* - `.hint` — 'reduce lights, shrink cluster grid, or increase capacity'
|
|
336
|
-
* - `.detail = { actual, capacity }`
|
|
369
|
+
* Structured refusal for a membership producer that exceeded the shared
|
|
370
|
+
* Cluster index-list capacity. No truncated list is uploaded and no graph is
|
|
371
|
+
* submitted for the rejected frame.
|
|
337
372
|
*/
|
|
338
|
-
export class
|
|
339
|
-
readonly code = '
|
|
373
|
+
export class StandardClusterIndexOverflowError extends Error {
|
|
374
|
+
readonly code = 'standard-cluster-index-overflow' as const;
|
|
340
375
|
readonly expected: string;
|
|
341
376
|
readonly hint: string;
|
|
342
|
-
readonly detail:
|
|
377
|
+
readonly detail: StandardClusterIndexOverflowDetail;
|
|
343
378
|
|
|
344
379
|
constructor(actual: number, capacity: number) {
|
|
345
380
|
const expected = `light index list entries <= ${capacity}`;
|
|
346
381
|
const hint =
|
|
347
382
|
`cluster binner overflow: writeCount ${actual} exceeds capacity ${capacity}; ` +
|
|
348
|
-
'reduce lights
|
|
349
|
-
super(`
|
|
350
|
-
this.name = '
|
|
383
|
+
'reduce finite local lights or choose a supported cluster layout';
|
|
384
|
+
super(`Standard cluster index list overflow: ${actual} > ${capacity}`);
|
|
385
|
+
this.name = 'StandardClusterIndexOverflowError';
|
|
351
386
|
this.expected = expected;
|
|
352
387
|
this.hint = hint;
|
|
353
388
|
this.detail = { actual, capacity };
|
|
354
389
|
}
|
|
355
390
|
}
|
|
356
391
|
|
|
357
|
-
// ──
|
|
392
|
+
// ── StandardClusterTransportUnavailableError ───────────────────────────────
|
|
358
393
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
* Emitted when the Standard clustered lane has fewer than 4 color attachments,
|
|
363
|
-
* meaning the deferred path cannot allocate 3 g-buffer color targets + depth.
|
|
364
|
-
*/
|
|
365
|
-
export interface HdrpDeferredCapsInsufficientDetail {
|
|
366
|
-
readonly actual: number;
|
|
367
|
-
readonly expected: number;
|
|
394
|
+
export interface StandardClusterTransportUnavailableDetail {
|
|
395
|
+
readonly requested: number;
|
|
396
|
+
readonly admitted: 0;
|
|
368
397
|
}
|
|
369
398
|
|
|
370
399
|
/**
|
|
371
|
-
* Structured
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
* - `.code = 'hdrp-deferred-caps-insufficient'` (closed RuntimeErrorCode)
|
|
375
|
-
* - `.expected` — 'maxColorAttachments >= 4'
|
|
376
|
-
* - `.hint` — actionable guidance to upgrade browser or select URP
|
|
377
|
-
* - `.detail = { actual, expected }`
|
|
378
|
-
*
|
|
379
|
-
* @see plan-strategy D-5 (capability validation, no silent fallback)
|
|
400
|
+
* Structured capability refusal. Standard never turns an unproven transport
|
|
401
|
+
* into a smaller direct-light lane; the caller receives the exact requested
|
|
402
|
+
* local-light count and an admitted count of zero.
|
|
380
403
|
*/
|
|
381
|
-
export class
|
|
382
|
-
readonly code = '
|
|
383
|
-
readonly expected
|
|
404
|
+
export class StandardClusterTransportUnavailableError extends Error {
|
|
405
|
+
readonly code = 'standard-cluster-transport-unavailable' as const;
|
|
406
|
+
readonly expected = 'all requested local lights have a proven Cluster transport';
|
|
384
407
|
readonly hint: string;
|
|
385
|
-
readonly detail:
|
|
408
|
+
readonly detail: StandardClusterTransportUnavailableDetail;
|
|
386
409
|
|
|
387
|
-
constructor(
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
super(
|
|
394
|
-
`HDRP deferred caps insufficient: maxColorAttachments = ${actual} (need >= ${_expected})`,
|
|
395
|
-
);
|
|
396
|
-
this.name = 'HdrpDeferredCapsInsufficientError';
|
|
397
|
-
this.expected = _expectedStr;
|
|
410
|
+
constructor(
|
|
411
|
+
requested: number,
|
|
412
|
+
hint = 'enable a proven Cluster storage transport before drawing',
|
|
413
|
+
) {
|
|
414
|
+
super(`Standard Cluster transport unavailable for ${requested} local lights`);
|
|
415
|
+
this.name = 'StandardClusterTransportUnavailableError';
|
|
398
416
|
this.hint = hint;
|
|
399
|
-
this.detail = {
|
|
417
|
+
this.detail = { requested, admitted: 0 };
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// ── StandardProfileInvalidError ───────────────────────────────────────────
|
|
422
|
+
|
|
423
|
+
export interface StandardProfileInvalidDetail {
|
|
424
|
+
readonly field: string;
|
|
425
|
+
readonly actual: unknown;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/** Structured validation failure for the single Standard profile surface. */
|
|
429
|
+
export class StandardProfileInvalidError extends Error {
|
|
430
|
+
readonly code = 'standard-profile-invalid' as const;
|
|
431
|
+
readonly expected: string;
|
|
432
|
+
readonly hint: string;
|
|
433
|
+
readonly detail: StandardProfileInvalidDetail;
|
|
434
|
+
|
|
435
|
+
constructor(message: string, detail?: StandardProfileInvalidDetail) {
|
|
436
|
+
super(message);
|
|
437
|
+
this.name = 'StandardProfileInvalidError';
|
|
438
|
+
this.detail = detail ?? { field: 'profile', actual: message };
|
|
439
|
+
if (this.detail.field === 'clusterGrid') {
|
|
440
|
+
this.expected = 'clusterGrid.{x,y,z} each positive integer in [1, 64]';
|
|
441
|
+
this.hint =
|
|
442
|
+
'set clusterGrid.x, clusterGrid.y, and clusterGrid.z to positive integers in [1, 64]';
|
|
443
|
+
} else {
|
|
444
|
+
this.expected = 'StandardProfile contains only supported fields and values';
|
|
445
|
+
this.hint = 'repair the Standard profile fields and retry setProfile';
|
|
446
|
+
}
|
|
400
447
|
}
|
|
401
448
|
}
|
|
402
449
|
|
|
@@ -452,7 +499,7 @@ export interface PointShadowAtlasBoundsViolationDetail {
|
|
|
452
499
|
* - `.code = 'point-shadow-atlas-bounds-violation'`
|
|
453
500
|
* - `.expected` — `0 <= layer < layers && 0 <= face < 6`
|
|
454
501
|
* - `.hint` — clamp `shadowAtlasLayer` or face index before calling
|
|
455
|
-
* `faceView`; the cap
|
|
502
|
+
* `faceView`; the layer cap is the renderer-owned ShadowAtlas capacity
|
|
456
503
|
* - `.detail = { axis, value, max }` — discriminates layer vs face
|
|
457
504
|
*/
|
|
458
505
|
export class PointShadowAtlasBoundsViolationError extends Error {
|
|
@@ -1531,6 +1578,149 @@ export class PointsLinesPrepareFailedError extends Error {
|
|
|
1531
1578
|
}
|
|
1532
1579
|
}
|
|
1533
1580
|
|
|
1581
|
+
// -- RenderTarget errors ------------------------------------------------------
|
|
1582
|
+
|
|
1583
|
+
export interface RenderTargetDescriptorInvalidDetail {
|
|
1584
|
+
readonly field: string;
|
|
1585
|
+
readonly value: unknown;
|
|
1586
|
+
readonly expected: string;
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
export class RenderTargetDescriptorInvalidError extends Error {
|
|
1590
|
+
readonly code = 'render-target-descriptor-invalid' as const;
|
|
1591
|
+
readonly expected: string;
|
|
1592
|
+
readonly hint: string;
|
|
1593
|
+
readonly detail: RenderTargetDescriptorInvalidDetail;
|
|
1594
|
+
|
|
1595
|
+
constructor(detail: RenderTargetDescriptorInvalidDetail) {
|
|
1596
|
+
super(`render-target-descriptor-invalid: ${detail.field} does not satisfy ${detail.expected}`);
|
|
1597
|
+
this.name = 'RenderTargetDescriptorInvalidError';
|
|
1598
|
+
this.expected = detail.expected;
|
|
1599
|
+
this.hint = `set RenderTargetDescriptor.${detail.field} to the expected value, then retry create or resize`;
|
|
1600
|
+
this.detail = detail;
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
export interface RenderTargetCapabilityMissingDetail {
|
|
1605
|
+
readonly operation: 'create' | 'resize' | 'source' | 'readback';
|
|
1606
|
+
readonly requested: string;
|
|
1607
|
+
readonly capability: string;
|
|
1608
|
+
readonly actual: string;
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
export class RenderTargetCapabilityMissingError extends Error {
|
|
1612
|
+
readonly code = 'render-target-capability-missing' as const;
|
|
1613
|
+
readonly expected: string;
|
|
1614
|
+
readonly hint: string;
|
|
1615
|
+
readonly detail: RenderTargetCapabilityMissingDetail;
|
|
1616
|
+
|
|
1617
|
+
constructor(detail: RenderTargetCapabilityMissingDetail) {
|
|
1618
|
+
super(
|
|
1619
|
+
`render-target-capability-missing: ${detail.capability} does not admit ${detail.requested}`,
|
|
1620
|
+
);
|
|
1621
|
+
this.name = 'RenderTargetCapabilityMissingError';
|
|
1622
|
+
this.expected = `${detail.capability} admits ${detail.requested}`;
|
|
1623
|
+
this.hint = `choose an admitted target descriptor or use a backend providing ${detail.capability}`;
|
|
1624
|
+
this.detail = detail;
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1627
|
+
|
|
1628
|
+
export type RenderTargetStateInvalidReason =
|
|
1629
|
+
| 'foreign-renderer'
|
|
1630
|
+
| 'destroyed'
|
|
1631
|
+
| 'uninitialized'
|
|
1632
|
+
| 'generation-mismatch'
|
|
1633
|
+
| 'readback-without-intent';
|
|
1634
|
+
|
|
1635
|
+
export interface RenderTargetStateInvalidDetail {
|
|
1636
|
+
readonly operation: 'inspect' | 'resize' | 'source' | 'readback' | 'destroy';
|
|
1637
|
+
readonly reason: RenderTargetStateInvalidReason;
|
|
1638
|
+
readonly state: 'uninitialized' | 'candidate' | 'active' | 'rebuilding' | 'destroyed';
|
|
1639
|
+
readonly generation: number;
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
export class RenderTargetStateInvalidError extends Error {
|
|
1643
|
+
readonly code = 'render-target-state-invalid' as const;
|
|
1644
|
+
readonly expected: string;
|
|
1645
|
+
readonly hint: string;
|
|
1646
|
+
readonly detail: RenderTargetStateInvalidDetail;
|
|
1647
|
+
|
|
1648
|
+
constructor(detail: RenderTargetStateInvalidDetail) {
|
|
1649
|
+
super(`render-target-state-invalid: ${detail.operation} cannot use ${detail.reason}`);
|
|
1650
|
+
this.name = 'RenderTargetStateInvalidError';
|
|
1651
|
+
this.expected = `target state permits ${detail.operation}`;
|
|
1652
|
+
this.hint =
|
|
1653
|
+
'use the Renderer that created the target, then initialize, recover, or stop using the destroyed token';
|
|
1654
|
+
this.detail = detail;
|
|
1655
|
+
}
|
|
1656
|
+
}
|
|
1657
|
+
|
|
1658
|
+
export interface RenderTargetOperationFailedDetail {
|
|
1659
|
+
readonly operation: 'create' | 'resize' | 'source' | 'readback' | 'destroy' | 'recover';
|
|
1660
|
+
readonly stage: 'allocation' | 'compile' | 'write' | 'submit' | 'copy' | 'retire';
|
|
1661
|
+
readonly generation: number;
|
|
1662
|
+
readonly cause: unknown;
|
|
1663
|
+
readonly recovery: 'retry' | 'recover' | 'retain-last-known-good';
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
export class RenderTargetOperationFailedError extends Error {
|
|
1667
|
+
readonly code = 'render-target-operation-failed' as const;
|
|
1668
|
+
readonly expected: string;
|
|
1669
|
+
readonly hint: string;
|
|
1670
|
+
readonly detail: RenderTargetOperationFailedDetail;
|
|
1671
|
+
|
|
1672
|
+
constructor(detail: RenderTargetOperationFailedDetail) {
|
|
1673
|
+
super(`render-target-operation-failed: ${detail.operation} failed during ${detail.stage}`);
|
|
1674
|
+
this.name = 'RenderTargetOperationFailedError';
|
|
1675
|
+
this.expected = `${detail.operation} completes ${detail.stage}`;
|
|
1676
|
+
this.hint =
|
|
1677
|
+
'inspect detail.cause, then retry, recover the Renderer, or retain the last-known-good generation';
|
|
1678
|
+
this.detail = detail;
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1682
|
+
export interface ReflectionProbeBudgetExceededDetail {
|
|
1683
|
+
readonly actual: number;
|
|
1684
|
+
readonly budget: number;
|
|
1685
|
+
}
|
|
1686
|
+
|
|
1687
|
+
export class ReflectionProbeBudgetExceededError extends Error {
|
|
1688
|
+
readonly code = 'reflection-probe-budget-exceeded' as const;
|
|
1689
|
+
readonly expected: string;
|
|
1690
|
+
readonly hint: string;
|
|
1691
|
+
readonly detail: ReflectionProbeBudgetExceededDetail;
|
|
1692
|
+
|
|
1693
|
+
constructor(actual: number, budget: number) {
|
|
1694
|
+
super(`reflection-probe-budget-exceeded: ${actual} > ${budget}`);
|
|
1695
|
+
this.name = 'ReflectionProbeBudgetExceededError';
|
|
1696
|
+
this.expected = `reflection probe work <= ${budget}`;
|
|
1697
|
+
this.hint = 'reduce probe updates for this frame or raise the RenderProfile probe budget';
|
|
1698
|
+
this.detail = { actual, budget };
|
|
1699
|
+
}
|
|
1700
|
+
}
|
|
1701
|
+
|
|
1702
|
+
export interface RenderIntentInvalidDetail {
|
|
1703
|
+
readonly component: 'CubeCamera' | 'ReflectionProbe';
|
|
1704
|
+
readonly field: 'updateIntent';
|
|
1705
|
+
readonly value: number;
|
|
1706
|
+
readonly allowed: readonly [0, 1, 2];
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
export class RenderIntentInvalidError extends Error {
|
|
1710
|
+
readonly code = 'render-intent-invalid' as const;
|
|
1711
|
+
readonly expected: string;
|
|
1712
|
+
readonly hint: string;
|
|
1713
|
+
readonly detail: RenderIntentInvalidDetail;
|
|
1714
|
+
|
|
1715
|
+
constructor(component: RenderIntentInvalidDetail['component'], value: number) {
|
|
1716
|
+
super(`render-intent-invalid: ${component}.updateIntent is not an admitted value`);
|
|
1717
|
+
this.name = 'RenderIntentInvalidError';
|
|
1718
|
+
this.expected = `${component}.updateIntent is one of 0, 1, or 2`;
|
|
1719
|
+
this.hint = `set ${component}.updateIntent to 0, 1, or 2`;
|
|
1720
|
+
this.detail = { component, field: 'updateIntent', value, allowed: [0, 1, 2] };
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1723
|
+
|
|
1534
1724
|
export interface VolumeOwnerConflictDetail {
|
|
1535
1725
|
readonly ownerCount: number;
|
|
1536
1726
|
}
|
|
@@ -1652,9 +1842,10 @@ export type RenderError =
|
|
|
1652
1842
|
| TaaUnavailableError
|
|
1653
1843
|
| ShadowInvalidConfigError
|
|
1654
1844
|
| EquirectProjectionFailedError
|
|
1655
|
-
|
|
|
1656
|
-
|
|
|
1657
|
-
|
|
|
1845
|
+
| StandardLightBudgetExceededError
|
|
1846
|
+
| StandardClusterIndexOverflowError
|
|
1847
|
+
| StandardClusterTransportUnavailableError
|
|
1848
|
+
| StandardProfileInvalidError
|
|
1658
1849
|
| PointShadowAtlasUninitializedError
|
|
1659
1850
|
| PointShadowAtlasBoundsViolationError
|
|
1660
1851
|
| VideoUploadUnsupportedError
|
|
@@ -1683,5 +1874,12 @@ export type RenderError =
|
|
|
1683
1874
|
| PointsLinesMaterialUnsupportedError
|
|
1684
1875
|
| PointsLinesBudgetExceededError
|
|
1685
1876
|
| PointsLinesPrepareFailedError
|
|
1877
|
+
| LightResourceUnavailableError
|
|
1878
|
+
| RenderTargetDescriptorInvalidError
|
|
1879
|
+
| RenderTargetCapabilityMissingError
|
|
1880
|
+
| RenderTargetStateInvalidError
|
|
1881
|
+
| RenderTargetOperationFailedError
|
|
1882
|
+
| ReflectionProbeBudgetExceededError
|
|
1883
|
+
| RenderIntentInvalidError
|
|
1686
1884
|
| ProjectorBindingError
|
|
1687
1885
|
| VolumeError;
|
package/src/extract/camera.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { EntityHandle, World } from '@forgeax/engine-ecs';
|
|
2
2
|
import { readRenderArrayView } from '@forgeax/engine-ecs/projection';
|
|
3
3
|
import { mat4, vec3 } from '@forgeax/engine-math';
|
|
4
|
-
import {
|
|
4
|
+
import { GlobalTransform } from '@forgeax/engine-scene';
|
|
5
5
|
import {
|
|
6
6
|
antialiasFromF32,
|
|
7
7
|
bloomEnabledFromF32,
|
|
@@ -14,7 +14,7 @@ import type { CameraSnapshot } from '../render-contract';
|
|
|
14
14
|
import { getActiveCamera, selectActiveCameraIndex } from '../systems/active-camera';
|
|
15
15
|
|
|
16
16
|
function readWorldMatrix(world: World, entity: EntityHandle): Float32Array | undefined {
|
|
17
|
-
const view = readRenderArrayView(world, entity,
|
|
17
|
+
const view = readRenderArrayView(world, entity, GlobalTransform, 'world');
|
|
18
18
|
return view === undefined ? undefined : new Float32Array(view);
|
|
19
19
|
}
|
|
20
20
|
|
|
@@ -23,7 +23,7 @@ export function extractCameraSnapshots(world: World): CameraSnapshot[] {
|
|
|
23
23
|
const cameras: CameraSnapshot[] = [];
|
|
24
24
|
const cameraEntities: number[] = [];
|
|
25
25
|
const cameraQuery = world
|
|
26
|
-
.query({ read: [Camera], optional: [MotionBlur], with: [
|
|
26
|
+
.query({ read: [Camera], optional: [MotionBlur], with: [GlobalTransform] })
|
|
27
27
|
.unwrap();
|
|
28
28
|
for (const row of cameraQuery) {
|
|
29
29
|
const cam = row.get(Camera);
|