@forgeax/engine-runtime 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -83
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-serialize.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-serialize.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts +2 -0
- package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts.map +1 -0
- package/dist/__tests__/asset-error-exhaustive.test-d.d.ts +11 -0
- package/dist/__tests__/asset-error-exhaustive.test-d.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-guid-reverse.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-guid-reverse.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-mounts.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-mounts.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.browser.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.browser.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.dawn.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.listCatalog.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.listCatalog.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.mesh-bin.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.mesh-bin.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.pack-cache.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.pack-cache.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.recursive.spec.d.ts +2 -0
- package/dist/__tests__/asset-registry.recursive.spec.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset.unit.test.d.ts +2 -0
- package/dist/__tests__/asset.unit.test.d.ts.map +1 -0
- package/dist/__tests__/audio-load-by-guid.unit.test.d.ts +2 -0
- package/dist/__tests__/audio-load-by-guid.unit.test.d.ts.map +1 -0
- package/dist/__tests__/backend-selection.integration.test.d.ts +2 -0
- package/dist/__tests__/backend-selection.integration.test.d.ts.map +1 -0
- package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts +2 -0
- package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts.map +1 -0
- package/dist/__tests__/builtin-asset-registry.unit.test.d.ts +2 -0
- package/dist/__tests__/builtin-asset-registry.unit.test.d.ts.map +1 -0
- package/dist/__tests__/collect-scene-asset.test.d.ts +1 -2
- package/dist/__tests__/collect-scene-asset.test.d.ts.map +1 -1
- package/dist/__tests__/collect-scene-mount-collapse.test.d.ts +2 -0
- package/dist/__tests__/collect-scene-mount-collapse.test.d.ts.map +1 -0
- package/dist/__tests__/collect-transient-roundtrip.test.d.ts +1 -1
- package/dist/__tests__/collect-transient-roundtrip.test.d.ts.map +1 -1
- package/dist/__tests__/collect-transient-skip.test.d.ts +1 -2
- package/dist/__tests__/collect-transient-skip.test.d.ts.map +1 -1
- package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts +2 -0
- package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/draw-published.d.ts +2 -2
- package/dist/__tests__/draw-published.d.ts.map +1 -1
- package/dist/__tests__/dynamic-texture-store.unit.test.d.ts +2 -0
- package/dist/__tests__/dynamic-texture-store.unit.test.d.ts.map +1 -0
- package/dist/__tests__/errors.unit.test.d.ts +2 -0
- package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
- package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts +2 -0
- package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts.map +1 -0
- package/dist/__tests__/fetch-binary-decompress.test.d.ts +2 -0
- package/dist/__tests__/fetch-binary-decompress.test.d.ts.map +1 -0
- package/dist/__tests__/four-path-compression.integration.test.d.ts +2 -0
- package/dist/__tests__/four-path-compression.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/guid-for-asset.unit.test.d.ts +2 -0
- package/dist/__tests__/guid-for-asset.unit.test.d.ts.map +1 -0
- package/dist/__tests__/handle-migration.test.d.ts +2 -0
- package/dist/__tests__/handle-migration.test.d.ts.map +1 -0
- package/dist/__tests__/helpers/register-runtime-components.d.ts.map +1 -1
- package/dist/__tests__/host-custom-kind-contract.test-d.d.ts +2 -0
- package/dist/__tests__/host-custom-kind-contract.test-d.d.ts.map +1 -0
- package/dist/__tests__/host-custom-kind-contract.test.d.ts +2 -0
- package/dist/__tests__/host-custom-kind-contract.test.d.ts.map +1 -0
- package/dist/__tests__/inspect-name.test.d.ts +2 -0
- package/dist/__tests__/inspect-name.test.d.ts.map +1 -0
- package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts +2 -0
- package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts.map +1 -0
- package/dist/__tests__/loadbyguid-payload.unit.test.d.ts +2 -0
- package/dist/__tests__/loadbyguid-payload.unit.test.d.ts.map +1 -0
- package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts +2 -0
- package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts.map +1 -0
- package/dist/__tests__/loader-extract-graceful.test.d.ts +2 -0
- package/dist/__tests__/loader-extract-graceful.test.d.ts.map +1 -0
- package/dist/__tests__/loader-name-survival.test.d.ts +2 -0
- package/dist/__tests__/loader-name-survival.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-bin-contract.test.d.ts +2 -0
- package/dist/__tests__/mesh-bin-contract.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-bin.test.d.ts +2 -0
- package/dist/__tests__/mesh-bin.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/new-kind-refs-contract.test.d.ts +2 -0
- package/dist/__tests__/new-kind-refs-contract.test.d.ts.map +1 -0
- package/dist/__tests__/package-promotion.test.d.ts +2 -0
- package/dist/__tests__/package-promotion.test.d.ts.map +1 -0
- package/dist/__tests__/package-rename.test.d.ts +2 -0
- package/dist/__tests__/package-rename.test.d.ts.map +1 -0
- package/dist/__tests__/recover-error-exhaustive.test-d.d.ts +1 -1
- package/dist/__tests__/recover-error-exhaustive.test-d.d.ts.map +1 -1
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts +1 -1
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -1
- package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts +10 -0
- package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts.map +1 -0
- package/dist/__tests__/render-system-extract.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-extract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-test-utils.d.ts +10 -0
- package/dist/__tests__/renderer-test-utils.d.ts.map +1 -0
- package/dist/__tests__/renderer.test-d.d.ts +2 -0
- package/dist/__tests__/renderer.test-d.d.ts.map +1 -0
- package/dist/__tests__/resolve-asset-handle-err.test.d.ts +2 -0
- package/dist/__tests__/resolve-asset-handle-err.test.d.ts.map +1 -0
- package/dist/__tests__/resolve-asset-handle.unit.test.d.ts +2 -0
- package/dist/__tests__/resolve-asset-handle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName-fallback.test.d.ts +2 -0
- package/dist/__tests__/resolveName-fallback.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName-null-package.test.d.ts +2 -0
- package/dist/__tests__/resolveName-null-package.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName-unified-entry.test.d.ts +2 -0
- package/dist/__tests__/resolveName-unified-entry.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName.test.d.ts +2 -0
- package/dist/__tests__/resolveName.test.d.ts.map +1 -0
- package/dist/__tests__/roots-to-scene-asset.test.d.ts +1 -1
- package/dist/__tests__/roots-to-scene-asset.test.d.ts.map +1 -1
- package/dist/__tests__/roundtrip-primitive.test.d.ts +2 -0
- package/dist/__tests__/roundtrip-primitive.test.d.ts.map +1 -0
- package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts +2 -0
- package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts.map +1 -0
- package/dist/__tests__/scene-instance-authoring.integration.test.d.ts +2 -0
- package/dist/__tests__/scene-instance-authoring.integration.test.d.ts.map +1 -0
- package/dist/__tests__/scene-mount-fixed-point.test.d.ts +2 -0
- package/dist/__tests__/scene-mount-fixed-point.test.d.ts.map +1 -0
- package/dist/__tests__/scene-mount-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/scene-mount-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/scene-sugar-instantiate.test.d.ts +2 -0
- package/dist/__tests__/scene-sugar-instantiate.test.d.ts.map +1 -0
- package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/serialize-scene-asset.test.d.ts +1 -1
- package/dist/__tests__/serialize-scene-asset.test.d.ts.map +1 -1
- package/dist/__tests__/template-game-default-api-contract.test.d.ts +2 -0
- package/dist/__tests__/template-game-default-api-contract.test.d.ts.map +1 -0
- package/dist/__tests__/tileset-asset-validate.test.d.ts +2 -0
- package/dist/__tests__/tileset-asset-validate.test.d.ts.map +1 -0
- package/dist/__tests__/transcode-fallback.unit.test.d.ts +2 -0
- package/dist/__tests__/transcode-fallback.unit.test.d.ts.map +1 -0
- package/dist/__tests__/transient-runtime-behavior.test.d.ts +2 -0
- package/dist/__tests__/transient-runtime-behavior.test.d.ts.map +1 -0
- package/dist/__tests__/video-loader-consumption.test.d.ts +2 -0
- package/dist/__tests__/video-loader-consumption.test.d.ts.map +1 -0
- package/dist/__tests__/video-loader-smoke.dawn.test.d.ts +2 -0
- package/dist/__tests__/video-loader-smoke.dawn.test.d.ts.map +1 -0
- package/dist/backend-selection.d.ts +13 -0
- package/dist/backend-selection.d.ts.map +1 -0
- package/dist/collect-scene-asset.d.ts +3 -3
- package/dist/collect-scene-asset.d.ts.map +1 -1
- package/dist/createRenderer.d.ts +14 -2
- package/dist/createRenderer.d.ts.map +1 -1
- package/dist/errors/environment.d.ts +1 -1
- package/dist/errors/environment.d.ts.map +1 -1
- package/dist/index.d.ts +19 -81
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +105 -108
- package/dist/index.mjs.map +1 -1
- package/dist/renderer-host.d.ts +9 -0
- package/dist/renderer-host.d.ts.map +1 -0
- package/dist/renderer-host.mjs +62 -0
- package/dist/renderer-host.mjs.map +1 -0
- package/dist/scene-instances/index.d.ts +2 -0
- package/dist/scene-instances/index.d.ts.map +1 -0
- package/dist/scene-utils/mount-override-fold.d.ts +1 -2
- package/dist/scene-utils/mount-override-fold.d.ts.map +1 -1
- package/dist/systems/sprite-animation-tick.d.ts +1 -1
- package/dist/systems/sprite-animation-tick.d.ts.map +1 -1
- package/dist/systems/transparent-sort.d.ts +1 -2
- package/dist/systems/transparent-sort.d.ts.map +1 -1
- package/dist/tilemap-register-validate.d.ts.map +1 -1
- package/package.json +34 -33
- package/src/__tests__/active-camera.unit.test.ts +19 -9
- package/src/__tests__/animation-graph-collect-roundtrip.test.ts +213 -0
- package/src/__tests__/animation-graph-serialize.unit.test.ts +171 -0
- package/src/__tests__/append-injection.test.ts +1 -1
- package/src/__tests__/asset-brand-and-name-retirement.test.ts +102 -0
- package/src/__tests__/asset-error-exhaustive.test-d.ts +62 -0
- package/src/__tests__/asset-registry-guid-reverse.test.ts +575 -0
- package/src/__tests__/asset-registry-hdr-equirect.test.ts +78 -0
- package/src/__tests__/asset-registry-mesh-pack-payload.dawn.test.ts +232 -0
- package/src/__tests__/asset-registry-mounts.test.ts +806 -0
- package/src/__tests__/asset-registry.browser.test.ts +81 -0
- package/src/__tests__/asset-registry.dawn.test.ts +94 -0
- package/src/__tests__/asset-registry.listCatalog.test.ts +170 -0
- package/src/__tests__/asset-registry.mesh-bin.test.ts +316 -0
- package/src/__tests__/asset-registry.pack-cache.test.ts +969 -0
- package/src/__tests__/asset-registry.raw-container-failfast.test.ts +225 -0
- package/src/__tests__/asset-registry.recursive.spec.ts +1397 -0
- package/src/__tests__/asset-registry.unit.test.ts +1030 -0
- package/src/__tests__/asset.unit.test.ts +7107 -0
- package/src/__tests__/audio-load-by-guid.unit.test.ts +126 -0
- package/src/__tests__/backend-selection.integration.test.ts +11 -0
- package/src/__tests__/basis-catalog-dispatch.integration.test.ts +320 -0
- package/src/__tests__/bind-group-cache-keying.test.ts +4 -4
- package/src/__tests__/block-upload-math.unit.test.ts +2 -2
- package/src/__tests__/builtin-asset-registry.unit.test.ts +112 -0
- package/src/__tests__/builtin-shader-register-e2e.test.ts +1 -1
- package/src/__tests__/cache-false-eviction.test.ts +2 -1
- package/src/__tests__/cache-isolation-matrix.test.ts +2 -1
- package/src/__tests__/camera-clear-snapshot-equivalence.unit.test.ts +5 -6
- package/src/__tests__/clamp-to-last.e2e.browser.test.ts +29 -19
- package/src/__tests__/collect-scene-asset.test.ts +49 -52
- package/src/__tests__/collect-scene-mount-collapse.test.ts +391 -0
- package/src/__tests__/collect-subtree.unit.test.ts +1 -2
- package/src/__tests__/collect-transient-children-absent.test.ts +24 -10
- package/src/__tests__/collect-transient-roundtrip.test.ts +44 -20
- package/src/__tests__/collect-transient-skip.test.ts +24 -13
- package/src/__tests__/components.test-d.ts +1 -6
- package/src/__tests__/components.unit.test.ts +20 -19
- package/src/__tests__/composite-skybox-cross-world.browser.test.ts +59 -27
- package/src/__tests__/compressed-texture-physical-extent.integration.test.ts +139 -0
- package/src/__tests__/create-renderer-assembly.integration.test.ts +42 -29
- package/src/__tests__/createRenderer-dispose.test.ts +35 -402
- package/src/__tests__/createRenderer.browser-no-webgpu.test.ts +25 -30
- package/src/__tests__/createRenderer.unit.test.ts +1 -1
- package/src/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.ts +27 -63
- package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +56 -47
- package/src/__tests__/dawn/instances-per-instance-pbr.dawn.test.ts +49 -29
- package/src/__tests__/dawn/instances-shadow.dawn.test.ts +26 -15
- package/src/__tests__/dawn/instances-uniform-fallback.dawn.test.ts +13 -14
- package/src/__tests__/dawn/material-alpha.dawn.test.ts +23 -31
- package/src/__tests__/dawn/material-cooked-fixture.dawn.test.ts +0 -18
- package/src/__tests__/dawn/{mesh-update.dawn.test.ts → mesh-update-dawn.test.ts} +42 -134
- package/src/__tests__/dawn/mipmap-srgb-linear.dawn.test.ts +14 -7
- package/src/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.ts +16 -28
- package/src/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.ts +23 -39
- package/src/__tests__/dawn/upload-texture.dawn.test.ts +198 -0
- package/src/__tests__/dawn/user-handle-mesh-render.dawn.test.ts +12 -14
- package/src/__tests__/dawn/user-mesh-upload.dawn.test.ts +27 -22
- package/src/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.ts +25 -28
- package/src/__tests__/dawn/zero-manifest-ready.dawn.test.ts +10 -11
- package/src/__tests__/demo-sortscope-migration.unit.test.ts +5 -5
- package/src/__tests__/derive-bgl-integration.test.ts +34 -44
- package/src/__tests__/derive-render-data-skin.unit.test.ts +1 -1
- package/src/__tests__/draw-published.ts +11 -4
- package/src/__tests__/dynamic-texture-store.unit.test.ts +190 -0
- package/src/__tests__/equirect-bc6h.integration.test.ts +144 -21
- package/src/__tests__/errors.unit.test.ts +1203 -0
- package/src/__tests__/extract-frames-graceful-degradation.test.ts +3 -7
- package/src/__tests__/extract-frames-merge.test.ts +35 -22
- package/src/__tests__/extract-record-no-hardcoded-texture-fields.test.ts +5 -16
- package/src/__tests__/extract-skin-mismatch.unit.test.ts +322 -0
- package/src/__tests__/fetch-binary-decompress.test.ts +356 -0
- package/src/__tests__/four-path-compression.integration.test.ts +395 -0
- package/src/__tests__/frame-targets-shadow-regression.unit.test.ts +1 -1
- package/src/__tests__/fullscreen-feature-host.dawn.test.ts +80 -0
- package/src/__tests__/fullscreen-post-bgl-depth.test.ts +4 -2
- package/src/__tests__/fullscreen-post-depth-params-arity.test.ts +3 -3
- package/src/__tests__/fullscreen-post-process-pass.dawn.test.ts +39 -23
- package/src/__tests__/fullscreen-post-process-pass.unit.test.ts +4 -2
- package/src/__tests__/fxaa-pixel-diff.dawn.test.ts +28 -17
- package/src/__tests__/fxaa-validation-and-resize.dawn.test.ts +29 -18
- package/src/__tests__/fxaa-zero-overhead.dawn.test.ts +16 -12
- package/src/__tests__/geometry.unit.test.ts +525 -159
- package/src/__tests__/glyph-tilemap-worldid.test.ts +1 -1
- package/src/__tests__/gpu-resource-cow-survivor.test.ts +6 -4
- package/src/__tests__/guid-for-asset.unit.test.ts +102 -0
- package/src/__tests__/handle-migration.test.ts +136 -0
- package/src/__tests__/helpers/register-runtime-components.ts +4 -2
- package/src/__tests__/helpers/register-scene-components.ts +1 -1
- package/src/__tests__/host-custom-kind-contract.test-d.ts +47 -0
- package/src/__tests__/host-custom-kind-contract.test.ts +578 -0
- package/src/__tests__/inspect-name.test.ts +139 -0
- package/src/__tests__/instances.test-d.ts +1 -1
- package/src/__tests__/instantiate-mount-deferred-wiring.test.ts +112 -0
- package/src/__tests__/light-casters-9-light.browser.test.ts +73 -76
- package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +7 -10
- package/src/__tests__/light-snapshot.test-d.ts +2 -2
- package/src/__tests__/lights-vec-negative.unit.test.ts +1 -1
- package/src/__tests__/lights.unit.test.ts +16 -500
- package/src/__tests__/loadbyguid-payload.unit.test.ts +117 -0
- package/src/__tests__/loadbyguid-texture-intern.unit.test.ts +213 -0
- package/src/__tests__/loader-extract-graceful.test.ts +146 -0
- package/src/__tests__/loader-name-survival.test.ts +213 -0
- package/src/__tests__/m3-vec-negative.unit.test.ts +3 -2
- package/src/__tests__/material-texture-uv-scale.unit.test.ts +101 -31
- package/src/__tests__/materials.unit.test.ts +10 -27
- package/src/__tests__/mesh-bin-contract.test.ts +28 -0
- package/src/__tests__/mesh-bin-skin-roundtrip.unit.test.ts +149 -0
- package/src/__tests__/mesh-bin.test.ts +38 -0
- package/src/__tests__/mesh-loader-skin-contract.unit.test.ts +120 -0
- package/src/__tests__/mesh-ssbo-grow.unit.test.ts +3 -3
- package/src/__tests__/mip-gate.unit.test.ts +1 -1
- package/src/__tests__/msaa-sprite-pixel-diff.dawn.test.ts +29 -68
- package/src/__tests__/new-kind-refs-contract.test.ts +132 -0
- package/src/__tests__/node-shims.d.ts +4 -6
- package/src/__tests__/package-promotion.test.ts +88 -0
- package/src/__tests__/package-rename.test.ts +103 -0
- package/src/__tests__/pass-selector.unit.test.ts +2 -2
- package/src/__tests__/pbr-pipeline.unit.test.ts +14 -21
- package/src/__tests__/pipeline-builder-msaa.unit.test.ts +6 -9
- package/src/__tests__/pipeline-cache-keying.unit.test.ts +6 -9
- package/src/__tests__/pipeline-spec.test.ts +16 -177
- package/src/__tests__/pipeline.unit.test.ts +154 -1693
- package/src/__tests__/point-light-shadow.dawn.test.ts +33 -42
- package/src/__tests__/point-light-shadow.unit.test.ts +19 -60
- package/src/__tests__/post-process-error-codes.unit.test.ts +4 -1
- package/src/__tests__/post-process-params-component.unit.test.ts +1 -1
- package/src/__tests__/post-process-params-extract.unit.test.ts +2 -5
- package/src/__tests__/postprocess-camera-consistency.test.ts +4 -7
- package/src/__tests__/profiler-assembly.integration.test.ts +1 -1
- package/src/__tests__/propagate-transforms.dawn.test.ts +12 -11
- package/src/__tests__/record-worldid-isolation.test.ts +7 -29
- package/src/__tests__/recover-error-exhaustive.test-d.ts +1 -1
- package/src/__tests__/render-error-exhaustive.test-d.ts +81 -71
- package/src/__tests__/render-feature-assembly.test-d.ts +20 -9
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +8 -6
- package/src/__tests__/render-feature-prepared-graphics.browser.test.ts +60 -558
- package/src/__tests__/render-feature-prepared-graphics.dawn.test.ts +57 -544
- package/src/__tests__/render-feature-prepared-graphics.fixture.ts +104 -0
- package/src/__tests__/render-feature-prepared-graphics.integration.test.ts +40 -248
- package/src/__tests__/render-feature-prepared-graphics.regression.integration.test.ts +83 -340
- package/src/__tests__/render-feature-recover.integration.test.ts +9 -49
- package/src/__tests__/render-feature-runtime-surface.test-d.ts +17 -20
- package/src/__tests__/render-schema-consumer.integration.test.ts +20 -13
- package/src/__tests__/render-schema-owner-boundary.unit.test.ts +2 -6
- package/src/__tests__/render-system-cross-world-overlay-queue.test.ts +5 -5
- package/src/__tests__/render-system-extract-dispatch-ordering.test.ts +16 -31
- package/src/__tests__/render-system-extract.test.ts +36 -51
- package/src/__tests__/render-system-extract.unit.test.ts +360 -0
- package/src/__tests__/render-system-fold-bucket.unit.test.ts +3 -5
- package/src/__tests__/render-system-fold-fallback.unit.test.ts +6 -3
- package/src/__tests__/render-system-fold-material.unit.test.ts +3 -5
- package/src/__tests__/render-system-fold-metrics.unit.test.ts +5 -5
- package/src/__tests__/render-system-fold-modegate.unit.test.ts +6 -6
- package/src/__tests__/render-system-fold.dawn.test.ts +7 -5
- package/src/__tests__/render-system-mega.test.ts +292 -190
- package/src/__tests__/render-system-owner-split-contract.test.ts +10 -32
- package/src/__tests__/render-system-record-multi-material-textureview.test.ts +59 -45
- package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +23 -29
- package/src/__tests__/render-system-record.test.ts +398 -235
- package/src/__tests__/render-system-record.unit.test.ts +25 -26
- package/src/__tests__/render-system-skin-bg.unit.test.ts +8 -12
- package/src/__tests__/renderer-consumer.test-d.ts +16 -3
- package/src/__tests__/renderer-health.unit.test.ts +26 -916
- package/src/__tests__/renderer-lifecycle.integration.test.ts +19 -6
- package/src/__tests__/renderer-recover.unit.test.ts +49 -1069
- package/src/__tests__/renderer-result.test-d.ts +19 -9
- package/src/__tests__/renderer-surface.unit.test.ts +3 -5
- package/src/__tests__/renderer-test-utils.ts +56 -0
- package/src/__tests__/renderer.test-d.ts +59 -0
- package/src/__tests__/resolve-asset-handle-err.test.ts +111 -0
- package/src/__tests__/resolve-asset-handle.unit.test.ts +64 -0
- package/src/__tests__/resolve-depth-only-view.test.ts +1 -1
- package/src/__tests__/resolveName-fallback.test.ts +64 -0
- package/src/__tests__/resolveName-null-package.test.ts +38 -0
- package/src/__tests__/resolveName-unified-entry.test.ts +65 -0
- package/src/__tests__/resolveName.test.ts +64 -0
- package/src/__tests__/rhi-null-command-flow.unit.test.ts +43 -261
- package/src/__tests__/rhi-null-renderer-lifecycle.unit.test.ts +41 -169
- package/src/__tests__/roots-to-scene-asset.test.ts +199 -93
- package/src/__tests__/roundtrip-primitive.test.ts +351 -0
- package/src/__tests__/scene-bare-guid-refs-instantiate.test.ts +123 -0
- package/src/__tests__/scene-equirect-roundtrip.test.ts +103 -16
- package/src/__tests__/scene-instance-authoring.integration.test.ts +8 -0
- package/src/__tests__/scene-instance-bridge.integration.test.ts +1 -1
- package/src/__tests__/scene-instance-component.test.ts +1 -1
- package/src/__tests__/scene-mount-fixed-point.test.ts +257 -0
- package/src/__tests__/scene-mount-roundtrip.test.ts +987 -0
- package/src/__tests__/scene-mount-wrapper-roundtrip.test.ts +202 -0
- package/src/__tests__/scene-sugar-instantiate.test.ts +324 -0
- package/src/__tests__/serialize-mounts-roundtrip.test.ts +533 -0
- package/src/__tests__/serialize-scene-asset.test.ts +219 -22
- package/src/__tests__/shadow-caster-empty-schema.test.ts +3 -3
- package/src/__tests__/shadow-csm-cascade-loadop.test.ts +37 -17
- package/src/__tests__/shadow-csm-component.test.ts +3 -5
- package/src/__tests__/shadow-csm-extract.test.ts +2 -100
- package/src/__tests__/shadow-csm-orthoz.test.ts +2 -16
- package/src/__tests__/shadow-csm-runtime-vary.dawn.test.ts +19 -14
- package/src/__tests__/shadow-csm-tile-consistency.test.ts +32 -26
- package/src/__tests__/shadow-csm-ubo.dawn.test.ts +8 -49
- package/src/__tests__/shadow-csm-ubo.test.ts +3 -25
- package/src/__tests__/shadow-csm-viewport.browser.test.ts +1 -1
- package/src/__tests__/shadow-fields-observable.dawn.test.ts +67 -56
- package/src/__tests__/shadow-m1.dawn.test.ts +8 -9
- package/src/__tests__/shadow-mesh-ssbo-order.test.ts +11 -27
- package/src/__tests__/skin-errors.unit.test.ts +1 -1
- package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +7 -5
- package/src/__tests__/skylight-lazy-projection.test.ts +36 -15
- package/src/__tests__/sparse-tag-scene-roundtrip.test.ts +5 -5
- package/src/__tests__/sprite-cullmode-flip.dawn.test.ts +47 -64
- package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +12 -11
- package/src/__tests__/sprite-lit-extract-branch.test.ts +1 -1
- package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +1 -1
- package/src/__tests__/ssao-bgl.test.ts +16 -9
- package/src/__tests__/ssao-buffers.test.ts +2 -2
- package/src/__tests__/ssao-data.test.ts +2 -2
- package/src/__tests__/ssao-errors.test.ts +1 -1
- package/src/__tests__/ssao-passes.test.ts +64 -392
- package/src/__tests__/ssao-pipelines.test.ts +1 -1
- package/src/__tests__/ssao-uniform-layout.test.ts +8 -6
- package/src/__tests__/stencil-outline-pixel.dawn.test.ts +25 -17
- package/src/__tests__/swap-chain-format.unit.test.ts +5 -7
- package/src/__tests__/systems.unit.test.ts +536 -1326
- package/src/__tests__/template-game-default-api-contract.test.ts +362 -0
- package/src/__tests__/text.unit.test.ts +56 -33
- package/src/__tests__/tilemap-childed-despawn.test.ts +8 -14
- package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +8 -12
- package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +2 -1
- package/src/__tests__/tilemap-chunk-extract.test.ts +13 -17
- package/src/__tests__/tilemap-dirty-rebuild.test.ts +7 -11
- package/src/__tests__/tilemap-material-cache.test.ts +8 -13
- package/src/__tests__/tilemap-multi-atlas.test.ts +12 -32
- package/src/__tests__/tilemap-owner-boundary.unit.test.ts +5 -2
- package/src/__tests__/tilemap-region-pack.test.ts +8 -12
- package/src/__tests__/tilemap-spawn-flip-pivot.test.ts +8 -12
- package/src/__tests__/tilemap-uv-inset.test.ts +11 -14
- package/src/__tests__/tilemap-validate.test.ts +1 -1
- package/src/__tests__/tileset-asset-validate.test.ts +638 -0
- package/src/__tests__/transcode-fallback.unit.test.ts +207 -0
- package/src/__tests__/transform-hierarchy-pixel-diff.dawn.test.ts +36 -28
- package/src/__tests__/transient-fields-collect.test.ts +28 -21
- package/src/__tests__/transient-runtime-behavior.test.ts +227 -0
- package/src/__tests__/transparent-sort-tilemap-sprite-interleave.test.ts +4 -4
- package/src/__tests__/variant-selection.unit.test.ts +1 -1
- package/src/__tests__/video-extract-bindgroup.dawn.test.ts +89 -136
- package/src/__tests__/video-loader-consumption.test.ts +86 -0
- package/src/__tests__/video-loader-smoke.dawn.test.ts +60 -0
- package/src/__tests__/view-ubo-layout.browser.test.ts +0 -22
- package/src/__tests__/world-entity-key.test.ts +1 -1
- package/src/__tests__/world-scene-despawn.test.ts +1 -1
- package/src/__tests__/world-scene-instantiate.test.ts +2 -36
- package/src/__tests__/world-scene-nested.test.ts +1 -1
- package/src/__tests__/world-scene-override.test.ts +1 -1
- package/src/backend-selection.ts +69 -0
- package/src/collect-scene-asset.ts +28 -23
- package/src/components/__tests__/camera.test-d.ts +1 -1
- package/src/components/__tests__/camera.test.ts +1 -1
- package/src/components/__tests__/sprite-animation.test-d.ts +2 -2
- package/src/components/__tests__/tile-layer.test-d.ts +1 -1
- package/src/components/__tests__/tile-layer.unit.test.ts +2 -2
- package/src/createRenderer.ts +24 -36
- package/src/errors/environment.ts +1 -1
- package/src/index.ts +47 -113
- package/src/renderer-host.ts +33 -0
- package/src/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.ts +1 -1
- package/src/scene-instances/index.ts +4 -0
- package/src/scene-utils/mount-override-fold.ts +3 -7
- package/src/systems/__tests__/transparent-sort.bench.ts +3 -3
- package/src/systems/sprite-animation-tick.ts +1 -1
- package/src/systems/transparent-sort.ts +38 -38
- package/src/tilemap-register-validate.ts +4 -4
- package/dist/__tests__/bind-group-cache-binding.test.d.ts +0 -2
- package/dist/__tests__/bind-group-cache-binding.test.d.ts.map +0 -1
- package/dist/__tests__/bind-group-cache-frame.test.d.ts +0 -2
- package/dist/__tests__/bind-group-cache-frame.test.d.ts.map +0 -1
- package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts +0 -2
- package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-manifest.d.ts +0 -131
- package/dist/__tests__/fog-producer-manifest.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-pixel-probe.d.ts +0 -42
- package/dist/__tests__/fog-producer-pixel-probe.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-pixel.browser.test.d.ts +0 -2
- package/dist/__tests__/fog-producer-pixel.browser.test.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts +0 -2
- package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-real-fixture.d.ts +0 -5
- package/dist/__tests__/fog-producer-real-fixture.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-vfx-effect.d.ts +0 -3
- package/dist/__tests__/fog-producer-vfx-effect.d.ts.map +0 -1
- package/dist/__tests__/fog-scene-asset.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-scene-asset.integration.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts +0 -2
- package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-resource.test.d.ts +0 -2
- package/dist/__tests__/gpu-resource.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts +0 -2
- package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-buffers.unit.test.d.ts +0 -2
- package/dist/__tests__/hdrp-buffers.unit.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts +0 -2
- package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts +0 -2
- package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts +0 -2
- package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts.map +0 -1
- package/dist/__tests__/hdrp-ssao-boundary.test.d.ts +0 -2
- package/dist/__tests__/hdrp-ssao-boundary.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-ssao-falsification.test.d.ts +0 -2
- package/dist/__tests__/hdrp-ssao-falsification.test.d.ts.map +0 -1
- package/dist/__tests__/helpers/primitive-world.d.ts +0 -8
- package/dist/__tests__/helpers/primitive-world.d.ts.map +0 -1
- package/dist/__tests__/helpers/render-asset-port.d.ts +0 -15
- package/dist/__tests__/helpers/render-asset-port.d.ts.map +0 -1
- package/dist/__tests__/helpers/scene-asset-port.d.ts +0 -9
- package/dist/__tests__/helpers/scene-asset-port.d.ts.map +0 -1
- package/dist/__tests__/material-derived-coordinates.integration.test.d.ts +0 -2
- package/dist/__tests__/material-derived-coordinates.integration.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-layout-selection.test.d.ts +0 -2
- package/dist/__tests__/pipeline-layout-selection.test.d.ts.map +0 -1
- package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts +0 -2
- package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts.map +0 -1
- package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts +0 -2
- package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts +0 -2
- package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-caster-membership.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-caster-membership.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-pssm.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-pssm.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-viewport.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-viewport.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-m2.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-m2.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-m3-calibrate.d.ts +0 -83
- package/dist/__tests__/shadow-m3-calibrate.d.ts.map +0 -1
- package/dist/__tests__/shadow-m3.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-m3.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/temporal-off-path.unit.test.d.ts +0 -2
- package/dist/__tests__/temporal-off-path.unit.test.d.ts.map +0 -1
- package/dist/__tests__/video-cache-regression.unit.test.d.ts +0 -2
- package/dist/__tests__/video-cache-regression.unit.test.d.ts.map +0 -1
- package/dist/asset-kind.d.ts +0 -4
- package/dist/asset-kind.d.ts.map +0 -1
- package/dist/errors/sprite-animation.d.ts +0 -3
- package/dist/errors/sprite-animation.d.ts.map +0 -1
- package/dist/scene-asset-port.d.ts +0 -17
- package/dist/scene-asset-port.d.ts.map +0 -1
- package/dist/scene-collect-errors.d.ts +0 -22
- package/dist/scene-collect-errors.d.ts.map +0 -1
- package/dist/shadow-m3-calibrate.d.ts +0 -40
- package/dist/shadow-m3-calibrate.d.ts.map +0 -1
- package/src/__tests__/bind-group-cache-binding.test.ts +0 -2513
- package/src/__tests__/bind-group-cache-frame.test.ts +0 -1511
- package/src/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.ts +0 -204
- package/src/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.ts +0 -297
- package/src/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.ts +0 -271
- package/src/__tests__/dispatch-fullscreen-pass-params.unit.test.ts +0 -321
- package/src/__tests__/fog-producer-manifest.ts +0 -162
- package/src/__tests__/fog-producer-pixel-probe.ts +0 -263
- package/src/__tests__/fog-producer-pixel.browser.test.ts +0 -26
- package/src/__tests__/fog-producer-pixel.dawn.test.ts +0 -55
- package/src/__tests__/fog-producer-real-fixture.ts +0 -805
- package/src/__tests__/fog-producer-vfx-effect.ts +0 -272
- package/src/__tests__/fog-scene-asset.integration.test.ts +0 -123
- package/src/__tests__/gpu-resource-store-cubemap-status.test.ts +0 -207
- package/src/__tests__/gpu-resource.test.ts +0 -1206
- package/src/__tests__/hdrp-bgl-slots.browser.test.ts +0 -50
- package/src/__tests__/hdrp-buffers.unit.test.ts +0 -70
- package/src/__tests__/hdrp-execute-filter.unit.test.ts +0 -200
- package/src/__tests__/hdrp-gbuffer-attachments.browser.test.ts +0 -64
- package/src/__tests__/hdrp-pipeline-asset-type.test-d.ts +0 -139
- package/src/__tests__/hdrp-ssao-boundary.test.ts +0 -237
- package/src/__tests__/hdrp-ssao-falsification.test.ts +0 -289
- package/src/__tests__/helpers/primitive-world.ts +0 -91
- package/src/__tests__/helpers/render-asset-port.ts +0 -65
- package/src/__tests__/helpers/scene-asset-port.ts +0 -23
- package/src/__tests__/material-derived-coordinates.integration.test.ts +0 -100
- package/src/__tests__/pipeline-layout-selection.test.ts +0 -298
- package/src/__tests__/post-process-reads-narrowing.test-d.ts +0 -52
- package/src/__tests__/post-process-register-roundtrip.dawn.test.ts +0 -230
- package/src/__tests__/render-feature-zero-feature.browser.test.ts +0 -152
- package/src/__tests__/render-pipeline-trivial.dawn.test.ts +0 -525
- package/src/__tests__/shadow-csm-caster-membership.test.ts +0 -232
- package/src/__tests__/shadow-csm-pssm.test.ts +0 -142
- package/src/__tests__/shadow-csm-temporal.browser.test.ts +0 -145
- package/src/__tests__/shadow-csm-viewport.test.ts +0 -74
- package/src/__tests__/shadow-m2.dawn.test.ts +0 -394
- package/src/__tests__/shadow-m3-calibrate-run.dawn.test.ts +0 -248
- package/src/__tests__/shadow-m3-calibrate.ts +0 -203
- package/src/__tests__/shadow-m3.dawn.test.ts +0 -288
- package/src/__tests__/shadow-probe-control-flow.dawn.test.ts +0 -264
- package/src/__tests__/shadow-quality-metrics.dawn.test.ts +0 -324
- package/src/__tests__/temporal-off-path.unit.test.ts +0 -69
- package/src/__tests__/video-cache-regression.unit.test.ts +0 -186
- package/src/asset-kind.ts +0 -7
- package/src/errors/sprite-animation.ts +0 -5
- package/src/scene-asset-port.ts +0 -32
- package/src/scene-collect-errors.ts +0 -30
- package/src/shadow-m3-calibrate.ts +0 -171
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
// shadow-m3-calibrate.ts - feat-20260520-directional-light-shadow-mapping
|
|
2
|
-
// M3 / w15: AC-13 threshold calibration helper.
|
|
3
|
-
//
|
|
4
|
-
// This module is NOT a test file (no .test.ts suffix) — vitest will not
|
|
5
|
-
// auto-discover it. It exports a `calibrateThresholdX` function that measures
|
|
6
|
-
// shadow factor diffs between M2 (naive) and M3 (bias+PCF) on a common fixture
|
|
7
|
-
// and prints the suggested AC_13_THRESHOLD_X.
|
|
8
|
-
//
|
|
9
|
-
// Workflow (plan-strategy D-4):
|
|
10
|
-
// Step 1 (w15 RED): write this helper + shadow-m3.dawn.test.ts with
|
|
11
|
-
// placeholder X=0.05. Calibration returns trivial diffs
|
|
12
|
-
// (M2==M2 before w16). AC-13 stays RED.
|
|
13
|
-
// Step 2 (w16 impl): implement pbr.wgsl bias+PCF. Compile + build.
|
|
14
|
-
// Step 3 (w16 calibrate): run this helper via the calibration runner
|
|
15
|
-
// shadow-m3-calibrate-run.dawn.test.ts. Collect
|
|
16
|
-
// max(diff) and suggested X.
|
|
17
|
-
// Step 4 (w16 freeze): edit shadow-m3.dawn.test.ts to set AC_13_THRESHOLD_X
|
|
18
|
-
// to the calibrated value. Commit. AC-13 turns GREEN.
|
|
19
|
-
//
|
|
20
|
-
// The helper samples N >= 10 acne-prone ground-plane positions where M2 shows
|
|
21
|
-
// spurious sub-1 shadow factors (acne artifact). It reads shadow factors
|
|
22
|
-
// pre-change (current shader = M2 baseline) and post-change (after M3
|
|
23
|
-
// bias+PCF is deployed). The suggested X = floor(max(diff) * 0.5 * 100) / 100
|
|
24
|
-
// with a floor of 0.02 to avoid vanishing thresholds that invite flakiness.
|
|
25
|
-
|
|
26
|
-
import type { Renderer } from '@forgeax/engine-render/internal';
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Shadow factor sample returned by debugSampleShadowFactor.
|
|
30
|
-
* Matches the return type shape from Renderer.debugSampleShadowFactor.
|
|
31
|
-
*/
|
|
32
|
-
export interface ShadowFactorSample {
|
|
33
|
-
readonly shadowFactor: number;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Calibration result: per-sample M2/M3 factors + derived threshold.
|
|
38
|
-
*/
|
|
39
|
-
export interface CalibrationResult {
|
|
40
|
-
/** Per-sample data ordered by the input positions array. */
|
|
41
|
-
samples: CalibrationSample[];
|
|
42
|
-
/** Maximum |m2Factor - m3Factor| across all samples. */
|
|
43
|
-
maxDiff: number;
|
|
44
|
-
/** Suggested AC_13_THRESHOLD_X = max(floor(maxDiff * 0.5 * 100) / 100, 0.02). */
|
|
45
|
-
suggestedX: number;
|
|
46
|
-
/** Sample count. */
|
|
47
|
-
sampleCount: number;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export interface CalibrationSample {
|
|
51
|
-
position: readonly [number, number, number];
|
|
52
|
-
m2Factor: number;
|
|
53
|
-
m3Factor: number;
|
|
54
|
-
diff: number;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Fixed acne probe positions for calibration.
|
|
59
|
-
*
|
|
60
|
-
* All positions lie on the ground plane (y=0) in the -X lit region where M2
|
|
61
|
-
* naive depth comparison produces spurious sub-1 shadow factors due to
|
|
62
|
-
* surface self-shadowing. The cube occluder at (0, 1.3, 0) + light tilting +X
|
|
63
|
-
* means the -X region should be fully lit.
|
|
64
|
-
*
|
|
65
|
-
* SSOT: must stay in sync with shadow-m3.dawn.test.ts acne sample constants.
|
|
66
|
-
*/
|
|
67
|
-
export const CALIBRATION_POSITIONS: ReadonlyArray<readonly [number, number, number]> = [
|
|
68
|
-
[-4, 0, 0],
|
|
69
|
-
[-3, 0, 2],
|
|
70
|
-
[-4, 0, -2],
|
|
71
|
-
[-2.5, 0, -1],
|
|
72
|
-
[-3.5, 0, 1],
|
|
73
|
-
[-2, 0, -2.5],
|
|
74
|
-
[-4.5, 0, -0.5],
|
|
75
|
-
[-1.5, 0, 2.5],
|
|
76
|
-
[-3, 0, -1.5],
|
|
77
|
-
[-5, 0, 0.5],
|
|
78
|
-
// Extra round to 12 — more samples reduce threshold noise.
|
|
79
|
-
[-4.2, 0, 1.2],
|
|
80
|
-
[-3.8, 0, -0.8],
|
|
81
|
-
];
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Read M2 shadow factors from the renderer (GPU probe, pre-bias/pre-PCF).
|
|
85
|
-
*
|
|
86
|
-
* In the RED phase (before w16), this is the same as M3 — so diffs are zero.
|
|
87
|
-
* After w16 lands (bias+PCF in pbr.wgsl), the renderer reflects the new
|
|
88
|
-
* shader and m2Factors become a historical baseline from the pre-M3 commit.
|
|
89
|
-
*
|
|
90
|
-
* For a single-session implementer, the calibration workflow is:
|
|
91
|
-
* 1. Record M2 factors with the current (naive) shader
|
|
92
|
-
* 2. Apply w16 (pbr.wgsl bias+PCF)
|
|
93
|
-
* 3. Rebuild, re-measure M3 factors
|
|
94
|
-
* 4. Call `computeThresholdX(m2Factors, m3Factors)` on the stored values
|
|
95
|
-
*
|
|
96
|
-
* This function measures the **current** shadow factors via debugSampleShadowFactor.
|
|
97
|
-
*/
|
|
98
|
-
export async function measureShadowFactors(
|
|
99
|
-
renderer: Renderer,
|
|
100
|
-
positions: ReadonlyArray<readonly [number, number, number]>,
|
|
101
|
-
): Promise<number[]> {
|
|
102
|
-
const results = await renderer.debugSampleShadowFactor?.(positions);
|
|
103
|
-
if (!results) throw new Error('debugSampleShadowFactor returned null');
|
|
104
|
-
return results.map((r) => r.shadowFactor);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Compute the suggested AC-13 threshold X from measured M2 and M3 shadow factors.
|
|
109
|
-
*
|
|
110
|
-
* X = max(floor(max(|m2 - m3|) * 0.5 * 100) / 100, 0.02)
|
|
111
|
-
*
|
|
112
|
-
* The 0.5 multiplier gives headroom (roughly half the maximum observed
|
|
113
|
-
* improvement); the floor at 0.02 prevents vanishing thresholds that would
|
|
114
|
-
* make AC-13 flaky at machine-boundary epsilon.
|
|
115
|
-
*/
|
|
116
|
-
export function computeThresholdX(
|
|
117
|
-
m2Factors: readonly number[],
|
|
118
|
-
m3Factors: readonly number[],
|
|
119
|
-
): { maxDiff: number; suggestedX: number } {
|
|
120
|
-
let maxDiff = 0;
|
|
121
|
-
for (let i = 0; i < m2Factors.length && i < m3Factors.length; i++) {
|
|
122
|
-
const diff = Math.abs((m2Factors[i] as number) - (m3Factors[i] as number));
|
|
123
|
-
if (diff > maxDiff) maxDiff = diff;
|
|
124
|
-
}
|
|
125
|
-
const rawX = Math.floor(maxDiff * 0.5 * 100) / 100;
|
|
126
|
-
const suggestedX = Math.max(rawX, 0.02);
|
|
127
|
-
return { maxDiff, suggestedX };
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Full calibration: reads M2 + M3 shadow factors from the same renderer and
|
|
132
|
-
* computes the suggested threshold.
|
|
133
|
-
*
|
|
134
|
-
* `measureM2`: function returning M2 factors (pre-bias/PCF baseline).
|
|
135
|
-
* `measureM3`: function returning M3 factors (post-bias/PCF with current shader).
|
|
136
|
-
*
|
|
137
|
-
* In a single-session workflow these two calls happen on the same renderer but
|
|
138
|
-
* at different points in time (pre-w16 commit vs post-w16 build).
|
|
139
|
-
*/
|
|
140
|
-
export async function calibrateThresholdX(
|
|
141
|
-
positions: ReadonlyArray<readonly [number, number, number]>,
|
|
142
|
-
measureM2: () => Promise<number[]>,
|
|
143
|
-
measureM3: () => Promise<number[]>,
|
|
144
|
-
): Promise<CalibrationResult> {
|
|
145
|
-
const m2Factors = await measureM2();
|
|
146
|
-
const m3Factors = await measureM3();
|
|
147
|
-
|
|
148
|
-
const { maxDiff, suggestedX } = computeThresholdX(m2Factors, m3Factors);
|
|
149
|
-
|
|
150
|
-
const samples: CalibrationSample[] = [];
|
|
151
|
-
for (let i = 0; i < positions.length; i++) {
|
|
152
|
-
const pos = positions[i];
|
|
153
|
-
if (!pos) continue;
|
|
154
|
-
const m2 = m2Factors[i] as number;
|
|
155
|
-
const m3 = m3Factors[i] as number;
|
|
156
|
-
samples.push({
|
|
157
|
-
position: pos,
|
|
158
|
-
m2Factor: m2,
|
|
159
|
-
m3Factor: m3,
|
|
160
|
-
diff: Math.abs(m2 - m3),
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
return {
|
|
165
|
-
samples,
|
|
166
|
-
maxDiff,
|
|
167
|
-
suggestedX,
|
|
168
|
-
sampleCount: samples.length,
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Pretty-print calibration result to stdout for implementer consumption.
|
|
174
|
-
*/
|
|
175
|
-
export function printCalibrationReport(result: CalibrationResult): void {
|
|
176
|
-
console.warn('═══════════════════════════════════════════════════════════');
|
|
177
|
-
console.warn(' M3 AC-13 threshold calibration report');
|
|
178
|
-
console.warn('═══════════════════════════════════════════════════════════');
|
|
179
|
-
console.warn(` Sample count : ${result.sampleCount}`);
|
|
180
|
-
console.warn(' Sample |' + ' position | M2 factor | M3 factor | diff');
|
|
181
|
-
console.warn(' -------|-------------------|-----------|-----------|--------');
|
|
182
|
-
for (let i = 0; i < result.samples.length; i++) {
|
|
183
|
-
const s = result.samples[i];
|
|
184
|
-
if (!s) continue;
|
|
185
|
-
const posStr = `(${s.position[0].toFixed(1)}, ${s.position[1].toFixed(1)}, ${s.position[2].toFixed(1)})`;
|
|
186
|
-
console.warn(
|
|
187
|
-
` ${String(i).padStart(6)} | ${posStr.padEnd(17)} |` +
|
|
188
|
-
` ${s.m2Factor.toFixed(4).padStart(9)} |` +
|
|
189
|
-
` ${s.m3Factor.toFixed(4).padStart(9)} |` +
|
|
190
|
-
` ${s.diff.toFixed(4).padStart(6)}`,
|
|
191
|
-
);
|
|
192
|
-
}
|
|
193
|
-
console.warn(' -------|-------------------|-----------|-----------|--------');
|
|
194
|
-
console.warn(` max(diff) = ${result.maxDiff.toFixed(4)}`);
|
|
195
|
-
console.warn(` suggested X = ${result.suggestedX.toFixed(2)}`);
|
|
196
|
-
console.warn(' (X = max(floor(maxDiff * 0.5 * 100) / 100, 0.02))');
|
|
197
|
-
console.warn('');
|
|
198
|
-
console.warn(
|
|
199
|
-
' Next step: set AC_13_THRESHOLD_X =' +
|
|
200
|
-
` ${result.suggestedX.toFixed(2)} in shadow-m3.dawn.test.ts`,
|
|
201
|
-
);
|
|
202
|
-
console.warn('═══════════════════════════════════════════════════════════');
|
|
203
|
-
}
|
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
// shadow-m3.dawn.test.ts -
|
|
2
|
-
// feat-20260621-merge-directionallightshadow-into-directionallight / M3 / m3-t1.
|
|
3
|
-
//
|
|
4
|
-
// M3 wires the merged DirectionalLight's depthBias / normalBias / pcfKernelSize
|
|
5
|
-
// into the View UBO tail (floats [126/127/128], bytes 504/508/512) and drives
|
|
6
|
-
// the directional shadow bias + variable-width PCF loop from those uniforms
|
|
7
|
-
// (lighting-directional.wgsl::_sampleShadowForCascade, D-1 / D-2). This test is
|
|
8
|
-
// the RED gate for that wiring.
|
|
9
|
-
//
|
|
10
|
-
// AC anchor: requirements AC-03 (shadow params flow from the merged component to
|
|
11
|
-
// the shader) + AC-08 (View UBO byte layout stays fixed: VIEW_PAYLOAD_FLOATS=148
|
|
12
|
-
// / VIEW_UBO_BYTES=592 unchanged; append at tail). plan-strategy D-1 (directional
|
|
13
|
-
// bias mapping: normalBias=slope, depthBias=floor), D-2 (variable-width PCF
|
|
14
|
-
// driven by pcfKernelSize via the merged 5.3-production-shadow-demos AC-14
|
|
15
|
-
// constant-trip-count loop), D-7 (host clamp pcfKernelSize into {1,3,5}).
|
|
16
|
-
//
|
|
17
|
-
// What is observable, and why these assertions:
|
|
18
|
-
// * The View UBO buffer is created UNIFORM | COPY_DST only (no COPY_SRC) and
|
|
19
|
-
// there is no debug accessor returning its bytes, so the float-slot
|
|
20
|
-
// placement cannot be asserted by GPU readback. The debugSampleShadowFactor
|
|
21
|
-
// probe is a SELF-CONTAINED shader (hardcoded bias + fixed 3x3 textureLoad)
|
|
22
|
-
// that never binds the View UBO, so it cannot observe pcfKernelSize either.
|
|
23
|
-
// * The shader-wiring RED gate is therefore asserted against the COMPOSED
|
|
24
|
-
// engine shader: _sampleShadowForCascade reads view.pcfKernelSize and runs
|
|
25
|
-
// a kernel/MAX_PCF_HALF constant-trip-count PCF loop (variant-free, merged
|
|
26
|
-
// from 5.3-production-shadow-demos AC-14), and derives the bias from
|
|
27
|
-
// view.normalBias / view.depthBias (D-1). Pre-wiring the composed default-standard-pbr shader
|
|
28
|
-
// has none of these tokens (RED); post-m3-t4 it does (GREEN). The composed
|
|
29
|
-
// WGSL is the single source the GPU compiles, so this is a faithful gate.
|
|
30
|
-
// * The merged component is exercised end-to-end on a real device: a single
|
|
31
|
-
// DirectionalLight (castShadow default true) + cube occluder + ground
|
|
32
|
-
// populates the shadow atlas, and debugSampleShadowFactor reports occluded
|
|
33
|
-
// positions shadowed and lit positions lit -- proving the merged shadow
|
|
34
|
-
// fields drive a working shadow pass.
|
|
35
|
-
// * Byte-layout invariance (AC-08) is asserted structurally: if the host
|
|
36
|
-
// payload float count or the WGSL struct byte size drifted out of sync, the
|
|
37
|
-
// pbr pipeline would fail to compile / validate and renderer.ready /
|
|
38
|
-
// renderer.draw would not return ok. A clean default-config render across
|
|
39
|
-
// the four clamped kernel sizes is the proxy for "VIEW_UBO_BYTES unchanged".
|
|
40
|
-
|
|
41
|
-
import { World } from '@forgeax/engine-ecs';
|
|
42
|
-
import { createPrimitiveMesh } from '@forgeax/engine-geometry';
|
|
43
|
-
import {
|
|
44
|
-
Camera,
|
|
45
|
-
DirectionalLight,
|
|
46
|
-
MeshFilter,
|
|
47
|
-
MeshRenderer,
|
|
48
|
-
} from '@forgeax/engine-render/internal';
|
|
49
|
-
import { Transform } from '@forgeax/engine-scene';
|
|
50
|
-
import { describe, expect, it } from 'vitest';
|
|
51
|
-
import { createRenderer } from '../index';
|
|
52
|
-
import { drawPublished } from './draw-published';
|
|
53
|
-
|
|
54
|
-
const WIDTH = 256;
|
|
55
|
-
const HEIGHT = 256;
|
|
56
|
-
const TEXTURE_USAGE_COPY_SRC = 0x01;
|
|
57
|
-
const TEXTURE_USAGE_RENDER_ATTACHMENT = 0x10;
|
|
58
|
-
const GROUND_SIZE = 20;
|
|
59
|
-
|
|
60
|
-
const ENGINE_MANIFEST = await (async () => {
|
|
61
|
-
const { buildEngineShaderManifest } = await import('@forgeax/engine-vite-plugin-shader');
|
|
62
|
-
return buildEngineShaderManifest();
|
|
63
|
-
})();
|
|
64
|
-
const ENGINE_MANIFEST_URL = `data:application/json,${encodeURIComponent(
|
|
65
|
-
JSON.stringify(ENGINE_MANIFEST),
|
|
66
|
-
)}`;
|
|
67
|
-
|
|
68
|
-
// biome-ignore lint/suspicious/noExplicitAny: dawn-node detection guard
|
|
69
|
-
const dawnReady = typeof navigator !== 'undefined' && (navigator as any).gpu !== undefined;
|
|
70
|
-
|
|
71
|
-
/** The composed default-standard-pbr WGSL the GPU actually compiles. */
|
|
72
|
-
function composedStandardPbr(): string {
|
|
73
|
-
const m = ENGINE_MANIFEST.materialShaders.find(
|
|
74
|
-
(s) => s.identifier === 'forgeax::default-standard-pbr',
|
|
75
|
-
);
|
|
76
|
-
if (m === undefined) throw new Error('default-standard-pbr not in engine manifest');
|
|
77
|
-
return m.composedWgsl;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function createMockCanvas(): { canvas: HTMLCanvasElement; getDevice: () => GPUDevice | undefined } {
|
|
81
|
-
let sharedDevice: GPUDevice | undefined;
|
|
82
|
-
const originalRequestAdapter = globalThis.navigator.gpu.requestAdapter.bind(
|
|
83
|
-
globalThis.navigator.gpu,
|
|
84
|
-
);
|
|
85
|
-
globalThis.navigator.gpu.requestAdapter = async (opts) => {
|
|
86
|
-
const rawAdapter = await originalRequestAdapter(opts);
|
|
87
|
-
if (rawAdapter === null) return rawAdapter;
|
|
88
|
-
const originalRequestDevice = rawAdapter.requestDevice.bind(rawAdapter);
|
|
89
|
-
rawAdapter.requestDevice = async (desc) => {
|
|
90
|
-
const dev = await originalRequestDevice(desc);
|
|
91
|
-
if (sharedDevice === undefined) sharedDevice = dev;
|
|
92
|
-
return dev;
|
|
93
|
-
};
|
|
94
|
-
return rawAdapter;
|
|
95
|
-
};
|
|
96
|
-
let renderTarget: GPUTexture | undefined;
|
|
97
|
-
const ensureRenderTarget = (device: GPUDevice, format: GPUTextureFormat): GPUTexture => {
|
|
98
|
-
if (renderTarget !== undefined) return renderTarget;
|
|
99
|
-
renderTarget = device.createTexture({
|
|
100
|
-
size: { width: WIDTH, height: HEIGHT, depthOrArrayLayers: 1 },
|
|
101
|
-
format,
|
|
102
|
-
usage: TEXTURE_USAGE_RENDER_ATTACHMENT | TEXTURE_USAGE_COPY_SRC,
|
|
103
|
-
viewFormats: ['rgba8unorm-srgb'],
|
|
104
|
-
});
|
|
105
|
-
return renderTarget;
|
|
106
|
-
};
|
|
107
|
-
const canvas = {
|
|
108
|
-
width: WIDTH,
|
|
109
|
-
height: HEIGHT,
|
|
110
|
-
getContext(kind: string): unknown {
|
|
111
|
-
if (kind !== 'webgpu') return null;
|
|
112
|
-
return {
|
|
113
|
-
configure(desc: { device: GPUDevice; format?: GPUTextureFormat }) {
|
|
114
|
-
ensureRenderTarget(desc.device, desc.format ?? 'rgba8unorm');
|
|
115
|
-
},
|
|
116
|
-
unconfigure() {},
|
|
117
|
-
getCurrentTexture(): GPUTexture {
|
|
118
|
-
if (renderTarget === undefined) {
|
|
119
|
-
if (sharedDevice === undefined)
|
|
120
|
-
throw new Error('render target requested before device captured');
|
|
121
|
-
return ensureRenderTarget(sharedDevice, 'rgba8unorm');
|
|
122
|
-
}
|
|
123
|
-
return renderTarget;
|
|
124
|
-
},
|
|
125
|
-
};
|
|
126
|
-
},
|
|
127
|
-
addEventListener() {},
|
|
128
|
-
removeEventListener() {},
|
|
129
|
-
} as unknown as HTMLCanvasElement;
|
|
130
|
-
return { canvas, getDevice: () => sharedDevice };
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Cube occluder above a ground plane, lit by a near-vertical directional light.
|
|
135
|
-
* The camera looks down the -Z axis (orthographic) so the full scene is in the
|
|
136
|
-
* shadow atlas fit. `pcfKernelSize` is set on the single merged DirectionalLight.
|
|
137
|
-
*/
|
|
138
|
-
function buildShadowScene(world: World, pcfKernelSize: number): void {
|
|
139
|
-
const cubeHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
|
|
140
|
-
// Ground plane (flattened cube), top face at y=0. Empty MeshRenderer ->
|
|
141
|
-
// engine default standard material (shadow-receiving forward pass).
|
|
142
|
-
world
|
|
143
|
-
.spawn(
|
|
144
|
-
{
|
|
145
|
-
component: Transform,
|
|
146
|
-
data: {
|
|
147
|
-
pos: [0, -0.005, 0],
|
|
148
|
-
quat: [0, 0, 0, 1],
|
|
149
|
-
scale: [GROUND_SIZE, 0.01, GROUND_SIZE],
|
|
150
|
-
},
|
|
151
|
-
},
|
|
152
|
-
{ component: MeshFilter, data: { assetHandle: cubeHandle } },
|
|
153
|
-
{ component: MeshRenderer, data: {} },
|
|
154
|
-
)
|
|
155
|
-
.unwrap();
|
|
156
|
-
|
|
157
|
-
// Occluder cube, 2x2x2 centred at y=1.5 (bottom at y=0.5).
|
|
158
|
-
world
|
|
159
|
-
.spawn(
|
|
160
|
-
{
|
|
161
|
-
component: Transform,
|
|
162
|
-
data: { pos: [0, 1.5, 0], quat: [0, 0, 0, 1], scale: [2, 2, 2] },
|
|
163
|
-
},
|
|
164
|
-
{ component: MeshFilter, data: { assetHandle: cubeHandle } },
|
|
165
|
-
{ component: MeshRenderer, data: {} },
|
|
166
|
-
)
|
|
167
|
-
.unwrap();
|
|
168
|
-
|
|
169
|
-
world
|
|
170
|
-
.spawn({
|
|
171
|
-
component: DirectionalLight,
|
|
172
|
-
data: {
|
|
173
|
-
direction: [0.2, -0.98, 0],
|
|
174
|
-
color: [1, 1, 1],
|
|
175
|
-
intensity: 1.5,
|
|
176
|
-
// Single cascade so the cube/ground land in the tile-0 slot the probe
|
|
177
|
-
// samples (same migration the prior M2/M3 fixtures relied on).
|
|
178
|
-
cascadeCount: 1,
|
|
179
|
-
mapSize: 1024,
|
|
180
|
-
shadowDistance: 50,
|
|
181
|
-
pcfKernelSize,
|
|
182
|
-
},
|
|
183
|
-
})
|
|
184
|
-
.unwrap();
|
|
185
|
-
|
|
186
|
-
world
|
|
187
|
-
.spawn(
|
|
188
|
-
{ component: Transform, data: { pos: [0, 0, 10], quat: [0, 0, 0, 1] } },
|
|
189
|
-
{
|
|
190
|
-
component: Camera,
|
|
191
|
-
data: {
|
|
192
|
-
projection: 1,
|
|
193
|
-
left: -5,
|
|
194
|
-
right: 5,
|
|
195
|
-
bottom: -5,
|
|
196
|
-
top: 5,
|
|
197
|
-
near: 0.1,
|
|
198
|
-
far: 100,
|
|
199
|
-
fov: 0,
|
|
200
|
-
aspect: 1,
|
|
201
|
-
} as Record<string, unknown> as never,
|
|
202
|
-
},
|
|
203
|
-
)
|
|
204
|
-
.unwrap();
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
describe('shadow M3 dawn: merged DirectionalLight shadow params -> View UBO + variable PCF', () => {
|
|
208
|
-
it.skipIf(!dawnReady)("'dawn-binding-missing' -- dawn.node binding injection failed", () => {
|
|
209
|
-
expect(dawnReady).toBe(true);
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
it('composed default-standard-pbr drives shadow bias + PCF from View uniforms (D-1/D-2)', () => {
|
|
213
|
-
const wgsl = composedStandardPbr();
|
|
214
|
-
// D-1: bias is derived from the View UBO's normalBias (slope) + depthBias
|
|
215
|
-
// (floor), replacing the prior hardcoded max(0.05*(1-N.L), 0.005).
|
|
216
|
-
expect(wgsl).toContain('normalBias');
|
|
217
|
-
expect(wgsl).toContain('depthBias');
|
|
218
|
-
// D-2: the directional PCF loop is driven by view.pcfKernelSize via a
|
|
219
|
-
// runtime-clamped kernel half-extent (constant trip count to MAX_PCF_HALF,
|
|
220
|
-
// per-iteration radius clip — the variant-free pattern merged from
|
|
221
|
-
// 5.3-production-shadow-demos AC-14), not a fixed 3x3.
|
|
222
|
-
expect(wgsl).toContain('pcfKernelSize');
|
|
223
|
-
// Composition may rename or fold local variables. The runtime width read
|
|
224
|
-
// and rounding are the textual contract; the pixel and all-kernel tests
|
|
225
|
-
// below prove the branch behavior through Dawn.
|
|
226
|
-
expect(wgsl).toMatch(/round\(/);
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
it.skipIf(!dawnReady)(
|
|
230
|
-
'merged DirectionalLight casts a shadow (occluded < lit) via debugSampleShadowFactor',
|
|
231
|
-
async () => {
|
|
232
|
-
const { canvas, getDevice } = createMockCanvas();
|
|
233
|
-
const renderer = await createRenderer(canvas, {}, { shaderManifestUrl: ENGINE_MANIFEST_URL });
|
|
234
|
-
expect(renderer.backend).toBe('webgpu');
|
|
235
|
-
const ready = await renderer.ready;
|
|
236
|
-
expect(ready.ok).toBe(true);
|
|
237
|
-
|
|
238
|
-
const world = new World();
|
|
239
|
-
buildShadowScene(world, 7);
|
|
240
|
-
world.update(1 / 60).unwrap();
|
|
241
|
-
const draw = drawPublished(renderer, world);
|
|
242
|
-
expect(draw.ok).toBe(true);
|
|
243
|
-
const device = getDevice();
|
|
244
|
-
if (device !== undefined) await device.queue.onSubmittedWorkDone();
|
|
245
|
-
|
|
246
|
-
// Occluded ground positions under the cube vs a lit position well outside
|
|
247
|
-
// the shadow. The probe reads the shadow atlas the merged component's
|
|
248
|
-
// shadow fields populated.
|
|
249
|
-
const occluded: [number, number, number][] = [
|
|
250
|
-
[0, 0, 0],
|
|
251
|
-
[0.5, 0, 0],
|
|
252
|
-
];
|
|
253
|
-
const lit: [number, number, number][] = [[-4, 0, 0]];
|
|
254
|
-
const occRes = await renderer.debugSampleShadowFactor?.(occluded);
|
|
255
|
-
const litRes = await renderer.debugSampleShadowFactor?.(lit);
|
|
256
|
-
expect(occRes).not.toBeNull();
|
|
257
|
-
expect(litRes).not.toBeNull();
|
|
258
|
-
if (!occRes || !litRes) throw new Error('debugSampleShadowFactor returned null');
|
|
259
|
-
|
|
260
|
-
for (const r of occRes) expect(r.shadowFactor).toBeLessThan(0.5);
|
|
261
|
-
for (const r of litRes) expect(r.shadowFactor).toBeGreaterThan(0.9);
|
|
262
|
-
},
|
|
263
|
-
);
|
|
264
|
-
|
|
265
|
-
it.skipIf(!dawnReady)(
|
|
266
|
-
'all clamped kernel sizes render cleanly (View UBO byte layout intact, AC-08)',
|
|
267
|
-
async () => {
|
|
268
|
-
const { canvas, getDevice } = createMockCanvas();
|
|
269
|
-
const renderer = await createRenderer(canvas, {}, { shaderManifestUrl: ENGINE_MANIFEST_URL });
|
|
270
|
-
const ready = await renderer.ready;
|
|
271
|
-
expect(ready.ok).toBe(true);
|
|
272
|
-
const device = getDevice();
|
|
273
|
-
|
|
274
|
-
// Walk every host-clamp target {1,3,5} plus an over-cap value (9 -> 5);
|
|
275
|
-
// each must drive a valid View UBO write + draw without a structured
|
|
276
|
-
// RhiError / device loss. A byte layout out of sync with the WGSL struct
|
|
277
|
-
// would fail compile/validate.
|
|
278
|
-
for (const ks of [1, 3, 5, 9]) {
|
|
279
|
-
const world = new World();
|
|
280
|
-
buildShadowScene(world, ks);
|
|
281
|
-
world.update(1 / 60).unwrap();
|
|
282
|
-
const draw = drawPublished(renderer, world);
|
|
283
|
-
expect(draw.ok, `draw failed at pcfKernelSize=${ks}`).toBe(true);
|
|
284
|
-
if (device !== undefined) await device.queue.onSubmittedWorkDone();
|
|
285
|
-
}
|
|
286
|
-
},
|
|
287
|
-
);
|
|
288
|
-
});
|