@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
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import type { RenderError } from '../errors/render';
|
|
2
|
+
import { RenderTargetOperationFailedError, RenderTargetStateInvalidError } from '../errors/render';
|
|
3
|
+
import type { RenderResult } from '../render-contract';
|
|
4
|
+
import type { RenderTarget, RenderTargetDescriptor } from './contracts';
|
|
5
|
+
|
|
6
|
+
export type RenderTargetOwnerState =
|
|
7
|
+
| 'uninitialized'
|
|
8
|
+
| 'candidate'
|
|
9
|
+
| 'active'
|
|
10
|
+
| 'rebuilding'
|
|
11
|
+
| 'destroyed';
|
|
12
|
+
|
|
13
|
+
export interface RenderTargetPhysicalCandidate {
|
|
14
|
+
readonly generation: number;
|
|
15
|
+
readonly descriptor: RenderTargetDescriptor;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface RenderTargetOwnerInspection {
|
|
19
|
+
readonly token: RenderTarget;
|
|
20
|
+
readonly state: RenderTargetOwnerState;
|
|
21
|
+
readonly generation: number;
|
|
22
|
+
readonly descriptor: RenderTargetDescriptor;
|
|
23
|
+
readonly candidate?: RenderTargetPhysicalCandidate;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface RenderTargetOwnerOptions {
|
|
27
|
+
readonly rendererId: symbol;
|
|
28
|
+
readonly initialGeneration: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface RenderTargetOwner {
|
|
32
|
+
create(descriptor: RenderTargetDescriptor): RenderResult<RenderTarget, RenderError>;
|
|
33
|
+
stage(
|
|
34
|
+
target: RenderTarget,
|
|
35
|
+
descriptor?: RenderTargetDescriptor,
|
|
36
|
+
): RenderResult<RenderTargetPhysicalCandidate, RenderError>;
|
|
37
|
+
promote(target: RenderTarget, generation: number): RenderResult<void, RenderError>;
|
|
38
|
+
rejectCandidate(
|
|
39
|
+
target: RenderTarget,
|
|
40
|
+
generation: number,
|
|
41
|
+
stage: 'allocation' | 'compile' | 'write' | 'submit',
|
|
42
|
+
): RenderResult<void, RenderError>;
|
|
43
|
+
beginRecovery(target: RenderTarget, generation: number): RenderResult<void, RenderError>;
|
|
44
|
+
finishRecovery(target: RenderTarget): RenderResult<void, RenderError>;
|
|
45
|
+
retire(target: RenderTarget, generation: number): RenderResult<void, RenderError>;
|
|
46
|
+
destroy(target: RenderTarget): RenderResult<void, RenderError>;
|
|
47
|
+
inspect(target: RenderTarget): RenderResult<RenderTargetOwnerInspection, RenderError>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface TargetState {
|
|
51
|
+
readonly target: RenderTarget;
|
|
52
|
+
readonly rendererId: symbol;
|
|
53
|
+
state: RenderTargetOwnerState;
|
|
54
|
+
generation: number;
|
|
55
|
+
descriptor: RenderTargetDescriptor;
|
|
56
|
+
candidate: RenderTargetPhysicalCandidate | undefined;
|
|
57
|
+
retiredGenerations: Set<number>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function frozenDescriptor(descriptor: RenderTargetDescriptor): RenderTargetDescriptor {
|
|
61
|
+
return Object.freeze({ ...descriptor });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function invalid(
|
|
65
|
+
operation: 'inspect' | 'resize' | 'source' | 'readback' | 'destroy',
|
|
66
|
+
reason: 'foreign-renderer' | 'destroyed' | 'uninitialized' | 'generation-mismatch',
|
|
67
|
+
state: RenderTargetOwnerState,
|
|
68
|
+
generation: number,
|
|
69
|
+
): RenderResult<never, RenderError> {
|
|
70
|
+
return {
|
|
71
|
+
ok: false,
|
|
72
|
+
error: new RenderTargetStateInvalidError({ operation, reason, state, generation }),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function token(): RenderTarget {
|
|
77
|
+
return Object.freeze({}) as RenderTarget;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function createRenderTargetOwner(options: RenderTargetOwnerOptions): RenderTargetOwner {
|
|
81
|
+
const targets = new WeakMap<object, TargetState>();
|
|
82
|
+
const requireTarget = (
|
|
83
|
+
target: RenderTarget,
|
|
84
|
+
operation: 'inspect' | 'resize' | 'source' | 'readback' | 'destroy',
|
|
85
|
+
): RenderResult<TargetState, RenderError> => {
|
|
86
|
+
const state = targets.get(target as object);
|
|
87
|
+
if (state === undefined) return invalid(operation, 'foreign-renderer', 'destroyed', 0);
|
|
88
|
+
if (state.rendererId !== options.rendererId) {
|
|
89
|
+
return invalid(operation, 'foreign-renderer', state.state, state.generation);
|
|
90
|
+
}
|
|
91
|
+
if (state.state === 'destroyed') {
|
|
92
|
+
return invalid(operation, 'destroyed', state.state, state.generation);
|
|
93
|
+
}
|
|
94
|
+
return { ok: true, value: state };
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
create(descriptor) {
|
|
99
|
+
const target = token();
|
|
100
|
+
targets.set(target as object, {
|
|
101
|
+
target,
|
|
102
|
+
rendererId: options.rendererId,
|
|
103
|
+
state: 'uninitialized',
|
|
104
|
+
generation: 0,
|
|
105
|
+
descriptor: frozenDescriptor(descriptor),
|
|
106
|
+
candidate: undefined,
|
|
107
|
+
retiredGenerations: new Set(),
|
|
108
|
+
});
|
|
109
|
+
return { ok: true, value: target };
|
|
110
|
+
},
|
|
111
|
+
stage(target, descriptor) {
|
|
112
|
+
const found = requireTarget(target, 'resize');
|
|
113
|
+
if (!found.ok) return found;
|
|
114
|
+
const state = found.value;
|
|
115
|
+
if (state.state === 'rebuilding') {
|
|
116
|
+
return invalid('resize', 'generation-mismatch', state.state, state.generation);
|
|
117
|
+
}
|
|
118
|
+
const candidate = Object.freeze({
|
|
119
|
+
generation: state.state === 'uninitialized' ? options.initialGeneration : state.generation,
|
|
120
|
+
descriptor: frozenDescriptor(descriptor ?? state.descriptor),
|
|
121
|
+
});
|
|
122
|
+
state.candidate = candidate;
|
|
123
|
+
state.state = 'candidate';
|
|
124
|
+
return { ok: true, value: candidate };
|
|
125
|
+
},
|
|
126
|
+
promote(target, generation) {
|
|
127
|
+
const found = requireTarget(target, 'resize');
|
|
128
|
+
if (!found.ok) return found;
|
|
129
|
+
const state = found.value;
|
|
130
|
+
if (state.candidate?.generation !== generation) {
|
|
131
|
+
return invalid('resize', 'generation-mismatch', state.state, state.generation);
|
|
132
|
+
}
|
|
133
|
+
state.descriptor = state.candidate.descriptor;
|
|
134
|
+
state.generation = generation;
|
|
135
|
+
state.candidate = undefined;
|
|
136
|
+
state.state = 'active';
|
|
137
|
+
return { ok: true, value: undefined };
|
|
138
|
+
},
|
|
139
|
+
rejectCandidate(target, generation, stage) {
|
|
140
|
+
const found = requireTarget(target, 'resize');
|
|
141
|
+
if (!found.ok) return found;
|
|
142
|
+
const state = found.value;
|
|
143
|
+
if (state.candidate?.generation !== generation) {
|
|
144
|
+
return invalid('resize', 'generation-mismatch', state.state, state.generation);
|
|
145
|
+
}
|
|
146
|
+
state.candidate = undefined;
|
|
147
|
+
state.state = state.generation === 0 ? 'uninitialized' : 'active';
|
|
148
|
+
return {
|
|
149
|
+
ok: false,
|
|
150
|
+
error: new RenderTargetOperationFailedError({
|
|
151
|
+
operation: 'resize',
|
|
152
|
+
stage,
|
|
153
|
+
generation,
|
|
154
|
+
cause: new Error(`candidate ${generation} failed during ${stage}`),
|
|
155
|
+
recovery: state.generation === 0 ? 'retry' : 'retain-last-known-good',
|
|
156
|
+
}),
|
|
157
|
+
};
|
|
158
|
+
},
|
|
159
|
+
beginRecovery(target, generation) {
|
|
160
|
+
const found = requireTarget(target, 'resize');
|
|
161
|
+
if (!found.ok) return found;
|
|
162
|
+
const state = found.value;
|
|
163
|
+
if (state.state !== 'active' || generation <= state.generation) {
|
|
164
|
+
return invalid('resize', 'generation-mismatch', state.state, state.generation);
|
|
165
|
+
}
|
|
166
|
+
state.generation = generation;
|
|
167
|
+
state.candidate = undefined;
|
|
168
|
+
state.state = 'rebuilding';
|
|
169
|
+
return { ok: true, value: undefined };
|
|
170
|
+
},
|
|
171
|
+
finishRecovery(target) {
|
|
172
|
+
const found = requireTarget(target, 'resize');
|
|
173
|
+
if (!found.ok) return found;
|
|
174
|
+
const state = found.value;
|
|
175
|
+
if (state.state !== 'rebuilding') {
|
|
176
|
+
return invalid('resize', 'generation-mismatch', state.state, state.generation);
|
|
177
|
+
}
|
|
178
|
+
state.state = 'uninitialized';
|
|
179
|
+
return { ok: true, value: undefined };
|
|
180
|
+
},
|
|
181
|
+
retire(target, generation) {
|
|
182
|
+
const found = requireTarget(target, 'destroy');
|
|
183
|
+
if (!found.ok) return found;
|
|
184
|
+
found.value.retiredGenerations.add(generation);
|
|
185
|
+
return { ok: true, value: undefined };
|
|
186
|
+
},
|
|
187
|
+
destroy(target) {
|
|
188
|
+
const state = targets.get(target as object);
|
|
189
|
+
if (state === undefined) return invalid('destroy', 'foreign-renderer', 'destroyed', 0);
|
|
190
|
+
if (state.rendererId !== options.rendererId) {
|
|
191
|
+
return invalid('destroy', 'foreign-renderer', state.state, state.generation);
|
|
192
|
+
}
|
|
193
|
+
if (state.state === 'destroyed') return { ok: true, value: undefined };
|
|
194
|
+
state.candidate = undefined;
|
|
195
|
+
state.state = 'destroyed';
|
|
196
|
+
return { ok: true, value: undefined };
|
|
197
|
+
},
|
|
198
|
+
inspect(target) {
|
|
199
|
+
const found = requireTarget(target, 'inspect');
|
|
200
|
+
if (!found.ok) return found;
|
|
201
|
+
const state = found.value;
|
|
202
|
+
return {
|
|
203
|
+
ok: true,
|
|
204
|
+
value: Object.freeze({
|
|
205
|
+
token: state.target,
|
|
206
|
+
state: state.state,
|
|
207
|
+
generation: state.generation,
|
|
208
|
+
descriptor: state.descriptor,
|
|
209
|
+
...(state.candidate === undefined ? {} : { candidate: state.candidate }),
|
|
210
|
+
}),
|
|
211
|
+
};
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Texture, TextureView } from '@forgeax/engine-rhi';
|
|
2
|
+
import type { RenderTargetDescriptor } from './contracts';
|
|
3
|
+
|
|
4
|
+
/** Renderer-private physical storage for one logical target generation. */
|
|
5
|
+
export interface RenderTargetPhysical {
|
|
6
|
+
readonly generation: number;
|
|
7
|
+
readonly descriptor: RenderTargetDescriptor;
|
|
8
|
+
readonly texture: Texture;
|
|
9
|
+
readonly view: TextureView;
|
|
10
|
+
readonly mipViews: readonly TextureView[];
|
|
11
|
+
readonly colorTextures: readonly Texture[];
|
|
12
|
+
readonly faceViews: readonly TextureView[];
|
|
13
|
+
readonly depthTextures: readonly Texture[];
|
|
14
|
+
readonly depthViews: readonly TextureView[];
|
|
15
|
+
readonly resolveTexture?: Texture;
|
|
16
|
+
readonly resolveView: TextureView;
|
|
17
|
+
readonly resolveFaceViews: readonly TextureView[];
|
|
18
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { RenderError } from '../errors/render';
|
|
2
|
+
import { RenderTargetOperationFailedError, RenderTargetStateInvalidError } from '../errors/render';
|
|
3
|
+
import type { RenderResult } from '../render-contract';
|
|
4
|
+
import type { RenderTarget } from './contracts';
|
|
5
|
+
|
|
6
|
+
export interface RenderTargetReadbackReceipt {
|
|
7
|
+
readonly frameId: number;
|
|
8
|
+
readonly deviceGeneration: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface RenderTargetReadbackTicketInput {
|
|
12
|
+
readonly frameId?: number;
|
|
13
|
+
deviceGeneration: number;
|
|
14
|
+
readonly mipLevel: number;
|
|
15
|
+
readonly face?: number;
|
|
16
|
+
readonly width: number;
|
|
17
|
+
readonly height: number;
|
|
18
|
+
readonly bytesPerPixel: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface RenderTargetReadbackTicket {
|
|
22
|
+
readonly target: RenderTarget;
|
|
23
|
+
frameId: number | undefined;
|
|
24
|
+
deviceGeneration: number;
|
|
25
|
+
readonly mipLevel: number;
|
|
26
|
+
readonly face?: number;
|
|
27
|
+
readonly width: number;
|
|
28
|
+
readonly height: number;
|
|
29
|
+
readonly bytesPerRow: number;
|
|
30
|
+
readonly byteLength: number;
|
|
31
|
+
consumed: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface RenderTargetReadbackResult {
|
|
35
|
+
readonly bytes: Uint8Array;
|
|
36
|
+
readonly frameId: number;
|
|
37
|
+
readonly deviceGeneration: number;
|
|
38
|
+
readonly mipLevel: number;
|
|
39
|
+
readonly face?: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function invalidTicket(
|
|
43
|
+
ticket: RenderTargetReadbackTicket,
|
|
44
|
+
reason: 'uninitialized' | 'generation-mismatch' | 'destroyed',
|
|
45
|
+
): RenderResult<never, RenderError> {
|
|
46
|
+
return {
|
|
47
|
+
ok: false,
|
|
48
|
+
error: new RenderTargetStateInvalidError({
|
|
49
|
+
operation: 'readback',
|
|
50
|
+
reason,
|
|
51
|
+
state: reason === 'destroyed' ? 'destroyed' : 'active',
|
|
52
|
+
generation: ticket.deviceGeneration,
|
|
53
|
+
}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function bindRenderTargetReadbackTicket(
|
|
58
|
+
ticket: RenderTargetReadbackTicket,
|
|
59
|
+
receipt: RenderTargetReadbackReceipt,
|
|
60
|
+
): RenderResult<void, RenderError> {
|
|
61
|
+
if (ticket.consumed) return invalidTicket(ticket, 'destroyed');
|
|
62
|
+
if (ticket.frameId !== undefined) {
|
|
63
|
+
return invalidTicket(ticket, 'generation-mismatch');
|
|
64
|
+
}
|
|
65
|
+
ticket.frameId = receipt.frameId;
|
|
66
|
+
ticket.deviceGeneration = receipt.deviceGeneration;
|
|
67
|
+
return { ok: true, value: undefined };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function createRenderTargetReadbackTicket(
|
|
71
|
+
target: RenderTarget,
|
|
72
|
+
input: RenderTargetReadbackTicketInput,
|
|
73
|
+
): RenderResult<RenderTargetReadbackTicket, RenderError> {
|
|
74
|
+
if (
|
|
75
|
+
(input.frameId !== undefined && (!Number.isInteger(input.frameId) || input.frameId < 0)) ||
|
|
76
|
+
!Number.isInteger(input.deviceGeneration) ||
|
|
77
|
+
input.deviceGeneration < 0 ||
|
|
78
|
+
!Number.isInteger(input.mipLevel) ||
|
|
79
|
+
input.mipLevel < 0 ||
|
|
80
|
+
!Number.isInteger(input.width) ||
|
|
81
|
+
input.width < 1 ||
|
|
82
|
+
!Number.isInteger(input.height) ||
|
|
83
|
+
input.height < 1 ||
|
|
84
|
+
!Number.isInteger(input.bytesPerPixel) ||
|
|
85
|
+
input.bytesPerPixel < 1
|
|
86
|
+
) {
|
|
87
|
+
return {
|
|
88
|
+
ok: false,
|
|
89
|
+
error: new RenderTargetOperationFailedError({
|
|
90
|
+
operation: 'readback',
|
|
91
|
+
stage: 'copy',
|
|
92
|
+
generation: input.deviceGeneration,
|
|
93
|
+
cause: new Error('readback dimensions and identity must be non-negative integers'),
|
|
94
|
+
recovery: 'retry',
|
|
95
|
+
}),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const unalignedRowBytes = input.width * input.bytesPerPixel;
|
|
99
|
+
const bytesPerRow = Math.ceil(unalignedRowBytes / 256) * 256;
|
|
100
|
+
return {
|
|
101
|
+
ok: true,
|
|
102
|
+
value: {
|
|
103
|
+
target,
|
|
104
|
+
frameId: input.frameId,
|
|
105
|
+
deviceGeneration: input.deviceGeneration,
|
|
106
|
+
mipLevel: input.mipLevel,
|
|
107
|
+
...(input.face === undefined ? {} : { face: input.face }),
|
|
108
|
+
width: input.width,
|
|
109
|
+
height: input.height,
|
|
110
|
+
bytesPerRow,
|
|
111
|
+
byteLength: bytesPerRow * input.height,
|
|
112
|
+
consumed: false,
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function completeRenderTargetReadback(
|
|
118
|
+
ticket: RenderTargetReadbackTicket,
|
|
119
|
+
receipt: RenderTargetReadbackReceipt,
|
|
120
|
+
bytes: Uint8Array,
|
|
121
|
+
): RenderResult<RenderTargetReadbackResult, RenderError> {
|
|
122
|
+
if (ticket.consumed) return invalidTicket(ticket, 'destroyed');
|
|
123
|
+
if (
|
|
124
|
+
ticket.frameId === undefined ||
|
|
125
|
+
receipt.frameId !== ticket.frameId ||
|
|
126
|
+
receipt.deviceGeneration !== ticket.deviceGeneration
|
|
127
|
+
) {
|
|
128
|
+
return invalidTicket(ticket, 'generation-mismatch');
|
|
129
|
+
}
|
|
130
|
+
if (bytes.byteLength !== ticket.byteLength) {
|
|
131
|
+
return {
|
|
132
|
+
ok: false,
|
|
133
|
+
error: new RenderTargetOperationFailedError({
|
|
134
|
+
operation: 'readback',
|
|
135
|
+
stage: 'copy',
|
|
136
|
+
generation: ticket.deviceGeneration,
|
|
137
|
+
cause: new Error(`expected ${ticket.byteLength} bytes, received ${bytes.byteLength}`),
|
|
138
|
+
recovery: 'retry',
|
|
139
|
+
}),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
ticket.consumed = true;
|
|
143
|
+
return {
|
|
144
|
+
ok: true,
|
|
145
|
+
value: {
|
|
146
|
+
bytes,
|
|
147
|
+
frameId: ticket.frameId,
|
|
148
|
+
deviceGeneration: ticket.deviceGeneration,
|
|
149
|
+
mipLevel: ticket.mipLevel,
|
|
150
|
+
...(ticket.face === undefined ? {} : { face: ticket.face }),
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
@@ -70,6 +70,32 @@ export interface TemporalFrameReceipt<T = unknown> {
|
|
|
70
70
|
readonly historyDirection: 'a-to-b' | 'b-to-a';
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
export type ReflectionFallbackTemporalReset =
|
|
74
|
+
| { readonly reset: false }
|
|
75
|
+
| { readonly reset: true; readonly reason: 'reflection-fallback-generation' };
|
|
76
|
+
|
|
77
|
+
/** Maps committed producer generations into the existing temporal reset seam. */
|
|
78
|
+
export function resolveReflectionFallbackTemporalReset(
|
|
79
|
+
previousGeneration: number | undefined,
|
|
80
|
+
nextGeneration: number | undefined,
|
|
81
|
+
): ReflectionFallbackTemporalReset {
|
|
82
|
+
if (previousGeneration === undefined || nextGeneration === undefined) return { reset: false };
|
|
83
|
+
return previousGeneration === nextGeneration
|
|
84
|
+
? { reset: false }
|
|
85
|
+
: { reset: true, reason: 'reflection-fallback-generation' };
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Keeps SSR admission on the existing producer-generation reset seam. The
|
|
90
|
+
* admission path never allocates or resolves temporal history itself.
|
|
91
|
+
*/
|
|
92
|
+
export function resolveSsrAdmissionTemporalReset(
|
|
93
|
+
previousGeneration: number | undefined,
|
|
94
|
+
nextGeneration: number | undefined,
|
|
95
|
+
): ReflectionFallbackTemporalReset {
|
|
96
|
+
return resolveReflectionFallbackTemporalReset(previousGeneration, nextGeneration);
|
|
97
|
+
}
|
|
98
|
+
|
|
73
99
|
function failure(code: TemporalFrameErrorCode, hint: string): TemporalFrameError {
|
|
74
100
|
return {
|
|
75
101
|
code,
|
package/src/temporal/frame.ts
CHANGED
|
@@ -44,6 +44,8 @@ export interface TemporalFrameTransaction {
|
|
|
44
44
|
stage(input: TemporalFrameInput): void;
|
|
45
45
|
commit(submit: TemporalSubmitResult): Result<TemporalFrame, TemporalFrameSubmitError>;
|
|
46
46
|
snapshot(): TemporalFrame;
|
|
47
|
+
/** Drop accepted/staged history after a producer or device generation cut. */
|
|
48
|
+
reset(reason?: Extract<TemporalResetReason, 'signature-change' | 'device-recovery'>): void;
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
function copyInput(input: TemporalFrameInput): TemporalFrameInput {
|
|
@@ -82,6 +84,7 @@ export function createTemporalFrameTransaction(options: {
|
|
|
82
84
|
let accepted: TemporalFrame | undefined;
|
|
83
85
|
let staged: TemporalFrameInput | undefined;
|
|
84
86
|
let historyEpoch = 0;
|
|
87
|
+
let pendingResetReason: Exclude<TemporalResetReason, 'none' | 'queue-submit-failed'> | undefined;
|
|
85
88
|
|
|
86
89
|
return {
|
|
87
90
|
stage(input) {
|
|
@@ -96,7 +99,7 @@ export function createTemporalFrameTransaction(options: {
|
|
|
96
99
|
return err(new TemporalFrameSubmitError('queue-submit-failed'));
|
|
97
100
|
}
|
|
98
101
|
|
|
99
|
-
const resetReason = submit.resetReason ?? staged.resetReason ?? 'none';
|
|
102
|
+
const resetReason = submit.resetReason ?? staged.resetReason ?? pendingResetReason ?? 'none';
|
|
100
103
|
const shouldReset = resetReason !== 'none';
|
|
101
104
|
if (shouldReset) historyEpoch += 1;
|
|
102
105
|
const next: TemporalFrame = {
|
|
@@ -117,6 +120,7 @@ export function createTemporalFrameTransaction(options: {
|
|
|
117
120
|
};
|
|
118
121
|
accepted = next;
|
|
119
122
|
staged = undefined;
|
|
123
|
+
pendingResetReason = undefined;
|
|
120
124
|
return ok(copyFrame(next));
|
|
121
125
|
},
|
|
122
126
|
snapshot() {
|
|
@@ -124,5 +128,14 @@ export function createTemporalFrameTransaction(options: {
|
|
|
124
128
|
throw new Error('TemporalFrame snapshot is unavailable before commit');
|
|
125
129
|
return copyFrame(accepted);
|
|
126
130
|
},
|
|
131
|
+
reset(reason = 'signature-change') {
|
|
132
|
+
accepted = undefined;
|
|
133
|
+
staged = undefined;
|
|
134
|
+
historyEpoch += 1;
|
|
135
|
+
// The reason is carried into the next accepted frame while clearing the
|
|
136
|
+
// committed frame prevents stale motion vectors from crossing the
|
|
137
|
+
// producer/device boundary.
|
|
138
|
+
pendingResetReason = reason;
|
|
139
|
+
},
|
|
127
140
|
};
|
|
128
141
|
}
|
package/src/temporal/view.ts
CHANGED
|
@@ -38,6 +38,8 @@ export interface TemporalViewInput {
|
|
|
38
38
|
readonly historyValid?: boolean;
|
|
39
39
|
readonly currentUnjitteredViewProjection?: ArrayLike<number> | undefined;
|
|
40
40
|
readonly previousUnjitteredViewProjection?: ArrayLike<number> | undefined;
|
|
41
|
+
readonly currentCameraPosition?: readonly [number, number, number] | undefined;
|
|
42
|
+
readonly previousCameraPosition?: readonly [number, number, number] | undefined;
|
|
41
43
|
readonly resetReason?: TemporalResetReason | undefined;
|
|
42
44
|
}
|
|
43
45
|
|
|
@@ -55,6 +57,8 @@ interface TemporalViewSnapshot {
|
|
|
55
57
|
readonly historyValid: boolean;
|
|
56
58
|
readonly currentUnjitteredViewProjection: ArrayLike<number> | undefined;
|
|
57
59
|
readonly previousUnjitteredViewProjection: ArrayLike<number> | undefined;
|
|
60
|
+
readonly currentCameraPosition: readonly [number, number, number] | undefined;
|
|
61
|
+
readonly previousCameraPosition: readonly [number, number, number] | undefined;
|
|
58
62
|
readonly resetReason: TemporalResetReason | undefined;
|
|
59
63
|
}
|
|
60
64
|
|
|
@@ -70,6 +74,9 @@ export interface TemporalView {
|
|
|
70
74
|
/** Unjittered matrices are supplied by the renderer projection owner. */
|
|
71
75
|
readonly currentUnjitteredViewProjection: ArrayLike<number> | undefined;
|
|
72
76
|
readonly previousUnjitteredViewProjection: ArrayLike<number> | undefined;
|
|
77
|
+
/** Camera origins follow the same accepted-submit boundary as the matrices. */
|
|
78
|
+
readonly currentCameraPosition: readonly [number, number, number] | undefined;
|
|
79
|
+
readonly previousCameraPosition: readonly [number, number, number] | undefined;
|
|
73
80
|
readonly currentProjection: 'jittered' | 'unjittered';
|
|
74
81
|
readonly previousProjection: 'unjittered';
|
|
75
82
|
readonly historyRequired: boolean;
|
|
@@ -112,6 +119,8 @@ export function createTemporalView(input: TemporalViewInput): TemporalView {
|
|
|
112
119
|
historyValid: input.historyValid ?? false,
|
|
113
120
|
currentUnjitteredViewProjection: input.currentUnjitteredViewProjection,
|
|
114
121
|
previousUnjitteredViewProjection: input.previousUnjitteredViewProjection,
|
|
122
|
+
currentCameraPosition: input.currentCameraPosition,
|
|
123
|
+
previousCameraPosition: input.previousCameraPosition,
|
|
115
124
|
resetReason: input.resetReason,
|
|
116
125
|
});
|
|
117
126
|
const taa = input.antialias === 'taa';
|
|
@@ -135,6 +144,8 @@ export function createTemporalView(input: TemporalViewInput): TemporalView {
|
|
|
135
144
|
temporalFrameIndex: frameIndex,
|
|
136
145
|
currentUnjitteredViewProjection: input.currentUnjitteredViewProjection,
|
|
137
146
|
previousUnjitteredViewProjection: input.previousUnjitteredViewProjection,
|
|
147
|
+
currentCameraPosition: input.currentCameraPosition,
|
|
148
|
+
previousCameraPosition: input.previousCameraPosition,
|
|
138
149
|
currentProjection: taa ? 'jittered' : 'unjittered',
|
|
139
150
|
previousProjection: 'unjittered',
|
|
140
151
|
historyRequired: taa,
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
import type { EntityHandle, World } from '@forgeax/engine-ecs';
|
|
58
58
|
import { decodeTileBits } from '@forgeax/engine-graphics-extras';
|
|
59
59
|
import { type box3, frustum, mat4 } from '@forgeax/engine-math';
|
|
60
|
-
import { ChildOf, Children, Transform } from '@forgeax/engine-scene';
|
|
60
|
+
import { ChildOf, Children, GlobalTransform, Transform } from '@forgeax/engine-scene';
|
|
61
61
|
import {
|
|
62
62
|
type Handle,
|
|
63
63
|
type MaterialAsset,
|
|
@@ -874,13 +874,13 @@ function bucketTileLayer(
|
|
|
874
874
|
* cull paths use byte-identical planes (charter P4 consistent abstraction).
|
|
875
875
|
*/
|
|
876
876
|
function buildCameraFrustumPlanes(world: World): frustum.Frustum | null {
|
|
877
|
-
const query = world.query({ with: [Camera, Transform] }).unwrap();
|
|
877
|
+
const query = world.query({ with: [Camera, Transform, GlobalTransform] }).unwrap();
|
|
878
878
|
let result: frustum.Frustum | null = null;
|
|
879
879
|
for (const row of query) {
|
|
880
880
|
const camEntity = row.entity;
|
|
881
881
|
|
|
882
882
|
const camRes = world.get(camEntity, Camera);
|
|
883
|
-
const trRes = world.get(camEntity,
|
|
883
|
+
const trRes = world.get(camEntity, GlobalTransform);
|
|
884
884
|
if (!camRes.ok || !trRes.ok) continue;
|
|
885
885
|
|
|
886
886
|
const cam = camRes.value;
|
|
@@ -1081,7 +1081,7 @@ function evictDeadPerCellStreamingCaches(work: readonly LayerWork[], world: Worl
|
|
|
1081
1081
|
/**
|
|
1082
1082
|
* Walk every TileLayer ChildOf-ing a Tilemap, extract its non-zero cells
|
|
1083
1083
|
* into derived render entities. A Renderer attaches this system to FrameEnd;
|
|
1084
|
-
* World's final publication then resolves newly-created
|
|
1084
|
+
* World's final publication then resolves newly-created GlobalTransform.world values before the
|
|
1085
1085
|
* read-only render walk begins.
|
|
1086
1086
|
*
|
|
1087
1087
|
* Two paths based on `TileLayer.sortScope`:
|