@forgeax/engine-runtime 0.1.4 → 0.1.7

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.
Files changed (606) hide show
  1. package/README.md +65 -83
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts +2 -0
  4. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts.map +1 -0
  5. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts +2 -0
  6. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts +2 -0
  8. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts.map +1 -0
  9. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts +11 -0
  10. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts.map +1 -0
  11. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts +2 -0
  12. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts.map +1 -0
  13. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts +2 -0
  14. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts.map +1 -0
  15. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts +2 -0
  16. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts.map +1 -0
  17. package/dist/__tests__/asset-registry-mounts.test.d.ts +2 -0
  18. package/dist/__tests__/asset-registry-mounts.test.d.ts.map +1 -0
  19. package/dist/__tests__/asset-registry.browser.test.d.ts +2 -0
  20. package/dist/__tests__/asset-registry.browser.test.d.ts.map +1 -0
  21. package/dist/__tests__/asset-registry.dawn.test.d.ts +2 -0
  22. package/dist/__tests__/asset-registry.dawn.test.d.ts.map +1 -0
  23. package/dist/__tests__/asset-registry.listCatalog.test.d.ts +2 -0
  24. package/dist/__tests__/asset-registry.listCatalog.test.d.ts.map +1 -0
  25. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts +2 -0
  26. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts.map +1 -0
  27. package/dist/__tests__/asset-registry.pack-cache.test.d.ts +2 -0
  28. package/dist/__tests__/asset-registry.pack-cache.test.d.ts.map +1 -0
  29. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts +2 -0
  30. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts.map +1 -0
  31. package/dist/__tests__/asset-registry.recursive.spec.d.ts +2 -0
  32. package/dist/__tests__/asset-registry.recursive.spec.d.ts.map +1 -0
  33. package/dist/__tests__/asset-registry.unit.test.d.ts +2 -0
  34. package/dist/__tests__/asset-registry.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/asset.unit.test.d.ts +2 -0
  36. package/dist/__tests__/asset.unit.test.d.ts.map +1 -0
  37. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts +2 -0
  38. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts.map +1 -0
  39. package/dist/__tests__/backend-selection.integration.test.d.ts +2 -0
  40. package/dist/__tests__/backend-selection.integration.test.d.ts.map +1 -0
  41. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts +2 -0
  42. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts.map +1 -0
  43. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts +2 -0
  44. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts.map +1 -0
  45. package/dist/__tests__/collect-scene-asset.test.d.ts +1 -2
  46. package/dist/__tests__/collect-scene-asset.test.d.ts.map +1 -1
  47. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts +2 -0
  48. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts.map +1 -0
  49. package/dist/__tests__/collect-transient-roundtrip.test.d.ts +1 -1
  50. package/dist/__tests__/collect-transient-roundtrip.test.d.ts.map +1 -1
  51. package/dist/__tests__/collect-transient-skip.test.d.ts +1 -2
  52. package/dist/__tests__/collect-transient-skip.test.d.ts.map +1 -1
  53. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts +2 -0
  54. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts.map +1 -0
  55. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts +2 -0
  56. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts.map +1 -0
  57. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts +2 -0
  58. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts.map +1 -0
  59. package/dist/__tests__/draw-published.d.ts +2 -2
  60. package/dist/__tests__/draw-published.d.ts.map +1 -1
  61. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts +2 -0
  62. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts.map +1 -0
  63. package/dist/__tests__/errors.unit.test.d.ts +2 -0
  64. package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
  65. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts +2 -0
  66. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts.map +1 -0
  67. package/dist/__tests__/fetch-binary-decompress.test.d.ts +2 -0
  68. package/dist/__tests__/fetch-binary-decompress.test.d.ts.map +1 -0
  69. package/dist/__tests__/four-path-compression.integration.test.d.ts +2 -0
  70. package/dist/__tests__/four-path-compression.integration.test.d.ts.map +1 -0
  71. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts +2 -0
  72. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts.map +1 -0
  73. package/dist/__tests__/guid-for-asset.unit.test.d.ts +2 -0
  74. package/dist/__tests__/guid-for-asset.unit.test.d.ts.map +1 -0
  75. package/dist/__tests__/handle-migration.test.d.ts +2 -0
  76. package/dist/__tests__/handle-migration.test.d.ts.map +1 -0
  77. package/dist/__tests__/helpers/register-runtime-components.d.ts.map +1 -1
  78. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts +2 -0
  79. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts.map +1 -0
  80. package/dist/__tests__/host-custom-kind-contract.test.d.ts +2 -0
  81. package/dist/__tests__/host-custom-kind-contract.test.d.ts.map +1 -0
  82. package/dist/__tests__/inspect-name.test.d.ts +2 -0
  83. package/dist/__tests__/inspect-name.test.d.ts.map +1 -0
  84. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts +2 -0
  85. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts.map +1 -0
  86. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts +2 -0
  87. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts.map +1 -0
  88. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts +2 -0
  89. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/loader-extract-graceful.test.d.ts +2 -0
  91. package/dist/__tests__/loader-extract-graceful.test.d.ts.map +1 -0
  92. package/dist/__tests__/loader-name-survival.test.d.ts +2 -0
  93. package/dist/__tests__/loader-name-survival.test.d.ts.map +1 -0
  94. package/dist/__tests__/mesh-bin-contract.test.d.ts +2 -0
  95. package/dist/__tests__/mesh-bin-contract.test.d.ts.map +1 -0
  96. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts +2 -0
  97. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts.map +1 -0
  98. package/dist/__tests__/mesh-bin.test.d.ts +2 -0
  99. package/dist/__tests__/mesh-bin.test.d.ts.map +1 -0
  100. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts +2 -0
  101. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts.map +1 -0
  102. package/dist/__tests__/new-kind-refs-contract.test.d.ts +2 -0
  103. package/dist/__tests__/new-kind-refs-contract.test.d.ts.map +1 -0
  104. package/dist/__tests__/package-promotion.test.d.ts +2 -0
  105. package/dist/__tests__/package-promotion.test.d.ts.map +1 -0
  106. package/dist/__tests__/package-rename.test.d.ts +2 -0
  107. package/dist/__tests__/package-rename.test.d.ts.map +1 -0
  108. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts +1 -1
  109. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts.map +1 -1
  110. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +1 -1
  111. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -1
  112. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts +10 -0
  113. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts.map +1 -0
  114. package/dist/__tests__/render-system-extract.unit.test.d.ts +2 -0
  115. package/dist/__tests__/render-system-extract.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/renderer-test-utils.d.ts +10 -0
  117. package/dist/__tests__/renderer-test-utils.d.ts.map +1 -0
  118. package/dist/__tests__/renderer.test-d.d.ts +2 -0
  119. package/dist/__tests__/renderer.test-d.d.ts.map +1 -0
  120. package/dist/__tests__/resolve-asset-handle-err.test.d.ts +2 -0
  121. package/dist/__tests__/resolve-asset-handle-err.test.d.ts.map +1 -0
  122. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts +2 -0
  123. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts.map +1 -0
  124. package/dist/__tests__/resolveName-fallback.test.d.ts +2 -0
  125. package/dist/__tests__/resolveName-fallback.test.d.ts.map +1 -0
  126. package/dist/__tests__/resolveName-null-package.test.d.ts +2 -0
  127. package/dist/__tests__/resolveName-null-package.test.d.ts.map +1 -0
  128. package/dist/__tests__/resolveName-unified-entry.test.d.ts +2 -0
  129. package/dist/__tests__/resolveName-unified-entry.test.d.ts.map +1 -0
  130. package/dist/__tests__/resolveName.test.d.ts +2 -0
  131. package/dist/__tests__/resolveName.test.d.ts.map +1 -0
  132. package/dist/__tests__/roots-to-scene-asset.test.d.ts +1 -1
  133. package/dist/__tests__/roots-to-scene-asset.test.d.ts.map +1 -1
  134. package/dist/__tests__/roundtrip-primitive.test.d.ts +2 -0
  135. package/dist/__tests__/roundtrip-primitive.test.d.ts.map +1 -0
  136. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts +2 -0
  137. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts.map +1 -0
  138. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts +2 -0
  139. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts.map +1 -0
  140. package/dist/__tests__/scene-mount-fixed-point.test.d.ts +2 -0
  141. package/dist/__tests__/scene-mount-fixed-point.test.d.ts.map +1 -0
  142. package/dist/__tests__/scene-mount-roundtrip.test.d.ts +2 -0
  143. package/dist/__tests__/scene-mount-roundtrip.test.d.ts.map +1 -0
  144. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts +2 -0
  145. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts.map +1 -0
  146. package/dist/__tests__/scene-sugar-instantiate.test.d.ts +2 -0
  147. package/dist/__tests__/scene-sugar-instantiate.test.d.ts.map +1 -0
  148. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts +2 -0
  149. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts.map +1 -0
  150. package/dist/__tests__/serialize-scene-asset.test.d.ts +1 -1
  151. package/dist/__tests__/serialize-scene-asset.test.d.ts.map +1 -1
  152. package/dist/__tests__/template-game-default-api-contract.test.d.ts +2 -0
  153. package/dist/__tests__/template-game-default-api-contract.test.d.ts.map +1 -0
  154. package/dist/__tests__/tileset-asset-validate.test.d.ts +2 -0
  155. package/dist/__tests__/tileset-asset-validate.test.d.ts.map +1 -0
  156. package/dist/__tests__/transcode-fallback.unit.test.d.ts +2 -0
  157. package/dist/__tests__/transcode-fallback.unit.test.d.ts.map +1 -0
  158. package/dist/__tests__/transient-runtime-behavior.test.d.ts +2 -0
  159. package/dist/__tests__/transient-runtime-behavior.test.d.ts.map +1 -0
  160. package/dist/__tests__/video-loader-consumption.test.d.ts +2 -0
  161. package/dist/__tests__/video-loader-consumption.test.d.ts.map +1 -0
  162. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts +2 -0
  163. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts.map +1 -0
  164. package/dist/backend-selection.d.ts +13 -0
  165. package/dist/backend-selection.d.ts.map +1 -0
  166. package/dist/collect-scene-asset.d.ts +7 -4
  167. package/dist/collect-scene-asset.d.ts.map +1 -1
  168. package/dist/createRenderer.d.ts +14 -2
  169. package/dist/createRenderer.d.ts.map +1 -1
  170. package/dist/errors/environment.d.ts +1 -1
  171. package/dist/errors/environment.d.ts.map +1 -1
  172. package/dist/index.d.ts +20 -82
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.mjs +107 -108
  175. package/dist/index.mjs.map +1 -1
  176. package/dist/renderer-host.d.ts +9 -0
  177. package/dist/renderer-host.d.ts.map +1 -0
  178. package/dist/renderer-host.mjs +62 -0
  179. package/dist/renderer-host.mjs.map +1 -0
  180. package/dist/scene-instances/index.d.ts +2 -0
  181. package/dist/scene-instances/index.d.ts.map +1 -0
  182. package/dist/scene-utils/mount-override-fold.d.ts +1 -2
  183. package/dist/scene-utils/mount-override-fold.d.ts.map +1 -1
  184. package/dist/systems/sprite-animation-tick.d.ts +1 -1
  185. package/dist/systems/sprite-animation-tick.d.ts.map +1 -1
  186. package/dist/systems/transparent-sort.d.ts +1 -2
  187. package/dist/systems/transparent-sort.d.ts.map +1 -1
  188. package/dist/tilemap-register-validate.d.ts.map +1 -1
  189. package/package.json +34 -33
  190. package/src/__tests__/active-camera.unit.test.ts +19 -9
  191. package/src/__tests__/animation-graph-collect-roundtrip.test.ts +213 -0
  192. package/src/__tests__/animation-graph-serialize.unit.test.ts +171 -0
  193. package/src/__tests__/append-injection.test.ts +1 -1
  194. package/src/__tests__/asset-brand-and-name-retirement.test.ts +102 -0
  195. package/src/__tests__/asset-error-exhaustive.test-d.ts +62 -0
  196. package/src/__tests__/asset-registry-guid-reverse.test.ts +608 -0
  197. package/src/__tests__/asset-registry-hdr-equirect.test.ts +78 -0
  198. package/src/__tests__/asset-registry-mesh-pack-payload.dawn.test.ts +232 -0
  199. package/src/__tests__/asset-registry-mounts.test.ts +806 -0
  200. package/src/__tests__/asset-registry.browser.test.ts +81 -0
  201. package/src/__tests__/asset-registry.dawn.test.ts +94 -0
  202. package/src/__tests__/asset-registry.listCatalog.test.ts +170 -0
  203. package/src/__tests__/asset-registry.mesh-bin.test.ts +316 -0
  204. package/src/__tests__/asset-registry.pack-cache.test.ts +969 -0
  205. package/src/__tests__/asset-registry.raw-container-failfast.test.ts +225 -0
  206. package/src/__tests__/asset-registry.recursive.spec.ts +1397 -0
  207. package/src/__tests__/asset-registry.unit.test.ts +1030 -0
  208. package/src/__tests__/asset.unit.test.ts +7107 -0
  209. package/src/__tests__/audio-load-by-guid.unit.test.ts +126 -0
  210. package/src/__tests__/backend-selection.integration.test.ts +11 -0
  211. package/src/__tests__/basis-catalog-dispatch.integration.test.ts +320 -0
  212. package/src/__tests__/bind-group-cache-keying.test.ts +4 -4
  213. package/src/__tests__/block-upload-math.unit.test.ts +2 -2
  214. package/src/__tests__/builtin-asset-registry.unit.test.ts +112 -0
  215. package/src/__tests__/builtin-shader-register-e2e.test.ts +1 -1
  216. package/src/__tests__/cache-false-eviction.test.ts +2 -1
  217. package/src/__tests__/cache-isolation-matrix.test.ts +2 -1
  218. package/src/__tests__/camera-clear-snapshot-equivalence.unit.test.ts +5 -6
  219. package/src/__tests__/clamp-to-last.e2e.browser.test.ts +29 -19
  220. package/src/__tests__/collect-scene-asset.test.ts +49 -52
  221. package/src/__tests__/collect-scene-mount-collapse.test.ts +391 -0
  222. package/src/__tests__/collect-subtree.unit.test.ts +1 -2
  223. package/src/__tests__/collect-transient-children-absent.test.ts +24 -10
  224. package/src/__tests__/collect-transient-roundtrip.test.ts +44 -20
  225. package/src/__tests__/collect-transient-skip.test.ts +24 -13
  226. package/src/__tests__/components.test-d.ts +1 -6
  227. package/src/__tests__/components.unit.test.ts +20 -19
  228. package/src/__tests__/composite-skybox-cross-world.browser.test.ts +59 -27
  229. package/src/__tests__/compressed-texture-physical-extent.integration.test.ts +139 -0
  230. package/src/__tests__/create-renderer-assembly.integration.test.ts +42 -29
  231. package/src/__tests__/createRenderer-dispose.test.ts +35 -402
  232. package/src/__tests__/createRenderer.browser-no-webgpu.test.ts +25 -30
  233. package/src/__tests__/createRenderer.unit.test.ts +1 -1
  234. package/src/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.ts +27 -63
  235. package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +56 -47
  236. package/src/__tests__/dawn/instances-per-instance-pbr.dawn.test.ts +49 -29
  237. package/src/__tests__/dawn/instances-shadow.dawn.test.ts +26 -15
  238. package/src/__tests__/dawn/instances-uniform-fallback.dawn.test.ts +13 -14
  239. package/src/__tests__/dawn/material-alpha.dawn.test.ts +23 -31
  240. package/src/__tests__/dawn/material-cooked-fixture.dawn.test.ts +24 -9
  241. package/src/__tests__/dawn/{mesh-update.dawn.test.ts → mesh-update-dawn.test.ts} +42 -134
  242. package/src/__tests__/dawn/mipmap-srgb-linear.dawn.test.ts +14 -7
  243. package/src/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.ts +16 -28
  244. package/src/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.ts +23 -39
  245. package/src/__tests__/dawn/upload-texture.dawn.test.ts +198 -0
  246. package/src/__tests__/dawn/user-handle-mesh-render.dawn.test.ts +12 -14
  247. package/src/__tests__/dawn/user-mesh-upload.dawn.test.ts +27 -22
  248. package/src/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.ts +25 -28
  249. package/src/__tests__/dawn/zero-manifest-ready.dawn.test.ts +10 -11
  250. package/src/__tests__/demo-sortscope-migration.unit.test.ts +5 -5
  251. package/src/__tests__/derive-bgl-integration.test.ts +34 -44
  252. package/src/__tests__/derive-render-data-skin.unit.test.ts +1 -1
  253. package/src/__tests__/draw-published.ts +11 -4
  254. package/src/__tests__/dynamic-texture-store.unit.test.ts +190 -0
  255. package/src/__tests__/equirect-bc6h.integration.test.ts +144 -21
  256. package/src/__tests__/errors.unit.test.ts +1227 -0
  257. package/src/__tests__/extract-frames-graceful-degradation.test.ts +3 -7
  258. package/src/__tests__/extract-frames-merge.test.ts +35 -22
  259. package/src/__tests__/extract-record-no-hardcoded-texture-fields.test.ts +5 -16
  260. package/src/__tests__/extract-skin-mismatch.unit.test.ts +322 -0
  261. package/src/__tests__/fetch-binary-decompress.test.ts +356 -0
  262. package/src/__tests__/four-path-compression.integration.test.ts +395 -0
  263. package/src/__tests__/frame-targets-shadow-regression.unit.test.ts +1 -1
  264. package/src/__tests__/fullscreen-feature-host.dawn.test.ts +80 -0
  265. package/src/__tests__/fullscreen-post-bgl-depth.test.ts +4 -2
  266. package/src/__tests__/fullscreen-post-depth-params-arity.test.ts +3 -3
  267. package/src/__tests__/fullscreen-post-process-pass.dawn.test.ts +39 -23
  268. package/src/__tests__/fullscreen-post-process-pass.unit.test.ts +4 -2
  269. package/src/__tests__/fxaa-pixel-diff.dawn.test.ts +28 -17
  270. package/src/__tests__/fxaa-validation-and-resize.dawn.test.ts +29 -18
  271. package/src/__tests__/fxaa-zero-overhead.dawn.test.ts +16 -12
  272. package/src/__tests__/geometry.unit.test.ts +525 -159
  273. package/src/__tests__/glyph-tilemap-worldid.test.ts +1 -1
  274. package/src/__tests__/gpu-resource-cow-survivor.test.ts +6 -4
  275. package/src/__tests__/guid-for-asset.unit.test.ts +102 -0
  276. package/src/__tests__/handle-migration.test.ts +136 -0
  277. package/src/__tests__/helpers/register-runtime-components.ts +4 -2
  278. package/src/__tests__/helpers/register-scene-components.ts +1 -1
  279. package/src/__tests__/host-custom-kind-contract.test-d.ts +47 -0
  280. package/src/__tests__/host-custom-kind-contract.test.ts +578 -0
  281. package/src/__tests__/inspect-name.test.ts +139 -0
  282. package/src/__tests__/instances.test-d.ts +1 -1
  283. package/src/__tests__/instantiate-mount-deferred-wiring.test.ts +112 -0
  284. package/src/__tests__/light-casters-9-light.browser.test.ts +73 -76
  285. package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +7 -10
  286. package/src/__tests__/light-snapshot.test-d.ts +2 -2
  287. package/src/__tests__/lights-vec-negative.unit.test.ts +1 -1
  288. package/src/__tests__/lights.unit.test.ts +31 -511
  289. package/src/__tests__/loadbyguid-payload.unit.test.ts +117 -0
  290. package/src/__tests__/loadbyguid-texture-intern.unit.test.ts +213 -0
  291. package/src/__tests__/loader-extract-graceful.test.ts +146 -0
  292. package/src/__tests__/loader-name-survival.test.ts +213 -0
  293. package/src/__tests__/m3-vec-negative.unit.test.ts +3 -2
  294. package/src/__tests__/material-texture-uv-scale.unit.test.ts +101 -31
  295. package/src/__tests__/materials.unit.test.ts +10 -27
  296. package/src/__tests__/mesh-bin-contract.test.ts +28 -0
  297. package/src/__tests__/mesh-bin-skin-roundtrip.unit.test.ts +149 -0
  298. package/src/__tests__/mesh-bin.test.ts +38 -0
  299. package/src/__tests__/mesh-loader-skin-contract.unit.test.ts +120 -0
  300. package/src/__tests__/mesh-ssbo-grow.unit.test.ts +3 -3
  301. package/src/__tests__/mip-gate.unit.test.ts +1 -1
  302. package/src/__tests__/msaa-sprite-pixel-diff.dawn.test.ts +29 -68
  303. package/src/__tests__/new-kind-refs-contract.test.ts +132 -0
  304. package/src/__tests__/node-shims.d.ts +4 -6
  305. package/src/__tests__/package-promotion.test.ts +88 -0
  306. package/src/__tests__/package-rename.test.ts +103 -0
  307. package/src/__tests__/pass-selector.unit.test.ts +2 -2
  308. package/src/__tests__/pbr-pipeline.unit.test.ts +21 -25
  309. package/src/__tests__/pipeline-builder-msaa.unit.test.ts +6 -9
  310. package/src/__tests__/pipeline-cache-keying.unit.test.ts +6 -9
  311. package/src/__tests__/pipeline-spec.test.ts +16 -177
  312. package/src/__tests__/pipeline.unit.test.ts +154 -1693
  313. package/src/__tests__/point-light-shadow.dawn.test.ts +33 -42
  314. package/src/__tests__/point-light-shadow.unit.test.ts +19 -60
  315. package/src/__tests__/post-process-error-codes.unit.test.ts +4 -1
  316. package/src/__tests__/post-process-params-component.unit.test.ts +1 -1
  317. package/src/__tests__/post-process-params-extract.unit.test.ts +2 -5
  318. package/src/__tests__/postprocess-camera-consistency.test.ts +4 -7
  319. package/src/__tests__/profiler-assembly.integration.test.ts +1 -1
  320. package/src/__tests__/propagate-transforms.dawn.test.ts +12 -11
  321. package/src/__tests__/record-worldid-isolation.test.ts +7 -29
  322. package/src/__tests__/recover-error-exhaustive.test-d.ts +1 -1
  323. package/src/__tests__/render-error-exhaustive.test-d.ts +117 -71
  324. package/src/__tests__/render-feature-assembly.test-d.ts +20 -9
  325. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +8 -6
  326. package/src/__tests__/render-feature-prepared-graphics.browser.test.ts +65 -559
  327. package/src/__tests__/render-feature-prepared-graphics.dawn.test.ts +57 -544
  328. package/src/__tests__/render-feature-prepared-graphics.fixture.ts +104 -0
  329. package/src/__tests__/render-feature-prepared-graphics.integration.test.ts +40 -248
  330. package/src/__tests__/render-feature-prepared-graphics.regression.integration.test.ts +83 -340
  331. package/src/__tests__/render-feature-recover.integration.test.ts +9 -49
  332. package/src/__tests__/render-feature-runtime-surface.test-d.ts +17 -20
  333. package/src/__tests__/render-schema-consumer.integration.test.ts +20 -13
  334. package/src/__tests__/render-schema-owner-boundary.unit.test.ts +2 -6
  335. package/src/__tests__/render-system-cross-world-overlay-queue.test.ts +5 -5
  336. package/src/__tests__/render-system-extract-dispatch-ordering.test.ts +16 -31
  337. package/src/__tests__/render-system-extract.test.ts +36 -51
  338. package/src/__tests__/render-system-extract.unit.test.ts +360 -0
  339. package/src/__tests__/render-system-fold-bucket.unit.test.ts +3 -5
  340. package/src/__tests__/render-system-fold-fallback.unit.test.ts +6 -3
  341. package/src/__tests__/render-system-fold-material.unit.test.ts +3 -5
  342. package/src/__tests__/render-system-fold-metrics.unit.test.ts +5 -5
  343. package/src/__tests__/render-system-fold-modegate.unit.test.ts +6 -6
  344. package/src/__tests__/render-system-fold.dawn.test.ts +7 -5
  345. package/src/__tests__/render-system-mega.test.ts +292 -190
  346. package/src/__tests__/render-system-owner-split-contract.test.ts +10 -32
  347. package/src/__tests__/render-system-record-multi-material-textureview.test.ts +59 -45
  348. package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +23 -29
  349. package/src/__tests__/render-system-record.test.ts +398 -235
  350. package/src/__tests__/render-system-record.unit.test.ts +25 -26
  351. package/src/__tests__/render-system-skin-bg.unit.test.ts +8 -12
  352. package/src/__tests__/renderer-consumer.test-d.ts +16 -3
  353. package/src/__tests__/renderer-health.unit.test.ts +26 -916
  354. package/src/__tests__/renderer-lifecycle.integration.test.ts +19 -6
  355. package/src/__tests__/renderer-recover.unit.test.ts +49 -1069
  356. package/src/__tests__/renderer-result.test-d.ts +19 -9
  357. package/src/__tests__/renderer-surface.unit.test.ts +3 -5
  358. package/src/__tests__/renderer-test-utils.ts +56 -0
  359. package/src/__tests__/renderer.test-d.ts +61 -0
  360. package/src/__tests__/resolve-asset-handle-err.test.ts +111 -0
  361. package/src/__tests__/resolve-asset-handle.unit.test.ts +64 -0
  362. package/src/__tests__/resolve-depth-only-view.test.ts +1 -1
  363. package/src/__tests__/resolveName-fallback.test.ts +64 -0
  364. package/src/__tests__/resolveName-null-package.test.ts +38 -0
  365. package/src/__tests__/resolveName-unified-entry.test.ts +65 -0
  366. package/src/__tests__/resolveName.test.ts +64 -0
  367. package/src/__tests__/rhi-null-command-flow.unit.test.ts +56 -260
  368. package/src/__tests__/rhi-null-renderer-lifecycle.unit.test.ts +41 -169
  369. package/src/__tests__/roots-to-scene-asset.test.ts +199 -93
  370. package/src/__tests__/roundtrip-primitive.test.ts +351 -0
  371. package/src/__tests__/scene-bare-guid-refs-instantiate.test.ts +123 -0
  372. package/src/__tests__/scene-equirect-roundtrip.test.ts +103 -16
  373. package/src/__tests__/scene-instance-authoring.integration.test.ts +8 -0
  374. package/src/__tests__/scene-instance-bridge.integration.test.ts +1 -1
  375. package/src/__tests__/scene-instance-component.test.ts +1 -1
  376. package/src/__tests__/scene-mount-fixed-point.test.ts +257 -0
  377. package/src/__tests__/scene-mount-roundtrip.test.ts +987 -0
  378. package/src/__tests__/scene-mount-wrapper-roundtrip.test.ts +202 -0
  379. package/src/__tests__/scene-sugar-instantiate.test.ts +324 -0
  380. package/src/__tests__/serialize-mounts-roundtrip.test.ts +533 -0
  381. package/src/__tests__/serialize-scene-asset.test.ts +219 -22
  382. package/src/__tests__/shadow-caster-empty-schema.test.ts +3 -3
  383. package/src/__tests__/shadow-csm-cascade-loadop.test.ts +37 -17
  384. package/src/__tests__/shadow-csm-component.test.ts +3 -5
  385. package/src/__tests__/shadow-csm-extract.test.ts +2 -100
  386. package/src/__tests__/shadow-csm-orthoz.test.ts +2 -16
  387. package/src/__tests__/shadow-csm-runtime-vary.dawn.test.ts +19 -14
  388. package/src/__tests__/shadow-csm-tile-consistency.test.ts +32 -26
  389. package/src/__tests__/shadow-csm-ubo.dawn.test.ts +8 -49
  390. package/src/__tests__/shadow-csm-ubo.test.ts +3 -25
  391. package/src/__tests__/shadow-csm-viewport.browser.test.ts +1 -1
  392. package/src/__tests__/shadow-fields-observable.dawn.test.ts +67 -56
  393. package/src/__tests__/shadow-m1.dawn.test.ts +8 -9
  394. package/src/__tests__/shadow-mesh-ssbo-order.test.ts +11 -27
  395. package/src/__tests__/skin-errors.unit.test.ts +1 -1
  396. package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +7 -5
  397. package/src/__tests__/skylight-lazy-projection.test.ts +36 -15
  398. package/src/__tests__/sparse-tag-scene-roundtrip.test.ts +5 -5
  399. package/src/__tests__/sprite-cullmode-flip.dawn.test.ts +47 -64
  400. package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +15 -14
  401. package/src/__tests__/sprite-lit-extract-branch.test.ts +1 -1
  402. package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +1 -1
  403. package/src/__tests__/ssao-bgl.test.ts +16 -9
  404. package/src/__tests__/ssao-buffers.test.ts +2 -2
  405. package/src/__tests__/ssao-data.test.ts +2 -2
  406. package/src/__tests__/ssao-errors.test.ts +1 -1
  407. package/src/__tests__/ssao-passes.test.ts +68 -392
  408. package/src/__tests__/ssao-pipelines.test.ts +1 -1
  409. package/src/__tests__/ssao-uniform-layout.test.ts +8 -6
  410. package/src/__tests__/stencil-outline-pixel.dawn.test.ts +25 -17
  411. package/src/__tests__/swap-chain-format.unit.test.ts +5 -7
  412. package/src/__tests__/systems.unit.test.ts +536 -1326
  413. package/src/__tests__/template-game-default-api-contract.test.ts +362 -0
  414. package/src/__tests__/text.unit.test.ts +56 -33
  415. package/src/__tests__/tilemap-childed-despawn.test.ts +8 -14
  416. package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +8 -12
  417. package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +2 -1
  418. package/src/__tests__/tilemap-chunk-extract.test.ts +13 -17
  419. package/src/__tests__/tilemap-dirty-rebuild.test.ts +7 -11
  420. package/src/__tests__/tilemap-material-cache.test.ts +8 -13
  421. package/src/__tests__/tilemap-multi-atlas.test.ts +12 -32
  422. package/src/__tests__/tilemap-owner-boundary.unit.test.ts +5 -2
  423. package/src/__tests__/tilemap-region-pack.test.ts +8 -12
  424. package/src/__tests__/tilemap-spawn-flip-pivot.test.ts +8 -12
  425. package/src/__tests__/tilemap-uv-inset.test.ts +11 -14
  426. package/src/__tests__/tilemap-validate.test.ts +1 -1
  427. package/src/__tests__/tileset-asset-validate.test.ts +638 -0
  428. package/src/__tests__/transcode-fallback.unit.test.ts +207 -0
  429. package/src/__tests__/transform-hierarchy-pixel-diff.dawn.test.ts +36 -28
  430. package/src/__tests__/transient-fields-collect.test.ts +28 -21
  431. package/src/__tests__/transient-runtime-behavior.test.ts +227 -0
  432. package/src/__tests__/transparent-sort-tilemap-sprite-interleave.test.ts +4 -4
  433. package/src/__tests__/variant-selection.unit.test.ts +1 -1
  434. package/src/__tests__/video-extract-bindgroup.dawn.test.ts +89 -136
  435. package/src/__tests__/video-loader-consumption.test.ts +86 -0
  436. package/src/__tests__/video-loader-smoke.dawn.test.ts +60 -0
  437. package/src/__tests__/view-ubo-layout.browser.test.ts +0 -22
  438. package/src/__tests__/world-entity-key.test.ts +1 -1
  439. package/src/__tests__/world-scene-despawn.test.ts +1 -1
  440. package/src/__tests__/world-scene-instantiate.test.ts +2 -36
  441. package/src/__tests__/world-scene-nested.test.ts +1 -1
  442. package/src/__tests__/world-scene-override.test.ts +1 -1
  443. package/src/backend-selection.ts +69 -0
  444. package/src/collect-scene-asset.ts +35 -23
  445. package/src/components/__tests__/camera.test-d.ts +1 -1
  446. package/src/components/__tests__/camera.test.ts +1 -1
  447. package/src/components/__tests__/sprite-animation.test-d.ts +2 -2
  448. package/src/components/__tests__/tile-layer.test-d.ts +1 -1
  449. package/src/components/__tests__/tile-layer.unit.test.ts +2 -2
  450. package/src/createRenderer.ts +24 -36
  451. package/src/errors/environment.ts +1 -1
  452. package/src/index.ts +51 -113
  453. package/src/renderer-host.ts +33 -0
  454. package/src/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.ts +1 -1
  455. package/src/scene-instances/index.ts +4 -0
  456. package/src/scene-utils/mount-override-fold.ts +3 -7
  457. package/src/systems/__tests__/transparent-sort.bench.ts +3 -3
  458. package/src/systems/sprite-animation-tick.ts +1 -1
  459. package/src/systems/transparent-sort.ts +38 -38
  460. package/src/tilemap-register-validate.ts +4 -4
  461. package/dist/__tests__/bind-group-cache-binding.test.d.ts +0 -2
  462. package/dist/__tests__/bind-group-cache-binding.test.d.ts.map +0 -1
  463. package/dist/__tests__/bind-group-cache-frame.test.d.ts +0 -2
  464. package/dist/__tests__/bind-group-cache-frame.test.d.ts.map +0 -1
  465. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts +0 -2
  466. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts.map +0 -1
  467. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts +0 -2
  468. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts.map +0 -1
  469. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts +0 -2
  470. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts.map +0 -1
  471. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts +0 -2
  472. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts.map +0 -1
  473. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts +0 -2
  474. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts.map +0 -1
  475. package/dist/__tests__/fog-producer-manifest.d.ts +0 -131
  476. package/dist/__tests__/fog-producer-manifest.d.ts.map +0 -1
  477. package/dist/__tests__/fog-producer-pixel-probe.d.ts +0 -42
  478. package/dist/__tests__/fog-producer-pixel-probe.d.ts.map +0 -1
  479. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts +0 -2
  480. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts.map +0 -1
  481. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts +0 -2
  482. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts.map +0 -1
  483. package/dist/__tests__/fog-producer-real-fixture.d.ts +0 -5
  484. package/dist/__tests__/fog-producer-real-fixture.d.ts.map +0 -1
  485. package/dist/__tests__/fog-producer-vfx-effect.d.ts +0 -3
  486. package/dist/__tests__/fog-producer-vfx-effect.d.ts.map +0 -1
  487. package/dist/__tests__/fog-scene-asset.integration.test.d.ts +0 -2
  488. package/dist/__tests__/fog-scene-asset.integration.test.d.ts.map +0 -1
  489. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts +0 -2
  490. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts.map +0 -1
  491. package/dist/__tests__/gpu-resource.test.d.ts +0 -2
  492. package/dist/__tests__/gpu-resource.test.d.ts.map +0 -1
  493. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts +0 -2
  494. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts.map +0 -1
  495. package/dist/__tests__/hdrp-buffers.unit.test.d.ts +0 -2
  496. package/dist/__tests__/hdrp-buffers.unit.test.d.ts.map +0 -1
  497. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts +0 -2
  498. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts.map +0 -1
  499. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts +0 -2
  500. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts.map +0 -1
  501. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts +0 -2
  502. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts.map +0 -1
  503. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts +0 -2
  504. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts.map +0 -1
  505. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts +0 -2
  506. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts.map +0 -1
  507. package/dist/__tests__/helpers/primitive-world.d.ts +0 -8
  508. package/dist/__tests__/helpers/primitive-world.d.ts.map +0 -1
  509. package/dist/__tests__/helpers/render-asset-port.d.ts +0 -15
  510. package/dist/__tests__/helpers/render-asset-port.d.ts.map +0 -1
  511. package/dist/__tests__/helpers/scene-asset-port.d.ts +0 -9
  512. package/dist/__tests__/helpers/scene-asset-port.d.ts.map +0 -1
  513. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts +0 -2
  514. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts.map +0 -1
  515. package/dist/__tests__/pipeline-layout-selection.test.d.ts +0 -2
  516. package/dist/__tests__/pipeline-layout-selection.test.d.ts.map +0 -1
  517. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts +0 -2
  518. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts.map +0 -1
  519. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts +0 -2
  520. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts.map +0 -1
  521. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts +0 -2
  522. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts.map +0 -1
  523. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts +0 -2
  524. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts.map +0 -1
  525. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts +0 -2
  526. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts.map +0 -1
  527. package/dist/__tests__/shadow-csm-pssm.test.d.ts +0 -2
  528. package/dist/__tests__/shadow-csm-pssm.test.d.ts.map +0 -1
  529. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts +0 -2
  530. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts.map +0 -1
  531. package/dist/__tests__/shadow-csm-viewport.test.d.ts +0 -2
  532. package/dist/__tests__/shadow-csm-viewport.test.d.ts.map +0 -1
  533. package/dist/__tests__/shadow-m2.dawn.test.d.ts +0 -2
  534. package/dist/__tests__/shadow-m2.dawn.test.d.ts.map +0 -1
  535. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts +0 -2
  536. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts.map +0 -1
  537. package/dist/__tests__/shadow-m3-calibrate.d.ts +0 -83
  538. package/dist/__tests__/shadow-m3-calibrate.d.ts.map +0 -1
  539. package/dist/__tests__/shadow-m3.dawn.test.d.ts +0 -2
  540. package/dist/__tests__/shadow-m3.dawn.test.d.ts.map +0 -1
  541. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts +0 -2
  542. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts.map +0 -1
  543. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts +0 -2
  544. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts.map +0 -1
  545. package/dist/__tests__/temporal-off-path.unit.test.d.ts +0 -2
  546. package/dist/__tests__/temporal-off-path.unit.test.d.ts.map +0 -1
  547. package/dist/__tests__/video-cache-regression.unit.test.d.ts +0 -2
  548. package/dist/__tests__/video-cache-regression.unit.test.d.ts.map +0 -1
  549. package/dist/asset-kind.d.ts +0 -4
  550. package/dist/asset-kind.d.ts.map +0 -1
  551. package/dist/errors/sprite-animation.d.ts +0 -3
  552. package/dist/errors/sprite-animation.d.ts.map +0 -1
  553. package/dist/scene-asset-port.d.ts +0 -17
  554. package/dist/scene-asset-port.d.ts.map +0 -1
  555. package/dist/scene-collect-errors.d.ts +0 -22
  556. package/dist/scene-collect-errors.d.ts.map +0 -1
  557. package/dist/shadow-m3-calibrate.d.ts +0 -40
  558. package/dist/shadow-m3-calibrate.d.ts.map +0 -1
  559. package/src/__tests__/bind-group-cache-binding.test.ts +0 -2513
  560. package/src/__tests__/bind-group-cache-frame.test.ts +0 -1511
  561. package/src/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.ts +0 -204
  562. package/src/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.ts +0 -297
  563. package/src/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.ts +0 -271
  564. package/src/__tests__/dispatch-fullscreen-pass-params.unit.test.ts +0 -321
  565. package/src/__tests__/fog-producer-manifest.ts +0 -162
  566. package/src/__tests__/fog-producer-pixel-probe.ts +0 -263
  567. package/src/__tests__/fog-producer-pixel.browser.test.ts +0 -26
  568. package/src/__tests__/fog-producer-pixel.dawn.test.ts +0 -55
  569. package/src/__tests__/fog-producer-real-fixture.ts +0 -805
  570. package/src/__tests__/fog-producer-vfx-effect.ts +0 -272
  571. package/src/__tests__/fog-scene-asset.integration.test.ts +0 -123
  572. package/src/__tests__/gpu-resource-store-cubemap-status.test.ts +0 -207
  573. package/src/__tests__/gpu-resource.test.ts +0 -1206
  574. package/src/__tests__/hdrp-bgl-slots.browser.test.ts +0 -50
  575. package/src/__tests__/hdrp-buffers.unit.test.ts +0 -70
  576. package/src/__tests__/hdrp-execute-filter.unit.test.ts +0 -200
  577. package/src/__tests__/hdrp-gbuffer-attachments.browser.test.ts +0 -64
  578. package/src/__tests__/hdrp-pipeline-asset-type.test-d.ts +0 -139
  579. package/src/__tests__/hdrp-ssao-boundary.test.ts +0 -237
  580. package/src/__tests__/hdrp-ssao-falsification.test.ts +0 -289
  581. package/src/__tests__/helpers/primitive-world.ts +0 -91
  582. package/src/__tests__/helpers/render-asset-port.ts +0 -65
  583. package/src/__tests__/helpers/scene-asset-port.ts +0 -23
  584. package/src/__tests__/material-derived-coordinates.integration.test.ts +0 -100
  585. package/src/__tests__/pipeline-layout-selection.test.ts +0 -298
  586. package/src/__tests__/post-process-reads-narrowing.test-d.ts +0 -52
  587. package/src/__tests__/post-process-register-roundtrip.dawn.test.ts +0 -230
  588. package/src/__tests__/render-feature-zero-feature.browser.test.ts +0 -152
  589. package/src/__tests__/render-pipeline-trivial.dawn.test.ts +0 -525
  590. package/src/__tests__/shadow-csm-caster-membership.test.ts +0 -232
  591. package/src/__tests__/shadow-csm-pssm.test.ts +0 -142
  592. package/src/__tests__/shadow-csm-temporal.browser.test.ts +0 -145
  593. package/src/__tests__/shadow-csm-viewport.test.ts +0 -74
  594. package/src/__tests__/shadow-m2.dawn.test.ts +0 -394
  595. package/src/__tests__/shadow-m3-calibrate-run.dawn.test.ts +0 -248
  596. package/src/__tests__/shadow-m3-calibrate.ts +0 -203
  597. package/src/__tests__/shadow-m3.dawn.test.ts +0 -288
  598. package/src/__tests__/shadow-probe-control-flow.dawn.test.ts +0 -264
  599. package/src/__tests__/shadow-quality-metrics.dawn.test.ts +0 -324
  600. package/src/__tests__/temporal-off-path.unit.test.ts +0 -69
  601. package/src/__tests__/video-cache-regression.unit.test.ts +0 -186
  602. package/src/asset-kind.ts +0 -7
  603. package/src/errors/sprite-animation.ts +0 -5
  604. package/src/scene-asset-port.ts +0 -32
  605. package/src/scene-collect-errors.ts +0 -30
  606. 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
- });