@forgeax/engine-runtime 0.1.4 → 0.1.6
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 +49 -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 +3 -3
- 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 +19 -81
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +105 -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 +575 -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 +0 -18
- 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 +1203 -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 +16 -500
- 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 +14 -21
- 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 +81 -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 +60 -558
- 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 +59 -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 +43 -261
- 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 +12 -11
- 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 +64 -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 +28 -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 +47 -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
|
@@ -7,20 +7,30 @@
|
|
|
7
7
|
// Anchors: requirements AC-13 (Renderer.draw/ready Result form);
|
|
8
8
|
// plan-strategy D-P7 break-point #4; w23 test SSOT.
|
|
9
9
|
|
|
10
|
-
import type {
|
|
11
|
-
|
|
10
|
+
import type {
|
|
11
|
+
FrameReceipt,
|
|
12
|
+
RenderError,
|
|
13
|
+
Renderer,
|
|
14
|
+
RenderFrameInput,
|
|
15
|
+
RenderResult,
|
|
16
|
+
RenderWorldLease,
|
|
17
|
+
} from '@forgeax/engine-render';
|
|
12
18
|
import { describe, expectTypeOf, it } from 'vitest';
|
|
13
19
|
|
|
14
|
-
describe('
|
|
15
|
-
it('Renderer.draw(
|
|
20
|
+
describe('M6 — Renderer.draw returns Result<FrameReceipt, RenderError>', () => {
|
|
21
|
+
it('Renderer.draw(request) return type is Result<FrameReceipt, RenderError>', () => {
|
|
16
22
|
type RetType = ReturnType<Renderer['draw']>;
|
|
17
|
-
expectTypeOf<RetType>().toEqualTypeOf<RenderResult<
|
|
23
|
+
expectTypeOf<RetType>().toEqualTypeOf<RenderResult<FrameReceipt, RenderError>>();
|
|
18
24
|
});
|
|
19
25
|
});
|
|
20
26
|
|
|
21
|
-
describe('
|
|
22
|
-
it('Renderer.
|
|
23
|
-
type
|
|
24
|
-
|
|
27
|
+
describe('M6 — Renderer.attach returns a lease and draw consumes it', () => {
|
|
28
|
+
it('Renderer.attach returns RenderWorldLease and draw consumes RenderFrameInput', () => {
|
|
29
|
+
type AttachType = Renderer['attach'];
|
|
30
|
+
type DrawArg = Parameters<Renderer['draw']>[0];
|
|
31
|
+
expectTypeOf<AttachType>().returns.toEqualTypeOf<
|
|
32
|
+
RenderResult<RenderWorldLease, import('@forgeax/engine-render').RenderError>
|
|
33
|
+
>();
|
|
34
|
+
expectTypeOf<DrawArg>().toEqualTypeOf<RenderFrameInput>();
|
|
25
35
|
});
|
|
26
36
|
});
|
|
@@ -6,14 +6,15 @@
|
|
|
6
6
|
//
|
|
7
7
|
// Tests drive recordFrame() directly with mock internals. All mock objects
|
|
8
8
|
// are typed through `any` to avoid constructing full RhiDevice / PipelineState /
|
|
9
|
-
// AssetRegistry /
|
|
9
|
+
// AssetRegistry / GpuResidencyCache objects (each is ~50+ fields with branded
|
|
10
10
|
// opaque types). The test surface is the recordFrame function — verify that
|
|
11
11
|
// getCurrentTexture failure triggers reconfigure+retry and that consecutive
|
|
12
12
|
// failures escalate to health internal-fault.
|
|
13
13
|
|
|
14
|
-
import { acquireSwapChainTarget, HealthListenerRegistry } from '@forgeax/engine-render/internal';
|
|
15
14
|
import { RhiError } from '@forgeax/engine-rhi';
|
|
16
15
|
import { describe, expect, it } from 'vitest';
|
|
16
|
+
import { HealthListenerRegistry } from '../../../render/src/lifecycle';
|
|
17
|
+
import { acquireSwapChainTarget } from '../../../render/src/record/frame-targets';
|
|
17
18
|
|
|
18
19
|
// biome-ignore lint/suspicious/noExplicitAny: mock objects are intentionally opaque in test code
|
|
19
20
|
type MockObj = Record<string, any>;
|
|
@@ -24,9 +25,6 @@ function makePipelineState(): MockObj {
|
|
|
24
25
|
format: 'bgra8unorm',
|
|
25
26
|
colorAttachmentFormat: 'bgra8unorm-srgb',
|
|
26
27
|
standardPipeline: { __brand: 'RP' },
|
|
27
|
-
standardPipelineHdr: { __brand: 'RP' },
|
|
28
|
-
standardPipelineMsaa: { __brand: 'RP' },
|
|
29
|
-
standardPipelineHdrMsaa: { __brand: 'RP' },
|
|
30
28
|
unlitPipeline: { __brand: 'RP' },
|
|
31
29
|
unlitPipelineHdr: { __brand: 'RP' },
|
|
32
30
|
unlitPipelineMsaa: { __brand: 'RP' },
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { World } from '@forgeax/engine-ecs';
|
|
2
|
+
import type {
|
|
3
|
+
FrameReceipt,
|
|
4
|
+
RenderError,
|
|
5
|
+
Renderer,
|
|
6
|
+
RenderResult,
|
|
7
|
+
RenderWorldLease,
|
|
8
|
+
} from '@forgeax/engine-render';
|
|
9
|
+
import { createRenderer } from '../createRenderer';
|
|
10
|
+
|
|
11
|
+
export async function requireRenderer(
|
|
12
|
+
...args: Parameters<typeof createRenderer>
|
|
13
|
+
): Promise<Renderer> {
|
|
14
|
+
const result = await createRenderer(...args);
|
|
15
|
+
if (!result.ok) throw result.error;
|
|
16
|
+
return result.value;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const leasesByRenderer = new WeakMap<Renderer, Map<World, RenderWorldLease>>();
|
|
20
|
+
|
|
21
|
+
/** Adapt pre-lease multi-world fixtures to the public frame input contract. */
|
|
22
|
+
export function drawWithOwners(
|
|
23
|
+
renderer: Renderer,
|
|
24
|
+
worldsOrWorld: World | readonly World[],
|
|
25
|
+
options: { readonly cameraOwner?: number; readonly resourceOwner?: number } = {},
|
|
26
|
+
): RenderResult<FrameReceipt, RenderError> {
|
|
27
|
+
const worlds = Array.isArray(worldsOrWorld) ? worldsOrWorld : [worldsOrWorld];
|
|
28
|
+
let leases = leasesByRenderer.get(renderer);
|
|
29
|
+
if (leases === undefined) {
|
|
30
|
+
leases = new Map();
|
|
31
|
+
leasesByRenderer.set(renderer, leases);
|
|
32
|
+
}
|
|
33
|
+
const attached = worlds.map((world) => {
|
|
34
|
+
const existing = leases.get(world);
|
|
35
|
+
if (existing !== undefined) return existing;
|
|
36
|
+
const result = renderer.attach(world);
|
|
37
|
+
if (!result.ok) throw result.error;
|
|
38
|
+
leases.set(world, result.value);
|
|
39
|
+
return result.value;
|
|
40
|
+
});
|
|
41
|
+
const camera = worlds[options.cameraOwner ?? 0];
|
|
42
|
+
const environment = worlds[options.resourceOwner ?? 0];
|
|
43
|
+
if (camera === undefined || environment === undefined) {
|
|
44
|
+
throw new Error('drawWithOwners requires cameraOwner/resourceOwner worlds');
|
|
45
|
+
}
|
|
46
|
+
const cameraLease = leases.get(camera);
|
|
47
|
+
const environmentLease = leases.get(environment);
|
|
48
|
+
if (cameraLease === undefined || environmentLease === undefined) {
|
|
49
|
+
throw new Error('drawWithOwners failed to attach owner worlds');
|
|
50
|
+
}
|
|
51
|
+
return renderer.draw({
|
|
52
|
+
leases: attached,
|
|
53
|
+
camera: { lease: cameraLease },
|
|
54
|
+
environment: { lease: environmentLease },
|
|
55
|
+
});
|
|
56
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Renderer public-surface and event-contract type assertions.
|
|
2
|
+
|
|
3
|
+
import type { RenderError, Renderer, RendererEvent } from '@forgeax/engine-render';
|
|
4
|
+
|
|
5
|
+
type RendererEventListener = (event: RendererEvent) => void;
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
// @ts-expect-error - BundlerOptions is an internal construct seam
|
|
9
|
+
BundlerOptions as _BundlerOptionsRemoved,
|
|
10
|
+
// @ts-expect-error - ConsoleHandle must not be exported from @forgeax/engine-runtime
|
|
11
|
+
ConsoleHandle as _ConsoleHandleRemoved,
|
|
12
|
+
// @ts-expect-error - StartConsoleOptions must not be exported from @forgeax/engine-runtime
|
|
13
|
+
StartConsoleOptions as _StartConsoleOptionsRemoved,
|
|
14
|
+
} from '@forgeax/engine-runtime';
|
|
15
|
+
import { describe, expectTypeOf, it } from 'vitest';
|
|
16
|
+
|
|
17
|
+
type _UnusedSink = _StartConsoleOptionsRemoved | _ConsoleHandleRemoved | _BundlerOptionsRemoved;
|
|
18
|
+
|
|
19
|
+
describe('Renderer public surface', () => {
|
|
20
|
+
it('does not expose removed console or legacy listener members', () => {
|
|
21
|
+
// @ts-expect-error - startConsole is internal to the runtime host
|
|
22
|
+
type _StartConsoleAbsent = Renderer['startConsole'];
|
|
23
|
+
// @ts-expect-error - onLost was replaced by subscribe(RendererEventListener)
|
|
24
|
+
type _OnLostAbsent = Renderer['onLost'];
|
|
25
|
+
// @ts-expect-error - onError was replaced by subscribe(RendererEventListener)
|
|
26
|
+
type _OnErrorAbsent = Renderer['onError'];
|
|
27
|
+
void (undefined as unknown as _StartConsoleAbsent | _OnLostAbsent | _OnErrorAbsent);
|
|
28
|
+
|
|
29
|
+
type RendererKey = keyof Renderer;
|
|
30
|
+
expectTypeOf<'attach'>().toExtend<RendererKey>();
|
|
31
|
+
expectTypeOf<'draw'>().toExtend<RendererKey>();
|
|
32
|
+
expectTypeOf<'dispose'>().toExtend<RendererKey>();
|
|
33
|
+
expectTypeOf<'subscribe'>().toExtend<RendererKey>();
|
|
34
|
+
expectTypeOf<'observe'>().toExtend<RendererKey>();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
describe('subscribe projects the discriminated Renderer event contract', () => {
|
|
39
|
+
it('passes RendererEvent and exposes RenderError on the error arm', () => {
|
|
40
|
+
expectTypeOf<RendererEventListener>().parameter(0).toEqualTypeOf<RendererEvent>();
|
|
41
|
+
type ErrorEvent = Extract<RendererEvent, { readonly kind: 'error' }>;
|
|
42
|
+
expectTypeOf<ErrorEvent['error']>().toEqualTypeOf<RenderError>();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('keeps state changes and errors exhaustively distinguishable', () => {
|
|
46
|
+
const describeEvent = (event: RendererEvent): string => {
|
|
47
|
+
switch (event.kind) {
|
|
48
|
+
case 'state-changed':
|
|
49
|
+
return `${event.previous}->${event.current}`;
|
|
50
|
+
case 'error':
|
|
51
|
+
return event.error.code;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
expectTypeOf(describeEvent).returns.toEqualTypeOf<string>();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
declare const __sink: _UnusedSink | undefined;
|
|
59
|
+
void __sink;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// M5 w19: Type-level verification that resolveAssetHandle return type
|
|
2
|
+
// includes stale error codes and supports exhaustive switch.
|
|
3
|
+
//
|
|
4
|
+
// AC-10: adding a new stale error code reachable from resolve-asset-handle.ts
|
|
5
|
+
// will cause tsc to fail, serving as a regression guard.
|
|
6
|
+
//
|
|
7
|
+
// Note: uses `shared-ref-stale` as an instanceof-tested guard in a switch
|
|
8
|
+
// that must handle all AssetErrorCode members WITHOUT a default case.
|
|
9
|
+
// Because vitest typecheck.enabled is not set in runtime, we verify the
|
|
10
|
+
// structural type inclusion via instanceof narrowing paths.
|
|
11
|
+
//
|
|
12
|
+
// biome-ignore-all lint/suspicious/noExplicitAny: type-level extract + test seams
|
|
13
|
+
|
|
14
|
+
// Type-level re-export to verify stale error codes appear in resolveAssetHandle
|
|
15
|
+
// return type. The return type is `Result<T, AssetErrorType | SharedRefStaleError | UniqueRefStaleError>`.
|
|
16
|
+
// This test verifies structural narrowing works.
|
|
17
|
+
import type { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
|
|
18
|
+
import { describe, expect, it } from 'vitest';
|
|
19
|
+
|
|
20
|
+
// Extract the Error union from resolveAssetHandle return type at the
|
|
21
|
+
// type level — this is a compile-time assertion.
|
|
22
|
+
type ResolveErrCode =
|
|
23
|
+
Extract<ReturnType<typeof resolveAssetHandle<any>>, { ok: false }> extends {
|
|
24
|
+
error: infer E extends { code: string };
|
|
25
|
+
}
|
|
26
|
+
? E['code']
|
|
27
|
+
: never;
|
|
28
|
+
|
|
29
|
+
describe('resolveAssetHandle AC-10 stale error forwarding type gate', () => {
|
|
30
|
+
it('return type error union includes shared-ref-stale (compile-time)', () => {
|
|
31
|
+
// If shared-ref-stale is NOT in the union, the assignment below fails at tsc.
|
|
32
|
+
const _c1: ResolveErrCode = 'shared-ref-stale' as const;
|
|
33
|
+
void _c1;
|
|
34
|
+
expect(true).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('return type error union includes unique-ref-stale (compile-time)', () => {
|
|
38
|
+
const _c2: ResolveErrCode = 'unique-ref-stale' as const;
|
|
39
|
+
void _c2;
|
|
40
|
+
expect(true).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('return type error union includes asset-not-found (compile-time)', () => {
|
|
44
|
+
const _c3: ResolveErrCode = 'asset-not-found' as const;
|
|
45
|
+
void _c3;
|
|
46
|
+
expect(true).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('exhaustive switch over AssetErrorCode (runtime guard for AC-10)', () => {
|
|
50
|
+
// A real consumer pattern: switch over all AssetErrorCode members plus
|
|
51
|
+
// the stale codes forwarded by resolveAssetHandle. This is a runtime
|
|
52
|
+
// test that the switch compiles — if a code is missing, tsc errors.
|
|
53
|
+
function mapErrorCode(code: string): string {
|
|
54
|
+
switch (code) {
|
|
55
|
+
case 'asset-not-found':
|
|
56
|
+
return 'NOT_FOUND';
|
|
57
|
+
case 'asset-parse-failed':
|
|
58
|
+
return 'PARSE';
|
|
59
|
+
case 'asset-format-unsupported':
|
|
60
|
+
return 'FORMAT';
|
|
61
|
+
case 'asset-fetch-failed':
|
|
62
|
+
return 'FETCH';
|
|
63
|
+
case 'asset-invalid-value':
|
|
64
|
+
return 'INVALID';
|
|
65
|
+
case 'cubemap-handle-missing':
|
|
66
|
+
return 'CUBEMAP';
|
|
67
|
+
case 'invalid-source-format':
|
|
68
|
+
return 'SRC_FORMAT';
|
|
69
|
+
case 'load-failed':
|
|
70
|
+
return 'LOAD';
|
|
71
|
+
case 'device-unsupported':
|
|
72
|
+
return 'DEVICE';
|
|
73
|
+
case 'ibl-precompute-not-dispatched':
|
|
74
|
+
return 'IBL';
|
|
75
|
+
case 'mesh-vertex-stride-mismatch':
|
|
76
|
+
return 'STRIDE';
|
|
77
|
+
case 'material-shader-ref-broken':
|
|
78
|
+
return 'SHADER_REF';
|
|
79
|
+
case 'material-circular-inheritance':
|
|
80
|
+
return 'CIRCULAR';
|
|
81
|
+
case 'loader-not-registered':
|
|
82
|
+
return 'LOADER';
|
|
83
|
+
case 'asset-not-imported':
|
|
84
|
+
return 'NOT_IMPORTED';
|
|
85
|
+
case 'texture-source-not-imported':
|
|
86
|
+
return 'TEX_NOT_IMPORTED';
|
|
87
|
+
case 'mesh-renderer-material-count-mismatch':
|
|
88
|
+
return 'MAT_COUNT';
|
|
89
|
+
case 'mesh-asset-submeshes-empty':
|
|
90
|
+
return 'SUBMESH_EMPTY';
|
|
91
|
+
case 'mesh-submesh-index-range-out-of-bounds':
|
|
92
|
+
return 'SUBMESH_OOB';
|
|
93
|
+
case 'tileset-region-index-out-of-range':
|
|
94
|
+
return 'TILESET_OOB';
|
|
95
|
+
case 'tileset-tile-entry-malformed':
|
|
96
|
+
return 'TILESET_MALFORMED';
|
|
97
|
+
case 'asset-invalidated':
|
|
98
|
+
return 'INVALIDATED';
|
|
99
|
+
// AC-10: stale error codes forwarded by resolveAssetHandle.
|
|
100
|
+
case 'shared-ref-stale':
|
|
101
|
+
return 'STALE_SHARED';
|
|
102
|
+
case 'unique-ref-stale':
|
|
103
|
+
return 'STALE_UNIQUE';
|
|
104
|
+
}
|
|
105
|
+
throw new Error(`Unhandled error code: ${code}`);
|
|
106
|
+
}
|
|
107
|
+
expect(mapErrorCode('shared-ref-stale')).toBe('STALE_SHARED');
|
|
108
|
+
expect(mapErrorCode('unique-ref-stale')).toBe('STALE_UNIQUE');
|
|
109
|
+
expect(mapErrorCode('asset-not-found')).toBe('NOT_FOUND');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// M7 w55 / M8 w59: resolveAssetHandle two-tier dispatch unit test.
|
|
2
|
+
//
|
|
3
|
+
// D-15 two-tier asset resolution: resolveAssetHandle(world, handle) dispatches
|
|
4
|
+
// by slot range — builtin slots (< BUILTIN_BASE) resolve through
|
|
5
|
+
// BuiltinAssetRegistry.resolve (process-static, no World needed); user-tier
|
|
6
|
+
// slots (>= BUILTIN_BASE) resolve through world.sharedRefs (minted via
|
|
7
|
+
// world.allocSharedRef). The AssetRegistry holds no handle->payload map.
|
|
8
|
+
|
|
9
|
+
import { BUILTIN_CUBE, HANDLE_CUBE, resolveAssetHandle } from '@forgeax/engine-assets-runtime';
|
|
10
|
+
import { World } from '@forgeax/engine-ecs';
|
|
11
|
+
import type { MeshAsset } from '@forgeax/engine-types';
|
|
12
|
+
import { BUILTIN_BASE } from '@forgeax/engine-types';
|
|
13
|
+
import { describe, expect, it } from 'vitest';
|
|
14
|
+
|
|
15
|
+
function mesh(): MeshAsset {
|
|
16
|
+
return {
|
|
17
|
+
kind: 'mesh',
|
|
18
|
+
vertices: new Float32Array([0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1]),
|
|
19
|
+
indices: new Uint16Array([0]),
|
|
20
|
+
attributes: {},
|
|
21
|
+
submeshes: [
|
|
22
|
+
{
|
|
23
|
+
indexOffset: 0,
|
|
24
|
+
indexCount: 1,
|
|
25
|
+
vertexCount: 12,
|
|
26
|
+
topology: 'triangle-list' as const,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
} as unknown as MeshAsset;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe('resolveAssetHandle two-tier slot-range dispatch (AC-31)', () => {
|
|
33
|
+
it('builtin slot (< BUILTIN_BASE): resolves through BuiltinAssetRegistry', () => {
|
|
34
|
+
// HANDLE_CUBE has slot=1 < BUILTIN_BASE=1024.
|
|
35
|
+
// Builtins are process-static — the World is unused for this path.
|
|
36
|
+
const world = new World();
|
|
37
|
+
const res = resolveAssetHandle(world, HANDLE_CUBE);
|
|
38
|
+
expect(res.ok).toBe(true);
|
|
39
|
+
if (res.ok) expect(res.value).toBe(BUILTIN_CUBE);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('user-tier slot (>= BUILTIN_BASE): resolves through world.sharedRefs', () => {
|
|
43
|
+
// User-tier payloads live in the per-World SharedRefStore, minted via
|
|
44
|
+
// world.allocSharedRef. resolveAssetHandle routes user-tier slots there.
|
|
45
|
+
const world = new World();
|
|
46
|
+
const payload = mesh();
|
|
47
|
+
const handle = world.allocSharedRef('MeshAsset', payload);
|
|
48
|
+
expect(handle).toBeGreaterThanOrEqual(BUILTIN_BASE);
|
|
49
|
+
const res = resolveAssetHandle<MeshAsset>(world, handle);
|
|
50
|
+
expect(res.ok).toBe(true);
|
|
51
|
+
if (res.ok) expect(res.value).toBe(payload);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('user-tier handle not in this World returns asset-not-found', () => {
|
|
55
|
+
// A handle minted in a DIFFERENT world is absent from this world's
|
|
56
|
+
// SharedRefStore — resolveAssetHandle must return err(asset-not-found).
|
|
57
|
+
const world = new World();
|
|
58
|
+
const foreign = new World();
|
|
59
|
+
const foreignHandle = foreign.allocSharedRef('MeshAsset', mesh());
|
|
60
|
+
const res = resolveAssetHandle(world, foreignHandle);
|
|
61
|
+
expect(res.ok).toBe(false);
|
|
62
|
+
if (!res.ok) expect(res.error.code).toBe('asset-not-found');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -31,7 +31,7 @@ await vi.hoisted(async () => {
|
|
|
31
31
|
|
|
32
32
|
// Import the render-graph-primitives module to extract the functions under test.
|
|
33
33
|
// We can reach them through the resolved module namespace.
|
|
34
|
-
const mod = await import('
|
|
34
|
+
const mod = await import('../../../render/src/render-graph-primitives');
|
|
35
35
|
// resolveDepthOnlyView is exported; resolveHdrDepthDepthOnlyView is not.
|
|
36
36
|
// We can test the delegate equivalence by calling resolveDepthOnlyView with
|
|
37
37
|
// the SSAO label, which is the exact body of the delegate.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// AC-15 deterministic name fallback — runtime integration (feat-20260618 w19).
|
|
2
|
+
//
|
|
3
|
+
// deriveAssetName's branch logic is unit-tested in @forgeax/engine-pack (w8);
|
|
4
|
+
// this test exercises the runtime wiring (resolveName passing the right args).
|
|
5
|
+
//
|
|
6
|
+
// Coverage:
|
|
7
|
+
// AC-15.1 — multi-asset package entry with no stored name -> basename(path),
|
|
8
|
+
// no throw (old add-only packs are a reachable state).
|
|
9
|
+
// AC-15.2 — null package with no stored name -> '' (the detectable
|
|
10
|
+
// "genuinely no name" signal), no throw.
|
|
11
|
+
// D-5 — builtin meshes resolve to '' (null package, no name).
|
|
12
|
+
|
|
13
|
+
import { AssetRegistry } from '@forgeax/engine-assets-runtime';
|
|
14
|
+
import { AssetGuid } from '@forgeax/engine-pack/guid';
|
|
15
|
+
import type { SamplerAsset } from '@forgeax/engine-types';
|
|
16
|
+
import { describe, expect, it } from 'vitest';
|
|
17
|
+
import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
|
|
18
|
+
|
|
19
|
+
const MULTI_A = 'e0000000-0000-4000-e000-000000000001';
|
|
20
|
+
const MULTI_B = 'e0000000-0000-4000-e000-000000000002';
|
|
21
|
+
const NO_PKG = 'e0000000-0000-4000-e000-000000000003';
|
|
22
|
+
// Builtin cube GUID -- the constructor registers it with a null package (D-5).
|
|
23
|
+
const BUILTIN_CUBE_GUID = 'cbe42beb-8975-5096-b3a1-3dda4cb4c077';
|
|
24
|
+
|
|
25
|
+
function parseGuid(s: string): AssetGuid {
|
|
26
|
+
const r = AssetGuid.parse(s);
|
|
27
|
+
if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
|
|
28
|
+
return r.value;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function makeRegistry(): AssetRegistry {
|
|
32
|
+
return new AssetRegistry(makeMockShaderRegistry());
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const sampler: SamplerAsset = { kind: 'sampler' };
|
|
36
|
+
|
|
37
|
+
describe('resolveName deterministic fallback (AC-15)', () => {
|
|
38
|
+
it('AC-15.1 multi-asset entry with no stored name falls back to basename', () => {
|
|
39
|
+
const reg = makeRegistry();
|
|
40
|
+
reg.catalog(parseGuid(MULTI_A), sampler);
|
|
41
|
+
reg.catalog(parseGuid(MULTI_B), sampler);
|
|
42
|
+
// Only MULTI_A carries a name; MULTI_B has none (old add-only pack).
|
|
43
|
+
reg._registerPackage('assets/world.glb', [MULTI_A, MULTI_B], new Map([[MULTI_A, 'Ground']]));
|
|
44
|
+
|
|
45
|
+
expect(() => reg.resolveName(MULTI_B)).not.toThrow();
|
|
46
|
+
expect(reg.resolveName(MULTI_B)).toBe('world.glb');
|
|
47
|
+
expect(reg.resolveName(MULTI_A)).toBe('Ground');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('AC-15.2 null package with no name resolves to empty string', () => {
|
|
51
|
+
const reg = makeRegistry();
|
|
52
|
+
reg.catalog(parseGuid(NO_PKG), sampler);
|
|
53
|
+
reg._registerPackage(null, [NO_PKG]);
|
|
54
|
+
|
|
55
|
+
expect(() => reg.resolveName(NO_PKG)).not.toThrow();
|
|
56
|
+
expect(reg.resolveName(NO_PKG)).toBe('');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('D-5 builtin mesh resolves to empty string (null package, no name)', () => {
|
|
60
|
+
const reg = makeRegistry();
|
|
61
|
+
expect(reg.packageOf(BUILTIN_CUBE_GUID)).toBe(null);
|
|
62
|
+
expect(reg.resolveName(BUILTIN_CUBE_GUID)).toBe('');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// resolveName null package — AC-03 (feat-20260618 w17).
|
|
2
|
+
//
|
|
3
|
+
// Red-first: written before w10 implements resolveName.
|
|
4
|
+
//
|
|
5
|
+
// Coverage:
|
|
6
|
+
// AC-03 — no-package asset: packageOf(guid) === null, resolveName returns the
|
|
7
|
+
// stored self name, and no synthetic guid path is minted (OOS-3).
|
|
8
|
+
|
|
9
|
+
import { AssetRegistry } from '@forgeax/engine-assets-runtime';
|
|
10
|
+
import { AssetGuid } from '@forgeax/engine-pack/guid';
|
|
11
|
+
import type { SamplerAsset } from '@forgeax/engine-types';
|
|
12
|
+
import { describe, expect, it } from 'vitest';
|
|
13
|
+
import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
|
|
14
|
+
|
|
15
|
+
const NO_PKG_GUID = 'b0000000-0000-4000-b000-000000000001';
|
|
16
|
+
|
|
17
|
+
function parseGuid(s: string): AssetGuid {
|
|
18
|
+
const r = AssetGuid.parse(s);
|
|
19
|
+
if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
|
|
20
|
+
return r.value;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function makeRegistry(): AssetRegistry {
|
|
24
|
+
return new AssetRegistry(makeMockShaderRegistry());
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const sampler: SamplerAsset = { kind: 'sampler' };
|
|
28
|
+
|
|
29
|
+
describe('resolveName null package (AC-03)', () => {
|
|
30
|
+
it('packageOf is null, resolveName returns the stored name, no synthetic path', () => {
|
|
31
|
+
const reg = makeRegistry();
|
|
32
|
+
reg.catalog(parseGuid(NO_PKG_GUID), sampler);
|
|
33
|
+
reg._registerPackage(null, [NO_PKG_GUID], new Map([[NO_PKG_GUID, 'myProcMesh']]));
|
|
34
|
+
|
|
35
|
+
expect(reg.packageOf(NO_PKG_GUID)).toBe(null);
|
|
36
|
+
expect(reg.resolveName(NO_PKG_GUID)).toBe('myProcMesh');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// AC-04 unified name resolution — single source of truth, no bypass (feat-20260618 w18).
|
|
2
|
+
//
|
|
3
|
+
// resolveName is the one runtime name-truth function and it delegates to the
|
|
4
|
+
// stateless deriveAssetName pure function (D-6). Every other name consumer reads
|
|
5
|
+
// resolveName or that same deriveAssetName -- none re-implements the XOR rule.
|
|
6
|
+
//
|
|
7
|
+
// This is a grep/fixture test, not a pure runtime assertion: it reads the source
|
|
8
|
+
// trees and asserts structural unification.
|
|
9
|
+
//
|
|
10
|
+
// M4 (w24/w22) wiring completed: inspect() now calls resolveName; the catalog
|
|
11
|
+
// builder now calls deriveAssetName. The grep assertions below confirm both
|
|
12
|
+
// paths route through the SSOT, no bypass.
|
|
13
|
+
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
import { fileURLToPath } from 'node:url';
|
|
16
|
+
import { describe, expect, it } from 'vitest';
|
|
17
|
+
|
|
18
|
+
const here = fileURLToPath(new URL('.', import.meta.url));
|
|
19
|
+
const registrySrc = readFileSync(`${here}../../../assets-runtime/src/asset-registry.ts`, 'utf8');
|
|
20
|
+
const deriveSrc = readFileSync(
|
|
21
|
+
fileURLToPath(new URL('../../../pack/src/deriveAssetName.ts', import.meta.url)),
|
|
22
|
+
'utf8',
|
|
23
|
+
);
|
|
24
|
+
const buildCatalogSrc = readFileSync(
|
|
25
|
+
fileURLToPath(new URL('../../../pack/src/catalog-builder.ts', import.meta.url)),
|
|
26
|
+
'utf8',
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
describe('unified name resolution (AC-04)', () => {
|
|
30
|
+
it('deriveAssetName is the single XOR rule definition', () => {
|
|
31
|
+
expect(deriveSrc).toContain('export function deriveAssetName');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('resolveName delegates to deriveAssetName (no inline XOR re-implementation)', () => {
|
|
35
|
+
expect(registrySrc).toContain("import { deriveAssetName } from '@forgeax/engine-pack/name'");
|
|
36
|
+
// resolveName returns the result of deriveAssetName, not a hand-rolled rule.
|
|
37
|
+
const body = registrySrc.slice(
|
|
38
|
+
registrySrc.indexOf('resolveName(guid: AssetGuid | string): string'),
|
|
39
|
+
);
|
|
40
|
+
const fnBody = body.slice(0, body.indexOf('\n }'));
|
|
41
|
+
expect(fnBody).toContain('return deriveAssetName(');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('resolveName is the only public name accessor on the registry (no sibling getName)', () => {
|
|
45
|
+
expect(registrySrc).not.toMatch(/\n {2}getName\(/);
|
|
46
|
+
expect(registrySrc).not.toMatch(/\n {2}displayName\(/);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// M4 expansion (w24 landed): inspect() routes through resolveName
|
|
50
|
+
it('inspect() calls resolveName per entry (M4 w24 wiring)', () => {
|
|
51
|
+
// inspect() pushes { name: this.resolveName(guid) } -- no inline basename
|
|
52
|
+
expect(registrySrc).toContain('name: this.resolveName(guid)');
|
|
53
|
+
// No hardcoded '' placeholder left from M1/w3
|
|
54
|
+
expect(registrySrc).not.toContain("name: ''");
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// M4 expansion (w22 landed): catalog-builder routes through deriveAssetName
|
|
58
|
+
it('catalog-builder imports and calls deriveAssetName (no inline XOR)', () => {
|
|
59
|
+
expect(buildCatalogSrc).toContain("import { deriveAssetName } from './deriveAssetName.js'");
|
|
60
|
+
expect(buildCatalogSrc).toContain('deriveAssetName(');
|
|
61
|
+
// No inline re-implementation of the XOR rule (no hand-rolled basename)
|
|
62
|
+
// The single deriveAssetName pure function handles all branches.
|
|
63
|
+
expect(buildCatalogSrc.match(/deriveAssetName\(/g)?.length ?? 0).toBeGreaterThanOrEqual(2);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// resolveName single / multi asset package — AC-01 + AC-02 (feat-20260618 w16).
|
|
2
|
+
//
|
|
3
|
+
// Red-first: written before w10 implements resolveName. Constructs the package
|
|
4
|
+
// state directly through registerPackage (Risk-2: no pack-index fetch needed).
|
|
5
|
+
//
|
|
6
|
+
// Coverage:
|
|
7
|
+
// AC-01 — single-asset package: resolveName === basename(path); the stored
|
|
8
|
+
// Asset POD carries no `name` property (name is never on the payload).
|
|
9
|
+
// AC-02 — multi-asset package: resolveName returns each entry's stored name.
|
|
10
|
+
|
|
11
|
+
import { AssetRegistry } from '@forgeax/engine-assets-runtime';
|
|
12
|
+
import { AssetGuid } from '@forgeax/engine-pack/guid';
|
|
13
|
+
import type { SamplerAsset } from '@forgeax/engine-types';
|
|
14
|
+
import { describe, expect, it } from 'vitest';
|
|
15
|
+
import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
|
|
16
|
+
|
|
17
|
+
const SINGLE_GUID = 'a0000000-0000-4000-a000-000000000001';
|
|
18
|
+
const MULTI_A_GUID = 'a0000000-0000-4000-a000-000000000002';
|
|
19
|
+
const MULTI_B_GUID = 'a0000000-0000-4000-a000-000000000003';
|
|
20
|
+
|
|
21
|
+
function parseGuid(s: string): AssetGuid {
|
|
22
|
+
const r = AssetGuid.parse(s);
|
|
23
|
+
if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
|
|
24
|
+
return r.value;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function makeRegistry(): AssetRegistry {
|
|
28
|
+
return new AssetRegistry(makeMockShaderRegistry());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const sampler: SamplerAsset = { kind: 'sampler' };
|
|
32
|
+
|
|
33
|
+
describe('resolveName single-asset package (AC-01)', () => {
|
|
34
|
+
it('returns basename(path) and the POD has no name property', () => {
|
|
35
|
+
const reg = makeRegistry();
|
|
36
|
+
reg.catalog(parseGuid(SINGLE_GUID), sampler);
|
|
37
|
+
reg._registerPackage('assets/hero.glb', [SINGLE_GUID]);
|
|
38
|
+
|
|
39
|
+
expect(reg.resolveName(SINGLE_GUID)).toBe('hero.glb');
|
|
40
|
+
|
|
41
|
+
const stored = reg.lookup(SINGLE_GUID);
|
|
42
|
+
expect(stored).toBeDefined();
|
|
43
|
+
expect(Object.hasOwn(stored as object, 'name')).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('resolveName multi-asset package (AC-02)', () => {
|
|
48
|
+
it('returns each entry stored name', () => {
|
|
49
|
+
const reg = makeRegistry();
|
|
50
|
+
reg.catalog(parseGuid(MULTI_A_GUID), sampler);
|
|
51
|
+
reg.catalog(parseGuid(MULTI_B_GUID), sampler);
|
|
52
|
+
reg._registerPackage(
|
|
53
|
+
'assets/char.glb',
|
|
54
|
+
[MULTI_A_GUID, MULTI_B_GUID],
|
|
55
|
+
new Map([
|
|
56
|
+
[MULTI_A_GUID, 'Body'],
|
|
57
|
+
[MULTI_B_GUID, 'Head'],
|
|
58
|
+
]),
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
expect(reg.resolveName(MULTI_A_GUID)).toBe('Body');
|
|
62
|
+
expect(reg.resolveName(MULTI_B_GUID)).toBe('Head');
|
|
63
|
+
});
|
|
64
|
+
});
|