@forgeax/engine-runtime 0.1.3 → 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
|
@@ -44,21 +44,14 @@
|
|
|
44
44
|
// Each scene captures the rendered RGBA, then the comparator across the two
|
|
45
45
|
// captured byte arrays asserts mid-band divergence.
|
|
46
46
|
|
|
47
|
-
import {
|
|
48
|
-
import {
|
|
49
|
-
import {
|
|
47
|
+
import { AssetRegistry, HANDLE_QUAD } from '@forgeax/engine-assets-runtime';
|
|
48
|
+
import { World } from '@forgeax/engine-ecs';
|
|
49
|
+
import { Camera, MeshFilter, MeshRenderer } from '@forgeax/engine-render';
|
|
50
50
|
import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '@forgeax/engine-render/authoring';
|
|
51
|
-
import {
|
|
52
|
-
ANTIALIAS_NONE,
|
|
53
|
-
Camera,
|
|
54
|
-
MeshFilter,
|
|
55
|
-
MeshRenderer,
|
|
56
|
-
TONEMAP_NONE,
|
|
57
|
-
} from '@forgeax/engine-render/internal';
|
|
58
|
-
import { createRenderer } from '@forgeax/engine-runtime';
|
|
59
|
-
import { scenePlugin, Transform } from '@forgeax/engine-scene';
|
|
51
|
+
import { Transform } from '@forgeax/engine-scene';
|
|
60
52
|
import type { MaterialAsset, TextureAsset } from '@forgeax/engine-types';
|
|
61
53
|
import { describe, expect, it } from 'vitest';
|
|
54
|
+
import { constructRuntimeRendererHost } from '../../renderer-host';
|
|
62
55
|
import { drawPublished } from '../draw-published';
|
|
63
56
|
|
|
64
57
|
const WIDTH = 64;
|
|
@@ -179,39 +172,28 @@ async function renderOneFrame(opts: {
|
|
|
179
172
|
removeEventListener() {},
|
|
180
173
|
} as unknown as HTMLCanvasElement;
|
|
181
174
|
|
|
182
|
-
let
|
|
175
|
+
let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
|
|
183
176
|
try {
|
|
184
|
-
|
|
177
|
+
host = await constructRuntimeRendererHost(
|
|
178
|
+
mockCanvas,
|
|
179
|
+
{},
|
|
180
|
+
{
|
|
181
|
+
shaderManifestUrl: ENGINE_MANIFEST_URL,
|
|
182
|
+
},
|
|
183
|
+
);
|
|
185
184
|
} finally {
|
|
186
185
|
globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
|
|
187
186
|
}
|
|
188
|
-
expect(
|
|
189
|
-
|
|
190
|
-
const
|
|
191
|
-
expect(
|
|
192
|
-
|
|
187
|
+
expect(host.ok).toBe(true);
|
|
188
|
+
if (!host.ok) throw host.error;
|
|
189
|
+
const { renderer, assets } = host.value;
|
|
190
|
+
expect(renderer.inspect().state).toBe('alive');
|
|
191
|
+
expect(assets).toBeInstanceOf(AssetRegistry);
|
|
193
192
|
|
|
194
193
|
const world = new World();
|
|
195
|
-
await createWorldContext(world, [renderComponentsPlugin(), scenePlugin()]);
|
|
196
|
-
const nineSliceHandle = world.internSharedRef(
|
|
197
|
-
'MeshAsset',
|
|
198
|
-
createPrimitiveMesh('nine-slice-quad').unwrap(),
|
|
199
|
-
);
|
|
200
194
|
|
|
201
195
|
const texAsset = makeCornerCheckerTexture();
|
|
202
196
|
const texHandle = world.allocSharedRef<'TextureAsset', TextureAsset>('TextureAsset', texAsset);
|
|
203
|
-
// feat-20260601-gpu-resource-store-extraction M1: explicit texture GPU upload.
|
|
204
|
-
const texUploadRes = await renderer.store.uploadTexture(texHandle, texAsset, {
|
|
205
|
-
bytes: texAsset.data as Uint8Array,
|
|
206
|
-
width: texAsset.width,
|
|
207
|
-
height: texAsset.height,
|
|
208
|
-
mime: 'image/png',
|
|
209
|
-
colorSpace: texAsset.colorSpace,
|
|
210
|
-
mipmap: texAsset.mipmap,
|
|
211
|
-
});
|
|
212
|
-
expect(texUploadRes.ok).toBe(true);
|
|
213
|
-
if (!texUploadRes.ok) throw new Error('texture upload failed');
|
|
214
|
-
|
|
215
197
|
// D-4 explicit constraint: tile mode uses the sprite pipeline's shared
|
|
216
198
|
// renderer-owned repeat sampler, so vertex-shader-emitted uv > 1 wraps via
|
|
217
199
|
// the hardware sampler. Both scenes use that same configuration; the only
|
|
@@ -237,37 +219,28 @@ async function renderOneFrame(opts: {
|
|
|
237
219
|
{ name: 'baseColorTexture', type: 'texture', optional: true },
|
|
238
220
|
],
|
|
239
221
|
values: {
|
|
240
|
-
colorTint: [1, 1, 1, 1],
|
|
241
|
-
region: [0, 0, 1, 1],
|
|
242
|
-
pivotAndSize: [0.5, 0.5, 1, 1],
|
|
243
222
|
// feat-20260625 M3 / w11 (D-4): UBO-aligned field names. The
|
|
244
223
|
// extract-stage backwards-compat fold (render-system-extract.ts
|
|
245
224
|
// L2344) keeps the legacy `slices` + `sliceMode` split working for
|
|
246
225
|
// unmigrated demos, but new tests declare the UBO-aligned
|
|
247
226
|
// `slicesAndMode` vec4 directly: `.xyz` = [left, top, right] in UV,
|
|
248
227
|
// `.w` carries the sliceMode sentinel (>=0 stretch, <0 tile).
|
|
249
|
-
baseColorTexture: {
|
|
250
|
-
texture: texHandle as unknown as never,
|
|
251
|
-
coordinates: {
|
|
252
|
-
set: 0,
|
|
253
|
-
transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
|
|
254
|
-
physicalUvScale: [1, 1],
|
|
255
|
-
},
|
|
256
|
-
},
|
|
228
|
+
baseColorTexture: { texture: texHandle as unknown as never },
|
|
257
229
|
slicesAndMode: [0.25, 0.25, 0.25, opts.sliceMode === 1 ? -0.25 : 0.25],
|
|
258
230
|
},
|
|
259
231
|
});
|
|
260
232
|
|
|
261
233
|
const errors: unknown[] = [];
|
|
262
|
-
renderer.
|
|
263
|
-
|
|
234
|
+
renderer.subscribe((event) => {
|
|
235
|
+
if (event.kind !== 'error') return;
|
|
236
|
+
errors.push(event.error);
|
|
264
237
|
});
|
|
265
238
|
|
|
266
239
|
// ASYMMETRIC scale: x=4*y. Under uniform 9-slice mapping the corners stay
|
|
267
240
|
// square so the central band is highly stretched; without 9-slice (legacy
|
|
268
241
|
// path) the entire quad stretches as one. The asymmetry amplifies the
|
|
269
242
|
// mid-band pixel divergence between the two modes after w15 lands.
|
|
270
|
-
|
|
243
|
+
world.spawn(
|
|
271
244
|
{
|
|
272
245
|
component: Transform,
|
|
273
246
|
data: {
|
|
@@ -276,12 +249,10 @@ async function renderOneFrame(opts: {
|
|
|
276
249
|
scale: [opts.scaleX, opts.scaleY, 1],
|
|
277
250
|
},
|
|
278
251
|
},
|
|
279
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
252
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_QUAD } },
|
|
280
253
|
{ component: MeshRenderer, data: { materials: [matHandle] } },
|
|
281
254
|
);
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
const cameraSpawn = world.spawn(
|
|
255
|
+
world.spawn(
|
|
285
256
|
{
|
|
286
257
|
component: Transform,
|
|
287
258
|
data: {
|
|
@@ -292,17 +263,9 @@ async function renderOneFrame(opts: {
|
|
|
292
263
|
},
|
|
293
264
|
{
|
|
294
265
|
component: Camera,
|
|
295
|
-
data: {
|
|
296
|
-
fov: Math.PI / 4,
|
|
297
|
-
aspect: 1,
|
|
298
|
-
near: 0.1,
|
|
299
|
-
far: 100,
|
|
300
|
-
tonemap: TONEMAP_NONE,
|
|
301
|
-
antialias: ANTIALIAS_NONE,
|
|
302
|
-
},
|
|
266
|
+
data: { fov: Math.PI / 4, aspect: 1, near: 0.1, far: 100 },
|
|
303
267
|
},
|
|
304
268
|
);
|
|
305
|
-
expect(cameraSpawn.ok).toBe(true);
|
|
306
269
|
|
|
307
270
|
const drawn = drawPublished(renderer, world);
|
|
308
271
|
expect(drawn.ok).toBe(true);
|
|
@@ -371,6 +334,7 @@ describe('feat-20260527-sprite-nineslice w14 dawn smoke (stretch vs tile diverge
|
|
|
371
334
|
// x-band differ between modes; pre-w15 the two scenes are byte-identical.
|
|
372
335
|
const stretch = await renderOneFrame({ sliceMode: 0, scaleX: 4, scaleY: 1 });
|
|
373
336
|
const tile = await renderOneFrame({ sliceMode: 1, scaleX: 4, scaleY: 1 });
|
|
337
|
+
|
|
374
338
|
expect(stretch.errors).toEqual([]);
|
|
375
339
|
expect(tile.errors).toEqual([]);
|
|
376
340
|
|
|
@@ -16,14 +16,16 @@
|
|
|
16
16
|
|
|
17
17
|
import { World } from '@forgeax/engine-ecs';
|
|
18
18
|
import { composeShader } from '@forgeax/engine-naga';
|
|
19
|
+
import { ok, type RhiDevice, type Texture } from '@forgeax/engine-rhi';
|
|
20
|
+
import { _internal_getRawDevice, createShaderModule, rhi } from '@forgeax/engine-rhi-webgpu';
|
|
21
|
+
import type { EquirectAsset, TextureFormat } from '@forgeax/engine-types';
|
|
22
|
+
import { describe, expect, it } from 'vitest';
|
|
23
|
+
import { DeviceScope } from '../../../../render/src/device/device-scope';
|
|
24
|
+
import { GpuResidencyCache } from '../../../../render/src/device/gpu-residency';
|
|
19
25
|
import {
|
|
20
|
-
GpuResourceStore,
|
|
21
26
|
getOrCreateIblCache,
|
|
22
27
|
setIblComposedShaders,
|
|
23
|
-
} from '
|
|
24
|
-
import { ok } from '@forgeax/engine-rhi';
|
|
25
|
-
import type { EquirectAsset, TextureFormat } from '@forgeax/engine-types';
|
|
26
|
-
import { describe, expect, it } from 'vitest';
|
|
28
|
+
} from '../../../../render/src/ibl/IblPipelineCache';
|
|
27
29
|
|
|
28
30
|
const mockCaps = {
|
|
29
31
|
backendKind: 'webgpu' as const,
|
|
@@ -47,7 +49,7 @@ const mockCaps = {
|
|
|
47
49
|
maxColorAttachments: 8,
|
|
48
50
|
};
|
|
49
51
|
|
|
50
|
-
// feat-20260601-gpu-
|
|
52
|
+
// feat-20260601-device/gpu-residency-extraction M1 (D-3 falsifiable anchor): a
|
|
51
53
|
// single store._uploadCubemapFromEquirect(world, srcHandle, srcPod) returns the
|
|
52
54
|
// cube handle, and store.getCubemapGpuTexture(cubeHandle) reads it back -- the
|
|
53
55
|
// single-call contract is preserved. The cube POD register-relay is injected
|
|
@@ -114,8 +116,17 @@ function makeWhiteEquirect(): EquirectAsset {
|
|
|
114
116
|
};
|
|
115
117
|
}
|
|
116
118
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
+
/** Raw resource conversion is confined to this Dawn readback boundary. */
|
|
120
|
+
function rawTexture(texture: Texture): GPUTexture {
|
|
121
|
+
return texture as unknown as GPUTexture;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async function readbackRgba16f(
|
|
125
|
+
device: GPUDevice,
|
|
126
|
+
texture: GPUTexture,
|
|
127
|
+
arrayLayer: number,
|
|
128
|
+
mipLevel: number,
|
|
129
|
+
): Promise<number[]> {
|
|
119
130
|
// Read one pixel from (0,0) of (face=arrayLayer, mip=mipLevel).
|
|
120
131
|
const bytesPerRow = 256;
|
|
121
132
|
const buffer = device.createBuffer({
|
|
@@ -159,81 +170,79 @@ describe('t51 (M3.5) -- dawn IBL 4-pass non-zero readback', () => {
|
|
|
159
170
|
// dawn-node tests stand in for vite-plugin-shader by composing on
|
|
160
171
|
// demand via @forgeax/engine-naga.
|
|
161
172
|
await composeIblShadersForDawn();
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
const
|
|
173
|
+
const adapterResult = await rhi.requestAdapter();
|
|
174
|
+
if (!adapterResult.ok) throw adapterResult.error;
|
|
175
|
+
const deviceResult = await adapterResult.value.requestDevice();
|
|
176
|
+
if (!deviceResult.ok) throw deviceResult.error;
|
|
177
|
+
const rhiDevice: RhiDevice = deviceResult.value;
|
|
178
|
+
const rawDevice = _internal_getRawDevice(rhiDevice);
|
|
179
|
+
if (rawDevice === undefined) {
|
|
180
|
+
throw new Error('Dawn IBL readback requires the RHI WebGPU raw-device test boundary');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const store = new GpuResidencyCache();
|
|
184
|
+
const scope = DeviceScope.create(0, 'ibl-dawn-test');
|
|
185
|
+
store.bindDeviceScope(scope);
|
|
167
186
|
const world = new World();
|
|
168
187
|
const equirect = makeWhiteEquirect();
|
|
169
188
|
const equirectHandle = world.allocSharedRef('EquirectAsset', equirect);
|
|
170
189
|
|
|
171
|
-
//
|
|
172
|
-
//
|
|
173
|
-
//
|
|
190
|
+
// The production path receives the opaque RhiDevice and the same
|
|
191
|
+
// Result-returning shader factory used by the WebGPU backend. Raw GPU
|
|
192
|
+
// access remains confined to readback below.
|
|
174
193
|
store.configureGpuDevice(
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
// biome-ignore lint/suspicious/noExplicitAny: dawn device shape
|
|
178
|
-
async (d: any, desc: { code: string; label?: string }) => {
|
|
179
|
-
const mod = d.createShaderModule({ code: desc.code, label: desc.label });
|
|
180
|
-
// biome-ignore lint/suspicious/noExplicitAny: matching shim Result shape
|
|
181
|
-
return { ok: true, value: mod, unwrap: () => mod, unwrapOr: () => mod } as any;
|
|
182
|
-
},
|
|
194
|
+
rhiDevice,
|
|
195
|
+
undefined,
|
|
183
196
|
(w: World, pod: EquirectAsset) => ok(w.allocSharedRef('EquirectAsset', pod)),
|
|
184
197
|
mockCaps,
|
|
185
198
|
);
|
|
199
|
+
store.configureIblDevice(rhiDevice, createShaderModule);
|
|
186
200
|
|
|
187
201
|
// Single call returns the cube handle (D-3 single-call contract). The
|
|
188
202
|
// projection method is @internal (private) after feat-20260630 M2 / w11;
|
|
189
203
|
// the dawn test reaches it through the store internals.
|
|
190
|
-
|
|
191
|
-
const result = await (store as any)._uploadCubemapFromEquirect(
|
|
192
|
-
world,
|
|
193
|
-
equirectHandle,
|
|
194
|
-
equirect,
|
|
195
|
-
);
|
|
204
|
+
const result = await store._uploadCubemapFromEquirect(world, equirectHandle, equirect);
|
|
196
205
|
expect(result.ok).toBe(true);
|
|
197
206
|
if (!result.ok) return;
|
|
198
207
|
|
|
199
208
|
const cubeHandle = result.value;
|
|
200
|
-
|
|
201
|
-
const cubeTexture = store.getCubemapGpuTexture(cubeHandle as any);
|
|
209
|
+
const cubeTexture = store.getCubemapGpuTexture(cubeHandle);
|
|
202
210
|
expect(cubeTexture).toBeDefined();
|
|
211
|
+
if (cubeTexture === undefined) return;
|
|
203
212
|
|
|
204
|
-
// feat-20260612 M3 / w11 (1c76c1b9):
|
|
213
|
+
// feat-20260612 M3 / w11 (1c76c1b9): GpuResidencyCache handle maps now
|
|
205
214
|
// hold the GpuTexture wrapper (`{handle, isDestroyed, destroy()}`).
|
|
206
215
|
// dawn-node `copyTextureToBuffer` consumes the raw GPUTexture handle,
|
|
207
216
|
// so the wrapper unwrap goes via `.handle` here. The IBL cache slots
|
|
208
217
|
// below still hold raw textures (the ibl/IblPipelineCache wrapping is
|
|
209
218
|
// OOS for this feat -- D-8 / OOS-10).
|
|
210
|
-
|
|
211
|
-
const cubeRaw = (cubeTexture as any).handle;
|
|
219
|
+
const cubeRaw = rawTexture(cubeTexture.handle);
|
|
212
220
|
|
|
213
221
|
// (a) equirect-to-cube face 0 center pixel != 0
|
|
214
|
-
const cubePx = await readbackRgba16f(
|
|
222
|
+
const cubePx = await readbackRgba16f(rawDevice, cubeRaw, 0, 0);
|
|
215
223
|
expect(cubePx.some((c) => c !== 0)).toBe(true);
|
|
216
224
|
|
|
217
225
|
// (b) irradiance, (c) prefilter, (d) brdfLut: the textures live on
|
|
218
|
-
// IblPipelineCache after t52/t53. Read
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
+
// IblPipelineCache after t52/t53. Read opaque cache slots through the
|
|
227
|
+
// test-only raw texture boundary.
|
|
228
|
+
const cache = getOrCreateIblCache(scope);
|
|
229
|
+
const {
|
|
230
|
+
irradianceTexture: irrTex,
|
|
231
|
+
prefilterTexture: prefTex,
|
|
232
|
+
brdfLutTexture: brdfTex,
|
|
233
|
+
} = cache;
|
|
226
234
|
expect(irrTex).toBeDefined();
|
|
227
235
|
expect(prefTex).toBeDefined();
|
|
228
236
|
expect(brdfTex).toBeDefined();
|
|
237
|
+
if (irrTex === undefined || prefTex === undefined || brdfTex === undefined) return;
|
|
229
238
|
|
|
230
|
-
const irrPx = await readbackRgba16f(
|
|
239
|
+
const irrPx = await readbackRgba16f(rawDevice, rawTexture(irrTex), 0, 0);
|
|
231
240
|
expect(irrPx.some((c) => c !== 0)).toBe(true);
|
|
232
241
|
|
|
233
|
-
const prefPx = await readbackRgba16f(
|
|
242
|
+
const prefPx = await readbackRgba16f(rawDevice, rawTexture(prefTex), 0, 0);
|
|
234
243
|
expect(prefPx.some((c) => c !== 0)).toBe(true);
|
|
235
244
|
|
|
236
|
-
const brdfPx = await readbackRgba16f(
|
|
245
|
+
const brdfPx = await readbackRgba16f(rawDevice, rawTexture(brdfTex), 0, 0);
|
|
237
246
|
expect(brdfPx.some((c) => c !== 0)).toBe(true);
|
|
238
247
|
},
|
|
239
248
|
60_000,
|
|
@@ -24,19 +24,19 @@
|
|
|
24
24
|
// Falsification is exercised by the parity smoke (AC-08) and learn-render
|
|
25
25
|
// M3 smoke (AC-09).
|
|
26
26
|
|
|
27
|
+
import { AssetRegistry, HANDLE_CUBE } from '@forgeax/engine-assets-runtime';
|
|
27
28
|
import { World } from '@forgeax/engine-ecs';
|
|
28
|
-
import { createPrimitiveMesh } from '@forgeax/engine-geometry';
|
|
29
29
|
import {
|
|
30
30
|
Camera,
|
|
31
31
|
DirectionalLight,
|
|
32
32
|
Instances,
|
|
33
33
|
MeshFilter,
|
|
34
34
|
MeshRenderer,
|
|
35
|
-
} from '@forgeax/engine-render
|
|
36
|
-
import { createRenderer } from '@forgeax/engine-runtime';
|
|
35
|
+
} from '@forgeax/engine-render';
|
|
37
36
|
import { Transform } from '@forgeax/engine-scene';
|
|
38
37
|
import type { MaterialAsset } from '@forgeax/engine-types';
|
|
39
38
|
import { describe, expect, it } from 'vitest';
|
|
39
|
+
import { constructRuntimeRendererHost } from '../../renderer-host';
|
|
40
40
|
import { drawPublished } from '../draw-published';
|
|
41
41
|
|
|
42
42
|
const WIDTH = 512;
|
|
@@ -147,17 +147,23 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
147
147
|
removeEventListener() {},
|
|
148
148
|
} as unknown as HTMLCanvasElement;
|
|
149
149
|
|
|
150
|
-
let
|
|
150
|
+
let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
|
|
151
151
|
try {
|
|
152
|
-
|
|
152
|
+
host = await constructRuntimeRendererHost(
|
|
153
|
+
mockCanvas,
|
|
154
|
+
{},
|
|
155
|
+
{
|
|
156
|
+
shaderManifestUrl: ENGINE_MANIFEST_URL,
|
|
157
|
+
},
|
|
158
|
+
);
|
|
153
159
|
} finally {
|
|
154
160
|
globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
|
|
155
161
|
}
|
|
156
|
-
expect(
|
|
157
|
-
|
|
158
|
-
const
|
|
159
|
-
expect(
|
|
160
|
-
|
|
162
|
+
expect(host.ok).toBe(true);
|
|
163
|
+
if (!host.ok) throw host.error;
|
|
164
|
+
const { renderer, assets } = host.value;
|
|
165
|
+
expect(renderer.inspect().state).toBe('alive');
|
|
166
|
+
expect(assets).toBeInstanceOf(AssetRegistry);
|
|
161
167
|
|
|
162
168
|
// Material creation (PBR standard). D-18: a shared-ref handle is per-World;
|
|
163
169
|
// each frame's World allocs the same payload to get a handle it can resolve.
|
|
@@ -182,7 +188,6 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
182
188
|
|
|
183
189
|
// --- Frame A: instances=N (grid spread) ---
|
|
184
190
|
const worldN = new World();
|
|
185
|
-
const cubeHandleN = worldN.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
|
|
186
191
|
const matHandleN = worldN.allocSharedRef<'MaterialAsset', MaterialAsset>(
|
|
187
192
|
'MaterialAsset',
|
|
188
193
|
matAsset,
|
|
@@ -196,7 +201,7 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
196
201
|
scale: [0.5, 0.5, 0.5],
|
|
197
202
|
},
|
|
198
203
|
},
|
|
199
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
204
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
|
|
200
205
|
{ component: MeshRenderer, data: { materials: [matHandleN] } },
|
|
201
206
|
{ component: Instances, data: { transforms: transformsN } },
|
|
202
207
|
);
|
|
@@ -263,7 +268,6 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
263
268
|
singleTransform[15] = 1;
|
|
264
269
|
|
|
265
270
|
const world1 = new World();
|
|
266
|
-
const cubeHandle1 = world1.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
|
|
267
271
|
const matHandle1 = world1.allocSharedRef<'MaterialAsset', MaterialAsset>(
|
|
268
272
|
'MaterialAsset',
|
|
269
273
|
matAsset,
|
|
@@ -277,7 +281,7 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
277
281
|
scale: [0.5, 0.5, 0.5],
|
|
278
282
|
},
|
|
279
283
|
},
|
|
280
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
284
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
|
|
281
285
|
{ component: MeshRenderer, data: { materials: [matHandle1] } },
|
|
282
286
|
{ component: Instances, data: { transforms: singleTransform } },
|
|
283
287
|
);
|
|
@@ -428,17 +432,23 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
428
432
|
removeEventListener() {},
|
|
429
433
|
} as unknown as HTMLCanvasElement;
|
|
430
434
|
|
|
431
|
-
let
|
|
435
|
+
let host2: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
|
|
432
436
|
try {
|
|
433
|
-
|
|
437
|
+
host2 = await constructRuntimeRendererHost(
|
|
438
|
+
mockCanvas2,
|
|
439
|
+
{},
|
|
440
|
+
{
|
|
441
|
+
shaderManifestUrl: ENGINE_MANIFEST_URL,
|
|
442
|
+
},
|
|
443
|
+
);
|
|
434
444
|
} finally {
|
|
435
445
|
globalThis.navigator.gpu.requestAdapter = origReqAdapter2;
|
|
436
446
|
}
|
|
437
|
-
expect(
|
|
438
|
-
|
|
439
|
-
const
|
|
440
|
-
expect(
|
|
441
|
-
|
|
447
|
+
expect(host2.ok).toBe(true);
|
|
448
|
+
if (!host2.ok) throw host2.error;
|
|
449
|
+
const { renderer: renderer2, assets: assets2 } = host2.value;
|
|
450
|
+
expect(renderer2.inspect().state).toBe('alive');
|
|
451
|
+
expect(assets2).toBeInstanceOf(AssetRegistry);
|
|
442
452
|
|
|
443
453
|
// Unlit material
|
|
444
454
|
const matAsset2: MaterialAsset = {
|
|
@@ -457,7 +467,6 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
457
467
|
|
|
458
468
|
// Frame A: N instances
|
|
459
469
|
const worldN2 = new World();
|
|
460
|
-
const cubeHandleN2 = worldN2.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
|
|
461
470
|
const matHandleN2 = worldN2.allocSharedRef<'MaterialAsset', MaterialAsset>(
|
|
462
471
|
'MaterialAsset',
|
|
463
472
|
matAsset2,
|
|
@@ -471,7 +480,7 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
471
480
|
scale: [0.5, 0.5, 0.5],
|
|
472
481
|
},
|
|
473
482
|
},
|
|
474
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
483
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
|
|
475
484
|
{ component: MeshRenderer, data: { materials: [matHandleN2] } },
|
|
476
485
|
{ component: Instances, data: { transforms: transformsN2 } },
|
|
477
486
|
);
|
|
@@ -486,11 +495,17 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
486
495
|
},
|
|
487
496
|
{ component: Camera, data: { fov: (45 * Math.PI) / 180, aspect: 1, near: 0.1, far: 200 } },
|
|
488
497
|
);
|
|
489
|
-
|
|
498
|
+
const attachmentN2 = renderer2.attach(worldN2);
|
|
499
|
+
expect(attachmentN2.ok).toBe(true);
|
|
500
|
+
if (!attachmentN2.ok) throw attachmentN2.error;
|
|
490
501
|
|
|
491
502
|
for (let i = 0; i < 5; i++) {
|
|
492
503
|
worldN2.update(1 / 60).unwrap();
|
|
493
|
-
const r = renderer2.draw(
|
|
504
|
+
const r = renderer2.draw({
|
|
505
|
+
leases: [attachmentN2.value],
|
|
506
|
+
camera: { lease: attachmentN2.value },
|
|
507
|
+
environment: { lease: attachmentN2.value },
|
|
508
|
+
});
|
|
494
509
|
if (!r.ok) throw new Error(`draw N frame ${i} error: ${r.error.code}`);
|
|
495
510
|
}
|
|
496
511
|
|
|
@@ -531,7 +546,6 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
531
546
|
singleTransform2[15] = 1;
|
|
532
547
|
|
|
533
548
|
const world12 = new World();
|
|
534
|
-
const cubeHandle12 = world12.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
|
|
535
549
|
const matHandle12 = world12.allocSharedRef<'MaterialAsset', MaterialAsset>(
|
|
536
550
|
'MaterialAsset',
|
|
537
551
|
matAsset2,
|
|
@@ -545,7 +559,7 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
545
559
|
scale: [0.5, 0.5, 0.5],
|
|
546
560
|
},
|
|
547
561
|
},
|
|
548
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
562
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
|
|
549
563
|
{ component: MeshRenderer, data: { materials: [matHandle12] } },
|
|
550
564
|
{ component: Instances, data: { transforms: singleTransform2 } },
|
|
551
565
|
);
|
|
@@ -560,11 +574,17 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
|
|
|
560
574
|
},
|
|
561
575
|
{ component: Camera, data: { fov: (45 * Math.PI) / 180, aspect: 1, near: 0.1, far: 200 } },
|
|
562
576
|
);
|
|
563
|
-
|
|
577
|
+
const attachment12 = renderer2.attach(world12);
|
|
578
|
+
expect(attachment12.ok).toBe(true);
|
|
579
|
+
if (!attachment12.ok) throw attachment12.error;
|
|
564
580
|
|
|
565
581
|
for (let i = 0; i < 5; i++) {
|
|
566
582
|
world12.update(1 / 60).unwrap();
|
|
567
|
-
const r = renderer2.draw(
|
|
583
|
+
const r = renderer2.draw({
|
|
584
|
+
leases: [attachment12.value],
|
|
585
|
+
camera: { lease: attachment12.value },
|
|
586
|
+
environment: { lease: attachment12.value },
|
|
587
|
+
});
|
|
568
588
|
if (!r.ok) throw new Error(`draw 1 frame ${i} error: ${r.error.code}`);
|
|
569
589
|
}
|
|
570
590
|
await device2.queue.onSubmittedWorkDone();
|
|
@@ -30,19 +30,19 @@
|
|
|
30
30
|
// gate passes while browser renders black) + comparison-demo-exposes-frozen-fxaa
|
|
31
31
|
// (assert two states differ, don't match one self-made baseline).
|
|
32
32
|
|
|
33
|
+
import { AssetRegistry, HANDLE_CUBE } from '@forgeax/engine-assets-runtime';
|
|
33
34
|
import { World } from '@forgeax/engine-ecs';
|
|
34
|
-
import { createPrimitiveMesh } from '@forgeax/engine-geometry';
|
|
35
35
|
import {
|
|
36
36
|
Camera,
|
|
37
37
|
DirectionalLight,
|
|
38
38
|
Instances,
|
|
39
39
|
MeshFilter,
|
|
40
40
|
MeshRenderer,
|
|
41
|
-
} from '@forgeax/engine-render
|
|
42
|
-
import { createRenderer } from '@forgeax/engine-runtime';
|
|
41
|
+
} from '@forgeax/engine-render';
|
|
43
42
|
import { Transform } from '@forgeax/engine-scene';
|
|
44
43
|
import type { MaterialAsset } from '@forgeax/engine-types';
|
|
45
44
|
import { describe, expect, it } from 'vitest';
|
|
45
|
+
import { constructRuntimeRendererHost } from '../../renderer-host';
|
|
46
46
|
|
|
47
47
|
const WIDTH = 256;
|
|
48
48
|
const HEIGHT = 256;
|
|
@@ -154,20 +154,25 @@ describe('w10 -- shadow instanced dawn smoke (AC-05 behavioral)', () => {
|
|
|
154
154
|
removeEventListener() {},
|
|
155
155
|
} as unknown as HTMLCanvasElement;
|
|
156
156
|
|
|
157
|
-
let
|
|
157
|
+
let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
|
|
158
158
|
try {
|
|
159
|
-
|
|
159
|
+
host = await constructRuntimeRendererHost(
|
|
160
|
+
mockCanvas,
|
|
161
|
+
{},
|
|
162
|
+
{
|
|
163
|
+
shaderManifestUrl: ENGINE_MANIFEST_URL,
|
|
164
|
+
},
|
|
165
|
+
);
|
|
160
166
|
} finally {
|
|
161
167
|
globalThis.navigator.gpu.requestAdapter = _saved;
|
|
162
168
|
}
|
|
163
|
-
expect(
|
|
164
|
-
|
|
165
|
-
const
|
|
166
|
-
expect(
|
|
167
|
-
|
|
169
|
+
expect(host.ok).toBe(true);
|
|
170
|
+
if (!host.ok) throw host.error;
|
|
171
|
+
const { renderer, assets } = host.value;
|
|
172
|
+
expect(renderer.inspect().state).toBe('alive');
|
|
173
|
+
expect(assets).toBeInstanceOf(AssetRegistry);
|
|
168
174
|
|
|
169
175
|
const world = new World();
|
|
170
|
-
const cubeHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
|
|
171
176
|
|
|
172
177
|
const matHandle = world.allocSharedRef<'MaterialAsset', MaterialAsset>('MaterialAsset', {
|
|
173
178
|
kind: 'material',
|
|
@@ -217,7 +222,7 @@ describe('w10 -- shadow instanced dawn smoke (AC-05 behavioral)', () => {
|
|
|
217
222
|
scale: [12, 0.2, 12],
|
|
218
223
|
},
|
|
219
224
|
},
|
|
220
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
225
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
|
|
221
226
|
{ component: MeshRenderer, data: { materials: [floorMatHandle] } },
|
|
222
227
|
);
|
|
223
228
|
|
|
@@ -275,17 +280,23 @@ describe('w10 -- shadow instanced dawn smoke (AC-05 behavioral)', () => {
|
|
|
275
280
|
scale: [0.5, 0.5, 0.5],
|
|
276
281
|
},
|
|
277
282
|
},
|
|
278
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
283
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
|
|
279
284
|
{ component: MeshRenderer, data: { materials: [matHandle] } },
|
|
280
285
|
{ component: Instances, data: { transforms: instanceTransforms } },
|
|
281
286
|
);
|
|
282
287
|
|
|
283
288
|
// Render 300 frames for temporal stability (PCF shadow, light accumulation)
|
|
284
|
-
|
|
289
|
+
const attachment = renderer.attach(world);
|
|
290
|
+
expect(attachment.ok).toBe(true);
|
|
291
|
+
if (!attachment.ok) throw attachment.error;
|
|
285
292
|
let drawErrors = 0;
|
|
286
293
|
for (let i = 0; i < 300; i++) {
|
|
287
294
|
world.update(1 / 60).unwrap();
|
|
288
|
-
const r = renderer.draw(
|
|
295
|
+
const r = renderer.draw({
|
|
296
|
+
leases: [attachment.value],
|
|
297
|
+
camera: { lease: attachment.value },
|
|
298
|
+
environment: { lease: attachment.value },
|
|
299
|
+
});
|
|
289
300
|
if (!r.ok) drawErrors++;
|
|
290
301
|
}
|
|
291
302
|
expect(drawErrors).toBe(0);
|