@forgeax/engine-runtime 0.1.21 → 0.1.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -9
- package/dist/__tests__/advance-animation-player.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/advance-animation-player.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-aabb.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-aabb.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-bootstrap.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-bootstrap.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-builtin-nineslice.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-builtin-nineslice.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-d9-tile-sampler-soft-warn.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-d9-tile-sampler-soft-warn.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-guid.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-guid.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-material-validate.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-material-validate.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-mesh-fail-fast.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-mesh-fail-fast.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-scene.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-scene.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-sprite-slices-validate.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-sprite-slices-validate.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-renderer-assembly.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-renderer-assembly.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/asset.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/bloom-gating.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/bloom-gating.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/builtin-guid-ssot.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/builtin-guid-ssot.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/builtin-pack.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/builtin-pack.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/camera-antialias.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/camera-antialias.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/camera-bloom.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/camera-bloom.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/camera-clear-schema.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/camera-clear-schema.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/camera-ortho.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/camera-ortho.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/cluster-binner.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/cluster-binner.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/create-renderer-fallback-shader-manifest.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/create-renderer-fallback-shader-manifest.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/create-renderer-uniform-fallback.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/create-renderer-uniform-fallback.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/cubemap-upload.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/cubemap-upload.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/dev-import-transport.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/dev-import-transport.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/engine-metrics.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/engine-metrics.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/equirect-projection-error.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/equirect-projection-error.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/font-asset-load.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/font-asset-load.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/fxaa-intermediate-texture.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/fxaa-intermediate-texture.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/fxaa-pipeline.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/fxaa-pipeline.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-residency.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-residency.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-resource-release.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-resource-release.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/handle-quad.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/handle-quad.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/hdrp-bgl-slots.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/hdrp-bgl-slots.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/hdrp-grid-invalid.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/hdrp-grid-invalid.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/hdrp-index-list-overflow-once.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/hdrp-index-list-overflow-once.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/hdrp-light-budget.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/hdrp-light-budget.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/hdrp-pipeline-asset-config.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/hdrp-pipeline-asset-config.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/helpers/register-runtime-components.d.ts.map +1 -1
- package/dist/__tests__/helpers/register-scene-components.d.ts.map +1 -1
- package/dist/__tests__/helpers/renderer-device-loss-dawn.d.ts +25 -0
- package/dist/__tests__/helpers/renderer-device-loss-dawn.d.ts.map +1 -0
- package/dist/__tests__/helpers/standard-material-manifest.d.ts +0 -1
- package/dist/__tests__/helpers/standard-material-manifest.d.ts.map +1 -1
- package/dist/__tests__/ibl-pipeline-cache.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/ibl-pipeline-cache.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/lazy-catalog.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/lazy-catalog.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/load-by-guid-hdr.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/load-by-guid-hdr.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/load-by-guid-prod-material-parent.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/load-by-guid-prod-material-parent.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/load-by-guid-prod.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/load-by-guid-prod.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/loader-registry.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/loader-registry.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/m7-hdrp-demo-shape.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/m7-hdrp-demo-shape.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mipmap-formula.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/mipmap-formula.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mipmap-pipeline-cache.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/mipmap-pipeline-cache.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/parse-asset-payload-material.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/parse-asset-payload-material.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/parse-asset-payload-texture.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/parse-asset-payload-texture.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/parse-scene-payload-refs.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/parse-scene-payload-refs.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pass-selector.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/pass-selector.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-builder.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/pipeline-builder.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-cache-key-topology.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/pipeline-cache-key-topology.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-vertex-stride-branch.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/pipeline-vertex-stride-branch.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/pipeline.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/post-process-register.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/post-process-register.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/propagate-transforms.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/propagate-transforms.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/record-all-topology.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/record-all-topology.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/record-draw-branch.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/record-draw-branch.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/record-strip-index-format.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/record-strip-index-format.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/register-with-guid-rgba16float.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/register-with-guid-rgba16float.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-data.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/render-data.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -1
- package/dist/__tests__/render-query-regression.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/render-query-regression.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-record-submesh.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-record-submesh.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-system-record-warn-once.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-record-warn-once.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-device-loss-multi-world.integration.test.d.ts +2 -0
- package/dist/__tests__/renderer-device-loss-multi-world.integration.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-device-loss-provider-feasibility.dawn.test.d.ts +2 -0
- package/dist/__tests__/renderer-device-loss-provider-feasibility.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-device-loss-recovery.dawn.test.d.ts +2 -0
- package/dist/__tests__/renderer-device-loss-recovery.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-draw-world.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/renderer-draw-world.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-recovery-consumer.integration.test.d.ts +2 -0
- package/dist/__tests__/renderer-recovery-consumer.integration.test.d.ts.map +1 -0
- package/dist/__tests__/renderstate-pipeline-cache.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/renderstate-pipeline-cache.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/resolve-scene-guids.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/resolve-scene-guids.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-skip-non-triangle.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/shadow-skip-non-triangle.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin-errors-kebab-case.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skin-errors-kebab-case.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin-instances-coexist.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skin-instances-coexist.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin-m2-extract-happy.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skin-m2-extract-happy.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin-m2-extract-joint-error.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skin-m2-extract-joint-error.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin-m2-extract-null-assets.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skin-m2-extract-null-assets.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin-m2-extract-skeleton-error.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skin-m2-extract-skeleton-error.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin-m3-record-cache.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skin-m3-record-cache.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin-palette-extract.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skin-palette-extract.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin-pipeline-routing.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skin-pipeline-routing.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skin.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skin.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skybox-extract.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skybox-extract.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skybox-shader-compile.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skybox-shader-compile.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skylight-bind-group.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skylight-bind-group.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skylight-component.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skylight-component.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skylight-fallback-path.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skylight-fallback-path.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skylight-pipeline-layout.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skylight-pipeline-layout.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/skylight-solid-color-extract.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/skylight-solid-color-extract.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-animation-tick-boundary.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/sprite-animation-tick-boundary.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-animation-tick-clamp.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/sprite-animation-tick-clamp.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-animation-tick-frame-duration-negative.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/sprite-animation-tick-frame-duration-negative.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-animation-tick-frame-duration-zero.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/sprite-animation-tick-frame-duration-zero.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-animation-tick-loop.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/sprite-animation-tick-loop.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-animation-tick-override-probe.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/sprite-animation-tick-override-probe.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/sprite-animation-tick-regions-mismatch.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/sprite-animation-tick-regions-mismatch.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/storage-buffer-caps.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/storage-buffer-caps.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/systems.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/systems.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tonemap-hdr-target.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/tonemap-hdr-target.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tonemap-pipeline-split.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/tonemap-pipeline-split.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/tonemap.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/tonemap.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/transparent-sort-config-get.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/transparent-sort-config-get.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/transparent-sort-config-set.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/transparent-sort-config-set.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/transparent-sort.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/transparent-sort.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/upload-texture-consistency.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/upload-texture-consistency.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/verify-revisions.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/verify-revisions.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/wire-default-loaders.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/wire-default-loaders.cases.unit.test.d.ts.map +1 -0
- package/dist/__tests__/zero-camera-clear-fallback.cases.unit.test.d.ts +2 -0
- package/dist/__tests__/zero-camera-clear-fallback.cases.unit.test.d.ts.map +1 -0
- package/dist/createRenderer.d.ts.map +1 -1
- package/dist/dev-import-transport.d.ts.map +1 -1
- package/dist/index.mjs +4 -3
- package/dist/index.mjs.map +1 -1
- package/dist/sprite-param-values.d.ts +1 -1
- package/package.json +30 -30
- package/src/__tests__/advance-animation-player.cases.unit.test.ts +1666 -0
- package/src/__tests__/animation-graph-asset-union.test-d.ts +2 -0
- package/src/__tests__/asset-brand-and-name-retirement.test.ts +4 -3
- package/src/__tests__/asset-registry-aabb.cases.unit.test.ts +676 -0
- package/src/__tests__/asset-registry-bootstrap.cases.unit.test.ts +472 -0
- package/src/__tests__/asset-registry-builtin-nineslice.cases.unit.test.ts +481 -0
- package/src/__tests__/asset-registry-d9-tile-sampler-soft-warn.cases.unit.test.ts +568 -0
- package/src/__tests__/asset-registry-guid.cases.unit.test.ts +500 -0
- package/src/__tests__/asset-registry-material-validate.cases.unit.test.ts +756 -0
- package/src/__tests__/asset-registry-mesh-fail-fast.cases.unit.test.ts +591 -0
- package/src/__tests__/asset-registry-scene.cases.unit.test.ts +501 -0
- package/src/__tests__/asset-registry-scene.test-d.ts +1 -0
- package/src/__tests__/asset-registry-sprite-slices-validate.cases.unit.test.ts +536 -0
- package/src/__tests__/asset-renderer-assembly.cases.unit.test.ts +496 -0
- package/src/__tests__/asset.cases.unit.test.ts +439 -0
- package/src/__tests__/bind-group-cache-keying.test.ts +6 -2
- package/src/__tests__/bloom-gating.cases.unit.test.ts +428 -0
- package/src/__tests__/builtin-guid-ssot.cases.unit.test.ts +472 -0
- package/src/__tests__/builtin-pack.cases.unit.test.ts +639 -0
- package/src/__tests__/builtin-shader-register-e2e.test.ts +1 -1
- package/src/__tests__/camera-antialias.cases.unit.test.ts +372 -0
- package/src/__tests__/camera-bloom.cases.unit.test.ts +396 -0
- package/src/__tests__/camera-clear-schema.cases.unit.test.ts +391 -0
- package/src/__tests__/camera-ortho.cases.unit.test.ts +484 -0
- package/src/__tests__/cluster-binner.cases.unit.test.ts +817 -0
- package/src/__tests__/collect-scene-mount-collapse.test.ts +5 -1
- package/src/__tests__/collect-transient-roundtrip.test.ts +14 -3
- package/src/__tests__/components.test-d.ts +9 -6
- package/src/__tests__/components.unit.test.ts +23 -19
- package/src/__tests__/create-renderer-fallback-shader-manifest.cases.unit.test.ts +345 -0
- package/src/__tests__/create-renderer-uniform-fallback.cases.unit.test.ts +445 -0
- package/src/__tests__/cubemap-upload.cases.unit.test.ts +593 -0
- package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +184 -17
- package/src/__tests__/dawn/material-alpha.dawn.test.ts +17 -4
- package/src/__tests__/derive-bgl-integration.test.ts +8 -8
- package/src/__tests__/dev-import-transport.cases.unit.test.ts +503 -0
- package/src/__tests__/engine-metrics.cases.unit.test.ts +371 -0
- package/src/__tests__/equirect-projection-error.cases.unit.test.ts +416 -0
- package/src/__tests__/errors.unit.test.ts +3 -0
- package/src/__tests__/extract-frames-merge.test.ts +3 -0
- package/src/__tests__/font-asset-load.cases.unit.test.ts +510 -0
- package/src/__tests__/fxaa-intermediate-texture.cases.unit.test.ts +690 -0
- package/src/__tests__/fxaa-pipeline.cases.unit.test.ts +546 -0
- package/src/__tests__/gpu-residency.cases.unit.test.ts +479 -0
- package/src/__tests__/gpu-resource-release.cases.unit.test.ts +929 -0
- package/src/__tests__/handle-quad.cases.unit.test.ts +491 -0
- package/src/__tests__/hdrp-bgl-slots.cases.unit.test.ts +451 -0
- package/src/__tests__/hdrp-grid-invalid.cases.unit.test.ts +408 -0
- package/src/__tests__/hdrp-index-list-overflow-once.cases.unit.test.ts +405 -0
- package/src/__tests__/hdrp-light-budget.cases.unit.test.ts +483 -0
- package/src/__tests__/hdrp-pipeline-asset-config.cases.unit.test.ts +441 -0
- package/src/__tests__/helpers/register-runtime-components.ts +9 -1
- package/src/__tests__/helpers/register-scene-components.ts +9 -2
- package/src/__tests__/helpers/renderer-device-loss-dawn.ts +69 -0
- package/src/__tests__/helpers/standard-material-manifest.ts +11 -15
- package/src/__tests__/ibl-pipeline-cache.cases.unit.test.ts +415 -0
- package/src/__tests__/lazy-catalog.cases.unit.test.ts +848 -0
- package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +14 -15
- package/src/__tests__/light-snapshot.test-d.ts +27 -1
- package/src/__tests__/lights-preservation.fixup.test.ts +19 -21
- package/src/__tests__/lights.unit.test.ts +2076 -1
- package/src/__tests__/load-by-guid-hdr.cases.unit.test.ts +582 -0
- package/src/__tests__/load-by-guid-prod-material-parent.cases.unit.test.ts +1514 -0
- package/src/__tests__/load-by-guid-prod.cases.unit.test.ts +557 -0
- package/src/__tests__/loader-name-survival.test.ts +8 -9
- package/src/__tests__/loader-registry.cases.unit.test.ts +767 -0
- package/src/__tests__/m7-hdrp-demo-shape.cases.unit.test.ts +361 -0
- package/src/__tests__/material-texture-uv-scale.unit.test.ts +2 -2
- package/src/__tests__/materials.unit.test.ts +29 -10
- package/src/__tests__/mipmap-formula.cases.unit.test.ts +434 -0
- package/src/__tests__/mipmap-pipeline-cache.cases.unit.test.ts +490 -0
- package/src/__tests__/package-promotion.test.ts +7 -11
- package/src/__tests__/parse-asset-payload-material.cases.unit.test.ts +565 -0
- package/src/__tests__/parse-asset-payload-texture.cases.unit.test.ts +720 -0
- package/src/__tests__/parse-scene-payload-refs.cases.unit.test.ts +767 -0
- package/src/__tests__/pass-selector.cases.unit.test.ts +376 -0
- package/src/__tests__/pbr-pipeline.unit.test.ts +39 -21
- package/src/__tests__/pipeline-builder.cases.unit.test.ts +624 -0
- package/src/__tests__/pipeline-cache-key-topology.cases.unit.test.ts +807 -0
- package/src/__tests__/pipeline-vertex-stride-branch.cases.unit.test.ts +379 -0
- package/src/__tests__/pipeline.cases.unit.test.ts +370 -0
- package/src/__tests__/point-light-shadow.browser.test.ts +1 -0
- package/src/__tests__/point-light-shadow.unit.test.ts +18 -98
- package/src/__tests__/post-process-register.cases.unit.test.ts +405 -0
- package/src/__tests__/propagate-transforms.cases.unit.test.ts +502 -0
- package/src/__tests__/propagate-transforms.dawn.test.ts +34 -18
- package/src/__tests__/record-all-topology.cases.unit.test.ts +608 -0
- package/src/__tests__/record-draw-branch.cases.unit.test.ts +621 -0
- package/src/__tests__/record-strip-index-format.cases.unit.test.ts +419 -0
- package/src/__tests__/record-worldid-isolation.test.ts +16 -32
- package/src/__tests__/register-with-guid-rgba16float.cases.unit.test.ts +469 -0
- package/src/__tests__/render-data.cases.unit.test.ts +553 -0
- package/src/__tests__/render-error-exhaustive.test-d.ts +11 -0
- package/src/__tests__/render-query-regression.cases.unit.test.ts +531 -0
- package/src/__tests__/render-system-extract.test.ts +5 -5
- package/src/__tests__/render-system-record-multi-material-textureview.test.ts +1 -0
- package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +1 -0
- package/src/__tests__/render-system-record-submesh.cases.unit.test.ts +740 -0
- package/src/__tests__/render-system-record-warn-once.cases.unit.test.ts +418 -0
- package/src/__tests__/render-system-record.test.ts +15 -33
- package/src/__tests__/renderer-device-loss-multi-world.integration.test.ts +103 -0
- package/src/__tests__/renderer-device-loss-provider-feasibility.dawn.test.ts +124 -0
- package/src/__tests__/renderer-device-loss-recovery.dawn.test.ts +50 -0
- package/src/__tests__/renderer-draw-world.cases.unit.test.ts +514 -0
- package/src/__tests__/renderer-recovery-consumer.integration.test.ts +96 -0
- package/src/__tests__/renderer-surface.unit.test.ts +0 -2
- package/src/__tests__/renderstate-pipeline-cache.cases.unit.test.ts +631 -0
- package/src/__tests__/resolve-scene-guids.cases.unit.test.ts +1123 -0
- package/src/__tests__/resolveName-unified-entry.test.ts +6 -6
- package/src/__tests__/resolveName.test.ts +14 -2
- package/src/__tests__/shadow-caster-empty-schema.test.ts +1 -1
- package/src/__tests__/shadow-csm-cascade-loadop.test.ts +1 -0
- package/src/__tests__/shadow-csm-tile-consistency.test.ts +1 -0
- package/src/__tests__/shadow-csm-ubo.test.ts +3 -1
- package/src/__tests__/shadow-fields-observable.dawn.test.ts +15 -4
- package/src/__tests__/shadow-m1.dawn.test.ts +1 -1
- package/src/__tests__/shadow-skip-non-triangle.cases.unit.test.ts +681 -0
- package/src/__tests__/skin-errors-kebab-case.cases.unit.test.ts +475 -0
- package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +5 -4
- package/src/__tests__/skin-instances-coexist.cases.unit.test.ts +375 -0
- package/src/__tests__/skin-m2-extract-happy.cases.unit.test.ts +592 -0
- package/src/__tests__/skin-m2-extract-joint-error.cases.unit.test.ts +619 -0
- package/src/__tests__/skin-m2-extract-null-assets.cases.unit.test.ts +569 -0
- package/src/__tests__/skin-m2-extract-skeleton-error.cases.unit.test.ts +585 -0
- package/src/__tests__/skin-m3-record-cache.cases.unit.test.ts +457 -0
- package/src/__tests__/skin-palette-extract.cases.unit.test.ts +635 -0
- package/src/__tests__/skin-parented-double-transform.test.ts +5 -5
- package/src/__tests__/skin-pipeline-routing.cases.unit.test.ts +411 -0
- package/src/__tests__/skin.cases.unit.test.ts +421 -0
- package/src/__tests__/skinned-shadow-mixed.dawn.test.ts +1 -6
- package/src/__tests__/skybox-extract.cases.unit.test.ts +511 -0
- package/src/__tests__/skybox-shader-compile.cases.unit.test.ts +437 -0
- package/src/__tests__/skylight-bind-group.cases.unit.test.ts +642 -0
- package/src/__tests__/skylight-component.cases.unit.test.ts +386 -0
- package/src/__tests__/skylight-fallback-path.cases.unit.test.ts +566 -0
- package/src/__tests__/skylight-lazy-projection.test.ts +35 -20
- package/src/__tests__/skylight-pipeline-layout.cases.unit.test.ts +506 -0
- package/src/__tests__/skylight-solid-color-extract.cases.unit.test.ts +399 -0
- package/src/__tests__/sprite-animation-tick-boundary.cases.unit.test.ts +521 -0
- package/src/__tests__/sprite-animation-tick-clamp.cases.unit.test.ts +453 -0
- package/src/__tests__/sprite-animation-tick-frame-duration-negative.cases.unit.test.ts +447 -0
- package/src/__tests__/sprite-animation-tick-frame-duration-zero.cases.unit.test.ts +395 -0
- package/src/__tests__/sprite-animation-tick-loop.cases.unit.test.ts +494 -0
- package/src/__tests__/sprite-animation-tick-override-probe.cases.unit.test.ts +439 -0
- package/src/__tests__/sprite-animation-tick-regions-mismatch.cases.unit.test.ts +466 -0
- package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +16 -18
- package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +1 -1
- package/src/__tests__/ssao-bgl.test.ts +2 -1
- package/src/__tests__/ssao-pipelines.test.ts +1 -1
- package/src/__tests__/storage-buffer-caps.cases.unit.test.ts +373 -0
- package/src/__tests__/systems.cases.unit.test.ts +425 -0
- package/src/__tests__/template-game-default-api-contract.test.ts +45 -23
- package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +1 -1
- package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +10 -4
- package/src/__tests__/tonemap-hdr-target.cases.unit.test.ts +670 -0
- package/src/__tests__/tonemap-pipeline-split.cases.unit.test.ts +867 -0
- package/src/__tests__/tonemap.cases.unit.test.ts +446 -0
- package/src/__tests__/transform-hierarchy-pixel-diff.dawn.test.ts +2 -2
- package/src/__tests__/transparent-sort-config-get.cases.unit.test.ts +395 -0
- package/src/__tests__/transparent-sort-config-set.cases.unit.test.ts +424 -0
- package/src/__tests__/transparent-sort.cases.unit.test.ts +684 -0
- package/src/__tests__/upload-texture-consistency.cases.unit.test.ts +478 -0
- package/src/__tests__/verify-revisions.cases.unit.test.ts +619 -0
- package/src/__tests__/wire-default-loaders.cases.unit.test.ts +461 -0
- package/src/__tests__/zero-camera-clear-fallback.cases.unit.test.ts +374 -0
- package/src/collect-scene-asset.ts +1 -1
- package/src/components/__tests__/transform-vec-schema.test.ts +2 -2
- package/src/createRenderer.ts +1 -0
- package/src/dev-import-transport.ts +2 -1
- package/src/sprite-param-values.ts +1 -1
- package/dist/.tsbuildinfo +0 -1
- package/dist/__tests__/asset.unit.test.d.ts +0 -2
- package/dist/__tests__/asset.unit.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/systems.unit.test.d.ts +0 -2
- package/dist/__tests__/systems.unit.test.d.ts.map +0 -1
- package/src/__tests__/asset.unit.test.ts +0 -7110
- package/src/__tests__/pipeline.unit.test.ts +0 -5283
- package/src/__tests__/systems.unit.test.ts +0 -9210
|
@@ -119,7 +119,11 @@ describe('m2-t2 — Form 1: deep anchor with ChildOf parent', () => {
|
|
|
119
119
|
reg.catalog(pg(G1), child as Asset);
|
|
120
120
|
const ch = rs(w, child);
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
// Relationship sources now reject stale targets at the public boundary.
|
|
123
|
+
// Use a real, non-descended host for this fixture so the test still
|
|
124
|
+
// exercises a deep anchor without manufacturing an invalid public edge.
|
|
125
|
+
const outerHost = w.spawn().unwrap();
|
|
126
|
+
const outerRes = w.spawn({ component: ChildOf, data: { parent: outerHost } });
|
|
123
127
|
expect(outerRes.ok).toBe(true);
|
|
124
128
|
if (!outerRes.ok) return;
|
|
125
129
|
const outerE = outerRes.value;
|
|
@@ -14,9 +14,15 @@ import * as SceneOwner from '@forgeax/engine-scene';
|
|
|
14
14
|
|
|
15
15
|
import { AssetRegistry } from '@forgeax/engine-assets-runtime';
|
|
16
16
|
import type { EntityHandle } from '@forgeax/engine-ecs';
|
|
17
|
-
import { World } from '@forgeax/engine-ecs';
|
|
17
|
+
import { componentDefinition, World } from '@forgeax/engine-ecs';
|
|
18
18
|
import { AssetGuid } from '@forgeax/engine-pack/guid';
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
ChildOf,
|
|
21
|
+
Children,
|
|
22
|
+
GlobalTransform,
|
|
23
|
+
propagateTransforms,
|
|
24
|
+
Transform,
|
|
25
|
+
} from '@forgeax/engine-scene';
|
|
20
26
|
import type { LocalEntityId, SceneAsset } from '@forgeax/engine-types';
|
|
21
27
|
import { describe, expect, it } from 'vitest';
|
|
22
28
|
import { rootsToSceneAsset } from '../collect-scene-asset';
|
|
@@ -26,7 +32,7 @@ import { registerSceneComponents } from './helpers/register-scene-components';
|
|
|
26
32
|
// Read the resolved world mat4 (column-major 16 floats) from the Transform
|
|
27
33
|
// world column array view.
|
|
28
34
|
function worldOf(world: World, entity: EntityHandle): Float32Array {
|
|
29
|
-
return world.get(entity,
|
|
35
|
+
return world.get(entity, GlobalTransform).unwrap().world;
|
|
30
36
|
}
|
|
31
37
|
|
|
32
38
|
function makeRegistry(): AssetRegistry {
|
|
@@ -210,6 +216,7 @@ describe('w1 — AC-04 transient world roundtrip numeric equivalence', () => {
|
|
|
210
216
|
for (const ent of collected.value.entities) {
|
|
211
217
|
const t = (ent.components as Record<string, Record<string, unknown>>).Transform;
|
|
212
218
|
if (t !== undefined) expect('world' in t).toBe(false);
|
|
219
|
+
expect((ent.components as Record<string, unknown>).GlobalTransform).toBeUndefined();
|
|
213
220
|
}
|
|
214
221
|
|
|
215
222
|
// Round-trip into a fresh world.
|
|
@@ -266,4 +273,8 @@ describe('w1 — AC-04 transient world roundtrip numeric equivalence', () => {
|
|
|
266
273
|
expect(wDst[13] as number).toBeCloseTo(4, 5);
|
|
267
274
|
expect(wDst[14] as number).toBeCloseTo(5, 5);
|
|
268
275
|
});
|
|
276
|
+
|
|
277
|
+
it('declares GlobalTransform transient and reconstructs it from the authored pair', () => {
|
|
278
|
+
expect(componentDefinition(GlobalTransform).policy.transient).toBe(true);
|
|
279
|
+
});
|
|
269
280
|
});
|
|
@@ -16,18 +16,20 @@
|
|
|
16
16
|
|
|
17
17
|
import type { InputShapeOf, SchemaOf, ShapeOf } from '@forgeax/engine-ecs';
|
|
18
18
|
import type { Camera, DirectionalLight, MeshFilter, MeshRenderer } from '@forgeax/engine-render';
|
|
19
|
-
import type { ChildOf, Transform } from '@forgeax/engine-scene';
|
|
19
|
+
import type { ChildOf, GlobalTransform, Transform } from '@forgeax/engine-scene';
|
|
20
20
|
import type { Handle } from '@forgeax/engine-types';
|
|
21
21
|
import { describe, expectTypeOf, it } from 'vitest';
|
|
22
22
|
|
|
23
23
|
describe('w7 type-level - 5 component schemas yield exact data shapes via ShapeOf', () => {
|
|
24
|
-
it('Transform data shape has 3 local inline-array fields
|
|
24
|
+
it('Transform data shape has 3 local inline-array fields', () => {
|
|
25
25
|
type Data = ShapeOf<SchemaOf<typeof Transform>>;
|
|
26
|
-
expectTypeOf<keyof Data>().toEqualTypeOf<'pos' | 'quat' | 'scale'
|
|
26
|
+
expectTypeOf<keyof Data>().toEqualTypeOf<'pos' | 'quat' | 'scale'>();
|
|
27
27
|
expectTypeOf<Data['pos']>().toEqualTypeOf<Float32Array>();
|
|
28
28
|
expectTypeOf<Data['quat']>().toEqualTypeOf<Float32Array>();
|
|
29
29
|
expectTypeOf<Data['scale']>().toEqualTypeOf<Float32Array>();
|
|
30
|
-
|
|
30
|
+
type GlobalData = ShapeOf<SchemaOf<typeof GlobalTransform>>;
|
|
31
|
+
expectTypeOf<keyof GlobalData>().toEqualTypeOf<'world'>();
|
|
32
|
+
expectTypeOf<GlobalData['world']>().toEqualTypeOf<Float32Array>();
|
|
31
33
|
// Write side widens `array<f32, N>` to also accept plain number[] literals
|
|
32
34
|
// (InputShapeOf asymmetry): `pos: [1, 2, 3]` spawns without a
|
|
33
35
|
// Float32Array wrapper at the call site.
|
|
@@ -190,12 +192,13 @@ describe('w7 type-level - component name literal types are preserved', () => {
|
|
|
190
192
|
// ────────────────────────────────────────────────────────────────────────────
|
|
191
193
|
|
|
192
194
|
describe('w15 AC-04 type constraint — ShapeOf derivation from field-payload', () => {
|
|
193
|
-
it(
|
|
195
|
+
it('ShapeOf<SchemaOf<typeof Transform>> yields local Float32Array views', () => {
|
|
194
196
|
type T = ShapeOf<SchemaOf<typeof Transform>>;
|
|
195
197
|
expectTypeOf<T['pos']>().toEqualTypeOf<Float32Array>();
|
|
196
198
|
expectTypeOf<T['quat']>().toEqualTypeOf<Float32Array>();
|
|
197
199
|
expectTypeOf<T['scale']>().toEqualTypeOf<Float32Array>();
|
|
198
|
-
|
|
200
|
+
type GlobalData = ShapeOf<SchemaOf<typeof GlobalTransform>>;
|
|
201
|
+
expectTypeOf<GlobalData['world']>().toEqualTypeOf<Float32Array>();
|
|
199
202
|
});
|
|
200
203
|
|
|
201
204
|
it("ShapeOf<SchemaOf<typeof Camera>> yields 21 number fields ('f32' -> number) + autoAspect boolean ('bool' -> boolean)", () => {
|
|
@@ -65,7 +65,13 @@ import {
|
|
|
65
65
|
Tilemap,
|
|
66
66
|
} from '@forgeax/engine-render/authoring';
|
|
67
67
|
import * as SceneOwner from '@forgeax/engine-scene';
|
|
68
|
-
import {
|
|
68
|
+
import {
|
|
69
|
+
ChildOf,
|
|
70
|
+
Children,
|
|
71
|
+
GlobalTransform,
|
|
72
|
+
propagateTransforms,
|
|
73
|
+
Transform,
|
|
74
|
+
} from '@forgeax/engine-scene';
|
|
69
75
|
import type { Handle, LocalEntityId, SceneAsset, SceneEntity } from '@forgeax/engine-types';
|
|
70
76
|
import { toShared } from '@forgeax/engine-types';
|
|
71
77
|
import { describe, expect, expectTypeOf, it } from 'vitest';
|
|
@@ -150,17 +156,17 @@ import { extractFrame, prepareExtractContext } from '../../../render/src/render-
|
|
|
150
156
|
// abstraction: components are flat-scalar SoA columns, not nested objects).
|
|
151
157
|
|
|
152
158
|
describe('w7 - 5 component schemas register through defineComponent', () => {
|
|
153
|
-
it('Transform has
|
|
159
|
+
it('Transform has the three authored local array fields', () => {
|
|
154
160
|
expect(Transform.name).toBe('Transform');
|
|
155
|
-
expect(Object.keys(componentSchema(Transform)).length).toBe(
|
|
161
|
+
expect(Object.keys(componentSchema(Transform)).length).toBe(3);
|
|
156
162
|
// pos: inline [x, y, z]
|
|
157
163
|
expect(componentSchema(Transform).pos).toBe('array<f32, 3>');
|
|
158
164
|
// quat: inline [x, y, z, w] quaternion
|
|
159
165
|
expect(componentSchema(Transform).quat).toBe('array<f32, 4>');
|
|
160
166
|
// scale: inline [x, y, z]
|
|
161
167
|
expect(componentSchema(Transform).scale).toBe('array<f32, 3>');
|
|
162
|
-
|
|
163
|
-
expect(componentSchema(
|
|
168
|
+
expect(GlobalTransform.name).toBe('GlobalTransform');
|
|
169
|
+
expect(componentSchema(GlobalTransform).world).toBe('array<f32, 16>');
|
|
164
170
|
});
|
|
165
171
|
|
|
166
172
|
it('MeshFilter has 1 shared<MeshAsset> field (assetHandle; M5 / w14)', () => {
|
|
@@ -414,9 +420,10 @@ import { extractFrame, prepareExtractContext } from '../../../render/src/render-
|
|
|
414
420
|
// file keeps an integration-shape spawn smoke for the
|
|
415
421
|
// archetype-with-Children path.
|
|
416
422
|
//
|
|
417
|
-
//
|
|
418
|
-
//
|
|
419
|
-
//
|
|
423
|
+
// The resolved world transform is the `GlobalTransform.world` mat4 column;
|
|
424
|
+
// Transform's generic ECS requirement materializes that carrier on normal
|
|
425
|
+
// spawn/add paths. Propagation + hierarchy compose coverage lives in
|
|
426
|
+
// render-system-extract.test.ts (GlobalTransform.world parent x child).
|
|
420
427
|
//
|
|
421
428
|
// charter mapping: proposition 2 (Bevy ChildOf/Children industry analog) +
|
|
422
429
|
// proposition 3 (machine-readable schema > prose: grep componentSchema(ChildOf) /
|
|
@@ -435,14 +442,10 @@ import { extractFrame, prepareExtractContext } from '../../../render/src/render-
|
|
|
435
442
|
expect((componentSchema(Children) as Record<string, unknown>).entities).toBe('array<entity>');
|
|
436
443
|
});
|
|
437
444
|
|
|
438
|
-
it('
|
|
439
|
-
|
|
440
|
-
// separate GlobalTransform component. The 3 local-TRS inline array
|
|
441
|
-
// columns (pos/quat/scale) plus the `world: array<f32, 16>` resolved
|
|
442
|
-
// mat4 are the full shape.
|
|
443
|
-
const tKeys = Object.keys(componentSchema(Transform));
|
|
445
|
+
it('GlobalTransform carries the resolved world mat4 column', () => {
|
|
446
|
+
const tKeys = Object.keys(componentSchema(GlobalTransform));
|
|
444
447
|
expect(tKeys).toContain('world');
|
|
445
|
-
expect(componentSchema(
|
|
448
|
+
expect(componentSchema(GlobalTransform).world).toBe('array<f32, 16>');
|
|
446
449
|
expect(componentSchema(Transform).pos).toBe('array<f32, 3>');
|
|
447
450
|
expect(componentSchema(Transform).quat).toBe('array<f32, 4>');
|
|
448
451
|
expect(componentSchema(Transform).scale).toBe('array<f32, 3>');
|
|
@@ -605,7 +608,7 @@ import { extractFrame, prepareExtractContext } from '../../../render/src/render-
|
|
|
605
608
|
//
|
|
606
609
|
// Two orthogonal guarantees after ChildOf gained its `relationship` block:
|
|
607
610
|
// AC-25 reader path unchanged -- propagateTransforms still walks ChildOf.parent
|
|
608
|
-
// upward and composes child.
|
|
611
|
+
// upward and composes child.GlobalTransform.world = parent.world x
|
|
609
612
|
// compose(child local). The migration must NOT alter this output.
|
|
610
613
|
// AC-25 mirror auto-maintained -- spawning / removing / reparenting ChildOf
|
|
611
614
|
// now auto-updates the parent's Children.entities list (the OOS-10 manual-
|
|
@@ -637,9 +640,9 @@ import { extractFrame, prepareExtractContext } from '../../../render/src/render-
|
|
|
637
640
|
const r = propagateTransforms(world);
|
|
638
641
|
expect(r.ok).toBe(true);
|
|
639
642
|
|
|
640
|
-
// feat-20260601: the resolved world transform lives on
|
|
643
|
+
// feat-20260601: the resolved world transform lives on GlobalTransform.world
|
|
641
644
|
// (a 16-float column-major mat4); the translation column is m[12,13,14].
|
|
642
|
-
const t = world.get(child,
|
|
645
|
+
const t = world.get(child, GlobalTransform);
|
|
643
646
|
expect(t.ok).toBe(true);
|
|
644
647
|
if (!t.ok) return;
|
|
645
648
|
const w = t.value.world;
|
|
@@ -2415,6 +2418,7 @@ import { extractFrame, prepareExtractContext } from '../../../render/src/render-
|
|
|
2415
2418
|
const world = new World();
|
|
2416
2419
|
const e = world.spawn({ component: Transform, data: {} }).unwrap();
|
|
2417
2420
|
const row = world.get(e, Transform).unwrap();
|
|
2421
|
+
const global = world.get(e, GlobalTransform).unwrap();
|
|
2418
2422
|
|
|
2419
2423
|
// local pos/quat/scale inline array columns at identity.
|
|
2420
2424
|
expect(Array.from(row.pos)).toEqual([0, 0, 0]);
|
|
@@ -2423,7 +2427,7 @@ import { extractFrame, prepareExtractContext } from '../../../render/src/render-
|
|
|
2423
2427
|
|
|
2424
2428
|
// world array<f32,16> resolves to a Float32Array view of 16 contiguous
|
|
2425
2429
|
// floats. Default fill is the identity mat4 (column-major).
|
|
2426
|
-
const w =
|
|
2430
|
+
const w = global.world as Float32Array;
|
|
2427
2431
|
expect(w).toBeInstanceOf(Float32Array);
|
|
2428
2432
|
expect(w.length).toBe(16);
|
|
2429
2433
|
const identity = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
// @ts-nocheck — merged file: cross-source node:fs/node:path imports outside @types/node coverage in runtime tsconfig
|
|
2
|
+
// Consolidated by feat-20260609-test-pool-startup-reduction-merge-tiny-test-files
|
|
3
|
+
// biome-ignore-all lint/complexity/noUselessLoneBlockStatements: block-scope isolation between merged source files (consolidation paradigm)
|
|
4
|
+
//
|
|
5
|
+
// Source files (N=33):
|
|
6
|
+
// - packages/runtime/__tests__/create-renderer-fallback.test.ts
|
|
7
|
+
// - packages/runtime/src/__tests__/cluster-binner.test.ts
|
|
8
|
+
// - packages/runtime/src/__tests__/create-renderer-fallback-shader-manifest.test.ts
|
|
9
|
+
// - packages/runtime/src/__tests__/create-renderer-uniform-fallback.test.ts
|
|
10
|
+
// - packages/runtime/src/__tests__/createRenderer.test.ts
|
|
11
|
+
// - packages/runtime/src/__tests__/dispatch-sort.test.ts
|
|
12
|
+
// - packages/runtime/src/__tests__/engine-metrics.test.ts
|
|
13
|
+
// - packages/runtime/src/__tests__/device/gpu-residency-caps-guard.test.ts
|
|
14
|
+
// - packages/runtime/src/__tests__/pass-selector.test.ts
|
|
15
|
+
// - packages/runtime/src/__tests__/pipeline-builder.test.ts
|
|
16
|
+
// - packages/runtime/src/__tests__/pipeline-cache-key-topology.test.ts
|
|
17
|
+
// - packages/runtime/src/__tests__/pipeline-rename-grep-gate.test.ts
|
|
18
|
+
// - packages/runtime/src/__tests__/pipeline-vertex-stride-branch.test.ts
|
|
19
|
+
// - packages/runtime/src/__tests__/post-process-register.test.ts
|
|
20
|
+
// - packages/runtime/src/__tests__/record-all-topology.test.ts
|
|
21
|
+
// - packages/runtime/src/__tests__/record-draw-branch.test.ts
|
|
22
|
+
// - packages/runtime/src/__tests__/record-strip-index-format.test.ts
|
|
23
|
+
// - packages/runtime/src/__tests__/render-query-regression.test.ts
|
|
24
|
+
// - packages/runtime/src/__tests__/renderer-draw-world.test.ts
|
|
25
|
+
// - packages/runtime/src/__tests__/renderer-input-snapshot.test.ts
|
|
26
|
+
// - packages/runtime/src/__tests__/renderer-read-pixels.test.ts
|
|
27
|
+
// - packages/runtime/src/__tests__/renderer-ready.test.ts
|
|
28
|
+
// - packages/runtime/src/__tests__/renderstate-pipeline-cache.test.ts
|
|
29
|
+
// - packages/runtime/src/__tests__/storage-buffer-caps.test.ts
|
|
30
|
+
// - packages/runtime/src/__tests__/device/gpu-residency.test.ts
|
|
31
|
+
// - packages/runtime/src/__tests__/render-data.test.ts
|
|
32
|
+
// - packages/runtime/src/__tests__/hdrp-bgl-slots.test.ts
|
|
33
|
+
// - packages/runtime/src/__tests__/hdrp-caps-gate.test.ts
|
|
34
|
+
// - packages/runtime/src/__tests__/hdrp-grid-invalid.test.ts
|
|
35
|
+
// - packages/runtime/src/__tests__/hdrp-index-list-overflow-once.test.ts
|
|
36
|
+
// - packages/runtime/src/__tests__/hdrp-light-budget.test.ts
|
|
37
|
+
// - packages/runtime/src/__tests__/hdrp-pipeline-asset-config.test.ts
|
|
38
|
+
// - packages/runtime/src/__tests__/m7-hdrp-demo-shape.test.ts
|
|
39
|
+
//
|
|
40
|
+
// Paradigm: each block-scope wraps a source file. ancestorTitles[0] is the
|
|
41
|
+
// source-preserved inner describe (NOT the source filename for these 3 files
|
|
42
|
+
// — recovery path: vitest report ancestorTitles -> grep this file -> upstream
|
|
43
|
+
// `// ─── from <name>.test.ts ───` block separator -> source filename).
|
|
44
|
+
// Top-level imports merged + deduped.
|
|
45
|
+
|
|
46
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
47
|
+
import { dirname, resolve } from 'node:path';
|
|
48
|
+
import { fileURLToPath } from 'node:url';
|
|
49
|
+
import { HANDLE_CUBE, HANDLE_TRIANGLE, resolveAssetHandle } from '@forgeax/engine-assets-runtime';
|
|
50
|
+
import type { World as WorldType } from '@forgeax/engine-ecs';
|
|
51
|
+
import { defineComponent, World } from '@forgeax/engine-ecs';
|
|
52
|
+
import {
|
|
53
|
+
buildMeshAttributeMapForUvSets,
|
|
54
|
+
createBoxGeometry,
|
|
55
|
+
createConeGeometry,
|
|
56
|
+
createCylinderGeometry,
|
|
57
|
+
createPlaneGeometry,
|
|
58
|
+
createSphereGeometry,
|
|
59
|
+
createTorusGeometry,
|
|
60
|
+
PROCEDURAL_FLOATS_PER_VERTEX,
|
|
61
|
+
} from '@forgeax/engine-geometry';
|
|
62
|
+
import { type Mat4, mat4, type Vec3, vec3 } from '@forgeax/engine-math';
|
|
63
|
+
import type { Renderer as RendererType } from '@forgeax/engine-render';
|
|
64
|
+
import { Camera, MeshFilter, MeshRenderer } from '@forgeax/engine-render';
|
|
65
|
+
import {
|
|
66
|
+
err,
|
|
67
|
+
ok,
|
|
68
|
+
type PipelineLayout,
|
|
69
|
+
type RenderPipeline,
|
|
70
|
+
type Result,
|
|
71
|
+
type RhiCaps,
|
|
72
|
+
type RhiDevice,
|
|
73
|
+
RhiError,
|
|
74
|
+
ok as rhiOk,
|
|
75
|
+
type ShaderModule,
|
|
76
|
+
} from '@forgeax/engine-rhi';
|
|
77
|
+
import {
|
|
78
|
+
acquireCanvasContext as acquireNullCanvasContext,
|
|
79
|
+
createShaderModule as createNullShaderModule,
|
|
80
|
+
RhiNullAdapter,
|
|
81
|
+
} from '@forgeax/engine-rhi-null';
|
|
82
|
+
import { ChildOf, Transform } from '@forgeax/engine-scene';
|
|
83
|
+
import {
|
|
84
|
+
findVariantByKey,
|
|
85
|
+
type MaterialShaderEntry,
|
|
86
|
+
type MaterialShaderManifestEntry,
|
|
87
|
+
type MaterialShaderManifestVariant,
|
|
88
|
+
} from '@forgeax/engine-shader';
|
|
89
|
+
import {
|
|
90
|
+
type AssetError,
|
|
91
|
+
type EquirectAsset,
|
|
92
|
+
type Handle,
|
|
93
|
+
type MaterialRenderState,
|
|
94
|
+
type MeshAsset,
|
|
95
|
+
type PassSelector,
|
|
96
|
+
type PrimitiveTopology,
|
|
97
|
+
type RenderPipelineAsset,
|
|
98
|
+
type TextureAsset,
|
|
99
|
+
toShared,
|
|
100
|
+
} from '@forgeax/engine-types';
|
|
101
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
102
|
+
import {
|
|
103
|
+
bin,
|
|
104
|
+
type ClusterBinError,
|
|
105
|
+
calculateSphereClusterBounds,
|
|
106
|
+
clusterSpaceObjectAabb,
|
|
107
|
+
deriveCullingRadius,
|
|
108
|
+
ndcPositionToCluster,
|
|
109
|
+
viewZToZSlice,
|
|
110
|
+
} from '../../../render/src/cluster-binner';
|
|
111
|
+
import { GpuResidencyCache } from '../../../render/src/device/gpu-residency';
|
|
112
|
+
import { createEngineMetrics } from '../../../render/src/engine-metrics';
|
|
113
|
+
import { assertStorageBufferCap } from '../../../render/src/light-buffer-layout';
|
|
114
|
+
import {
|
|
115
|
+
buildPbrPipelineLayouts,
|
|
116
|
+
buildPbrViewBglEntries,
|
|
117
|
+
type PbrCaps,
|
|
118
|
+
} from '../../../render/src/pbr-pipeline';
|
|
119
|
+
import {
|
|
120
|
+
HdrpInstallError,
|
|
121
|
+
validateClusterGrid,
|
|
122
|
+
} from '../../../render/src/pipeline/standard-pipeline';
|
|
123
|
+
import {
|
|
124
|
+
buildPipelineForMaterialShader,
|
|
125
|
+
type PipelineBuilderContext,
|
|
126
|
+
type PipelineBuilderShaderModuleFactory,
|
|
127
|
+
} from '../../../render/src/pipeline-builder';
|
|
128
|
+
import {
|
|
129
|
+
cacheKeyOf,
|
|
130
|
+
createHdrpBindGroupLayoutDescriptor,
|
|
131
|
+
type PipelineSpec,
|
|
132
|
+
} from '../../../render/src/pipeline-spec';
|
|
133
|
+
import {
|
|
134
|
+
deriveRenderDataCubemap,
|
|
135
|
+
deriveRenderDataMesh,
|
|
136
|
+
deriveRenderDataTexture,
|
|
137
|
+
} from '../../../render/src/render-data';
|
|
138
|
+
import { extractFrame, prepareExtractContext } from '../../../render/src/render-system-extract';
|
|
139
|
+
import { matchPass } from '../../../render/src/systems/pass-selector';
|
|
140
|
+
import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
|
|
141
|
+
import { standardMaterialShaderVariants } from './helpers/standard-material-manifest';
|
|
142
|
+
|
|
143
|
+
function makeExplicitNullRhi(spies: {
|
|
144
|
+
setIndexBuffer: ReturnType<typeof vi.fn>;
|
|
145
|
+
setVertexBuffer: ReturnType<typeof vi.fn>;
|
|
146
|
+
draw: ReturnType<typeof vi.fn>;
|
|
147
|
+
drawIndexed: ReturnType<typeof vi.fn>;
|
|
148
|
+
}): unknown {
|
|
149
|
+
const adapter = new RhiNullAdapter();
|
|
150
|
+
const requestDevice = adapter.requestDevice.bind(adapter);
|
|
151
|
+
adapter.requestDevice = async () => {
|
|
152
|
+
const result = await requestDevice();
|
|
153
|
+
if (result.ok) {
|
|
154
|
+
const device = result.value;
|
|
155
|
+
const createCommandEncoder = device.createCommandEncoder.bind(device);
|
|
156
|
+
device.createCommandEncoder = (desc) => {
|
|
157
|
+
const encoderResult = createCommandEncoder(desc);
|
|
158
|
+
if (!encoderResult.ok) return encoderResult;
|
|
159
|
+
const encoder = encoderResult.value;
|
|
160
|
+
const beginRenderPass = encoder.beginRenderPass.bind(encoder);
|
|
161
|
+
encoder.beginRenderPass = (passDesc) => {
|
|
162
|
+
const pass = beginRenderPass(passDesc);
|
|
163
|
+
const draw = pass.draw.bind(pass);
|
|
164
|
+
const drawIndexed = pass.drawIndexed.bind(pass);
|
|
165
|
+
const setIndexBuffer = pass.setIndexBuffer.bind(pass);
|
|
166
|
+
const setVertexBuffer = pass.setVertexBuffer.bind(pass);
|
|
167
|
+
pass.draw = (...args) => {
|
|
168
|
+
spies.draw(...args);
|
|
169
|
+
draw(...args);
|
|
170
|
+
};
|
|
171
|
+
pass.drawIndexed = (...args) => {
|
|
172
|
+
spies.drawIndexed(...args);
|
|
173
|
+
drawIndexed(...args);
|
|
174
|
+
};
|
|
175
|
+
pass.setIndexBuffer = (...args) => {
|
|
176
|
+
spies.setIndexBuffer(...args);
|
|
177
|
+
setIndexBuffer(...args);
|
|
178
|
+
};
|
|
179
|
+
pass.setVertexBuffer = (...args) => {
|
|
180
|
+
spies.setVertexBuffer(...args);
|
|
181
|
+
setVertexBuffer(...args);
|
|
182
|
+
};
|
|
183
|
+
return pass;
|
|
184
|
+
};
|
|
185
|
+
return { ok: true, value: encoder };
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
};
|
|
190
|
+
return {
|
|
191
|
+
requestAdapter: async () => ({ ok: true, value: adapter }),
|
|
192
|
+
acquireCanvasContext: acquireNullCanvasContext,
|
|
193
|
+
createShaderModule: (device: unknown, desc: { code: string; label?: string }) =>
|
|
194
|
+
createNullShaderModule(device as never, desc),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
vi.mock('@forgeax/engine-rhi-wgpu', () => {
|
|
199
|
+
return {
|
|
200
|
+
rhi: {
|
|
201
|
+
requestAdapter: async () => ({
|
|
202
|
+
ok: false,
|
|
203
|
+
error: {
|
|
204
|
+
code: 'adapter-unavailable',
|
|
205
|
+
expected: 'adapter available',
|
|
206
|
+
hint: 'default mock fail',
|
|
207
|
+
},
|
|
208
|
+
}),
|
|
209
|
+
getPreferredCanvasFormat: () => 'bgra8unorm',
|
|
210
|
+
acquireCanvasContext: () => ({
|
|
211
|
+
ok: false,
|
|
212
|
+
error: {
|
|
213
|
+
code: 'webgpu-runtime-error',
|
|
214
|
+
expected: 'context available',
|
|
215
|
+
hint: 'default mock fail',
|
|
216
|
+
},
|
|
217
|
+
}),
|
|
218
|
+
},
|
|
219
|
+
ensureReady: async () => undefined,
|
|
220
|
+
};
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
void [
|
|
224
|
+
Camera,
|
|
225
|
+
ChildOf,
|
|
226
|
+
GpuResidencyCache,
|
|
227
|
+
HANDLE_CUBE,
|
|
228
|
+
HANDLE_TRIANGLE,
|
|
229
|
+
HdrpInstallError,
|
|
230
|
+
MeshFilter,
|
|
231
|
+
MeshRenderer,
|
|
232
|
+
PROCEDURAL_FLOATS_PER_VERTEX,
|
|
233
|
+
RhiError,
|
|
234
|
+
RhiNullAdapter,
|
|
235
|
+
Transform,
|
|
236
|
+
World,
|
|
237
|
+
acquireNullCanvasContext,
|
|
238
|
+
afterEach,
|
|
239
|
+
assertStorageBufferCap,
|
|
240
|
+
beforeEach,
|
|
241
|
+
bin,
|
|
242
|
+
buildMeshAttributeMapForUvSets,
|
|
243
|
+
buildPbrPipelineLayouts,
|
|
244
|
+
buildPbrViewBglEntries,
|
|
245
|
+
buildPipelineForMaterialShader,
|
|
246
|
+
cacheKeyOf,
|
|
247
|
+
calculateSphereClusterBounds,
|
|
248
|
+
clusterSpaceObjectAabb,
|
|
249
|
+
createBoxGeometry,
|
|
250
|
+
createConeGeometry,
|
|
251
|
+
createCylinderGeometry,
|
|
252
|
+
createEngineMetrics,
|
|
253
|
+
createHdrpBindGroupLayoutDescriptor,
|
|
254
|
+
createNullShaderModule,
|
|
255
|
+
createPlaneGeometry,
|
|
256
|
+
createSphereGeometry,
|
|
257
|
+
createTorusGeometry,
|
|
258
|
+
defineComponent,
|
|
259
|
+
deriveCullingRadius,
|
|
260
|
+
deriveRenderDataCubemap,
|
|
261
|
+
deriveRenderDataMesh,
|
|
262
|
+
deriveRenderDataTexture,
|
|
263
|
+
describe,
|
|
264
|
+
dirname,
|
|
265
|
+
err,
|
|
266
|
+
existsSync,
|
|
267
|
+
expect,
|
|
268
|
+
extractFrame,
|
|
269
|
+
fileURLToPath,
|
|
270
|
+
findVariantByKey,
|
|
271
|
+
it,
|
|
272
|
+
makeExplicitNullRhi,
|
|
273
|
+
makeMockShaderRegistry,
|
|
274
|
+
mat4,
|
|
275
|
+
matchPass,
|
|
276
|
+
ndcPositionToCluster,
|
|
277
|
+
ok,
|
|
278
|
+
prepareExtractContext,
|
|
279
|
+
readFileSync,
|
|
280
|
+
resolve,
|
|
281
|
+
resolveAssetHandle,
|
|
282
|
+
rhiOk,
|
|
283
|
+
standardMaterialShaderVariants,
|
|
284
|
+
toShared,
|
|
285
|
+
validateClusterGrid,
|
|
286
|
+
vec3,
|
|
287
|
+
vi,
|
|
288
|
+
viewZToZSlice,
|
|
289
|
+
];
|
|
290
|
+
type __MergedKeep =
|
|
291
|
+
| AssetError
|
|
292
|
+
| ClusterBinError
|
|
293
|
+
| EquirectAsset
|
|
294
|
+
| Handle
|
|
295
|
+
| Mat4
|
|
296
|
+
| MaterialRenderState
|
|
297
|
+
| MaterialShaderEntry
|
|
298
|
+
| MaterialShaderManifestEntry
|
|
299
|
+
| MaterialShaderManifestVariant
|
|
300
|
+
| MeshAsset
|
|
301
|
+
| PassSelector
|
|
302
|
+
| PbrCaps
|
|
303
|
+
| PipelineBuilderContext
|
|
304
|
+
| PipelineBuilderShaderModuleFactory
|
|
305
|
+
| PipelineLayout
|
|
306
|
+
| PipelineSpec
|
|
307
|
+
| PrimitiveTopology
|
|
308
|
+
| RenderPipeline
|
|
309
|
+
| RenderPipelineAsset
|
|
310
|
+
| RendererType
|
|
311
|
+
| Result
|
|
312
|
+
| RhiCaps
|
|
313
|
+
| RhiDevice
|
|
314
|
+
| ShaderModule
|
|
315
|
+
| TextureAsset
|
|
316
|
+
| Vec3
|
|
317
|
+
| WorldType;
|
|
318
|
+
|
|
319
|
+
{
|
|
320
|
+
// --- from create-renderer-fallback-shader-manifest.test.ts ---
|
|
321
|
+
const CREATE_RENDERER_SRC = fileURLToPath(
|
|
322
|
+
new URL('../../../render/src/assembly/webgpu-renderer.ts', import.meta.url),
|
|
323
|
+
);
|
|
324
|
+
|
|
325
|
+
describe('createRenderer fallback shaderManifestUrl literal (AC-08, D-2 q5-A)', () => {
|
|
326
|
+
it("preserves the '/shaders/manifest.json' default in createRenderer.ts", () => {
|
|
327
|
+
const source = readFileSync(CREATE_RENDERER_SRC, 'utf8');
|
|
328
|
+
// The literal fallback expression is the SSOT: when bundler.shaderManifestUrl
|
|
329
|
+
// is absent and the explicit options.shaderManifestUrl key is not present,
|
|
330
|
+
// the fallback resolves to '/shaders/manifest.json'. Locking the literal
|
|
331
|
+
// here means a future drift (e.g. someone moves it into a constant or
|
|
332
|
+
// changes the path) shows up as a clear test failure pointing at this AC.
|
|
333
|
+
expect(source).toContain("'/shaders/manifest.json'");
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
it('references the fallback through the bundler third arg, not RendererOptions', () => {
|
|
337
|
+
const source = readFileSync(CREATE_RENDERER_SRC, 'utf8');
|
|
338
|
+
// After M2, the explicit slot is read from the third-arg BundlerOptions.
|
|
339
|
+
// The grep below pins the contract: BundlerOptions carries the field, and
|
|
340
|
+
// the createRenderer body looks up `bundler.shaderManifestUrl` (or the
|
|
341
|
+
// legacy explicit slot via `'shaderManifestUrl' in bundler`).
|
|
342
|
+
expect(source).toMatch(/bundler\??\.shaderManifestUrl/);
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
}
|