@forgeax/engine-runtime 0.1.4 → 0.1.7
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 +65 -83
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-serialize.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-serialize.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts +2 -0
- package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts.map +1 -0
- package/dist/__tests__/asset-error-exhaustive.test-d.d.ts +11 -0
- package/dist/__tests__/asset-error-exhaustive.test-d.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-guid-reverse.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-guid-reverse.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-mounts.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-mounts.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.browser.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.browser.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.dawn.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.listCatalog.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.listCatalog.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.mesh-bin.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.mesh-bin.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.pack-cache.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.pack-cache.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.recursive.spec.d.ts +2 -0
- package/dist/__tests__/asset-registry.recursive.spec.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset.unit.test.d.ts +2 -0
- package/dist/__tests__/asset.unit.test.d.ts.map +1 -0
- package/dist/__tests__/audio-load-by-guid.unit.test.d.ts +2 -0
- package/dist/__tests__/audio-load-by-guid.unit.test.d.ts.map +1 -0
- package/dist/__tests__/backend-selection.integration.test.d.ts +2 -0
- package/dist/__tests__/backend-selection.integration.test.d.ts.map +1 -0
- package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts +2 -0
- package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts.map +1 -0
- package/dist/__tests__/builtin-asset-registry.unit.test.d.ts +2 -0
- package/dist/__tests__/builtin-asset-registry.unit.test.d.ts.map +1 -0
- package/dist/__tests__/collect-scene-asset.test.d.ts +1 -2
- package/dist/__tests__/collect-scene-asset.test.d.ts.map +1 -1
- package/dist/__tests__/collect-scene-mount-collapse.test.d.ts +2 -0
- package/dist/__tests__/collect-scene-mount-collapse.test.d.ts.map +1 -0
- package/dist/__tests__/collect-transient-roundtrip.test.d.ts +1 -1
- package/dist/__tests__/collect-transient-roundtrip.test.d.ts.map +1 -1
- package/dist/__tests__/collect-transient-skip.test.d.ts +1 -2
- package/dist/__tests__/collect-transient-skip.test.d.ts.map +1 -1
- package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts +2 -0
- package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/draw-published.d.ts +2 -2
- package/dist/__tests__/draw-published.d.ts.map +1 -1
- package/dist/__tests__/dynamic-texture-store.unit.test.d.ts +2 -0
- package/dist/__tests__/dynamic-texture-store.unit.test.d.ts.map +1 -0
- package/dist/__tests__/errors.unit.test.d.ts +2 -0
- package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
- package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts +2 -0
- package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts.map +1 -0
- package/dist/__tests__/fetch-binary-decompress.test.d.ts +2 -0
- package/dist/__tests__/fetch-binary-decompress.test.d.ts.map +1 -0
- package/dist/__tests__/four-path-compression.integration.test.d.ts +2 -0
- package/dist/__tests__/four-path-compression.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/guid-for-asset.unit.test.d.ts +2 -0
- package/dist/__tests__/guid-for-asset.unit.test.d.ts.map +1 -0
- package/dist/__tests__/handle-migration.test.d.ts +2 -0
- package/dist/__tests__/handle-migration.test.d.ts.map +1 -0
- package/dist/__tests__/helpers/register-runtime-components.d.ts.map +1 -1
- package/dist/__tests__/host-custom-kind-contract.test-d.d.ts +2 -0
- package/dist/__tests__/host-custom-kind-contract.test-d.d.ts.map +1 -0
- package/dist/__tests__/host-custom-kind-contract.test.d.ts +2 -0
- package/dist/__tests__/host-custom-kind-contract.test.d.ts.map +1 -0
- package/dist/__tests__/inspect-name.test.d.ts +2 -0
- package/dist/__tests__/inspect-name.test.d.ts.map +1 -0
- package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts +2 -0
- package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts.map +1 -0
- package/dist/__tests__/loadbyguid-payload.unit.test.d.ts +2 -0
- package/dist/__tests__/loadbyguid-payload.unit.test.d.ts.map +1 -0
- package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts +2 -0
- package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts.map +1 -0
- package/dist/__tests__/loader-extract-graceful.test.d.ts +2 -0
- package/dist/__tests__/loader-extract-graceful.test.d.ts.map +1 -0
- package/dist/__tests__/loader-name-survival.test.d.ts +2 -0
- package/dist/__tests__/loader-name-survival.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-bin-contract.test.d.ts +2 -0
- package/dist/__tests__/mesh-bin-contract.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-bin.test.d.ts +2 -0
- package/dist/__tests__/mesh-bin.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/new-kind-refs-contract.test.d.ts +2 -0
- package/dist/__tests__/new-kind-refs-contract.test.d.ts.map +1 -0
- package/dist/__tests__/package-promotion.test.d.ts +2 -0
- package/dist/__tests__/package-promotion.test.d.ts.map +1 -0
- package/dist/__tests__/package-rename.test.d.ts +2 -0
- package/dist/__tests__/package-rename.test.d.ts.map +1 -0
- package/dist/__tests__/recover-error-exhaustive.test-d.d.ts +1 -1
- package/dist/__tests__/recover-error-exhaustive.test-d.d.ts.map +1 -1
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts +1 -1
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -1
- package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts +10 -0
- package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts.map +1 -0
- package/dist/__tests__/render-system-extract.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-extract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-test-utils.d.ts +10 -0
- package/dist/__tests__/renderer-test-utils.d.ts.map +1 -0
- package/dist/__tests__/renderer.test-d.d.ts +2 -0
- package/dist/__tests__/renderer.test-d.d.ts.map +1 -0
- package/dist/__tests__/resolve-asset-handle-err.test.d.ts +2 -0
- package/dist/__tests__/resolve-asset-handle-err.test.d.ts.map +1 -0
- package/dist/__tests__/resolve-asset-handle.unit.test.d.ts +2 -0
- package/dist/__tests__/resolve-asset-handle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName-fallback.test.d.ts +2 -0
- package/dist/__tests__/resolveName-fallback.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName-null-package.test.d.ts +2 -0
- package/dist/__tests__/resolveName-null-package.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName-unified-entry.test.d.ts +2 -0
- package/dist/__tests__/resolveName-unified-entry.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName.test.d.ts +2 -0
- package/dist/__tests__/resolveName.test.d.ts.map +1 -0
- package/dist/__tests__/roots-to-scene-asset.test.d.ts +1 -1
- package/dist/__tests__/roots-to-scene-asset.test.d.ts.map +1 -1
- package/dist/__tests__/roundtrip-primitive.test.d.ts +2 -0
- package/dist/__tests__/roundtrip-primitive.test.d.ts.map +1 -0
- package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts +2 -0
- package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts.map +1 -0
- package/dist/__tests__/scene-instance-authoring.integration.test.d.ts +2 -0
- package/dist/__tests__/scene-instance-authoring.integration.test.d.ts.map +1 -0
- package/dist/__tests__/scene-mount-fixed-point.test.d.ts +2 -0
- package/dist/__tests__/scene-mount-fixed-point.test.d.ts.map +1 -0
- package/dist/__tests__/scene-mount-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/scene-mount-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/scene-sugar-instantiate.test.d.ts +2 -0
- package/dist/__tests__/scene-sugar-instantiate.test.d.ts.map +1 -0
- package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/serialize-scene-asset.test.d.ts +1 -1
- package/dist/__tests__/serialize-scene-asset.test.d.ts.map +1 -1
- package/dist/__tests__/template-game-default-api-contract.test.d.ts +2 -0
- package/dist/__tests__/template-game-default-api-contract.test.d.ts.map +1 -0
- package/dist/__tests__/tileset-asset-validate.test.d.ts +2 -0
- package/dist/__tests__/tileset-asset-validate.test.d.ts.map +1 -0
- package/dist/__tests__/transcode-fallback.unit.test.d.ts +2 -0
- package/dist/__tests__/transcode-fallback.unit.test.d.ts.map +1 -0
- package/dist/__tests__/transient-runtime-behavior.test.d.ts +2 -0
- package/dist/__tests__/transient-runtime-behavior.test.d.ts.map +1 -0
- package/dist/__tests__/video-loader-consumption.test.d.ts +2 -0
- package/dist/__tests__/video-loader-consumption.test.d.ts.map +1 -0
- package/dist/__tests__/video-loader-smoke.dawn.test.d.ts +2 -0
- package/dist/__tests__/video-loader-smoke.dawn.test.d.ts.map +1 -0
- package/dist/backend-selection.d.ts +13 -0
- package/dist/backend-selection.d.ts.map +1 -0
- package/dist/collect-scene-asset.d.ts +7 -4
- package/dist/collect-scene-asset.d.ts.map +1 -1
- package/dist/createRenderer.d.ts +14 -2
- package/dist/createRenderer.d.ts.map +1 -1
- package/dist/errors/environment.d.ts +1 -1
- package/dist/errors/environment.d.ts.map +1 -1
- package/dist/index.d.ts +20 -82
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +107 -108
- package/dist/index.mjs.map +1 -1
- package/dist/renderer-host.d.ts +9 -0
- package/dist/renderer-host.d.ts.map +1 -0
- package/dist/renderer-host.mjs +62 -0
- package/dist/renderer-host.mjs.map +1 -0
- package/dist/scene-instances/index.d.ts +2 -0
- package/dist/scene-instances/index.d.ts.map +1 -0
- package/dist/scene-utils/mount-override-fold.d.ts +1 -2
- package/dist/scene-utils/mount-override-fold.d.ts.map +1 -1
- package/dist/systems/sprite-animation-tick.d.ts +1 -1
- package/dist/systems/sprite-animation-tick.d.ts.map +1 -1
- package/dist/systems/transparent-sort.d.ts +1 -2
- package/dist/systems/transparent-sort.d.ts.map +1 -1
- package/dist/tilemap-register-validate.d.ts.map +1 -1
- package/package.json +34 -33
- package/src/__tests__/active-camera.unit.test.ts +19 -9
- package/src/__tests__/animation-graph-collect-roundtrip.test.ts +213 -0
- package/src/__tests__/animation-graph-serialize.unit.test.ts +171 -0
- package/src/__tests__/append-injection.test.ts +1 -1
- package/src/__tests__/asset-brand-and-name-retirement.test.ts +102 -0
- package/src/__tests__/asset-error-exhaustive.test-d.ts +62 -0
- package/src/__tests__/asset-registry-guid-reverse.test.ts +608 -0
- package/src/__tests__/asset-registry-hdr-equirect.test.ts +78 -0
- package/src/__tests__/asset-registry-mesh-pack-payload.dawn.test.ts +232 -0
- package/src/__tests__/asset-registry-mounts.test.ts +806 -0
- package/src/__tests__/asset-registry.browser.test.ts +81 -0
- package/src/__tests__/asset-registry.dawn.test.ts +94 -0
- package/src/__tests__/asset-registry.listCatalog.test.ts +170 -0
- package/src/__tests__/asset-registry.mesh-bin.test.ts +316 -0
- package/src/__tests__/asset-registry.pack-cache.test.ts +969 -0
- package/src/__tests__/asset-registry.raw-container-failfast.test.ts +225 -0
- package/src/__tests__/asset-registry.recursive.spec.ts +1397 -0
- package/src/__tests__/asset-registry.unit.test.ts +1030 -0
- package/src/__tests__/asset.unit.test.ts +7107 -0
- package/src/__tests__/audio-load-by-guid.unit.test.ts +126 -0
- package/src/__tests__/backend-selection.integration.test.ts +11 -0
- package/src/__tests__/basis-catalog-dispatch.integration.test.ts +320 -0
- package/src/__tests__/bind-group-cache-keying.test.ts +4 -4
- package/src/__tests__/block-upload-math.unit.test.ts +2 -2
- package/src/__tests__/builtin-asset-registry.unit.test.ts +112 -0
- package/src/__tests__/builtin-shader-register-e2e.test.ts +1 -1
- package/src/__tests__/cache-false-eviction.test.ts +2 -1
- package/src/__tests__/cache-isolation-matrix.test.ts +2 -1
- package/src/__tests__/camera-clear-snapshot-equivalence.unit.test.ts +5 -6
- package/src/__tests__/clamp-to-last.e2e.browser.test.ts +29 -19
- package/src/__tests__/collect-scene-asset.test.ts +49 -52
- package/src/__tests__/collect-scene-mount-collapse.test.ts +391 -0
- package/src/__tests__/collect-subtree.unit.test.ts +1 -2
- package/src/__tests__/collect-transient-children-absent.test.ts +24 -10
- package/src/__tests__/collect-transient-roundtrip.test.ts +44 -20
- package/src/__tests__/collect-transient-skip.test.ts +24 -13
- package/src/__tests__/components.test-d.ts +1 -6
- package/src/__tests__/components.unit.test.ts +20 -19
- package/src/__tests__/composite-skybox-cross-world.browser.test.ts +59 -27
- package/src/__tests__/compressed-texture-physical-extent.integration.test.ts +139 -0
- package/src/__tests__/create-renderer-assembly.integration.test.ts +42 -29
- package/src/__tests__/createRenderer-dispose.test.ts +35 -402
- package/src/__tests__/createRenderer.browser-no-webgpu.test.ts +25 -30
- package/src/__tests__/createRenderer.unit.test.ts +1 -1
- package/src/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.ts +27 -63
- package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +56 -47
- package/src/__tests__/dawn/instances-per-instance-pbr.dawn.test.ts +49 -29
- package/src/__tests__/dawn/instances-shadow.dawn.test.ts +26 -15
- package/src/__tests__/dawn/instances-uniform-fallback.dawn.test.ts +13 -14
- package/src/__tests__/dawn/material-alpha.dawn.test.ts +23 -31
- package/src/__tests__/dawn/material-cooked-fixture.dawn.test.ts +24 -9
- package/src/__tests__/dawn/{mesh-update.dawn.test.ts → mesh-update-dawn.test.ts} +42 -134
- package/src/__tests__/dawn/mipmap-srgb-linear.dawn.test.ts +14 -7
- package/src/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.ts +16 -28
- package/src/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.ts +23 -39
- package/src/__tests__/dawn/upload-texture.dawn.test.ts +198 -0
- package/src/__tests__/dawn/user-handle-mesh-render.dawn.test.ts +12 -14
- package/src/__tests__/dawn/user-mesh-upload.dawn.test.ts +27 -22
- package/src/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.ts +25 -28
- package/src/__tests__/dawn/zero-manifest-ready.dawn.test.ts +10 -11
- package/src/__tests__/demo-sortscope-migration.unit.test.ts +5 -5
- package/src/__tests__/derive-bgl-integration.test.ts +34 -44
- package/src/__tests__/derive-render-data-skin.unit.test.ts +1 -1
- package/src/__tests__/draw-published.ts +11 -4
- package/src/__tests__/dynamic-texture-store.unit.test.ts +190 -0
- package/src/__tests__/equirect-bc6h.integration.test.ts +144 -21
- package/src/__tests__/errors.unit.test.ts +1227 -0
- package/src/__tests__/extract-frames-graceful-degradation.test.ts +3 -7
- package/src/__tests__/extract-frames-merge.test.ts +35 -22
- package/src/__tests__/extract-record-no-hardcoded-texture-fields.test.ts +5 -16
- package/src/__tests__/extract-skin-mismatch.unit.test.ts +322 -0
- package/src/__tests__/fetch-binary-decompress.test.ts +356 -0
- package/src/__tests__/four-path-compression.integration.test.ts +395 -0
- package/src/__tests__/frame-targets-shadow-regression.unit.test.ts +1 -1
- package/src/__tests__/fullscreen-feature-host.dawn.test.ts +80 -0
- package/src/__tests__/fullscreen-post-bgl-depth.test.ts +4 -2
- package/src/__tests__/fullscreen-post-depth-params-arity.test.ts +3 -3
- package/src/__tests__/fullscreen-post-process-pass.dawn.test.ts +39 -23
- package/src/__tests__/fullscreen-post-process-pass.unit.test.ts +4 -2
- package/src/__tests__/fxaa-pixel-diff.dawn.test.ts +28 -17
- package/src/__tests__/fxaa-validation-and-resize.dawn.test.ts +29 -18
- package/src/__tests__/fxaa-zero-overhead.dawn.test.ts +16 -12
- package/src/__tests__/geometry.unit.test.ts +525 -159
- package/src/__tests__/glyph-tilemap-worldid.test.ts +1 -1
- package/src/__tests__/gpu-resource-cow-survivor.test.ts +6 -4
- package/src/__tests__/guid-for-asset.unit.test.ts +102 -0
- package/src/__tests__/handle-migration.test.ts +136 -0
- package/src/__tests__/helpers/register-runtime-components.ts +4 -2
- package/src/__tests__/helpers/register-scene-components.ts +1 -1
- package/src/__tests__/host-custom-kind-contract.test-d.ts +47 -0
- package/src/__tests__/host-custom-kind-contract.test.ts +578 -0
- package/src/__tests__/inspect-name.test.ts +139 -0
- package/src/__tests__/instances.test-d.ts +1 -1
- package/src/__tests__/instantiate-mount-deferred-wiring.test.ts +112 -0
- package/src/__tests__/light-casters-9-light.browser.test.ts +73 -76
- package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +7 -10
- package/src/__tests__/light-snapshot.test-d.ts +2 -2
- package/src/__tests__/lights-vec-negative.unit.test.ts +1 -1
- package/src/__tests__/lights.unit.test.ts +31 -511
- package/src/__tests__/loadbyguid-payload.unit.test.ts +117 -0
- package/src/__tests__/loadbyguid-texture-intern.unit.test.ts +213 -0
- package/src/__tests__/loader-extract-graceful.test.ts +146 -0
- package/src/__tests__/loader-name-survival.test.ts +213 -0
- package/src/__tests__/m3-vec-negative.unit.test.ts +3 -2
- package/src/__tests__/material-texture-uv-scale.unit.test.ts +101 -31
- package/src/__tests__/materials.unit.test.ts +10 -27
- package/src/__tests__/mesh-bin-contract.test.ts +28 -0
- package/src/__tests__/mesh-bin-skin-roundtrip.unit.test.ts +149 -0
- package/src/__tests__/mesh-bin.test.ts +38 -0
- package/src/__tests__/mesh-loader-skin-contract.unit.test.ts +120 -0
- package/src/__tests__/mesh-ssbo-grow.unit.test.ts +3 -3
- package/src/__tests__/mip-gate.unit.test.ts +1 -1
- package/src/__tests__/msaa-sprite-pixel-diff.dawn.test.ts +29 -68
- package/src/__tests__/new-kind-refs-contract.test.ts +132 -0
- package/src/__tests__/node-shims.d.ts +4 -6
- package/src/__tests__/package-promotion.test.ts +88 -0
- package/src/__tests__/package-rename.test.ts +103 -0
- package/src/__tests__/pass-selector.unit.test.ts +2 -2
- package/src/__tests__/pbr-pipeline.unit.test.ts +21 -25
- package/src/__tests__/pipeline-builder-msaa.unit.test.ts +6 -9
- package/src/__tests__/pipeline-cache-keying.unit.test.ts +6 -9
- package/src/__tests__/pipeline-spec.test.ts +16 -177
- package/src/__tests__/pipeline.unit.test.ts +154 -1693
- package/src/__tests__/point-light-shadow.dawn.test.ts +33 -42
- package/src/__tests__/point-light-shadow.unit.test.ts +19 -60
- package/src/__tests__/post-process-error-codes.unit.test.ts +4 -1
- package/src/__tests__/post-process-params-component.unit.test.ts +1 -1
- package/src/__tests__/post-process-params-extract.unit.test.ts +2 -5
- package/src/__tests__/postprocess-camera-consistency.test.ts +4 -7
- package/src/__tests__/profiler-assembly.integration.test.ts +1 -1
- package/src/__tests__/propagate-transforms.dawn.test.ts +12 -11
- package/src/__tests__/record-worldid-isolation.test.ts +7 -29
- package/src/__tests__/recover-error-exhaustive.test-d.ts +1 -1
- package/src/__tests__/render-error-exhaustive.test-d.ts +117 -71
- package/src/__tests__/render-feature-assembly.test-d.ts +20 -9
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +8 -6
- package/src/__tests__/render-feature-prepared-graphics.browser.test.ts +65 -559
- package/src/__tests__/render-feature-prepared-graphics.dawn.test.ts +57 -544
- package/src/__tests__/render-feature-prepared-graphics.fixture.ts +104 -0
- package/src/__tests__/render-feature-prepared-graphics.integration.test.ts +40 -248
- package/src/__tests__/render-feature-prepared-graphics.regression.integration.test.ts +83 -340
- package/src/__tests__/render-feature-recover.integration.test.ts +9 -49
- package/src/__tests__/render-feature-runtime-surface.test-d.ts +17 -20
- package/src/__tests__/render-schema-consumer.integration.test.ts +20 -13
- package/src/__tests__/render-schema-owner-boundary.unit.test.ts +2 -6
- package/src/__tests__/render-system-cross-world-overlay-queue.test.ts +5 -5
- package/src/__tests__/render-system-extract-dispatch-ordering.test.ts +16 -31
- package/src/__tests__/render-system-extract.test.ts +36 -51
- package/src/__tests__/render-system-extract.unit.test.ts +360 -0
- package/src/__tests__/render-system-fold-bucket.unit.test.ts +3 -5
- package/src/__tests__/render-system-fold-fallback.unit.test.ts +6 -3
- package/src/__tests__/render-system-fold-material.unit.test.ts +3 -5
- package/src/__tests__/render-system-fold-metrics.unit.test.ts +5 -5
- package/src/__tests__/render-system-fold-modegate.unit.test.ts +6 -6
- package/src/__tests__/render-system-fold.dawn.test.ts +7 -5
- package/src/__tests__/render-system-mega.test.ts +292 -190
- package/src/__tests__/render-system-owner-split-contract.test.ts +10 -32
- package/src/__tests__/render-system-record-multi-material-textureview.test.ts +59 -45
- package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +23 -29
- package/src/__tests__/render-system-record.test.ts +398 -235
- package/src/__tests__/render-system-record.unit.test.ts +25 -26
- package/src/__tests__/render-system-skin-bg.unit.test.ts +8 -12
- package/src/__tests__/renderer-consumer.test-d.ts +16 -3
- package/src/__tests__/renderer-health.unit.test.ts +26 -916
- package/src/__tests__/renderer-lifecycle.integration.test.ts +19 -6
- package/src/__tests__/renderer-recover.unit.test.ts +49 -1069
- package/src/__tests__/renderer-result.test-d.ts +19 -9
- package/src/__tests__/renderer-surface.unit.test.ts +3 -5
- package/src/__tests__/renderer-test-utils.ts +56 -0
- package/src/__tests__/renderer.test-d.ts +61 -0
- package/src/__tests__/resolve-asset-handle-err.test.ts +111 -0
- package/src/__tests__/resolve-asset-handle.unit.test.ts +64 -0
- package/src/__tests__/resolve-depth-only-view.test.ts +1 -1
- package/src/__tests__/resolveName-fallback.test.ts +64 -0
- package/src/__tests__/resolveName-null-package.test.ts +38 -0
- package/src/__tests__/resolveName-unified-entry.test.ts +65 -0
- package/src/__tests__/resolveName.test.ts +64 -0
- package/src/__tests__/rhi-null-command-flow.unit.test.ts +56 -260
- package/src/__tests__/rhi-null-renderer-lifecycle.unit.test.ts +41 -169
- package/src/__tests__/roots-to-scene-asset.test.ts +199 -93
- package/src/__tests__/roundtrip-primitive.test.ts +351 -0
- package/src/__tests__/scene-bare-guid-refs-instantiate.test.ts +123 -0
- package/src/__tests__/scene-equirect-roundtrip.test.ts +103 -16
- package/src/__tests__/scene-instance-authoring.integration.test.ts +8 -0
- package/src/__tests__/scene-instance-bridge.integration.test.ts +1 -1
- package/src/__tests__/scene-instance-component.test.ts +1 -1
- package/src/__tests__/scene-mount-fixed-point.test.ts +257 -0
- package/src/__tests__/scene-mount-roundtrip.test.ts +987 -0
- package/src/__tests__/scene-mount-wrapper-roundtrip.test.ts +202 -0
- package/src/__tests__/scene-sugar-instantiate.test.ts +324 -0
- package/src/__tests__/serialize-mounts-roundtrip.test.ts +533 -0
- package/src/__tests__/serialize-scene-asset.test.ts +219 -22
- package/src/__tests__/shadow-caster-empty-schema.test.ts +3 -3
- package/src/__tests__/shadow-csm-cascade-loadop.test.ts +37 -17
- package/src/__tests__/shadow-csm-component.test.ts +3 -5
- package/src/__tests__/shadow-csm-extract.test.ts +2 -100
- package/src/__tests__/shadow-csm-orthoz.test.ts +2 -16
- package/src/__tests__/shadow-csm-runtime-vary.dawn.test.ts +19 -14
- package/src/__tests__/shadow-csm-tile-consistency.test.ts +32 -26
- package/src/__tests__/shadow-csm-ubo.dawn.test.ts +8 -49
- package/src/__tests__/shadow-csm-ubo.test.ts +3 -25
- package/src/__tests__/shadow-csm-viewport.browser.test.ts +1 -1
- package/src/__tests__/shadow-fields-observable.dawn.test.ts +67 -56
- package/src/__tests__/shadow-m1.dawn.test.ts +8 -9
- package/src/__tests__/shadow-mesh-ssbo-order.test.ts +11 -27
- package/src/__tests__/skin-errors.unit.test.ts +1 -1
- package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +7 -5
- package/src/__tests__/skylight-lazy-projection.test.ts +36 -15
- package/src/__tests__/sparse-tag-scene-roundtrip.test.ts +5 -5
- package/src/__tests__/sprite-cullmode-flip.dawn.test.ts +47 -64
- package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +15 -14
- package/src/__tests__/sprite-lit-extract-branch.test.ts +1 -1
- package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +1 -1
- package/src/__tests__/ssao-bgl.test.ts +16 -9
- package/src/__tests__/ssao-buffers.test.ts +2 -2
- package/src/__tests__/ssao-data.test.ts +2 -2
- package/src/__tests__/ssao-errors.test.ts +1 -1
- package/src/__tests__/ssao-passes.test.ts +68 -392
- package/src/__tests__/ssao-pipelines.test.ts +1 -1
- package/src/__tests__/ssao-uniform-layout.test.ts +8 -6
- package/src/__tests__/stencil-outline-pixel.dawn.test.ts +25 -17
- package/src/__tests__/swap-chain-format.unit.test.ts +5 -7
- package/src/__tests__/systems.unit.test.ts +536 -1326
- package/src/__tests__/template-game-default-api-contract.test.ts +362 -0
- package/src/__tests__/text.unit.test.ts +56 -33
- package/src/__tests__/tilemap-childed-despawn.test.ts +8 -14
- package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +8 -12
- package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +2 -1
- package/src/__tests__/tilemap-chunk-extract.test.ts +13 -17
- package/src/__tests__/tilemap-dirty-rebuild.test.ts +7 -11
- package/src/__tests__/tilemap-material-cache.test.ts +8 -13
- package/src/__tests__/tilemap-multi-atlas.test.ts +12 -32
- package/src/__tests__/tilemap-owner-boundary.unit.test.ts +5 -2
- package/src/__tests__/tilemap-region-pack.test.ts +8 -12
- package/src/__tests__/tilemap-spawn-flip-pivot.test.ts +8 -12
- package/src/__tests__/tilemap-uv-inset.test.ts +11 -14
- package/src/__tests__/tilemap-validate.test.ts +1 -1
- package/src/__tests__/tileset-asset-validate.test.ts +638 -0
- package/src/__tests__/transcode-fallback.unit.test.ts +207 -0
- package/src/__tests__/transform-hierarchy-pixel-diff.dawn.test.ts +36 -28
- package/src/__tests__/transient-fields-collect.test.ts +28 -21
- package/src/__tests__/transient-runtime-behavior.test.ts +227 -0
- package/src/__tests__/transparent-sort-tilemap-sprite-interleave.test.ts +4 -4
- package/src/__tests__/variant-selection.unit.test.ts +1 -1
- package/src/__tests__/video-extract-bindgroup.dawn.test.ts +89 -136
- package/src/__tests__/video-loader-consumption.test.ts +86 -0
- package/src/__tests__/video-loader-smoke.dawn.test.ts +60 -0
- package/src/__tests__/view-ubo-layout.browser.test.ts +0 -22
- package/src/__tests__/world-entity-key.test.ts +1 -1
- package/src/__tests__/world-scene-despawn.test.ts +1 -1
- package/src/__tests__/world-scene-instantiate.test.ts +2 -36
- package/src/__tests__/world-scene-nested.test.ts +1 -1
- package/src/__tests__/world-scene-override.test.ts +1 -1
- package/src/backend-selection.ts +69 -0
- package/src/collect-scene-asset.ts +35 -23
- package/src/components/__tests__/camera.test-d.ts +1 -1
- package/src/components/__tests__/camera.test.ts +1 -1
- package/src/components/__tests__/sprite-animation.test-d.ts +2 -2
- package/src/components/__tests__/tile-layer.test-d.ts +1 -1
- package/src/components/__tests__/tile-layer.unit.test.ts +2 -2
- package/src/createRenderer.ts +24 -36
- package/src/errors/environment.ts +1 -1
- package/src/index.ts +51 -113
- package/src/renderer-host.ts +33 -0
- package/src/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.ts +1 -1
- package/src/scene-instances/index.ts +4 -0
- package/src/scene-utils/mount-override-fold.ts +3 -7
- package/src/systems/__tests__/transparent-sort.bench.ts +3 -3
- package/src/systems/sprite-animation-tick.ts +1 -1
- package/src/systems/transparent-sort.ts +38 -38
- package/src/tilemap-register-validate.ts +4 -4
- package/dist/__tests__/bind-group-cache-binding.test.d.ts +0 -2
- package/dist/__tests__/bind-group-cache-binding.test.d.ts.map +0 -1
- package/dist/__tests__/bind-group-cache-frame.test.d.ts +0 -2
- package/dist/__tests__/bind-group-cache-frame.test.d.ts.map +0 -1
- package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts +0 -2
- package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-manifest.d.ts +0 -131
- package/dist/__tests__/fog-producer-manifest.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-pixel-probe.d.ts +0 -42
- package/dist/__tests__/fog-producer-pixel-probe.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-pixel.browser.test.d.ts +0 -2
- package/dist/__tests__/fog-producer-pixel.browser.test.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts +0 -2
- package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-real-fixture.d.ts +0 -5
- package/dist/__tests__/fog-producer-real-fixture.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-vfx-effect.d.ts +0 -3
- package/dist/__tests__/fog-producer-vfx-effect.d.ts.map +0 -1
- package/dist/__tests__/fog-scene-asset.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-scene-asset.integration.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts +0 -2
- package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-resource.test.d.ts +0 -2
- package/dist/__tests__/gpu-resource.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts +0 -2
- package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-buffers.unit.test.d.ts +0 -2
- package/dist/__tests__/hdrp-buffers.unit.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts +0 -2
- package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts +0 -2
- package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts +0 -2
- package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts.map +0 -1
- package/dist/__tests__/hdrp-ssao-boundary.test.d.ts +0 -2
- package/dist/__tests__/hdrp-ssao-boundary.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-ssao-falsification.test.d.ts +0 -2
- package/dist/__tests__/hdrp-ssao-falsification.test.d.ts.map +0 -1
- package/dist/__tests__/helpers/primitive-world.d.ts +0 -8
- package/dist/__tests__/helpers/primitive-world.d.ts.map +0 -1
- package/dist/__tests__/helpers/render-asset-port.d.ts +0 -15
- package/dist/__tests__/helpers/render-asset-port.d.ts.map +0 -1
- package/dist/__tests__/helpers/scene-asset-port.d.ts +0 -9
- package/dist/__tests__/helpers/scene-asset-port.d.ts.map +0 -1
- package/dist/__tests__/material-derived-coordinates.integration.test.d.ts +0 -2
- package/dist/__tests__/material-derived-coordinates.integration.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-layout-selection.test.d.ts +0 -2
- package/dist/__tests__/pipeline-layout-selection.test.d.ts.map +0 -1
- package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts +0 -2
- package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts.map +0 -1
- package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts +0 -2
- package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts +0 -2
- package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-caster-membership.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-caster-membership.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-pssm.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-pssm.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-viewport.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-viewport.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-m2.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-m2.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-m3-calibrate.d.ts +0 -83
- package/dist/__tests__/shadow-m3-calibrate.d.ts.map +0 -1
- package/dist/__tests__/shadow-m3.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-m3.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/temporal-off-path.unit.test.d.ts +0 -2
- package/dist/__tests__/temporal-off-path.unit.test.d.ts.map +0 -1
- package/dist/__tests__/video-cache-regression.unit.test.d.ts +0 -2
- package/dist/__tests__/video-cache-regression.unit.test.d.ts.map +0 -1
- package/dist/asset-kind.d.ts +0 -4
- package/dist/asset-kind.d.ts.map +0 -1
- package/dist/errors/sprite-animation.d.ts +0 -3
- package/dist/errors/sprite-animation.d.ts.map +0 -1
- package/dist/scene-asset-port.d.ts +0 -17
- package/dist/scene-asset-port.d.ts.map +0 -1
- package/dist/scene-collect-errors.d.ts +0 -22
- package/dist/scene-collect-errors.d.ts.map +0 -1
- package/dist/shadow-m3-calibrate.d.ts +0 -40
- package/dist/shadow-m3-calibrate.d.ts.map +0 -1
- package/src/__tests__/bind-group-cache-binding.test.ts +0 -2513
- package/src/__tests__/bind-group-cache-frame.test.ts +0 -1511
- package/src/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.ts +0 -204
- package/src/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.ts +0 -297
- package/src/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.ts +0 -271
- package/src/__tests__/dispatch-fullscreen-pass-params.unit.test.ts +0 -321
- package/src/__tests__/fog-producer-manifest.ts +0 -162
- package/src/__tests__/fog-producer-pixel-probe.ts +0 -263
- package/src/__tests__/fog-producer-pixel.browser.test.ts +0 -26
- package/src/__tests__/fog-producer-pixel.dawn.test.ts +0 -55
- package/src/__tests__/fog-producer-real-fixture.ts +0 -805
- package/src/__tests__/fog-producer-vfx-effect.ts +0 -272
- package/src/__tests__/fog-scene-asset.integration.test.ts +0 -123
- package/src/__tests__/gpu-resource-store-cubemap-status.test.ts +0 -207
- package/src/__tests__/gpu-resource.test.ts +0 -1206
- package/src/__tests__/hdrp-bgl-slots.browser.test.ts +0 -50
- package/src/__tests__/hdrp-buffers.unit.test.ts +0 -70
- package/src/__tests__/hdrp-execute-filter.unit.test.ts +0 -200
- package/src/__tests__/hdrp-gbuffer-attachments.browser.test.ts +0 -64
- package/src/__tests__/hdrp-pipeline-asset-type.test-d.ts +0 -139
- package/src/__tests__/hdrp-ssao-boundary.test.ts +0 -237
- package/src/__tests__/hdrp-ssao-falsification.test.ts +0 -289
- package/src/__tests__/helpers/primitive-world.ts +0 -91
- package/src/__tests__/helpers/render-asset-port.ts +0 -65
- package/src/__tests__/helpers/scene-asset-port.ts +0 -23
- package/src/__tests__/material-derived-coordinates.integration.test.ts +0 -100
- package/src/__tests__/pipeline-layout-selection.test.ts +0 -298
- package/src/__tests__/post-process-reads-narrowing.test-d.ts +0 -52
- package/src/__tests__/post-process-register-roundtrip.dawn.test.ts +0 -230
- package/src/__tests__/render-feature-zero-feature.browser.test.ts +0 -152
- package/src/__tests__/render-pipeline-trivial.dawn.test.ts +0 -525
- package/src/__tests__/shadow-csm-caster-membership.test.ts +0 -232
- package/src/__tests__/shadow-csm-pssm.test.ts +0 -142
- package/src/__tests__/shadow-csm-temporal.browser.test.ts +0 -145
- package/src/__tests__/shadow-csm-viewport.test.ts +0 -74
- package/src/__tests__/shadow-m2.dawn.test.ts +0 -394
- package/src/__tests__/shadow-m3-calibrate-run.dawn.test.ts +0 -248
- package/src/__tests__/shadow-m3-calibrate.ts +0 -203
- package/src/__tests__/shadow-m3.dawn.test.ts +0 -288
- package/src/__tests__/shadow-probe-control-flow.dawn.test.ts +0 -264
- package/src/__tests__/shadow-quality-metrics.dawn.test.ts +0 -324
- package/src/__tests__/temporal-off-path.unit.test.ts +0 -69
- package/src/__tests__/video-cache-regression.unit.test.ts +0 -186
- package/src/asset-kind.ts +0 -7
- package/src/errors/sprite-animation.ts +0 -5
- package/src/scene-asset-port.ts +0 -32
- package/src/scene-collect-errors.ts +0 -30
- package/src/shadow-m3-calibrate.ts +0 -171
|
@@ -12,16 +12,15 @@
|
|
|
12
12
|
// mapSize 2048 -> 1024 -> 2048 the same way. Asserts every draw returns
|
|
13
13
|
// `ok: true` and no device-lost / structured RhiError fires.
|
|
14
14
|
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// without device error".
|
|
15
|
+
// This is a structural GPU behavior gate: the unified Standard shadow graph
|
|
16
|
+
// must rebuild its atlas and continue drawing without device errors.
|
|
18
17
|
|
|
19
18
|
import type { EntityHandle } from '@forgeax/engine-ecs';
|
|
20
19
|
import { World } from '@forgeax/engine-ecs';
|
|
21
|
-
import { Camera, DirectionalLight } from '@forgeax/engine-render
|
|
20
|
+
import { Camera, DirectionalLight } from '@forgeax/engine-render';
|
|
22
21
|
import { Transform } from '@forgeax/engine-scene';
|
|
23
22
|
import { describe, expect, it } from 'vitest';
|
|
24
|
-
import {
|
|
23
|
+
import { constructRuntimeRendererHost } from '../renderer-host';
|
|
25
24
|
import { drawPublished } from './draw-published';
|
|
26
25
|
|
|
27
26
|
const ENGINE_MANIFEST = await (async () => {
|
|
@@ -127,13 +126,15 @@ describe('CSM runtime cascade + mapSize variation (M5/w26)', () => {
|
|
|
127
126
|
it('cascadeCount 4 -> 2 -> 4 round-trip without device error', async () => {
|
|
128
127
|
if (!dawnReady) return;
|
|
129
128
|
const canvas = createMockCanvas();
|
|
130
|
-
const
|
|
129
|
+
const host = await constructRuntimeRendererHost(
|
|
131
130
|
canvas as unknown as HTMLCanvasElement,
|
|
132
131
|
{},
|
|
133
132
|
{ shaderManifestUrl: ENGINE_MANIFEST_URL },
|
|
134
133
|
);
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
expect(host.ok).toBe(true);
|
|
135
|
+
if (!host.ok) throw host.error;
|
|
136
|
+
const { renderer } = host.value;
|
|
137
|
+
expect(renderer.inspect().state).toBe('alive');
|
|
137
138
|
const { world, shadowEntity } = buildScene(4, 2048);
|
|
138
139
|
|
|
139
140
|
expect(drawPublished(renderer, world).ok).toBe(true);
|
|
@@ -156,13 +157,15 @@ describe('CSM runtime cascade + mapSize variation (M5/w26)', () => {
|
|
|
156
157
|
it('mapSize 2048 -> 1024 -> 2048 RT rebuild without device error', async () => {
|
|
157
158
|
if (!dawnReady) return;
|
|
158
159
|
const canvas = createMockCanvas();
|
|
159
|
-
const
|
|
160
|
+
const host = await constructRuntimeRendererHost(
|
|
160
161
|
canvas as unknown as HTMLCanvasElement,
|
|
161
162
|
{},
|
|
162
163
|
{ shaderManifestUrl: ENGINE_MANIFEST_URL },
|
|
163
164
|
);
|
|
164
|
-
|
|
165
|
-
|
|
165
|
+
expect(host.ok).toBe(true);
|
|
166
|
+
if (!host.ok) throw host.error;
|
|
167
|
+
const { renderer } = host.value;
|
|
168
|
+
expect(renderer.inspect().state).toBe('alive');
|
|
166
169
|
const { world, shadowEntity } = buildScene(4, 2048);
|
|
167
170
|
|
|
168
171
|
expect(drawPublished(renderer, world).ok).toBe(true);
|
|
@@ -185,13 +188,15 @@ describe('CSM runtime cascade + mapSize variation (M5/w26)', () => {
|
|
|
185
188
|
it('cascadeCount=1 renders through the unified pathway (AC-10)', async () => {
|
|
186
189
|
if (!dawnReady) return;
|
|
187
190
|
const canvas = createMockCanvas();
|
|
188
|
-
const
|
|
191
|
+
const host = await constructRuntimeRendererHost(
|
|
189
192
|
canvas as unknown as HTMLCanvasElement,
|
|
190
193
|
{},
|
|
191
194
|
{ shaderManifestUrl: ENGINE_MANIFEST_URL },
|
|
192
195
|
);
|
|
193
|
-
|
|
194
|
-
|
|
196
|
+
expect(host.ok).toBe(true);
|
|
197
|
+
if (!host.ok) throw host.error;
|
|
198
|
+
const { renderer } = host.value;
|
|
199
|
+
expect(renderer.inspect().state).toBe('alive');
|
|
195
200
|
const { world } = buildScene(1, 1024);
|
|
196
201
|
expect(drawPublished(renderer, world).ok).toBe(true);
|
|
197
202
|
});
|
|
@@ -26,10 +26,8 @@ import { readFileSync } from 'node:fs';
|
|
|
26
26
|
import { fileURLToPath } from 'node:url';
|
|
27
27
|
import type { World as WorldType } from '@forgeax/engine-ecs';
|
|
28
28
|
import type { Renderer as RendererType } from '@forgeax/engine-render';
|
|
29
|
-
import { directionalCascadeRasterViewport } from '@forgeax/engine-render/internal';
|
|
30
29
|
import type { Handle } from '@forgeax/engine-types';
|
|
31
30
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
32
|
-
import { TEST_CUBE_HANDLE, withPrimitiveMeshes } from './helpers/primitive-world';
|
|
33
31
|
|
|
34
32
|
const ENGINE = '../createRenderer';
|
|
35
33
|
|
|
@@ -196,17 +194,29 @@ async function importEngine(): Promise<{
|
|
|
196
194
|
opts?: unknown,
|
|
197
195
|
bundler?: unknown,
|
|
198
196
|
) => Promise<{
|
|
199
|
-
|
|
197
|
+
subscribe: (listener: (event: unknown) => void) => () => void;
|
|
200
198
|
draw: (worlds: unknown, opts: { cameraOwner: number; resourceOwner: number }) => void;
|
|
201
|
-
onError: (cb: (err: { code: string }) => void) => () => void;
|
|
202
199
|
}>;
|
|
203
200
|
}> {
|
|
204
|
-
|
|
201
|
+
const engine = (await import(ENGINE)) as {
|
|
202
|
+
createRenderer: (...args: readonly unknown[]) => Promise<unknown>;
|
|
203
|
+
};
|
|
204
|
+
return {
|
|
205
|
+
createRenderer: async (...args: readonly unknown[]) => {
|
|
206
|
+
const result = (await engine.createRenderer(...args)) as
|
|
207
|
+
| { readonly ok: true; readonly value: unknown }
|
|
208
|
+
| { readonly ok: false; readonly error: unknown };
|
|
209
|
+
if (!result.ok) throw result.error;
|
|
210
|
+
return result.value as {
|
|
211
|
+
subscribe: (listener: (event: unknown) => void) => () => void;
|
|
212
|
+
draw: (worlds: unknown, opts: { cameraOwner: number; resourceOwner: number }) => void;
|
|
213
|
+
};
|
|
214
|
+
},
|
|
215
|
+
};
|
|
205
216
|
}
|
|
206
217
|
|
|
207
218
|
async function importEcs(): Promise<{ World: new () => unknown }> {
|
|
208
|
-
|
|
209
|
-
return { World: withPrimitiveMeshes(BaseWorld) } as never;
|
|
219
|
+
return (await import('@forgeax/engine-ecs')) as never;
|
|
210
220
|
}
|
|
211
221
|
|
|
212
222
|
async function importComponents(): Promise<{
|
|
@@ -218,9 +228,9 @@ async function importComponents(): Promise<{
|
|
|
218
228
|
HANDLE_CUBE: Handle<'MeshAsset', 'shared'>;
|
|
219
229
|
}> {
|
|
220
230
|
return {
|
|
221
|
-
...(await import('@forgeax/engine-render
|
|
231
|
+
...(await import('@forgeax/engine-render')),
|
|
222
232
|
...(await import('@forgeax/engine-scene')),
|
|
223
|
-
|
|
233
|
+
...(await import('@forgeax/engine-assets-runtime')),
|
|
224
234
|
} as never;
|
|
225
235
|
}
|
|
226
236
|
|
|
@@ -238,7 +248,6 @@ async function captureCascadeViewports(cascadeCount: number, mapSize: number): P
|
|
|
238
248
|
{},
|
|
239
249
|
{ shaderManifestUrl: buildManifestDataUrl() },
|
|
240
250
|
);
|
|
241
|
-
await renderer.ready;
|
|
242
251
|
const { World } = await importEcs();
|
|
243
252
|
const C = await importComponents();
|
|
244
253
|
const world = new (World as new () => { spawn: (...componentDatas: unknown[]) => unknown })();
|
|
@@ -274,8 +283,8 @@ async function captureCascadeViewports(cascadeCount: number, mapSize: number): P
|
|
|
274
283
|
{ component: C.MeshRenderer, data: {} },
|
|
275
284
|
{ component: C.Transform, data: identityTransform() },
|
|
276
285
|
);
|
|
277
|
-
renderer.
|
|
278
|
-
if (!(renderer as unknown as RendererType).
|
|
286
|
+
renderer.subscribe(() => undefined);
|
|
287
|
+
if (!(renderer as unknown as RendererType).attach(world as WorldType).ok) {
|
|
279
288
|
throw new Error('World attachment failed');
|
|
280
289
|
}
|
|
281
290
|
(world as WorldType).update().unwrap();
|
|
@@ -291,13 +300,13 @@ function canonicalTile(layer: number, count: number): { col: number; row: number
|
|
|
291
300
|
}
|
|
292
301
|
|
|
293
302
|
// Read the WGSL the GPU actually compiles and evaluate its _atlasTileGrid
|
|
294
|
-
//
|
|
295
|
-
//
|
|
303
|
+
// column rule (select(2u, 1u, count<=1u)) so the sampler-side mapping is pinned
|
|
304
|
+
// to the real shader source, not a hand-copy.
|
|
296
305
|
const LIGHTING_WGSL = fileURLToPath(
|
|
297
306
|
new URL('../../../shader/src/lighting-directional.wgsl', import.meta.url),
|
|
298
307
|
);
|
|
299
308
|
|
|
300
|
-
function
|
|
309
|
+
function wgslAtlasTilesPerSide(count: number): number {
|
|
301
310
|
const src = readFileSync(LIGHTING_WGSL, 'utf8');
|
|
302
311
|
// The shader rule lives in _atlasTileGrid: columns = select(2u,1u,count<=1u).
|
|
303
312
|
// We assert that exact expression is present, then evaluate it here.
|
|
@@ -307,13 +316,12 @@ function wgslAtlasGrid(count: number): { columns: number; rows: number } {
|
|
|
307
316
|
'lighting-directional.wgsl _atlasTileGrid columns rule changed; update AC-04 test',
|
|
308
317
|
);
|
|
309
318
|
}
|
|
310
|
-
|
|
311
|
-
return { columns, rows: Math.ceil(count / columns) };
|
|
319
|
+
return count <= 1 ? 1 : 2;
|
|
312
320
|
}
|
|
313
321
|
|
|
314
322
|
function wgslAtlasTile(layer: number, count: number): { col: number; row: number } {
|
|
315
|
-
const
|
|
316
|
-
return { col: layer %
|
|
323
|
+
const tilesPerSide = wgslAtlasTilesPerSide(count);
|
|
324
|
+
return { col: layer % tilesPerSide, row: Math.floor(layer / tilesPerSide) };
|
|
317
325
|
}
|
|
318
326
|
|
|
319
327
|
describe('CSM cascade tile / matrix / viewport three-way agreement (AC-04, AC-06)', () => {
|
|
@@ -355,18 +363,16 @@ describe('CSM cascade tile / matrix / viewport three-way agreement (AC-04, AC-06
|
|
|
355
363
|
|
|
356
364
|
// (3) matrix slot: layer index maps 1:1 to lightViewProj_A..D, so the
|
|
357
365
|
// slot index IS the layer. The depth pass uses cascadeIndex=layer to
|
|
358
|
-
// pick the same matrix
|
|
366
|
+
// pick the same matrix used by the typed shadow cascade at index i.
|
|
359
367
|
const matrixSlot = layer;
|
|
360
|
-
const producerViewport = directionalCascadeRasterViewport(layer, count, mapSize);
|
|
361
368
|
|
|
362
369
|
// Three-way: all point at the same tile, and the matrix slot is the
|
|
363
370
|
// layer that produced it.
|
|
364
371
|
expect(depthTile).toEqual(samplerTile);
|
|
365
372
|
expect(depthTile).toEqual(canonicalTile(layer, count));
|
|
366
|
-
expect(vp).toEqual(producerViewport);
|
|
367
373
|
expect(matrixSlot).toBe(layer);
|
|
368
374
|
}
|
|
369
|
-
});
|
|
375
|
+
}, 30_000);
|
|
370
376
|
}
|
|
371
377
|
|
|
372
378
|
it('AC-06: count=1 collapses to tile (0,0), matrix slot 0, viewport (0,0)', async () => {
|
|
@@ -377,7 +383,7 @@ describe('CSM cascade tile / matrix / viewport three-way agreement (AC-04, AC-06
|
|
|
377
383
|
expect(vp).toEqual({ x: 0, y: 0, w: mapSize, h: mapSize });
|
|
378
384
|
expect(wgslAtlasTile(0, 1)).toEqual({ col: 0, row: 0 });
|
|
379
385
|
expect(canonicalTile(0, 1)).toEqual({ col: 0, row: 0 });
|
|
380
|
-
});
|
|
386
|
+
}, 30_000);
|
|
381
387
|
});
|
|
382
388
|
|
|
383
389
|
// AC-07 (9-tap PCF offset coordinate-system self-consistency).
|
|
@@ -412,8 +418,8 @@ describe('AC-07: PCF offset coordinate-system self-consistency (static source ch
|
|
|
412
418
|
// of kernels {1,3,5} in-tile).
|
|
413
419
|
expect(src).toMatch(/let\s+tileLo\s*=\s*tileOrigin\s*\+\s*texel/);
|
|
414
420
|
expect(src).toMatch(/let\s+tileHi\s*=\s*tileOrigin\s*\+\s*tileScale\s*-\s*texel/);
|
|
415
|
-
// count=1 =>
|
|
421
|
+
// count=1 => columns=1 => tileScale=(1,1), tileOrigin=(0,0) => uv === tileUv, so
|
|
416
422
|
// the OOB guard space and sample space coincide regardless of the clamp.
|
|
417
|
-
expect(
|
|
423
|
+
expect(wgslAtlasTilesPerSide(1)).toBe(1);
|
|
418
424
|
});
|
|
419
425
|
});
|
|
@@ -5,20 +5,22 @@
|
|
|
5
5
|
// back. Validates lightViewProj[4] + splitPlanes[4] + cascadeCount/cascadeBlend
|
|
6
6
|
// survive the queue.writeBuffer round-trip without corruption.
|
|
7
7
|
//
|
|
8
|
-
// Layout matches shadow-csm-ubo.test.ts —
|
|
8
|
+
// Layout matches shadow-csm-ubo.test.ts — 196 f32 / 784 B std140 after
|
|
9
9
|
// feat-20260625 w25 folded the spot lightViewProj array into the View UBO tail.
|
|
10
10
|
// The directional cascade offsets [0..125] this test exercises are unchanged;
|
|
11
11
|
// the extra tail (floats 132..195) stays zero in this round-trip.
|
|
12
12
|
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
13
|
+
// Red phase: common.wgsl still has lightSpaceMatrix (not lightViewProj array);
|
|
14
|
+
// record.ts still writes single lightSpaceMatrix. This test writes the NEW
|
|
15
|
+
// layout directly and reads back independently — it will be red until w16/w25
|
|
16
|
+
// land.
|
|
15
17
|
|
|
16
18
|
import { describe, expect, it } from 'vitest';
|
|
17
19
|
|
|
18
20
|
// ── Constants (mirrors current View UBO layout) ─────────────────────────────
|
|
19
21
|
|
|
20
|
-
const VIEW_UBO_FLOAT_COUNT =
|
|
21
|
-
const VIEW_UBO_BYTES =
|
|
22
|
+
const VIEW_UBO_FLOAT_COUNT = 196;
|
|
23
|
+
const VIEW_UBO_BYTES = 784;
|
|
22
24
|
|
|
23
25
|
// f32 indices matching std140 byte offsets.
|
|
24
26
|
const OFF = {
|
|
@@ -33,10 +35,6 @@ const OFF = {
|
|
|
33
35
|
SP3: 120, // splitPlanes[3] — byte 480
|
|
34
36
|
CC: 124, // cascadeCount — byte 496
|
|
35
37
|
CB: 125, // cascadeBlend — byte 500
|
|
36
|
-
FOG_COLOR: 232, // fog.color.xyz — byte 928
|
|
37
|
-
FOG_DENSITY: 235, // fog.density — byte 940
|
|
38
|
-
FOG_HEIGHT_FALLOFF: 236, // fog.heightFalloff — byte 944
|
|
39
|
-
FOG_MAX_OPACITY: 237, // fog.maxOpacity — byte 948
|
|
40
38
|
} as const;
|
|
41
39
|
|
|
42
40
|
const GPUMapMode: { readonly READ: number } = ((): { readonly READ: number } => {
|
|
@@ -68,17 +66,8 @@ const UNIFORM = 0x0040; // GPUBufferUsage.UNIFORM
|
|
|
68
66
|
// biome-ignore lint/suspicious/noExplicitAny: dawn-node detection guard
|
|
69
67
|
const dawnReady = typeof navigator !== 'undefined' && (navigator as any).gpu !== undefined;
|
|
70
68
|
|
|
71
|
-
const commonViewSource = await (async () => {
|
|
72
|
-
const { readFile } = await import('node:fs/promises');
|
|
73
|
-
const { fileURLToPath } = await import('node:url');
|
|
74
|
-
return readFile(
|
|
75
|
-
fileURLToPath(new URL('../../../shader/src/common.wgsl', import.meta.url)),
|
|
76
|
-
'utf8',
|
|
77
|
-
);
|
|
78
|
-
})();
|
|
79
|
-
|
|
80
69
|
/**
|
|
81
|
-
* Build a
|
|
70
|
+
* Build a 196-float View UBO payload with known test values.
|
|
82
71
|
* All 4 lightViewProj matrices are identity; splitPlanes use
|
|
83
72
|
* monotonic values; cascadeCount=4, cascadeBlend=0.2.
|
|
84
73
|
*/
|
|
@@ -119,14 +108,6 @@ function buildTestPayload(cascadeCount: number, cascadeBlend: number): Float32Ar
|
|
|
119
108
|
f32[OFF.CC] = cascadeCount;
|
|
120
109
|
f32[OFF.CB] = cascadeBlend;
|
|
121
110
|
|
|
122
|
-
// Fog payload occupies the tail of the same View uniform slot.
|
|
123
|
-
f32[OFF.FOG_COLOR] = 0.2;
|
|
124
|
-
f32[OFF.FOG_COLOR + 1] = 0.4;
|
|
125
|
-
f32[OFF.FOG_COLOR + 2] = 0.8;
|
|
126
|
-
f32[OFF.FOG_DENSITY] = 0.035;
|
|
127
|
-
f32[OFF.FOG_HEIGHT_FALLOFF] = 0.28;
|
|
128
|
-
f32[OFF.FOG_MAX_OPACITY] = 0.92;
|
|
129
|
-
|
|
130
111
|
return f32;
|
|
131
112
|
}
|
|
132
113
|
|
|
@@ -194,14 +175,6 @@ describe('View UBO CSM round-trip (w15)', () => {
|
|
|
194
175
|
// Verify lightViewProj[3] diagonal element.
|
|
195
176
|
expect(readback[OFF.LVP3 + 10]).toBeCloseTo(0.4, 5);
|
|
196
177
|
|
|
197
|
-
// Verify Fog remains in the same View slot after the CSM tail.
|
|
198
|
-
expect(readback[OFF.FOG_COLOR]).toBeCloseTo(0.2, 5);
|
|
199
|
-
expect(readback[OFF.FOG_COLOR + 1]).toBeCloseTo(0.4, 5);
|
|
200
|
-
expect(readback[OFF.FOG_COLOR + 2]).toBeCloseTo(0.8, 5);
|
|
201
|
-
expect(readback[OFF.FOG_DENSITY]).toBeCloseTo(0.035, 5);
|
|
202
|
-
expect(readback[OFF.FOG_HEIGHT_FALLOFF]).toBeCloseTo(0.28, 5);
|
|
203
|
-
expect(readback[OFF.FOG_MAX_OPACITY]).toBeCloseTo(0.92, 5);
|
|
204
|
-
|
|
205
178
|
staging.unmap();
|
|
206
179
|
staging.destroy();
|
|
207
180
|
stagingUpload.destroy();
|
|
@@ -277,17 +250,3 @@ describe('View UBO CSM round-trip (w15)', () => {
|
|
|
277
250
|
});
|
|
278
251
|
});
|
|
279
252
|
});
|
|
280
|
-
|
|
281
|
-
describe('Fog View ABI Dawn transport shape (M2)', () => {
|
|
282
|
-
it('uses the expanded View slot for the Fog payload', () => {
|
|
283
|
-
expect(VIEW_UBO_FLOAT_COUNT).toBe(240);
|
|
284
|
-
expect(VIEW_UBO_BYTES).toBe(960);
|
|
285
|
-
expect(VIEW_UBO_BYTES).toBeLessThanOrEqual(1024);
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
it('keeps Fog as a field of the existing View uniform binding', () => {
|
|
289
|
-
expect(commonViewSource).toContain('fog : FogViewParams');
|
|
290
|
-
expect(commonViewSource).toContain('@group(0) @binding(0) var<uniform> view : View;');
|
|
291
|
-
expect(commonViewSource).not.toContain('@group(0) @binding(10)');
|
|
292
|
-
});
|
|
293
|
-
});
|
|
@@ -260,15 +260,13 @@ describe('pcfKernelSize tail-pad slot wiring (M0, AC-14)', () => {
|
|
|
260
260
|
);
|
|
261
261
|
});
|
|
262
262
|
|
|
263
|
-
it('record
|
|
263
|
+
it('record carries the folded spot matrices in the complete View UBO payload (w25)', () => {
|
|
264
264
|
// feat-20260625 w25: the per-spot fragment-read lightViewProj matrices fold
|
|
265
|
-
// into the View UBO tail
|
|
266
|
-
//
|
|
265
|
+
// into the View UBO tail. The current View struct also carries temporal and
|
|
266
|
+
// fog fields, so the complete payload is 240 floats.
|
|
267
267
|
expect(recordSrc).toMatch(/VIEW_PAYLOAD_FLOATS\s*=\s*240/);
|
|
268
268
|
// The spot matrix array is written at base float 132.
|
|
269
269
|
expect(recordSrc).toMatch(/SPOT_LVP_BASE_FLOAT\s*=\s*132/);
|
|
270
|
-
expect(recordSrc).toContain('viewPayload[196 + index]');
|
|
271
|
-
expect(recordSrc).toContain('viewPayload[212 + index]');
|
|
272
270
|
});
|
|
273
271
|
|
|
274
272
|
it('common.wgsl View struct declares depthBias/normalBias/pcfKernelSize after cascadeBlend', () => {
|
|
@@ -278,23 +276,3 @@ describe('pcfKernelSize tail-pad slot wiring (M0, AC-14)', () => {
|
|
|
278
276
|
expect(m).not.toBeNull();
|
|
279
277
|
});
|
|
280
278
|
});
|
|
281
|
-
|
|
282
|
-
describe('Fog View ABI host shape (M2)', () => {
|
|
283
|
-
const recordSrc = readFileSync(
|
|
284
|
-
fileURLToPath(new URL('../../../render/src/record/view-ubo.ts', import.meta.url)),
|
|
285
|
-
'utf8',
|
|
286
|
-
);
|
|
287
|
-
|
|
288
|
-
it('uses the current host payload shape rather than the stale 784 B prefix', () => {
|
|
289
|
-
expect(recordSrc).toMatch(/VIEW_UNIFORM_BYTES\s*=\s*960/);
|
|
290
|
-
expect(recordSrc).toMatch(/VIEW_PAYLOAD_FLOATS\s*=\s*240/);
|
|
291
|
-
expect(recordSrc).not.toContain('VIEW_UNIFORM_BYTES = 928');
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
it('packs all four Fog parameters in the View write path', () => {
|
|
295
|
-
expect(recordSrc).toContain('fog.color');
|
|
296
|
-
expect(recordSrc).toContain('fog.density');
|
|
297
|
-
expect(recordSrc).toContain('fog.heightFalloff');
|
|
298
|
-
expect(recordSrc).toContain('fog.maxOpacity');
|
|
299
|
-
});
|
|
300
|
-
});
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// setViewport against atlas-sized target), so this browser test covers the
|
|
8
8
|
// real GPU path.
|
|
9
9
|
//
|
|
10
|
-
// AC-05: atlas tile viewports; D-5: cascadeCount=4
|
|
10
|
+
// AC-05: atlas tile viewports; D-5: cascadeCount=4 -> 4 typed shadow passes;
|
|
11
11
|
// D-6: pass names shadowCascade0..3.
|
|
12
12
|
|
|
13
13
|
import { describe, expect, it } from 'vitest';
|
|
@@ -8,24 +8,25 @@
|
|
|
8
8
|
// ShadowCaster pass (nothing written into shadow depth atlas), (b) floor
|
|
9
9
|
// position outside camera frustum. Both fixed in the harness below.
|
|
10
10
|
//
|
|
11
|
-
// Each pixel A/B pair gets its own `it()` with a fresh
|
|
11
|
+
// Each pixel A/B pair gets its own `it()` with a fresh runtime host --
|
|
12
12
|
// shadow-atlas state and device-lost crashes from prior A/B rounds cannot
|
|
13
13
|
// contaminate the current comparison.
|
|
14
14
|
|
|
15
|
+
import { HANDLE_CUBE } from '@forgeax/engine-assets-runtime';
|
|
15
16
|
import { World } from '@forgeax/engine-ecs';
|
|
16
|
-
import {
|
|
17
|
+
import type { Renderer } from '@forgeax/engine-render';
|
|
17
18
|
import {
|
|
18
19
|
Camera,
|
|
19
20
|
DirectionalLight,
|
|
20
21
|
Instances,
|
|
21
22
|
MeshFilter,
|
|
22
23
|
MeshRenderer,
|
|
23
|
-
|
|
24
|
-
} from '@forgeax/engine-render/internal';
|
|
25
|
-
import { createRenderer } from '@forgeax/engine-runtime';
|
|
24
|
+
} from '@forgeax/engine-render';
|
|
26
25
|
import { Transform } from '@forgeax/engine-scene';
|
|
27
26
|
import type { MaterialAsset } from '@forgeax/engine-types';
|
|
28
27
|
import { describe, expect, it } from 'vitest';
|
|
28
|
+
import { validateDirectionalLightData } from '../../../render/src/components/light-helpers';
|
|
29
|
+
import { constructRuntimeRendererHost } from '../renderer-host';
|
|
29
30
|
import { drawPublished } from './draw-published';
|
|
30
31
|
|
|
31
32
|
const WIDTH = 256;
|
|
@@ -128,7 +129,6 @@ function spawnScene(
|
|
|
128
129
|
) {
|
|
129
130
|
const cm = casterMat(world);
|
|
130
131
|
const fm = floorMat(world);
|
|
131
|
-
const cubeHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
|
|
132
132
|
world.spawn(
|
|
133
133
|
{
|
|
134
134
|
component: Transform,
|
|
@@ -138,7 +138,7 @@ function spawnScene(
|
|
|
138
138
|
scale: [8, 0.1, 8],
|
|
139
139
|
},
|
|
140
140
|
},
|
|
141
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
141
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
|
|
142
142
|
{ component: MeshRenderer, data: { materials: [fm] } },
|
|
143
143
|
);
|
|
144
144
|
world.spawn(
|
|
@@ -184,7 +184,7 @@ function spawnScene(
|
|
|
184
184
|
scale: [0.5, 0.5, 0.5],
|
|
185
185
|
},
|
|
186
186
|
},
|
|
187
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
187
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
|
|
188
188
|
{ component: MeshRenderer, data: { materials: [cm] } },
|
|
189
189
|
{ component: Instances, data: { transforms: buildTranslationGrid() } },
|
|
190
190
|
);
|
|
@@ -272,16 +272,23 @@ async function renderConfig(
|
|
|
272
272
|
removeEventListener() {},
|
|
273
273
|
} as unknown as HTMLCanvasElement;
|
|
274
274
|
|
|
275
|
-
let renderer:
|
|
275
|
+
let renderer: Renderer | undefined;
|
|
276
276
|
try {
|
|
277
277
|
try {
|
|
278
|
-
|
|
278
|
+
const host = await constructRuntimeRendererHost(
|
|
279
|
+
mc,
|
|
280
|
+
{},
|
|
281
|
+
{
|
|
282
|
+
shaderManifestUrl: ENGINE_MANIFEST_URL,
|
|
283
|
+
},
|
|
284
|
+
);
|
|
285
|
+
if (!host.ok) throw host.error;
|
|
286
|
+
renderer = host.value.renderer;
|
|
279
287
|
} finally {
|
|
280
288
|
globalThis.navigator.gpu.requestAdapter = _s;
|
|
281
289
|
}
|
|
282
290
|
if (renderer === undefined) throw new Error('renderer not initialized');
|
|
283
|
-
|
|
284
|
-
if (!ready.ok) throw ready.error;
|
|
291
|
+
if (renderer.inspect().state !== 'alive') throw new Error('renderer not alive');
|
|
285
292
|
if (sd === undefined) throw new Error('device not initialized');
|
|
286
293
|
const dev = sd;
|
|
287
294
|
|
|
@@ -386,16 +393,23 @@ async function renderConfigWithSpy(
|
|
|
386
393
|
removeEventListener() {},
|
|
387
394
|
} as unknown as HTMLCanvasElement;
|
|
388
395
|
|
|
389
|
-
let renderer:
|
|
396
|
+
let renderer: Renderer | undefined;
|
|
390
397
|
try {
|
|
391
398
|
try {
|
|
392
|
-
|
|
399
|
+
const host = await constructRuntimeRendererHost(
|
|
400
|
+
mc,
|
|
401
|
+
{},
|
|
402
|
+
{
|
|
403
|
+
shaderManifestUrl: ENGINE_MANIFEST_URL,
|
|
404
|
+
},
|
|
405
|
+
);
|
|
406
|
+
if (!host.ok) throw host.error;
|
|
407
|
+
renderer = host.value.renderer;
|
|
393
408
|
} finally {
|
|
394
409
|
globalThis.navigator.gpu.requestAdapter = _s;
|
|
395
410
|
}
|
|
396
411
|
if (renderer === undefined) throw new Error('renderer not initialized');
|
|
397
|
-
|
|
398
|
-
if (!ready.ok) throw ready.error;
|
|
412
|
+
if (renderer.inspect().state !== 'alive') throw new Error('renderer not alive');
|
|
399
413
|
if (sd === undefined) throw new Error('device not initialized');
|
|
400
414
|
const dev = sd;
|
|
401
415
|
|
|
@@ -452,46 +466,43 @@ describe('M6 shadow fields observability', () => {
|
|
|
452
466
|
|
|
453
467
|
// --- Gate D: validate() rejections ---
|
|
454
468
|
it('validate() accepts pcfKernelSize=9 (odd), rejects 2 (even) and 0', () => {
|
|
455
|
-
const
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
pcfKernelSize: 0,
|
|
493
|
-
})?.code,
|
|
494
|
-
).toBe('shadow-invalid-config');
|
|
469
|
+
const valid = validateDirectionalLightData({
|
|
470
|
+
direction: [0, -1, 0],
|
|
471
|
+
castShadow: true,
|
|
472
|
+
cascadeCount: 4,
|
|
473
|
+
splitLambda: 0.75,
|
|
474
|
+
cascadeBlend: 0.2,
|
|
475
|
+
mapSize: 2048,
|
|
476
|
+
shadowDistance: 50,
|
|
477
|
+
pcfKernelSize: 9,
|
|
478
|
+
});
|
|
479
|
+
expect(valid.ok).toBe(true);
|
|
480
|
+
|
|
481
|
+
const even = validateDirectionalLightData({
|
|
482
|
+
direction: [0, -1, 0],
|
|
483
|
+
castShadow: true,
|
|
484
|
+
cascadeCount: 4,
|
|
485
|
+
splitLambda: 0.75,
|
|
486
|
+
cascadeBlend: 0.2,
|
|
487
|
+
mapSize: 2048,
|
|
488
|
+
shadowDistance: 50,
|
|
489
|
+
pcfKernelSize: 2,
|
|
490
|
+
});
|
|
491
|
+
expect(even.ok).toBe(false);
|
|
492
|
+
if (!even.ok) expect(even.error.code).toBe('shadow-invalid-config');
|
|
493
|
+
|
|
494
|
+
const zero = validateDirectionalLightData({
|
|
495
|
+
direction: [0, -1, 0],
|
|
496
|
+
castShadow: true,
|
|
497
|
+
cascadeCount: 4,
|
|
498
|
+
splitLambda: 0.75,
|
|
499
|
+
cascadeBlend: 0.2,
|
|
500
|
+
mapSize: 2048,
|
|
501
|
+
shadowDistance: 50,
|
|
502
|
+
pcfKernelSize: 0,
|
|
503
|
+
});
|
|
504
|
+
expect(zero.ok).toBe(false);
|
|
505
|
+
if (!zero.ok) expect(zero.error.code).toBe('shadow-invalid-config');
|
|
495
506
|
});
|
|
496
507
|
|
|
497
508
|
// --- Gate C: pixel A/B — castShadow ON vs OFF (control) ---
|
|
@@ -86,19 +86,18 @@ describe('shadow M1a dawn (w2 RED)', () => {
|
|
|
86
86
|
// lightSpaceMatrix is a 16-element f32 array, col-major mat4.
|
|
87
87
|
// With non-degenerate direction, element-wise epsilon <= 1e-5.
|
|
88
88
|
expect(refMat.length).toBe(16);
|
|
89
|
-
// AC-11 lightSpaceMatrix shape verified
|
|
90
|
-
// computation
|
|
91
|
-
//
|
|
92
|
-
// (AC-10/11 canonical coverage via debugReadback + debugSampleShadowFactor).
|
|
89
|
+
// AC-11 lightSpaceMatrix shape is verified by the host-side reference
|
|
90
|
+
// computation; the real GPU shadow graph is covered by the current
|
|
91
|
+
// Standard Dawn shadow suites.
|
|
93
92
|
});
|
|
94
93
|
});
|
|
95
94
|
|
|
96
|
-
// ── AC-10:
|
|
97
|
-
describe('AC-10
|
|
98
|
-
it('
|
|
95
|
+
// ── AC-10: shadow fixture shape ───────────────────────────────────────
|
|
96
|
+
describe('AC-10 shadow fixture shape', () => {
|
|
97
|
+
it('keeps the canonical shadow map size for Standard graph coverage', () => {
|
|
99
98
|
// M1 scope: verify the fixture constant matches expected value.
|
|
100
|
-
// Real GPU
|
|
101
|
-
//
|
|
99
|
+
// Real GPU behavior is covered by the current Standard Dawn shadow
|
|
100
|
+
// graph and pixel-observation suites.
|
|
102
101
|
expect(FIXTURE_MAP_SIZE).toBe(1024);
|
|
103
102
|
});
|
|
104
103
|
});
|