@forgeax/engine-runtime 0.1.2
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 +183 -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-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-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-registry-scene.test-d.d.ts +2 -0
- package/dist/__tests__/asset-registry-scene.test-d.d.ts.map +1 -0
- package/dist/__tests__/bind-group-cache-binding.test.d.ts +2 -0
- package/dist/__tests__/bind-group-cache-binding.test.d.ts.map +1 -0
- package/dist/__tests__/bind-group-cache-frame.test.d.ts +2 -0
- package/dist/__tests__/bind-group-cache-frame.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-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 +3 -0
- package/dist/__tests__/collect-scene-asset.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 +3 -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__/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/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__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts +2 -0
- package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts +2 -0
- package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts +2 -0
- package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts +2 -0
- package/dist/__tests__/dispatch-fullscreen-pass-params.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__/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__/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__/fog-producer-manifest.d.ts +131 -0
- package/dist/__tests__/fog-producer-manifest.d.ts.map +1 -0
- package/dist/__tests__/fog-producer-pixel-probe.d.ts +42 -0
- package/dist/__tests__/fog-producer-pixel-probe.d.ts.map +1 -0
- package/dist/__tests__/fog-producer-pixel.browser.test.d.ts +2 -0
- package/dist/__tests__/fog-producer-pixel.browser.test.d.ts.map +1 -0
- package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts +2 -0
- package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/fog-producer-real-fixture.d.ts +5 -0
- package/dist/__tests__/fog-producer-real-fixture.d.ts.map +1 -0
- package/dist/__tests__/fog-producer-vfx-effect.d.ts +3 -0
- package/dist/__tests__/fog-producer-vfx-effect.d.ts.map +1 -0
- package/dist/__tests__/fog-scene-asset.integration.test.d.ts +2 -0
- package/dist/__tests__/fog-scene-asset.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-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__/gpu-resource-store-cubemap-status.test.d.ts +2 -0
- package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-resource.test.d.ts +2 -0
- package/dist/__tests__/gpu-resource.test.d.ts.map +1 -0
- package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts +2 -0
- package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts.map +1 -0
- package/dist/__tests__/hdrp-buffers.unit.test.d.ts +2 -0
- package/dist/__tests__/hdrp-buffers.unit.test.d.ts.map +1 -0
- package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts +2 -0
- package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts.map +1 -0
- package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts +2 -0
- package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts.map +1 -0
- package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts +2 -0
- package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts.map +1 -0
- package/dist/__tests__/hdrp-ssao-boundary.test.d.ts +2 -0
- package/dist/__tests__/hdrp-ssao-boundary.test.d.ts.map +1 -0
- package/dist/__tests__/hdrp-ssao-falsification.test.d.ts +2 -0
- package/dist/__tests__/hdrp-ssao-falsification.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/primitive-world.d.ts +8 -0
- package/dist/__tests__/helpers/primitive-world.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/render-asset-port.d.ts +15 -0
- package/dist/__tests__/helpers/render-asset-port.d.ts.map +1 -0
- package/dist/__tests__/helpers/scene-asset-port.d.ts +9 -0
- package/dist/__tests__/helpers/scene-asset-port.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__/instances.test-d.d.ts +2 -0
- package/dist/__tests__/instances.test-d.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__/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-derived-coordinates.integration.test.d.ts +2 -0
- package/dist/__tests__/material-derived-coordinates.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-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__/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-layout-selection.test.d.ts +2 -0
- package/dist/__tests__/pipeline-layout-selection.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__/post-process-reads-narrowing.test-d.d.ts +2 -0
- package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts.map +1 -0
- package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts +2 -0
- package/dist/__tests__/post-process-register-roundtrip.dawn.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.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-feature-zero-feature.browser.test.d.ts +2 -0
- package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts.map +1 -0
- package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-pipeline-trivial.dawn.test.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-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__/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__/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__/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-equirect-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/scene-equirect-roundtrip.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__/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-caster-membership.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-caster-membership.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-pssm.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-pssm.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-temporal.browser.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-temporal.browser.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-csm-viewport.test.d.ts +2 -0
- package/dist/__tests__/shadow-csm-viewport.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-m2.dawn.test.d.ts +2 -0
- package/dist/__tests__/shadow-m2.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts +2 -0
- package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-m3-calibrate.d.ts +83 -0
- package/dist/__tests__/shadow-m3-calibrate.d.ts.map +1 -0
- package/dist/__tests__/shadow-m3.dawn.test.d.ts +2 -0
- package/dist/__tests__/shadow-m3.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__/shadow-probe-control-flow.dawn.test.d.ts +2 -0
- package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts +2 -0
- package/dist/__tests__/shadow-quality-metrics.dawn.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__/temporal-off-path.unit.test.d.ts +2 -0
- package/dist/__tests__/temporal-off-path.unit.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__/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__/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-cache-regression.unit.test.d.ts +2 -0
- package/dist/__tests__/video-cache-regression.unit.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__/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/asset-kind.d.ts +4 -0
- package/dist/asset-kind.d.ts.map +1 -0
- package/dist/collect-scene-asset.d.ts +16 -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 +3 -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/errors/sprite-animation.d.ts +3 -0
- package/dist/errors/sprite-animation.d.ts.map +1 -0
- package/dist/index.d.ts +280 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +814 -0
- package/dist/index.mjs.map +1 -0
- package/dist/scene-asset-port.d.ts +17 -0
- package/dist/scene-asset-port.d.ts.map +1 -0
- package/dist/scene-collect-errors.d.ts +22 -0
- package/dist/scene-collect-errors.d.ts.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-utils/mount-override-fold.d.ts +16 -0
- package/dist/scene-utils/mount-override-fold.d.ts.map +1 -0
- package/dist/shadow-m3-calibrate.d.ts +40 -0
- package/dist/shadow-m3-calibrate.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 +51 -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 +100 -0
- package/src/__tests__/active-camera.unit.test.ts +193 -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-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-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-registry-scene.test-d.ts +49 -0
- package/src/__tests__/bind-group-cache-binding.test.ts +2513 -0
- package/src/__tests__/bind-group-cache-frame.test.ts +1511 -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-shader-register-e2e.test.ts +151 -0
- package/src/__tests__/cache-false-eviction.test.ts +126 -0
- package/src/__tests__/cache-isolation-matrix.test.ts +182 -0
- package/src/__tests__/camera-clear-snapshot-equivalence.unit.test.ts +76 -0
- package/src/__tests__/clamp-to-last.e2e.browser.test.ts +183 -0
- package/src/__tests__/clamp-to-last.e2e.dawn.test.ts +325 -0
- package/src/__tests__/collect-scene-asset.test.ts +876 -0
- package/src/__tests__/collect-subtree.unit.test.ts +76 -0
- package/src/__tests__/collect-transient-children-absent.test.ts +154 -0
- package/src/__tests__/collect-transient-roundtrip.test.ts +245 -0
- package/src/__tests__/collect-transient-skip.test.ts +165 -0
- package/src/__tests__/components.test-d.ts +236 -0
- package/src/__tests__/components.unit.test.ts +2665 -0
- package/src/__tests__/composite-skybox-cross-world.browser.test.ts +378 -0
- package/src/__tests__/create-renderer-assembly.integration.test.ts +42 -0
- package/src/__tests__/createRenderer-dispose.test.ts +416 -0
- package/src/__tests__/createRenderer-requiredFeatures.unit.test.ts +134 -0
- package/src/__tests__/createRenderer.browser-no-webgpu.test.ts +59 -0
- package/src/__tests__/createRenderer.unit.test.ts +231 -0
- package/src/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.ts +393 -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 +241 -0
- package/src/__tests__/dawn/instances-per-instance-pbr.dawn.test.ts +611 -0
- package/src/__tests__/dawn/instances-shadow.dawn.test.ts +443 -0
- package/src/__tests__/dawn/instances-uniform-fallback.dawn.test.ts +313 -0
- package/src/__tests__/dawn/material-alpha.dawn.test.ts +304 -0
- package/src/__tests__/dawn/material-cooked-fixture.dawn.test.ts +64 -0
- package/src/__tests__/dawn/mesh-ssbo-normal-matrix.dawn.test.ts +106 -0
- package/src/__tests__/dawn/mesh-update.dawn.test.ts +342 -0
- package/src/__tests__/dawn/mipmap-srgb-linear.dawn.test.ts +117 -0
- package/src/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.ts +567 -0
- package/src/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.ts +251 -0
- package/src/__tests__/dawn/tonemap.dawn.test.ts +107 -0
- package/src/__tests__/dawn/user-handle-mesh-render.dawn.test.ts +291 -0
- package/src/__tests__/dawn/user-mesh-upload.dawn.test.ts +204 -0
- package/src/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.ts +122 -0
- package/src/__tests__/dawn/zero-manifest-ready.dawn.test.ts +99 -0
- package/src/__tests__/demo-sortscope-migration.unit.test.ts +115 -0
- package/src/__tests__/derive-bgl-integration.test.ts +398 -0
- package/src/__tests__/derive-render-data-skin.unit.test.ts +90 -0
- package/src/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.ts +204 -0
- package/src/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.ts +297 -0
- package/src/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.ts +271 -0
- package/src/__tests__/dispatch-fullscreen-pass-params.unit.test.ts +321 -0
- package/src/__tests__/draw-published.ts +10 -0
- package/src/__tests__/environment-error-exhaustive.test-d.ts +28 -0
- package/src/__tests__/equirect-bc6h.integration.test.ts +35 -0
- package/src/__tests__/error-exhaustive.test.ts +220 -0
- package/src/__tests__/extract-frames-graceful-degradation.test.ts +298 -0
- package/src/__tests__/extract-frames-merge.test.ts +643 -0
- package/src/__tests__/extract-frames-reset.test.ts +158 -0
- package/src/__tests__/extract-record-no-hardcoded-texture-fields.test.ts +92 -0
- package/src/__tests__/fog-producer-manifest.ts +162 -0
- package/src/__tests__/fog-producer-pixel-probe.ts +263 -0
- package/src/__tests__/fog-producer-pixel.browser.test.ts +26 -0
- package/src/__tests__/fog-producer-pixel.dawn.test.ts +55 -0
- package/src/__tests__/fog-producer-real-fixture.ts +805 -0
- package/src/__tests__/fog-producer-vfx-effect.ts +272 -0
- package/src/__tests__/fog-scene-asset.integration.test.ts +123 -0
- package/src/__tests__/frame-targets-shadow-regression.unit.test.ts +28 -0
- package/src/__tests__/fullscreen-post-bgl-depth.test.ts +131 -0
- package/src/__tests__/fullscreen-post-depth-params-arity.test.ts +84 -0
- package/src/__tests__/fullscreen-post-process-pass.dawn.test.ts +320 -0
- package/src/__tests__/fullscreen-post-process-pass.unit.test.ts +107 -0
- package/src/__tests__/fxaa-pixel-diff.dawn.test.ts +292 -0
- package/src/__tests__/fxaa-validation-and-resize.dawn.test.ts +358 -0
- package/src/__tests__/fxaa-zero-overhead.dawn.test.ts +254 -0
- package/src/__tests__/geometry.unit.test.ts +2265 -0
- package/src/__tests__/glyph-tilemap-worldid.test.ts +146 -0
- package/src/__tests__/gpu-resource-cow-survivor.test.ts +388 -0
- package/src/__tests__/gpu-resource-store-cubemap-status.test.ts +207 -0
- package/src/__tests__/gpu-resource.test.ts +1206 -0
- package/src/__tests__/hdrp-bgl-slots.browser.test.ts +50 -0
- package/src/__tests__/hdrp-buffers.unit.test.ts +70 -0
- package/src/__tests__/hdrp-execute-filter.unit.test.ts +200 -0
- package/src/__tests__/hdrp-gbuffer-attachments.browser.test.ts +64 -0
- package/src/__tests__/hdrp-pipeline-asset-type.test-d.ts +139 -0
- package/src/__tests__/hdrp-ssao-boundary.test.ts +237 -0
- package/src/__tests__/hdrp-ssao-falsification.test.ts +289 -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/primitive-world.ts +91 -0
- package/src/__tests__/helpers/register-runtime-components.ts +69 -0
- package/src/__tests__/helpers/register-scene-components.ts +10 -0
- package/src/__tests__/helpers/render-asset-port.ts +65 -0
- package/src/__tests__/helpers/scene-asset-port.ts +23 -0
- package/src/__tests__/helpers/tilemap-assets.ts +29 -0
- package/src/__tests__/instances.test-d.ts +61 -0
- package/src/__tests__/light-attenuation-formula.test.ts +171 -0
- package/src/__tests__/light-casters-9-light.browser.test.ts +880 -0
- package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +163 -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 +2936 -0
- package/src/__tests__/m3-vec-negative.unit.test.ts +45 -0
- package/src/__tests__/m5-browser-dawn-sweep.integration.test.ts +8 -0
- package/src/__tests__/material-derived-coordinates.integration.test.ts +100 -0
- package/src/__tests__/material-texture-uv-scale.unit.test.ts +49 -0
- package/src/__tests__/materials.unit.test.ts +271 -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 +406 -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__/node-shims.d.ts +33 -0
- package/src/__tests__/pass-selector.unit.test.ts +102 -0
- package/src/__tests__/pbr-pipeline.unit.test.ts +204 -0
- package/src/__tests__/pipeline-builder-msaa.unit.test.ts +224 -0
- package/src/__tests__/pipeline-cache-keying.unit.test.ts +316 -0
- package/src/__tests__/pipeline-layout-selection.test.ts +298 -0
- package/src/__tests__/pipeline-spec.test.ts +1061 -0
- package/src/__tests__/pipeline.unit.test.ts +6974 -0
- package/src/__tests__/point-light-shadow.browser.test.ts +278 -0
- package/src/__tests__/point-light-shadow.dawn.test.ts +822 -0
- package/src/__tests__/point-light-shadow.unit.test.ts +716 -0
- package/src/__tests__/post-process-error-codes.unit.test.ts +158 -0
- package/src/__tests__/post-process-params-component.unit.test.ts +153 -0
- package/src/__tests__/post-process-params-extract.unit.test.ts +100 -0
- package/src/__tests__/post-process-reads-narrowing.test-d.ts +52 -0
- package/src/__tests__/post-process-register-roundtrip.dawn.test.ts +230 -0
- package/src/__tests__/postprocess-camera-consistency.test.ts +378 -0
- package/src/__tests__/profiler-assembly.integration.test.ts +74 -0
- package/src/__tests__/propagate-transforms.dawn.test.ts +253 -0
- package/src/__tests__/record-worldid-isolation.test.ts +247 -0
- package/src/__tests__/recover-error-exhaustive.test-d.ts +35 -0
- package/src/__tests__/render-error-exhaustive.test-d.ts +245 -0
- package/src/__tests__/render-feature-assembly.test-d.ts +28 -0
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +124 -0
- package/src/__tests__/render-feature-prepared-graphics.browser.test.ts +582 -0
- package/src/__tests__/render-feature-prepared-graphics.dawn.test.ts +602 -0
- package/src/__tests__/render-feature-prepared-graphics.integration.test.ts +264 -0
- package/src/__tests__/render-feature-prepared-graphics.regression.integration.test.ts +361 -0
- package/src/__tests__/render-feature-recover.integration.test.ts +142 -0
- package/src/__tests__/render-feature-runtime-surface.test-d.ts +45 -0
- package/src/__tests__/render-feature-zero-feature.browser.test.ts +152 -0
- package/src/__tests__/render-pipeline-trivial.dawn.test.ts +525 -0
- package/src/__tests__/render-schema-consumer.integration.test.ts +25 -0
- package/src/__tests__/render-schema-owner-boundary.unit.test.ts +26 -0
- package/src/__tests__/render-system-cross-world-overlay-queue.test.ts +172 -0
- package/src/__tests__/render-system-extract-dispatch-ordering.test.ts +322 -0
- package/src/__tests__/render-system-extract.test.ts +1399 -0
- package/src/__tests__/render-system-fold-bucket.unit.test.ts +288 -0
- package/src/__tests__/render-system-fold-fallback.unit.test.ts +148 -0
- package/src/__tests__/render-system-fold-material.unit.test.ts +145 -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 +306 -0
- package/src/__tests__/render-system-mega.test.ts +1578 -0
- package/src/__tests__/render-system-owner-split-contract.test.ts +200 -0
- package/src/__tests__/render-system-record-multi-material-textureview.test.ts +684 -0
- package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +464 -0
- package/src/__tests__/render-system-record.test.ts +1505 -0
- package/src/__tests__/render-system-record.unit.test.ts +270 -0
- package/src/__tests__/render-system-skin-bg.unit.test.ts +147 -0
- package/src/__tests__/renderer-consumer.test-d.ts +5 -0
- package/src/__tests__/renderer-health.unit.test.ts +935 -0
- package/src/__tests__/renderer-lifecycle.integration.test.ts +29 -0
- package/src/__tests__/renderer-recover.unit.test.ts +1075 -0
- package/src/__tests__/renderer-result.test-d.ts +26 -0
- package/src/__tests__/renderer-surface.unit.test.ts +416 -0
- package/src/__tests__/resolve-depth-only-view.test.ts +173 -0
- package/src/__tests__/rhi-null-command-flow.unit.test.ts +273 -0
- package/src/__tests__/rhi-null-noop-behavior.unit.test.ts +196 -0
- package/src/__tests__/rhi-null-renderer-lifecycle.unit.test.ts +182 -0
- package/src/__tests__/roots-to-scene-asset.test.ts +605 -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-equirect-roundtrip.test.ts +33 -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__/serialize-scene-asset.test.ts +336 -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 +334 -0
- package/src/__tests__/shadow-csm-caster-membership.test.ts +232 -0
- package/src/__tests__/shadow-csm-component.test.ts +286 -0
- package/src/__tests__/shadow-csm-extract.test.ts +334 -0
- package/src/__tests__/shadow-csm-orthoz.test.ts +151 -0
- package/src/__tests__/shadow-csm-pssm.test.ts +142 -0
- package/src/__tests__/shadow-csm-runtime-vary.dawn.test.ts +198 -0
- package/src/__tests__/shadow-csm-shader.dawn.test.ts +358 -0
- package/src/__tests__/shadow-csm-temporal.browser.test.ts +145 -0
- package/src/__tests__/shadow-csm-tile-consistency.test.ts +419 -0
- package/src/__tests__/shadow-csm-ubo.dawn.test.ts +293 -0
- package/src/__tests__/shadow-csm-ubo.test.ts +300 -0
- package/src/__tests__/shadow-csm-viewport.browser.test.ts +85 -0
- package/src/__tests__/shadow-csm-viewport.test.ts +74 -0
- package/src/__tests__/shadow-fields-observable.dawn.test.ts +615 -0
- package/src/__tests__/shadow-m1.dawn.test.ts +105 -0
- package/src/__tests__/shadow-m2.dawn.test.ts +394 -0
- package/src/__tests__/shadow-m3-calibrate-run.dawn.test.ts +248 -0
- package/src/__tests__/shadow-m3-calibrate.ts +203 -0
- package/src/__tests__/shadow-m3.dawn.test.ts +288 -0
- package/src/__tests__/shadow-mesh-ssbo-order.test.ts +64 -0
- package/src/__tests__/shadow-probe-control-flow.dawn.test.ts +264 -0
- package/src/__tests__/shadow-quality-metrics.dawn.test.ts +324 -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 +23 -0
- package/src/__tests__/skin-parented-double-transform.test.ts +268 -0
- package/src/__tests__/skylight-lazy-projection.test.ts +359 -0
- package/src/__tests__/sparse-tag-scene-roundtrip.test.ts +43 -0
- package/src/__tests__/sprite-cullmode-flip.dawn.test.ts +470 -0
- package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +141 -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 +347 -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 +1229 -0
- package/src/__tests__/ssao-pipelines.test.ts +275 -0
- package/src/__tests__/ssao-uniform-layout.test.ts +178 -0
- package/src/__tests__/static-rig.integration.test.ts +9 -0
- package/src/__tests__/stencil-outline-pixel.dawn.test.ts +295 -0
- package/src/__tests__/swap-chain-format.unit.test.ts +117 -0
- package/src/__tests__/systems.unit.test.ts +9957 -0
- package/src/__tests__/temporal-off-path.unit.test.ts +69 -0
- package/src/__tests__/text.unit.test.ts +466 -0
- package/src/__tests__/tilemap-childed-despawn.test.ts +468 -0
- package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +314 -0
- package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +80 -0
- package/src/__tests__/tilemap-chunk-extract.terrain-rewrite.unit.test.ts +424 -0
- package/src/__tests__/tilemap-chunk-extract.test.ts +236 -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 +300 -0
- package/src/__tests__/tilemap-material-cache.test.ts +137 -0
- package/src/__tests__/tilemap-multi-atlas.test.ts +237 -0
- package/src/__tests__/tilemap-owner-boundary.unit.test.ts +63 -0
- package/src/__tests__/tilemap-region-pack.test.ts +153 -0
- package/src/__tests__/tilemap-spawn-flip-pivot.test.ts +274 -0
- package/src/__tests__/tilemap-uv-inset.test.ts +204 -0
- package/src/__tests__/tilemap-validate.test.ts +201 -0
- package/src/__tests__/transform-hierarchy-pixel-diff.dawn.test.ts +274 -0
- package/src/__tests__/transient-fields-collect.test.ts +203 -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-cache-regression.unit.test.ts +186 -0
- package/src/__tests__/video-extract-bindgroup.dawn.test.ts +450 -0
- package/src/__tests__/view-ubo-layout.browser.test.ts +183 -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 +228 -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/asset-kind.ts +7 -0
- package/src/collect-scene-asset.ts +689 -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 +61 -0
- package/src/dev-import-transport.ts +97 -0
- package/src/errors/environment.ts +6 -0
- package/src/errors/sprite-animation.ts +5 -0
- package/src/index.ts +442 -0
- package/src/scene-asset-port.ts +32 -0
- package/src/scene-collect-errors.ts +30 -0
- package/src/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.ts +183 -0
- package/src/scene-utils/mount-override-fold.ts +217 -0
- package/src/shadow-m3-calibrate.ts +171 -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,183 @@
|
|
|
1
|
+
// post-spawn-resolve-joints.unit.test.ts — tweak-20260611 M5 / D-7 (subtree-scope).
|
|
2
|
+
//
|
|
3
|
+
// Coverage:
|
|
4
|
+
// - single-instance resolver: existing behavior (joints wire correctly).
|
|
5
|
+
// - multi-instance resolver: three spawns of the same SceneAsset must each
|
|
6
|
+
// wire to their own subtree's joint entities (NOT entity ids of instance 0).
|
|
7
|
+
// - missing joint inside subtree: structured error 'skin-joint-path-unresolved'.
|
|
8
|
+
|
|
9
|
+
import { World } from '@forgeax/engine-ecs';
|
|
10
|
+
import { postSpawnResolveJoints } from '@forgeax/engine-render/internal';
|
|
11
|
+
import { ChildOf, Name } from '@forgeax/engine-scene';
|
|
12
|
+
import { Skin } from '@forgeax/engine-skinning';
|
|
13
|
+
import type { SkinAsset } from '@forgeax/engine-types';
|
|
14
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Build a 3-joint linear chain `Root -> Spine -> Hip` rooted at a fresh entity,
|
|
18
|
+
* with shared Name strings across spawns. Returns the spawnRoot + the three
|
|
19
|
+
* descendant entities for assertion. The Skin component is attached to the
|
|
20
|
+
* spawn root with a synthetic skeleton handle (the resolver's resolveSkinAsset
|
|
21
|
+
* is wired to return a fixed SkinAsset for any handle in this test).
|
|
22
|
+
*/
|
|
23
|
+
function spawnFoxLikeChain(world: World, skeletonHandle: number) {
|
|
24
|
+
const root = world.spawn({ component: Name, data: { value: 'Root' } }).unwrap();
|
|
25
|
+
const spine = world.spawn({ component: Name, data: { value: 'Spine' } }).unwrap();
|
|
26
|
+
const hip = world.spawn({ component: Name, data: { value: 'Hip' } }).unwrap();
|
|
27
|
+
|
|
28
|
+
// ChildOf is the writable edge; ECS materializes its Children target.
|
|
29
|
+
world.addComponent(spine, { component: ChildOf, data: { parent: root } }).unwrap();
|
|
30
|
+
world.addComponent(hip, { component: ChildOf, data: { parent: spine } }).unwrap();
|
|
31
|
+
|
|
32
|
+
// Skin lives on the root; resolver gets `skeleton` field as a number handle.
|
|
33
|
+
world
|
|
34
|
+
.addComponent(root, {
|
|
35
|
+
component: Skin,
|
|
36
|
+
// biome-ignore lint/suspicious/noExplicitAny: test fixture stamps a synthetic skeleton handle for resolver isolation; the resolver is mocked.
|
|
37
|
+
data: { skeleton: skeletonHandle as any, joints: new Uint32Array() },
|
|
38
|
+
})
|
|
39
|
+
.unwrap();
|
|
40
|
+
|
|
41
|
+
return { root, spine, hip };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
describe('postSpawnResolveJoints — single instance', () => {
|
|
45
|
+
it('wires Skin.joints[] to subtree entities for one spawn', () => {
|
|
46
|
+
const world = new World();
|
|
47
|
+
const skinAsset: SkinAsset = {
|
|
48
|
+
kind: 'skin',
|
|
49
|
+
skeletonGuid: '00000000-0000-0000-0000-000000000001',
|
|
50
|
+
jointPaths: ['Root', 'Spine', 'Hip'],
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const { root, spine, hip } = spawnFoxLikeChain(world, 1);
|
|
54
|
+
|
|
55
|
+
const result = postSpawnResolveJoints(world, { resolveSkinAsset: () => skinAsset }, root);
|
|
56
|
+
|
|
57
|
+
expect(result.ok).toBe(true);
|
|
58
|
+
const got = world.get(root, Skin);
|
|
59
|
+
expect(got.ok).toBe(true);
|
|
60
|
+
if (!got.ok) return;
|
|
61
|
+
const joints = Array.from(got.value.joints as ArrayLike<number>);
|
|
62
|
+
expect(joints).toEqual([root, spine, hip]);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe('postSpawnResolveJoints — multi instance (D-7 subtree-scope)', () => {
|
|
67
|
+
it('three spawns each wire to their own subtree entities — not instance-0', () => {
|
|
68
|
+
const world = new World();
|
|
69
|
+
const skinAsset: SkinAsset = {
|
|
70
|
+
kind: 'skin',
|
|
71
|
+
skeletonGuid: '00000000-0000-0000-0000-000000000001',
|
|
72
|
+
jointPaths: ['Root', 'Spine', 'Hip'],
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// Three independent spawns — same Name strings collide across instances.
|
|
76
|
+
const a = spawnFoxLikeChain(world, 1);
|
|
77
|
+
const b = spawnFoxLikeChain(world, 1);
|
|
78
|
+
const c = spawnFoxLikeChain(world, 1);
|
|
79
|
+
|
|
80
|
+
// Resolve each spawn independently.
|
|
81
|
+
expect(postSpawnResolveJoints(world, { resolveSkinAsset: () => skinAsset }, a.root).ok).toBe(
|
|
82
|
+
true,
|
|
83
|
+
);
|
|
84
|
+
expect(postSpawnResolveJoints(world, { resolveSkinAsset: () => skinAsset }, b.root).ok).toBe(
|
|
85
|
+
true,
|
|
86
|
+
);
|
|
87
|
+
expect(postSpawnResolveJoints(world, { resolveSkinAsset: () => skinAsset }, c.root).ok).toBe(
|
|
88
|
+
true,
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const ja = Array.from(
|
|
92
|
+
(world.get(a.root, Skin) as { ok: true; value: { joints: ArrayLike<number> } }).value.joints,
|
|
93
|
+
);
|
|
94
|
+
const jb = Array.from(
|
|
95
|
+
(world.get(b.root, Skin) as { ok: true; value: { joints: ArrayLike<number> } }).value.joints,
|
|
96
|
+
);
|
|
97
|
+
const jc = Array.from(
|
|
98
|
+
(world.get(c.root, Skin) as { ok: true; value: { joints: ArrayLike<number> } }).value.joints,
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
// AC-09: the three spawns' joint entity arrays must be pairwise distinct.
|
|
102
|
+
expect(ja).toEqual([a.root, a.spine, a.hip]);
|
|
103
|
+
expect(jb).toEqual([b.root, b.spine, b.hip]);
|
|
104
|
+
expect(jc).toEqual([c.root, c.spine, c.hip]);
|
|
105
|
+
expect(ja).not.toEqual(jb);
|
|
106
|
+
expect(jb).not.toEqual(jc);
|
|
107
|
+
expect(ja).not.toEqual(jc);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('does not wire across spawn roots — instance 1 is untouched after instance 0 resolves', () => {
|
|
111
|
+
const world = new World();
|
|
112
|
+
const skinAsset: SkinAsset = {
|
|
113
|
+
kind: 'skin',
|
|
114
|
+
skeletonGuid: '00000000-0000-0000-0000-000000000001',
|
|
115
|
+
jointPaths: ['Root', 'Spine', 'Hip'],
|
|
116
|
+
};
|
|
117
|
+
const a = spawnFoxLikeChain(world, 1);
|
|
118
|
+
const b = spawnFoxLikeChain(world, 1);
|
|
119
|
+
|
|
120
|
+
// Resolve only a; b should remain joints=[] (resolver was not invoked for b).
|
|
121
|
+
postSpawnResolveJoints(world, { resolveSkinAsset: () => skinAsset }, a.root);
|
|
122
|
+
|
|
123
|
+
const jb = Array.from(
|
|
124
|
+
(world.get(b.root, Skin) as { ok: true; value: { joints: ArrayLike<number> } }).value.joints,
|
|
125
|
+
);
|
|
126
|
+
expect(jb).toEqual([]);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
describe('postSpawnResolveJoints — error path', () => {
|
|
131
|
+
it('returns skin-joint-path-unresolved when leaf name not present in subtree', () => {
|
|
132
|
+
const world = new World();
|
|
133
|
+
const skinAsset: SkinAsset = {
|
|
134
|
+
kind: 'skin',
|
|
135
|
+
skeletonGuid: '00000000-0000-0000-0000-000000000001',
|
|
136
|
+
// Each entry is a slash-separated path; leaf name is the last segment
|
|
137
|
+
// and the resolver matches on it. 'NoSuchBone' does not exist in the
|
|
138
|
+
// subtree we built, so the resolver fails on this path.
|
|
139
|
+
jointPaths: ['Root/Spine/NoSuchBone'],
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const { root } = spawnFoxLikeChain(world, 1);
|
|
143
|
+
|
|
144
|
+
const result = postSpawnResolveJoints(world, { resolveSkinAsset: () => skinAsset }, root);
|
|
145
|
+
|
|
146
|
+
expect(result.ok).toBe(false);
|
|
147
|
+
if (result.ok) return;
|
|
148
|
+
expect(result.error.code).toBe('skin-joint-path-unresolved');
|
|
149
|
+
if (result.error.code !== 'skin-joint-path-unresolved') return;
|
|
150
|
+
expect(result.error.detail.path).toEqual(['Root', 'Spine', 'NoSuchBone']);
|
|
151
|
+
expect(result.error.detail.failedAtIndex).toBe(2);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('warns on same-name sibling within a single subtree (D-6a still active)', () => {
|
|
155
|
+
const world = new World();
|
|
156
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => undefined);
|
|
157
|
+
|
|
158
|
+
// Two siblings both named 'Bone' under one root.
|
|
159
|
+
const root = world.spawn({ component: Name, data: { value: 'Root' } }).unwrap();
|
|
160
|
+
const bone1 = world.spawn({ component: Name, data: { value: 'Bone' } }).unwrap();
|
|
161
|
+
const bone2 = world.spawn({ component: Name, data: { value: 'Bone' } }).unwrap();
|
|
162
|
+
world.addComponent(bone1, { component: ChildOf, data: { parent: root } }).unwrap();
|
|
163
|
+
world.addComponent(bone2, { component: ChildOf, data: { parent: root } }).unwrap();
|
|
164
|
+
world
|
|
165
|
+
.addComponent(root, {
|
|
166
|
+
component: Skin,
|
|
167
|
+
// biome-ignore lint/suspicious/noExplicitAny: test fixture stamps a synthetic skeleton handle for resolver isolation; the resolver is mocked.
|
|
168
|
+
data: { skeleton: 1 as any, joints: new Uint32Array() },
|
|
169
|
+
})
|
|
170
|
+
.unwrap();
|
|
171
|
+
|
|
172
|
+
const skinAsset: SkinAsset = {
|
|
173
|
+
kind: 'skin',
|
|
174
|
+
skeletonGuid: '00000000-0000-0000-0000-000000000001',
|
|
175
|
+
jointPaths: ['Bone'],
|
|
176
|
+
};
|
|
177
|
+
postSpawnResolveJoints(world, { resolveSkinAsset: () => skinAsset }, root);
|
|
178
|
+
|
|
179
|
+
expect(warnSpy).toHaveBeenCalledTimes(1);
|
|
180
|
+
expect(warnSpy.mock.calls[0]?.[0]).toMatch(/same-name sibling.*Bone.*matches 2/);
|
|
181
|
+
warnSpy.mockRestore();
|
|
182
|
+
});
|
|
183
|
+
});
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
// feat-20260713-mount-override-component-add-and-shared-ref-round M5 / w20 —
|
|
2
|
+
// collect fold: derive the runtime-authored MountOverride[] for one nested
|
|
3
|
+
// SceneInstance anchor (plan-strategy D-3).
|
|
4
|
+
//
|
|
5
|
+
// ── What it does ──
|
|
6
|
+
// Given a nested anchor's SceneInstanceState, walk each live member entity and
|
|
7
|
+
// diff its live component columns against the member's authored baseline (the
|
|
8
|
+
// source SceneAsset's layer-1 values, filled with schema defaults so the
|
|
9
|
+
// comparison is against a fully-populated row). Every difference becomes a
|
|
10
|
+
// MountOverride the collect step splices into the parent's `mounts[].overrides`:
|
|
11
|
+
// - a component present live but absent in source -> component-ADD override
|
|
12
|
+
// ({ localId, comp, value }) whose value is the whole filled component map;
|
|
13
|
+
// - a field whose live value differs from baseline -> field-PATCH override
|
|
14
|
+
// ({ localId, comp, field, value }) for that single field;
|
|
15
|
+
// - a component present in source but absent live -> NOT emitted (OOS-6:
|
|
16
|
+
// component-remove deltas do not fold back this feat).
|
|
17
|
+
//
|
|
18
|
+
// ── Value domain ──
|
|
19
|
+
// The fold emits values in the LIVE domain: shared<T> fields carry numeric
|
|
20
|
+
// handles, not GUID strings. The caller (rootsToSceneAsset / serialize wiring,
|
|
21
|
+
// w21) performs the handle->GUID reverse-lookup with the two-state NULL-sentinel
|
|
22
|
+
// handling (scalar handle 0 -> omit, array handle 0 -> keep positional 0),
|
|
23
|
+
// reusing the same classifier the owned-entity serialization uses. Keeping the
|
|
24
|
+
// fold registry-free means it stays a pure World+state read (D-3 / §2.5).
|
|
25
|
+
//
|
|
26
|
+
// ── localId namespace ──
|
|
27
|
+
// Emitted `localId` is in the CHILD scene's namespace (0-based, exactly what
|
|
28
|
+
// `state.entityToLocalId` maps to). The collect caller rebases it into the
|
|
29
|
+
// parent namespace by adding the mount window's `memberFirst`, so the override
|
|
30
|
+
// addresses the same slot the apply path validates against
|
|
31
|
+
// (`_validateMountOverrides`: [memberFirst, memberFirst + memberCount)).
|
|
32
|
+
//
|
|
33
|
+
// ── Idempotency (AC-04) ──
|
|
34
|
+
// A parent-authored mount-time override is applied to the child member's LIVE
|
|
35
|
+
// column at instantiate time, and the child's source SceneAsset does not carry
|
|
36
|
+
// it — so `live - source` re-derives it every round. Emitting it exactly once
|
|
37
|
+
// (never separately re-passing state.mountTimeOverrides on top) keeps the
|
|
38
|
+
// override entry set stable across save->load->save cycles: lossless without
|
|
39
|
+
// doubling. (Runtime fact grounding this: parent-authored overrides on a nested
|
|
40
|
+
// member land in the PARENT anchor's state, not the folded child anchor's; the
|
|
41
|
+
// child anchor's own mountTimeOverrides is empty. See the M5 implement report.)
|
|
42
|
+
|
|
43
|
+
import {
|
|
44
|
+
componentDefinition,
|
|
45
|
+
type Component as EcsComponent,
|
|
46
|
+
type EntityHandle,
|
|
47
|
+
type World,
|
|
48
|
+
} from '@forgeax/engine-ecs';
|
|
49
|
+
import { componentSchema } from '@forgeax/engine-ecs/internal';
|
|
50
|
+
import { fillComponentDefaults } from '@forgeax/engine-ecs/projection';
|
|
51
|
+
import type {
|
|
52
|
+
Handle,
|
|
53
|
+
LocalEntityId,
|
|
54
|
+
MountOverride,
|
|
55
|
+
SceneAsset,
|
|
56
|
+
SceneEntity,
|
|
57
|
+
} from '@forgeax/engine-types';
|
|
58
|
+
import type { SceneAssetPort } from '../scene-asset-port';
|
|
59
|
+
|
|
60
|
+
/** Minimal structural view of a SceneInstanceState the fold reads (D-4 boundary:
|
|
61
|
+
* `world.getSceneInstanceState(root).value` is structurally assignable). */
|
|
62
|
+
export interface FoldSceneInstanceState {
|
|
63
|
+
readonly source: Handle<'SceneAsset', 'shared'>;
|
|
64
|
+
readonly entityToLocalId: Map<EntityHandle, LocalEntityId>;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Component names that never participate in an authored baseline diff: the
|
|
68
|
+
* essential row-identity column, and structural hierarchy relationship
|
|
69
|
+
* holders/mirrors (ChildOf/Children) whose live values are re-wired by
|
|
70
|
+
* instantiate, not authored. */
|
|
71
|
+
function excludedComponentNames(): Set<string> {
|
|
72
|
+
return new Set<string>(['Entity', 'ChildOf', 'Children']);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Normalize an array-like (typed array or Array) to a plain array for
|
|
76
|
+
* structural comparison; pass non-array values through unchanged. */
|
|
77
|
+
function normalize(value: unknown): unknown {
|
|
78
|
+
if (
|
|
79
|
+
Array.isArray(value) ||
|
|
80
|
+
value instanceof Uint32Array ||
|
|
81
|
+
value instanceof Float32Array ||
|
|
82
|
+
value instanceof Int32Array ||
|
|
83
|
+
value instanceof Float64Array ||
|
|
84
|
+
value instanceof Uint8Array ||
|
|
85
|
+
value instanceof Int16Array ||
|
|
86
|
+
value instanceof Uint16Array
|
|
87
|
+
) {
|
|
88
|
+
return Array.from(value as ArrayLike<unknown>);
|
|
89
|
+
}
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Structural value equality after array normalization (handles Float32Array vs
|
|
94
|
+
* number[] and nested arrays via JSON). Both inputs are column-shape values. */
|
|
95
|
+
function valuesEqual(a: unknown, b: unknown): boolean {
|
|
96
|
+
return JSON.stringify(normalize(a)) === JSON.stringify(normalize(b));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Build the per-field baseline map for a member from its source node, filled
|
|
100
|
+
* with schema defaults so it matches the fully-populated live row. Transient
|
|
101
|
+
* fields are dropped (they are never authored / never serialized, D-5). */
|
|
102
|
+
function baselineFields(
|
|
103
|
+
comp: EcsComponent<string>,
|
|
104
|
+
sourceRaw: Record<string, unknown> | undefined,
|
|
105
|
+
): Record<string, unknown> {
|
|
106
|
+
const filled = fillComponentDefaults(comp, sourceRaw ?? {});
|
|
107
|
+
const out: Record<string, unknown> = {};
|
|
108
|
+
const fields = componentDefinition(comp).fields;
|
|
109
|
+
for (const fieldName of Object.keys(componentSchema(comp))) {
|
|
110
|
+
if (fields[fieldName]?.transient) continue;
|
|
111
|
+
out[fieldName] = filled[fieldName];
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Read the live, non-transient, non-entity field values of a component on an
|
|
117
|
+
* entity into a plain map. Entity-type fields are dropped: their live value is a
|
|
118
|
+
* live EntityHandle while the source carries a LocalEntityId, so they cannot be
|
|
119
|
+
* diffed without remap — entity-ref override deltas are out of scope this feat
|
|
120
|
+
* (the AC set centers on shared/asset fields + component-add). */
|
|
121
|
+
function liveFields(
|
|
122
|
+
world: World,
|
|
123
|
+
entity: EntityHandle,
|
|
124
|
+
comp: EcsComponent<string>,
|
|
125
|
+
): Record<string, unknown> | undefined {
|
|
126
|
+
const res = world.get(entity, comp);
|
|
127
|
+
if (!res.ok) return undefined;
|
|
128
|
+
const val = res.value as Record<string, unknown>;
|
|
129
|
+
const out: Record<string, unknown> = {};
|
|
130
|
+
const fields = componentDefinition(comp).fields;
|
|
131
|
+
const schema = componentSchema(comp) as Record<string, string>;
|
|
132
|
+
for (const fieldName of Object.keys(schema)) {
|
|
133
|
+
if (fields[fieldName]?.transient) continue;
|
|
134
|
+
const fieldType = schema[fieldName];
|
|
135
|
+
if (fieldType === 'entity' || fieldType === 'array<entity>') continue;
|
|
136
|
+
out[fieldName] = normalize(val[fieldName]);
|
|
137
|
+
}
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Fold one nested anchor's live member state into the runtime-authored
|
|
143
|
+
* MountOverride[] (child-namespace localIds, live value domain). See file
|
|
144
|
+
* header for the full contract. Returns [] when nothing differs from source.
|
|
145
|
+
*/
|
|
146
|
+
export function foldMountOverrides(
|
|
147
|
+
world: World,
|
|
148
|
+
assets: SceneAssetPort,
|
|
149
|
+
state: FoldSceneInstanceState,
|
|
150
|
+
): MountOverride[] {
|
|
151
|
+
const sourceRes = assets.resolve<SceneAsset>(
|
|
152
|
+
world,
|
|
153
|
+
state.source as unknown as Handle<string, 'shared'>,
|
|
154
|
+
);
|
|
155
|
+
if (!sourceRes.ok) return [];
|
|
156
|
+
const source = sourceRes.value as SceneAsset;
|
|
157
|
+
|
|
158
|
+
// Index source entities by localId for O(1) baseline lookup.
|
|
159
|
+
const sourceByLid = new Map<number, SceneEntity>();
|
|
160
|
+
for (const node of source.entities) {
|
|
161
|
+
sourceByLid.set(node.localId as unknown as number, node);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const excluded = excludedComponentNames();
|
|
165
|
+
const registered = world.components.entries();
|
|
166
|
+
const overrides: MountOverride[] = [];
|
|
167
|
+
|
|
168
|
+
// Deterministic member order (localId ascending) so collect output is a pure
|
|
169
|
+
// function of the graph (mirrors rootsToSceneAsset D-7 ordering discipline).
|
|
170
|
+
const members: Array<[EntityHandle, number]> = [];
|
|
171
|
+
for (const [entity, lid] of state.entityToLocalId) {
|
|
172
|
+
members.push([entity, lid as unknown as number]);
|
|
173
|
+
}
|
|
174
|
+
members.sort((a, b) => a[1] - b[1]);
|
|
175
|
+
|
|
176
|
+
for (const [entity, lid] of members) {
|
|
177
|
+
const sourceNode = sourceByLid.get(lid);
|
|
178
|
+
const sourceComps = (sourceNode?.components ?? {}) as Record<string, Record<string, unknown>>;
|
|
179
|
+
|
|
180
|
+
for (const [compName, compToken] of registered) {
|
|
181
|
+
if (excluded.has(compName)) continue;
|
|
182
|
+
if (componentDefinition(compToken).policy.transient) continue;
|
|
183
|
+
const comp = compToken as EcsComponent<string>;
|
|
184
|
+
if (Object.keys(componentSchema(comp)).length === 0) continue;
|
|
185
|
+
|
|
186
|
+
const live = liveFields(world, entity, comp);
|
|
187
|
+
if (live === undefined) continue; // component absent live
|
|
188
|
+
|
|
189
|
+
const sourceRaw = sourceComps[compName];
|
|
190
|
+
if (sourceRaw === undefined) {
|
|
191
|
+
// Component present live but absent in source -> component-ADD override.
|
|
192
|
+
// Emit the whole live component value map (apply upserts with defaults).
|
|
193
|
+
overrides.push({
|
|
194
|
+
localId: lid as unknown as LocalEntityId,
|
|
195
|
+
comp: compName,
|
|
196
|
+
value: live,
|
|
197
|
+
});
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Component present in both -> per-field diff (field-PATCH overrides).
|
|
202
|
+
const baseline = baselineFields(comp, sourceRaw);
|
|
203
|
+
for (const fieldName of Object.keys(live)) {
|
|
204
|
+
if (!valuesEqual(live[fieldName], baseline[fieldName])) {
|
|
205
|
+
overrides.push({
|
|
206
|
+
localId: lid as unknown as LocalEntityId,
|
|
207
|
+
comp: compName,
|
|
208
|
+
field: fieldName,
|
|
209
|
+
value: live[fieldName],
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return overrides;
|
|
217
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
|
|
3
|
+
export const SHADOW_PERFORMANCE_ARTIFACT_SCHEMA = 'forgeax.shadow-performance/v1';
|
|
4
|
+
|
|
5
|
+
export type ShadowDiagnosticsMode = 'off' | 'on';
|
|
6
|
+
|
|
7
|
+
export interface ShadowPerformanceProvenance {
|
|
8
|
+
readonly commit: string;
|
|
9
|
+
readonly chrome: string | null;
|
|
10
|
+
readonly viewport: { readonly width: number; readonly height: number } | null;
|
|
11
|
+
readonly devicePixelRatio: number | null;
|
|
12
|
+
readonly trajectory: string;
|
|
13
|
+
readonly diagnostics: ShadowDiagnosticsMode;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface ShadowPerformanceFrame {
|
|
17
|
+
readonly frame: number;
|
|
18
|
+
readonly cpuFrameMs: number;
|
|
19
|
+
readonly gpuFrameMs: number | null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ShadowPerformanceArtifact {
|
|
23
|
+
readonly schema: typeof SHADOW_PERFORMANCE_ARTIFACT_SCHEMA;
|
|
24
|
+
readonly status: 'measured' | 'unavailable';
|
|
25
|
+
readonly provenance: ShadowPerformanceProvenance;
|
|
26
|
+
readonly frames: readonly ShadowPerformanceFrame[];
|
|
27
|
+
readonly summary: {
|
|
28
|
+
readonly frameCount: number;
|
|
29
|
+
readonly cpuFrameP95Ms: number | null;
|
|
30
|
+
readonly cpuFpsP01: number | null;
|
|
31
|
+
readonly gpuFrameP95Ms: number | null;
|
|
32
|
+
readonly gpuTimestamp: 'available' | 'unavailable';
|
|
33
|
+
readonly unavailableReason: string | null;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface ShadowPerformanceCaptureInput {
|
|
38
|
+
readonly provenance: ShadowPerformanceProvenance;
|
|
39
|
+
readonly frames: readonly ShadowPerformanceFrame[];
|
|
40
|
+
readonly unavailableReason?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function assertFiniteNonNegative(value: number, field: string): void {
|
|
44
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
45
|
+
throw new Error(`${field} must be a finite non-negative number`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function nearestRank(values: readonly number[], quantile: number): number | null {
|
|
50
|
+
if (values.length === 0) return null;
|
|
51
|
+
const sorted = [...values].sort((left, right) => left - right);
|
|
52
|
+
const rank = Math.max(1, Math.ceil(quantile * sorted.length));
|
|
53
|
+
return sorted[rank - 1] ?? null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function validateProvenance(provenance: ShadowPerformanceProvenance): void {
|
|
57
|
+
if (provenance.commit.trim().length === 0) throw new Error('commit is required');
|
|
58
|
+
if (provenance.trajectory.trim().length === 0) throw new Error('trajectory is required');
|
|
59
|
+
if (provenance.viewport !== null) {
|
|
60
|
+
if (!Number.isInteger(provenance.viewport.width) || provenance.viewport.width <= 0) {
|
|
61
|
+
throw new Error('viewport.width must be a positive integer');
|
|
62
|
+
}
|
|
63
|
+
if (!Number.isInteger(provenance.viewport.height) || provenance.viewport.height <= 0) {
|
|
64
|
+
throw new Error('viewport.height must be a positive integer');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (provenance.devicePixelRatio !== null) {
|
|
68
|
+
assertFiniteNonNegative(provenance.devicePixelRatio, 'devicePixelRatio');
|
|
69
|
+
if (provenance.devicePixelRatio === 0) throw new Error('devicePixelRatio must be positive');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function validateFrames(frames: readonly ShadowPerformanceFrame[]): void {
|
|
74
|
+
let previousFrame = -1;
|
|
75
|
+
for (const sample of frames) {
|
|
76
|
+
if (!Number.isInteger(sample.frame) || sample.frame <= previousFrame) {
|
|
77
|
+
throw new Error('frame samples must have strictly increasing frame numbers');
|
|
78
|
+
}
|
|
79
|
+
previousFrame = sample.frame;
|
|
80
|
+
assertFiniteNonNegative(sample.cpuFrameMs, 'cpuFrameMs');
|
|
81
|
+
if (sample.gpuFrameMs !== null) assertFiniteNonNegative(sample.gpuFrameMs, 'gpuFrameMs');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function summarizeShadowPerformanceCapture(
|
|
86
|
+
input: ShadowPerformanceCaptureInput,
|
|
87
|
+
): ShadowPerformanceArtifact {
|
|
88
|
+
validateProvenance(input.provenance);
|
|
89
|
+
validateFrames(input.frames);
|
|
90
|
+
const cpuSamples = input.frames.map((sample) => sample.cpuFrameMs);
|
|
91
|
+
const gpuSamples = input.frames.flatMap((sample) =>
|
|
92
|
+
sample.gpuFrameMs === null ? [] : [sample.gpuFrameMs],
|
|
93
|
+
);
|
|
94
|
+
const gpuTimestamp = gpuSamples.length === input.frames.length && input.frames.length > 0;
|
|
95
|
+
const unavailableReason =
|
|
96
|
+
input.unavailableReason ??
|
|
97
|
+
(input.frames.length === 0
|
|
98
|
+
? 'no frame samples were captured'
|
|
99
|
+
: gpuTimestamp
|
|
100
|
+
? null
|
|
101
|
+
: 'GPU timestamp query was unavailable; CPU timings remain diagnostic only');
|
|
102
|
+
return {
|
|
103
|
+
schema: SHADOW_PERFORMANCE_ARTIFACT_SCHEMA,
|
|
104
|
+
status: input.frames.length === 0 ? 'unavailable' : 'measured',
|
|
105
|
+
provenance: input.provenance,
|
|
106
|
+
frames: input.frames,
|
|
107
|
+
summary: {
|
|
108
|
+
frameCount: input.frames.length,
|
|
109
|
+
cpuFrameP95Ms: nearestRank(cpuSamples, 0.95),
|
|
110
|
+
cpuFpsP01: nearestRank(
|
|
111
|
+
cpuSamples.map((frameMs) => (frameMs === 0 ? Number.POSITIVE_INFINITY : 1000 / frameMs)),
|
|
112
|
+
0.01,
|
|
113
|
+
),
|
|
114
|
+
gpuFrameP95Ms: nearestRank(gpuSamples, 0.95),
|
|
115
|
+
gpuTimestamp: gpuTimestamp ? 'available' : 'unavailable',
|
|
116
|
+
unavailableReason,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function unavailableShadowPerformanceCapture(
|
|
122
|
+
provenance: ShadowPerformanceProvenance,
|
|
123
|
+
reason: string,
|
|
124
|
+
): ShadowPerformanceArtifact {
|
|
125
|
+
if (reason.trim().length === 0) throw new Error('unavailable reason is required');
|
|
126
|
+
return summarizeShadowPerformanceCapture({ provenance, frames: [], unavailableReason: reason });
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
describe('shadow performance artifact contract', () => {
|
|
130
|
+
it('uses nearest-rank p95 and records CPU-only evidence when GPU timestamps are absent', () => {
|
|
131
|
+
const artifact = summarizeShadowPerformanceCapture({
|
|
132
|
+
provenance: {
|
|
133
|
+
commit: 'test-commit',
|
|
134
|
+
chrome: 'test-chrome',
|
|
135
|
+
viewport: { width: 1280, height: 720 },
|
|
136
|
+
devicePixelRatio: 1,
|
|
137
|
+
trajectory: 'cod-door-forward-back',
|
|
138
|
+
diagnostics: 'off',
|
|
139
|
+
},
|
|
140
|
+
frames: [
|
|
141
|
+
{ frame: 1, cpuFrameMs: 10, gpuFrameMs: null },
|
|
142
|
+
{ frame: 2, cpuFrameMs: 12, gpuFrameMs: null },
|
|
143
|
+
{ frame: 3, cpuFrameMs: 20, gpuFrameMs: null },
|
|
144
|
+
],
|
|
145
|
+
});
|
|
146
|
+
expect(artifact.schema).toBe(SHADOW_PERFORMANCE_ARTIFACT_SCHEMA);
|
|
147
|
+
expect(artifact.status).toBe('measured');
|
|
148
|
+
expect(artifact.summary.cpuFrameP95Ms).toBe(20);
|
|
149
|
+
expect(artifact.summary.gpuTimestamp).toBe('unavailable');
|
|
150
|
+
expect(artifact.summary.gpuFrameP95Ms).toBeNull();
|
|
151
|
+
expect(artifact.summary.unavailableReason).toContain('GPU timestamp');
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('does not turn an empty capture into a passing baseline', () => {
|
|
155
|
+
const artifact = unavailableShadowPerformanceCapture(
|
|
156
|
+
{
|
|
157
|
+
commit: 'test-commit',
|
|
158
|
+
chrome: null,
|
|
159
|
+
viewport: null,
|
|
160
|
+
devicePixelRatio: null,
|
|
161
|
+
trajectory: 'cod-door-forward-back',
|
|
162
|
+
diagnostics: 'on',
|
|
163
|
+
},
|
|
164
|
+
'browser was not available',
|
|
165
|
+
);
|
|
166
|
+
expect(artifact.status).toBe('unavailable');
|
|
167
|
+
expect(artifact.summary.frameCount).toBe(0);
|
|
168
|
+
expect(artifact.summary.cpuFrameP95Ms).toBeNull();
|
|
169
|
+
expect(artifact.summary.unavailableReason).toBe('browser was not available');
|
|
170
|
+
});
|
|
171
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-only helper mirroring the `forgeax::sprite` shader's paramSchema
|
|
3
|
+
* (sprite.material.json). Field set is 1:1 with paramSchema entries; field
|
|
4
|
+
* order matches schema order so the std140 UBO layout (slot 0..3 = colorTint
|
|
5
|
+
* / region / pivotAndSize / slicesAndMode) reads top-to-bottom.
|
|
6
|
+
*
|
|
7
|
+
* feat-20260625-refactor-sprite-as-transparent-mesh M3 / w11 (D-4, D-6,
|
|
8
|
+
* F-3): paramSchema is now UBO-aligned (the 4 vec4 fields match the WGSL
|
|
9
|
+
* Material struct field names 1:1 so the generic std140 UBO writer
|
|
10
|
+
* `applyParamSnapshotToUbo` walks `derive(paramSchema).uboLayout.entries`
|
|
11
|
+
* and writes each field at its declared offset, no sprite-specific path).
|
|
12
|
+
*
|
|
13
|
+
* AI-user discoverability: annotate a sprite material's `values`
|
|
14
|
+
* literal as `SpriteParamValues` to get autocomplete on `slicesAndMode`,
|
|
15
|
+
* `pivotAndSize`, etc. Without the annotation the literal binds to
|
|
16
|
+
* `MaterialAsset.values: Record<string, unknown>` and field
|
|
17
|
+
* autocomplete is unavailable.
|
|
18
|
+
*
|
|
19
|
+
* Required fields:
|
|
20
|
+
* - `baseColorTexture`: AssetGuid string of a registered TextureAsset
|
|
21
|
+
* (renamed from the pre-w11 `texture` field for cross-material name
|
|
22
|
+
* consistency, D-4).
|
|
23
|
+
*
|
|
24
|
+
* Optional UBO fields (omit for identity defaults):
|
|
25
|
+
* - `colorTint`: vec4 `[r, g, b, a]` — texture sample multiplier
|
|
26
|
+
* (rgb * colorTint.rgb, alpha * colorTint.a). Default `[1, 1, 1, 1]`.
|
|
27
|
+
* - `region`: vec4 `[uMin, vMin, uW, vH]` — atlas sub-region. Default
|
|
28
|
+
* `[0, 0, 1, 1]`. Host pre-folds flipX / flipY into this vec4 (D-8):
|
|
29
|
+
* `flipX -> region.x += region.z; region.z = -region.z` (analog for Y).
|
|
30
|
+
* When composing with {@link SpriteRegionOverride}, the override
|
|
31
|
+
* replaces this asset-side region.
|
|
32
|
+
* - `pivotAndSize`: vec4 `[pivotX, pivotY, sizeX, sizeY]` — `.xy` is the
|
|
33
|
+
* pivot (0..1 normalised); `.zw` is the DEAD SLOT post-w11 (D-6 unit-
|
|
34
|
+
* quad: world scale flows entirely through Transform.world, no longer
|
|
35
|
+
* double-applied via the UBO). Default `[0.5, 0.5, 1, 1]`.
|
|
36
|
+
* - `slicesAndMode`: vec4 `[left, top, right, bottom-signed]` — 9-slice
|
|
37
|
+
* border widths in UV (0..1) on the source texture region. Sum of
|
|
38
|
+
* opposite borders must be < 1 (left+right < region width, top+bottom
|
|
39
|
+
* < region height); register-time validation surfaces structured
|
|
40
|
+
* `AssetError`. The `.w` carries the sliceMode sentinel: positive (or 0)
|
|
41
|
+
* = stretch (middle band stretches with the entity's scale, default);
|
|
42
|
+
* NEGATIVE = tile (middle band tiles via sampler `addressMode='repeat'`).
|
|
43
|
+
* Default `[0, 0, 0, 0]` (no 9-slice). Authoring tip: callers who want
|
|
44
|
+
* to keep the legacy `slices` + `sliceMode` split can compute
|
|
45
|
+
* `slicesAndMode = [l, t, r, mode===1 ? -b : b]` at the call site.
|
|
46
|
+
*
|
|
47
|
+
* Composes with {@link SpriteRegionOverride}: when both are present, the
|
|
48
|
+
* `slicesAndMode` are interpreted relative to the per-entity `region`
|
|
49
|
+
* override (AC-14), not the material's `values.region`.
|
|
50
|
+
*
|
|
51
|
+
* Sibling type, not a sibling asset kind: `MaterialAsset` is the only
|
|
52
|
+
* material asset shape; using `SpriteParamValues` as an annotation does
|
|
53
|
+
* not branch the closed `AssetUnion` (plan-strategy section D-1).
|
|
54
|
+
*/
|
|
55
|
+
export type SpriteParamValues = {
|
|
56
|
+
baseColorTexture: string;
|
|
57
|
+
colorTint?: readonly [number, number, number, number];
|
|
58
|
+
region?: readonly [number, number, number, number];
|
|
59
|
+
pivotAndSize?: readonly [number, number, number, number];
|
|
60
|
+
slicesAndMode?: readonly [number, number, number, number];
|
|
61
|
+
};
|