@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
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// No existing green test reached it - the MSAA demo scene is pure mesh
|
|
10
10
|
// (triangle/cube/quad/sphere) and the hello-sprite smoke runs antialias=none.
|
|
11
11
|
//
|
|
12
|
-
// This test renders a sprite entity (
|
|
12
|
+
// This test renders a sprite entity (HANDLE_QUAD + forgeax::sprite material)
|
|
13
13
|
// behind a default perspective Camera with tonemap=none, once at
|
|
14
14
|
// antialias=none and once at antialias=msaa, and asserts:
|
|
15
15
|
// (1) the MSAA pass emits 0 RhiError - if the sprite sub-pass paired a
|
|
@@ -34,9 +34,8 @@
|
|
|
34
34
|
// covered by the hello-sprite smoke FPS gate (smoke green = no
|
|
35
35
|
// regression beyond the SMOKE_PIXEL_THRESHOLD eps).
|
|
36
36
|
|
|
37
|
+
import { HANDLE_QUAD } from '@forgeax/engine-assets-runtime';
|
|
37
38
|
import { World } from '@forgeax/engine-ecs';
|
|
38
|
-
import { createPrimitiveMesh } from '@forgeax/engine-geometry';
|
|
39
|
-
import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '@forgeax/engine-render/authoring';
|
|
40
39
|
import {
|
|
41
40
|
ANTIALIAS_MSAA,
|
|
42
41
|
ANTIALIAS_NONE,
|
|
@@ -44,11 +43,11 @@ import {
|
|
|
44
43
|
MeshFilter,
|
|
45
44
|
MeshRenderer,
|
|
46
45
|
TONEMAP_NONE,
|
|
47
|
-
} from '@forgeax/engine-render
|
|
46
|
+
} from '@forgeax/engine-render';
|
|
47
|
+
import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '@forgeax/engine-render/authoring';
|
|
48
48
|
import { Transform } from '@forgeax/engine-scene';
|
|
49
|
-
import type { Asset } from '@forgeax/engine-types';
|
|
50
49
|
import { describe, expect, it } from 'vitest';
|
|
51
|
-
import {
|
|
50
|
+
import { constructRuntimeRendererHost } from '../renderer-host';
|
|
52
51
|
import { drawPublished } from './draw-published';
|
|
53
52
|
|
|
54
53
|
const WIDTH = 256;
|
|
@@ -124,14 +123,13 @@ function buildSyntheticRgba(): { width: number; height: number; data: Uint8Array
|
|
|
124
123
|
|
|
125
124
|
function spawnSpriteScene(world: World, spriteMaterialPayload: unknown, antialias: number): void {
|
|
126
125
|
// feat-20260614 M8: MeshRenderer.materials holds a per-World column handle
|
|
127
|
-
// (numeric); mint it from the
|
|
126
|
+
// (numeric); mint it from the catalogued material payload on the World the
|
|
128
127
|
// scene is spawned into. The material's texture/sampler values are GUID
|
|
129
128
|
// strings the extract stage resolves to per-World handles.
|
|
130
129
|
const spriteMaterial = world.allocSharedRef('MaterialAsset', spriteMaterialPayload);
|
|
131
130
|
// A rotated quad gives diagonal sprite edges so MSAA has something to
|
|
132
131
|
// smooth (the camera-facing axis-aligned quad would expose almost no
|
|
133
132
|
// edge to antialias).
|
|
134
|
-
const meshHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('quad').unwrap());
|
|
135
133
|
world.spawn(
|
|
136
134
|
{
|
|
137
135
|
component: Transform,
|
|
@@ -141,7 +139,7 @@ function spawnSpriteScene(world: World, spriteMaterialPayload: unknown, antialia
|
|
|
141
139
|
scale: [1, 1, 1],
|
|
142
140
|
},
|
|
143
141
|
},
|
|
144
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
142
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_QUAD } },
|
|
145
143
|
{ component: MeshRenderer, data: { materials: [spriteMaterial as never] } },
|
|
146
144
|
);
|
|
147
145
|
world.spawn(
|
|
@@ -224,59 +222,33 @@ describe('feat-20260604-msaa M2 w9 [F-1]: LDR sprite + MSAA split sub-pass cover
|
|
|
224
222
|
removeEventListener() {},
|
|
225
223
|
} as unknown as HTMLCanvasElement;
|
|
226
224
|
|
|
227
|
-
|
|
228
|
-
let assetEpoch = 0;
|
|
229
|
-
const assetResolver = {
|
|
230
|
-
get epoch(): number {
|
|
231
|
-
return assetEpoch;
|
|
232
|
-
},
|
|
233
|
-
lookup<T extends Asset>(guid: string): T | undefined {
|
|
234
|
-
return payloads.get(guid) as T | undefined;
|
|
235
|
-
},
|
|
236
|
-
guidOf(asset: Asset): string | undefined {
|
|
237
|
-
for (const [guid, payload] of payloads) {
|
|
238
|
-
if (payload === asset) return guid;
|
|
239
|
-
}
|
|
240
|
-
return undefined;
|
|
241
|
-
},
|
|
242
|
-
publish(guid: string, asset: Asset): void {
|
|
243
|
-
payloads.set(guid, asset);
|
|
244
|
-
assetEpoch += 1;
|
|
245
|
-
},
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
let renderer: Awaited<ReturnType<typeof createRenderer>>;
|
|
225
|
+
let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
|
|
249
226
|
try {
|
|
250
|
-
|
|
227
|
+
host = await constructRuntimeRendererHost(
|
|
251
228
|
mockCanvas,
|
|
252
229
|
{},
|
|
253
230
|
{
|
|
254
231
|
shaderManifestUrl: ENGINE_MANIFEST_URL,
|
|
255
|
-
assetResolver,
|
|
256
232
|
},
|
|
257
233
|
);
|
|
258
234
|
} finally {
|
|
259
235
|
globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
|
|
260
236
|
}
|
|
261
|
-
expect(
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
237
|
+
expect(host.ok).toBe(true);
|
|
238
|
+
if (!host.ok) throw host.error;
|
|
239
|
+
const { renderer, assets } = host.value;
|
|
240
|
+
expect(renderer.inspect().state).toBe('alive');
|
|
265
241
|
const device = sharedDevice;
|
|
266
242
|
if (device === undefined) throw new Error('GPUDevice not captured');
|
|
267
243
|
|
|
268
|
-
const assets = assetResolver;
|
|
269
|
-
|
|
270
244
|
// Catalogue + upload a small sprite texture, a sampler, and a
|
|
271
245
|
// forgeax::sprite material. feat-20260625 M2/M3 (D-3): sprite is now
|
|
272
246
|
// a regular material whose `transparent: true` first-pass flag (not
|
|
273
247
|
// the legacy shadingModel='sprite' arm) drives the LDR split sub-pass
|
|
274
|
-
// in the record stage.
|
|
248
|
+
// in the record stage. feat-20260614 M8: AssetRegistry holds GUID->
|
|
275
249
|
// payload only (no handle concept); texture/sampler are referenced
|
|
276
250
|
// from the material values by GUID string and resolved to per-
|
|
277
|
-
// World column handles at extract. The
|
|
278
|
-
// exercises the GPU residency path via a column handle minted on an
|
|
279
|
-
// upload-only World.
|
|
251
|
+
// World column handles at extract. The record stage owns GPU residency.
|
|
280
252
|
//
|
|
281
253
|
// Falsification (smoke harness sensitivity claim, not committed to CI):
|
|
282
254
|
// if the sprite pass's blend state is hand-rewritten to `src=one /
|
|
@@ -298,28 +270,19 @@ describe('feat-20260604-msaa M2 w9 [F-1]: LDR sprite + MSAA split sub-pass cover
|
|
|
298
270
|
const TEX_GUID = '00000000-0000-7000-8000-0000000005a1';
|
|
299
271
|
const SAMPLER_GUID = '00000000-0000-7000-8000-0000000005a2';
|
|
300
272
|
const MATERIAL_GUID = '00000000-0000-7000-8000-0000000005a3';
|
|
301
|
-
assets.
|
|
273
|
+
const texCatalog = assets.catalog(TEX_GUID, synthPod as never);
|
|
274
|
+
expect(texCatalog.ok, 'sprite texture catalog').toBe(true);
|
|
275
|
+
if (!texCatalog.ok) return;
|
|
302
276
|
|
|
303
|
-
const
|
|
304
|
-
const textureHandle = uploadWorld.allocSharedRef('TextureAsset', synthPod);
|
|
305
|
-
const uploadRes = await renderer.store.uploadTexture(textureHandle, synthPod as never, {
|
|
306
|
-
bytes: synth.data,
|
|
307
|
-
width: synth.width,
|
|
308
|
-
height: synth.height,
|
|
309
|
-
mime: 'image/png',
|
|
310
|
-
colorSpace: 'srgb',
|
|
311
|
-
mipmap: false,
|
|
312
|
-
});
|
|
313
|
-
expect(uploadRes.ok, 'sprite texture upload').toBe(true);
|
|
314
|
-
if (!uploadRes.ok) return;
|
|
315
|
-
|
|
316
|
-
assets.publish(SAMPLER_GUID, {
|
|
277
|
+
const samplerCatalog = assets.catalog(SAMPLER_GUID, {
|
|
317
278
|
kind: 'sampler',
|
|
318
279
|
magFilter: 'linear',
|
|
319
280
|
minFilter: 'linear',
|
|
320
281
|
addressModeU: 'repeat',
|
|
321
282
|
addressModeV: 'repeat',
|
|
322
283
|
} as never);
|
|
284
|
+
expect(samplerCatalog.ok, 'sampler catalog').toBe(true);
|
|
285
|
+
if (!samplerCatalog.ok) return;
|
|
323
286
|
|
|
324
287
|
const spriteMaterialPayload = {
|
|
325
288
|
kind: 'material' as const,
|
|
@@ -343,20 +306,15 @@ describe('feat-20260604-msaa M2 w9 [F-1]: LDR sprite + MSAA split sub-pass cover
|
|
|
343
306
|
// older demos keep rendering during migration; new code declares
|
|
344
307
|
// the UBO-aligned forms directly.
|
|
345
308
|
colorTint: [1.0, 0.4, 0.4, 1.0],
|
|
346
|
-
baseColorTexture:
|
|
347
|
-
texture: TEX_GUID,
|
|
348
|
-
coordinates: {
|
|
349
|
-
set: 0,
|
|
350
|
-
transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
|
|
351
|
-
physicalUvScale: [1, 1],
|
|
352
|
-
},
|
|
353
|
-
},
|
|
309
|
+
baseColorTexture: TEX_GUID,
|
|
354
310
|
sampler: SAMPLER_GUID,
|
|
355
311
|
region: [0, 0, 1, 1],
|
|
356
312
|
pivotAndSize: [0.5, 0.5, 1, 1],
|
|
357
313
|
},
|
|
358
314
|
};
|
|
359
|
-
assets.
|
|
315
|
+
const matCatalog = assets.catalog(MATERIAL_GUID, spriteMaterialPayload as never);
|
|
316
|
+
expect(matCatalog.ok, 'sprite material catalog').toBe(true);
|
|
317
|
+
if (!matCatalog.ok) return;
|
|
360
318
|
|
|
361
319
|
// Pass 1: antialias=none baseline.
|
|
362
320
|
const worldNone = new World();
|
|
@@ -372,7 +330,10 @@ describe('feat-20260604-msaa M2 w9 [F-1]: LDR sprite + MSAA split sub-pass cover
|
|
|
372
330
|
// under MSAA. Capture every RhiError fired through the renderer's
|
|
373
331
|
// fan-out channel during this draw.
|
|
374
332
|
const msaaErrors: Array<{ code: string }> = [];
|
|
375
|
-
const unsubscribe = renderer.
|
|
333
|
+
const unsubscribe = renderer.subscribe((event) => {
|
|
334
|
+
if (event.kind !== 'error') return;
|
|
335
|
+
msaaErrors.push({ code: event.error.code });
|
|
336
|
+
});
|
|
376
337
|
const worldMsaa = new World();
|
|
377
338
|
spawnSpriteScene(worldMsaa, spriteMaterialPayload, ANTIALIAS_MSAA);
|
|
378
339
|
const drawnMsaa = drawPublished(renderer, worldMsaa);
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// feat-20260622 M6 / w23 — AC-07 contract: a new reference does NOT require any
|
|
2
|
+
// change to a graph-walk axis. The recursion source is `envelope.refs` (D-5), so
|
|
3
|
+
// when the importer puts a referenced GUID into refs[], the recursive loadByGuid
|
|
4
|
+
// walk pulls it -- no exhaustive `switch (asset.kind)` arm to add, no per-kind
|
|
5
|
+
// runtime walker to extend. feat-20260623 M2: the ASSET_BRAND table (the only
|
|
6
|
+
// kind-exhaustive mapping a new Asset kind previously touched) is now retired;
|
|
7
|
+
// a new kind requires zero engine-type changes (brand concept eliminated).
|
|
8
|
+
//
|
|
9
|
+
// This locks the structural win of the refs-as-SSOT pivot: adding a reference
|
|
10
|
+
// field to any Asset member surfaces in the load graph through refs[] alone.
|
|
11
|
+
//
|
|
12
|
+
// The retired graph-walk mechanisms (collect-refs.ts + the
|
|
13
|
+
// asset-registry.recursive.test-d.ts exhaustive-switch guard) are deleted in
|
|
14
|
+
// w19; their absence is enforced structurally -- nothing imports them and the
|
|
15
|
+
// milestone grep gate asserts the retired ref-collection switch leaves zero
|
|
16
|
+
// references across the tree.
|
|
17
|
+
// (A filesystem existsSync check is intentionally avoided: node:fs/node:path
|
|
18
|
+
// named imports are outside @types/node coverage in the runtime tsconfig.)
|
|
19
|
+
|
|
20
|
+
import { AssetRegistry } from '@forgeax/engine-assets-runtime';
|
|
21
|
+
import { AssetGuid } from '@forgeax/engine-pack/guid';
|
|
22
|
+
import type { MaterialAsset } from '@forgeax/engine-types';
|
|
23
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
24
|
+
import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
|
|
25
|
+
|
|
26
|
+
const PARENT_GUID = 'c0000000-0000-4000-c000-000000000001';
|
|
27
|
+
const EXTRA_REF_GUID = 'c0000000-0000-4000-c000-000000000002';
|
|
28
|
+
|
|
29
|
+
function parseGuid(s: string): AssetGuid {
|
|
30
|
+
const r = AssetGuid.parse(s);
|
|
31
|
+
if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
|
|
32
|
+
return r.value;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function makeRegistry(): AssetRegistry {
|
|
36
|
+
return new AssetRegistry(makeMockShaderRegistry());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const stubMaterial: MaterialAsset = {
|
|
40
|
+
kind: 'material',
|
|
41
|
+
passes: [
|
|
42
|
+
{
|
|
43
|
+
name: 'forward',
|
|
44
|
+
program: { module: 'test::dummy' },
|
|
45
|
+
renderState: { tags: { LightMode: 'Forward' } },
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
values: {},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
afterEach(() => {
|
|
52
|
+
// biome-ignore lint/suspicious/noExplicitAny: test teardown
|
|
53
|
+
delete (globalThis as any).fetch;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
describe('AC-07 — a new reference appears in the load graph via envelope.refs', () => {
|
|
57
|
+
it('an extra ref the importer adds to refs[] is recursively loaded', async () => {
|
|
58
|
+
const reg = makeRegistry();
|
|
59
|
+
|
|
60
|
+
// The "extra reference" sub-asset is pre-registered in dev mode so the
|
|
61
|
+
// recursive walk hits the fast-path. Stand-in for "importer added a brand
|
|
62
|
+
// new reference field whose GUID it dropped into refs[]".
|
|
63
|
+
reg.catalog(parseGuid(EXTRA_REF_GUID), {
|
|
64
|
+
kind: 'texture',
|
|
65
|
+
width: 1,
|
|
66
|
+
height: 1,
|
|
67
|
+
format: 'rgba8unorm',
|
|
68
|
+
data: new Uint8Array(4),
|
|
69
|
+
colorSpace: 'srgb',
|
|
70
|
+
mipmap: false,
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const packIndex = [
|
|
74
|
+
{ guid: PARENT_GUID, packageUrl: '/packs/parent.pack.json', kind: 'material' },
|
|
75
|
+
];
|
|
76
|
+
// The pack body carries refs[] = [EXTRA_REF_GUID]. No new switch arm, no
|
|
77
|
+
// per-kind walker change -- the GUID in refs[] is the entire wiring.
|
|
78
|
+
const parentPack = {
|
|
79
|
+
schemaVersion: '2.0.0',
|
|
80
|
+
kind: 'internal-text-package',
|
|
81
|
+
assets: [
|
|
82
|
+
{
|
|
83
|
+
guid: PARENT_GUID,
|
|
84
|
+
kind: 'material',
|
|
85
|
+
payload: {
|
|
86
|
+
passes: [
|
|
87
|
+
{
|
|
88
|
+
name: 'forward',
|
|
89
|
+
program: { module: 'test::dummy' },
|
|
90
|
+
renderState: { tags: { LightMode: 'Forward' } },
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
values: {},
|
|
94
|
+
},
|
|
95
|
+
refs: [EXTRA_REF_GUID],
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
reg.configurePackIndex('/pack-index.json');
|
|
101
|
+
const fetchMock = vi.fn().mockImplementation((url: string) => {
|
|
102
|
+
if (url === '/pack-index.json') {
|
|
103
|
+
return Promise.resolve({ ok: true, json: () => Promise.resolve(packIndex) });
|
|
104
|
+
}
|
|
105
|
+
if (url === '/packs/parent.pack.json') {
|
|
106
|
+
return Promise.resolve({ ok: true, json: () => Promise.resolve(parentPack) });
|
|
107
|
+
}
|
|
108
|
+
return Promise.resolve({ ok: false, status: 404 });
|
|
109
|
+
});
|
|
110
|
+
globalThis.fetch = fetchMock as typeof globalThis.fetch;
|
|
111
|
+
|
|
112
|
+
const result = await reg.loadByGuid<MaterialAsset>(parseGuid(PARENT_GUID));
|
|
113
|
+
expect(result.ok).toBe(true);
|
|
114
|
+
// The extra reference is in the load graph purely because it is in refs[].
|
|
115
|
+
expect(reg.lookup(parseGuid(EXTRA_REF_GUID))).not.toBe(undefined);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('catalog() inline path: refs[] drives recursion with no walker', async () => {
|
|
119
|
+
const reg = makeRegistry();
|
|
120
|
+
reg.catalog(parseGuid(EXTRA_REF_GUID), {
|
|
121
|
+
kind: 'sampler',
|
|
122
|
+
magFilter: 'linear',
|
|
123
|
+
minFilter: 'linear',
|
|
124
|
+
});
|
|
125
|
+
// Direct register with an explicit refs edge; loadByGuid fast-path returns
|
|
126
|
+
// the body and the refs edge is the recursion source.
|
|
127
|
+
reg.catalog(parseGuid(PARENT_GUID), stubMaterial, [{ guid: EXTRA_REF_GUID }]);
|
|
128
|
+
const result = await reg.loadByGuid<MaterialAsset>(parseGuid(PARENT_GUID));
|
|
129
|
+
expect(result.ok).toBe(true);
|
|
130
|
+
expect(reg.lookup(parseGuid(EXTRA_REF_GUID))).not.toBe(undefined);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
// Ambient declarations for node:* modules used by dawn tests that read the
|
|
2
2
|
// hello-triangle compiled shader manifest at runtime. The runtime package's
|
|
3
3
|
// tsconfig does not enable @types/node (production target is browser); these
|
|
4
|
-
// minimal shims keep tsc green for the
|
|
4
|
+
// minimal shims keep tsc green for the small set of dawn test files that read
|
|
5
|
+
// compiled shader manifests at runtime.
|
|
5
6
|
//
|
|
6
|
-
// Used by
|
|
7
|
-
// - shadow-m2.dawn.test.ts
|
|
8
|
-
// - shadow-m3.dawn.test.ts
|
|
9
|
-
// - shadow-m3-calibrate-run.dawn.test.ts
|
|
7
|
+
// Used by shader-manifest Dawn fixtures and the runtime benchmark fixtures.
|
|
10
8
|
// - tilemap-chunk-y-sort-bench.unit.test.ts (perf_hooks + process.env)
|
|
11
|
-
// -
|
|
9
|
+
// - record-fold-scene-instances.unit.test.ts (readdirSync + dirname)
|
|
12
10
|
// - basis-catalog-dispatch.integration.test.ts (existsSync pkg-built gate)
|
|
13
11
|
|
|
14
12
|
declare module 'node:fs' {
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// 1->N package promotion idempotence — AC-05 (feat-20260618 w12).
|
|
2
|
+
//
|
|
3
|
+
// Red-first: written before w11 adds the promotion branch to registerPackage.
|
|
4
|
+
//
|
|
5
|
+
// Coverage:
|
|
6
|
+
// AC-05 — when a single-asset package gains a second asset, the original
|
|
7
|
+
// asset's derived basename is frozen as its stored name so it keeps
|
|
8
|
+
// the same resolveName (now via the multi-asset branch), with no error
|
|
9
|
+
// and no caller awareness. Promotion is idempotent: re-registering the
|
|
10
|
+
// same path does not overwrite an already-frozen name.
|
|
11
|
+
//
|
|
12
|
+
// The promotion is observable through `package.xor-invariant-violated`: when the
|
|
13
|
+
// original asset already carries a stored name at promotion time (the abnormal
|
|
14
|
+
// single-asset-with-name state, D-4), the freeze must not overwrite it and the
|
|
15
|
+
// soft-violation counter increments. Without w11 there is no promotion branch,
|
|
16
|
+
// so the counter never fires (the falsifying assertion).
|
|
17
|
+
|
|
18
|
+
import { AssetRegistry } from '@forgeax/engine-assets-runtime';
|
|
19
|
+
import { AssetGuid } from '@forgeax/engine-pack/guid';
|
|
20
|
+
import type { SamplerAsset } from '@forgeax/engine-types';
|
|
21
|
+
import { describe, expect, it } from 'vitest';
|
|
22
|
+
import { createEngineMetrics } from '../../../render/src/engine-metrics';
|
|
23
|
+
import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
|
|
24
|
+
|
|
25
|
+
const G1 = 'c0000000-0000-4000-c000-000000000001';
|
|
26
|
+
const G2 = 'c0000000-0000-4000-c000-000000000002';
|
|
27
|
+
const PATH = 'assets/scene.glb';
|
|
28
|
+
|
|
29
|
+
function parseGuid(s: string): AssetGuid {
|
|
30
|
+
const r = AssetGuid.parse(s);
|
|
31
|
+
if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
|
|
32
|
+
return r.value;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function makeRegistry(): AssetRegistry {
|
|
36
|
+
return new AssetRegistry(makeMockShaderRegistry());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const sampler: SamplerAsset = { kind: 'sampler' };
|
|
40
|
+
|
|
41
|
+
describe('1->N package promotion (AC-05)', () => {
|
|
42
|
+
it('single asset derives basename', () => {
|
|
43
|
+
const reg = makeRegistry();
|
|
44
|
+
reg.catalog(parseGuid(G1), sampler);
|
|
45
|
+
reg._registerPackage(PATH, [G1]);
|
|
46
|
+
expect(reg.resolveName(G1)).toBe('scene.glb');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('adding a second asset keeps the original name unchanged, no error', () => {
|
|
50
|
+
const reg = makeRegistry();
|
|
51
|
+
reg.catalog(parseGuid(G1), sampler);
|
|
52
|
+
reg._registerPackage(PATH, [G1]);
|
|
53
|
+
reg.catalog(parseGuid(G2), sampler);
|
|
54
|
+
reg._registerPackage(PATH, [G2], new Map([[G2, 'SecondAsset']]));
|
|
55
|
+
|
|
56
|
+
expect(reg.resolveName(G1)).toBe('scene.glb');
|
|
57
|
+
expect(reg.resolveName(G2)).toBe('SecondAsset');
|
|
58
|
+
expect(reg.packageOf(G1)?.assetCount).toBe(2);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('re-registering the same path is idempotent (does not overwrite frozen name)', () => {
|
|
62
|
+
const reg = makeRegistry();
|
|
63
|
+
reg.catalog(parseGuid(G1), sampler);
|
|
64
|
+
reg._registerPackage(PATH, [G1]);
|
|
65
|
+
reg.catalog(parseGuid(G2), sampler);
|
|
66
|
+
reg._registerPackage(PATH, [G2], new Map([[G2, 'SecondAsset']]));
|
|
67
|
+
reg._registerPackage(PATH, [G1, G2], new Map([[G2, 'SecondAsset']]));
|
|
68
|
+
|
|
69
|
+
expect(reg.resolveName(G1)).toBe('scene.glb');
|
|
70
|
+
expect(reg.resolveName(G2)).toBe('SecondAsset');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('abnormal single-asset-with-name state bumps the xor counter and is not overwritten', () => {
|
|
74
|
+
const reg = makeRegistry();
|
|
75
|
+
const metrics = createEngineMetrics();
|
|
76
|
+
reg.setMetrics(metrics);
|
|
77
|
+
// Abnormal: a single-asset package whose lone asset already carries a name.
|
|
78
|
+
reg.catalog(parseGuid(G1), sampler);
|
|
79
|
+
reg._registerPackage(PATH, [G1], new Map([[G1, 'PreNamed']]));
|
|
80
|
+
reg.catalog(parseGuid(G2), sampler);
|
|
81
|
+
// Promotion fires: the pre-existing name is preserved (not overwritten by
|
|
82
|
+
// basename) and the soft-violation counter records the abnormal state.
|
|
83
|
+
reg._registerPackage(PATH, [G2], new Map([[G2, 'SecondAsset']]));
|
|
84
|
+
|
|
85
|
+
expect(reg.resolveName(G1)).toBe('PreNamed');
|
|
86
|
+
expect(metrics.snapshot()['package.xor-invariant-violated']).toBe(1);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// rename API (in-memory) three classes + two error paths — AC-06 (feat-20260618 w14).
|
|
2
|
+
//
|
|
3
|
+
// Red-first: written before w13 implements rename.
|
|
4
|
+
//
|
|
5
|
+
// Coverage:
|
|
6
|
+
// 1. null-package asset rename -> resolveName returns the new name
|
|
7
|
+
// 2. multi-asset package rename -> resolveName returns the new name
|
|
8
|
+
// 3. single-asset package rename -> resolveName + packagePath leaf both sync
|
|
9
|
+
// 4. name collision inside the same package -> err(asset-invalid-value)
|
|
10
|
+
// 5. target guid not registered -> err(asset-not-found)
|
|
11
|
+
|
|
12
|
+
import { AssetRegistry } from '@forgeax/engine-assets-runtime';
|
|
13
|
+
import { AssetGuid } from '@forgeax/engine-pack/guid';
|
|
14
|
+
import type { SamplerAsset } from '@forgeax/engine-types';
|
|
15
|
+
import { describe, expect, it } from 'vitest';
|
|
16
|
+
import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
|
|
17
|
+
|
|
18
|
+
const NULL_PKG = 'd0000000-0000-4000-d000-000000000001';
|
|
19
|
+
const MULTI_A = 'd0000000-0000-4000-d000-000000000002';
|
|
20
|
+
const MULTI_B = 'd0000000-0000-4000-d000-000000000003';
|
|
21
|
+
const SINGLE = 'd0000000-0000-4000-d000-000000000004';
|
|
22
|
+
const MISSING = 'd0000000-0000-4000-d000-0000000000ff';
|
|
23
|
+
|
|
24
|
+
function parseGuid(s: string): AssetGuid {
|
|
25
|
+
const r = AssetGuid.parse(s);
|
|
26
|
+
if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
|
|
27
|
+
return r.value;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function makeRegistry(): AssetRegistry {
|
|
31
|
+
return new AssetRegistry(makeMockShaderRegistry());
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const sampler: SamplerAsset = { kind: 'sampler' };
|
|
35
|
+
|
|
36
|
+
describe('rename API (AC-06)', () => {
|
|
37
|
+
it('null-package asset rename updates the stored name', () => {
|
|
38
|
+
const reg = makeRegistry();
|
|
39
|
+
reg.catalog(parseGuid(NULL_PKG), sampler);
|
|
40
|
+
reg._registerPackage(null, [NULL_PKG], new Map([[NULL_PKG, 'old']]));
|
|
41
|
+
|
|
42
|
+
const r = reg.rename(NULL_PKG, 'fresh');
|
|
43
|
+
expect(r.ok).toBe(true);
|
|
44
|
+
expect(reg.resolveName(NULL_PKG)).toBe('fresh');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('multi-asset package rename updates the entry stored name', () => {
|
|
48
|
+
const reg = makeRegistry();
|
|
49
|
+
reg.catalog(parseGuid(MULTI_A), sampler);
|
|
50
|
+
reg.catalog(parseGuid(MULTI_B), sampler);
|
|
51
|
+
reg._registerPackage(
|
|
52
|
+
'assets/char.glb',
|
|
53
|
+
[MULTI_A, MULTI_B],
|
|
54
|
+
new Map([
|
|
55
|
+
[MULTI_A, 'Body'],
|
|
56
|
+
[MULTI_B, 'Head'],
|
|
57
|
+
]),
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
const r = reg.rename(MULTI_A, 'Torso');
|
|
61
|
+
expect(r.ok).toBe(true);
|
|
62
|
+
expect(reg.resolveName(MULTI_A)).toBe('Torso');
|
|
63
|
+
expect(reg.resolveName(MULTI_B)).toBe('Head');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('single-asset package rename syncs resolveName and packagePath leaf', () => {
|
|
67
|
+
const reg = makeRegistry();
|
|
68
|
+
reg.catalog(parseGuid(SINGLE), sampler);
|
|
69
|
+
reg._registerPackage('assets/hero.glb', [SINGLE]);
|
|
70
|
+
|
|
71
|
+
const r = reg.rename(SINGLE, 'villain');
|
|
72
|
+
expect(r.ok).toBe(true);
|
|
73
|
+
expect(reg.resolveName(SINGLE)).toBe('villain');
|
|
74
|
+
const pkg = reg.packageOf(SINGLE);
|
|
75
|
+
expect(pkg).not.toBeNull();
|
|
76
|
+
expect(pkg?.path.endsWith('villain')).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('name collision inside the same package returns asset-invalid-value', () => {
|
|
80
|
+
const reg = makeRegistry();
|
|
81
|
+
reg.catalog(parseGuid(MULTI_A), sampler);
|
|
82
|
+
reg.catalog(parseGuid(MULTI_B), sampler);
|
|
83
|
+
reg._registerPackage(
|
|
84
|
+
'assets/char.glb',
|
|
85
|
+
[MULTI_A, MULTI_B],
|
|
86
|
+
new Map([
|
|
87
|
+
[MULTI_A, 'Body'],
|
|
88
|
+
[MULTI_B, 'Head'],
|
|
89
|
+
]),
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
const r = reg.rename(MULTI_A, 'Head');
|
|
93
|
+
expect(r.ok).toBe(false);
|
|
94
|
+
if (!r.ok) expect(r.error.code).toBe('asset-invalid-value');
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('renaming a missing guid returns asset-not-found', () => {
|
|
98
|
+
const reg = makeRegistry();
|
|
99
|
+
const r = reg.rename(MISSING, 'whatever');
|
|
100
|
+
expect(r.ok).toBe(false);
|
|
101
|
+
if (!r.ok) expect(r.error.code).toBe('asset-not-found');
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { matchPass, selectPasses } from '@forgeax/engine-render/internal';
|
|
2
1
|
import type { MaterialPass, PassSelector } from '@forgeax/engine-types';
|
|
3
2
|
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { matchPass, selectPasses } from '../../../render/src/systems/pass-selector';
|
|
4
4
|
|
|
5
5
|
/*
|
|
6
|
-
* feat-20260609 M1 / T-003:
|
|
6
|
+
* feat-20260609 M1 / T-003: typed scene/shadow selector required.
|
|
7
7
|
*
|
|
8
8
|
* These tests verify the PassSelector matching semantics:
|
|
9
9
|
* - selector: {} matches every pass (AC-02)
|
|
@@ -10,16 +10,14 @@
|
|
|
10
10
|
// must be replaced by buildBindGroupLayoutDescriptor calls without changing
|
|
11
11
|
// what the device sees.
|
|
12
12
|
|
|
13
|
-
import
|
|
13
|
+
import { describe, expect, it } from 'vitest';
|
|
14
14
|
import {
|
|
15
15
|
appendInjection,
|
|
16
|
-
buildBindGroupLayoutDescriptor,
|
|
17
16
|
buildPbrMaterialUserRegionEntries,
|
|
18
17
|
buildPbrViewBglEntries,
|
|
19
|
-
} from '
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import { describe, expect, it } from 'vitest';
|
|
18
|
+
} from '../../../render/src/pbr-pipeline';
|
|
19
|
+
import type { PipelineSpec } from '../../../render/src/pipeline-spec';
|
|
20
|
+
import { buildBindGroupLayoutDescriptor } from '../../../render/src/pipeline-spec';
|
|
23
21
|
|
|
24
22
|
// Stable spec stub — the dispatcher uses spec.shader for reflection only when
|
|
25
23
|
// a registry is supplied; without registry the BGL shape comes purely from
|
|
@@ -81,22 +79,22 @@ describe('buildBindGroupLayoutDescriptor — pbr-pipeline 6 sites byte-equiv', (
|
|
|
81
79
|
});
|
|
82
80
|
|
|
83
81
|
describe('pbr-material-merged', () => {
|
|
84
|
-
it('
|
|
82
|
+
it('24 entries: user-region 13 (derived) + ibl 7 + lightmap 4', () => {
|
|
85
83
|
const spec = makeSpec();
|
|
86
84
|
const out = buildBindGroupLayoutDescriptor(spec, {
|
|
87
85
|
kind: 'pbr-material-merged',
|
|
88
86
|
});
|
|
89
87
|
// Post-M2 (D-1): user-region comes from derive(paramSchema).bglEntries
|
|
90
|
-
// (built-in standard-PBR
|
|
91
|
-
// start = userRegion.length.
|
|
88
|
+
// (built-in standard-PBR 4-texture fallback), then IBL + lightmap are
|
|
89
|
+
// appended at start = userRegion.length.
|
|
92
90
|
const userRegion = buildPbrMaterialUserRegionEntries();
|
|
93
91
|
const afterIbl = [...userRegion, ...appendInjection(userRegion, 'ibl')];
|
|
94
92
|
const expected = {
|
|
95
93
|
label: 'pbr-material-skylight-bgl',
|
|
96
|
-
entries: afterIbl,
|
|
94
|
+
entries: [...afterIbl, ...appendInjection(afterIbl, 'lightmap')],
|
|
97
95
|
};
|
|
98
96
|
expect(out).toEqual(expected);
|
|
99
|
-
expect(out.entries.length).toBe(
|
|
97
|
+
expect(out.entries.length).toBe(24);
|
|
100
98
|
});
|
|
101
99
|
});
|
|
102
100
|
|
|
@@ -159,7 +157,7 @@ describe('buildBindGroupLayoutDescriptor — pbr-pipeline 6 sites byte-equiv', (
|
|
|
159
157
|
});
|
|
160
158
|
|
|
161
159
|
describe('pbr-skin-mesh-array', () => {
|
|
162
|
-
it('storageBuffer=true:
|
|
160
|
+
it('storageBuffer=true: 2 entries, both dynamic offset', () => {
|
|
163
161
|
const spec = makeSpec();
|
|
164
162
|
const out = buildBindGroupLayoutDescriptor(spec, {
|
|
165
163
|
kind: 'pbr-skin-mesh-array',
|
|
@@ -170,16 +168,11 @@ describe('buildBindGroupLayoutDescriptor — pbr-pipeline 6 sites byte-equiv', (
|
|
|
170
168
|
entries: [
|
|
171
169
|
{
|
|
172
170
|
binding: 0,
|
|
173
|
-
visibility: 0x3,
|
|
174
|
-
buffer: { type: 'read-only-storage', hasDynamicOffset: true },
|
|
175
|
-
},
|
|
176
|
-
{
|
|
177
|
-
binding: 1,
|
|
178
171
|
visibility: 0x1,
|
|
179
172
|
buffer: { type: 'read-only-storage', hasDynamicOffset: true },
|
|
180
173
|
},
|
|
181
174
|
{
|
|
182
|
-
binding:
|
|
175
|
+
binding: 1,
|
|
183
176
|
visibility: 0x1,
|
|
184
177
|
buffer: { type: 'read-only-storage', hasDynamicOffset: true },
|
|
185
178
|
},
|
|
@@ -189,16 +182,16 @@ describe('buildBindGroupLayoutDescriptor — pbr-pipeline 6 sites byte-equiv', (
|
|
|
189
182
|
});
|
|
190
183
|
|
|
191
184
|
describe('unlit-material', () => {
|
|
192
|
-
it('
|
|
185
|
+
it('13 entries: base PBR material only (no skylight injection)', () => {
|
|
193
186
|
const spec = makeSpec();
|
|
194
187
|
const out = buildBindGroupLayoutDescriptor(spec, {
|
|
195
188
|
kind: 'unlit-material',
|
|
196
189
|
});
|
|
197
190
|
expect(out).toEqual({
|
|
198
191
|
label: 'unlit-material-bgl',
|
|
199
|
-
entries: buildPbrMaterialUserRegionEntries(
|
|
192
|
+
entries: buildPbrMaterialUserRegionEntries(),
|
|
200
193
|
});
|
|
201
|
-
expect(out.entries.length).toBe(
|
|
194
|
+
expect(out.entries.length).toBe(13);
|
|
202
195
|
});
|
|
203
196
|
});
|
|
204
197
|
});
|