@forgeax/engine-render 0.1.19 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +215 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/assembly/device-feature-admission.d.ts +18 -0
- package/dist/assembly/device-feature-admission.d.ts.map +1 -0
- package/dist/assembly/directional-shadow-inspection.d.ts +38 -0
- package/dist/assembly/directional-shadow-inspection.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +34 -20
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +9 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/render-target-host.d.ts +46 -0
- package/dist/assembly/render-target-host.d.ts.map +1 -0
- package/dist/assets/render-asset-port.d.ts.map +1 -1
- package/dist/authoring.mjs +3 -0
- package/dist/authoring.mjs.map +1 -1
- package/dist/capture/cube-views.d.ts +21 -0
- package/dist/capture/cube-views.d.ts.map +1 -0
- package/dist/capture/scheduler.d.ts +54 -0
- package/dist/capture/scheduler.d.ts.map +1 -0
- package/dist/{chunk-RJRUS55L.mjs → chunk-5YADUCA7.mjs} +1896 -1624
- package/dist/chunk-5YADUCA7.mjs.map +1 -0
- package/dist/{chunk-LOSO4CTV.mjs → chunk-6OPXDQ2E.mjs} +423 -46
- package/dist/chunk-6OPXDQ2E.mjs.map +1 -0
- package/dist/{chunk-IPXCABEP.mjs → chunk-BXBQQKFQ.mjs} +3 -9
- package/dist/chunk-BXBQQKFQ.mjs.map +1 -0
- package/dist/chunk-FS2KNUQH.mjs +1294 -0
- package/dist/chunk-FS2KNUQH.mjs.map +1 -0
- package/dist/components/camera.d.ts +1 -0
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/cube-camera.d.ts +20 -0
- package/dist/components/cube-camera.d.ts.map +1 -0
- package/dist/components/directional-light.d.ts +11 -2
- package/dist/components/directional-light.d.ts.map +1 -1
- package/dist/components/directional-shadow-filter.d.ts +25 -0
- package/dist/components/directional-shadow-filter.d.ts.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/reflection-probe.d.ts +17 -0
- package/dist/components/reflection-probe.d.ts.map +1 -0
- package/dist/components/spot-light.d.ts +12 -0
- package/dist/components/spot-light.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +8552 -1612
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +19 -2
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/environment/frame.d.ts.map +1 -1
- package/dist/environment/lifecycle.d.ts +5 -0
- package/dist/environment/lifecycle.d.ts.map +1 -1
- package/dist/errors/render.d.ts +209 -93
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/directional-shadow-projection.d.ts +23 -0
- package/dist/extract/directional-shadow-projection.d.ts.map +1 -0
- package/dist/extract/environment.d.ts +14 -0
- package/dist/extract/environment.d.ts.map +1 -1
- package/dist/extract/visibility.d.ts.map +1 -1
- package/dist/features/fullscreen.d.ts.map +1 -1
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +10 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +13 -2
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +0 -1
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-usage.d.ts +2 -0
- package/dist/gpu-usage.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +19 -17
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +4 -0
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/kernel-cache.d.ts +36 -0
- package/dist/ibl/kernel-cache.d.ts.map +1 -0
- package/dist/index.d.ts +35 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +51 -0
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instances-derived-bounds.d.ts +50 -0
- package/dist/instances-derived-bounds.d.ts.map +1 -0
- package/dist/internal.mjs +1 -1
- package/dist/light-buffer-layout.d.ts +30 -13
- package/dist/light-buffer-layout.d.ts.map +1 -1
- package/dist/mesh-material-bindings.d.ts +54 -0
- package/dist/mesh-material-bindings.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +20 -7
- 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 +12 -20
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +40 -7
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/point-shadow-inspection.d.ts +21 -0
- package/dist/point-shadow-inspection.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +29 -32
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +65 -15
- 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 +12 -5
- 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 +37 -0
- package/dist/record/gpu-timing.d.ts.map +1 -0
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +23 -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/render-context.d.ts +48 -3
- 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 +81 -5
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +7 -4
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/reflection/filter.d.ts +22 -0
- package/dist/reflection/filter.d.ts.map +1 -0
- package/dist/reflection/gpu-table.d.ts +25 -0
- package/dist/reflection/gpu-table.d.ts.map +1 -0
- package/dist/reflection/projection.d.ts +91 -0
- package/dist/reflection/projection.d.ts.map +1 -0
- package/dist/render-contract.d.ts +114 -7
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-data.d.ts +10 -6
- package/dist/render-data.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 +78 -2
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +113 -20
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +24 -3
- package/dist/render-system.d.ts.map +1 -1
- package/dist/renderer-inspect.d.ts +29 -0
- package/dist/renderer-inspect.d.ts.map +1 -0
- package/dist/renderer.d.ts +43 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts +14 -0
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/shadow-atlas.d.ts +3 -3
- package/dist/shadow-atlas.d.ts.map +1 -1
- package/dist/ssao-buffers.d.ts +3 -0
- package/dist/ssao-buffers.d.ts.map +1 -1
- package/dist/targets/contracts.d.ts +66 -0
- package/dist/targets/contracts.d.ts.map +1 -0
- package/dist/targets/graph-projection.d.ts +29 -0
- package/dist/targets/graph-projection.d.ts.map +1 -0
- package/dist/targets/material-source.d.ts +34 -0
- package/dist/targets/material-source.d.ts.map +1 -0
- package/dist/targets/owner.d.ts +32 -0
- package/dist/targets/owner.d.ts.map +1 -0
- package/dist/targets/physical.d.ts +18 -0
- package/dist/targets/physical.d.ts.map +1 -0
- package/dist/targets/readback.d.ts +39 -0
- package/dist/targets/readback.d.ts.map +1 -0
- package/dist/temporal/frame.d.ts +44 -0
- package/dist/temporal/frame.d.ts.map +1 -0
- package/dist/temporal/index.mjs +3 -3
- package/dist/typed-render-graph-primitives.d.ts +6 -1
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-atlas.d.ts +10 -0
- package/dist/typed-shadow-atlas.d.ts.map +1 -0
- package/dist/typed-shadow-passes.d.ts +1 -1
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/capability.d.ts +57 -0
- package/dist/volume/capability.d.ts.map +1 -0
- package/dist/volume/component.d.ts +61 -0
- package/dist/volume/component.d.ts.map +1 -0
- package/dist/volume/extract.d.ts +11 -0
- package/dist/volume/extract.d.ts.map +1 -0
- package/dist/volume/inspection.d.ts +38 -0
- package/dist/volume/inspection.d.ts.map +1 -0
- package/dist/volume/passes.d.ts +38 -0
- package/dist/volume/passes.d.ts.map +1 -0
- package/dist/volume/recovery.d.ts +38 -0
- package/dist/volume/recovery.d.ts.map +1 -0
- package/dist/volume/resources.d.ts +57 -0
- package/dist/volume/resources.d.ts.map +1 -0
- package/dist/volume/temporal.d.ts +35 -0
- package/dist/volume/temporal.d.ts.map +1 -0
- package/package.json +20 -20
- package/src/__tests__/bloom-exact-zero.unit.test.ts +48 -19
- package/src/__tests__/bloom-lifecycle.integration.test.ts +41 -13
- package/src/__tests__/camera-target-consumption.unit.test.ts +53 -0
- package/src/__tests__/cluster-binner.unit.test.ts +35 -0
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -2
- package/src/__tests__/cube-camera-scheduler.unit.test.ts +70 -0
- package/src/__tests__/cube-camera-single-submit.perf.test.ts +75 -0
- package/src/__tests__/cube-camera-view-matrices.unit.test.ts +41 -0
- package/src/__tests__/cube-camera-vocabulary.unit.test.ts +47 -0
- package/src/__tests__/cube-camera.integration.test.ts +42 -0
- package/src/__tests__/device-feature-admission.unit.test.ts +73 -0
- package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -3
- package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
- package/src/__tests__/factory-contract.integration.test.ts +255 -29
- package/src/__tests__/fog-component.unit.test.ts +67 -0
- package/src/__tests__/fog.integration.test.ts +86 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -9
- package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +17 -1
- package/src/__tests__/gpu-driven-production.integration.test.ts +16 -17
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +12 -4
- package/src/__tests__/gpu-pass-timing-browser-runner.ts +281 -0
- package/src/__tests__/gpu-pass-timing-coexistence.integration.test.ts +80 -0
- package/src/__tests__/gpu-pass-timing-contract.unit.test.ts +243 -0
- package/src/__tests__/gpu-pass-timing-exact-zero.unit.test.ts +131 -0
- package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +230 -0
- package/src/__tests__/gpu-pass-timing-observation.unit.test.ts +233 -0
- package/src/__tests__/gpu-pass-timing-session.unit.test.ts +438 -0
- package/src/__tests__/gpu-pass-timing.browser.test.ts +26 -0
- package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +125 -0
- package/src/__tests__/hdrp-group2-visibility.unit.test.ts +24 -0
- package/src/__tests__/instances-culling.integration.test.ts +94 -0
- package/src/__tests__/instances-derived-bounds.unit.test.ts +118 -0
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
- package/src/__tests__/material-observation.integration.test.ts +101 -0
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
- package/src/__tests__/pbr-view-layout.unit.test.ts +16 -0
- package/src/__tests__/point-shadow-inspection.unit.test.ts +60 -0
- package/src/__tests__/public-surface.test-d.ts +10 -0
- package/src/__tests__/reflection-probe-authoring.unit.test.ts +71 -0
- package/src/__tests__/reflection-probe-filter.unit.test.ts +54 -0
- package/src/__tests__/reflection-probe-ibl-topology.unit.test.ts +45 -0
- package/src/__tests__/reflection-probe-pass-encode.integration.test.ts +101 -0
- package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -0
- package/src/__tests__/reflection-probe-recovery.integration.test.ts +55 -0
- package/src/__tests__/reflection-probe-selection.unit.test.ts +46 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +23 -3
- package/src/__tests__/render-feature-docs.unit.test.ts +1 -1
- package/src/__tests__/render-target-admission.unit.test.ts +80 -0
- package/src/__tests__/render-target-graph-projection.unit.test.ts +102 -0
- package/src/__tests__/render-target-inspection.unit.test.ts +52 -0
- package/src/__tests__/render-target-material-source.test-d.ts +30 -0
- package/src/__tests__/render-target-material-source.unit.test.ts +97 -0
- package/src/__tests__/render-target-owner-placement.unit.test.ts +203 -0
- package/src/__tests__/render-target-owner.unit.test.ts +122 -0
- package/src/__tests__/render-target-probe-soak.perf.test.ts +94 -0
- package/src/__tests__/render-target-public-schema.json +107 -0
- package/src/__tests__/render-target-public-schema.unit.test.ts +91 -0
- package/src/__tests__/render-target-public-surface.test-d.ts +83 -0
- package/src/__tests__/render-target-readback.integration.test.ts +90 -0
- package/src/__tests__/render-target-recovery.integration.test.ts +85 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +76 -0
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +1 -1
- package/src/__tests__/renderer-lifecycle.integration.test.ts +14 -0
- package/src/__tests__/shader-stage-surface.unit.test.ts +19 -4
- package/src/__tests__/skin-motion-regression.unit.test.ts +132 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +32 -2
- package/src/__tests__/standard-cluster-capability.integration.test.ts +63 -0
- package/src/__tests__/standard-cluster-transport.unit.test.ts +121 -0
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +232 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +8 -5
- package/src/__tests__/standard-lighting-inspection.integration.test.ts +138 -0
- package/src/__tests__/standard-lighting-ssot.unit.test.ts +18 -0
- package/src/__tests__/standard-lighting-write.unit.test.ts +377 -0
- package/src/__tests__/standard-lighting.integration.test.ts +67 -0
- package/src/__tests__/standard-pipeline.dawn.test.ts +206 -5
- package/src/__tests__/standard-pipeline.integration.test.ts +181 -150
- package/src/__tests__/standard-probe-binding.unit.test.ts +25 -0
- package/src/__tests__/standard-profile-oracle.unit.test.ts +23 -36
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +395 -14
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
- package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
- package/src/__tests__/volume-optics-oracle.unit.test.ts +85 -0
- package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
- package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
- package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
- package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
- package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
- package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
- package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
- package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
- package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
- package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
- package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
- package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
- package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
- package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
- package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
- package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
- package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
- package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
- package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
- package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
- package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
- package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
- package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
- package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
- package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
- package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
- package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
- package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
- package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
- package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
- package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
- package/src/assembly/device-feature-admission.ts +73 -0
- package/src/assembly/directional-shadow-inspection.ts +122 -0
- package/src/assembly/factory.ts +1093 -246
- package/src/assembly/host-contract.ts +25 -0
- package/src/assembly/render-target-host.ts +847 -0
- package/src/assets/asset-decoders.ts +1 -1
- package/src/assets/render-asset-port.ts +7 -1
- package/src/capture/cube-views.ts +69 -0
- package/src/capture/scheduler.ts +265 -0
- package/src/components/__tests__/schema-contract.unit.test.ts +12 -0
- package/src/components/__tests__/schema-parity.unit.test.ts +9 -0
- package/src/components/camera.ts +4 -0
- package/src/components/cube-camera.ts +52 -0
- package/src/components/directional-light.ts +22 -2
- package/src/components/directional-shadow-filter.ts +57 -0
- package/src/components/index.ts +2 -0
- package/src/components/light-helpers.ts +85 -7
- package/src/components/reflection-probe.ts +49 -0
- package/src/components/spot-light.ts +22 -3
- package/src/device/gpu-residency.ts +168 -58
- package/src/environment/frame.ts +6 -24
- package/src/environment/lifecycle.ts +12 -0
- package/src/errors/render.ts +405 -143
- package/src/extract/directional-shadow-projection.ts +61 -0
- package/src/extract/environment.ts +57 -0
- package/src/extract/visibility.ts +25 -1
- package/src/features/fullscreen.ts +3 -0
- package/src/features/targets.ts +4 -1
- package/src/features/types.ts +10 -0
- package/src/fullscreen-post-process-pass.ts +43 -2
- package/src/gpu-driven/batch-topology.ts +1 -0
- package/src/gpu-driven/production-raster.ts +1 -3
- package/src/gpu-scene.ts +8 -1
- package/src/gpu-usage.ts +2 -0
- package/src/hdrp-buffers.ts +165 -59
- package/src/ibl/IblPipelineCache.ts +11 -0
- package/src/ibl/kernel-cache.ts +88 -0
- package/src/index.ts +186 -1
- package/src/inspection-types.ts +56 -0
- package/src/instances-derived-bounds.ts +171 -0
- package/src/light-buffer-layout.ts +74 -26
- package/src/mesh-material-bindings.ts +132 -0
- package/src/pbr-pipeline.ts +139 -27
- package/src/pipeline/standard-forward-lane.ts +65 -15
- package/src/pipeline/standard-lighting/errors.ts +6 -0
- package/src/pipeline/standard-lighting/graph.ts +157 -0
- package/src/pipeline/standard-lighting/inspection.ts +88 -0
- package/src/pipeline/standard-lighting/layout.ts +31 -0
- package/src/pipeline/standard-lighting/light-frame.ts +34 -0
- package/src/pipeline/standard-lighting/membership.ts +43 -0
- package/src/pipeline/standard-lighting/prepare.ts +37 -0
- package/src/pipeline/standard-lighting/topology.ts +120 -0
- package/src/pipeline/standard-lighting/transport.ts +77 -0
- package/src/pipeline/standard-pipeline.ts +141 -192
- package/src/pipeline/standard-post.ts +26 -7
- package/src/pipeline/standard-profile.ts +23 -30
- package/src/pipeline-spec.ts +84 -21
- package/src/point-shadow-inspection.ts +55 -0
- package/src/record/__tests__/temporal-payload.unit.test.ts +42 -1
- package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
- package/src/record/frame-lighting.ts +470 -516
- package/src/record/frame-snapshot.ts +76 -28
- package/src/record/frame-targets.ts +23 -2
- package/src/record/frame.ts +1169 -79
- 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 +233 -0
- package/src/record/main-pass-geometry.ts +120 -80
- package/src/record/main-pass-material.ts +101 -11
- package/src/record/main-pass-sprite-draws.ts +54 -25
- package/src/record/main-pass.ts +71 -15
- package/src/record/render-context.ts +77 -0
- package/src/record/shadow-pass.ts +104 -66
- package/src/record/skybox-post-pass.ts +20 -4
- package/src/record/typed-frame-graph.ts +1016 -32
- package/src/record/view-ubo.ts +63 -28
- package/src/reflection/filter.ts +81 -0
- package/src/reflection/gpu-table.ts +44 -0
- package/src/reflection/projection.ts +281 -0
- package/src/render-contract.ts +147 -4
- package/src/render-data.ts +50 -22
- package/src/render-graph-primitives.ts +9 -4
- package/src/render-pipeline.ts +161 -2
- package/src/render-system-extract.ts +886 -103
- package/src/render-system.ts +1174 -66
- package/src/renderer-inspect.ts +66 -0
- package/src/renderer.ts +222 -0
- package/src/scene/render-scene.ts +117 -9
- package/src/shadow-atlas.ts +5 -5
- package/src/ssao-buffers.ts +9 -2
- package/src/targets/contracts.ts +182 -0
- package/src/targets/graph-projection.ts +169 -0
- package/src/targets/material-source.ts +143 -0
- package/src/targets/owner.ts +214 -0
- package/src/targets/physical.ts +18 -0
- package/src/targets/readback.ts +153 -0
- package/src/temporal/frame.ts +128 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +61 -23
- package/src/typed-render-graph-primitives.ts +34 -2
- package/src/typed-shadow-atlas.ts +17 -0
- package/src/typed-shadow-passes.ts +47 -40
- package/src/volume/capability.ts +173 -0
- package/src/volume/component.ts +110 -0
- package/src/volume/extract.ts +21 -0
- package/src/volume/inspection.ts +78 -0
- package/src/volume/passes.ts +686 -0
- package/src/volume/recovery.ts +86 -0
- package/src/volume/resources.ts +236 -0
- package/src/volume/temporal.ts +89 -0
- package/dist/chunk-IPXCABEP.mjs.map +0 -1
- package/dist/chunk-LOSO4CTV.mjs.map +0 -1
- package/dist/chunk-RJRUS55L.mjs.map +0 -1
- package/dist/chunk-YTQ5C7YQ.mjs +0 -584
- package/dist/chunk-YTQ5C7YQ.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -30,6 +30,62 @@ The current-source manifest and schema identify `source`, `build`, `backend`,
|
|
|
30
30
|
readback or PNG evidence, and historical oracle data are separate evidence
|
|
31
31
|
classes. An unavailable backend is reported as unavailable.
|
|
32
32
|
|
|
33
|
+
### Directional shadow quality: author → inspect → recover
|
|
34
|
+
|
|
35
|
+
`DirectionalLight` is the only authoring entry for directional shadow quality.
|
|
36
|
+
Set `shadowFilter` with the numeric constant for one of the five closed labels
|
|
37
|
+
below; it is an ECS enum field, not a label string. Do not invent a numeric
|
|
38
|
+
label or a compatibility alias. The default is `pcf3`. The two PCSS fields
|
|
39
|
+
are read only when `shadowFilter` is `pcssMedium` or `pcssHigh`:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { DirectionalLight, DirectionalShadowFilterValue } from '@forgeax/engine-render';
|
|
43
|
+
|
|
44
|
+
world.spawn({ component: DirectionalLight, data: {
|
|
45
|
+
direction: [0.2, -0.98, 0],
|
|
46
|
+
shadowFilter: DirectionalShadowFilterValue.pcssHigh,
|
|
47
|
+
shadowAngularRadius: 0.00465,
|
|
48
|
+
maxPenumbraTexels: 32,
|
|
49
|
+
} });
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
| Author field | Valid values / units | Default | Effective meaning |
|
|
53
|
+
|:--|:--|:--|:--|
|
|
54
|
+
| `shadowFilter` | `pcf1`, `pcf3`, `pcf5`, `pcssMedium`, `pcssHigh` | `pcf3` | Requested directional filter profile |
|
|
55
|
+
| `shadowAngularRadius` | Radians, finite range `[0.0001, 0.05]` | `0.00465` | PCSS light angular radius |
|
|
56
|
+
| `maxPenumbraTexels` | Texels, finite integer range `[1, 64]` | `32` | PCSS penumbra ceiling |
|
|
57
|
+
|
|
58
|
+
The remaining CSM fields keep these public units and defaults: `cascadeCount`
|
|
59
|
+
is an integer in `[1, 4]` (default `4`), `splitLambda` is `[0, 1]` (default
|
|
60
|
+
`0.75`), `cascadeBlend` is `[0, 0.5]` (default `0.2`), `mapSize` is a positive
|
|
61
|
+
map resolution (default `2048`), `depthBias` is a depth value (default
|
|
62
|
+
`0.005`), `normalBias` is a world-space offset (default `0.05`), and
|
|
63
|
+
`shadowDistance` is a positive world-unit distance in meters (default `200`).
|
|
64
|
+
|
|
65
|
+
After `draw`, read the single `renderer.inspect().directionalShadow` projection.
|
|
66
|
+
It is JSON-safe and bounded: `requested` is author intent, `effective` is the
|
|
67
|
+
admitted profile, `status` is `accepted | fallback | rejected`, and
|
|
68
|
+
`fallbackReason` explains `webgl2-unsupported`, `rhi-null-structural`, or
|
|
69
|
+
`candidate-failed`. `lastKnownGood` identifies retained output and
|
|
70
|
+
`pixelEvidence` distinguishes real pixel evidence from `not-available`.
|
|
71
|
+
`cascadeCount`, `mapSize`, `atlasBytes`, `writerPasses`, `blockerTaps`,
|
|
72
|
+
`filterTapUpperBound`, `seamTapUpperBound`, `deviceGeneration`, and
|
|
73
|
+
`graphGeneration` are inspection facts, not additional author controls.
|
|
74
|
+
|
|
75
|
+
If author validation returns `error.code === 'shadow-invalid-config'`, do not
|
|
76
|
+
parse `error.message`. Read `error.expected`, `error.hint`,
|
|
77
|
+
`error.detail.field`, `error.detail.actual`, `error.detail.bound`, and
|
|
78
|
+
`error.detail.reason`; repair the named `DirectionalLight` field and retry the
|
|
79
|
+
same request. For a rejected candidate, retain `lastKnownGood` from inspection,
|
|
80
|
+
repair or rebuild the named producer, then call the existing `renderer.recover()`
|
|
81
|
+
boundary and retry. WebGL2 reports its explicit PCF lane; RhiNull reports
|
|
82
|
+
`rhi-null-structural` only, so neither is PCSS pixel evidence.
|
|
83
|
+
Missing or `not-run` Browser/Dawn/PNG/timing evidence remains missing or
|
|
84
|
+
`not-run`, never a pass. The authoritative labels and validation remain in
|
|
85
|
+
[`directional-light.ts`](src/components/directional-light.ts) and
|
|
86
|
+
[`light-helpers.ts`](src/components/light-helpers.ts); this section is an AI
|
|
87
|
+
index path, not a second schema.
|
|
88
|
+
|
|
33
89
|
```ts
|
|
34
90
|
import {
|
|
35
91
|
ANTIALIAS_TAA,
|
|
@@ -55,6 +111,102 @@ environment owners or multiple fog owners return structured errors with a
|
|
|
55
111
|
code-specific `detail`; they do not create a second registry or silently pick
|
|
56
112
|
the first entity. Frame facts contain IDs, revisions, and POD values only, not
|
|
57
113
|
textures, buffers, devices, or other live GPU objects.
|
|
114
|
+
## GPU pass timing: opt in, draw, observe, branch on status
|
|
115
|
+
|
|
116
|
+
GPU pass timing is disabled by default. Opt in once on `createRenderer`, keep the
|
|
117
|
+
returned `FrameReceipt`, and request facts only for that receipt. The pass
|
|
118
|
+
duration is a bounded GPU fact; it is not frame latency.
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
import { createRenderer } from '@forgeax/engine-runtime';
|
|
122
|
+
|
|
123
|
+
const created = await createRenderer(canvas, { gpuPassTiming: {} });
|
|
124
|
+
if (!created.ok) throw created.error;
|
|
125
|
+
const renderer = created.value;
|
|
126
|
+
const attached = renderer.attach(world);
|
|
127
|
+
if (!attached.ok) throw attached.error;
|
|
128
|
+
const drawn = renderer.draw({
|
|
129
|
+
leases: [attached.value],
|
|
130
|
+
camera: { lease: attached.value },
|
|
131
|
+
environment: { lease: attached.value },
|
|
132
|
+
});
|
|
133
|
+
if (!drawn.ok) throw drawn.error;
|
|
134
|
+
|
|
135
|
+
const observed = await renderer.observe(drawn.value, { include: ['timings'] });
|
|
136
|
+
if (!observed.ok) throw observed.error;
|
|
137
|
+
const timings = observed.value.timings;
|
|
138
|
+
if (timings === undefined) throw new Error('timings were not requested');
|
|
139
|
+
switch (timings.status) {
|
|
140
|
+
case 'complete':
|
|
141
|
+
console.log(timings.frame.passes);
|
|
142
|
+
break;
|
|
143
|
+
case 'partial':
|
|
144
|
+
console.log(timings.reason.code, timings.frame.passes);
|
|
145
|
+
break;
|
|
146
|
+
case 'unavailable':
|
|
147
|
+
console.log(timings.reason.code, timings.capability);
|
|
148
|
+
break;
|
|
149
|
+
case 'failed':
|
|
150
|
+
console.log(timings.error.code, timings.latestKnownGood);
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
The [bounded fact contract](src/record/gpu-pass-timing/contract.ts),
|
|
156
|
+
[recovery errors](src/record/gpu-pass-timing/errors.ts), and
|
|
157
|
+
[validator](bench/gpu-pass-timing/validator.ts) are the source-linked
|
|
158
|
+
references for the four status branches and the fail-closed benchmark verdict.
|
|
159
|
+
A timing error exposes the closed `code` union plus `expected`, `hint`, and
|
|
160
|
+
`detail`; follow the producer-owned recovery action in the error before
|
|
161
|
+
observing a later receipt. `latestKnownGood` is a separate reference and never
|
|
162
|
+
changes the current status or completeness. Omitting `timings` from `include`
|
|
163
|
+
returns receipt metadata without materializing timing facts.
|
|
164
|
+
|
|
165
|
+
Run the paired real-GPU benchmark with the Dawn host:
|
|
166
|
+
|
|
167
|
+
```sh
|
|
168
|
+
FORGEAX_GPU_PASS_TIMING_HOST_MODULE="$PWD/packages/render/bench/gpu-pass-timing/dawn-host.ts" \
|
|
169
|
+
pnpm gpu-pass-timing:bench -- --output=/tmp/forgeax-gpu-pass-timing.json
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
The command exits `0` only for a complete accepted report and exits `2` for a
|
|
173
|
+
blocked report. When an observation is `partial`, branch on
|
|
174
|
+
`timings.reason.code === 'timestamp-write-unavailable'`, retain the
|
|
175
|
+
unmeasured pass and its structured `detail.cause`, then observe the next
|
|
176
|
+
receipt after the producer-owned recovery action. Do not turn that pass into a
|
|
177
|
+
zero-duration sample or accept the benchmark until all paired windows are
|
|
178
|
+
complete.
|
|
179
|
+
|
|
180
|
+
An accepted report retains `frameFacts`: one complete on-path frame fact per paired
|
|
181
|
+
group, including the frame identity, raw decimal ticks, each measured pass duration,
|
|
182
|
+
and `measuredPassNanoseconds`. If a real run is blocked by partial observations, the
|
|
183
|
+
blocked JSON keeps the observed representative facts under `evidence.frameFacts` so
|
|
184
|
+
the measured values remain inspectable without weakening the verdict. If complete
|
|
185
|
+
windows fail the paired overhead gate, `evidence.windows` retains the raw samples and
|
|
186
|
+
`evidence.pairedOverhead` retains each group p95, group overhead, and reported median.
|
|
187
|
+
|
|
188
|
+
Measured entries expose `measurementSource`: raster and compute entries use
|
|
189
|
+
`pass-boundary`; copy entries use `copy-boundary-envelope`, the interval between
|
|
190
|
+
timing-only marker passes, and must not be read as exact copy duration.
|
|
191
|
+
|
|
192
|
+
## Fog and point-shadow observations
|
|
193
|
+
|
|
194
|
+
`Fog` is a one-per-World environment input. Extract validates its parameters
|
|
195
|
+
before publication; an invalid update keeps the renderer's last-known-good
|
|
196
|
+
fog frame and exposes the structured failure through the existing inspection
|
|
197
|
+
path. There is no app-local fog state.
|
|
198
|
+
|
|
199
|
+
Point shadows use one renderer-owned cube-array `ShadowAtlas`. The public
|
|
200
|
+
`SHADOW_ATLAS_DEFAULT_FACE_SIZE` and `SHADOW_ATLAS_DEFAULT_LAYERS` constants
|
|
201
|
+
are the only capacity owner; extract assigns `shadowAtlasLayer: -1` to
|
|
202
|
+
requests beyond that capacity while retaining them for inspection. After a
|
|
203
|
+
successful frame, `renderer.inspect().pointShadow` reports `requested`,
|
|
204
|
+
`admitted`, `shadowed`, `shadowAtlasOccupancy`, and `shadowAtlasCapacity`.
|
|
205
|
+
The App `pointShadowPlugin()` consumes that renderer capability and provides
|
|
206
|
+
structured preflight failures for missing-storage-buffer, invalid, or
|
|
207
|
+
over-budget requests. A World with no `PointLightShadow` remains `inactive`;
|
|
208
|
+
there is no pseudo-disabled shadow mode. Directional CSM remains a separate
|
|
209
|
+
shadow owner; PointLightShadow is not a second directional-light path.
|
|
58
210
|
|
|
59
211
|
## Render happy path
|
|
60
212
|
|
|
@@ -84,6 +236,23 @@ PBR, IBL, SSAO, bloom, tone, antialiasing, sky, material, VFX, and debug feature
|
|
|
84
236
|
the same graph and submit boundary. CPU and WebGL2 fallback are capability lanes of that pipeline,
|
|
85
237
|
not second renderer identities.
|
|
86
238
|
|
|
239
|
+
## Target and probe lifecycle index
|
|
240
|
+
|
|
241
|
+
The public target route is one Renderer owner: create a typed `RenderTarget`, create a
|
|
242
|
+
`RenderTargetTextureSource` for the material slot, request a readback ticket, draw once, await
|
|
243
|
+
`FrameReceipt.completed`, then call `observe(receipt, ...)`. `CubeCamera` contributes six real
|
|
244
|
+
face views to the existing frame graph; a candidate becomes active only after its completed
|
|
245
|
+
receipt. `ReflectionProbe` adds bounded PMREM face/mip work, local box projection, and Skylight
|
|
246
|
+
irradiance fallback through the same Standard material binding path.
|
|
247
|
+
|
|
248
|
+
Use `inspect()` for bounded target/probe counts, pending work, and the last structured failure.
|
|
249
|
+
`inspection.reflectionProbes.selection` identifies the selected probe by `worldId` and `entityKey`,
|
|
250
|
+
or reports `{ kind: 'skylight' }` for the explicit fallback. `recover()` is meaningful only from `device-lost`; on a healthy renderer its structured
|
|
251
|
+
`renderer-state-invalid` result is a guard. Device recovery invalidates old generations and
|
|
252
|
+
rebuilds producer-owned physical resources, so old tickets and sources must not be reused.
|
|
253
|
+
The exact public names and stable consumer IDs are machine-readable in
|
|
254
|
+
`src/__tests__/render-target-public-schema.json`.
|
|
255
|
+
|
|
87
256
|
## Stable inspection and dark-gradient evidence
|
|
88
257
|
|
|
89
258
|
Progressive disclosure is intentional: read Camera configuration first, then
|
|
@@ -255,6 +424,31 @@ uses the neutral engine material.
|
|
|
255
424
|
|
|
256
425
|
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
426
|
|
|
427
|
+
### Resident material observation
|
|
428
|
+
|
|
429
|
+
`renderer.inspect().meshMaterialBindings[]` is the detached observation of the
|
|
430
|
+
binding that the renderer actually consumed. Its `residency` projection records
|
|
431
|
+
`ready`, `pending`, `failed`, or `last-known-good`, plus the resolved sampler
|
|
432
|
+
handles, texture handles, mip counts, and the nearest structured preparation
|
|
433
|
+
failure when one exists. The observation is recomputed from the asset/runtime
|
|
434
|
+
owner during preparation; render does not keep a second readiness ledger,
|
|
435
|
+
infer state from URLs, or repair a producer failure. Aggregate counts are
|
|
436
|
+
derived from the observations, so an AI can inspect first, repair or recook the
|
|
437
|
+
producer, and retry without guessing at hidden renderer state.
|
|
438
|
+
|
|
439
|
+
### Instances CPU bounds contract
|
|
440
|
+
|
|
441
|
+
`Instances` remains author data containing only packed local transforms. The
|
|
442
|
+
renderer derives a CPU union bound from each mesh AABB, entity world matrix,
|
|
443
|
+
and every instance matrix. The union cache is scoped by World/entity and
|
|
444
|
+
invalidated by mesh, entity-transform, instance-array, slot removal, and
|
|
445
|
+
generation changes. Missing, malformed, or empty instance data is a
|
|
446
|
+
conservative no-cull result; it never creates a synthetic identity instance.
|
|
447
|
+
The GPU path keeps the mesh-local AABB and performs per-instance visibility,
|
|
448
|
+
while the CPU path uses the derived union only to avoid dropping an entity
|
|
449
|
+
whose origin is outside the view. Do not add `bounds` to the public
|
|
450
|
+
`Instances` component or duplicate this renderer fact in Pack/asset state.
|
|
451
|
+
|
|
258
452
|
## Points and Lines authoring (M1)
|
|
259
453
|
|
|
260
454
|
Points and Lines are first-class render components. Their geometry remains a
|
|
@@ -336,6 +530,27 @@ if (!result.ok) {
|
|
|
336
530
|
}
|
|
337
531
|
```
|
|
338
532
|
|
|
533
|
+
## Standard lighting contract
|
|
534
|
+
|
|
535
|
+
`forgeax::standard` is the only built-in lighting identity. Every finite point
|
|
536
|
+
and spot light enters the shared Cluster membership path; `DirectionalLight`
|
|
537
|
+
remains global and does not consume local-light membership. `renderPath` only
|
|
538
|
+
selects Forward or Deferred graph topology. The derivation chain is
|
|
539
|
+
`LightFrame -> PreparedStandardLighting -> StandardClusterTransportPlan`, with
|
|
540
|
+
`packages/render/src/pipeline/standard-lighting/layout.ts` as the storage-size
|
|
541
|
+
and light-index budget SSOT.
|
|
542
|
+
|
|
543
|
+
Transport capability is explicit: compute/storage or CPU/storage. Cluster has
|
|
544
|
+
no uniform-backed downlevel ABI; when `storageBuffer` is absent, admission
|
|
545
|
+
returns the structured `standard-cluster-transport-unavailable` result with
|
|
546
|
+
`requested` and `admitted`. Never invent a four-light fallback. Read
|
|
547
|
+
`expected`, `hint`, and `detail` before repairing the device capability or the
|
|
548
|
+
producer input. Both lanes consume the same complete CPU canonical corpus;
|
|
549
|
+
the compute lane materializes the GPU index list, while the CPU lane uploads
|
|
550
|
+
that list. A Dawn readback that compares the GPU list with the canonical
|
|
551
|
+
corpus is the proof of GPU membership; until that readback runs, evidence is
|
|
552
|
+
`not-proven`, never a synthetic completion state.
|
|
553
|
+
|
|
339
554
|
M1 intentionally refuses strip expansion, joins, caps, dashes, picking, and
|
|
340
555
|
visible point/line draw preparation. Those are later implementation lanes, not
|
|
341
556
|
implicit fallbacks in authoring code.
|