@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/README.md
CHANGED
|
@@ -8,6 +8,30 @@
|
|
|
8
8
|
|
|
9
9
|
## Public frame contract
|
|
10
10
|
|
|
11
|
+
## 灯光最短入口
|
|
12
|
+
|
|
13
|
+
三条最短入口:
|
|
14
|
+
|
|
15
|
+
1. `RectAreaLight`:在现有 `Transform` 上声明单面矩形发光体,尺寸由 `width` 与 `height` 持有。
|
|
16
|
+
2. `SpotLight`:用 `iesProfile` 和 `cookie` 绑定现有资产,用 `rollDeg` 共享方位角;缺席 handle 是乘法单位元。
|
|
17
|
+
3. `LightProbe`:声明 27 个 `irradiance` 值和唯一的 `radius`,位置与朝向仍来自 `Transform`。
|
|
18
|
+
|
|
19
|
+
这些是 authored/render 输入,不是 GPU slot、LTC、probe asset 或第二个 Renderer API。尺寸、半径和 `rollDeg` 在场景序列化中保留;资产 GUID 通过 Pack/Catalog 的 `refs` 往返,不能从 URL 或数组位置推断身份。
|
|
20
|
+
|
|
21
|
+
### Extended-lighting consumer route
|
|
22
|
+
|
|
23
|
+
The three smallest public examples are `RectAreaLight(width, height)`,
|
|
24
|
+
`SpotLight(iesProfile, cookie, rollDeg)`, and `LightProbe(irradiance, radius)`.
|
|
25
|
+
Probe diffuse uses `A={admitted && d<r}`, `c=1-(d/r)^2`, scaled finite `qhat`,
|
|
26
|
+
`alpha=q/Q`, `C=1-prod(1-c)`, and `S=1-C`; Sky is only
|
|
27
|
+
`S*E_sky(N)`. It never enters probe admission, `Q`, `alpha`, specular, or
|
|
28
|
+
`DirectLightSlot`. `recordByteLength=160` is the per-object ABI receipt.
|
|
29
|
+
|
|
30
|
+
Recovery is inspected as data: read `code`, `expected`, `hint`, and typed
|
|
31
|
+
`detail`; keep the current LKG until the replacement generation is accepted.
|
|
32
|
+
GPU, Browser, and Dawn evidence that cannot execute is `not-run` or
|
|
33
|
+
`unavailable`, never a verified structural substitute.
|
|
34
|
+
|
|
11
35
|
The public frame vocabulary is intentionally small. `Camera` is the authoring
|
|
12
36
|
owner for tone, antialiasing, bloom, and `historyVersion`; `Atmosphere` and
|
|
13
37
|
`Fog` are independent ECS components. The renderer extracts these facts into
|
|
@@ -25,10 +49,86 @@ typed `detail`, repair that owner, and submit the same request again. Public
|
|
|
25
49
|
consumers do not parse `message` and never receive graph nodes, devices,
|
|
26
50
|
history textures, or prepared handles.
|
|
27
51
|
|
|
28
|
-
The current-source manifest and schema identify `source`, `build`, `backend`,
|
|
29
|
-
`runner`, and `frameIdentity`. Structural graph receipts, Browser/Dawn
|
|
30
|
-
readback or PNG evidence, and historical oracle data are separate evidence
|
|
31
|
-
classes. An unavailable backend is reported as unavailable.
|
|
52
|
+
The current-source manifest and schema identify `source`, `build`, `backend`,
|
|
53
|
+
`runner`, and `frameIdentity`. Structural graph receipts, Browser/Dawn
|
|
54
|
+
readback or PNG evidence, and historical oracle data are separate evidence
|
|
55
|
+
classes. An unavailable backend is reported as unavailable.
|
|
56
|
+
|
|
57
|
+
## RenderFeature: the producer seam (first-read index)
|
|
58
|
+
|
|
59
|
+
### Material contract projection
|
|
60
|
+
|
|
61
|
+
Render consumes only the Pack-owned material publication projection. Its
|
|
62
|
+
inputs are runtime bool/value data, composed module slots, and the closed
|
|
63
|
+
compiler context; render never authors, cooks, writes DDC, or selects a
|
|
64
|
+
fallback material. The projection preserves `layoutIdentity`,
|
|
65
|
+
`programIdentity`, `cookIdentity`, and `materialPublicationIdentity` so a
|
|
66
|
+
stale draw can be traced to the first producer divergence.
|
|
67
|
+
|
|
68
|
+
The public route is one `RenderFeature<FrameData>` through the Standard
|
|
69
|
+
Pipeline and the active RenderGraph pass. In the examples below, `type FrameData`
|
|
70
|
+
is the producer-owned extracted value. A feature extracts one frame value,
|
|
71
|
+
then its mandatory `plan(data, context)` declares named resources and passes;
|
|
72
|
+
the host derives graph access, preparation, recording, and recovery from that
|
|
73
|
+
plan. Register it at construction with
|
|
74
|
+
`createRenderer(canvas, { features: [feature] })`. A feature never receives a
|
|
75
|
+
device, queue, encoder, staging builder, or submit callback.
|
|
76
|
+
|
|
77
|
+
### Directional shadow quality: author → inspect → recover
|
|
78
|
+
|
|
79
|
+
`DirectionalLight` is the only authoring entry for directional shadow quality.
|
|
80
|
+
Set `shadowFilter` with the numeric constant for one of the five closed labels
|
|
81
|
+
below; it is an ECS enum field, not a label string. Do not invent a numeric
|
|
82
|
+
label or a compatibility alias. The default is `pcf3`. The two PCSS fields
|
|
83
|
+
are read only when `shadowFilter` is `pcssMedium` or `pcssHigh`:
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
import { DirectionalLight, DirectionalShadowFilterValue } from '@forgeax/engine-render';
|
|
87
|
+
|
|
88
|
+
world.spawn({ component: DirectionalLight, data: {
|
|
89
|
+
direction: [0.2, -0.98, 0],
|
|
90
|
+
shadowFilter: DirectionalShadowFilterValue.pcssHigh,
|
|
91
|
+
shadowAngularRadius: 0.00465,
|
|
92
|
+
maxPenumbraTexels: 32,
|
|
93
|
+
} });
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
| Author field | Valid values / units | Default | Effective meaning |
|
|
97
|
+
|:--|:--|:--|:--|
|
|
98
|
+
| `shadowFilter` | `pcf1`, `pcf3`, `pcf5`, `pcssMedium`, `pcssHigh` | `pcf3` | Requested directional filter profile |
|
|
99
|
+
| `shadowAngularRadius` | Radians, finite range `[0.0001, 0.05]` | `0.00465` | PCSS light angular radius |
|
|
100
|
+
| `maxPenumbraTexels` | Texels, finite integer range `[1, 64]` | `32` | PCSS penumbra ceiling |
|
|
101
|
+
|
|
102
|
+
The remaining CSM fields keep these public units and defaults: `cascadeCount`
|
|
103
|
+
is an integer in `[1, 4]` (default `4`), `splitLambda` is `[0, 1]` (default
|
|
104
|
+
`0.75`), `cascadeBlend` is `[0, 0.5]` (default `0.2`), `mapSize` is a positive
|
|
105
|
+
map resolution (default `2048`), `depthBias` is a depth value (default
|
|
106
|
+
`0.005`), `normalBias` is a world-space offset (default `0.05`), and
|
|
107
|
+
`shadowDistance` is a positive world-unit distance in meters (default `200`).
|
|
108
|
+
|
|
109
|
+
After `draw`, read the single `renderer.inspect().directionalShadow` projection.
|
|
110
|
+
It is JSON-safe and bounded: `requested` is author intent, `effective` is the
|
|
111
|
+
admitted profile, `status` is `accepted | fallback | rejected`, and
|
|
112
|
+
`fallbackReason` explains `webgl2-unsupported`, `rhi-null-structural`, or
|
|
113
|
+
`candidate-failed`. `lastKnownGood` identifies retained output and
|
|
114
|
+
`pixelEvidence` distinguishes real pixel evidence from `not-available`.
|
|
115
|
+
`cascadeCount`, `mapSize`, `atlasBytes`, `writerPasses`, `blockerTaps`,
|
|
116
|
+
`filterTapUpperBound`, `seamTapUpperBound`, `deviceGeneration`, and
|
|
117
|
+
`graphGeneration` are inspection facts, not additional author controls.
|
|
118
|
+
|
|
119
|
+
If author validation returns `error.code === 'shadow-invalid-config'`, do not
|
|
120
|
+
parse `error.message`. Read `error.expected`, `error.hint`,
|
|
121
|
+
`error.detail.field`, `error.detail.actual`, `error.detail.bound`, and
|
|
122
|
+
`error.detail.reason`; repair the named `DirectionalLight` field and retry the
|
|
123
|
+
same request. For a rejected candidate, retain `lastKnownGood` from inspection,
|
|
124
|
+
repair or rebuild the named producer, then call the existing `renderer.recover()`
|
|
125
|
+
boundary and retry. WebGL2 reports its explicit PCF lane; RhiNull reports
|
|
126
|
+
`rhi-null-structural` only, so neither is PCSS pixel evidence.
|
|
127
|
+
Missing or `not-run` Browser/Dawn/PNG/timing evidence remains missing or
|
|
128
|
+
`not-run`, never a pass. The authoritative labels and validation remain in
|
|
129
|
+
[`directional-light.ts`](src/components/directional-light.ts) and
|
|
130
|
+
[`light-helpers.ts`](src/components/light-helpers.ts); this section is an AI
|
|
131
|
+
index path, not a second schema.
|
|
32
132
|
|
|
33
133
|
```ts
|
|
34
134
|
import {
|
|
@@ -55,6 +155,102 @@ environment owners or multiple fog owners return structured errors with a
|
|
|
55
155
|
code-specific `detail`; they do not create a second registry or silently pick
|
|
56
156
|
the first entity. Frame facts contain IDs, revisions, and POD values only, not
|
|
57
157
|
textures, buffers, devices, or other live GPU objects.
|
|
158
|
+
## GPU pass timing: opt in, draw, observe, branch on status
|
|
159
|
+
|
|
160
|
+
GPU pass timing is disabled by default. Opt in once on `createRenderer`, keep the
|
|
161
|
+
returned `FrameReceipt`, and request facts only for that receipt. The pass
|
|
162
|
+
duration is a bounded GPU fact; it is not frame latency.
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
import { createRenderer } from '@forgeax/engine-runtime';
|
|
166
|
+
|
|
167
|
+
const created = await createRenderer(canvas, { gpuPassTiming: {} });
|
|
168
|
+
if (!created.ok) throw created.error;
|
|
169
|
+
const renderer = created.value;
|
|
170
|
+
const attached = renderer.attach(world);
|
|
171
|
+
if (!attached.ok) throw attached.error;
|
|
172
|
+
const drawn = renderer.draw({
|
|
173
|
+
leases: [attached.value],
|
|
174
|
+
camera: { lease: attached.value },
|
|
175
|
+
environment: { lease: attached.value },
|
|
176
|
+
});
|
|
177
|
+
if (!drawn.ok) throw drawn.error;
|
|
178
|
+
|
|
179
|
+
const observed = await renderer.observe(drawn.value, { include: ['timings'] });
|
|
180
|
+
if (!observed.ok) throw observed.error;
|
|
181
|
+
const timings = observed.value.timings;
|
|
182
|
+
if (timings === undefined) throw new Error('timings were not requested');
|
|
183
|
+
switch (timings.status) {
|
|
184
|
+
case 'complete':
|
|
185
|
+
console.log(timings.frame.passes);
|
|
186
|
+
break;
|
|
187
|
+
case 'partial':
|
|
188
|
+
console.log(timings.reason.code, timings.frame.passes);
|
|
189
|
+
break;
|
|
190
|
+
case 'unavailable':
|
|
191
|
+
console.log(timings.reason.code, timings.capability);
|
|
192
|
+
break;
|
|
193
|
+
case 'failed':
|
|
194
|
+
console.log(timings.error.code, timings.latestKnownGood);
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
The [bounded fact contract](src/record/gpu-pass-timing/contract.ts),
|
|
200
|
+
[recovery errors](src/record/gpu-pass-timing/errors.ts), and
|
|
201
|
+
[validator](bench/gpu-pass-timing/validator.ts) are the source-linked
|
|
202
|
+
references for the four status branches and the fail-closed benchmark verdict.
|
|
203
|
+
A timing error exposes the closed `code` union plus `expected`, `hint`, and
|
|
204
|
+
`detail`; follow the producer-owned recovery action in the error before
|
|
205
|
+
observing a later receipt. `latestKnownGood` is a separate reference and never
|
|
206
|
+
changes the current status or completeness. Omitting `timings` from `include`
|
|
207
|
+
returns receipt metadata without materializing timing facts.
|
|
208
|
+
|
|
209
|
+
Run the paired real-GPU benchmark with the Dawn host:
|
|
210
|
+
|
|
211
|
+
```sh
|
|
212
|
+
FORGEAX_GPU_PASS_TIMING_HOST_MODULE="$PWD/packages/render/bench/gpu-pass-timing/dawn-host.ts" \
|
|
213
|
+
pnpm gpu-pass-timing:bench -- --output=/tmp/forgeax-gpu-pass-timing.json
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
The command exits `0` only for a complete accepted report and exits `2` for a
|
|
217
|
+
blocked report. When an observation is `partial`, branch on
|
|
218
|
+
`timings.reason.code === 'timestamp-write-unavailable'`, retain the
|
|
219
|
+
unmeasured pass and its structured `detail.cause`, then observe the next
|
|
220
|
+
receipt after the producer-owned recovery action. Do not turn that pass into a
|
|
221
|
+
zero-duration sample or accept the benchmark until all paired windows are
|
|
222
|
+
complete.
|
|
223
|
+
|
|
224
|
+
An accepted report retains `frameFacts`: one complete on-path frame fact per paired
|
|
225
|
+
group, including the frame identity, raw decimal ticks, each measured pass duration,
|
|
226
|
+
and `measuredPassNanoseconds`. If a real run is blocked by partial observations, the
|
|
227
|
+
blocked JSON keeps the observed representative facts under `evidence.frameFacts` so
|
|
228
|
+
the measured values remain inspectable without weakening the verdict. If complete
|
|
229
|
+
windows fail the paired overhead gate, `evidence.windows` retains the raw samples and
|
|
230
|
+
`evidence.pairedOverhead` retains each group p95, group overhead, and reported median.
|
|
231
|
+
|
|
232
|
+
Measured entries expose `measurementSource`: raster and compute entries use
|
|
233
|
+
`pass-boundary`; copy entries use `copy-boundary-envelope`, the interval between
|
|
234
|
+
timing-only marker passes, and must not be read as exact copy duration.
|
|
235
|
+
|
|
236
|
+
## Fog and point-shadow observations
|
|
237
|
+
|
|
238
|
+
`Fog` is a one-per-World environment input. Extract validates its parameters
|
|
239
|
+
before publication; an invalid update keeps the renderer's last-known-good
|
|
240
|
+
fog frame and exposes the structured failure through the existing inspection
|
|
241
|
+
path. There is no app-local fog state.
|
|
242
|
+
|
|
243
|
+
Point shadows use one renderer-owned cube-array `ShadowAtlas`. The public
|
|
244
|
+
`SHADOW_ATLAS_DEFAULT_FACE_SIZE` and `SHADOW_ATLAS_DEFAULT_LAYERS` constants
|
|
245
|
+
are the only capacity owner; extract assigns `shadowAtlasLayer: -1` to
|
|
246
|
+
requests beyond that capacity while retaining them for inspection. After a
|
|
247
|
+
successful frame, `renderer.inspect().pointShadow` reports `requested`,
|
|
248
|
+
`admitted`, `shadowed`, `shadowAtlasOccupancy`, and `shadowAtlasCapacity`.
|
|
249
|
+
The App `pointShadowPlugin()` consumes that renderer capability and provides
|
|
250
|
+
structured preflight failures for missing-storage-buffer, invalid, or
|
|
251
|
+
over-budget requests. A World with no `PointLightShadow` remains `inactive`;
|
|
252
|
+
there is no pseudo-disabled shadow mode. Directional CSM remains a separate
|
|
253
|
+
shadow owner; PointLightShadow is not a second directional-light path.
|
|
58
254
|
|
|
59
255
|
## Render happy path
|
|
60
256
|
|
|
@@ -79,10 +275,97 @@ if (!frame.ok) throw frame.error;
|
|
|
79
275
|
const observation = await renderer.observe(frame.value, { include: ['timings'] });
|
|
80
276
|
```
|
|
81
277
|
|
|
82
|
-
The Standard pipeline
|
|
83
|
-
PBR, IBL, SSAO, bloom, tone, antialiasing, sky, material, VFX, and debug feature
|
|
84
|
-
the same graph and submit boundary. CPU and WebGL2
|
|
85
|
-
not
|
|
278
|
+
The Standard pipeline uses one Cluster transport for every local light on storage-capable devices
|
|
279
|
+
and keeps shadow, PBR, IBL, SSAO, bloom, tone, antialiasing, sky, material, VFX, and debug feature
|
|
280
|
+
ownership inside the same graph and submit boundary. CPU and WebGL2 remain capability lanes for the
|
|
281
|
+
Cluster membership producer or for mesh/instance storage fallback; they do not reintroduce a
|
|
282
|
+
PointLight/SpotLight buffer or a fixed four-light ABI.
|
|
283
|
+
## SSR M0 admission: inspect owners, then decide
|
|
284
|
+
|
|
285
|
+
> [!IMPORTANT]
|
|
286
|
+
> SSR M0 is a consumer-only admission boundary. It reads detached producer,
|
|
287
|
+
> r32float format, and temporal receipts with one four-field integration
|
|
288
|
+
> identity. Any missing, stale, structural-only, or mismatched receipt stays
|
|
289
|
+
> `fallback-only` and emits zero SSR work; this section does not describe SSR
|
|
290
|
+
> capture, ray tracing, Hi-Z, temporal resolve, composition, or history.
|
|
291
|
+
|
|
292
|
+
```mermaid
|
|
293
|
+
flowchart LR
|
|
294
|
+
P["producer detached receipt"] --> A["admitSsrM0"]
|
|
295
|
+
F["format stage receipt"] --> A
|
|
296
|
+
T["temporal submit receipt"] --> A
|
|
297
|
+
A -->|"all identity and verdict checks pass"| E["admitted: parent M1 may unlock"]
|
|
298
|
+
A -->|"missing, stale, unavailable, or mismatched"| B["fallback-only: zero work"]
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
The inspection route is deliberately progressive:
|
|
302
|
+
|
|
303
|
+
| Layer | Read first | Owner action on failure |
|
|
304
|
+
|:--|:--|:--|
|
|
305
|
+
| Status | `status`, `failure.code`, `failure.expected` | branch on the closed failure code |
|
|
306
|
+
| Identity | `sourceHead`, `sourceTree`, `lockSha256`, `buildSha256` | rebuild the owner receipt for the current identity |
|
|
307
|
+
| Generation | producer `generation`, format `deviceGeneration`, temporal `generation` | discard stale completion and reinspect |
|
|
308
|
+
| Recovery | `failure.hint`, typed `detail.owner`, `detail.action` | use LKG/Skylight/neutral, recapture, rebuild, or retry through that owner |
|
|
309
|
+
| Work | attachment/pass/binding/resource/history/temporal counters | require exact zero on every blocked path |
|
|
310
|
+
|
|
311
|
+
```ts
|
|
312
|
+
const admission = admitSsrM0({ requested, identity, reflectionFallback, format, temporal });
|
|
313
|
+
if (admission.status === 'fallback-only') {
|
|
314
|
+
// Read admission.failure.code and route recovery to its owner.
|
|
315
|
+
console.log(admission.work); // every SSR counter is zero
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
Use `inspect -> owner recovery -> matching submit -> reinspect` as the complete
|
|
320
|
+
AI route. No returned field is a device, graph node, texture, buffer, encoder,
|
|
321
|
+
or other live handle. A stable generation keeps `resetCount`, `rebuildCount`,
|
|
322
|
+
and additional format probe work at zero; a changed generation must be
|
|
323
|
+
reinspected before admission can be considered again.
|
|
324
|
+
|
|
325
|
+
`inspect()` is a synchronous snapshot. The first snapshot after binding may show
|
|
326
|
+
an absent format or temporal receipt while the owner probe and first submit are
|
|
327
|
+
still in flight; it is not a `pending` verdict. Run the ordinary owner frame,
|
|
328
|
+
await `FrameReceipt.completed`, then inspect again before routing recovery.
|
|
329
|
+
|
|
330
|
+
There are two action projections. `admission.failure.detail.action` is the coarse
|
|
331
|
+
M0 gate instruction (`retry` for demand/readiness and `rebuild` for a missing or
|
|
332
|
+
mismatched receipt). `reflectionFallbackInspection.recoveryAction` is the
|
|
333
|
+
producer's more specific source/recapture instruction. Neither is a second SSR
|
|
334
|
+
API; use the existing owner operation shown here, then submit and inspect again:
|
|
335
|
+
|
|
336
|
+
| Action field | Owner operation | Next observation |
|
|
337
|
+
|:--|:--|:--|
|
|
338
|
+
| `reflectionFallbackInspection.recoveryAction = use-LKG` | Keep the compatible probe row and draw the next frame | Read the committed row and matching temporal receipt |
|
|
339
|
+
| `reflectionFallbackInspection.recoveryAction = use-Skylight` / `use-neutral` | Change the World-owned probe/`Skylight` source, then draw | Confirm selected source and committed generation |
|
|
340
|
+
| `reflectionFallbackInspection.recoveryAction = recapture` / `rebuild` / `retry` | Draw again so the producer/RHI owner retries pending work | Await completion and inspect the owner receipt/failure |
|
|
341
|
+
| `admission.failure.detail.action = retry` / `rebuild` | Retry the consumer frame, or rebuild the named owner receipt | Reinspect admission and all three receipt generations |
|
|
342
|
+
| device-loss recovery | `await renderer.recover()` before the next draw | Confirm the replacement `deviceGeneration`, then re-probe |
|
|
343
|
+
|
|
344
|
+
SSR never invokes these operations or mutates producer/device state; this table
|
|
345
|
+
maps the typed action to the existing public World and Renderer seams.
|
|
346
|
+
|
|
347
|
+
## Target and probe lifecycle index
|
|
348
|
+
|
|
349
|
+
The public target route is one Renderer owner: create a typed `RenderTarget`, create a
|
|
350
|
+
`RenderTargetTextureSource` for the material slot, request a readback ticket, draw once, await
|
|
351
|
+
`FrameReceipt.completed`, then call `observe(receipt, ...)`. `CubeCamera` contributes six real
|
|
352
|
+
face views to the existing frame graph; a candidate becomes active only after its completed
|
|
353
|
+
receipt. `ReflectionProbe` adds bounded PMREM face/mip work, local box projection, and Skylight
|
|
354
|
+
irradiance fallback through the same Standard material binding path.
|
|
355
|
+
|
|
356
|
+
Use `inspect()` for bounded target/probe counts, pending work, and the last structured failure.
|
|
357
|
+
`inspection.reflectionProbes.selection` identifies the selected probe by `worldId` and `entityKey`,
|
|
358
|
+
or reports `{ kind: 'skylight' }` for the explicit fallback. `recover()` is meaningful only from `device-lost`; on a healthy renderer its structured
|
|
359
|
+
`renderer-state-invalid` result is a guard. Device recovery invalidates old generations and
|
|
360
|
+
rebuilds producer-owned physical resources, so old tickets and sources must not be reused.
|
|
361
|
+
For the SSR dependency producer, `inspection.reflectionProbes.reflectionFallbackInspection`
|
|
362
|
+
is the bounded recovery projection: its `receipt` is the committed source row selected for
|
|
363
|
+
the current lighting selection, while `failureStage`, `failureCode`, `expected`, and
|
|
364
|
+
`recoveryAction` describe the latest closed failure without exposing a texture, graph, or
|
|
365
|
+
device handle. `reflectionFallbackReadback` is the separate completed attachment fact; it
|
|
366
|
+
must match the committed row's frame and device generation before it is used as evidence.
|
|
367
|
+
The exact public names and stable consumer IDs are machine-readable in
|
|
368
|
+
`src/__tests__/render-target-public-schema.json`.
|
|
86
369
|
|
|
87
370
|
## Stable inspection and dark-gradient evidence
|
|
88
371
|
|
|
@@ -186,26 +469,6 @@ gate exercises the browser delivery path. Runtime inspection uses the public
|
|
|
186
469
|
belongs in `packages/render/bench` and its dev-verify producer. Render does
|
|
187
470
|
not expose a timing controller or a second membership-specific API.
|
|
188
471
|
|
|
189
|
-
## RenderFeature: the producer seam (first-read index)
|
|
190
|
-
|
|
191
|
-
### Material contract projection
|
|
192
|
-
|
|
193
|
-
Render consumes only the Pack-owned material publication projection. Its
|
|
194
|
-
inputs are runtime bool/value data, composed module slots, and the closed
|
|
195
|
-
compiler context; render never authors, cooks, writes DDC, or selects a
|
|
196
|
-
fallback material. The projection preserves `layoutIdentity`,
|
|
197
|
-
`programIdentity`, `cookIdentity`, and `materialPublicationIdentity` so a
|
|
198
|
-
stale draw can be traced to the first producer divergence.
|
|
199
|
-
|
|
200
|
-
The public route is one `RenderFeature<FrameData>` through the Standard
|
|
201
|
-
Pipeline and the active RenderGraph pass. In the examples below, `type FrameData`
|
|
202
|
-
is the producer-owned extracted value. A feature extracts one frame value,
|
|
203
|
-
then its mandatory `plan(data, context)` declares named resources and passes;
|
|
204
|
-
the host derives graph access, preparation, recording, and recovery from that
|
|
205
|
-
plan. Register it at construction with
|
|
206
|
-
`createRenderer(canvas, { features: [feature] })`. A feature never receives a
|
|
207
|
-
device, queue, encoder, staging builder, or submit callback.
|
|
208
|
-
|
|
209
472
|
## Motion Blur temporal consumer
|
|
210
473
|
|
|
211
474
|
The Standard camera may carry the presence-enabled `MotionBlur` component. Its
|
|
@@ -255,6 +518,31 @@ uses the neutral engine material.
|
|
|
255
518
|
|
|
256
519
|
The render path is `MaterialAsset` -> extract snapshot -> prepare resources -> record the per-slot `coordinates` and values. The effective `parent` is already resolved before extract. If a material contract or reflection binding fails, preserve the structured error and repair the source contract or cooked module before drawing again; that is the recovery route. The render package owns consumption, not material import or cook policy.
|
|
257
520
|
|
|
521
|
+
### Resident material observation
|
|
522
|
+
|
|
523
|
+
`renderer.inspect().meshMaterialBindings[]` is the detached observation of the
|
|
524
|
+
binding that the renderer actually consumed. Its `residency` projection records
|
|
525
|
+
`ready`, `pending`, `failed`, or `last-known-good`, plus the resolved sampler
|
|
526
|
+
handles, texture handles, mip counts, and the nearest structured preparation
|
|
527
|
+
failure when one exists. The observation is recomputed from the asset/runtime
|
|
528
|
+
owner during preparation; render does not keep a second readiness ledger,
|
|
529
|
+
infer state from URLs, or repair a producer failure. Aggregate counts are
|
|
530
|
+
derived from the observations, so an AI can inspect first, repair or recook the
|
|
531
|
+
producer, and retry without guessing at hidden renderer state.
|
|
532
|
+
|
|
533
|
+
### Instances CPU bounds contract
|
|
534
|
+
|
|
535
|
+
`Instances` remains author data containing only packed local transforms. The
|
|
536
|
+
renderer derives a CPU union bound from each mesh AABB, entity world matrix,
|
|
537
|
+
and every instance matrix. The union cache is scoped by World/entity and
|
|
538
|
+
invalidated by mesh, entity-transform, instance-array, slot removal, and
|
|
539
|
+
generation changes. Missing, malformed, or empty instance data is a
|
|
540
|
+
conservative no-cull result; it never creates a synthetic identity instance.
|
|
541
|
+
The GPU path keeps the mesh-local AABB and performs per-instance visibility,
|
|
542
|
+
while the CPU path uses the derived union only to avoid dropping an entity
|
|
543
|
+
whose origin is outside the view. Do not add `bounds` to the public
|
|
544
|
+
`Instances` component or duplicate this renderer fact in Pack/asset state.
|
|
545
|
+
|
|
258
546
|
## Points and Lines authoring (M1)
|
|
259
547
|
|
|
260
548
|
Points and Lines are first-class render components. Their geometry remains a
|
|
@@ -336,6 +624,27 @@ if (!result.ok) {
|
|
|
336
624
|
}
|
|
337
625
|
```
|
|
338
626
|
|
|
627
|
+
## Standard lighting contract
|
|
628
|
+
|
|
629
|
+
`forgeax::standard` is the only built-in lighting identity. Every finite point
|
|
630
|
+
and spot light enters the shared Cluster membership path; `DirectionalLight`
|
|
631
|
+
remains global and does not consume local-light membership. `renderPath` only
|
|
632
|
+
selects Forward or Deferred graph topology. The derivation chain is
|
|
633
|
+
`LightFrame -> PreparedStandardLighting -> StandardClusterTransportPlan`, with
|
|
634
|
+
`packages/render/src/pipeline/standard-lighting/layout.ts` as the storage-size
|
|
635
|
+
and light-index budget SSOT.
|
|
636
|
+
|
|
637
|
+
Transport capability is explicit: compute/storage or CPU/storage. Cluster has
|
|
638
|
+
no uniform-backed downlevel ABI; when `storageBuffer` is absent, admission
|
|
639
|
+
returns the structured `standard-cluster-transport-unavailable` result with
|
|
640
|
+
`requested` and `admitted`. Never invent a four-light fallback. Read
|
|
641
|
+
`expected`, `hint`, and `detail` before repairing the device capability or the
|
|
642
|
+
producer input. Both lanes consume the same complete CPU canonical corpus;
|
|
643
|
+
the compute lane materializes the GPU index list, while the CPU lane uploads
|
|
644
|
+
that list. A Dawn readback that compares the GPU list with the canonical
|
|
645
|
+
corpus is the proof of GPU membership; until that readback runs, evidence is
|
|
646
|
+
`not-proven`, never a synthetic completion state.
|
|
647
|
+
|
|
339
648
|
M1 intentionally refuses strip expansion, joins, caps, dashes, picking, and
|
|
340
649
|
visible point/line draw preparation. Those are later implementation lanes, not
|
|
341
650
|
implicit fallbacks in authoring code.
|
|
@@ -445,7 +754,7 @@ authority.
|
|
|
445
754
|
|
|
446
755
|
Inspect the current path through `renderer.inspect()`. Its detached CPU snapshot exposes
|
|
447
756
|
full rebuilds, no-change and delta frames, transform/material/instance updates,
|
|
448
|
-
removals, the
|
|
757
|
+
removals, the consumer-owned read version, projection cardinality, and the last resync
|
|
449
758
|
reason. The nested `gpu` status is one of `inactive`, `unsupported`, `resident`,
|
|
450
759
|
`rebuild-pending`, or `error`; resident state additionally reports capacity,
|
|
451
760
|
upload ranges and bytes, grows, clears, rebuilds, and no-change frames. The
|
|
@@ -783,3 +1092,30 @@ const temporal = catalog.require('forgeax::scene-data::temporal-v1');
|
|
|
783
1092
|
available, `SceneDataUnavailableError` exposes the closed `reason`, missing
|
|
784
1093
|
producer IDs (at most 32 plus an omission count), and explicit `recovery`.
|
|
785
1094
|
Repair capability or producer coverage at its owner, then retry the next frame.
|
|
1095
|
+
|
|
1096
|
+
## AI-readable SSR fallback route
|
|
1097
|
+
|
|
1098
|
+
For the reflection fallback dependency evidence, call `renderer.inspect()` first
|
|
1099
|
+
and run the paired fixture. The fixture writes the current Browser/Dawn manifests;
|
|
1100
|
+
the collector then seals a fresh joint M0 guard for the current checkout:
|
|
1101
|
+
|
|
1102
|
+
```bash
|
|
1103
|
+
pnpm --filter @forgeax/app-learn-render-6-pbr-4-render-target-reflection smoke:ssr-fallback
|
|
1104
|
+
pnpm --filter @forgeax/app-learn-render-6-pbr-4-render-target-reflection smoke:browser
|
|
1105
|
+
node scripts/forgeax/collect-ssr-dependency-report.mjs \
|
|
1106
|
+
--input artifacts/ssr-fallback/dawn/ssr-dependencies-input.json \
|
|
1107
|
+
--build-summary packages/render/dist/index.mjs \
|
|
1108
|
+
--output artifacts/ssr-fallback/ssr-dependency-report.json
|
|
1109
|
+
```
|
|
1110
|
+
|
|
1111
|
+
Each smoke writes its own detached `ssr-dependencies-input.json` beside the lane
|
|
1112
|
+
manifest; the command above uses the just-completed Dawn input (use the Browser
|
|
1113
|
+
path when inspecting that lane separately). The collector signs the output with
|
|
1114
|
+
the current source/tree/lock/build identity; it never promotes a stale
|
|
1115
|
+
sibling-loop report or an authored manifest. Read identity, generation, evidence
|
|
1116
|
+
level, and closed failure fields before following the named owner recovery action.
|
|
1117
|
+
Submit the same consumer request and reinspect after recovery. The route returns
|
|
1118
|
+
detached facts only: no live GPU handle, second owner, or second ledger is exposed.
|
|
1119
|
+
Missing or mismatched receipts remain
|
|
1120
|
+
`fallback-only` with zero SSR work; SSR v1, Hi-Z, ray marching, temporal resolve,
|
|
1121
|
+
compose, and history are out of scope.
|
|
@@ -2,6 +2,19 @@ import type { Result, RhiCanvasContext, RhiDevice, RhiError, RhiInstance, Shader
|
|
|
2
2
|
/** Optional host hooks for recorder and device-lifecycle capabilities. */
|
|
3
3
|
export interface RhiBackendInstrumentation {
|
|
4
4
|
readonly resolveSurfaceDevice?: (device: RhiDevice) => Result<RhiDevice, RhiError>;
|
|
5
|
+
/**
|
|
6
|
+
* Optional deterministic submit fault seam for backend-owned integration
|
|
7
|
+
* fixtures. The callback runs after `finish()` and before the queue submit;
|
|
8
|
+
* returning an error aborts the frame transaction without changing the
|
|
9
|
+
* production queue contract.
|
|
10
|
+
*/
|
|
11
|
+
readonly beforeSubmit?: (device: RhiDevice) => RhiError | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Optional device-loss projection for deterministic recovery fixtures. A
|
|
14
|
+
* backend may compose this promise with its native `device.lost` promise;
|
|
15
|
+
* normal production packs leave it undefined and use the native signal.
|
|
16
|
+
*/
|
|
17
|
+
readonly deviceLost?: (device: RhiDevice) => RhiDevice['lost'];
|
|
5
18
|
readonly onFrameBoundary?: () => void;
|
|
6
19
|
readonly onDeviceLost?: () => void;
|
|
7
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-contract.d.ts","sourceRoot":"","sources":["../../src/assembly/backend-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,WAAW,EACX,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,0EAA0E;AAC1E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnF,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC;AAED,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG;QAC1B,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,MAAM,EAAE,iBAAiB,GAAG,eAAe,KACxC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;KACzC,CAAC;IACF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAC5B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KAC/C,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7C;;;;;;;OAOG;IACH,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CACrC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KAC/C,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACpC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK;QAC3D,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QACnB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;KAC1B,CAAC;IACF,gBAAgB;IAChB,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,GAAG,SAAS,CAAC;IAC7E,4EAA4E;IAC5E,QAAQ,CAAC,eAAe,CAAC,EAAE,yBAAyB,CAAC;CACtD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;CACnD;AAiCD,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;gBAElC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,4BAAiC;CAWtE"}
|
|
1
|
+
{"version":3,"file":"backend-contract.d.ts","sourceRoot":"","sources":["../../src/assembly/backend-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,WAAW,EACX,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,0EAA0E;AAC1E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnF;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,QAAQ,GAAG,SAAS,CAAC;IACpE;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/D,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC;AAED,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG;QAC1B,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,MAAM,EAAE,iBAAiB,GAAG,eAAe,KACxC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;KACzC,CAAC;IACF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAC5B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KAC/C,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7C;;;;;;;OAOG;IACH,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CACrC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KAC/C,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACpC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK;QAC3D,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QACnB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;KAC1B,CAAC;IACF,gBAAgB;IAChB,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,GAAG,SAAS,CAAC;IAC7E,4EAA4E;IAC5E,QAAQ,CAAC,eAAe,CAAC,EAAE,yBAAyB,CAAC;CACtD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;CACnD;AAiCD,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;gBAElC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,4BAAiC;CAWtE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RhiAdapter, RhiDevice } from '@forgeax/engine-rhi';
|
|
2
|
+
export declare const STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES = 17;
|
|
3
|
+
export interface DeviceFeatureAdmissionOptions {
|
|
4
|
+
readonly gpuPassTiming?: object | undefined;
|
|
5
|
+
readonly captureGpuTimings?: boolean | undefined;
|
|
6
|
+
}
|
|
7
|
+
export interface DeviceFeatureAdmission {
|
|
8
|
+
readonly requiredFeatures: GPUFeatureName[];
|
|
9
|
+
readonly requiredLimits?: {
|
|
10
|
+
readonly maxSampledTexturesPerShaderStage: number;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
type AdapterFeatureProbe = Pick<RhiAdapter, 'features'> & Partial<Pick<RhiAdapter, 'limits'>>;
|
|
14
|
+
export declare function deriveDeviceFeatureAdmission(adapter: AdapterFeatureProbe, options?: DeviceFeatureAdmissionOptions): DeviceFeatureAdmission;
|
|
15
|
+
export declare function deviceOptionsForAdapter(adapter: AdapterFeatureProbe, options?: DeviceFeatureAdmissionOptions): DeviceFeatureAdmission | undefined;
|
|
16
|
+
export declare function isTimestampQueryAdmitted(caps: Pick<RhiDevice['caps'], 'timestampQuery' | 'timestampPeriodNanoseconds'>): boolean;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=device-feature-admission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-feature-admission.d.ts","sourceRoot":"","sources":["../../src/assembly/device-feature-admission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAejE,eAAO,MAAM,sCAAsC,KAAK,CAAC;AAEzD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,cAAc,CAAC,EAAE;QACxB,QAAQ,CAAC,gCAAgC,EAAE,MAAM,CAAC;KACnD,CAAC;CACH;AAED,KAAK,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE9F,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE,6BAA6B,GACtC,sBAAsB,CAwBxB;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE,6BAA6B,GACtC,sBAAsB,GAAG,SAAS,CAKpC;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,4BAA4B,CAAC,GAC7E,OAAO,CAOT"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { DirectionalShadowQuality } from '../components/directional-shadow-filter';
|
|
2
|
+
import type { DirectionalShadowInspection, DirectionalShadowInspectionError, DirectionalShadowProfile } from '../inspection-types';
|
|
3
|
+
import type { DirectionalShadowBackendAdmission } from '../render-pipeline';
|
|
4
|
+
export interface DirectionalShadowInspectionSource {
|
|
5
|
+
readonly requested: DirectionalShadowProfile;
|
|
6
|
+
readonly candidate: 'accepted' | 'failed';
|
|
7
|
+
readonly lastKnownGood?: DirectionalShadowProfile | undefined;
|
|
8
|
+
readonly cascadeCount: number;
|
|
9
|
+
readonly mapSize: number;
|
|
10
|
+
readonly atlasBytes: number;
|
|
11
|
+
readonly writerPasses: number;
|
|
12
|
+
readonly shadowAngularRadius?: number | undefined;
|
|
13
|
+
readonly maxPenumbraTexels?: number | undefined;
|
|
14
|
+
readonly deviceGeneration: number;
|
|
15
|
+
readonly graphGeneration: number;
|
|
16
|
+
readonly shadowReady: boolean;
|
|
17
|
+
readonly error?: DirectionalShadowInspectionError | undefined;
|
|
18
|
+
}
|
|
19
|
+
export interface DirectionalShadowInspectionInput {
|
|
20
|
+
readonly admission: DirectionalShadowBackendAdmission;
|
|
21
|
+
readonly cascadeCount: number;
|
|
22
|
+
readonly mapSize: number;
|
|
23
|
+
readonly atlasBytes: number;
|
|
24
|
+
readonly writerPasses: number;
|
|
25
|
+
readonly blockerTaps: number;
|
|
26
|
+
readonly filterTapUpperBound: number;
|
|
27
|
+
readonly seamTapUpperBound: number;
|
|
28
|
+
readonly shadowAngularRadius?: number | undefined;
|
|
29
|
+
readonly maxPenumbraTexels?: number | undefined;
|
|
30
|
+
readonly deviceGeneration: number;
|
|
31
|
+
readonly graphGeneration: number;
|
|
32
|
+
readonly error?: DirectionalShadowInspectionError | undefined;
|
|
33
|
+
}
|
|
34
|
+
/** Project the single bounded Directional inspection POD; no live handles leak. */
|
|
35
|
+
export declare function projectDirectionalShadowInspection(input: DirectionalShadowInspectionInput): DirectionalShadowInspection;
|
|
36
|
+
export declare function directionalShadowProfileFromQuality(quality: DirectionalShadowQuality | undefined): DirectionalShadowProfile;
|
|
37
|
+
export declare function projectDirectionalShadowInspectionSource(input: DirectionalShadowInspectionSource): DirectionalShadowInspection;
|
|
38
|
+
//# sourceMappingURL=directional-shadow-inspection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directional-shadow-inspection.d.ts","sourceRoot":"","sources":["../../src/assembly/directional-shadow-inspection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACxF,OAAO,KAAK,EACV,2BAA2B,EAC3B,gCAAgC,EAChC,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAE5E,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC1C,QAAQ,CAAC,aAAa,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC9D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,gCAAgC,GAAG,SAAS,CAAC;CAC/D;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,SAAS,EAAE,iCAAiC,CAAC;IACtD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,gCAAgC,GAAG,SAAS,CAAC;CAC/D;AAWD,mFAAmF;AACnF,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,gCAAgC,GACtC,2BAA2B,CAwB7B;AAED,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,wBAAwB,GAAG,SAAS,GAC5C,wBAAwB,CAI1B;AAED,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,iCAAiC,GACvC,2BAA2B,CAiC7B"}
|