@forgeax/engine-runtime 0.0.0-dev.8d955ade1c79
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/LICENSE +202 -0
- package/README.md +165 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/__tests__/active-camera.unit.test.d.ts +2 -0
- package/dist/__tests__/active-camera.unit.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-add.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-add.unit.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-asset-union.test-d.d.ts +2 -0
- package/dist/__tests__/animation-graph-asset-union.test-d.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-blend.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-blend.unit.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-build.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-build.unit.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-clip-missing.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-clip-missing.unit.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-clip.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-clip.unit.test.d.ts.map +1 -0
- 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-default-path.integration.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-default-path.integration.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-describe.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-describe.unit.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-errors.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-errors.unit.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-nesting.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-nesting.unit.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-orthogonal-weight.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-orthogonal-weight.unit.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__/animation-graph-slot-fill.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-slot-fill.unit.test.d.ts.map +1 -0
- package/dist/__tests__/animation-nslot.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-nslot.unit.test.d.ts.map +1 -0
- package/dist/__tests__/animation-slot-length-guard.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-slot-length-guard.unit.test.d.ts.map +1 -0
- package/dist/__tests__/append-injection.test.d.ts +2 -0
- package/dist/__tests__/append-injection.test.d.ts.map +1 -0
- package/dist/__tests__/asi-world-baseline-export.unit.test.d.ts +2 -0
- package/dist/__tests__/asi-world-baseline-export.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asi-world-ci-config.unit.test.d.ts +2 -0
- package/dist/__tests__/asi-world-ci-config.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asi-world-smoke.unit.test.d.ts +2 -0
- package/dist/__tests__/asi-world-smoke.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-scene.test-d.d.ts +2 -0
- package/dist/__tests__/asset-registry-scene.test-d.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__/bind-group-cache-keying.test.d.ts +2 -0
- package/dist/__tests__/bind-group-cache-keying.test.d.ts.map +1 -0
- package/dist/__tests__/block-upload-math.unit.test.d.ts +2 -0
- package/dist/__tests__/block-upload-math.unit.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__/builtin-shader-register-e2e.test.d.ts +2 -0
- package/dist/__tests__/builtin-shader-register-e2e.test.d.ts.map +1 -0
- package/dist/__tests__/cache-false-eviction.test.d.ts +2 -0
- package/dist/__tests__/cache-false-eviction.test.d.ts.map +1 -0
- package/dist/__tests__/cache-isolation-matrix.test.d.ts +2 -0
- package/dist/__tests__/cache-isolation-matrix.test.d.ts.map +1 -0
- package/dist/__tests__/camera-clear-snapshot-equivalence.unit.test.d.ts +2 -0
- package/dist/__tests__/camera-clear-snapshot-equivalence.unit.test.d.ts.map +1 -0
- package/dist/__tests__/clamp-to-last.e2e.browser.test.d.ts +2 -0
- package/dist/__tests__/clamp-to-last.e2e.browser.test.d.ts.map +1 -0
- package/dist/__tests__/clamp-to-last.e2e.dawn.test.d.ts +2 -0
- package/dist/__tests__/clamp-to-last.e2e.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/collect-scene-asset.test.d.ts +2 -0
- package/dist/__tests__/collect-scene-asset.test.d.ts.map +1 -0
- 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-subtree.unit.test.d.ts +2 -0
- package/dist/__tests__/collect-subtree.unit.test.d.ts.map +1 -0
- package/dist/__tests__/collect-transient-children-absent.test.d.ts +2 -0
- package/dist/__tests__/collect-transient-children-absent.test.d.ts.map +1 -0
- package/dist/__tests__/collect-transient-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/collect-transient-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/collect-transient-skip.test.d.ts +2 -0
- package/dist/__tests__/collect-transient-skip.test.d.ts.map +1 -0
- package/dist/__tests__/components.test-d.d.ts +2 -0
- package/dist/__tests__/components.test-d.d.ts.map +1 -0
- package/dist/__tests__/components.unit.test.d.ts +2 -0
- package/dist/__tests__/components.unit.test.d.ts.map +1 -0
- package/dist/__tests__/composite-skybox-cross-world.browser.test.d.ts +2 -0
- package/dist/__tests__/composite-skybox-cross-world.browser.test.d.ts.map +1 -0
- 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__/create-renderer-assembly.integration.test.d.ts +2 -0
- package/dist/__tests__/create-renderer-assembly.integration.test.d.ts.map +1 -0
- package/dist/__tests__/createRenderer-dispose.test.d.ts +2 -0
- package/dist/__tests__/createRenderer-dispose.test.d.ts.map +1 -0
- package/dist/__tests__/createRenderer-requiredFeatures.unit.test.d.ts +2 -0
- package/dist/__tests__/createRenderer-requiredFeatures.unit.test.d.ts.map +1 -0
- package/dist/__tests__/createRenderer.browser-no-webgpu.test.d.ts +2 -0
- package/dist/__tests__/createRenderer.browser-no-webgpu.test.d.ts.map +1 -0
- package/dist/__tests__/createRenderer.unit.test.d.ts +2 -0
- package/dist/__tests__/createRenderer.unit.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/ibl-compose.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/ibl-compose.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/ibl-modules-compose.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/ibl-modules-compose.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/ibl-precompute-readback.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/ibl-precompute-readback.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/instances-per-instance-pbr.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/instances-per-instance-pbr.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/instances-shadow.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/instances-shadow.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/instances-uniform-fallback.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/instances-uniform-fallback.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/material-alpha.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/material-alpha.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/material-cooked-fixture.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/material-cooked-fixture.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/mesh-ssbo-normal-matrix.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/mesh-ssbo-normal-matrix.dawn.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/mipmap-srgb-linear.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/mipmap-srgb-linear.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/tonemap.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/tonemap.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__/dawn/user-handle-mesh-render.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/user-handle-mesh-render.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/user-mesh-upload.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/user-mesh-upload.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/zero-manifest-ready.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/zero-manifest-ready.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/demo-sortscope-migration.unit.test.d.ts +2 -0
- package/dist/__tests__/demo-sortscope-migration.unit.test.d.ts.map +1 -0
- package/dist/__tests__/derive-bgl-integration.test.d.ts +2 -0
- package/dist/__tests__/derive-bgl-integration.test.d.ts.map +1 -0
- package/dist/__tests__/derive-render-data-skin.unit.test.d.ts +2 -0
- package/dist/__tests__/derive-render-data-skin.unit.test.d.ts.map +1 -0
- package/dist/__tests__/draw-published.d.ts +5 -0
- package/dist/__tests__/draw-published.d.ts.map +1 -0
- 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__/environment-error-exhaustive.test-d.d.ts +8 -0
- package/dist/__tests__/environment-error-exhaustive.test-d.d.ts.map +1 -0
- package/dist/__tests__/equirect-bc6h.integration.test.d.ts +2 -0
- package/dist/__tests__/equirect-bc6h.integration.test.d.ts.map +1 -0
- package/dist/__tests__/error-exhaustive.test.d.ts +2 -0
- package/dist/__tests__/error-exhaustive.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-frames-graceful-degradation.test.d.ts +2 -0
- package/dist/__tests__/extract-frames-graceful-degradation.test.d.ts.map +1 -0
- package/dist/__tests__/extract-frames-merge.test.d.ts +2 -0
- package/dist/__tests__/extract-frames-merge.test.d.ts.map +1 -0
- package/dist/__tests__/extract-frames-reset.test.d.ts +2 -0
- package/dist/__tests__/extract-frames-reset.test.d.ts.map +1 -0
- package/dist/__tests__/extract-record-no-hardcoded-texture-fields.test.d.ts +2 -0
- package/dist/__tests__/extract-record-no-hardcoded-texture-fields.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__/frame-targets-shadow-regression.unit.test.d.ts +2 -0
- package/dist/__tests__/frame-targets-shadow-regression.unit.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__/fullscreen-post-bgl-depth.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-post-bgl-depth.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-post-depth-params-arity.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-post-depth-params-arity.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-post-process-pass.dawn.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-post-process-pass.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-post-process-pass.unit.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-post-process-pass.unit.test.d.ts.map +1 -0
- package/dist/__tests__/fxaa-pixel-diff.dawn.test.d.ts +2 -0
- package/dist/__tests__/fxaa-pixel-diff.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/fxaa-validation-and-resize.dawn.test.d.ts +2 -0
- package/dist/__tests__/fxaa-validation-and-resize.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/fxaa-zero-overhead.dawn.test.d.ts +2 -0
- package/dist/__tests__/fxaa-zero-overhead.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/geometry.unit.test.d.ts +2 -0
- package/dist/__tests__/geometry.unit.test.d.ts.map +1 -0
- package/dist/__tests__/glyph-tilemap-worldid.test.d.ts +2 -0
- package/dist/__tests__/glyph-tilemap-worldid.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-resource-cow-survivor.test.d.ts +2 -0
- package/dist/__tests__/gpu-resource-cow-survivor.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__/hello-tilemap-smoke-upgrade.unit.test.d.ts +2 -0
- package/dist/__tests__/hello-tilemap-smoke-upgrade.unit.test.d.ts.map +1 -0
- package/dist/__tests__/helpers/mock-shader-registry.d.ts +11 -0
- package/dist/__tests__/helpers/mock-shader-registry.d.ts.map +1 -0
- package/dist/__tests__/helpers/register-runtime-components.d.ts +4 -0
- package/dist/__tests__/helpers/register-runtime-components.d.ts.map +1 -0
- package/dist/__tests__/helpers/register-scene-components.d.ts +4 -0
- package/dist/__tests__/helpers/register-scene-components.d.ts.map +1 -0
- package/dist/__tests__/helpers/tilemap-assets.d.ts +6 -0
- package/dist/__tests__/helpers/tilemap-assets.d.ts.map +1 -0
- 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__/instances.test-d.d.ts +2 -0
- package/dist/__tests__/instances.test-d.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__/light-attenuation-formula.test.d.ts +2 -0
- package/dist/__tests__/light-attenuation-formula.test.d.ts.map +1 -0
- package/dist/__tests__/light-casters-9-light.browser.test.d.ts +2 -0
- package/dist/__tests__/light-casters-9-light.browser.test.d.ts.map +1 -0
- package/dist/__tests__/light-gpu-byte-neutral.unit.test.d.ts +2 -0
- package/dist/__tests__/light-gpu-byte-neutral.unit.test.d.ts.map +1 -0
- package/dist/__tests__/light-snapshot.test-d.d.ts +2 -0
- package/dist/__tests__/light-snapshot.test-d.d.ts.map +1 -0
- package/dist/__tests__/lights-vec-negative.unit.test.d.ts +2 -0
- package/dist/__tests__/lights-vec-negative.unit.test.d.ts.map +1 -0
- package/dist/__tests__/lights.unit.test.d.ts +2 -0
- package/dist/__tests__/lights.unit.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__/m3-vec-negative.unit.test.d.ts +2 -0
- package/dist/__tests__/m3-vec-negative.unit.test.d.ts.map +1 -0
- package/dist/__tests__/m5-browser-dawn-sweep.integration.test.d.ts +2 -0
- package/dist/__tests__/m5-browser-dawn-sweep.integration.test.d.ts.map +1 -0
- package/dist/__tests__/material-texture-uv-scale.unit.test.d.ts +2 -0
- package/dist/__tests__/material-texture-uv-scale.unit.test.d.ts.map +1 -0
- package/dist/__tests__/materials.unit.test.d.ts +2 -0
- package/dist/__tests__/materials.unit.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__/mesh-ssbo-grow.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-ssbo-grow.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mip-gate.unit.test.d.ts +2 -0
- package/dist/__tests__/mip-gate.unit.test.d.ts.map +1 -0
- package/dist/__tests__/msaa-sprite-pixel-diff.dawn.test.d.ts +2 -0
- package/dist/__tests__/msaa-sprite-pixel-diff.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/multi-uv-8set.e2e.dawn.test.d.ts +2 -0
- package/dist/__tests__/multi-uv-8set.e2e.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/name.unit.test.d.ts +2 -0
- package/dist/__tests__/name.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__/pass-selector.unit.test.d.ts +2 -0
- package/dist/__tests__/pass-selector.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pbr-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/pbr-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-builder-msaa.unit.test.d.ts +2 -0
- package/dist/__tests__/pipeline-builder-msaa.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-cache-keying.unit.test.d.ts +2 -0
- package/dist/__tests__/pipeline-cache-keying.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-spec.test.d.ts +2 -0
- package/dist/__tests__/pipeline-spec.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/point-light-shadow.browser.test.d.ts +2 -0
- package/dist/__tests__/point-light-shadow.browser.test.d.ts.map +1 -0
- package/dist/__tests__/point-light-shadow.dawn.test.d.ts +2 -0
- package/dist/__tests__/point-light-shadow.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/point-light-shadow.unit.test.d.ts +2 -0
- package/dist/__tests__/point-light-shadow.unit.test.d.ts.map +1 -0
- package/dist/__tests__/post-process-error-codes.unit.test.d.ts +2 -0
- package/dist/__tests__/post-process-error-codes.unit.test.d.ts.map +1 -0
- package/dist/__tests__/post-process-params-component.unit.test.d.ts +2 -0
- package/dist/__tests__/post-process-params-component.unit.test.d.ts.map +1 -0
- package/dist/__tests__/post-process-params-extract.unit.test.d.ts +2 -0
- package/dist/__tests__/post-process-params-extract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/postprocess-camera-consistency.test.d.ts +2 -0
- package/dist/__tests__/postprocess-camera-consistency.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-assembly.integration.test.d.ts +2 -0
- package/dist/__tests__/profiler-assembly.integration.test.d.ts.map +1 -0
- package/dist/__tests__/propagate-transforms.dawn.test.d.ts +2 -0
- package/dist/__tests__/propagate-transforms.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/record-worldid-isolation.test.d.ts +2 -0
- package/dist/__tests__/record-worldid-isolation.test.d.ts.map +1 -0
- package/dist/__tests__/recover-error-exhaustive.test-d.d.ts +11 -0
- package/dist/__tests__/recover-error-exhaustive.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts +11 -0
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-assembly.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics.browser.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics.browser.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics.dawn.test.d.ts.map +1 -0
- 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-feature-prepared-graphics.integration.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics.integration.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics.regression.integration.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics.regression.integration.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-recover.integration.test.d.ts +2 -0
- package/dist/__tests__/render-feature-recover.integration.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-runtime-surface.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-runtime-surface.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-schema-consumer.integration.test.d.ts +2 -0
- package/dist/__tests__/render-schema-consumer.integration.test.d.ts.map +1 -0
- package/dist/__tests__/render-schema-owner-boundary.unit.test.d.ts +2 -0
- package/dist/__tests__/render-schema-owner-boundary.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-cross-world-overlay-queue.test.d.ts +2 -0
- package/dist/__tests__/render-system-cross-world-overlay-queue.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-extract-dispatch-ordering.test.d.ts +2 -0
- package/dist/__tests__/render-system-extract-dispatch-ordering.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-extract.test.d.ts +2 -0
- package/dist/__tests__/render-system-extract.test.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__/render-system-fold-bucket.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-fold-bucket.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-fold-fallback.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-fold-fallback.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-fold-material.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-fold-material.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-fold-metrics.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-fold-metrics.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-fold-modegate.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-fold-modegate.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-fold-scene-instances.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-fold-scene-instances.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-fold.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-system-fold.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-mega.test.d.ts +2 -0
- package/dist/__tests__/render-system-mega.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-owner-split-contract.test.d.ts +2 -0
- package/dist/__tests__/render-system-owner-split-contract.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-record-multi-material-textureview.test.d.ts +2 -0
- package/dist/__tests__/render-system-record-multi-material-textureview.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-record-per-submesh-transparency.test.d.ts +2 -0
- package/dist/__tests__/render-system-record-per-submesh-transparency.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-record.test.d.ts +2 -0
- package/dist/__tests__/render-system-record.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-record.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-record.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-skin-bg.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-skin-bg.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-consumer.test-d.d.ts +2 -0
- package/dist/__tests__/renderer-consumer.test-d.d.ts.map +1 -0
- package/dist/__tests__/renderer-health.unit.test.d.ts +2 -0
- package/dist/__tests__/renderer-health.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +2 -0
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-recover.unit.test.d.ts +2 -0
- package/dist/__tests__/renderer-recover.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-result.test-d.d.ts +2 -0
- package/dist/__tests__/renderer-result.test-d.d.ts.map +1 -0
- package/dist/__tests__/renderer-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/renderer-surface.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__/resolve-depth-only-view.test.d.ts +2 -0
- package/dist/__tests__/resolve-depth-only-view.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__/rhi-null-command-flow.unit.test.d.ts +2 -0
- package/dist/__tests__/rhi-null-command-flow.unit.test.d.ts.map +1 -0
- package/dist/__tests__/rhi-null-noop-behavior.unit.test.d.ts +2 -0
- package/dist/__tests__/rhi-null-noop-behavior.unit.test.d.ts.map +1 -0
- package/dist/__tests__/rhi-null-renderer-lifecycle.unit.test.d.ts +2 -0
- package/dist/__tests__/rhi-null-renderer-lifecycle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/roots-to-scene-asset.test.d.ts +2 -0
- package/dist/__tests__/roots-to-scene-asset.test.d.ts.map +1 -0
- package/dist/__tests__/roundtrip-primitive.test.d.ts +2 -0
- package/dist/__tests__/roundtrip-primitive.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-authority-scan.unit.test.d.ts +2 -0
- package/dist/__tests__/runtime-authority-scan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/runtime-domain-residue.unit.test.d.ts +2 -0
- package/dist/__tests__/runtime-domain-residue.unit.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-equirect-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/scene-equirect-roundtrip.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-instance-bridge.integration.test.d.ts +2 -0
- package/dist/__tests__/scene-instance-bridge.integration.test.d.ts.map +1 -0
- package/dist/__tests__/scene-instance-component.test.d.ts +2 -0
- package/dist/__tests__/scene-instance-component.test.d.ts.map +1 -0
- package/dist/__tests__/scene-instantiate-cycle-runtime.test.d.ts +2 -0
- package/dist/__tests__/scene-instantiate-cycle-runtime.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 +2 -0
- package/dist/__tests__/serialize-scene-asset.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-caster-empty-schema.test.d.ts +2 -0
- package/dist/__tests__/shadow-caster-empty-schema.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-atlas.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-atlas.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-blend.dawn.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-blend.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-cascade-loadop.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-cascade-loadop.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-component.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-component.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-extract.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-extract.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-orthoz.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-orthoz.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-runtime-vary.dawn.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-runtime-vary.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-shader.dawn.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-shader.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-tile-consistency.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-tile-consistency.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-ubo.dawn.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-ubo.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-ubo.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-ubo.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-csm-viewport.browser.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-viewport.browser.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-fields-observable.dawn.test.d.ts +2 -0
- package/dist/__tests__/shadow-fields-observable.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-m1.dawn.test.d.ts +2 -0
- package/dist/__tests__/shadow-m1.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-mesh-ssbo-order.test.d.ts +2 -0
- package/dist/__tests__/shadow-mesh-ssbo-order.test.d.ts.map +1 -0
- package/dist/__tests__/skin-error-exhaustive.test-d.d.ts +11 -0
- package/dist/__tests__/skin-error-exhaustive.test-d.d.ts.map +1 -0
- package/dist/__tests__/skin-errors.unit.test.d.ts +2 -0
- package/dist/__tests__/skin-errors.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin-extract-getarrayview-count.unit.test.d.ts +2 -0
- package/dist/__tests__/skin-extract-getarrayview-count.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin-parented-double-transform.test.d.ts +14 -0
- package/dist/__tests__/skin-parented-double-transform.test.d.ts.map +1 -0
- package/dist/__tests__/skylight-lazy-projection.test.d.ts +2 -0
- package/dist/__tests__/skylight-lazy-projection.test.d.ts.map +1 -0
- package/dist/__tests__/sparse-tag-scene-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/sparse-tag-scene-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-cullmode-flip.dawn.test.d.ts +2 -0
- package/dist/__tests__/sprite-cullmode-flip.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-lit-bgl-byte-identical.test.d.ts +2 -0
- package/dist/__tests__/sprite-lit-bgl-byte-identical.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-lit-extract-branch.test.d.ts +2 -0
- package/dist/__tests__/sprite-lit-extract-branch.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-lit-pipeline-cache-key.test.d.ts +2 -0
- package/dist/__tests__/sprite-lit-pipeline-cache-key.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-param-values.test-d.d.ts +2 -0
- package/dist/__tests__/sprite-param-values.test-d.d.ts.map +1 -0
- package/dist/__tests__/ssao-bgl.test.d.ts +2 -0
- package/dist/__tests__/ssao-bgl.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-buffers.test.d.ts +2 -0
- package/dist/__tests__/ssao-buffers.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-data.test.d.ts +2 -0
- package/dist/__tests__/ssao-data.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-errors.test.d.ts +2 -0
- package/dist/__tests__/ssao-errors.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-manifest.test.d.ts +2 -0
- package/dist/__tests__/ssao-manifest.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-passes.test.d.ts +2 -0
- package/dist/__tests__/ssao-passes.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-pipelines.test.d.ts +2 -0
- package/dist/__tests__/ssao-pipelines.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-uniform-layout.test.d.ts +2 -0
- package/dist/__tests__/ssao-uniform-layout.test.d.ts.map +1 -0
- package/dist/__tests__/static-rig.integration.test.d.ts +2 -0
- package/dist/__tests__/static-rig.integration.test.d.ts.map +1 -0
- package/dist/__tests__/stencil-outline-pixel.dawn.test.d.ts +2 -0
- package/dist/__tests__/stencil-outline-pixel.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/swap-chain-format.unit.test.d.ts +2 -0
- package/dist/__tests__/swap-chain-format.unit.test.d.ts.map +1 -0
- package/dist/__tests__/systems.unit.test.d.ts +2 -0
- package/dist/__tests__/systems.unit.test.d.ts.map +1 -0
- 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__/text.unit.test.d.ts +2 -0
- package/dist/__tests__/text.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-childed-despawn.test.d.ts +2 -0
- package/dist/__tests__/tilemap-childed-despawn.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-chunk-extract.overhang-bounds.test.d.ts +2 -0
- package/dist/__tests__/tilemap-chunk-extract.overhang-bounds.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-chunk-extract.propagate-order.test.d.ts +2 -0
- package/dist/__tests__/tilemap-chunk-extract.propagate-order.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-chunk-extract.terrain-rewrite.unit.test.d.ts +2 -0
- package/dist/__tests__/tilemap-chunk-extract.terrain-rewrite.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-chunk-extract.test.d.ts +2 -0
- package/dist/__tests__/tilemap-chunk-extract.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-chunk-extract.unit.test.d.ts +2 -0
- package/dist/__tests__/tilemap-chunk-extract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-chunk-y-sort-bench.unit.test.d.ts +2 -0
- package/dist/__tests__/tilemap-chunk-y-sort-bench.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-dirty-rebuild.test.d.ts +2 -0
- package/dist/__tests__/tilemap-dirty-rebuild.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-material-cache.test.d.ts +2 -0
- package/dist/__tests__/tilemap-material-cache.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-multi-atlas.test.d.ts +2 -0
- package/dist/__tests__/tilemap-multi-atlas.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-owner-boundary.unit.test.d.ts +2 -0
- package/dist/__tests__/tilemap-owner-boundary.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-region-pack.test.d.ts +2 -0
- package/dist/__tests__/tilemap-region-pack.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-spawn-flip-pivot.test.d.ts +2 -0
- package/dist/__tests__/tilemap-spawn-flip-pivot.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-uv-inset.test.d.ts +2 -0
- package/dist/__tests__/tilemap-uv-inset.test.d.ts.map +1 -0
- package/dist/__tests__/tilemap-validate.test.d.ts +2 -0
- package/dist/__tests__/tilemap-validate.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__/transform-hierarchy-pixel-diff.dawn.test.d.ts +2 -0
- package/dist/__tests__/transform-hierarchy-pixel-diff.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/transient-fields-collect.test.d.ts +2 -0
- package/dist/__tests__/transient-fields-collect.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__/transitional-authoring.integration.test.d.ts +2 -0
- package/dist/__tests__/transitional-authoring.integration.test.d.ts.map +1 -0
- package/dist/__tests__/transparent-sort-tilemap-sprite-interleave.test.d.ts +2 -0
- package/dist/__tests__/transparent-sort-tilemap-sprite-interleave.test.d.ts.map +1 -0
- package/dist/__tests__/variant-selection.unit.test.d.ts +2 -0
- package/dist/__tests__/variant-selection.unit.test.d.ts.map +1 -0
- package/dist/__tests__/vertex-attribute-layout.test.d.ts +2 -0
- package/dist/__tests__/vertex-attribute-layout.test.d.ts.map +1 -0
- package/dist/__tests__/video-extract-bindgroup.dawn.test.d.ts +2 -0
- package/dist/__tests__/video-extract-bindgroup.dawn.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/__tests__/view-ubo-layout.browser.test.d.ts +2 -0
- package/dist/__tests__/view-ubo-layout.browser.test.d.ts.map +1 -0
- package/dist/__tests__/world-entity-key.test.d.ts +2 -0
- package/dist/__tests__/world-entity-key.test.d.ts.map +1 -0
- package/dist/__tests__/world-scene-despawn.test.d.ts +2 -0
- package/dist/__tests__/world-scene-despawn.test.d.ts.map +1 -0
- package/dist/__tests__/world-scene-instantiate.test.d.ts +2 -0
- package/dist/__tests__/world-scene-instantiate.test.d.ts.map +1 -0
- package/dist/__tests__/world-scene-nested.test.d.ts +2 -0
- package/dist/__tests__/world-scene-nested.test.d.ts.map +1 -0
- package/dist/__tests__/world-scene-override.test.d.ts +2 -0
- package/dist/__tests__/world-scene-override.test.d.ts.map +1 -0
- package/dist/__tests__/zero-compression-zero-load.integration.test.d.ts +2 -0
- package/dist/__tests__/zero-compression-zero-load.integration.test.d.ts.map +1 -0
- package/dist/asset-contributions.d.ts +3 -0
- package/dist/asset-contributions.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 +19 -0
- package/dist/collect-scene-asset.d.ts.map +1 -0
- package/dist/components/__tests__/camera.test-d.d.ts +2 -0
- package/dist/components/__tests__/camera.test-d.d.ts.map +1 -0
- package/dist/components/__tests__/camera.test.d.ts +2 -0
- package/dist/components/__tests__/camera.test.d.ts.map +1 -0
- package/dist/components/__tests__/child-of.test.d.ts +2 -0
- package/dist/components/__tests__/child-of.test.d.ts.map +1 -0
- package/dist/components/__tests__/sprite-animation.test-d.d.ts +2 -0
- package/dist/components/__tests__/sprite-animation.test-d.d.ts.map +1 -0
- package/dist/components/__tests__/sprite-instances.unit.test.d.ts +2 -0
- package/dist/components/__tests__/sprite-instances.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/sprite-region-override.test-d.d.ts +2 -0
- package/dist/components/__tests__/sprite-region-override.test-d.d.ts.map +1 -0
- package/dist/components/__tests__/tile-layer.test-d.d.ts +2 -0
- package/dist/components/__tests__/tile-layer.test-d.d.ts.map +1 -0
- package/dist/components/__tests__/tile-layer.unit.test.d.ts +2 -0
- package/dist/components/__tests__/tile-layer.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/tilemap.test-d.d.ts +2 -0
- package/dist/components/__tests__/tilemap.test-d.d.ts.map +1 -0
- package/dist/components/__tests__/transform-vec-schema.test.d.ts +2 -0
- package/dist/components/__tests__/transform-vec-schema.test.d.ts.map +1 -0
- package/dist/create-renderer-env-classify.d.ts +21 -0
- package/dist/create-renderer-env-classify.d.ts.map +1 -0
- package/dist/createRenderer.d.ts +15 -0
- package/dist/createRenderer.d.ts.map +1 -0
- package/dist/dev-import-transport.d.ts +24 -0
- package/dist/dev-import-transport.d.ts.map +1 -0
- package/dist/errors/environment.d.ts +2 -0
- package/dist/errors/environment.d.ts.map +1 -0
- package/dist/index.d.ts +218 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +813 -0
- package/dist/index.mjs.map +1 -0
- 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/__tests__/post-spawn-resolve-joints.unit.test.d.ts +2 -0
- package/dist/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.d.ts.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 +15 -0
- package/dist/scene-utils/mount-override-fold.d.ts.map +1 -0
- package/dist/sprite-param-values.d.ts +62 -0
- package/dist/sprite-param-values.d.ts.map +1 -0
- package/dist/systems/__tests__/_xorshift.d.ts +28 -0
- package/dist/systems/__tests__/_xorshift.d.ts.map +1 -0
- package/dist/systems/__tests__/argsort-in-place.test.d.ts +2 -0
- package/dist/systems/__tests__/argsort-in-place.test.d.ts.map +1 -0
- package/dist/systems/__tests__/transparent-sort.bench.d.ts +2 -0
- package/dist/systems/__tests__/transparent-sort.bench.d.ts.map +1 -0
- package/dist/systems/sprite-animation-tick.d.ts +50 -0
- package/dist/systems/sprite-animation-tick.d.ts.map +1 -0
- package/dist/systems/tonemap.d.ts +27 -0
- package/dist/systems/tonemap.d.ts.map +1 -0
- package/dist/systems/transparent-sort.d.ts +50 -0
- package/dist/systems/transparent-sort.d.ts.map +1 -0
- package/dist/tilemap-register-validate.d.ts +21 -0
- package/dist/tilemap-register-validate.d.ts.map +1 -0
- package/package.json +101 -0
- package/src/__tests__/active-camera.unit.test.ts +203 -0
- package/src/__tests__/animation-graph-add.unit.test.ts +67 -0
- package/src/__tests__/animation-graph-asset-union.test-d.ts +83 -0
- package/src/__tests__/animation-graph-blend.unit.test.ts +66 -0
- package/src/__tests__/animation-graph-build.unit.test.ts +100 -0
- package/src/__tests__/animation-graph-clip-missing.unit.test.ts +62 -0
- package/src/__tests__/animation-graph-clip.unit.test.ts +77 -0
- package/src/__tests__/animation-graph-collect-roundtrip.test.ts +213 -0
- package/src/__tests__/animation-graph-default-path.integration.test.ts +65 -0
- package/src/__tests__/animation-graph-describe.unit.test.ts +68 -0
- package/src/__tests__/animation-graph-errors.unit.test.ts +75 -0
- package/src/__tests__/animation-graph-nesting.unit.test.ts +84 -0
- package/src/__tests__/animation-graph-orthogonal-weight.unit.test.ts +98 -0
- package/src/__tests__/animation-graph-serialize.unit.test.ts +171 -0
- package/src/__tests__/animation-graph-slot-fill.unit.test.ts +95 -0
- package/src/__tests__/animation-nslot.unit.test.ts +63 -0
- package/src/__tests__/animation-slot-length-guard.unit.test.ts +81 -0
- package/src/__tests__/append-injection.test.ts +105 -0
- package/src/__tests__/asi-world-baseline-export.unit.test.ts +173 -0
- package/src/__tests__/asi-world-ci-config.unit.test.ts +186 -0
- package/src/__tests__/asi-world-smoke.unit.test.ts +192 -0
- package/src/__tests__/asset-brand-and-name-retirement.test.ts +102 -0
- package/src/__tests__/asset-error-exhaustive.test-d.ts +62 -0
- package/src/__tests__/asset-registry-guid-reverse.test.ts +608 -0
- package/src/__tests__/asset-registry-hdr-equirect.test.ts +78 -0
- package/src/__tests__/asset-registry-mesh-pack-payload.dawn.test.ts +232 -0
- package/src/__tests__/asset-registry-mounts.test.ts +806 -0
- package/src/__tests__/asset-registry-scene.test-d.ts +49 -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 +295 -0
- package/src/__tests__/block-upload-math.unit.test.ts +192 -0
- package/src/__tests__/builtin-asset-registry.unit.test.ts +112 -0
- package/src/__tests__/builtin-shader-register-e2e.test.ts +151 -0
- package/src/__tests__/cache-false-eviction.test.ts +127 -0
- package/src/__tests__/cache-isolation-matrix.test.ts +183 -0
- package/src/__tests__/camera-clear-snapshot-equivalence.unit.test.ts +75 -0
- package/src/__tests__/clamp-to-last.e2e.browser.test.ts +193 -0
- package/src/__tests__/clamp-to-last.e2e.dawn.test.ts +325 -0
- package/src/__tests__/collect-scene-asset.test.ts +873 -0
- package/src/__tests__/collect-scene-mount-collapse.test.ts +391 -0
- package/src/__tests__/collect-subtree.unit.test.ts +75 -0
- package/src/__tests__/collect-transient-children-absent.test.ts +168 -0
- package/src/__tests__/collect-transient-roundtrip.test.ts +269 -0
- package/src/__tests__/collect-transient-skip.test.ts +176 -0
- package/src/__tests__/components.test-d.ts +231 -0
- package/src/__tests__/components.unit.test.ts +2666 -0
- package/src/__tests__/composite-skybox-cross-world.browser.test.ts +410 -0
- package/src/__tests__/compressed-texture-physical-extent.integration.test.ts +139 -0
- package/src/__tests__/create-renderer-assembly.integration.test.ts +55 -0
- package/src/__tests__/createRenderer-dispose.test.ts +49 -0
- package/src/__tests__/createRenderer-requiredFeatures.unit.test.ts +134 -0
- package/src/__tests__/createRenderer.browser-no-webgpu.test.ts +54 -0
- package/src/__tests__/createRenderer.unit.test.ts +231 -0
- package/src/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.ts +357 -0
- package/src/__tests__/dawn/ibl-compose.dawn.test.ts +151 -0
- package/src/__tests__/dawn/ibl-modules-compose.dawn.test.ts +223 -0
- package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +250 -0
- package/src/__tests__/dawn/instances-per-instance-pbr.dawn.test.ts +631 -0
- package/src/__tests__/dawn/instances-shadow.dawn.test.ts +454 -0
- package/src/__tests__/dawn/instances-uniform-fallback.dawn.test.ts +312 -0
- package/src/__tests__/dawn/material-alpha.dawn.test.ts +296 -0
- package/src/__tests__/dawn/material-cooked-fixture.dawn.test.ts +79 -0
- package/src/__tests__/dawn/mesh-ssbo-normal-matrix.dawn.test.ts +106 -0
- package/src/__tests__/dawn/mesh-update-dawn.test.ts +250 -0
- package/src/__tests__/dawn/mipmap-srgb-linear.dawn.test.ts +124 -0
- package/src/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.ts +555 -0
- package/src/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.ts +235 -0
- package/src/__tests__/dawn/tonemap.dawn.test.ts +107 -0
- package/src/__tests__/dawn/upload-texture.dawn.test.ts +198 -0
- package/src/__tests__/dawn/user-handle-mesh-render.dawn.test.ts +289 -0
- package/src/__tests__/dawn/user-mesh-upload.dawn.test.ts +209 -0
- package/src/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.ts +119 -0
- package/src/__tests__/dawn/zero-manifest-ready.dawn.test.ts +98 -0
- package/src/__tests__/demo-sortscope-migration.unit.test.ts +115 -0
- package/src/__tests__/derive-bgl-integration.test.ts +388 -0
- package/src/__tests__/derive-render-data-skin.unit.test.ts +90 -0
- package/src/__tests__/draw-published.ts +17 -0
- package/src/__tests__/dynamic-texture-store.unit.test.ts +190 -0
- package/src/__tests__/environment-error-exhaustive.test-d.ts +28 -0
- package/src/__tests__/equirect-bc6h.integration.test.ts +158 -0
- package/src/__tests__/error-exhaustive.test.ts +220 -0
- package/src/__tests__/errors.unit.test.ts +1227 -0
- package/src/__tests__/extract-frames-graceful-degradation.test.ts +294 -0
- package/src/__tests__/extract-frames-merge.test.ts +656 -0
- package/src/__tests__/extract-frames-reset.test.ts +158 -0
- package/src/__tests__/extract-record-no-hardcoded-texture-fields.test.ts +81 -0
- 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 +28 -0
- package/src/__tests__/fullscreen-feature-host.dawn.test.ts +80 -0
- package/src/__tests__/fullscreen-post-bgl-depth.test.ts +133 -0
- package/src/__tests__/fullscreen-post-depth-params-arity.test.ts +84 -0
- package/src/__tests__/fullscreen-post-process-pass.dawn.test.ts +336 -0
- package/src/__tests__/fullscreen-post-process-pass.unit.test.ts +109 -0
- package/src/__tests__/fxaa-pixel-diff.dawn.test.ts +303 -0
- package/src/__tests__/fxaa-validation-and-resize.dawn.test.ts +369 -0
- package/src/__tests__/fxaa-zero-overhead.dawn.test.ts +258 -0
- package/src/__tests__/geometry.unit.test.ts +2631 -0
- package/src/__tests__/glyph-tilemap-worldid.test.ts +146 -0
- package/src/__tests__/gpu-resource-cow-survivor.test.ts +390 -0
- package/src/__tests__/guid-for-asset.unit.test.ts +102 -0
- package/src/__tests__/handle-migration.test.ts +136 -0
- package/src/__tests__/hello-tilemap-smoke-upgrade.unit.test.ts +147 -0
- package/src/__tests__/helpers/mock-shader-registry.ts +139 -0
- package/src/__tests__/helpers/register-runtime-components.ts +71 -0
- package/src/__tests__/helpers/register-scene-components.ts +10 -0
- package/src/__tests__/helpers/tilemap-assets.ts +29 -0
- 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 +61 -0
- package/src/__tests__/instantiate-mount-deferred-wiring.test.ts +112 -0
- package/src/__tests__/light-attenuation-formula.test.ts +171 -0
- package/src/__tests__/light-casters-9-light.browser.test.ts +877 -0
- package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +160 -0
- package/src/__tests__/light-snapshot.test-d.ts +84 -0
- package/src/__tests__/lights-vec-negative.unit.test.ts +52 -0
- package/src/__tests__/lights.unit.test.ts +2456 -0
- 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 +46 -0
- package/src/__tests__/m5-browser-dawn-sweep.integration.test.ts +8 -0
- package/src/__tests__/material-texture-uv-scale.unit.test.ts +119 -0
- package/src/__tests__/materials.unit.test.ts +254 -0
- 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 +244 -0
- package/src/__tests__/mip-gate.unit.test.ts +79 -0
- package/src/__tests__/msaa-sprite-pixel-diff.dawn.test.ts +367 -0
- package/src/__tests__/multi-uv-8set.e2e.dawn.test.ts +296 -0
- package/src/__tests__/name.unit.test.ts +123 -0
- package/src/__tests__/new-kind-refs-contract.test.ts +132 -0
- package/src/__tests__/node-shims.d.ts +31 -0
- 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 +102 -0
- package/src/__tests__/pbr-pipeline.unit.test.ts +200 -0
- package/src/__tests__/pipeline-builder-msaa.unit.test.ts +221 -0
- package/src/__tests__/pipeline-cache-keying.unit.test.ts +313 -0
- package/src/__tests__/pipeline-spec.test.ts +900 -0
- package/src/__tests__/pipeline.unit.test.ts +5435 -0
- package/src/__tests__/point-light-shadow.browser.test.ts +278 -0
- package/src/__tests__/point-light-shadow.dawn.test.ts +813 -0
- package/src/__tests__/point-light-shadow.unit.test.ts +675 -0
- package/src/__tests__/post-process-error-codes.unit.test.ts +161 -0
- package/src/__tests__/post-process-params-component.unit.test.ts +153 -0
- package/src/__tests__/post-process-params-extract.unit.test.ts +97 -0
- package/src/__tests__/postprocess-camera-consistency.test.ts +375 -0
- package/src/__tests__/profiler-assembly.integration.test.ts +74 -0
- package/src/__tests__/propagate-transforms.dawn.test.ts +254 -0
- package/src/__tests__/record-worldid-isolation.test.ts +225 -0
- package/src/__tests__/recover-error-exhaustive.test-d.ts +35 -0
- package/src/__tests__/render-error-exhaustive.test-d.ts +291 -0
- package/src/__tests__/render-feature-assembly.test-d.ts +39 -0
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +126 -0
- package/src/__tests__/render-feature-prepared-graphics.browser.test.ts +88 -0
- package/src/__tests__/render-feature-prepared-graphics.dawn.test.ts +115 -0
- package/src/__tests__/render-feature-prepared-graphics.fixture.ts +104 -0
- package/src/__tests__/render-feature-prepared-graphics.integration.test.ts +56 -0
- package/src/__tests__/render-feature-prepared-graphics.regression.integration.test.ts +104 -0
- package/src/__tests__/render-feature-recover.integration.test.ts +102 -0
- package/src/__tests__/render-feature-runtime-surface.test-d.ts +42 -0
- package/src/__tests__/render-schema-consumer.integration.test.ts +32 -0
- package/src/__tests__/render-schema-owner-boundary.unit.test.ts +22 -0
- package/src/__tests__/render-system-cross-world-overlay-queue.test.ts +172 -0
- package/src/__tests__/render-system-extract-dispatch-ordering.test.ts +307 -0
- package/src/__tests__/render-system-extract.test.ts +1384 -0
- package/src/__tests__/render-system-extract.unit.test.ts +360 -0
- package/src/__tests__/render-system-fold-bucket.unit.test.ts +286 -0
- package/src/__tests__/render-system-fold-fallback.unit.test.ts +151 -0
- package/src/__tests__/render-system-fold-material.unit.test.ts +143 -0
- package/src/__tests__/render-system-fold-metrics.unit.test.ts +170 -0
- package/src/__tests__/render-system-fold-modegate.unit.test.ts +166 -0
- package/src/__tests__/render-system-fold-scene-instances.unit.test.ts +51 -0
- package/src/__tests__/render-system-fold.dawn.test.ts +308 -0
- package/src/__tests__/render-system-mega.test.ts +1680 -0
- package/src/__tests__/render-system-owner-split-contract.test.ts +178 -0
- package/src/__tests__/render-system-record-multi-material-textureview.test.ts +698 -0
- package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +458 -0
- package/src/__tests__/render-system-record.test.ts +1668 -0
- package/src/__tests__/render-system-record.unit.test.ts +269 -0
- package/src/__tests__/render-system-skin-bg.unit.test.ts +143 -0
- package/src/__tests__/renderer-consumer.test-d.ts +18 -0
- package/src/__tests__/renderer-health.unit.test.ts +45 -0
- package/src/__tests__/renderer-lifecycle.integration.test.ts +42 -0
- package/src/__tests__/renderer-recover.unit.test.ts +55 -0
- package/src/__tests__/renderer-result.test-d.ts +36 -0
- package/src/__tests__/renderer-surface.unit.test.ts +414 -0
- package/src/__tests__/renderer-test-utils.ts +56 -0
- package/src/__tests__/renderer.test-d.ts +61 -0
- package/src/__tests__/resolve-asset-handle-err.test.ts +111 -0
- package/src/__tests__/resolve-asset-handle.unit.test.ts +64 -0
- package/src/__tests__/resolve-depth-only-view.test.ts +173 -0
- 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 +69 -0
- package/src/__tests__/rhi-null-noop-behavior.unit.test.ts +196 -0
- package/src/__tests__/rhi-null-renderer-lifecycle.unit.test.ts +54 -0
- package/src/__tests__/roots-to-scene-asset.test.ts +711 -0
- package/src/__tests__/roundtrip-primitive.test.ts +351 -0
- package/src/__tests__/runtime-authority-scan.unit.test.ts +19 -0
- package/src/__tests__/runtime-domain-residue.unit.test.ts +13 -0
- package/src/__tests__/scene-bare-guid-refs-instantiate.test.ts +123 -0
- package/src/__tests__/scene-equirect-roundtrip.test.ts +120 -0
- package/src/__tests__/scene-instance-authoring.integration.test.ts +8 -0
- package/src/__tests__/scene-instance-bridge.integration.test.ts +8 -0
- package/src/__tests__/scene-instance-component.test.ts +45 -0
- package/src/__tests__/scene-instantiate-cycle-runtime.test.ts +66 -0
- 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 +533 -0
- package/src/__tests__/shadow-caster-empty-schema.test.ts +83 -0
- package/src/__tests__/shadow-csm-atlas.test.ts +178 -0
- package/src/__tests__/shadow-csm-blend.dawn.test.ts +230 -0
- package/src/__tests__/shadow-csm-cascade-loadop.test.ts +354 -0
- package/src/__tests__/shadow-csm-component.test.ts +284 -0
- package/src/__tests__/shadow-csm-extract.test.ts +236 -0
- package/src/__tests__/shadow-csm-orthoz.test.ts +137 -0
- package/src/__tests__/shadow-csm-runtime-vary.dawn.test.ts +203 -0
- package/src/__tests__/shadow-csm-shader.dawn.test.ts +358 -0
- package/src/__tests__/shadow-csm-tile-consistency.test.ts +425 -0
- package/src/__tests__/shadow-csm-ubo.dawn.test.ts +252 -0
- package/src/__tests__/shadow-csm-ubo.test.ts +278 -0
- package/src/__tests__/shadow-csm-viewport.browser.test.ts +85 -0
- package/src/__tests__/shadow-fields-observable.dawn.test.ts +626 -0
- package/src/__tests__/shadow-m1.dawn.test.ts +104 -0
- package/src/__tests__/shadow-mesh-ssbo-order.test.ts +48 -0
- package/src/__tests__/skin-error-exhaustive.test-d.ts +74 -0
- package/src/__tests__/skin-errors.unit.test.ts +10 -0
- package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +25 -0
- package/src/__tests__/skin-parented-double-transform.test.ts +268 -0
- package/src/__tests__/skylight-lazy-projection.test.ts +380 -0
- package/src/__tests__/sparse-tag-scene-roundtrip.test.ts +43 -0
- package/src/__tests__/sprite-cullmode-flip.dawn.test.ts +453 -0
- package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +142 -0
- package/src/__tests__/sprite-lit-extract-branch.test.ts +117 -0
- package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +123 -0
- package/src/__tests__/sprite-param-values.test-d.ts +104 -0
- package/src/__tests__/ssao-bgl.test.ts +354 -0
- package/src/__tests__/ssao-buffers.test.ts +211 -0
- package/src/__tests__/ssao-data.test.ts +121 -0
- package/src/__tests__/ssao-errors.test.ts +162 -0
- package/src/__tests__/ssao-manifest.test.ts +109 -0
- package/src/__tests__/ssao-passes.test.ts +905 -0
- package/src/__tests__/ssao-pipelines.test.ts +275 -0
- package/src/__tests__/ssao-uniform-layout.test.ts +180 -0
- package/src/__tests__/static-rig.integration.test.ts +9 -0
- package/src/__tests__/stencil-outline-pixel.dawn.test.ts +303 -0
- package/src/__tests__/swap-chain-format.unit.test.ts +115 -0
- package/src/__tests__/systems.unit.test.ts +9167 -0
- package/src/__tests__/template-game-default-api-contract.test.ts +362 -0
- package/src/__tests__/text.unit.test.ts +489 -0
- package/src/__tests__/tilemap-childed-despawn.test.ts +462 -0
- package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +310 -0
- package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +81 -0
- package/src/__tests__/tilemap-chunk-extract.terrain-rewrite.unit.test.ts +424 -0
- package/src/__tests__/tilemap-chunk-extract.test.ts +232 -0
- package/src/__tests__/tilemap-chunk-extract.unit.test.ts +383 -0
- package/src/__tests__/tilemap-chunk-y-sort-bench.unit.test.ts +109 -0
- package/src/__tests__/tilemap-dirty-rebuild.test.ts +296 -0
- package/src/__tests__/tilemap-material-cache.test.ts +132 -0
- package/src/__tests__/tilemap-multi-atlas.test.ts +217 -0
- package/src/__tests__/tilemap-owner-boundary.unit.test.ts +66 -0
- package/src/__tests__/tilemap-region-pack.test.ts +149 -0
- package/src/__tests__/tilemap-spawn-flip-pivot.test.ts +270 -0
- package/src/__tests__/tilemap-uv-inset.test.ts +201 -0
- package/src/__tests__/tilemap-validate.test.ts +201 -0
- 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 +282 -0
- package/src/__tests__/transient-fields-collect.test.ts +210 -0
- package/src/__tests__/transient-runtime-behavior.test.ts +227 -0
- package/src/__tests__/transitional-authoring.integration.test.ts +7 -0
- package/src/__tests__/transparent-sort-tilemap-sprite-interleave.test.ts +227 -0
- package/src/__tests__/variant-selection.unit.test.ts +21 -0
- package/src/__tests__/vertex-attribute-layout.test.ts +324 -0
- package/src/__tests__/video-extract-bindgroup.dawn.test.ts +403 -0
- 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 +161 -0
- package/src/__tests__/world-entity-key.test.ts +92 -0
- package/src/__tests__/world-scene-despawn.test.ts +132 -0
- package/src/__tests__/world-scene-instantiate.test.ts +194 -0
- package/src/__tests__/world-scene-nested.test.ts +230 -0
- package/src/__tests__/world-scene-override.test.ts +199 -0
- package/src/__tests__/zero-compression-zero-load.integration.test.ts +107 -0
- package/src/asset-contributions.ts +48 -0
- package/src/backend-selection.ts +69 -0
- package/src/collect-scene-asset.ts +701 -0
- package/src/components/__tests__/camera.test-d.ts +57 -0
- package/src/components/__tests__/camera.test.ts +95 -0
- package/src/components/__tests__/child-of.test.ts +35 -0
- package/src/components/__tests__/sprite-animation.test-d.ts +160 -0
- package/src/components/__tests__/sprite-instances.unit.test.ts +108 -0
- package/src/components/__tests__/sprite-region-override.test-d.ts +101 -0
- package/src/components/__tests__/tile-layer.test-d.ts +33 -0
- package/src/components/__tests__/tile-layer.unit.test.ts +125 -0
- package/src/components/__tests__/tilemap.test-d.ts +35 -0
- package/src/components/__tests__/transform-vec-schema.test.ts +121 -0
- package/src/create-renderer-env-classify.ts +110 -0
- package/src/createRenderer.ts +49 -0
- package/src/dev-import-transport.ts +97 -0
- package/src/errors/environment.ts +6 -0
- package/src/index.ts +380 -0
- package/src/renderer-host.ts +33 -0
- package/src/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.ts +183 -0
- package/src/scene-instances/index.ts +4 -0
- package/src/scene-utils/mount-override-fold.ts +213 -0
- package/src/sprite-param-values.ts +61 -0
- package/src/systems/__tests__/_xorshift.ts +83 -0
- package/src/systems/__tests__/argsort-in-place.test.ts +155 -0
- package/src/systems/__tests__/transparent-sort.bench.ts +218 -0
- package/src/systems/sprite-animation-tick.ts +302 -0
- package/src/systems/tonemap.ts +68 -0
- package/src/systems/transparent-sort.ts +434 -0
- package/src/tilemap-register-validate.ts +100 -0
|
@@ -0,0 +1,701 @@
|
|
|
1
|
+
// feat-20260623 M2 w11+w12 — SceneInstance to SceneAsset POD collection + pack
|
|
2
|
+
// serialization (plan-strategy D-1: pure-data collector).
|
|
3
|
+
//
|
|
4
|
+
// feat-20260701-rootstosceneasset-forest-collect-schema-derived-ha:
|
|
5
|
+
// rootsToSceneAsset(registry, world, roots) -> Result<SceneAsset, ...>
|
|
6
|
+
// serializeSceneAssetToPack -> schema-derived refs[] index.
|
|
7
|
+
//
|
|
8
|
+
// feat-20260703-collect-nested-sceneinstance-to-mount-roundtrip M2 + M3:
|
|
9
|
+
//
|
|
10
|
+
// ── mount-collapse (M2) ──
|
|
11
|
+
// rootsToSceneAsset detects entities carrying SceneInstance (anchors) and
|
|
12
|
+
// folds each anchor's subtree into a mounts[] entry — the uplink inverse of
|
|
13
|
+
// instantiateScene which expands mounts[] into live entities. Member
|
|
14
|
+
// classification filter, not subtree pruning: BFS walks the full subtree
|
|
15
|
+
// (collectSubtree unchanged, D-4), then anchors' members are folded into
|
|
16
|
+
// mount windows, graft entities survive as owned, and cross-window entity
|
|
17
|
+
// references are remapped to window LocalEntityIds. Two anchor forms:
|
|
18
|
+
// Form 2 (root = instance) strips SceneInstance without self-mount; Form 1
|
|
19
|
+
// (deep anchor) folds at the anchor site with mount.parent pointing to the
|
|
20
|
+
// anchor's ChildOf parent. Window accounting (totalSlots = entities.length
|
|
21
|
+
// + mounts.length + sum(memberCount)) preserves the child instance's full
|
|
22
|
+
// totalSlots, never shrinking by surviving-member count (AC-03, #495 guard).
|
|
23
|
+
//
|
|
24
|
+
// ── serialize mounts (M3) ──
|
|
25
|
+
// serializeSceneAssetToPack maps in-memory mounts[].source GUID strings to
|
|
26
|
+
// refs[] indices, memberFirst/memberCount/localId/parent numeric pass-through.
|
|
27
|
+
// _resolveSceneGuids (asset-registry.ts) carries mounts through the reload
|
|
28
|
+
// chain: recursively resolves child scene GUIDs, registers child copies in
|
|
29
|
+
// the origin reverse-index (D-7), and protects against mount-source cycles
|
|
30
|
+
// (R-9). registry.instantiate wires an identity resolver so resolved mount
|
|
31
|
+
// handles flow into instantiateScene transparently.
|
|
32
|
+
//
|
|
33
|
+
// ── round-trip closure ──
|
|
34
|
+
// The round-trip instantiate -> collect (rootsToSceneAsset) -> serialize
|
|
35
|
+
// (serializeSceneAssetToPack) -> reload (loadByGuid + registry.instantiate)
|
|
36
|
+
// -> instantiate produces a structurally equivalent live subtree (AC-04).
|
|
37
|
+
// The equivalence benchmark is a second collect (fixed-point): after the
|
|
38
|
+
// first reload, the second collect output equals the first (D-9 normalization
|
|
39
|
+
// converges after one cycle).
|
|
40
|
+
//
|
|
41
|
+
// ── known limitations ──
|
|
42
|
+
// OOS-1: mount.overrides[] (Layer-0 diffs) are not folded back during collect.
|
|
43
|
+
// D-9: Form 1 mount entity absorption — when the anchor parent cannot be
|
|
44
|
+
// proven to be a mount entity, components is left undefined (one-time
|
|
45
|
+
// normalization on first reload; fixed-point from second collect onward).
|
|
46
|
+
|
|
47
|
+
import {
|
|
48
|
+
builtinMeshGuid,
|
|
49
|
+
resolveAssetHandle,
|
|
50
|
+
SceneCollectAssetGuidUnresolvedError,
|
|
51
|
+
SceneCollectEntityRefOutOfClosureError,
|
|
52
|
+
} from '@forgeax/engine-assets-runtime';
|
|
53
|
+
import {
|
|
54
|
+
componentDefinition,
|
|
55
|
+
type Component as EcsComponent,
|
|
56
|
+
type EntityHandle,
|
|
57
|
+
type World,
|
|
58
|
+
} from '@forgeax/engine-ecs';
|
|
59
|
+
import { classifyEntityField } from '@forgeax/engine-ecs/externalization';
|
|
60
|
+
import { componentSchema } from '@forgeax/engine-ecs/internal';
|
|
61
|
+
import { SceneInstance } from '@forgeax/engine-render';
|
|
62
|
+
import { err, ok, type Result } from '@forgeax/engine-rhi';
|
|
63
|
+
import {
|
|
64
|
+
collectSubtree,
|
|
65
|
+
externalizeSceneAsset,
|
|
66
|
+
SCENE_COLLECT_PROFILE,
|
|
67
|
+
worldGetSceneAssetForInstance,
|
|
68
|
+
worldGetSceneInstanceState,
|
|
69
|
+
} from '@forgeax/engine-scene';
|
|
70
|
+
import type {
|
|
71
|
+
Asset,
|
|
72
|
+
Handle,
|
|
73
|
+
LocalEntityId,
|
|
74
|
+
MountOverride,
|
|
75
|
+
SceneAsset,
|
|
76
|
+
SceneEntity,
|
|
77
|
+
SceneInstanceMount,
|
|
78
|
+
} from '@forgeax/engine-types';
|
|
79
|
+
import { foldMountOverrides } from './scene-utils/mount-override-fold';
|
|
80
|
+
|
|
81
|
+
/** The collector needs identity lookup, not an authoring registry implementation. */
|
|
82
|
+
export interface SceneAssetGuidLookup {
|
|
83
|
+
guidOf(asset: Asset): string | undefined;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Shared helpers
|
|
87
|
+
function _isArrayLike(value: unknown): value is ArrayLike<unknown> {
|
|
88
|
+
// SceneAsset values are ordinary JSON arrays at the boundary. Use the
|
|
89
|
+
// platform view predicate so fixed-array component fields such as Fog.color
|
|
90
|
+
// remain generic when their storage element type grows, while DataView (a
|
|
91
|
+
// byte accessor without indexed array semantics) stays scalar.
|
|
92
|
+
return Array.isArray(value) || (ArrayBuffer.isView(value) && !(value instanceof DataView));
|
|
93
|
+
}
|
|
94
|
+
function _normalizeArray(value: ArrayLike<unknown>): unknown[] {
|
|
95
|
+
return Array.from(value);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Schema-derived field classifier — shared kernel now owns entity classification.
|
|
99
|
+
// Keep the local shared<T> classifier because the kernel only handles entity fields.
|
|
100
|
+
type SchemaFieldClass =
|
|
101
|
+
| { kind: 'entity'; scalar: true }
|
|
102
|
+
| { kind: 'entity'; scalar: false }
|
|
103
|
+
| { kind: 'shared'; scalar: true }
|
|
104
|
+
| { kind: 'shared'; scalar: false };
|
|
105
|
+
|
|
106
|
+
function classifyFieldSchema(fieldType: string | undefined): SchemaFieldClass | undefined {
|
|
107
|
+
if (fieldType === undefined) return undefined;
|
|
108
|
+
if (fieldType.startsWith('shared<')) return { kind: 'shared', scalar: true };
|
|
109
|
+
if (fieldType.startsWith('array<shared<')) return { kind: 'shared', scalar: false };
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ── M5 (w21): override-value handle→GUID serialization ──
|
|
114
|
+
//
|
|
115
|
+
// Reverse-lookup one shared-field handle to its catalogued GUID string. Returns
|
|
116
|
+
// `undefined` for the NULL sentinel (handle 0) so the caller applies the two
|
|
117
|
+
// distinct sentinel semantics: scalar -> omit the field, array -> placeholder 0.
|
|
118
|
+
// Any non-zero handle that fails to resolve is a fail-fast (D-2, no silent drop).
|
|
119
|
+
// Shared kernel: both the owned-entity serialization loop (Step 4) and the M5
|
|
120
|
+
// override-value serialization call this so the resolve/lookup/fail-fast idiom
|
|
121
|
+
// lives in exactly one place; `field` names the failing field in the error.
|
|
122
|
+
function _handleToGuid(
|
|
123
|
+
world: World,
|
|
124
|
+
registry: SceneAssetGuidLookup,
|
|
125
|
+
handle: number,
|
|
126
|
+
field: string,
|
|
127
|
+
): Result<string | undefined, SceneCollectAssetGuidUnresolvedError> {
|
|
128
|
+
if (handle === 0) return ok(undefined); // NULL sentinel
|
|
129
|
+
const builtinGuid = builtinMeshGuid(handle as unknown as Handle<string, 'shared'>);
|
|
130
|
+
if (builtinGuid !== undefined) return ok(builtinGuid);
|
|
131
|
+
const assetRes = resolveAssetHandle(world, handle as unknown as Handle<string, 'shared'>);
|
|
132
|
+
if (!assetRes.ok) return err(new SceneCollectAssetGuidUnresolvedError(field, handle));
|
|
133
|
+
const guid = registry.guidOf(assetRes.value as Asset);
|
|
134
|
+
if (guid === undefined) return err(new SceneCollectAssetGuidUnresolvedError(field, handle));
|
|
135
|
+
return ok(guid);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Convert one shared field value (scalar handle or array<handle>) from the live
|
|
139
|
+
// handle domain to the serialized GUID domain, applying the two-state NULL
|
|
140
|
+
// sentinel: scalar handle 0 -> undefined (caller omits the field); array handle
|
|
141
|
+
// 0 -> numeric 0 kept in place (positional SoA alignment, #640). Non-shared
|
|
142
|
+
// values pass through untouched.
|
|
143
|
+
function _serializeSharedFieldValue(
|
|
144
|
+
world: World,
|
|
145
|
+
registry: SceneAssetGuidLookup,
|
|
146
|
+
classification: SchemaFieldClass,
|
|
147
|
+
value: unknown,
|
|
148
|
+
field: string,
|
|
149
|
+
): Result<unknown, SceneCollectAssetGuidUnresolvedError> {
|
|
150
|
+
if (classification.scalar) {
|
|
151
|
+
if (typeof value !== 'number') return ok(value);
|
|
152
|
+
return _handleToGuid(world, registry, value, field); // undefined -> caller omits
|
|
153
|
+
}
|
|
154
|
+
if (!Array.isArray(value)) return ok(value);
|
|
155
|
+
const mapped: Array<string | number> = [];
|
|
156
|
+
for (const elem of value as ReadonlyArray<unknown>) {
|
|
157
|
+
if (typeof elem !== 'number') {
|
|
158
|
+
mapped.push(elem as number);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const g = _handleToGuid(world, registry, elem, field);
|
|
162
|
+
if (!g.ok) return g;
|
|
163
|
+
mapped.push(g.value ?? 0); // NULL sentinel keeps positional 0
|
|
164
|
+
}
|
|
165
|
+
return ok(mapped);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Convert an override's value from the live handle domain to the serialized GUID
|
|
169
|
+
// domain (w21). Field-patch form (`ov.field` present) carries a single field
|
|
170
|
+
// value; component-add form carries a per-field value map. Shared fields are
|
|
171
|
+
// reverse-looked-up per {@link _serializeSharedFieldValue}; a scalar NULL
|
|
172
|
+
// sentinel drops the key (component-add) or is kept as 0 (field-patch, where the
|
|
173
|
+
// override IS that field so it cannot be omitted). Non-shared fields pass through.
|
|
174
|
+
function _serializeOverrideValueHandles(
|
|
175
|
+
world: World,
|
|
176
|
+
registry: SceneAssetGuidLookup,
|
|
177
|
+
ov: MountOverride,
|
|
178
|
+
): Result<unknown, SceneCollectAssetGuidUnresolvedError> {
|
|
179
|
+
const comp = world.components.resolve(ov.comp);
|
|
180
|
+
const schema = comp === undefined ? undefined : (componentSchema(comp) as Record<string, string>);
|
|
181
|
+
if (ov.field !== undefined) {
|
|
182
|
+
const classification = schema ? classifyFieldSchema(schema[ov.field]) : undefined;
|
|
183
|
+
if (!classification || classification.kind !== 'shared') return ok(ov.value);
|
|
184
|
+
const conv = _serializeSharedFieldValue(world, registry, classification, ov.value, ov.field);
|
|
185
|
+
if (!conv.ok) return conv;
|
|
186
|
+
// Field-patch: keep the field even at NULL sentinel (the override IS the
|
|
187
|
+
// field); undefined only arises for a scalar handle 0 -> emit 0.
|
|
188
|
+
return ok(conv.value ?? 0);
|
|
189
|
+
}
|
|
190
|
+
// component-add: value is a per-field map.
|
|
191
|
+
if (typeof ov.value !== 'object' || ov.value === null || Array.isArray(ov.value)) {
|
|
192
|
+
return ok(ov.value);
|
|
193
|
+
}
|
|
194
|
+
const src = ov.value as Record<string, unknown>;
|
|
195
|
+
const out: Record<string, unknown> = {};
|
|
196
|
+
for (const fieldName of Object.keys(src)) {
|
|
197
|
+
const classification = schema ? classifyFieldSchema(schema[fieldName]) : undefined;
|
|
198
|
+
if (!classification || classification.kind !== 'shared') {
|
|
199
|
+
out[fieldName] = src[fieldName];
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const conv = _serializeSharedFieldValue(
|
|
203
|
+
world,
|
|
204
|
+
registry,
|
|
205
|
+
classification,
|
|
206
|
+
src[fieldName],
|
|
207
|
+
fieldName,
|
|
208
|
+
);
|
|
209
|
+
if (!conv.ok) return conv;
|
|
210
|
+
if (classification.scalar && conv.value === undefined) continue; // scalar 0 -> omit
|
|
211
|
+
out[fieldName] = conv.value;
|
|
212
|
+
}
|
|
213
|
+
return ok(out);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// serializeSceneAssetToPack — emits the current Pack v2/local-artifact envelope.
|
|
217
|
+
export function serializeSceneAssetToPack(
|
|
218
|
+
sceneAsset: SceneAsset,
|
|
219
|
+
components: ReadonlyMap<string, EcsComponent>,
|
|
220
|
+
guid?: string,
|
|
221
|
+
): Result<Record<string, unknown>, SceneCollectAssetGuidUnresolvedError> {
|
|
222
|
+
const externalized = externalizeSceneAsset(sceneAsset, (componentName) => {
|
|
223
|
+
const component = components.get(componentName);
|
|
224
|
+
return component === undefined ? undefined : componentSchema(component);
|
|
225
|
+
});
|
|
226
|
+
if (!externalized.ok) {
|
|
227
|
+
const value = externalized.error.value;
|
|
228
|
+
return err(
|
|
229
|
+
new SceneCollectAssetGuidUnresolvedError(
|
|
230
|
+
externalized.error.field,
|
|
231
|
+
typeof value === 'string' || typeof value === 'number' ? value : String(value),
|
|
232
|
+
),
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
return ok({
|
|
236
|
+
schemaVersion: '2.0.0',
|
|
237
|
+
kind: 'internal-text-package',
|
|
238
|
+
assets: [
|
|
239
|
+
{
|
|
240
|
+
guid: guid ?? crypto.randomUUID(),
|
|
241
|
+
kind: 'scene',
|
|
242
|
+
payload: externalized.value.payload,
|
|
243
|
+
refs: externalized.value.refs.map((reference) => reference.guid),
|
|
244
|
+
artifacts: {},
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
251
|
+
// rootsToSceneAsset — with M2 mount-collapse
|
|
252
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Collect a forest of entity subtrees into a self-contained SceneAsset.
|
|
256
|
+
*
|
|
257
|
+
* M2 mount-collapse: entities carrying SceneInstance that are NOT roots
|
|
258
|
+
* are folded into mount entries. Root anchors have their SceneInstance
|
|
259
|
+
* row stripped without producing a self-mount. Member classification
|
|
260
|
+
* filter (not subtree pruning): graft entities under members survive as owned.
|
|
261
|
+
*/
|
|
262
|
+
export function rootsToSceneAsset(
|
|
263
|
+
registry: SceneAssetGuidLookup,
|
|
264
|
+
world: World,
|
|
265
|
+
roots: EntityHandle[],
|
|
266
|
+
): Result<
|
|
267
|
+
SceneAsset,
|
|
268
|
+
SceneCollectEntityRefOutOfClosureError | SceneCollectAssetGuidUnresolvedError
|
|
269
|
+
> {
|
|
270
|
+
const collectProfile = SCENE_COLLECT_PROFILE;
|
|
271
|
+
// ── Step 1: BFS closure ──
|
|
272
|
+
const visited = new Set<number>();
|
|
273
|
+
for (const root of roots) collectSubtree(world, root, visited);
|
|
274
|
+
if (visited.size === 0) return ok({ kind: 'scene', entities: [] });
|
|
275
|
+
|
|
276
|
+
const rootRawSet = new Set<number>();
|
|
277
|
+
for (const r of roots) rootRawSet.add(r as number);
|
|
278
|
+
|
|
279
|
+
// ── Step 1.5: Mount-collapse — identify anchors ──
|
|
280
|
+
const anchorEntities = new Set<number>();
|
|
281
|
+
for (const er of visited) {
|
|
282
|
+
if (world.get(er as EntityHandle, SceneInstance).ok) anchorEntities.add(er);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// D-7 (feat-20260707) ordering robustness: the first-wins loops below
|
|
286
|
+
// (memberEntities claim + carrier absorption) resolve ties by iteration
|
|
287
|
+
// order. Iterating the anchorEntities Set directly ties the outcome to BFS
|
|
288
|
+
// insertion order — deterministic within one run but fragile to Node/VM
|
|
289
|
+
// changes. Sort by raw handle so "which anchor claims a shared member / a
|
|
290
|
+
// shared carrier" is a deterministic function of the SceneAsset (§3.2
|
|
291
|
+
// fixed-point premise: collect output must be a pure function of the graph).
|
|
292
|
+
const anchorsSorted = [...anchorEntities].sort((a, b) => a - b);
|
|
293
|
+
|
|
294
|
+
// Classify members for non-root anchors.
|
|
295
|
+
const memberEntities = new Set<number>();
|
|
296
|
+
const memberOrigin = new Map<number, { anchorRaw: number; memberLocalId: number }>();
|
|
297
|
+
for (const er of anchorsSorted) {
|
|
298
|
+
if (rootRawSet.has(er)) continue; // root anchor: don't classify members
|
|
299
|
+
const sr = worldGetSceneInstanceState(world, er as EntityHandle);
|
|
300
|
+
if (!sr.ok) continue;
|
|
301
|
+
for (const [me, lid] of sr.value.entityToLocalId) {
|
|
302
|
+
const mr = me as number;
|
|
303
|
+
if (visited.has(mr) && !anchorEntities.has(mr) && !memberEntities.has(mr)) {
|
|
304
|
+
memberEntities.add(mr);
|
|
305
|
+
memberOrigin.set(mr, { anchorRaw: er, memberLocalId: lid as unknown as number });
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Remove inner anchors (members of outer anchors).
|
|
311
|
+
for (const er of anchorEntities) {
|
|
312
|
+
if (memberEntities.has(er) && !rootRawSet.has(er)) anchorEntities.delete(er);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// ── Step 1.75: Mount-carrier absorption ──
|
|
316
|
+
//
|
|
317
|
+
// worldInstantiateScene materialises each mounts[] entry as a plain "mount
|
|
318
|
+
// entity" (`_spawnMountEntity` output: mount.components + a default Transform,
|
|
319
|
+
// but NO SceneInstance) whose child is the mounted scene's synthetic root (the
|
|
320
|
+
// real anchor, which DOES carry SceneInstance). So a `mounts[{parent: W}]`
|
|
321
|
+
// whose parent W is an OWNED entity comes back on reload as the live chain
|
|
322
|
+
// W (owned) -> carrier (plain mount entity) -> anchor (SceneInstance).
|
|
323
|
+
// The carrier IS the re-materialised mount slot. If collect keeps it as an
|
|
324
|
+
// owned entity (it has no SceneInstance, so Step 2 would), the next serialize→
|
|
325
|
+
// reload inserts ANOTHER carrier under it, growing one nameless ghost node per
|
|
326
|
+
// save→reload cycle — unbounded (the editor "Add to Scene → save → reopen →
|
|
327
|
+
// #N" regression). Existing pure-mount round-trips don't hit this because they
|
|
328
|
+
// use `mount.parent === undefined` (mount attaches to the synthetic root,
|
|
329
|
+
// which is stripped, so no owned carrier survives).
|
|
330
|
+
//
|
|
331
|
+
// Fix: recognise a carrier and fold it back into its mount. A carrier is the
|
|
332
|
+
// ChildOf-parent P of a non-root anchor A where P is a pure mount slot: not a
|
|
333
|
+
// root, not itself an anchor/member, carries no authored identity (only the
|
|
334
|
+
// structural Transform/Children/ChildOf/Entity that _spawnMountEntity leaves),
|
|
335
|
+
// and its sole visited child is A. The mount for A then takes P's slot:
|
|
336
|
+
// mount.parent = P's ChildOf parent, and any ref to P resolves to the mount.
|
|
337
|
+
const childOfTk0 = world.components.resolve('ChildOf');
|
|
338
|
+
const childrenTk0 = world.components.resolve('Children');
|
|
339
|
+
const carrierAllowed = new Set(['Transform', 'Children', 'ChildOf', 'Entity']);
|
|
340
|
+
const carrierForAnchor = new Map<number, number>(); // anchorRaw -> carrierRaw
|
|
341
|
+
const carrierToAnchor = new Map<number, number>(); // carrierRaw -> anchorRaw
|
|
342
|
+
const isMountCarrier = (p: number, anchorRaw: number): boolean => {
|
|
343
|
+
if (rootRawSet.has(p)) return false;
|
|
344
|
+
if (anchorEntities.has(p) || memberEntities.has(p)) return false;
|
|
345
|
+
if (!visited.has(p)) return false;
|
|
346
|
+
for (const [compName, compToken] of world.components.entries()) {
|
|
347
|
+
if (carrierAllowed.has(compName)) continue;
|
|
348
|
+
if (world.get(p as EntityHandle, compToken as EcsComponent<string>).ok) return false;
|
|
349
|
+
}
|
|
350
|
+
if (childrenTk0) {
|
|
351
|
+
const cr = world.get(p as EntityHandle, childrenTk0 as EcsComponent<string>);
|
|
352
|
+
if (cr.ok) {
|
|
353
|
+
const kids = (cr.value as { entities?: ArrayLike<number> }).entities;
|
|
354
|
+
if (kids) {
|
|
355
|
+
let visitedKidCount = 0;
|
|
356
|
+
let sawAnchor = false;
|
|
357
|
+
for (let i = 0; i < kids.length; i++) {
|
|
358
|
+
const k = kids[i] as number;
|
|
359
|
+
if (!visited.has(k)) continue;
|
|
360
|
+
visitedKidCount += 1;
|
|
361
|
+
if (k === anchorRaw) sawAnchor = true;
|
|
362
|
+
}
|
|
363
|
+
if (!sawAnchor || visitedKidCount !== 1) return false;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return true;
|
|
368
|
+
};
|
|
369
|
+
if (childOfTk0) {
|
|
370
|
+
// Deterministic order (D-7): a carrier shared by two anchors is claimed by
|
|
371
|
+
// the lowest-handle anchor regardless of Set iteration order.
|
|
372
|
+
for (const anchorRaw of anchorsSorted) {
|
|
373
|
+
if (!anchorEntities.has(anchorRaw)) continue; // pruned inner anchor
|
|
374
|
+
if (rootRawSet.has(anchorRaw)) continue;
|
|
375
|
+
const cr = world.get(anchorRaw as EntityHandle, childOfTk0 as EcsComponent<string>);
|
|
376
|
+
if (!cr.ok) continue;
|
|
377
|
+
const pRaw = (cr.value as Record<string, unknown>).parent as number | undefined;
|
|
378
|
+
if (pRaw === undefined) continue;
|
|
379
|
+
if (!carrierToAnchor.has(pRaw) && isMountCarrier(pRaw, anchorRaw)) {
|
|
380
|
+
carrierForAnchor.set(anchorRaw, pRaw);
|
|
381
|
+
carrierToAnchor.set(pRaw, anchorRaw);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// ── Step 2: Filter owned & build mounts for non-root anchors ──
|
|
387
|
+
const orderedEntities = [...visited];
|
|
388
|
+
const ownedEntities: number[] = [];
|
|
389
|
+
for (const er of orderedEntities) {
|
|
390
|
+
if (carrierToAnchor.has(er)) continue; // absorbed into its mount
|
|
391
|
+
if ((!anchorEntities.has(er) || rootRawSet.has(er)) && !memberEntities.has(er)) {
|
|
392
|
+
ownedEntities.push(er);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const entityToLocalId = new Map<number, number>();
|
|
397
|
+
for (let i = 0; i < ownedEntities.length; i++) {
|
|
398
|
+
const e = ownedEntities[i];
|
|
399
|
+
if (e !== undefined) entityToLocalId.set(e, i);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Build non-root anchor info + resolve GUIDs.
|
|
403
|
+
const nonRootAnchors: Array<{ entityRaw: number; sourceGuid: string; totalSlots: number }> = [];
|
|
404
|
+
for (const er of anchorEntities) {
|
|
405
|
+
if (rootRawSet.has(er)) continue;
|
|
406
|
+
const sh = worldGetSceneAssetForInstance(world, er as EntityHandle);
|
|
407
|
+
if (!sh.ok)
|
|
408
|
+
return err(
|
|
409
|
+
new SceneCollectAssetGuidUnresolvedError(
|
|
410
|
+
'SceneInstance.source',
|
|
411
|
+
sh.error as unknown as number,
|
|
412
|
+
),
|
|
413
|
+
);
|
|
414
|
+
const pr = resolveAssetHandle<SceneAsset>(
|
|
415
|
+
world,
|
|
416
|
+
sh.value as unknown as Handle<string, 'shared'>,
|
|
417
|
+
);
|
|
418
|
+
if (!pr.ok)
|
|
419
|
+
return err(
|
|
420
|
+
new SceneCollectAssetGuidUnresolvedError(
|
|
421
|
+
'SceneInstance.source',
|
|
422
|
+
sh.value as unknown as number,
|
|
423
|
+
),
|
|
424
|
+
);
|
|
425
|
+
const g = registry.guidOf(pr.value as Asset);
|
|
426
|
+
if (g === undefined)
|
|
427
|
+
return err(
|
|
428
|
+
new SceneCollectAssetGuidUnresolvedError(
|
|
429
|
+
'SceneInstance.source',
|
|
430
|
+
sh.value as unknown as number,
|
|
431
|
+
),
|
|
432
|
+
);
|
|
433
|
+
const sr = worldGetSceneInstanceState(world, er as EntityHandle);
|
|
434
|
+
if (!sr.ok)
|
|
435
|
+
return err(new SceneCollectAssetGuidUnresolvedError('SceneInstance.source', 'state'));
|
|
436
|
+
nonRootAnchors.push({ entityRaw: er, sourceGuid: g, totalSlots: sr.value.totalSlots });
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// Sort by BFS order.
|
|
440
|
+
const bfsIdx = new Map<number, number>();
|
|
441
|
+
for (let i = 0; i < orderedEntities.length; i++) {
|
|
442
|
+
if (orderedEntities[i] !== undefined) bfsIdx.set(orderedEntities[i] as number, i);
|
|
443
|
+
}
|
|
444
|
+
nonRootAnchors.sort((a, b) => (bfsIdx.get(a.entityRaw) ?? 0) - (bfsIdx.get(b.entityRaw) ?? 0));
|
|
445
|
+
|
|
446
|
+
// ── Step 3: Allocate mount windows ──
|
|
447
|
+
const ownedCount = ownedEntities.length;
|
|
448
|
+
const outMounts: SceneInstanceMount[] = [];
|
|
449
|
+
let nextMF = ownedCount + nonRootAnchors.length;
|
|
450
|
+
const childOfTk = world.components.resolve('ChildOf');
|
|
451
|
+
|
|
452
|
+
const transformTk = world.components.resolve('Transform');
|
|
453
|
+
for (const a of nonRootAnchors) {
|
|
454
|
+
// When a mount carrier was absorbed (Step 1.75), the mount takes the
|
|
455
|
+
// carrier's slot: resolve the ChildOf parent from the CARRIER (the anchor's
|
|
456
|
+
// own parent IS the carrier, which no longer exists as an owned entity), and
|
|
457
|
+
// carry the carrier's Transform as mount.components so placement round-trips.
|
|
458
|
+
const carrierRaw = carrierForAnchor.get(a.entityRaw);
|
|
459
|
+
const parentSourceRaw = carrierRaw ?? a.entityRaw;
|
|
460
|
+
let mp: number | undefined;
|
|
461
|
+
if (childOfTk) {
|
|
462
|
+
const cr = world.get(parentSourceRaw as EntityHandle, childOfTk as EcsComponent<string>);
|
|
463
|
+
if (cr.ok) {
|
|
464
|
+
const pRaw = (cr.value as Record<string, unknown>).parent as number;
|
|
465
|
+
if (pRaw !== undefined) {
|
|
466
|
+
const ol = entityToLocalId.get(pRaw);
|
|
467
|
+
if (ol !== undefined) mp = ol;
|
|
468
|
+
else {
|
|
469
|
+
const mo = memberOrigin.get(pRaw);
|
|
470
|
+
if (mo !== undefined) {
|
|
471
|
+
const ai = nonRootAnchors.findIndex((x) => x.entityRaw === mo.anchorRaw);
|
|
472
|
+
if (ai >= 0) mp = ownedCount + ai;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
let mountComponents: SceneInstanceMount['components'] | undefined;
|
|
479
|
+
if (carrierRaw !== undefined && transformTk) {
|
|
480
|
+
const tr = world.get(carrierRaw as EntityHandle, transformTk as EcsComponent<string>);
|
|
481
|
+
if (tr.ok) {
|
|
482
|
+
mountComponents = {
|
|
483
|
+
Transform: { ...(tr.value as Record<string, unknown>) },
|
|
484
|
+
} as SceneInstanceMount['components'];
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// ── M5 (w20 + w21): fold runtime-authored overrides into this mount ──
|
|
488
|
+
// foldMountOverrides emits child-namespace localIds in the LIVE handle
|
|
489
|
+
// domain; rebase each into the parent namespace (memberFirst + childLocalId)
|
|
490
|
+
// and reverse-lookup shared-field handles to GUID strings (two-state
|
|
491
|
+
// NULL-sentinel). Unresolvable handle -> SceneCollectAssetGuidUnresolvedError
|
|
492
|
+
// (D-2 fail-fast, no silent drop).
|
|
493
|
+
const memberFirst0 = nextMF;
|
|
494
|
+
let mountOverrides: MountOverride[] | undefined;
|
|
495
|
+
const foldStateRes = worldGetSceneInstanceState(world, a.entityRaw as EntityHandle);
|
|
496
|
+
if (foldStateRes.ok) {
|
|
497
|
+
const rawOverrides = foldMountOverrides(world, foldStateRes.value);
|
|
498
|
+
if (rawOverrides.length > 0) {
|
|
499
|
+
mountOverrides = [];
|
|
500
|
+
for (const ov of rawOverrides) {
|
|
501
|
+
const convRes = _serializeOverrideValueHandles(world, registry, ov);
|
|
502
|
+
if (!convRes.ok) return convRes;
|
|
503
|
+
mountOverrides.push({
|
|
504
|
+
...ov,
|
|
505
|
+
localId: (memberFirst0 + (ov.localId as unknown as number)) as LocalEntityId,
|
|
506
|
+
value: convRes.value,
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
const mount: SceneInstanceMount = {
|
|
513
|
+
localId: (ownedCount + outMounts.length) as LocalEntityId,
|
|
514
|
+
source: a.sourceGuid,
|
|
515
|
+
memberFirst: nextMF as LocalEntityId,
|
|
516
|
+
memberCount: a.totalSlots,
|
|
517
|
+
...(mp !== undefined ? { parent: mp as LocalEntityId } : {}),
|
|
518
|
+
...(mountComponents !== undefined ? { components: mountComponents } : {}),
|
|
519
|
+
...(mountOverrides !== undefined && mountOverrides.length > 0
|
|
520
|
+
? { overrides: mountOverrides }
|
|
521
|
+
: {}),
|
|
522
|
+
};
|
|
523
|
+
outMounts.push(mount);
|
|
524
|
+
nextMF += a.totalSlots;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// Entity ref resolution helper.
|
|
528
|
+
function _rlid(t: number): number | undefined {
|
|
529
|
+
const ol = entityToLocalId.get(t);
|
|
530
|
+
if (ol !== undefined) return ol;
|
|
531
|
+
// An absorbed mount carrier resolves to its mount's localId (the mount took
|
|
532
|
+
// the carrier's slot in Step 1.75), so refs to the carrier — e.g. the
|
|
533
|
+
// wrapper's Children list — point at the mount rather than dangle.
|
|
534
|
+
const absorbedAnchor = carrierToAnchor.get(t);
|
|
535
|
+
if (absorbedAnchor !== undefined) {
|
|
536
|
+
for (let i = 0; i < nonRootAnchors.length; i++) {
|
|
537
|
+
if (nonRootAnchors[i]?.entityRaw === absorbedAnchor) return ownedCount + i;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
for (let i = 0; i < nonRootAnchors.length; i++) {
|
|
541
|
+
if (nonRootAnchors[i]?.entityRaw === t) return ownedCount + i;
|
|
542
|
+
}
|
|
543
|
+
const mo = memberOrigin.get(t);
|
|
544
|
+
if (mo !== undefined) {
|
|
545
|
+
for (let i = 0; i < nonRootAnchors.length; i++) {
|
|
546
|
+
if (nonRootAnchors[i]?.entityRaw === mo.anchorRaw) {
|
|
547
|
+
let mf = ownedCount + nonRootAnchors.length;
|
|
548
|
+
for (let j = 0; j < i; j++) mf += nonRootAnchors[j]?.totalSlots ?? 0;
|
|
549
|
+
return mf + mo.memberLocalId;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
return undefined;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
// ── Step 4: Build SceneEntity rows ──
|
|
557
|
+
const registeredComps = world.components.entries();
|
|
558
|
+
const entities: SceneEntity[] = [];
|
|
559
|
+
|
|
560
|
+
for (let lid = 0; lid < ownedEntities.length; lid++) {
|
|
561
|
+
const entityRaw = ownedEntities[lid];
|
|
562
|
+
if (entityRaw === undefined) continue;
|
|
563
|
+
const entity = entityRaw as EntityHandle;
|
|
564
|
+
const components: Record<string, Record<string, unknown>> = {};
|
|
565
|
+
const isRoot = rootRawSet.has(entityRaw);
|
|
566
|
+
|
|
567
|
+
for (const [compName, compToken] of registeredComps) {
|
|
568
|
+
if (
|
|
569
|
+
!collectProfile.includeComponent(
|
|
570
|
+
compName,
|
|
571
|
+
componentDefinition(compToken).policy.transient === true,
|
|
572
|
+
)
|
|
573
|
+
)
|
|
574
|
+
continue;
|
|
575
|
+
if (isRoot && compName === 'ChildOf') continue;
|
|
576
|
+
|
|
577
|
+
const valRes = world.get(entity, compToken as EcsComponent<string>);
|
|
578
|
+
if (!valRes.ok) continue;
|
|
579
|
+
|
|
580
|
+
const val = valRes.value as Record<string, unknown>;
|
|
581
|
+
const comp = compToken;
|
|
582
|
+
if (comp === undefined) continue;
|
|
583
|
+
|
|
584
|
+
const schema = componentSchema(comp);
|
|
585
|
+
const schemaKeys = Object.keys(schema);
|
|
586
|
+
// Empty-schema components are authored marker components, not absent
|
|
587
|
+
// state. Preserve their presence through scene-pack round-trips (for
|
|
588
|
+
// example AudioListener); transient markers have already been excluded
|
|
589
|
+
// above and therefore remain derived-only by declaration.
|
|
590
|
+
if (schemaKeys.length === 0) {
|
|
591
|
+
components[compName] = {};
|
|
592
|
+
continue;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
const fieldValues: Record<string, unknown> = {};
|
|
596
|
+
|
|
597
|
+
for (const fieldName of schemaKeys) {
|
|
598
|
+
const rawValue = val[fieldName];
|
|
599
|
+
if (rawValue === undefined) continue;
|
|
600
|
+
|
|
601
|
+
// Field-level transient skip (D-5): a field declared `transient: true`
|
|
602
|
+
// is derived/reconstructable and excluded from serialization, just as a
|
|
603
|
+
// transient component (L554) is. Generic — reads the reflection flag for
|
|
604
|
+
// any component/field; no hardcoded component or field name.
|
|
605
|
+
if (
|
|
606
|
+
!collectProfile.includeField(
|
|
607
|
+
compName,
|
|
608
|
+
fieldName,
|
|
609
|
+
componentDefinition(comp).fields[fieldName]?.transient === true,
|
|
610
|
+
)
|
|
611
|
+
)
|
|
612
|
+
continue;
|
|
613
|
+
|
|
614
|
+
const schemaFieldType = schema[fieldName];
|
|
615
|
+
const entityKind = classifyEntityField(comp as EcsComponent, fieldName);
|
|
616
|
+
const sharedClass =
|
|
617
|
+
schemaFieldType !== undefined ? classifyFieldSchema(schemaFieldType) : undefined;
|
|
618
|
+
|
|
619
|
+
if (!entityKind && !sharedClass) {
|
|
620
|
+
if (_isArrayLike(rawValue)) {
|
|
621
|
+
fieldValues[fieldName] = _normalizeArray(rawValue);
|
|
622
|
+
} else {
|
|
623
|
+
fieldValues[fieldName] = rawValue;
|
|
624
|
+
}
|
|
625
|
+
continue;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
if (entityKind !== null) {
|
|
629
|
+
// Entity / array<entity> field — use shared kernel for remap
|
|
630
|
+
if (entityKind.isArray) {
|
|
631
|
+
const arr = _isArrayLike(rawValue)
|
|
632
|
+
? _normalizeArray(rawValue)
|
|
633
|
+
: (rawValue as unknown[]);
|
|
634
|
+
const mapped: number[] = [];
|
|
635
|
+
for (const elem of arr) {
|
|
636
|
+
const lid2 = _rlid(elem as number);
|
|
637
|
+
if (lid2 === undefined) {
|
|
638
|
+
return err(
|
|
639
|
+
new SceneCollectEntityRefOutOfClosureError(entityRaw, fieldName, elem as number),
|
|
640
|
+
);
|
|
641
|
+
}
|
|
642
|
+
mapped.push(lid2);
|
|
643
|
+
}
|
|
644
|
+
fieldValues[fieldName] = mapped;
|
|
645
|
+
} else {
|
|
646
|
+
// A nullable entity field uses the ECS null sentinel and is omitted
|
|
647
|
+
// from the scene payload just like a null shared handle. It is not
|
|
648
|
+
// an out-of-closure reference.
|
|
649
|
+
if (rawValue === null) continue;
|
|
650
|
+
const lid2 = _rlid(rawValue as number);
|
|
651
|
+
if (lid2 === undefined) {
|
|
652
|
+
return err(
|
|
653
|
+
new SceneCollectEntityRefOutOfClosureError(
|
|
654
|
+
entityRaw,
|
|
655
|
+
fieldName,
|
|
656
|
+
rawValue as number,
|
|
657
|
+
),
|
|
658
|
+
);
|
|
659
|
+
}
|
|
660
|
+
fieldValues[fieldName] = lid2;
|
|
661
|
+
}
|
|
662
|
+
} else {
|
|
663
|
+
// shared<T> field — reverse-lookup handle(s) to GUID(s) via the shared
|
|
664
|
+
// kernel (same two-state NULL-sentinel the M5 override serializer uses).
|
|
665
|
+
// scalar handle 0 -> undefined => omit the field (deserialize restores
|
|
666
|
+
// the slot-0 default; emitting 0 would be misread as refs index 0 by
|
|
667
|
+
// parseScenePayload HANDLE_FIELD_NAMES). array handle 0 -> positional 0
|
|
668
|
+
// kept (paired SoA alignment, e.g. AnimationPlayer.clips = [h,0,0,0]).
|
|
669
|
+
// AnimationPlayer.graph (shared<AnimationGraph> scalar, M4/w31) is
|
|
670
|
+
// handled generically here — no special case needed.
|
|
671
|
+
const normalized = _isArrayLike(rawValue) ? _normalizeArray(rawValue) : rawValue;
|
|
672
|
+
if (sharedClass === undefined) {
|
|
673
|
+
// Fallback: non-entity, non-shared — pass through
|
|
674
|
+
fieldValues[fieldName] = normalized;
|
|
675
|
+
continue;
|
|
676
|
+
}
|
|
677
|
+
const conv = _serializeSharedFieldValue(
|
|
678
|
+
world,
|
|
679
|
+
registry,
|
|
680
|
+
sharedClass,
|
|
681
|
+
normalized,
|
|
682
|
+
fieldName,
|
|
683
|
+
);
|
|
684
|
+
if (!conv.ok) return conv;
|
|
685
|
+
if (sharedClass.scalar && conv.value === undefined) continue; // NULL sentinel -> omit
|
|
686
|
+
fieldValues[fieldName] = conv.value;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
if (Object.keys(fieldValues).length > 0) components[compName] = fieldValues;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
entities.push({ localId: lid as LocalEntityId, components } as SceneEntity);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
return ok({
|
|
697
|
+
kind: 'scene',
|
|
698
|
+
entities,
|
|
699
|
+
...(outMounts.length > 0 ? { mounts: outMounts } : {}),
|
|
700
|
+
});
|
|
701
|
+
}
|