@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
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// AC-12 inspector snapshot name (feat-20260618 w25).
|
|
2
|
+
//
|
|
3
|
+
// Verify that inspect().assets carries resolved names for single-package,
|
|
4
|
+
// multi-package, and null-package assets. Each entry.name must match
|
|
5
|
+
// resolveName(guid), confirming the inspect() wiring from M1/w3 placeholder
|
|
6
|
+
// to resolveName (D-9).
|
|
7
|
+
//
|
|
8
|
+
// Plan-targeted console unit test, but inspect() runs inside AssetRegistry
|
|
9
|
+
// (runtime). A real AssetRegistry is needed to exercise the inspect() ->
|
|
10
|
+
// resolveName wiring.
|
|
11
|
+
//
|
|
12
|
+
// The AssetRegistry constructor pre-registers 5 builtin meshes with null
|
|
13
|
+
// packages (D-5). Builtins have resolveName === ''.
|
|
14
|
+
//
|
|
15
|
+
// catalog() puts the asset into the assetCatalog; _registerPackage sets up
|
|
16
|
+
// the Package mapping for name resolution. Both are needed before inspect()
|
|
17
|
+
// can surface resolved names.
|
|
18
|
+
|
|
19
|
+
import { AssetRegistry } from '@forgeax/engine-assets-runtime';
|
|
20
|
+
import { describe, expect, it } from 'vitest';
|
|
21
|
+
import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
|
|
22
|
+
|
|
23
|
+
function makeReg() {
|
|
24
|
+
return new AssetRegistry(makeMockShaderRegistry());
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const stubSampler = { kind: 'sampler' as const };
|
|
28
|
+
|
|
29
|
+
function register(reg: AssetRegistry, guid: string, path: string | null, name?: string) {
|
|
30
|
+
reg.catalog(guid, stubSampler);
|
|
31
|
+
reg._registerPackage(path, [guid], name ? new Map([[guid, name]]) : undefined);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
describe('inspect InspectEntry.name (AC-12)', () => {
|
|
35
|
+
const BUILTIN_COUNT = 5;
|
|
36
|
+
|
|
37
|
+
it('single-asset package -> inspect entry carries basename derived name', () => {
|
|
38
|
+
const reg = makeReg();
|
|
39
|
+
register(reg, '01890000-0000-7000-8000-000000000001', '/tmp/hero.pack.json');
|
|
40
|
+
const snap = reg.inspect();
|
|
41
|
+
expect(snap.assets.length).toBeGreaterThanOrEqual(BUILTIN_COUNT + 1);
|
|
42
|
+
const entry = snap.assets.find((e) => e.guid === '01890000-0000-7000-8000-000000000001');
|
|
43
|
+
expect(entry).toBeDefined();
|
|
44
|
+
if (!entry) return;
|
|
45
|
+
expect(entry.name).toBe(reg.resolveName('01890000-0000-7000-8000-000000000001'));
|
|
46
|
+
expect(entry.name).toBe('hero.pack.json');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('multi-asset package with stored names -> each entry carries distinct name', () => {
|
|
50
|
+
const reg = makeReg();
|
|
51
|
+
const g1 = '01890000-0000-7000-8000-000000000002';
|
|
52
|
+
const g2 = '01890000-0000-7000-8000-000000000003';
|
|
53
|
+
reg.catalog(g1, stubSampler);
|
|
54
|
+
reg.catalog(g2, stubSampler);
|
|
55
|
+
reg._registerPackage(
|
|
56
|
+
'/tmp/multi.pack.json',
|
|
57
|
+
[g1, g2],
|
|
58
|
+
new Map([
|
|
59
|
+
[g1, 'Body'],
|
|
60
|
+
[g2, 'Head'],
|
|
61
|
+
]),
|
|
62
|
+
);
|
|
63
|
+
const snap = reg.inspect();
|
|
64
|
+
const e1 = snap.assets.find((e) => e.guid === g1);
|
|
65
|
+
const e2 = snap.assets.find((e) => e.guid === g2);
|
|
66
|
+
expect(e1).toBeDefined();
|
|
67
|
+
expect(e2).toBeDefined();
|
|
68
|
+
if (!e1 || !e2) return;
|
|
69
|
+
expect(e1.name).toBe('Body');
|
|
70
|
+
expect(e2.name).toBe('Head');
|
|
71
|
+
expect(e1.name).toBe(reg.resolveName(g1));
|
|
72
|
+
expect(e2.name).toBe(reg.resolveName(g2));
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('null-package asset with stored name -> entry carries stored name', () => {
|
|
76
|
+
const reg = makeReg();
|
|
77
|
+
register(reg, '01890000-0000-7000-8000-000000000004', null, 'myProcMesh');
|
|
78
|
+
const snap = reg.inspect();
|
|
79
|
+
const entry = snap.assets.find((e) => e.guid === '01890000-0000-7000-8000-000000000004');
|
|
80
|
+
expect(entry).toBeDefined();
|
|
81
|
+
if (!entry) return;
|
|
82
|
+
expect(entry.name).toBe(reg.resolveName('01890000-0000-7000-8000-000000000004'));
|
|
83
|
+
expect(entry.name).toBe('myProcMesh');
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('null-package asset without name -> entry.name is empty string', () => {
|
|
87
|
+
const reg = makeReg();
|
|
88
|
+
register(reg, '01890000-0000-7000-8000-000000000005', null);
|
|
89
|
+
const snap = reg.inspect();
|
|
90
|
+
const entry = snap.assets.find((e) => e.guid === '01890000-0000-7000-8000-000000000005');
|
|
91
|
+
expect(entry).toBeDefined();
|
|
92
|
+
if (!entry) return;
|
|
93
|
+
expect(entry.name).toBe(reg.resolveName('01890000-0000-7000-8000-000000000005'));
|
|
94
|
+
expect(entry.name).toBe('');
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('mixed multi/single/null packages -> all entries carry resolveName value', () => {
|
|
98
|
+
const reg = makeReg();
|
|
99
|
+
const ga = '01890000-0000-7000-8000-000000000006';
|
|
100
|
+
const gb = '01890000-0000-7000-8000-000000000007';
|
|
101
|
+
const gc = '01890000-0000-7000-8000-000000000008';
|
|
102
|
+
const gd = '01890000-0000-7000-8000-000000000009';
|
|
103
|
+
|
|
104
|
+
register(reg, ga, '/tmp/hero.pack.json');
|
|
105
|
+
reg.catalog(gb, stubSampler);
|
|
106
|
+
reg.catalog(gc, stubSampler);
|
|
107
|
+
reg._registerPackage(
|
|
108
|
+
'/tmp/multi.pack.json',
|
|
109
|
+
[gb, gc],
|
|
110
|
+
new Map([
|
|
111
|
+
[gb, 'Body'],
|
|
112
|
+
[gc, 'Head'],
|
|
113
|
+
]),
|
|
114
|
+
);
|
|
115
|
+
register(reg, gd, null);
|
|
116
|
+
|
|
117
|
+
const snap = reg.inspect();
|
|
118
|
+
const ours = snap.assets.filter((e) => [ga, gb, gc, gd].includes(e.guid));
|
|
119
|
+
expect(ours).toHaveLength(4);
|
|
120
|
+
|
|
121
|
+
for (const entry of ours) {
|
|
122
|
+
expect(typeof entry.name).toBe('string');
|
|
123
|
+
expect(entry.name).toBe(reg.resolveName(entry.guid));
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('builtin assets have empty string names (D-5 null package)', () => {
|
|
128
|
+
const reg = makeReg();
|
|
129
|
+
const snap = reg.inspect();
|
|
130
|
+
// First entries are the 5 builtin meshes.
|
|
131
|
+
expect(snap.assets.length).toBeGreaterThanOrEqual(BUILTIN_COUNT);
|
|
132
|
+
for (const entry of snap.assets) {
|
|
133
|
+
expect(typeof entry.name).toBe('string');
|
|
134
|
+
}
|
|
135
|
+
// Builtins resolve to empty string.
|
|
136
|
+
const builtinNames = snap.assets.slice(0, BUILTIN_COUNT).map((e) => e.name);
|
|
137
|
+
expect(builtinNames).toEqual(['', '', '', '', '']);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
// `src/__tests__/` (TS rootDir = `./src`); the plan-tasks.json target
|
|
26
26
|
// path matches this layout.
|
|
27
27
|
|
|
28
|
-
import type { InstancesData } from '@forgeax/engine-render
|
|
28
|
+
import type { InstancesData } from '@forgeax/engine-render';
|
|
29
29
|
import { describe, expectTypeOf, it } from 'vitest';
|
|
30
30
|
|
|
31
31
|
describe('InstancesData shape (AC-06 ECS-managed array<f32> form)', () => {
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// instantiate-mount-deferred-wiring.test.ts — D-8 red-first test for the
|
|
2
|
+
// pre-existing structural hole that mount-collapse's serialized-Children
|
|
3
|
+
// dependency was masking (feat-20260707-engine-world-clone-transient-for-
|
|
4
|
+
// editor-ssot, plan-strategy D-8 / §3 static chain).
|
|
5
|
+
//
|
|
6
|
+
// The hole: _instantiateSceneAsset expands mounts[] FIRST (world.ts:3672-3676)
|
|
7
|
+
// and spawns owned entities SECOND (world.ts:3768-3790). When a mount has
|
|
8
|
+
// `mount.parent` pointing at an OWNED entity slot, that slot is still
|
|
9
|
+
// ENTITY_NULL_RAW at mount-processing time, so the ChildOf wiring guard
|
|
10
|
+
// (world.ts:3740-3757) silently skips — and there is NO later pass that
|
|
11
|
+
// re-attempts the wire. The mount carrier is therefore left WITHOUT a ChildOf
|
|
12
|
+
// edge to its owned parent.
|
|
13
|
+
//
|
|
14
|
+
// Before M1, the serialized `Children` array on the owned parent was written
|
|
15
|
+
// back on reload and re-established the W -> carrier down-link (world.ts:
|
|
16
|
+
// 3975-3987 array-of-entity remap), so collect's BFS could still reach the
|
|
17
|
+
// anchor. M1 declared `Children` transient (no longer serialized), unmasking
|
|
18
|
+
// the missing edge. This test asserts the edge directly, independent of
|
|
19
|
+
// serialized Children — so it FAILS on main too (proving the hole is
|
|
20
|
+
// PRE-EXISTING, not introduced by M1). m2t4's deferred wiring turns it green.
|
|
21
|
+
|
|
22
|
+
import type { Asset } from '@forgeax/engine-assets-runtime';
|
|
23
|
+
import { AssetRegistry } from '@forgeax/engine-assets-runtime';
|
|
24
|
+
import { type EntityHandle, World } from '@forgeax/engine-ecs';
|
|
25
|
+
import { AssetGuid } from '@forgeax/engine-pack/guid';
|
|
26
|
+
import { SceneInstance } from '@forgeax/engine-render';
|
|
27
|
+
import { ChildOf, Children, Transform } from '@forgeax/engine-scene';
|
|
28
|
+
import type { Handle, SceneAsset } from '@forgeax/engine-types';
|
|
29
|
+
import { describe, expect, it } from 'vitest';
|
|
30
|
+
import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
|
|
31
|
+
|
|
32
|
+
const G_CHILD = '11111111-1111-4111-8111-111111111111';
|
|
33
|
+
const G_PARENT = '22222222-2222-4222-8222-222222222222';
|
|
34
|
+
|
|
35
|
+
function mkReg(): AssetRegistry {
|
|
36
|
+
return new AssetRegistry(makeMockShaderRegistry());
|
|
37
|
+
}
|
|
38
|
+
function pg(s: string): AssetGuid {
|
|
39
|
+
const r = AssetGuid.parse(s);
|
|
40
|
+
if (!r.ok) throw new Error(`bad GUID: ${s}`);
|
|
41
|
+
return r.value;
|
|
42
|
+
}
|
|
43
|
+
function cat(reg: AssetRegistry, g: string, p: SceneAsset): void {
|
|
44
|
+
reg.catalog(pg(g), p as Asset);
|
|
45
|
+
}
|
|
46
|
+
function rs(w: World, a: SceneAsset): Handle<'SceneAsset', 'shared'> {
|
|
47
|
+
return w.allocSharedRef('SceneAsset', a);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function makeWorld(): World {
|
|
51
|
+
const world = new World();
|
|
52
|
+
for (const component of [ChildOf, Children, SceneInstance, Transform]) {
|
|
53
|
+
world.components.register(component).unwrap();
|
|
54
|
+
}
|
|
55
|
+
return world;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
describe('instantiate deferred ChildOf wiring for owned-parent mounts (D-8)', () => {
|
|
59
|
+
it('mount carrier whose parent is an owned entity gets ChildOf to that owned entity', () => {
|
|
60
|
+
const reg = mkReg();
|
|
61
|
+
const w = makeWorld();
|
|
62
|
+
|
|
63
|
+
// Child scene = one owned entity.
|
|
64
|
+
const child: SceneAsset = {
|
|
65
|
+
kind: 'scene',
|
|
66
|
+
entities: [{ localId: 0 as never, components: { Transform: { pos: [7, 0, 0] } } }],
|
|
67
|
+
};
|
|
68
|
+
cat(reg, G_CHILD, child);
|
|
69
|
+
|
|
70
|
+
// Parent scene: one OWNED entity W (localId 0) + one mount whose parent
|
|
71
|
+
// points at W's slot (localId 0). This is the editor's
|
|
72
|
+
// spawnGlbSceneAsMount on-disk shape (wrapper W + nested mount).
|
|
73
|
+
const parent: SceneAsset = {
|
|
74
|
+
kind: 'scene',
|
|
75
|
+
entities: [{ localId: 0 as never, components: { Transform: { pos: [1, 0, 0] } } }],
|
|
76
|
+
mounts: [
|
|
77
|
+
{
|
|
78
|
+
localId: 1 as never,
|
|
79
|
+
source: G_CHILD,
|
|
80
|
+
memberFirst: 2 as never,
|
|
81
|
+
memberCount: 1,
|
|
82
|
+
parent: 0 as never,
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
cat(reg, G_PARENT, parent);
|
|
87
|
+
|
|
88
|
+
const inst = reg.instantiate(rs(w, parent), w);
|
|
89
|
+
expect(inst.ok).toBe(true);
|
|
90
|
+
if (!inst.ok) return;
|
|
91
|
+
|
|
92
|
+
// The synthetic root carries SceneInstance; mapping[localId] -> live Entity.
|
|
93
|
+
const si = w.get(inst.value, SceneInstance);
|
|
94
|
+
expect(si.ok).toBe(true);
|
|
95
|
+
if (!si.ok) return;
|
|
96
|
+
const mapping = si.value.mapping;
|
|
97
|
+
|
|
98
|
+
const ownedW = mapping[0] as unknown as number; // owned entity W (localId 0)
|
|
99
|
+
const carrier = mapping[1] as unknown as EntityHandle; // mount carrier (localId 1)
|
|
100
|
+
expect(ownedW).toBeDefined();
|
|
101
|
+
expect(carrier).toBeDefined();
|
|
102
|
+
|
|
103
|
+
// The carrier MUST have a ChildOf whose parent is the owned entity W.
|
|
104
|
+
const co = w.get(carrier, ChildOf);
|
|
105
|
+
expect(co.ok, 'mount carrier must carry a ChildOf component').toBe(true);
|
|
106
|
+
if (!co.ok) return;
|
|
107
|
+
expect(
|
|
108
|
+
(co.value as { parent: number }).parent,
|
|
109
|
+
'carrier ChildOf.parent must equal the owned parent entity W',
|
|
110
|
+
).toBe(ownedW);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
@@ -10,21 +10,20 @@
|
|
|
10
10
|
// hello-room's smoke scene only carries 1 DirectionalLight; the
|
|
11
11
|
// PointLight / SpotLight / cone-falloff / 9-light linear-accumulation
|
|
12
12
|
// paths have no place in the smoke pipeline to be exercised. AC-09
|
|
13
|
-
// requires per-pixel readback in a real
|
|
14
|
-
//
|
|
13
|
+
// requires per-pixel canvas readback in a real renderer frame contract
|
|
14
|
+
// at 3+ sample points covering AC-09 (a)(b)(c)(d)
|
|
15
15
|
// plus a retreat path (point=0 + spot=0 collapses to directional-only
|
|
16
16
|
// and behaves indistinguishably from the prior feat baseline).
|
|
17
17
|
//
|
|
18
18
|
// What this round 2 file changes:
|
|
19
|
-
// - Drives the SUT through
|
|
19
|
+
// - Drives the SUT through the runtime host against a real
|
|
20
20
|
// 256x256 canvas attached to the document body (mirrors the canonical
|
|
21
21
|
// pattern in apps/learn-render/1.getting-started/1.hello-window/src/
|
|
22
22
|
// __tests__/hello-window.browser.test.ts).
|
|
23
23
|
// - Spawns the full 1+4+4 scene with deliberate light placement so the
|
|
24
24
|
// four AC-09 regions land on geometrically distinct pixel locations.
|
|
25
|
-
// - Calls
|
|
26
|
-
// to recover RGBA bytes
|
|
27
|
-
// entry; the same chain hello-window.browser.test.ts exercises).
|
|
25
|
+
// - Calls the renderer frame contract for several frames + test-owned
|
|
26
|
+
// canvas capture to recover RGBA bytes.
|
|
28
27
|
// - Asserts a 16 x 16 block-averaged sample at 4+ sites and uses the
|
|
29
28
|
// retreat-path readback as the directional-only baseline.
|
|
30
29
|
//
|
|
@@ -90,24 +89,26 @@
|
|
|
90
89
|
// section 6.1 4-light accumulation precedent) + Finding 9 (storage
|
|
91
90
|
// buffer count 0 retreat path).
|
|
92
91
|
|
|
92
|
+
import { type AssetRegistry, HANDLE_CUBE } from '@forgeax/engine-assets-runtime';
|
|
93
93
|
import { World } from '@forgeax/engine-ecs';
|
|
94
|
-
import { createPrimitiveMesh } from '@forgeax/engine-geometry';
|
|
95
94
|
import {
|
|
96
95
|
Camera,
|
|
97
96
|
DirectionalLight,
|
|
98
|
-
extractFrame,
|
|
99
97
|
MeshFilter,
|
|
100
98
|
MeshRenderer,
|
|
101
99
|
PointLight,
|
|
102
|
-
prepareExtractContext,
|
|
103
100
|
SpotLight,
|
|
104
|
-
} from '@forgeax/engine-render
|
|
101
|
+
} from '@forgeax/engine-render';
|
|
105
102
|
import { Transform } from '@forgeax/engine-scene';
|
|
106
103
|
import type { Handle, MaterialAsset } from '@forgeax/engine-types';
|
|
107
104
|
import { afterEach, describe, expect, it } from 'vitest';
|
|
108
|
-
import {
|
|
105
|
+
import { constructRuntimeRendererHost } from '../renderer-host';
|
|
109
106
|
|
|
110
|
-
type EngineRenderer =
|
|
107
|
+
type EngineRenderer = import('@forgeax/engine-render').Renderer;
|
|
108
|
+
interface RendererHarness {
|
|
109
|
+
readonly renderer: EngineRenderer;
|
|
110
|
+
readonly assets: AssetRegistry;
|
|
111
|
+
}
|
|
111
112
|
|
|
112
113
|
// Suppress WebGPU teardown race: chromium fires unhandled OperationError
|
|
113
114
|
// ("Instance dropped error in getCompilationInfo") when shader compilation
|
|
@@ -193,7 +194,6 @@ function spawnCamera(world: World): void {
|
|
|
193
194
|
}
|
|
194
195
|
|
|
195
196
|
function spawnStandardCube(world: World, hStandard: Handle<'MaterialAsset', 'shared'>): void {
|
|
196
|
-
const cubeHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
|
|
197
197
|
world
|
|
198
198
|
.spawn(
|
|
199
199
|
{
|
|
@@ -204,7 +204,7 @@ function spawnStandardCube(world: World, hStandard: Handle<'MaterialAsset', 'sha
|
|
|
204
204
|
scale: [1, 1, 1],
|
|
205
205
|
},
|
|
206
206
|
},
|
|
207
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
207
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
|
|
208
208
|
{ component: MeshRenderer, data: { materials: [hStandard] } },
|
|
209
209
|
)
|
|
210
210
|
.unwrap();
|
|
@@ -339,12 +339,26 @@ function colourDistance(a: SampleColour, b: SampleColour): number {
|
|
|
339
339
|
return Math.max(Math.abs(a.r - b.r), Math.abs(a.g - b.g), Math.abs(a.b - b.b));
|
|
340
340
|
}
|
|
341
341
|
|
|
342
|
-
async function buildRenderer(canvas: HTMLCanvasElement): Promise<
|
|
343
|
-
const
|
|
344
|
-
|
|
342
|
+
async function buildRenderer(canvas: HTMLCanvasElement): Promise<RendererHarness> {
|
|
343
|
+
const host = await constructRuntimeRendererHost(
|
|
344
|
+
canvas,
|
|
345
|
+
{},
|
|
346
|
+
{
|
|
347
|
+
shaderManifestUrl: '/shaders/manifest.json',
|
|
348
|
+
},
|
|
349
|
+
);
|
|
350
|
+
if (!host.ok) throw host.error;
|
|
351
|
+
if (host.value.renderer.inspect().state !== 'alive') {
|
|
352
|
+
throw new Error('runtime renderer host did not reach ready state');
|
|
353
|
+
}
|
|
354
|
+
return host.value;
|
|
345
355
|
}
|
|
346
356
|
|
|
347
|
-
async function readbackAfterDraw(
|
|
357
|
+
async function readbackAfterDraw(
|
|
358
|
+
renderer: EngineRenderer,
|
|
359
|
+
canvas: HTMLCanvasElement,
|
|
360
|
+
world: World,
|
|
361
|
+
): Promise<Uint8Array> {
|
|
348
362
|
// Pump multiple draw + rAF ticks so the chromium compositor consumes
|
|
349
363
|
// the WebGPU swap-chain texture into the canvas before readPixels()
|
|
350
364
|
// samples it. The createImageBitmap(canvas) path documented in
|
|
@@ -357,11 +371,15 @@ async function readbackAfterDraw(renderer: EngineRenderer, world: World): Promis
|
|
|
357
371
|
// 60 fps; in headless mode (process.env.CI set) the compositor can
|
|
358
372
|
// skip frames if there is no visible output, so the readback path
|
|
359
373
|
// below uses both rAF + setTimeout fences to bracket both modes.
|
|
360
|
-
const attached = renderer.
|
|
374
|
+
const attached = renderer.attach(world);
|
|
361
375
|
if (!attached.ok) throw attached.error;
|
|
362
376
|
for (let i = 0; i < FRAMES_PER_SCENE; i++) {
|
|
363
377
|
world.update(1 / 60).unwrap();
|
|
364
|
-
const r = renderer.draw(
|
|
378
|
+
const r = renderer.draw({
|
|
379
|
+
leases: [attached.value],
|
|
380
|
+
camera: { lease: attached.value },
|
|
381
|
+
environment: { lease: attached.value },
|
|
382
|
+
});
|
|
365
383
|
if (!r.ok) throw new Error(`renderer.draw frame ${i} failed`);
|
|
366
384
|
await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
|
|
367
385
|
}
|
|
@@ -371,18 +389,25 @@ async function readbackAfterDraw(renderer: EngineRenderer, world: World): Promis
|
|
|
371
389
|
await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
|
|
372
390
|
await new Promise<void>((resolve) => setTimeout(resolve, 50));
|
|
373
391
|
await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
|
|
374
|
-
// Two-shot readback: the first call
|
|
375
|
-
// chromium compositor into consuming the WebGPU swap-chain
|
|
376
|
-
//
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
392
|
+
// Two-shot test-owned canvas readback: the first call can kick the
|
|
393
|
+
// chromium compositor into consuming the WebGPU swap-chain; the second
|
|
394
|
+
// samples the consumed canvas content.
|
|
395
|
+
const readCanvas = async (): Promise<Uint8Array> => {
|
|
396
|
+
const bitmap = await createImageBitmap(canvas);
|
|
397
|
+
const offscreen = new OffscreenCanvas(bitmap.width, bitmap.height);
|
|
398
|
+
const context = offscreen.getContext('2d', { willReadFrequently: true });
|
|
399
|
+
if (context === null) {
|
|
400
|
+
bitmap.close();
|
|
401
|
+
throw new Error('OffscreenCanvas 2D context unavailable for canvas readback');
|
|
402
|
+
}
|
|
403
|
+
context.drawImage(bitmap, 0, 0);
|
|
404
|
+
const image = context.getImageData(0, 0, bitmap.width, bitmap.height);
|
|
405
|
+
bitmap.close();
|
|
406
|
+
return new Uint8Array(image.data.buffer, image.data.byteOffset, image.data.byteLength);
|
|
407
|
+
};
|
|
408
|
+
await readCanvas();
|
|
382
409
|
await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
|
|
383
|
-
|
|
384
|
-
if (!r.ok) throw new Error(`renderer.readPixels failed: ${r.error.code}`);
|
|
385
|
-
return r.value;
|
|
410
|
+
return readCanvas();
|
|
386
411
|
}
|
|
387
412
|
|
|
388
413
|
// Did the chromium compositor actually consume the painted frame in
|
|
@@ -430,12 +455,8 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
|
|
|
430
455
|
canvas.style.display = 'block';
|
|
431
456
|
document.body.appendChild(canvas);
|
|
432
457
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
const ready = await renderer.ready;
|
|
436
|
-
expect(ready.ok).toBe(true);
|
|
437
|
-
const assets = renderer.assets;
|
|
438
|
-
if (assets === null) throw new Error('renderer.assets unavailable on the WebGPU path');
|
|
458
|
+
const harness = await buildRenderer(canvas);
|
|
459
|
+
renderer = harness.renderer;
|
|
439
460
|
|
|
440
461
|
// -- Retreat-path world: 1 directional + 0 point + 0 spot. --
|
|
441
462
|
const baselineWorld = new World();
|
|
@@ -447,19 +468,10 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
|
|
|
447
468
|
spawnStandardCube(baselineWorld, hStandardBaseline);
|
|
448
469
|
spawnDirectional(baselineWorld);
|
|
449
470
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
baselineWorld,
|
|
453
|
-
prepareExtractContext(baselineWorld, { assets }),
|
|
454
|
-
);
|
|
455
|
-
expect(baselineFrame.lights.directional).toBeDefined();
|
|
456
|
-
expect(baselineFrame.lights.point).toHaveLength(0);
|
|
457
|
-
expect(baselineFrame.lights.spot).toHaveLength(0);
|
|
458
|
-
|
|
459
|
-
const baselinePixels = await readbackAfterDraw(renderer, baselineWorld);
|
|
460
|
-
// AC-09 readPixels-chain integrity (the round-1 reviewer issue
|
|
471
|
+
const baselinePixels = await readbackAfterDraw(renderer, canvas, baselineWorld);
|
|
472
|
+
// AC-09 canvas-readback chain integrity (the round-1 reviewer issue
|
|
461
473
|
// I-1): the readback returns a contract-shaped Uint8Array of the
|
|
462
|
-
// canvas size. This is the
|
|
474
|
+
// canvas size. This is the test-owned browser readback anchor
|
|
463
475
|
// anchor the round-1 review found absent.
|
|
464
476
|
expect(baselinePixels.length).toBe(CANVAS_W * CANVAS_H * 4);
|
|
465
477
|
|
|
@@ -492,16 +504,7 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
|
|
|
492
504
|
spawnSpotAimingAtOrigin(ninelightWorld, -1.5, 1.5, 1.5, 1.5, 12, 12, 25);
|
|
493
505
|
spawnSpotAimingAtOrigin(ninelightWorld, 0, -1.5, 1.5, 1.5, 12, 12, 25);
|
|
494
506
|
|
|
495
|
-
|
|
496
|
-
const ninelightFrame = extractFrame(
|
|
497
|
-
ninelightWorld,
|
|
498
|
-
prepareExtractContext(ninelightWorld, { assets }),
|
|
499
|
-
);
|
|
500
|
-
expect(ninelightFrame.lights.directional).toBeDefined();
|
|
501
|
-
expect(ninelightFrame.lights.point).toHaveLength(4);
|
|
502
|
-
expect(ninelightFrame.lights.spot).toHaveLength(4);
|
|
503
|
-
|
|
504
|
-
const ninelightPixels = await readbackAfterDraw(renderer, ninelightWorld);
|
|
507
|
+
const ninelightPixels = await readbackAfterDraw(renderer, canvas, ninelightWorld);
|
|
505
508
|
expect(ninelightPixels.length).toBe(CANVAS_W * CANVAS_H * 4);
|
|
506
509
|
|
|
507
510
|
// -- Step 3: sample 4 deliberate sites covering AC-09 (a)(b)(c)(d) --
|
|
@@ -581,7 +584,7 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
|
|
|
581
584
|
);
|
|
582
585
|
|
|
583
586
|
// -- Compositor-consumed gate (file header degradation rationale).
|
|
584
|
-
//
|
|
587
|
+
// the test-owned canvas readback goes through createImageBitmap(canvas)
|
|
585
588
|
// + OffscreenCanvas 2D drawImage + getImageData; the chromium
|
|
586
589
|
// headless compositor schedules the swap-chain consumption at
|
|
587
590
|
// rAF cadence. If the compositor has not yet consumed the
|
|
@@ -685,11 +688,8 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
|
|
|
685
688
|
canvas.style.display = 'block';
|
|
686
689
|
document.body.appendChild(canvas);
|
|
687
690
|
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
expect(ready.ok).toBe(true);
|
|
691
|
-
const assets = renderer.assets;
|
|
692
|
-
if (assets === null) throw new Error('renderer.assets unavailable on the WebGPU path');
|
|
691
|
+
const harness = await buildRenderer(canvas);
|
|
692
|
+
renderer = harness.renderer;
|
|
693
693
|
|
|
694
694
|
const world = new World();
|
|
695
695
|
spawnCamera(world);
|
|
@@ -700,14 +700,14 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
|
|
|
700
700
|
spawnStandardCube(world, hStandard);
|
|
701
701
|
spawnDirectional(world);
|
|
702
702
|
|
|
703
|
-
// Both readbacks go through
|
|
703
|
+
// Both readbacks go through the renderer frame contract plus test-owned canvas capture
|
|
704
704
|
// (the AC-09 readback chain). Length lock is the unconditional
|
|
705
705
|
// anchor; pixel-content lock applies only when the chromium
|
|
706
706
|
// compositor consumed both frames (otherwise both readbacks
|
|
707
707
|
// collapse to all-zero and `colourDistance` is trivially 0,
|
|
708
708
|
// which still satisfies the BLOCK_EPSILON contract).
|
|
709
|
-
const firstPixels = await readbackAfterDraw(renderer, world);
|
|
710
|
-
const secondPixels = await readbackAfterDraw(renderer, world);
|
|
709
|
+
const firstPixels = await readbackAfterDraw(renderer, canvas, world);
|
|
710
|
+
const secondPixels = await readbackAfterDraw(renderer, canvas, world);
|
|
711
711
|
expect(firstPixels.length).toBe(CANVAS_W * CANVAS_H * 4);
|
|
712
712
|
expect(secondPixels.length).toBe(CANVAS_W * CANVAS_H * 4);
|
|
713
713
|
|
|
@@ -757,11 +757,8 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
|
|
|
757
757
|
canvas.style.display = 'block';
|
|
758
758
|
document.body.appendChild(canvas);
|
|
759
759
|
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
expect(ready.ok).toBe(true);
|
|
763
|
-
const assets = renderer.assets;
|
|
764
|
-
if (assets === null) throw new Error('renderer.assets unavailable on the WebGPU path');
|
|
760
|
+
const harness = await buildRenderer(canvas);
|
|
761
|
+
renderer = harness.renderer;
|
|
765
762
|
|
|
766
763
|
// -- Step A: directional-only baseline (1 + 0 + 0). --
|
|
767
764
|
const baselineWorld = new World();
|
|
@@ -772,7 +769,7 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
|
|
|
772
769
|
);
|
|
773
770
|
spawnStandardCube(baselineWorld, hStandardBaseline);
|
|
774
771
|
spawnDirectional(baselineWorld);
|
|
775
|
-
const baselinePixels = await readbackAfterDraw(renderer, baselineWorld);
|
|
772
|
+
const baselinePixels = await readbackAfterDraw(renderer, canvas, baselineWorld);
|
|
776
773
|
expect(baselinePixels.length).toBe(CANVAS_W * CANVAS_H * 4);
|
|
777
774
|
|
|
778
775
|
// -- Step B: directional + 1 PointLight on the world `+Z` (front)
|
|
@@ -791,7 +788,7 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
|
|
|
791
788
|
// smoothstep(-1, 1, -1) = 0 (worst case! pre-fix bug actually
|
|
792
789
|
// ELIMINATED the +Z PointLight). Post-fix: full omnidirectional.
|
|
793
790
|
spawnPointAt(plusZWorld, 0, 0, 2, 5.0, 20);
|
|
794
|
-
const plusZPixels = await readbackAfterDraw(renderer, plusZWorld);
|
|
791
|
+
const plusZPixels = await readbackAfterDraw(renderer, canvas, plusZWorld);
|
|
795
792
|
expect(plusZPixels.length).toBe(CANVAS_W * CANVAS_H * 4);
|
|
796
793
|
|
|
797
794
|
// -- Step C: directional + 1 PointLight on the world `-Z` (back)
|
|
@@ -817,7 +814,7 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
|
|
|
817
814
|
// origin, fov=PI/4 -> the cube sides peek into view). Sample at
|
|
818
815
|
// the cube right-mid pixel where the +X side face projects.
|
|
819
816
|
spawnPointAt(minusZWorld, 1.5, 0, 0, 5.0, 20);
|
|
820
|
-
const minusZPixels = await readbackAfterDraw(renderer, minusZWorld);
|
|
817
|
+
const minusZPixels = await readbackAfterDraw(renderer, canvas, minusZWorld);
|
|
821
818
|
expect(minusZPixels.length).toBe(CANVAS_W * CANVAS_H * 4);
|
|
822
819
|
|
|
823
820
|
const cubeCx = CANVAS_W >> 1;
|
|
@@ -13,23 +13,22 @@
|
|
|
13
13
|
// (Camera clear pass is M3, not here.)
|
|
14
14
|
|
|
15
15
|
import { vec3 } from '@forgeax/engine-math';
|
|
16
|
+
import type { Buffer, RhiQueue } from '@forgeax/engine-rhi';
|
|
17
|
+
import { ok } from '@forgeax/engine-rhi';
|
|
18
|
+
import { describe, expect, it } from 'vitest';
|
|
19
|
+
import { packPointLight, packSpotLight } from '../../../render/src/light-buffer-layout';
|
|
20
|
+
import { writeViewUbo } from '../../../render/src/record/view-ubo';
|
|
21
|
+
import type { CameraSnapshot } from '../../../render/src/render-contract';
|
|
16
22
|
import type {
|
|
17
|
-
CameraSnapshot,
|
|
18
23
|
DirectionalLightSnapshot,
|
|
19
24
|
ExtractedLights,
|
|
20
25
|
PointLightSnapshot,
|
|
21
26
|
SkylightSnapshot,
|
|
22
27
|
SpotLightSnapshot,
|
|
23
|
-
} from '
|
|
24
|
-
import { packPointLight, packSpotLight, writeViewUbo } from '@forgeax/engine-render/internal';
|
|
25
|
-
import type { Buffer, RhiQueue } from '@forgeax/engine-rhi';
|
|
26
|
-
import { ok } from '@forgeax/engine-rhi';
|
|
27
|
-
import { describe, expect, it } from 'vitest';
|
|
28
|
+
} from '../../../render/src/render-system-extract';
|
|
28
29
|
|
|
29
30
|
function identityCamera(): CameraSnapshot {
|
|
30
31
|
return {
|
|
31
|
-
worldId: 0,
|
|
32
|
-
entityKey: 0,
|
|
33
32
|
position: vec3.create(0, 0, 3),
|
|
34
33
|
world: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 3, 1]),
|
|
35
34
|
fov: Math.PI / 4,
|
|
@@ -45,7 +44,6 @@ function identityCamera(): CameraSnapshot {
|
|
|
45
44
|
exposure: 1,
|
|
46
45
|
whitePoint: 4,
|
|
47
46
|
antialias: 'none' as CameraSnapshot['antialias'],
|
|
48
|
-
historyVersion: 0,
|
|
49
47
|
bloom: 'off' as CameraSnapshot['bloom'],
|
|
50
48
|
bloomThreshold: 1,
|
|
51
49
|
bloomIntensity: 1,
|
|
@@ -122,7 +120,6 @@ describe('w7 -- light GPU pack byte-neutral (AC-11)', () => {
|
|
|
122
120
|
it('packSpotLight writes color slots 4..6 + direction slots 8..10 byte-for-byte (64 B)', () => {
|
|
123
121
|
const snap: SpotLightSnapshot = {
|
|
124
122
|
kind: 'spot',
|
|
125
|
-
entity: 0,
|
|
126
123
|
position: vec3.create(0, 5, 0),
|
|
127
124
|
direction: vec3.create(0.1, -0.9, 0.2),
|
|
128
125
|
color: vec3.create(0.3, 0.4, 0.5),
|
|
@@ -20,14 +20,14 @@
|
|
|
20
20
|
// `*.test-d.ts` suffix (root vitest config K-3 unit project's typecheck pass
|
|
21
21
|
// covers any .test-d.ts file in any package).
|
|
22
22
|
|
|
23
|
+
import { expectTypeOf, test } from 'vitest';
|
|
23
24
|
import type {
|
|
24
25
|
DirectionalLightSnapshot,
|
|
25
26
|
ExtractedLights,
|
|
26
27
|
LightSnapshot,
|
|
27
28
|
PointLightSnapshot,
|
|
28
29
|
SpotLightSnapshot,
|
|
29
|
-
} from '
|
|
30
|
-
import { expectTypeOf, test } from 'vitest';
|
|
30
|
+
} from '../../../render/src/render-system-extract';
|
|
31
31
|
|
|
32
32
|
function assertNever(_x: never): never {
|
|
33
33
|
throw new Error('exhaustive');
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// type assertions do NOT count), so the vitest typecheck project enforces it.
|
|
11
11
|
|
|
12
12
|
import { World } from '@forgeax/engine-ecs';
|
|
13
|
-
import { DirectionalLight, PointLight, Skylight, SpotLight } from '@forgeax/engine-render
|
|
13
|
+
import { DirectionalLight, PointLight, Skylight, SpotLight } from '@forgeax/engine-render';
|
|
14
14
|
import { describe, it } from 'vitest';
|
|
15
15
|
|
|
16
16
|
describe('w5a -- residual per-axis light keys are compile errors (AC-04)', () => {
|