@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
@@ -12,16 +12,15 @@
12
12
  // mapSize 2048 -> 1024 -> 2048 the same way. Asserts every draw returns
13
13
  // `ok: true` and no device-lost / structured RhiError fires.
14
14
  //
15
- // best-effort: we do not pixel-readback (M3 atlas slot debugReadback was
16
- // retuned in w28 transitional); the gate is "render loop completes
17
- // without device error".
15
+ // This is a structural GPU behavior gate: the unified Standard shadow graph
16
+ // must rebuild its atlas and continue drawing without device errors.
18
17
 
19
18
  import type { EntityHandle } from '@forgeax/engine-ecs';
20
19
  import { World } from '@forgeax/engine-ecs';
21
- import { Camera, DirectionalLight } from '@forgeax/engine-render/internal';
20
+ import { Camera, DirectionalLight } from '@forgeax/engine-render';
22
21
  import { Transform } from '@forgeax/engine-scene';
23
22
  import { describe, expect, it } from 'vitest';
24
- import { createRenderer } from '../createRenderer';
23
+ import { constructRuntimeRendererHost } from '../renderer-host';
25
24
  import { drawPublished } from './draw-published';
26
25
 
27
26
  const ENGINE_MANIFEST = await (async () => {
@@ -127,13 +126,15 @@ describe('CSM runtime cascade + mapSize variation (M5/w26)', () => {
127
126
  it('cascadeCount 4 -> 2 -> 4 round-trip without device error', async () => {
128
127
  if (!dawnReady) return;
129
128
  const canvas = createMockCanvas();
130
- const renderer = await createRenderer(
129
+ const host = await constructRuntimeRendererHost(
131
130
  canvas as unknown as HTMLCanvasElement,
132
131
  {},
133
132
  { shaderManifestUrl: ENGINE_MANIFEST_URL },
134
133
  );
135
- const ready = await renderer.ready;
136
- expect(ready.ok).toBe(true);
134
+ expect(host.ok).toBe(true);
135
+ if (!host.ok) throw host.error;
136
+ const { renderer } = host.value;
137
+ expect(renderer.inspect().state).toBe('alive');
137
138
  const { world, shadowEntity } = buildScene(4, 2048);
138
139
 
139
140
  expect(drawPublished(renderer, world).ok).toBe(true);
@@ -156,13 +157,15 @@ describe('CSM runtime cascade + mapSize variation (M5/w26)', () => {
156
157
  it('mapSize 2048 -> 1024 -> 2048 RT rebuild without device error', async () => {
157
158
  if (!dawnReady) return;
158
159
  const canvas = createMockCanvas();
159
- const renderer = await createRenderer(
160
+ const host = await constructRuntimeRendererHost(
160
161
  canvas as unknown as HTMLCanvasElement,
161
162
  {},
162
163
  { shaderManifestUrl: ENGINE_MANIFEST_URL },
163
164
  );
164
- const ready = await renderer.ready;
165
- expect(ready.ok).toBe(true);
165
+ expect(host.ok).toBe(true);
166
+ if (!host.ok) throw host.error;
167
+ const { renderer } = host.value;
168
+ expect(renderer.inspect().state).toBe('alive');
166
169
  const { world, shadowEntity } = buildScene(4, 2048);
167
170
 
168
171
  expect(drawPublished(renderer, world).ok).toBe(true);
@@ -185,13 +188,15 @@ describe('CSM runtime cascade + mapSize variation (M5/w26)', () => {
185
188
  it('cascadeCount=1 renders through the unified pathway (AC-10)', async () => {
186
189
  if (!dawnReady) return;
187
190
  const canvas = createMockCanvas();
188
- const renderer = await createRenderer(
191
+ const host = await constructRuntimeRendererHost(
189
192
  canvas as unknown as HTMLCanvasElement,
190
193
  {},
191
194
  { shaderManifestUrl: ENGINE_MANIFEST_URL },
192
195
  );
193
- const ready = await renderer.ready;
194
- expect(ready.ok).toBe(true);
196
+ expect(host.ok).toBe(true);
197
+ if (!host.ok) throw host.error;
198
+ const { renderer } = host.value;
199
+ expect(renderer.inspect().state).toBe('alive');
195
200
  const { world } = buildScene(1, 1024);
196
201
  expect(drawPublished(renderer, world).ok).toBe(true);
197
202
  });
@@ -26,10 +26,8 @@ import { readFileSync } from 'node:fs';
26
26
  import { fileURLToPath } from 'node:url';
27
27
  import type { World as WorldType } from '@forgeax/engine-ecs';
28
28
  import type { Renderer as RendererType } from '@forgeax/engine-render';
29
- import { directionalCascadeRasterViewport } from '@forgeax/engine-render/internal';
30
29
  import type { Handle } from '@forgeax/engine-types';
31
30
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
32
- import { TEST_CUBE_HANDLE, withPrimitiveMeshes } from './helpers/primitive-world';
33
31
 
34
32
  const ENGINE = '../createRenderer';
35
33
 
@@ -196,17 +194,29 @@ async function importEngine(): Promise<{
196
194
  opts?: unknown,
197
195
  bundler?: unknown,
198
196
  ) => Promise<{
199
- ready: Promise<void>;
197
+ subscribe: (listener: (event: unknown) => void) => () => void;
200
198
  draw: (worlds: unknown, opts: { cameraOwner: number; resourceOwner: number }) => void;
201
- onError: (cb: (err: { code: string }) => void) => () => void;
202
199
  }>;
203
200
  }> {
204
- return (await import(ENGINE)) as never;
201
+ const engine = (await import(ENGINE)) as {
202
+ createRenderer: (...args: readonly unknown[]) => Promise<unknown>;
203
+ };
204
+ return {
205
+ createRenderer: async (...args: readonly unknown[]) => {
206
+ const result = (await engine.createRenderer(...args)) as
207
+ | { readonly ok: true; readonly value: unknown }
208
+ | { readonly ok: false; readonly error: unknown };
209
+ if (!result.ok) throw result.error;
210
+ return result.value as {
211
+ subscribe: (listener: (event: unknown) => void) => () => void;
212
+ draw: (worlds: unknown, opts: { cameraOwner: number; resourceOwner: number }) => void;
213
+ };
214
+ },
215
+ };
205
216
  }
206
217
 
207
218
  async function importEcs(): Promise<{ World: new () => unknown }> {
208
- const { World: BaseWorld } = await import('@forgeax/engine-ecs');
209
- return { World: withPrimitiveMeshes(BaseWorld) } as never;
219
+ return (await import('@forgeax/engine-ecs')) as never;
210
220
  }
211
221
 
212
222
  async function importComponents(): Promise<{
@@ -218,9 +228,9 @@ async function importComponents(): Promise<{
218
228
  HANDLE_CUBE: Handle<'MeshAsset', 'shared'>;
219
229
  }> {
220
230
  return {
221
- ...(await import('@forgeax/engine-render/internal')),
231
+ ...(await import('@forgeax/engine-render')),
222
232
  ...(await import('@forgeax/engine-scene')),
223
- HANDLE_CUBE: TEST_CUBE_HANDLE,
233
+ ...(await import('@forgeax/engine-assets-runtime')),
224
234
  } as never;
225
235
  }
226
236
 
@@ -238,7 +248,6 @@ async function captureCascadeViewports(cascadeCount: number, mapSize: number): P
238
248
  {},
239
249
  { shaderManifestUrl: buildManifestDataUrl() },
240
250
  );
241
- await renderer.ready;
242
251
  const { World } = await importEcs();
243
252
  const C = await importComponents();
244
253
  const world = new (World as new () => { spawn: (...componentDatas: unknown[]) => unknown })();
@@ -274,8 +283,8 @@ async function captureCascadeViewports(cascadeCount: number, mapSize: number): P
274
283
  { component: C.MeshRenderer, data: {} },
275
284
  { component: C.Transform, data: identityTransform() },
276
285
  );
277
- renderer.onError(() => undefined);
278
- if (!(renderer as unknown as RendererType).attachWorld(world as WorldType).ok) {
286
+ renderer.subscribe(() => undefined);
287
+ if (!(renderer as unknown as RendererType).attach(world as WorldType).ok) {
279
288
  throw new Error('World attachment failed');
280
289
  }
281
290
  (world as WorldType).update().unwrap();
@@ -291,13 +300,13 @@ function canonicalTile(layer: number, count: number): { col: number; row: number
291
300
  }
292
301
 
293
302
  // Read the WGSL the GPU actually compiles and evaluate its _atlasTileGrid
294
- // branch-free columns rule (select(2u, 1u, count<=1u)) so the sampler-side
295
- // mapping is pinned to the real shader source, not a hand-copy.
303
+ // column rule (select(2u, 1u, count<=1u)) so the sampler-side mapping is pinned
304
+ // to the real shader source, not a hand-copy.
296
305
  const LIGHTING_WGSL = fileURLToPath(
297
306
  new URL('../../../shader/src/lighting-directional.wgsl', import.meta.url),
298
307
  );
299
308
 
300
- function wgslAtlasGrid(count: number): { columns: number; rows: number } {
309
+ function wgslAtlasTilesPerSide(count: number): number {
301
310
  const src = readFileSync(LIGHTING_WGSL, 'utf8');
302
311
  // The shader rule lives in _atlasTileGrid: columns = select(2u,1u,count<=1u).
303
312
  // We assert that exact expression is present, then evaluate it here.
@@ -307,13 +316,12 @@ function wgslAtlasGrid(count: number): { columns: number; rows: number } {
307
316
  'lighting-directional.wgsl _atlasTileGrid columns rule changed; update AC-04 test',
308
317
  );
309
318
  }
310
- const columns = count <= 1 ? 1 : 2;
311
- return { columns, rows: Math.ceil(count / columns) };
319
+ return count <= 1 ? 1 : 2;
312
320
  }
313
321
 
314
322
  function wgslAtlasTile(layer: number, count: number): { col: number; row: number } {
315
- const { columns } = wgslAtlasGrid(count);
316
- return { col: layer % columns, row: Math.floor(layer / columns) };
323
+ const tilesPerSide = wgslAtlasTilesPerSide(count);
324
+ return { col: layer % tilesPerSide, row: Math.floor(layer / tilesPerSide) };
317
325
  }
318
326
 
319
327
  describe('CSM cascade tile / matrix / viewport three-way agreement (AC-04, AC-06)', () => {
@@ -355,18 +363,16 @@ describe('CSM cascade tile / matrix / viewport three-way agreement (AC-04, AC-06
355
363
 
356
364
  // (3) matrix slot: layer index maps 1:1 to lightViewProj_A..D, so the
357
365
  // slot index IS the layer. The depth pass uses cascadeIndex=layer to
358
- // pick the same matrix (urp-pipeline addShadowPass cascadeIndex: i).
366
+ // pick the same matrix used by the typed shadow cascade at index i.
359
367
  const matrixSlot = layer;
360
- const producerViewport = directionalCascadeRasterViewport(layer, count, mapSize);
361
368
 
362
369
  // Three-way: all point at the same tile, and the matrix slot is the
363
370
  // layer that produced it.
364
371
  expect(depthTile).toEqual(samplerTile);
365
372
  expect(depthTile).toEqual(canonicalTile(layer, count));
366
- expect(vp).toEqual(producerViewport);
367
373
  expect(matrixSlot).toBe(layer);
368
374
  }
369
- });
375
+ }, 30_000);
370
376
  }
371
377
 
372
378
  it('AC-06: count=1 collapses to tile (0,0), matrix slot 0, viewport (0,0)', async () => {
@@ -377,7 +383,7 @@ describe('CSM cascade tile / matrix / viewport three-way agreement (AC-04, AC-06
377
383
  expect(vp).toEqual({ x: 0, y: 0, w: mapSize, h: mapSize });
378
384
  expect(wgslAtlasTile(0, 1)).toEqual({ col: 0, row: 0 });
379
385
  expect(canonicalTile(0, 1)).toEqual({ col: 0, row: 0 });
380
- });
386
+ }, 30_000);
381
387
  });
382
388
 
383
389
  // AC-07 (9-tap PCF offset coordinate-system self-consistency).
@@ -412,8 +418,8 @@ describe('AC-07: PCF offset coordinate-system self-consistency (static source ch
412
418
  // of kernels {1,3,5} in-tile).
413
419
  expect(src).toMatch(/let\s+tileLo\s*=\s*tileOrigin\s*\+\s*texel/);
414
420
  expect(src).toMatch(/let\s+tileHi\s*=\s*tileOrigin\s*\+\s*tileScale\s*-\s*texel/);
415
- // count=1 => grid=1x1 => tileScale=1, tileOrigin=(0,0) => uv === tileUv, so
421
+ // count=1 => columns=1 => tileScale=(1,1), tileOrigin=(0,0) => uv === tileUv, so
416
422
  // the OOB guard space and sample space coincide regardless of the clamp.
417
- expect(wgslAtlasGrid(1)).toEqual({ columns: 1, rows: 1 });
423
+ expect(wgslAtlasTilesPerSide(1)).toBe(1);
418
424
  });
419
425
  });
@@ -5,20 +5,22 @@
5
5
  // back. Validates lightViewProj[4] + splitPlanes[4] + cascadeCount/cascadeBlend
6
6
  // survive the queue.writeBuffer round-trip without corruption.
7
7
  //
8
- // Layout matches shadow-csm-ubo.test.ts — 240 f32 / 960 B std140 after
8
+ // Layout matches shadow-csm-ubo.test.ts — 196 f32 / 784 B std140 after
9
9
  // feat-20260625 w25 folded the spot lightViewProj array into the View UBO tail.
10
10
  // The directional cascade offsets [0..125] this test exercises are unchanged;
11
11
  // the extra tail (floats 132..195) stays zero in this round-trip.
12
12
  //
13
- // The payload includes the appended Fog lanes after the temporal projection
14
- // facts; the round-trip keeps those values in the existing View uniform slot.
13
+ // Red phase: common.wgsl still has lightSpaceMatrix (not lightViewProj array);
14
+ // record.ts still writes single lightSpaceMatrix. This test writes the NEW
15
+ // layout directly and reads back independently — it will be red until w16/w25
16
+ // land.
15
17
 
16
18
  import { describe, expect, it } from 'vitest';
17
19
 
18
20
  // ── Constants (mirrors current View UBO layout) ─────────────────────────────
19
21
 
20
- const VIEW_UBO_FLOAT_COUNT = 240;
21
- const VIEW_UBO_BYTES = 960;
22
+ const VIEW_UBO_FLOAT_COUNT = 196;
23
+ const VIEW_UBO_BYTES = 784;
22
24
 
23
25
  // f32 indices matching std140 byte offsets.
24
26
  const OFF = {
@@ -33,10 +35,6 @@ const OFF = {
33
35
  SP3: 120, // splitPlanes[3] — byte 480
34
36
  CC: 124, // cascadeCount — byte 496
35
37
  CB: 125, // cascadeBlend — byte 500
36
- FOG_COLOR: 232, // fog.color.xyz — byte 928
37
- FOG_DENSITY: 235, // fog.density — byte 940
38
- FOG_HEIGHT_FALLOFF: 236, // fog.heightFalloff — byte 944
39
- FOG_MAX_OPACITY: 237, // fog.maxOpacity — byte 948
40
38
  } as const;
41
39
 
42
40
  const GPUMapMode: { readonly READ: number } = ((): { readonly READ: number } => {
@@ -68,17 +66,8 @@ const UNIFORM = 0x0040; // GPUBufferUsage.UNIFORM
68
66
  // biome-ignore lint/suspicious/noExplicitAny: dawn-node detection guard
69
67
  const dawnReady = typeof navigator !== 'undefined' && (navigator as any).gpu !== undefined;
70
68
 
71
- const commonViewSource = await (async () => {
72
- const { readFile } = await import('node:fs/promises');
73
- const { fileURLToPath } = await import('node:url');
74
- return readFile(
75
- fileURLToPath(new URL('../../../shader/src/common.wgsl', import.meta.url)),
76
- 'utf8',
77
- );
78
- })();
79
-
80
69
  /**
81
- * Build a 240-float View UBO payload with known test values.
70
+ * Build a 196-float View UBO payload with known test values.
82
71
  * All 4 lightViewProj matrices are identity; splitPlanes use
83
72
  * monotonic values; cascadeCount=4, cascadeBlend=0.2.
84
73
  */
@@ -119,14 +108,6 @@ function buildTestPayload(cascadeCount: number, cascadeBlend: number): Float32Ar
119
108
  f32[OFF.CC] = cascadeCount;
120
109
  f32[OFF.CB] = cascadeBlend;
121
110
 
122
- // Fog payload occupies the tail of the same View uniform slot.
123
- f32[OFF.FOG_COLOR] = 0.2;
124
- f32[OFF.FOG_COLOR + 1] = 0.4;
125
- f32[OFF.FOG_COLOR + 2] = 0.8;
126
- f32[OFF.FOG_DENSITY] = 0.035;
127
- f32[OFF.FOG_HEIGHT_FALLOFF] = 0.28;
128
- f32[OFF.FOG_MAX_OPACITY] = 0.92;
129
-
130
111
  return f32;
131
112
  }
132
113
 
@@ -194,14 +175,6 @@ describe('View UBO CSM round-trip (w15)', () => {
194
175
  // Verify lightViewProj[3] diagonal element.
195
176
  expect(readback[OFF.LVP3 + 10]).toBeCloseTo(0.4, 5);
196
177
 
197
- // Verify Fog remains in the same View slot after the CSM tail.
198
- expect(readback[OFF.FOG_COLOR]).toBeCloseTo(0.2, 5);
199
- expect(readback[OFF.FOG_COLOR + 1]).toBeCloseTo(0.4, 5);
200
- expect(readback[OFF.FOG_COLOR + 2]).toBeCloseTo(0.8, 5);
201
- expect(readback[OFF.FOG_DENSITY]).toBeCloseTo(0.035, 5);
202
- expect(readback[OFF.FOG_HEIGHT_FALLOFF]).toBeCloseTo(0.28, 5);
203
- expect(readback[OFF.FOG_MAX_OPACITY]).toBeCloseTo(0.92, 5);
204
-
205
178
  staging.unmap();
206
179
  staging.destroy();
207
180
  stagingUpload.destroy();
@@ -277,17 +250,3 @@ describe('View UBO CSM round-trip (w15)', () => {
277
250
  });
278
251
  });
279
252
  });
280
-
281
- describe('Fog View ABI Dawn transport shape (M2)', () => {
282
- it('uses the expanded View slot for the Fog payload', () => {
283
- expect(VIEW_UBO_FLOAT_COUNT).toBe(240);
284
- expect(VIEW_UBO_BYTES).toBe(960);
285
- expect(VIEW_UBO_BYTES).toBeLessThanOrEqual(1024);
286
- });
287
-
288
- it('keeps Fog as a field of the existing View uniform binding', () => {
289
- expect(commonViewSource).toContain('fog : FogViewParams');
290
- expect(commonViewSource).toContain('@group(0) @binding(0) var<uniform> view : View;');
291
- expect(commonViewSource).not.toContain('@group(0) @binding(10)');
292
- });
293
- });
@@ -260,15 +260,13 @@ describe('pcfKernelSize tail-pad slot wiring (M0, AC-14)', () => {
260
260
  );
261
261
  });
262
262
 
263
- it('record appends two temporal view-projection matrices after the folded spot matrices', () => {
263
+ it('record carries the folded spot matrices in the complete View UBO payload (w25)', () => {
264
264
  // feat-20260625 w25: the per-spot fragment-read lightViewProj matrices fold
265
- // into the View UBO tail, so VIEW_PAYLOAD_FLOATS now includes temporal
266
- // projection and Fog lanes after the folded matrices.
265
+ // into the View UBO tail. The current View struct also carries temporal and
266
+ // fog fields, so the complete payload is 240 floats.
267
267
  expect(recordSrc).toMatch(/VIEW_PAYLOAD_FLOATS\s*=\s*240/);
268
268
  // The spot matrix array is written at base float 132.
269
269
  expect(recordSrc).toMatch(/SPOT_LVP_BASE_FLOAT\s*=\s*132/);
270
- expect(recordSrc).toContain('viewPayload[196 + index]');
271
- expect(recordSrc).toContain('viewPayload[212 + index]');
272
270
  });
273
271
 
274
272
  it('common.wgsl View struct declares depthBias/normalBias/pcfKernelSize after cascadeBlend', () => {
@@ -278,23 +276,3 @@ describe('pcfKernelSize tail-pad slot wiring (M0, AC-14)', () => {
278
276
  expect(m).not.toBeNull();
279
277
  });
280
278
  });
281
-
282
- describe('Fog View ABI host shape (M2)', () => {
283
- const recordSrc = readFileSync(
284
- fileURLToPath(new URL('../../../render/src/record/view-ubo.ts', import.meta.url)),
285
- 'utf8',
286
- );
287
-
288
- it('uses the current host payload shape rather than the stale 784 B prefix', () => {
289
- expect(recordSrc).toMatch(/VIEW_UNIFORM_BYTES\s*=\s*960/);
290
- expect(recordSrc).toMatch(/VIEW_PAYLOAD_FLOATS\s*=\s*240/);
291
- expect(recordSrc).not.toContain('VIEW_UNIFORM_BYTES = 928');
292
- });
293
-
294
- it('packs all four Fog parameters in the View write path', () => {
295
- expect(recordSrc).toContain('fog.color');
296
- expect(recordSrc).toContain('fog.density');
297
- expect(recordSrc).toContain('fog.heightFalloff');
298
- expect(recordSrc).toContain('fog.maxOpacity');
299
- });
300
- });
@@ -7,7 +7,7 @@
7
7
  // setViewport against atlas-sized target), so this browser test covers the
8
8
  // real GPU path.
9
9
  //
10
- // AC-05: atlas tile viewports; D-5: cascadeCount=4 4 addShadowPass calls;
10
+ // AC-05: atlas tile viewports; D-5: cascadeCount=4 -> 4 typed shadow passes;
11
11
  // D-6: pass names shadowCascade0..3.
12
12
 
13
13
  import { describe, expect, it } from 'vitest';
@@ -8,24 +8,25 @@
8
8
  // ShadowCaster pass (nothing written into shadow depth atlas), (b) floor
9
9
  // position outside camera frustum. Both fixed in the harness below.
10
10
  //
11
- // Each pixel A/B pair gets its own `it()` with a fresh createRenderer call --
11
+ // Each pixel A/B pair gets its own `it()` with a fresh runtime host --
12
12
  // shadow-atlas state and device-lost crashes from prior A/B rounds cannot
13
13
  // contaminate the current comparison.
14
14
 
15
+ import { HANDLE_CUBE } from '@forgeax/engine-assets-runtime';
15
16
  import { World } from '@forgeax/engine-ecs';
16
- import { createPrimitiveMesh } from '@forgeax/engine-geometry';
17
+ import type { Renderer } from '@forgeax/engine-render';
17
18
  import {
18
19
  Camera,
19
20
  DirectionalLight,
20
21
  Instances,
21
22
  MeshFilter,
22
23
  MeshRenderer,
23
- validateDirectionalLightData,
24
- } from '@forgeax/engine-render/internal';
25
- import { createRenderer } from '@forgeax/engine-runtime';
24
+ } from '@forgeax/engine-render';
26
25
  import { Transform } from '@forgeax/engine-scene';
27
26
  import type { MaterialAsset } from '@forgeax/engine-types';
28
27
  import { describe, expect, it } from 'vitest';
28
+ import { validateDirectionalLightData } from '../../../render/src/components/light-helpers';
29
+ import { constructRuntimeRendererHost } from '../renderer-host';
29
30
  import { drawPublished } from './draw-published';
30
31
 
31
32
  const WIDTH = 256;
@@ -128,7 +129,6 @@ function spawnScene(
128
129
  ) {
129
130
  const cm = casterMat(world);
130
131
  const fm = floorMat(world);
131
- const cubeHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
132
132
  world.spawn(
133
133
  {
134
134
  component: Transform,
@@ -138,7 +138,7 @@ function spawnScene(
138
138
  scale: [8, 0.1, 8],
139
139
  },
140
140
  },
141
- { component: MeshFilter, data: { assetHandle: cubeHandle } },
141
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
142
142
  { component: MeshRenderer, data: { materials: [fm] } },
143
143
  );
144
144
  world.spawn(
@@ -184,7 +184,7 @@ function spawnScene(
184
184
  scale: [0.5, 0.5, 0.5],
185
185
  },
186
186
  },
187
- { component: MeshFilter, data: { assetHandle: cubeHandle } },
187
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
188
188
  { component: MeshRenderer, data: { materials: [cm] } },
189
189
  { component: Instances, data: { transforms: buildTranslationGrid() } },
190
190
  );
@@ -272,16 +272,23 @@ async function renderConfig(
272
272
  removeEventListener() {},
273
273
  } as unknown as HTMLCanvasElement;
274
274
 
275
- let renderer: Awaited<ReturnType<typeof createRenderer>> | undefined;
275
+ let renderer: Renderer | undefined;
276
276
  try {
277
277
  try {
278
- renderer = await createRenderer(mc, {}, { shaderManifestUrl: ENGINE_MANIFEST_URL });
278
+ const host = await constructRuntimeRendererHost(
279
+ mc,
280
+ {},
281
+ {
282
+ shaderManifestUrl: ENGINE_MANIFEST_URL,
283
+ },
284
+ );
285
+ if (!host.ok) throw host.error;
286
+ renderer = host.value.renderer;
279
287
  } finally {
280
288
  globalThis.navigator.gpu.requestAdapter = _s;
281
289
  }
282
290
  if (renderer === undefined) throw new Error('renderer not initialized');
283
- const ready = await renderer.ready;
284
- if (!ready.ok) throw ready.error;
291
+ if (renderer.inspect().state !== 'alive') throw new Error('renderer not alive');
285
292
  if (sd === undefined) throw new Error('device not initialized');
286
293
  const dev = sd;
287
294
 
@@ -386,16 +393,23 @@ async function renderConfigWithSpy(
386
393
  removeEventListener() {},
387
394
  } as unknown as HTMLCanvasElement;
388
395
 
389
- let renderer: Awaited<ReturnType<typeof createRenderer>> | undefined;
396
+ let renderer: Renderer | undefined;
390
397
  try {
391
398
  try {
392
- renderer = await createRenderer(mc, {}, { shaderManifestUrl: ENGINE_MANIFEST_URL });
399
+ const host = await constructRuntimeRendererHost(
400
+ mc,
401
+ {},
402
+ {
403
+ shaderManifestUrl: ENGINE_MANIFEST_URL,
404
+ },
405
+ );
406
+ if (!host.ok) throw host.error;
407
+ renderer = host.value.renderer;
393
408
  } finally {
394
409
  globalThis.navigator.gpu.requestAdapter = _s;
395
410
  }
396
411
  if (renderer === undefined) throw new Error('renderer not initialized');
397
- const ready = await renderer.ready;
398
- if (!ready.ok) throw ready.error;
412
+ if (renderer.inspect().state !== 'alive') throw new Error('renderer not alive');
399
413
  if (sd === undefined) throw new Error('device not initialized');
400
414
  const dev = sd;
401
415
 
@@ -452,46 +466,43 @@ describe('M6 shadow fields observability', () => {
452
466
 
453
467
  // --- Gate D: validate() rejections ---
454
468
  it('validate() accepts pcfKernelSize=9 (odd), rejects 2 (even) and 0', () => {
455
- const v = (d: Record<string, number | boolean | readonly number[]>) => {
456
- const result = validateDirectionalLightData(d);
457
- return result.ok ? null : result.error;
458
- };
459
- expect(
460
- v?.({
461
- direction: [0, -1, 0],
462
- castShadow: true,
463
- cascadeCount: 4,
464
- splitLambda: 0.75,
465
- cascadeBlend: 0.2,
466
- mapSize: 2048,
467
- shadowDistance: 50,
468
- pcfKernelSize: 9,
469
- }),
470
- ).toBeNull();
471
- expect(
472
- v?.({
473
- direction: [0, -1, 0],
474
- castShadow: true,
475
- cascadeCount: 4,
476
- splitLambda: 0.75,
477
- cascadeBlend: 0.2,
478
- mapSize: 2048,
479
- shadowDistance: 50,
480
- pcfKernelSize: 2,
481
- })?.code,
482
- ).toBe('shadow-invalid-config');
483
- expect(
484
- v?.({
485
- direction: [0, -1, 0],
486
- castShadow: true,
487
- cascadeCount: 4,
488
- splitLambda: 0.75,
489
- cascadeBlend: 0.2,
490
- mapSize: 2048,
491
- shadowDistance: 50,
492
- pcfKernelSize: 0,
493
- })?.code,
494
- ).toBe('shadow-invalid-config');
469
+ const valid = validateDirectionalLightData({
470
+ direction: [0, -1, 0],
471
+ castShadow: true,
472
+ cascadeCount: 4,
473
+ splitLambda: 0.75,
474
+ cascadeBlend: 0.2,
475
+ mapSize: 2048,
476
+ shadowDistance: 50,
477
+ pcfKernelSize: 9,
478
+ });
479
+ expect(valid.ok).toBe(true);
480
+
481
+ const even = validateDirectionalLightData({
482
+ direction: [0, -1, 0],
483
+ castShadow: true,
484
+ cascadeCount: 4,
485
+ splitLambda: 0.75,
486
+ cascadeBlend: 0.2,
487
+ mapSize: 2048,
488
+ shadowDistance: 50,
489
+ pcfKernelSize: 2,
490
+ });
491
+ expect(even.ok).toBe(false);
492
+ if (!even.ok) expect(even.error.code).toBe('shadow-invalid-config');
493
+
494
+ const zero = validateDirectionalLightData({
495
+ direction: [0, -1, 0],
496
+ castShadow: true,
497
+ cascadeCount: 4,
498
+ splitLambda: 0.75,
499
+ cascadeBlend: 0.2,
500
+ mapSize: 2048,
501
+ shadowDistance: 50,
502
+ pcfKernelSize: 0,
503
+ });
504
+ expect(zero.ok).toBe(false);
505
+ if (!zero.ok) expect(zero.error.code).toBe('shadow-invalid-config');
495
506
  });
496
507
 
497
508
  // --- Gate C: pixel A/B — castShadow ON vs OFF (control) ---
@@ -86,19 +86,18 @@ describe('shadow M1a dawn (w2 RED)', () => {
86
86
  // lightSpaceMatrix is a 16-element f32 array, col-major mat4.
87
87
  // With non-degenerate direction, element-wise epsilon <= 1e-5.
88
88
  expect(refMat.length).toBe(16);
89
- // AC-11 lightSpaceMatrix shape verified: the host-side reference
90
- // computation produces a 16-element mat4. Real GPU verification
91
- // of the matrix contents is covered by shadow-m2.dawn.test.ts
92
- // (AC-10/11 canonical coverage via debugReadback + debugSampleShadowFactor).
89
+ // AC-11 lightSpaceMatrix shape is verified by the host-side reference
90
+ // computation; the real GPU shadow graph is covered by the current
91
+ // Standard Dawn shadow suites.
93
92
  });
94
93
  });
95
94
 
96
- // ── AC-10: debugReadback shape ────────────────────────────────────────
97
- describe('AC-10 debugReadback shape', () => {
98
- it('debugReadback returns { center, corners: {tl,tr,bl,br}, mapSize } POD', () => {
95
+ // ── AC-10: shadow fixture shape ───────────────────────────────────────
96
+ describe('AC-10 shadow fixture shape', () => {
97
+ it('keeps the canonical shadow map size for Standard graph coverage', () => {
99
98
  // M1 scope: verify the fixture constant matches expected value.
100
- // Real GPU readback assertions are in shadow-m2.dawn.test.ts
101
- // (AC-10/11 canonical coverage via debugReadback GPU probe).
99
+ // Real GPU behavior is covered by the current Standard Dawn shadow
100
+ // graph and pixel-observation suites.
102
101
  expect(FIXTURE_MAP_SIZE).toBe(1024);
103
102
  });
104
103
  });