@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,293 @@
|
|
|
1
|
+
// shadow-csm-ubo.dawn.test.ts - feat-20260613-csm-cascaded-shadow-maps-unique-shadow-path
|
|
2
|
+
// M4 / w15: View UBO CSM round-trip dawn-node test (RED, test-first).
|
|
3
|
+
//
|
|
4
|
+
// Covers AC-08: host-side 4-cascade View UBO data write → dawn-node GPU read
|
|
5
|
+
// back. Validates lightViewProj[4] + splitPlanes[4] + cascadeCount/cascadeBlend
|
|
6
|
+
// survive the queue.writeBuffer round-trip without corruption.
|
|
7
|
+
//
|
|
8
|
+
// Layout matches shadow-csm-ubo.test.ts — 240 f32 / 960 B std140 after
|
|
9
|
+
// feat-20260625 w25 folded the spot lightViewProj array into the View UBO tail.
|
|
10
|
+
// The directional cascade offsets [0..125] this test exercises are unchanged;
|
|
11
|
+
// the extra tail (floats 132..195) stays zero in this round-trip.
|
|
12
|
+
//
|
|
13
|
+
// The payload includes the appended Fog lanes after the temporal projection
|
|
14
|
+
// facts; the round-trip keeps those values in the existing View uniform slot.
|
|
15
|
+
|
|
16
|
+
import { describe, expect, it } from 'vitest';
|
|
17
|
+
|
|
18
|
+
// ── Constants (mirrors current View UBO layout) ─────────────────────────────
|
|
19
|
+
|
|
20
|
+
const VIEW_UBO_FLOAT_COUNT = 240;
|
|
21
|
+
const VIEW_UBO_BYTES = 960;
|
|
22
|
+
|
|
23
|
+
// f32 indices matching std140 byte offsets.
|
|
24
|
+
const OFF = {
|
|
25
|
+
LVP0: 28, // lightViewProj[0] — byte 112
|
|
26
|
+
INV: 44, // inverseViewProj — byte 176
|
|
27
|
+
LVP1: 60, // lightViewProj[1] — byte 240
|
|
28
|
+
LVP2: 76, // lightViewProj[2] — byte 304
|
|
29
|
+
LVP3: 92, // lightViewProj[3] — byte 368
|
|
30
|
+
SP0: 108, // splitPlanes[0] — byte 432
|
|
31
|
+
SP1: 112, // splitPlanes[1] — byte 448
|
|
32
|
+
SP2: 116, // splitPlanes[2] — byte 464
|
|
33
|
+
SP3: 120, // splitPlanes[3] — byte 480
|
|
34
|
+
CC: 124, // cascadeCount — byte 496
|
|
35
|
+
CB: 125, // cascadeBlend — byte 500
|
|
36
|
+
FOG_COLOR: 232, // fog.color.xyz — byte 928
|
|
37
|
+
FOG_DENSITY: 235, // fog.density — byte 940
|
|
38
|
+
FOG_HEIGHT_FALLOFF: 236, // fog.heightFalloff — byte 944
|
|
39
|
+
FOG_MAX_OPACITY: 237, // fog.maxOpacity — byte 948
|
|
40
|
+
} as const;
|
|
41
|
+
|
|
42
|
+
const GPUMapMode: { readonly READ: number } = ((): { readonly READ: number } => {
|
|
43
|
+
try {
|
|
44
|
+
const o = globalThis as Record<string, unknown>;
|
|
45
|
+
const gpuMode = o.GPUMapMode;
|
|
46
|
+
if (
|
|
47
|
+
gpuMode !== undefined &&
|
|
48
|
+
typeof gpuMode === 'object' &&
|
|
49
|
+
gpuMode !== null &&
|
|
50
|
+
'READ' in gpuMode
|
|
51
|
+
) {
|
|
52
|
+
return gpuMode as { readonly READ: number };
|
|
53
|
+
}
|
|
54
|
+
} catch {
|
|
55
|
+
/* node env */
|
|
56
|
+
}
|
|
57
|
+
return { READ: 1 };
|
|
58
|
+
})();
|
|
59
|
+
|
|
60
|
+
// GPU buffer usage flags.
|
|
61
|
+
// WebGPU BufferUsage flags (from webgpu spec).
|
|
62
|
+
const MAP_READ = 0x0001; // GPUBufferUsage.MAP_READ
|
|
63
|
+
const MAP_WRITE = 0x0002; // GPUBufferUsage.MAP_WRITE
|
|
64
|
+
const COPY_SRC = 0x0004; // GPUBufferUsage.COPY_SRC
|
|
65
|
+
const COPY_DST = 0x0008; // GPUBufferUsage.COPY_DST
|
|
66
|
+
const UNIFORM = 0x0040; // GPUBufferUsage.UNIFORM
|
|
67
|
+
|
|
68
|
+
// biome-ignore lint/suspicious/noExplicitAny: dawn-node detection guard
|
|
69
|
+
const dawnReady = typeof navigator !== 'undefined' && (navigator as any).gpu !== undefined;
|
|
70
|
+
|
|
71
|
+
const commonViewSource = await (async () => {
|
|
72
|
+
const { readFile } = await import('node:fs/promises');
|
|
73
|
+
const { fileURLToPath } = await import('node:url');
|
|
74
|
+
return readFile(
|
|
75
|
+
fileURLToPath(new URL('../../../shader/src/common.wgsl', import.meta.url)),
|
|
76
|
+
'utf8',
|
|
77
|
+
);
|
|
78
|
+
})();
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Build a 240-float View UBO payload with known test values.
|
|
82
|
+
* All 4 lightViewProj matrices are identity; splitPlanes use
|
|
83
|
+
* monotonic values; cascadeCount=4, cascadeBlend=0.2.
|
|
84
|
+
*/
|
|
85
|
+
function buildTestPayload(cascadeCount: number, cascadeBlend: number): Float32Array {
|
|
86
|
+
const f32 = new Float32Array(VIEW_UBO_FLOAT_COUNT);
|
|
87
|
+
|
|
88
|
+
// worldViewProj[0] = 1 (identity)
|
|
89
|
+
f32[0] = 1;
|
|
90
|
+
f32[5] = 1;
|
|
91
|
+
f32[10] = 1;
|
|
92
|
+
f32[15] = 1;
|
|
93
|
+
|
|
94
|
+
// lightViewProj[0] — distinct test pattern.
|
|
95
|
+
// Set diagonal in each cascade to distinguishable values.
|
|
96
|
+
for (let c = 0; c < 4; c++) {
|
|
97
|
+
const base = [OFF.LVP0, OFF.LVP1, OFF.LVP2, OFF.LVP3][c] ?? 0;
|
|
98
|
+
f32[base] = (c + 1) * 0.1; // diag entry [0,0]
|
|
99
|
+
f32[base + 5] = (c + 1) * 0.1; // [1,1]
|
|
100
|
+
f32[base + 10] = (c + 1) * 0.1; // [2,2]
|
|
101
|
+
f32[base + 15] = 1; // [3,3]
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// inverseViewProj — identity.
|
|
105
|
+
f32[OFF.INV] = 1;
|
|
106
|
+
f32[OFF.INV + 5] = 1;
|
|
107
|
+
f32[OFF.INV + 10] = 1;
|
|
108
|
+
f32[OFF.INV + 15] = 1;
|
|
109
|
+
|
|
110
|
+
// splitPlanes — monotonic known values.
|
|
111
|
+
const splits = [OFF.SP0, OFF.SP1, OFF.SP2, OFF.SP3];
|
|
112
|
+
for (let i = 0; i < cascadeCount; i++) {
|
|
113
|
+
const off = splits[i] ?? 0;
|
|
114
|
+
f32[off] = (i + 1) * 10.0; // 10, 20, 30, 40
|
|
115
|
+
// Remaining 3 floats per vec4 slot are padding (zero).
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// cascadeCount / cascadeBlend.
|
|
119
|
+
f32[OFF.CC] = cascadeCount;
|
|
120
|
+
f32[OFF.CB] = cascadeBlend;
|
|
121
|
+
|
|
122
|
+
// Fog payload occupies the tail of the same View uniform slot.
|
|
123
|
+
f32[OFF.FOG_COLOR] = 0.2;
|
|
124
|
+
f32[OFF.FOG_COLOR + 1] = 0.4;
|
|
125
|
+
f32[OFF.FOG_COLOR + 2] = 0.8;
|
|
126
|
+
f32[OFF.FOG_DENSITY] = 0.035;
|
|
127
|
+
f32[OFF.FOG_HEIGHT_FALLOFF] = 0.28;
|
|
128
|
+
f32[OFF.FOG_MAX_OPACITY] = 0.92;
|
|
129
|
+
|
|
130
|
+
return f32;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
describe('View UBO CSM round-trip (w15)', () => {
|
|
134
|
+
it.skipIf(!dawnReady)("'dawn-binding-missing' -- dawn.node binding injection failed", () => {
|
|
135
|
+
expect(dawnReady).toBe(true);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
describe('GPU buffer round-trip (cascadeCount=4)', () => {
|
|
139
|
+
it('writes 4-cascade payload and reads back identical data', async () => {
|
|
140
|
+
const gpu = (navigator as unknown as Record<string, unknown>).gpu as GPU;
|
|
141
|
+
const adapter = await gpu.requestAdapter();
|
|
142
|
+
expect(adapter).toBeTruthy();
|
|
143
|
+
if (!adapter) throw new Error('no adapter');
|
|
144
|
+
const device = await adapter.requestDevice();
|
|
145
|
+
expect(device).toBeTruthy();
|
|
146
|
+
|
|
147
|
+
// Create buffer with COPY_DST (for write) + COPY_SRC (for read).
|
|
148
|
+
const buf = device.createBuffer({
|
|
149
|
+
label: 'csm-ubo-roundtrip-n4',
|
|
150
|
+
size: VIEW_UBO_BYTES,
|
|
151
|
+
usage: COPY_DST | COPY_SRC | UNIFORM,
|
|
152
|
+
mappedAtCreation: false,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
const payload = buildTestPayload(4, 0.2);
|
|
156
|
+
const stagingUpload = device.createBuffer({
|
|
157
|
+
size: VIEW_UBO_BYTES,
|
|
158
|
+
usage: MAP_WRITE | COPY_SRC,
|
|
159
|
+
mappedAtCreation: true,
|
|
160
|
+
});
|
|
161
|
+
new Float32Array(stagingUpload.getMappedRange()).set(payload);
|
|
162
|
+
stagingUpload.unmap();
|
|
163
|
+
|
|
164
|
+
// Copy to the uniform-buffer-style target.
|
|
165
|
+
const encoder = device.createCommandEncoder();
|
|
166
|
+
encoder.copyBufferToBuffer(stagingUpload, 0, buf, 0, VIEW_UBO_BYTES);
|
|
167
|
+
device.queue.submit([encoder.finish()]);
|
|
168
|
+
await device.queue.onSubmittedWorkDone();
|
|
169
|
+
|
|
170
|
+
// Read back via staging buffer.
|
|
171
|
+
const staging = device.createBuffer({
|
|
172
|
+
size: VIEW_UBO_BYTES,
|
|
173
|
+
usage: MAP_READ | COPY_DST,
|
|
174
|
+
mappedAtCreation: false,
|
|
175
|
+
});
|
|
176
|
+
const enc2 = device.createCommandEncoder();
|
|
177
|
+
enc2.copyBufferToBuffer(buf, 0, staging, 0, VIEW_UBO_BYTES);
|
|
178
|
+
device.queue.submit([enc2.finish()]);
|
|
179
|
+
await staging.mapAsync(GPUMapMode.READ);
|
|
180
|
+
const readback = new Float32Array(staging.getMappedRange());
|
|
181
|
+
|
|
182
|
+
// Verify cascadeCount / cascadeBlend.
|
|
183
|
+
expect(readback[OFF.CC]).toBe(4);
|
|
184
|
+
expect(readback[OFF.CB]).toBeCloseTo(0.2, 5);
|
|
185
|
+
|
|
186
|
+
// Verify splitPlanes.
|
|
187
|
+
expect(readback[OFF.SP0]).toBeCloseTo(10, 5);
|
|
188
|
+
expect(readback[OFF.SP1]).toBeCloseTo(20, 5);
|
|
189
|
+
expect(readback[OFF.SP2]).toBeCloseTo(30, 5);
|
|
190
|
+
expect(readback[OFF.SP3]).toBeCloseTo(40, 5);
|
|
191
|
+
|
|
192
|
+
// Verify lightViewProj[0] diagonal element.
|
|
193
|
+
expect(readback[OFF.LVP0]).toBeCloseTo(0.1, 5);
|
|
194
|
+
// Verify lightViewProj[3] diagonal element.
|
|
195
|
+
expect(readback[OFF.LVP3 + 10]).toBeCloseTo(0.4, 5);
|
|
196
|
+
|
|
197
|
+
// Verify Fog remains in the same View slot after the CSM tail.
|
|
198
|
+
expect(readback[OFF.FOG_COLOR]).toBeCloseTo(0.2, 5);
|
|
199
|
+
expect(readback[OFF.FOG_COLOR + 1]).toBeCloseTo(0.4, 5);
|
|
200
|
+
expect(readback[OFF.FOG_COLOR + 2]).toBeCloseTo(0.8, 5);
|
|
201
|
+
expect(readback[OFF.FOG_DENSITY]).toBeCloseTo(0.035, 5);
|
|
202
|
+
expect(readback[OFF.FOG_HEIGHT_FALLOFF]).toBeCloseTo(0.28, 5);
|
|
203
|
+
expect(readback[OFF.FOG_MAX_OPACITY]).toBeCloseTo(0.92, 5);
|
|
204
|
+
|
|
205
|
+
staging.unmap();
|
|
206
|
+
staging.destroy();
|
|
207
|
+
stagingUpload.destroy();
|
|
208
|
+
buf.destroy();
|
|
209
|
+
device.destroy();
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
describe('GPU buffer round-trip (cascadeCount=1)', () => {
|
|
214
|
+
it('writes 1-cascade payload with zero unused slots', async () => {
|
|
215
|
+
const gpu = (navigator as unknown as Record<string, unknown>).gpu as GPU;
|
|
216
|
+
const adapter = await gpu.requestAdapter();
|
|
217
|
+
expect(adapter).toBeTruthy();
|
|
218
|
+
if (!adapter) throw new Error('no adapter');
|
|
219
|
+
const device = await adapter.requestDevice();
|
|
220
|
+
expect(device).toBeTruthy();
|
|
221
|
+
|
|
222
|
+
const buf = device.createBuffer({
|
|
223
|
+
label: 'csm-ubo-roundtrip-n1',
|
|
224
|
+
size: VIEW_UBO_BYTES,
|
|
225
|
+
usage: COPY_DST | COPY_SRC | UNIFORM,
|
|
226
|
+
mappedAtCreation: false,
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
const payload = buildTestPayload(1, 0.0);
|
|
230
|
+
const stagingUpload = device.createBuffer({
|
|
231
|
+
size: VIEW_UBO_BYTES,
|
|
232
|
+
usage: MAP_WRITE | COPY_SRC,
|
|
233
|
+
mappedAtCreation: true,
|
|
234
|
+
});
|
|
235
|
+
new Float32Array(stagingUpload.getMappedRange()).set(payload);
|
|
236
|
+
stagingUpload.unmap();
|
|
237
|
+
|
|
238
|
+
const encoder = device.createCommandEncoder();
|
|
239
|
+
encoder.copyBufferToBuffer(stagingUpload, 0, buf, 0, VIEW_UBO_BYTES);
|
|
240
|
+
device.queue.submit([encoder.finish()]);
|
|
241
|
+
await device.queue.onSubmittedWorkDone();
|
|
242
|
+
|
|
243
|
+
const staging = device.createBuffer({
|
|
244
|
+
size: VIEW_UBO_BYTES,
|
|
245
|
+
usage: MAP_READ | COPY_DST,
|
|
246
|
+
mappedAtCreation: false,
|
|
247
|
+
});
|
|
248
|
+
const enc2 = device.createCommandEncoder();
|
|
249
|
+
enc2.copyBufferToBuffer(buf, 0, staging, 0, VIEW_UBO_BYTES);
|
|
250
|
+
device.queue.submit([enc2.finish()]);
|
|
251
|
+
|
|
252
|
+
await staging.mapAsync(GPUMapMode.READ);
|
|
253
|
+
const readback = new Float32Array(staging.getMappedRange());
|
|
254
|
+
|
|
255
|
+
// cascadeCount=1 with cascadeBlend=0.
|
|
256
|
+
expect(readback[OFF.CC]).toBe(1);
|
|
257
|
+
expect(readback[OFF.CB]).toBe(0);
|
|
258
|
+
|
|
259
|
+
// cascade 0 splitPlanes: only [0] has data.
|
|
260
|
+
expect(readback[OFF.SP0]).toBeCloseTo(10, 5);
|
|
261
|
+
// Unused split slots should be zero.
|
|
262
|
+
expect(readback[OFF.SP1]).toBe(0);
|
|
263
|
+
expect(readback[OFF.SP2]).toBe(0);
|
|
264
|
+
expect(readback[OFF.SP3]).toBe(0);
|
|
265
|
+
|
|
266
|
+
// cascade 0 lightViewProj is written.
|
|
267
|
+
expect(readback[OFF.LVP0]).toBeCloseTo(0.1, 5);
|
|
268
|
+
// Unused matrix slots should be zero (or identity pattern
|
|
269
|
+
// from the payload — our builder sets identity diag for all).
|
|
270
|
+
// What matters: cascade 0 is correct.
|
|
271
|
+
|
|
272
|
+
staging.unmap();
|
|
273
|
+
staging.destroy();
|
|
274
|
+
stagingUpload.destroy();
|
|
275
|
+
buf.destroy();
|
|
276
|
+
device.destroy();
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
describe('Fog View ABI Dawn transport shape (M2)', () => {
|
|
282
|
+
it('uses the expanded View slot for the Fog payload', () => {
|
|
283
|
+
expect(VIEW_UBO_FLOAT_COUNT).toBe(240);
|
|
284
|
+
expect(VIEW_UBO_BYTES).toBe(960);
|
|
285
|
+
expect(VIEW_UBO_BYTES).toBeLessThanOrEqual(1024);
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
it('keeps Fog as a field of the existing View uniform binding', () => {
|
|
289
|
+
expect(commonViewSource).toContain('fog : FogViewParams');
|
|
290
|
+
expect(commonViewSource).toContain('@group(0) @binding(0) var<uniform> view : View;');
|
|
291
|
+
expect(commonViewSource).not.toContain('@group(0) @binding(10)');
|
|
292
|
+
});
|
|
293
|
+
});
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
// shadow-csm-ubo.test.ts - feat-20260613-csm-cascaded-shadow-maps-unique-shadow-path
|
|
2
|
+
// M4 / w14: View UBO std140 layout test (RED, test-first).
|
|
3
|
+
//
|
|
4
|
+
// Covers AC-08: View UBO tail pre-allocation for 4 cascades, fixed size
|
|
5
|
+
// independent of runtime cascadeCount. Validates std140 byte offsets for
|
|
6
|
+
// lightViewProj[4], splitPlanes[4], cascadeCount, cascadeBlend.
|
|
7
|
+
//
|
|
8
|
+
// feat-20260625-spot-light-shadow-mapping w25 (scope-amend webkit-fallback):
|
|
9
|
+
// the View UBO grew 592 -> 784 B (148 -> 196 f32). The directional cascade
|
|
10
|
+
// offsets [0..128] are byte-for-byte UNCHANGED; the per-spot fragment-read
|
|
11
|
+
// `spotLightViewProj` array<mat4x4<f32>,4> (256 B) folded into the tail at
|
|
12
|
+
// byte 528 (float 132), replacing the former zero tail-pad and removing the
|
|
13
|
+
// standalone @group(0) binding 9 uniform buffer that overflowed the WebGL2
|
|
14
|
+
// fallback fragment uniform-buffer budget.
|
|
15
|
+
//
|
|
16
|
+
// Layout (784 B std140, 196 f32):
|
|
17
|
+
// [ 0.. 16) worldViewProj mat4x4<f32> (align 16, size 64)
|
|
18
|
+
// [ 16.. 19) lightDir vec3<f32> (align 16, 12 + 4 pad)
|
|
19
|
+
// [ 20.. 22) lightColor vec3<f32> (align 16, 12 + 4 pad)
|
|
20
|
+
// [ 24.. 26) cameraPos vec3<f32> (align 16, 12 + 4 pad)
|
|
21
|
+
// [ 28.. 43) lightViewProj[0] mat4x4<f32> (align 16, size 64)
|
|
22
|
+
// [ 44.. 59) inverseViewProj ma4x4<f32> (align 16, size 64)
|
|
23
|
+
// [ 60.. 75] lightViewProj[1] mat4x4<f32> (align 16, size 64)
|
|
24
|
+
// [ 76.. 91) lightViewProj[2] mat4x4<f32> (align 16, size 64)
|
|
25
|
+
// [ 92..107) lightViewProj[3] mat4x4<f32> (align 16, size 64)
|
|
26
|
+
// [108..111) splitPlanes[0] f32 + 12 pad (vec4 wrapper, 16 B)
|
|
27
|
+
// [112..115) splitPlanes[1] f32 + 12 pad (vec4 wrapper, 16 B)
|
|
28
|
+
// [116..119) splitPlanes[2] f32 + 12 pad (vec4 wrapper, 16 B)
|
|
29
|
+
// [120..123) splitPlanes[3] f32 + 12 pad (vec4 wrapper, 16 B)
|
|
30
|
+
// [124] cascadeCount f32 (align 4, size 4)
|
|
31
|
+
// [125] cascadeBlend f32 (align 4, size 4)
|
|
32
|
+
// [126] depthBias f32 (align 4, size 4)
|
|
33
|
+
// [127] normalBias f32 (align 4, size 4)
|
|
34
|
+
// [128] pcfKernelSize f32 (align 4, size 4)
|
|
35
|
+
// [129..131] align padding f32[3] (mat4 array align 16)
|
|
36
|
+
// [132..195] spotLightViewProj array<mat4x4<f32>,4> (align 16, size 256)
|
|
37
|
+
|
|
38
|
+
import { readFileSync } from 'node:fs';
|
|
39
|
+
import { fileURLToPath } from 'node:url';
|
|
40
|
+
import { describe, expect, it } from 'vitest';
|
|
41
|
+
|
|
42
|
+
const VIEW_UBO_FLOAT_COUNT = 196;
|
|
43
|
+
const VIEW_UBO_BYTES = 784;
|
|
44
|
+
// feat-20260625 w25: spot lightViewProj array folded into the View UBO tail.
|
|
45
|
+
const OFFSET_SPOT_LIGHT_VIEW_PROJ = 132; // byte 528 (16 B-aligned after pcfKernelSize)
|
|
46
|
+
const SPOT_LVP_LANE_COUNT = 4;
|
|
47
|
+
const SPOT_LVP_FLOATS_PER_LANE = 16;
|
|
48
|
+
|
|
49
|
+
// feat-20260621-merge-directionallightshadow-into-directionallight M3:
|
|
50
|
+
// the merged DirectionalLight's shadow tail-pad slots — depthBias [126]/byte504,
|
|
51
|
+
// normalBias [127]/byte508, pcfKernelSize [128]/byte512 (zero byte-layout growth;
|
|
52
|
+
// three previously-zero tail-pad floats are consumed). The 5.3-production-shadow-
|
|
53
|
+
// demos AC-14 pcfKernelSize lane moved from [126] to [128] when depthBias/normalBias
|
|
54
|
+
// merged in ahead of it.
|
|
55
|
+
const OFFSET_DEPTH_BIAS = 126; // byte 504
|
|
56
|
+
const OFFSET_NORMAL_BIAS = 127; // byte 508
|
|
57
|
+
const OFFSET_PCF_KERNEL_SIZE = 128; // byte 512
|
|
58
|
+
|
|
59
|
+
const F32_BYTES = 4;
|
|
60
|
+
|
|
61
|
+
// Offsets as f32 indices.
|
|
62
|
+
const OFFSET_LIGHT_VIEW_PROJ_0 = 28; // byte 112
|
|
63
|
+
const OFFSET_LIGHT_VIEW_PROJ_1 = 60; // byte 240
|
|
64
|
+
const OFFSET_LIGHT_VIEW_PROJ_2 = 76; // byte 304
|
|
65
|
+
const OFFSET_LIGHT_VIEW_PROJ_3 = 92; // byte 368
|
|
66
|
+
const OFFSET_INVERSE_VIEW_PROJ = 44; // byte 176
|
|
67
|
+
const OFFSET_SPLIT_PLANES_0 = 108; // byte 432
|
|
68
|
+
const OFFSET_SPLIT_PLANES_1 = 112; // byte 448
|
|
69
|
+
const OFFSET_SPLIT_PLANES_2 = 116; // byte 464
|
|
70
|
+
const OFFSET_SPLIT_PLANES_3 = 120; // byte 480
|
|
71
|
+
const OFFSET_CASCADE_COUNT = 124; // byte 496
|
|
72
|
+
const OFFSET_CASCADE_BLEND = 125; // byte 500
|
|
73
|
+
|
|
74
|
+
// Each split occupies a whole vec4 slot (16 B = 4 f32), even though only
|
|
75
|
+
// the .x component carries the depth value. The remaining 3 f32 lanes are
|
|
76
|
+
// padding to satisfy std140 alignment (f32 in a struct after mat4 arrays
|
|
77
|
+
// requires vec4-level stride).
|
|
78
|
+
const SPLIT_STRIDE_FLOATS = 4;
|
|
79
|
+
|
|
80
|
+
describe('View UBO std140 layout (w14)', () => {
|
|
81
|
+
describe('size invariants', () => {
|
|
82
|
+
it('UBO total size is 784 B (196 f32)', () => {
|
|
83
|
+
expect(VIEW_UBO_FLOAT_COUNT).toBe(196);
|
|
84
|
+
expect(VIEW_UBO_BYTES).toBe(VIEW_UBO_FLOAT_COUNT * F32_BYTES);
|
|
85
|
+
expect(VIEW_UBO_BYTES).toBe(784);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('UBO size is fixed — independent of cascadeCount', () => {
|
|
89
|
+
// The host always allocates 784 B regardless of whether cascadeCount
|
|
90
|
+
// is 1, 2, 3, or 4 at runtime. This validates AC-08.
|
|
91
|
+
const sizeForN1 = VIEW_UBO_FLOAT_COUNT * F32_BYTES; // cascadeCount=1
|
|
92
|
+
const sizeForN4 = VIEW_UBO_FLOAT_COUNT * F32_BYTES; // cascadeCount=4
|
|
93
|
+
expect(sizeForN1).toBe(sizeForN4);
|
|
94
|
+
expect(sizeForN1).toBe(784);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('spotLightViewProj array lands at byte 528 (float 132), 16 B-aligned, last field', () => {
|
|
98
|
+
// feat-20260625 w25: the 4-lane spot perspective matrix array folds into
|
|
99
|
+
// the View UBO tail after pcfKernelSize (float 128 / byte 512), 16 B-aligned
|
|
100
|
+
// so it starts at byte 528 (float 132). It is the last struct field.
|
|
101
|
+
expect(OFFSET_SPOT_LIGHT_VIEW_PROJ * F32_BYTES).toBe(528);
|
|
102
|
+
expect((OFFSET_SPOT_LIGHT_VIEW_PROJ * F32_BYTES) % 16).toBe(0);
|
|
103
|
+
const spotArrayEndFloat =
|
|
104
|
+
OFFSET_SPOT_LIGHT_VIEW_PROJ + SPOT_LVP_LANE_COUNT * SPOT_LVP_FLOATS_PER_LANE;
|
|
105
|
+
expect(spotArrayEndFloat).toBe(VIEW_UBO_FLOAT_COUNT);
|
|
106
|
+
expect(spotArrayEndFloat * F32_BYTES).toBe(784);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe('std140 byte offsets', () => {
|
|
111
|
+
it('lightViewProj[0] at offset 112 B (f32 index 28)', () => {
|
|
112
|
+
expect(OFFSET_LIGHT_VIEW_PROJ_0 * F32_BYTES).toBe(112);
|
|
113
|
+
// lightViewProj[0] replaces lightSpaceMatrix slot.
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('lightViewProj[1] at offset 240 B (f32 index 60)', () => {
|
|
117
|
+
expect(OFFSET_LIGHT_VIEW_PROJ_1 * F32_BYTES).toBe(240);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('lightViewProj[2] at offset 304 B (f32 index 76)', () => {
|
|
121
|
+
expect(OFFSET_LIGHT_VIEW_PROJ_2 * F32_BYTES).toBe(304);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('lightViewProj[3] at offset 368 B (f32 index 92)', () => {
|
|
125
|
+
expect(OFFSET_LIGHT_VIEW_PROJ_3 * F32_BYTES).toBe(368);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('lightViewProj[4] data is 256 B (4 x 64 B mat4)', () => {
|
|
129
|
+
// Each lightViewProj matrix is 64 B (16 f32). lightViewProj[0]
|
|
130
|
+
// replaces lightSpaceMatrix at [28..43]; [1,2,3] append after
|
|
131
|
+
// inverseViewProj at [60..107]. The total data payload across the
|
|
132
|
+
// 4 slots is 4 × 64 = 256 B — inverseViewProj (64 B) sits
|
|
133
|
+
// between slot 0 and slots 1-3.
|
|
134
|
+
const perMatrixF32 = 16;
|
|
135
|
+
const perMatrixBytes = perMatrixF32 * F32_BYTES;
|
|
136
|
+
expect(perMatrixBytes).toBe(64);
|
|
137
|
+
const totalDataBytes = 4 * perMatrixBytes;
|
|
138
|
+
expect(totalDataBytes).toBe(256);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('splitPlanes[0] at offset 432 B (f32 index 108)', () => {
|
|
142
|
+
expect(OFFSET_SPLIT_PLANES_0 * F32_BYTES).toBe(432);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('splitPlanes[1] at offset 448 B (f32 index 112)', () => {
|
|
146
|
+
expect(OFFSET_SPLIT_PLANES_1 * F32_BYTES).toBe(448);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('splitPlanes[2] at offset 464 B (f32 index 116)', () => {
|
|
150
|
+
expect(OFFSET_SPLIT_PLANES_2 * F32_BYTES).toBe(464);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('splitPlanes[3] at offset 480 B (f32 index 120)', () => {
|
|
154
|
+
expect(OFFSET_SPLIT_PLANES_3 * F32_BYTES).toBe(480);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('splitPlanes stride is 16 B (vec4-aligned)', () => {
|
|
158
|
+
expect(OFFSET_SPLIT_PLANES_1 - OFFSET_SPLIT_PLANES_0).toBe(SPLIT_STRIDE_FLOATS);
|
|
159
|
+
expect(OFFSET_SPLIT_PLANES_2 - OFFSET_SPLIT_PLANES_1).toBe(SPLIT_STRIDE_FLOATS);
|
|
160
|
+
expect(OFFSET_SPLIT_PLANES_3 - OFFSET_SPLIT_PLANES_2).toBe(SPLIT_STRIDE_FLOATS);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('splitPlanes[4] spans 64 B (4 x 16 B vec4 stride)', () => {
|
|
164
|
+
const start = OFFSET_SPLIT_PLANES_0;
|
|
165
|
+
const end = OFFSET_SPLIT_PLANES_3 + SPLIT_STRIDE_FLOATS;
|
|
166
|
+
expect((end - start) * F32_BYTES).toBe(64);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('cascadeCount at offset 496 B (f32 index 124)', () => {
|
|
170
|
+
expect(OFFSET_CASCADE_COUNT * F32_BYTES).toBe(496);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('cascadeBlend at offset 500 B (f32 index 125)', () => {
|
|
174
|
+
expect(OFFSET_CASCADE_BLEND * F32_BYTES).toBe(500);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('inverseViewProj at offset 176 B (f32 index 44) — unchanged', () => {
|
|
178
|
+
// inverseViewProj keeps its existing position; lightViewProj[0]
|
|
179
|
+
// replaces lightSpaceMatrix at [28..43], inverseViewProj stays at
|
|
180
|
+
// [44..59]. The new 3 lightViewProj matrices are appended after.
|
|
181
|
+
expect(OFFSET_INVERSE_VIEW_PROJ * F32_BYTES).toBe(176);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
describe('std140 alignment paper verify', () => {
|
|
186
|
+
it('mat4 alignment is 16 B', () => {
|
|
187
|
+
// All mat4x4<f32> slots start at 16B-aligned offsets.
|
|
188
|
+
const mat4Offsets = [
|
|
189
|
+
OFFSET_LIGHT_VIEW_PROJ_0 * F32_BYTES,
|
|
190
|
+
OFFSET_INVERSE_VIEW_PROJ * F32_BYTES,
|
|
191
|
+
OFFSET_LIGHT_VIEW_PROJ_1 * F32_BYTES,
|
|
192
|
+
OFFSET_LIGHT_VIEW_PROJ_2 * F32_BYTES,
|
|
193
|
+
OFFSET_LIGHT_VIEW_PROJ_3 * F32_BYTES,
|
|
194
|
+
];
|
|
195
|
+
for (const off of mat4Offsets) {
|
|
196
|
+
expect(off % 16).toBe(0);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it('f32 after mat4 array gets vec4 stride (16 B)', () => {
|
|
201
|
+
// std140: f32 following a mat4 (or vec4) aligns to vec4 level.
|
|
202
|
+
// Each splitPlanes element is 16 B wide even though only 4 B (f32)
|
|
203
|
+
// carries data — the compiler pads to vec4 boundaries.
|
|
204
|
+
const splitStart = OFFSET_SPLIT_PLANES_0 * F32_BYTES;
|
|
205
|
+
expect(splitStart % 16).toBe(0);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('cascadeCount f32 at offset 496 is 16 B after splitPlanes end at 480', () => {
|
|
209
|
+
const splitEnd = (OFFSET_SPLIT_PLANES_3 + SPLIT_STRIDE_FLOATS) * F32_BYTES;
|
|
210
|
+
const ccStart = OFFSET_CASCADE_COUNT * F32_BYTES;
|
|
211
|
+
expect(ccStart).toBe(splitEnd);
|
|
212
|
+
// f32 after vec4: align is 4, so cascadeCount starts right after splitPlanes
|
|
213
|
+
// (no extra gap needed since 496 / 4 = 124 is an integer index)
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it('struct tail aligned to 16 B', () => {
|
|
217
|
+
// Total UBO bytes must be 16B-aligned for uniform buffer binding.
|
|
218
|
+
expect(VIEW_UBO_BYTES % 16).toBe(0);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
// feat-20260621-learn-render-5-3-production-shadow-demos M0 / AC-14: the host
|
|
224
|
+
// record stage must write pcfKernelSize into the tail-pad slot [126], and the
|
|
225
|
+
// WGSL View struct must declare the matching `pcfKernelSize : f32` immediately
|
|
226
|
+
// after cascadeBlend (single SSOT, append-at-tail, plan-strategy D-0). These
|
|
227
|
+
// are read against the real source the compiler/host use (mirrors the
|
|
228
|
+
// shadow-csm-tile-consistency antipattern guard: never re-declare and test a
|
|
229
|
+
// formula against itself). RED until M0-T-IMPL-RECORD + M0-T-IMPL-WGSL-STRUCT
|
|
230
|
+
// land; the slot was previously a zero tail-pad float (no record write existed).
|
|
231
|
+
describe('pcfKernelSize tail-pad slot wiring (M0, AC-14)', () => {
|
|
232
|
+
const recordSrc = readFileSync(
|
|
233
|
+
fileURLToPath(new URL('../../../render/src/record/view-ubo.ts', import.meta.url)),
|
|
234
|
+
'utf8',
|
|
235
|
+
);
|
|
236
|
+
const wgslSrc = readFileSync(
|
|
237
|
+
fileURLToPath(new URL('../../../shader/src/common.wgsl', import.meta.url)),
|
|
238
|
+
'utf8',
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
it('shadow tail floats [126..128] at fixed offsets, before the spot matrix array', () => {
|
|
242
|
+
expect(OFFSET_DEPTH_BIAS * F32_BYTES).toBe(504);
|
|
243
|
+
expect(OFFSET_NORMAL_BIAS * F32_BYTES).toBe(508);
|
|
244
|
+
expect(OFFSET_PCF_KERNEL_SIZE * F32_BYTES).toBe(512);
|
|
245
|
+
expect(OFFSET_DEPTH_BIAS).toBeGreaterThan(OFFSET_CASCADE_BLEND);
|
|
246
|
+
expect(OFFSET_PCF_KERNEL_SIZE).toBeLessThan(VIEW_UBO_FLOAT_COUNT);
|
|
247
|
+
// feat-20260625 w25: the shadow bias floats stay at [126..128]; the spot
|
|
248
|
+
// matrix array follows them at float 132 (byte 528). The struct grew to
|
|
249
|
+
// 196 f32 / 784 B to carry the folded-in spot matrices (was 148 / 592).
|
|
250
|
+
expect(OFFSET_PCF_KERNEL_SIZE).toBeLessThan(OFFSET_SPOT_LIGHT_VIEW_PROJ);
|
|
251
|
+
expect(VIEW_UBO_FLOAT_COUNT).toBe(196);
|
|
252
|
+
expect(VIEW_UBO_BYTES).toBe(784);
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it('record writes the merged shadow tail-pad floats [126]/[127]/[128]', () => {
|
|
256
|
+
expect(recordSrc).toMatch(/viewPayload\[126\]\s*=\s*lights\.depthBias/);
|
|
257
|
+
expect(recordSrc).toMatch(/viewPayload\[127\]\s*=\s*lights\.normalBias/);
|
|
258
|
+
expect(recordSrc).toMatch(
|
|
259
|
+
/viewPayload\[128\]\s*=\s*clampPcfKernelSize\(lights\.pcfKernelSize\)/,
|
|
260
|
+
);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it('record appends two temporal view-projection matrices after the folded spot matrices', () => {
|
|
264
|
+
// feat-20260625 w25: the per-spot fragment-read lightViewProj matrices fold
|
|
265
|
+
// into the View UBO tail, so VIEW_PAYLOAD_FLOATS now includes temporal
|
|
266
|
+
// projection and Fog lanes after the folded matrices.
|
|
267
|
+
expect(recordSrc).toMatch(/VIEW_PAYLOAD_FLOATS\s*=\s*240/);
|
|
268
|
+
// The spot matrix array is written at base float 132.
|
|
269
|
+
expect(recordSrc).toMatch(/SPOT_LVP_BASE_FLOAT\s*=\s*132/);
|
|
270
|
+
expect(recordSrc).toContain('viewPayload[196 + index]');
|
|
271
|
+
expect(recordSrc).toContain('viewPayload[212 + index]');
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
it('common.wgsl View struct declares depthBias/normalBias/pcfKernelSize after cascadeBlend', () => {
|
|
275
|
+
const m = wgslSrc.match(
|
|
276
|
+
/cascadeBlend\s*:\s*f32\s*,\s*depthBias\s*:\s*f32\s*,\s*normalBias\s*:\s*f32\s*,\s*pcfKernelSize\s*:\s*f32\s*,/,
|
|
277
|
+
);
|
|
278
|
+
expect(m).not.toBeNull();
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
describe('Fog View ABI host shape (M2)', () => {
|
|
283
|
+
const recordSrc = readFileSync(
|
|
284
|
+
fileURLToPath(new URL('../../../render/src/record/view-ubo.ts', import.meta.url)),
|
|
285
|
+
'utf8',
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
it('uses the current host payload shape rather than the stale 784 B prefix', () => {
|
|
289
|
+
expect(recordSrc).toMatch(/VIEW_UNIFORM_BYTES\s*=\s*960/);
|
|
290
|
+
expect(recordSrc).toMatch(/VIEW_PAYLOAD_FLOATS\s*=\s*240/);
|
|
291
|
+
expect(recordSrc).not.toContain('VIEW_UNIFORM_BYTES = 928');
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it('packs all four Fog parameters in the View write path', () => {
|
|
295
|
+
expect(recordSrc).toContain('fog.color');
|
|
296
|
+
expect(recordSrc).toContain('fog.density');
|
|
297
|
+
expect(recordSrc).toContain('fog.heightFalloff');
|
|
298
|
+
expect(recordSrc).toContain('fog.maxOpacity');
|
|
299
|
+
});
|
|
300
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// shadow-csm-viewport.browser.test.ts - feat-20260613-csm-cascaded-shadow-maps-unique-shadow-path
|
|
2
|
+
// M3 / w30: per-cascade viewport browser integration test.
|
|
3
|
+
//
|
|
4
|
+
// Verifies that N=4 CSM shadow passes execute with distinct per-cascade
|
|
5
|
+
// viewport parameters (atlas tile clipping). Dawn-node cannot exercise
|
|
6
|
+
// browser-only WebGPU validation (typed-array survival, BGL shape mismatch,
|
|
7
|
+
// setViewport against atlas-sized target), so this browser test covers the
|
|
8
|
+
// real GPU path.
|
|
9
|
+
//
|
|
10
|
+
// AC-05: atlas tile viewports; D-5: cascadeCount=4 → 4 addShadowPass calls;
|
|
11
|
+
// D-6: pass names shadowCascade0..3.
|
|
12
|
+
|
|
13
|
+
import { describe, expect, it } from 'vitest';
|
|
14
|
+
|
|
15
|
+
const browserReady = typeof navigator !== 'undefined' && navigator.gpu !== undefined;
|
|
16
|
+
|
|
17
|
+
describe('CSM per-cascade viewport (w30)', () => {
|
|
18
|
+
describe('atlas layout contract (structural)', () => {
|
|
19
|
+
it('tilesPerSide = ceil(sqrt(cascadeCount)) for N=1..4', () => {
|
|
20
|
+
// Verify the atlas tile-grid formula independently of the renderer.
|
|
21
|
+
// col = i % tilesPerSide, row = floor(i / tilesPerSide).
|
|
22
|
+
const ceilSqrt = (n: number) => Math.ceil(Math.sqrt(n));
|
|
23
|
+
expect(ceilSqrt(1)).toBe(1);
|
|
24
|
+
expect(ceilSqrt(2)).toBe(2);
|
|
25
|
+
expect(ceilSqrt(3)).toBe(2);
|
|
26
|
+
expect(ceilSqrt(4)).toBe(2);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it.skipIf(!browserReady)(
|
|
30
|
+
'N=4: atlasSize = 2 * mapSize (atlas is 2x2 grid of mapSize tiles)',
|
|
31
|
+
() => {
|
|
32
|
+
const mapSize = 2048;
|
|
33
|
+
const cascadeCount = 4;
|
|
34
|
+
const tilesPerSide = Math.ceil(Math.sqrt(cascadeCount));
|
|
35
|
+
const atlasSize = tilesPerSide * mapSize;
|
|
36
|
+
expect(tilesPerSide).toBe(2);
|
|
37
|
+
expect(atlasSize).toBe(mapSize * 2);
|
|
38
|
+
},
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
it.skipIf(!browserReady)('N=4: 4 distinct viewport positions covering atlas quadrants', () => {
|
|
42
|
+
const mapSize = 2048;
|
|
43
|
+
const tilesPerSide = 2;
|
|
44
|
+
const viewports: Array<{ x: number; y: number }> = [];
|
|
45
|
+
for (let i = 0; i < 4; i++) {
|
|
46
|
+
viewports.push({
|
|
47
|
+
x: (i % tilesPerSide) * mapSize,
|
|
48
|
+
y: Math.floor(i / tilesPerSide) * mapSize,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// All 4 tiles have distinct origins.
|
|
52
|
+
const originSet = new Set(viewports.map((vp) => `${vp.x},${vp.y}`));
|
|
53
|
+
expect(originSet.size).toBe(4);
|
|
54
|
+
// Each viewport covers exactly mapSize x mapSize area within atlas.
|
|
55
|
+
for (const vp of viewports) {
|
|
56
|
+
expect(vp.x + mapSize).toBeLessThanOrEqual(mapSize * 2);
|
|
57
|
+
expect(vp.y + mapSize).toBeLessThanOrEqual(mapSize * 2);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('N=1: single cascade returns to non-CSM baseline (cascadeCount=1)', () => {
|
|
62
|
+
const tilesPerSide = Math.ceil(Math.sqrt(1));
|
|
63
|
+
expect(tilesPerSide).toBe(1);
|
|
64
|
+
// atlasSize = mapSize when cascadeCount=1 (single tile, no grid).
|
|
65
|
+
const mapSize = 2048;
|
|
66
|
+
const atlasSize = tilesPerSide * mapSize;
|
|
67
|
+
expect(atlasSize).toBe(mapSize);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('per-cascade viewport w/h always equals mapSize, never atlasSize', () => {
|
|
71
|
+
const mapSize = 2048;
|
|
72
|
+
for (const n of [1, 2, 3, 4]) {
|
|
73
|
+
const tilesPerSide = Math.ceil(Math.sqrt(n));
|
|
74
|
+
for (let i = 0; i < n; i++) {
|
|
75
|
+
// viewport dimensions are per-tile (mapSize), not atlas-dimension.
|
|
76
|
+
const vpW = mapSize;
|
|
77
|
+
const vpH = mapSize;
|
|
78
|
+
expect(vpW).toBe(mapSize);
|
|
79
|
+
expect(vpH).toBe(mapSize);
|
|
80
|
+
}
|
|
81
|
+
void tilesPerSide;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|