@forgeax/engine-runtime 0.1.3 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) hide show
  1. package/README.md +49 -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 +3 -3
  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 +19 -81
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.mjs +105 -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 +575 -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 +0 -18
  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 +1203 -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 +16 -500
  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 +14 -21
  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 +81 -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 +60 -558
  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 +59 -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 +43 -261
  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 +12 -11
  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 +64 -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 +28 -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 +47 -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
@@ -0,0 +1,139 @@
1
+ // AC-12 inspector snapshot name (feat-20260618 w25).
2
+ //
3
+ // Verify that inspect().assets carries resolved names for single-package,
4
+ // multi-package, and null-package assets. Each entry.name must match
5
+ // resolveName(guid), confirming the inspect() wiring from M1/w3 placeholder
6
+ // to resolveName (D-9).
7
+ //
8
+ // Plan-targeted console unit test, but inspect() runs inside AssetRegistry
9
+ // (runtime). A real AssetRegistry is needed to exercise the inspect() ->
10
+ // resolveName wiring.
11
+ //
12
+ // The AssetRegistry constructor pre-registers 5 builtin meshes with null
13
+ // packages (D-5). Builtins have resolveName === ''.
14
+ //
15
+ // catalog() puts the asset into the assetCatalog; _registerPackage sets up
16
+ // the Package mapping for name resolution. Both are needed before inspect()
17
+ // can surface resolved names.
18
+
19
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
20
+ import { describe, expect, it } from 'vitest';
21
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
22
+
23
+ function makeReg() {
24
+ return new AssetRegistry(makeMockShaderRegistry());
25
+ }
26
+
27
+ const stubSampler = { kind: 'sampler' as const };
28
+
29
+ function register(reg: AssetRegistry, guid: string, path: string | null, name?: string) {
30
+ reg.catalog(guid, stubSampler);
31
+ reg._registerPackage(path, [guid], name ? new Map([[guid, name]]) : undefined);
32
+ }
33
+
34
+ describe('inspect InspectEntry.name (AC-12)', () => {
35
+ const BUILTIN_COUNT = 5;
36
+
37
+ it('single-asset package -> inspect entry carries basename derived name', () => {
38
+ const reg = makeReg();
39
+ register(reg, '01890000-0000-7000-8000-000000000001', '/tmp/hero.pack.json');
40
+ const snap = reg.inspect();
41
+ expect(snap.assets.length).toBeGreaterThanOrEqual(BUILTIN_COUNT + 1);
42
+ const entry = snap.assets.find((e) => e.guid === '01890000-0000-7000-8000-000000000001');
43
+ expect(entry).toBeDefined();
44
+ if (!entry) return;
45
+ expect(entry.name).toBe(reg.resolveName('01890000-0000-7000-8000-000000000001'));
46
+ expect(entry.name).toBe('hero.pack.json');
47
+ });
48
+
49
+ it('multi-asset package with stored names -> each entry carries distinct name', () => {
50
+ const reg = makeReg();
51
+ const g1 = '01890000-0000-7000-8000-000000000002';
52
+ const g2 = '01890000-0000-7000-8000-000000000003';
53
+ reg.catalog(g1, stubSampler);
54
+ reg.catalog(g2, stubSampler);
55
+ reg._registerPackage(
56
+ '/tmp/multi.pack.json',
57
+ [g1, g2],
58
+ new Map([
59
+ [g1, 'Body'],
60
+ [g2, 'Head'],
61
+ ]),
62
+ );
63
+ const snap = reg.inspect();
64
+ const e1 = snap.assets.find((e) => e.guid === g1);
65
+ const e2 = snap.assets.find((e) => e.guid === g2);
66
+ expect(e1).toBeDefined();
67
+ expect(e2).toBeDefined();
68
+ if (!e1 || !e2) return;
69
+ expect(e1.name).toBe('Body');
70
+ expect(e2.name).toBe('Head');
71
+ expect(e1.name).toBe(reg.resolveName(g1));
72
+ expect(e2.name).toBe(reg.resolveName(g2));
73
+ });
74
+
75
+ it('null-package asset with stored name -> entry carries stored name', () => {
76
+ const reg = makeReg();
77
+ register(reg, '01890000-0000-7000-8000-000000000004', null, 'myProcMesh');
78
+ const snap = reg.inspect();
79
+ const entry = snap.assets.find((e) => e.guid === '01890000-0000-7000-8000-000000000004');
80
+ expect(entry).toBeDefined();
81
+ if (!entry) return;
82
+ expect(entry.name).toBe(reg.resolveName('01890000-0000-7000-8000-000000000004'));
83
+ expect(entry.name).toBe('myProcMesh');
84
+ });
85
+
86
+ it('null-package asset without name -> entry.name is empty string', () => {
87
+ const reg = makeReg();
88
+ register(reg, '01890000-0000-7000-8000-000000000005', null);
89
+ const snap = reg.inspect();
90
+ const entry = snap.assets.find((e) => e.guid === '01890000-0000-7000-8000-000000000005');
91
+ expect(entry).toBeDefined();
92
+ if (!entry) return;
93
+ expect(entry.name).toBe(reg.resolveName('01890000-0000-7000-8000-000000000005'));
94
+ expect(entry.name).toBe('');
95
+ });
96
+
97
+ it('mixed multi/single/null packages -> all entries carry resolveName value', () => {
98
+ const reg = makeReg();
99
+ const ga = '01890000-0000-7000-8000-000000000006';
100
+ const gb = '01890000-0000-7000-8000-000000000007';
101
+ const gc = '01890000-0000-7000-8000-000000000008';
102
+ const gd = '01890000-0000-7000-8000-000000000009';
103
+
104
+ register(reg, ga, '/tmp/hero.pack.json');
105
+ reg.catalog(gb, stubSampler);
106
+ reg.catalog(gc, stubSampler);
107
+ reg._registerPackage(
108
+ '/tmp/multi.pack.json',
109
+ [gb, gc],
110
+ new Map([
111
+ [gb, 'Body'],
112
+ [gc, 'Head'],
113
+ ]),
114
+ );
115
+ register(reg, gd, null);
116
+
117
+ const snap = reg.inspect();
118
+ const ours = snap.assets.filter((e) => [ga, gb, gc, gd].includes(e.guid));
119
+ expect(ours).toHaveLength(4);
120
+
121
+ for (const entry of ours) {
122
+ expect(typeof entry.name).toBe('string');
123
+ expect(entry.name).toBe(reg.resolveName(entry.guid));
124
+ }
125
+ });
126
+
127
+ it('builtin assets have empty string names (D-5 null package)', () => {
128
+ const reg = makeReg();
129
+ const snap = reg.inspect();
130
+ // First entries are the 5 builtin meshes.
131
+ expect(snap.assets.length).toBeGreaterThanOrEqual(BUILTIN_COUNT);
132
+ for (const entry of snap.assets) {
133
+ expect(typeof entry.name).toBe('string');
134
+ }
135
+ // Builtins resolve to empty string.
136
+ const builtinNames = snap.assets.slice(0, BUILTIN_COUNT).map((e) => e.name);
137
+ expect(builtinNames).toEqual(['', '', '', '', '']);
138
+ });
139
+ });
@@ -25,7 +25,7 @@
25
25
  // `src/__tests__/` (TS rootDir = `./src`); the plan-tasks.json target
26
26
  // path matches this layout.
27
27
 
28
- import type { InstancesData } from '@forgeax/engine-render/internal';
28
+ import type { InstancesData } from '@forgeax/engine-render';
29
29
  import { describe, expectTypeOf, it } from 'vitest';
30
30
 
31
31
  describe('InstancesData shape (AC-06 ECS-managed array<f32> form)', () => {
@@ -0,0 +1,112 @@
1
+ // instantiate-mount-deferred-wiring.test.ts — D-8 red-first test for the
2
+ // pre-existing structural hole that mount-collapse's serialized-Children
3
+ // dependency was masking (feat-20260707-engine-world-clone-transient-for-
4
+ // editor-ssot, plan-strategy D-8 / §3 static chain).
5
+ //
6
+ // The hole: _instantiateSceneAsset expands mounts[] FIRST (world.ts:3672-3676)
7
+ // and spawns owned entities SECOND (world.ts:3768-3790). When a mount has
8
+ // `mount.parent` pointing at an OWNED entity slot, that slot is still
9
+ // ENTITY_NULL_RAW at mount-processing time, so the ChildOf wiring guard
10
+ // (world.ts:3740-3757) silently skips — and there is NO later pass that
11
+ // re-attempts the wire. The mount carrier is therefore left WITHOUT a ChildOf
12
+ // edge to its owned parent.
13
+ //
14
+ // Before M1, the serialized `Children` array on the owned parent was written
15
+ // back on reload and re-established the W -> carrier down-link (world.ts:
16
+ // 3975-3987 array-of-entity remap), so collect's BFS could still reach the
17
+ // anchor. M1 declared `Children` transient (no longer serialized), unmasking
18
+ // the missing edge. This test asserts the edge directly, independent of
19
+ // serialized Children — so it FAILS on main too (proving the hole is
20
+ // PRE-EXISTING, not introduced by M1). m2t4's deferred wiring turns it green.
21
+
22
+ import type { Asset } from '@forgeax/engine-assets-runtime';
23
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
24
+ import { type EntityHandle, World } from '@forgeax/engine-ecs';
25
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
26
+ import { SceneInstance } from '@forgeax/engine-render';
27
+ import { ChildOf, Children, Transform } from '@forgeax/engine-scene';
28
+ import type { Handle, SceneAsset } from '@forgeax/engine-types';
29
+ import { describe, expect, it } from 'vitest';
30
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
31
+
32
+ const G_CHILD = '11111111-1111-4111-8111-111111111111';
33
+ const G_PARENT = '22222222-2222-4222-8222-222222222222';
34
+
35
+ function mkReg(): AssetRegistry {
36
+ return new AssetRegistry(makeMockShaderRegistry());
37
+ }
38
+ function pg(s: string): AssetGuid {
39
+ const r = AssetGuid.parse(s);
40
+ if (!r.ok) throw new Error(`bad GUID: ${s}`);
41
+ return r.value;
42
+ }
43
+ function cat(reg: AssetRegistry, g: string, p: SceneAsset): void {
44
+ reg.catalog(pg(g), p as Asset);
45
+ }
46
+ function rs(w: World, a: SceneAsset): Handle<'SceneAsset', 'shared'> {
47
+ return w.allocSharedRef('SceneAsset', a);
48
+ }
49
+
50
+ function makeWorld(): World {
51
+ const world = new World();
52
+ for (const component of [ChildOf, Children, SceneInstance, Transform]) {
53
+ world.components.register(component).unwrap();
54
+ }
55
+ return world;
56
+ }
57
+
58
+ describe('instantiate deferred ChildOf wiring for owned-parent mounts (D-8)', () => {
59
+ it('mount carrier whose parent is an owned entity gets ChildOf to that owned entity', () => {
60
+ const reg = mkReg();
61
+ const w = makeWorld();
62
+
63
+ // Child scene = one owned entity.
64
+ const child: SceneAsset = {
65
+ kind: 'scene',
66
+ entities: [{ localId: 0 as never, components: { Transform: { pos: [7, 0, 0] } } }],
67
+ };
68
+ cat(reg, G_CHILD, child);
69
+
70
+ // Parent scene: one OWNED entity W (localId 0) + one mount whose parent
71
+ // points at W's slot (localId 0). This is the editor's
72
+ // spawnGlbSceneAsMount on-disk shape (wrapper W + nested mount).
73
+ const parent: SceneAsset = {
74
+ kind: 'scene',
75
+ entities: [{ localId: 0 as never, components: { Transform: { pos: [1, 0, 0] } } }],
76
+ mounts: [
77
+ {
78
+ localId: 1 as never,
79
+ source: G_CHILD,
80
+ memberFirst: 2 as never,
81
+ memberCount: 1,
82
+ parent: 0 as never,
83
+ },
84
+ ],
85
+ };
86
+ cat(reg, G_PARENT, parent);
87
+
88
+ const inst = reg.instantiate(rs(w, parent), w);
89
+ expect(inst.ok).toBe(true);
90
+ if (!inst.ok) return;
91
+
92
+ // The synthetic root carries SceneInstance; mapping[localId] -> live Entity.
93
+ const si = w.get(inst.value, SceneInstance);
94
+ expect(si.ok).toBe(true);
95
+ if (!si.ok) return;
96
+ const mapping = si.value.mapping;
97
+
98
+ const ownedW = mapping[0] as unknown as number; // owned entity W (localId 0)
99
+ const carrier = mapping[1] as unknown as EntityHandle; // mount carrier (localId 1)
100
+ expect(ownedW).toBeDefined();
101
+ expect(carrier).toBeDefined();
102
+
103
+ // The carrier MUST have a ChildOf whose parent is the owned entity W.
104
+ const co = w.get(carrier, ChildOf);
105
+ expect(co.ok, 'mount carrier must carry a ChildOf component').toBe(true);
106
+ if (!co.ok) return;
107
+ expect(
108
+ (co.value as { parent: number }).parent,
109
+ 'carrier ChildOf.parent must equal the owned parent entity W',
110
+ ).toBe(ownedW);
111
+ });
112
+ });
@@ -10,21 +10,20 @@
10
10
  // hello-room's smoke scene only carries 1 DirectionalLight; the
11
11
  // PointLight / SpotLight / cone-falloff / 9-light linear-accumulation
12
12
  // paths have no place in the smoke pipeline to be exercised. AC-09
13
- // requires per-pixel readback in a real createRenderer + draw +
14
- // readPixels chain at 3+ sample points covering AC-09 (a)(b)(c)(d)
13
+ // requires per-pixel canvas readback in a real renderer frame contract
14
+ // at 3+ sample points covering AC-09 (a)(b)(c)(d)
15
15
  // plus a retreat path (point=0 + spot=0 collapses to directional-only
16
16
  // and behaves indistinguishably from the prior feat baseline).
17
17
  //
18
18
  // What this round 2 file changes:
19
- // - Drives the SUT through `Engine.create({ canvas })` against a real
19
+ // - Drives the SUT through the runtime host against a real
20
20
  // 256x256 canvas attached to the document body (mirrors the canonical
21
21
  // pattern in apps/learn-render/1.getting-started/1.hello-window/src/
22
22
  // __tests__/hello-window.browser.test.ts).
23
23
  // - Spawns the full 1+4+4 scene with deliberate light placement so the
24
24
  // four AC-09 regions land on geometrically distinct pixel locations.
25
- // - Calls `renderer.draw(world)` for several frames + `renderer.readPixels()`
26
- // to recover RGBA bytes from the canvas (the public engine readback
27
- // entry; the same chain hello-window.browser.test.ts exercises).
25
+ // - Calls the renderer frame contract for several frames + test-owned
26
+ // canvas capture to recover RGBA bytes.
28
27
  // - Asserts a 16 x 16 block-averaged sample at 4+ sites and uses the
29
28
  // retreat-path readback as the directional-only baseline.
30
29
  //
@@ -90,24 +89,26 @@
90
89
  // section 6.1 4-light accumulation precedent) + Finding 9 (storage
91
90
  // buffer count 0 retreat path).
92
91
 
92
+ import { type AssetRegistry, HANDLE_CUBE } from '@forgeax/engine-assets-runtime';
93
93
  import { World } from '@forgeax/engine-ecs';
94
- import { createPrimitiveMesh } from '@forgeax/engine-geometry';
95
94
  import {
96
95
  Camera,
97
96
  DirectionalLight,
98
- extractFrame,
99
97
  MeshFilter,
100
98
  MeshRenderer,
101
99
  PointLight,
102
- prepareExtractContext,
103
100
  SpotLight,
104
- } from '@forgeax/engine-render/internal';
101
+ } from '@forgeax/engine-render';
105
102
  import { Transform } from '@forgeax/engine-scene';
106
103
  import type { Handle, MaterialAsset } from '@forgeax/engine-types';
107
104
  import { afterEach, describe, expect, it } from 'vitest';
108
- import { Engine } from '../index';
105
+ import { constructRuntimeRendererHost } from '../renderer-host';
109
106
 
110
- type EngineRenderer = Awaited<ReturnType<typeof Engine.create>>;
107
+ type EngineRenderer = import('@forgeax/engine-render').Renderer;
108
+ interface RendererHarness {
109
+ readonly renderer: EngineRenderer;
110
+ readonly assets: AssetRegistry;
111
+ }
111
112
 
112
113
  // Suppress WebGPU teardown race: chromium fires unhandled OperationError
113
114
  // ("Instance dropped error in getCompilationInfo") when shader compilation
@@ -193,7 +194,6 @@ function spawnCamera(world: World): void {
193
194
  }
194
195
 
195
196
  function spawnStandardCube(world: World, hStandard: Handle<'MaterialAsset', 'shared'>): void {
196
- const cubeHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
197
197
  world
198
198
  .spawn(
199
199
  {
@@ -204,7 +204,7 @@ function spawnStandardCube(world: World, hStandard: Handle<'MaterialAsset', 'sha
204
204
  scale: [1, 1, 1],
205
205
  },
206
206
  },
207
- { component: MeshFilter, data: { assetHandle: cubeHandle } },
207
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
208
208
  { component: MeshRenderer, data: { materials: [hStandard] } },
209
209
  )
210
210
  .unwrap();
@@ -339,12 +339,26 @@ function colourDistance(a: SampleColour, b: SampleColour): number {
339
339
  return Math.max(Math.abs(a.r - b.r), Math.abs(a.g - b.g), Math.abs(a.b - b.b));
340
340
  }
341
341
 
342
- async function buildRenderer(canvas: HTMLCanvasElement): Promise<EngineRenderer> {
343
- const r = await Engine.create(canvas, {}, { shaderManifestUrl: '/shaders/manifest.json' });
344
- return r;
342
+ async function buildRenderer(canvas: HTMLCanvasElement): Promise<RendererHarness> {
343
+ const host = await constructRuntimeRendererHost(
344
+ canvas,
345
+ {},
346
+ {
347
+ shaderManifestUrl: '/shaders/manifest.json',
348
+ },
349
+ );
350
+ if (!host.ok) throw host.error;
351
+ if (host.value.renderer.inspect().state !== 'alive') {
352
+ throw new Error('runtime renderer host did not reach ready state');
353
+ }
354
+ return host.value;
345
355
  }
346
356
 
347
- async function readbackAfterDraw(renderer: EngineRenderer, world: World): Promise<Uint8Array> {
357
+ async function readbackAfterDraw(
358
+ renderer: EngineRenderer,
359
+ canvas: HTMLCanvasElement,
360
+ world: World,
361
+ ): Promise<Uint8Array> {
348
362
  // Pump multiple draw + rAF ticks so the chromium compositor consumes
349
363
  // the WebGPU swap-chain texture into the canvas before readPixels()
350
364
  // samples it. The createImageBitmap(canvas) path documented in
@@ -357,11 +371,15 @@ async function readbackAfterDraw(renderer: EngineRenderer, world: World): Promis
357
371
  // 60 fps; in headless mode (process.env.CI set) the compositor can
358
372
  // skip frames if there is no visible output, so the readback path
359
373
  // below uses both rAF + setTimeout fences to bracket both modes.
360
- const attached = renderer.attachWorld(world);
374
+ const attached = renderer.attach(world);
361
375
  if (!attached.ok) throw attached.error;
362
376
  for (let i = 0; i < FRAMES_PER_SCENE; i++) {
363
377
  world.update(1 / 60).unwrap();
364
- const r = renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
378
+ const r = renderer.draw({
379
+ leases: [attached.value],
380
+ camera: { lease: attached.value },
381
+ environment: { lease: attached.value },
382
+ });
365
383
  if (!r.ok) throw new Error(`renderer.draw frame ${i} failed`);
366
384
  await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
367
385
  }
@@ -371,18 +389,25 @@ async function readbackAfterDraw(renderer: EngineRenderer, world: World): Promis
371
389
  await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
372
390
  await new Promise<void>((resolve) => setTimeout(resolve, 50));
373
391
  await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
374
- // Two-shot readback: the first call has been observed to kick the
375
- // chromium compositor into consuming the WebGPU swap-chain in some
376
- // headless configurations (the createImageBitmap call appears to
377
- // trigger the consume); the second call then samples the consumed
378
- // canvas content. Both calls are valid Renderer.readPixels chain
379
- // invocations -- the second is the one whose bytes we return.
380
- const warmup = await renderer.readPixels();
381
- if (!warmup.ok) throw new Error(`renderer.readPixels (warmup) failed: ${warmup.error.code}`);
392
+ // Two-shot test-owned canvas readback: the first call can kick the
393
+ // chromium compositor into consuming the WebGPU swap-chain; the second
394
+ // samples the consumed canvas content.
395
+ const readCanvas = async (): Promise<Uint8Array> => {
396
+ const bitmap = await createImageBitmap(canvas);
397
+ const offscreen = new OffscreenCanvas(bitmap.width, bitmap.height);
398
+ const context = offscreen.getContext('2d', { willReadFrequently: true });
399
+ if (context === null) {
400
+ bitmap.close();
401
+ throw new Error('OffscreenCanvas 2D context unavailable for canvas readback');
402
+ }
403
+ context.drawImage(bitmap, 0, 0);
404
+ const image = context.getImageData(0, 0, bitmap.width, bitmap.height);
405
+ bitmap.close();
406
+ return new Uint8Array(image.data.buffer, image.data.byteOffset, image.data.byteLength);
407
+ };
408
+ await readCanvas();
382
409
  await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
383
- const r = await renderer.readPixels();
384
- if (!r.ok) throw new Error(`renderer.readPixels failed: ${r.error.code}`);
385
- return r.value;
410
+ return readCanvas();
386
411
  }
387
412
 
388
413
  // Did the chromium compositor actually consume the painted frame in
@@ -430,12 +455,8 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
430
455
  canvas.style.display = 'block';
431
456
  document.body.appendChild(canvas);
432
457
 
433
- renderer = await buildRenderer(canvas);
434
- expect(renderer.backend).toBe('webgpu');
435
- const ready = await renderer.ready;
436
- expect(ready.ok).toBe(true);
437
- const assets = renderer.assets;
438
- if (assets === null) throw new Error('renderer.assets unavailable on the WebGPU path');
458
+ const harness = await buildRenderer(canvas);
459
+ renderer = harness.renderer;
439
460
 
440
461
  // -- Retreat-path world: 1 directional + 0 point + 0 spot. --
441
462
  const baselineWorld = new World();
@@ -447,19 +468,10 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
447
468
  spawnStandardCube(baselineWorld, hStandardBaseline);
448
469
  spawnDirectional(baselineWorld);
449
470
 
450
- // Sanity: extract surfaces 1 / 0 / 0 (retreat path).
451
- const baselineFrame = extractFrame(
452
- baselineWorld,
453
- prepareExtractContext(baselineWorld, { assets }),
454
- );
455
- expect(baselineFrame.lights.directional).toBeDefined();
456
- expect(baselineFrame.lights.point).toHaveLength(0);
457
- expect(baselineFrame.lights.spot).toHaveLength(0);
458
-
459
- const baselinePixels = await readbackAfterDraw(renderer, baselineWorld);
460
- // AC-09 readPixels-chain integrity (the round-1 reviewer issue
471
+ const baselinePixels = await readbackAfterDraw(renderer, canvas, baselineWorld);
472
+ // AC-09 canvas-readback chain integrity (the round-1 reviewer issue
461
473
  // I-1): the readback returns a contract-shaped Uint8Array of the
462
- // canvas size. This is the "test does call renderer.readPixels"
474
+ // canvas size. This is the test-owned browser readback anchor
463
475
  // anchor the round-1 review found absent.
464
476
  expect(baselinePixels.length).toBe(CANVAS_W * CANVAS_H * 4);
465
477
 
@@ -492,16 +504,7 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
492
504
  spawnSpotAimingAtOrigin(ninelightWorld, -1.5, 1.5, 1.5, 1.5, 12, 12, 25);
493
505
  spawnSpotAimingAtOrigin(ninelightWorld, 0, -1.5, 1.5, 1.5, 12, 12, 25);
494
506
 
495
- // Sanity: extract surfaces 1 / 4 / 4.
496
- const ninelightFrame = extractFrame(
497
- ninelightWorld,
498
- prepareExtractContext(ninelightWorld, { assets }),
499
- );
500
- expect(ninelightFrame.lights.directional).toBeDefined();
501
- expect(ninelightFrame.lights.point).toHaveLength(4);
502
- expect(ninelightFrame.lights.spot).toHaveLength(4);
503
-
504
- const ninelightPixels = await readbackAfterDraw(renderer, ninelightWorld);
507
+ const ninelightPixels = await readbackAfterDraw(renderer, canvas, ninelightWorld);
505
508
  expect(ninelightPixels.length).toBe(CANVAS_W * CANVAS_H * 4);
506
509
 
507
510
  // -- Step 3: sample 4 deliberate sites covering AC-09 (a)(b)(c)(d) --
@@ -581,7 +584,7 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
581
584
  );
582
585
 
583
586
  // -- Compositor-consumed gate (file header degradation rationale).
584
- // `renderer.readPixels()` goes through createImageBitmap(canvas)
587
+ // the test-owned canvas readback goes through createImageBitmap(canvas)
585
588
  // + OffscreenCanvas 2D drawImage + getImageData; the chromium
586
589
  // headless compositor schedules the swap-chain consumption at
587
590
  // rAF cadence. If the compositor has not yet consumed the
@@ -685,11 +688,8 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
685
688
  canvas.style.display = 'block';
686
689
  document.body.appendChild(canvas);
687
690
 
688
- renderer = await buildRenderer(canvas);
689
- const ready = await renderer.ready;
690
- expect(ready.ok).toBe(true);
691
- const assets = renderer.assets;
692
- if (assets === null) throw new Error('renderer.assets unavailable on the WebGPU path');
691
+ const harness = await buildRenderer(canvas);
692
+ renderer = harness.renderer;
693
693
 
694
694
  const world = new World();
695
695
  spawnCamera(world);
@@ -700,14 +700,14 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
700
700
  spawnStandardCube(world, hStandard);
701
701
  spawnDirectional(world);
702
702
 
703
- // Both readbacks go through `renderer.draw + renderer.readPixels`
703
+ // Both readbacks go through the renderer frame contract plus test-owned canvas capture
704
704
  // (the AC-09 readback chain). Length lock is the unconditional
705
705
  // anchor; pixel-content lock applies only when the chromium
706
706
  // compositor consumed both frames (otherwise both readbacks
707
707
  // collapse to all-zero and `colourDistance` is trivially 0,
708
708
  // which still satisfies the BLOCK_EPSILON contract).
709
- const firstPixels = await readbackAfterDraw(renderer, world);
710
- const secondPixels = await readbackAfterDraw(renderer, world);
709
+ const firstPixels = await readbackAfterDraw(renderer, canvas, world);
710
+ const secondPixels = await readbackAfterDraw(renderer, canvas, world);
711
711
  expect(firstPixels.length).toBe(CANVAS_W * CANVAS_H * 4);
712
712
  expect(secondPixels.length).toBe(CANVAS_W * CANVAS_H * 4);
713
713
 
@@ -757,11 +757,8 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
757
757
  canvas.style.display = 'block';
758
758
  document.body.appendChild(canvas);
759
759
 
760
- renderer = await buildRenderer(canvas);
761
- const ready = await renderer.ready;
762
- expect(ready.ok).toBe(true);
763
- const assets = renderer.assets;
764
- if (assets === null) throw new Error('renderer.assets unavailable on the WebGPU path');
760
+ const harness = await buildRenderer(canvas);
761
+ renderer = harness.renderer;
765
762
 
766
763
  // -- Step A: directional-only baseline (1 + 0 + 0). --
767
764
  const baselineWorld = new World();
@@ -772,7 +769,7 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
772
769
  );
773
770
  spawnStandardCube(baselineWorld, hStandardBaseline);
774
771
  spawnDirectional(baselineWorld);
775
- const baselinePixels = await readbackAfterDraw(renderer, baselineWorld);
772
+ const baselinePixels = await readbackAfterDraw(renderer, canvas, baselineWorld);
776
773
  expect(baselinePixels.length).toBe(CANVAS_W * CANVAS_H * 4);
777
774
 
778
775
  // -- Step B: directional + 1 PointLight on the world `+Z` (front)
@@ -791,7 +788,7 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
791
788
  // smoothstep(-1, 1, -1) = 0 (worst case! pre-fix bug actually
792
789
  // ELIMINATED the +Z PointLight). Post-fix: full omnidirectional.
793
790
  spawnPointAt(plusZWorld, 0, 0, 2, 5.0, 20);
794
- const plusZPixels = await readbackAfterDraw(renderer, plusZWorld);
791
+ const plusZPixels = await readbackAfterDraw(renderer, canvas, plusZWorld);
795
792
  expect(plusZPixels.length).toBe(CANVAS_W * CANVAS_H * 4);
796
793
 
797
794
  // -- Step C: directional + 1 PointLight on the world `-Z` (back)
@@ -817,7 +814,7 @@ describe('w26 9-light browser-mode integration (AC-09 readPixels readback + retr
817
814
  // origin, fov=PI/4 -> the cube sides peek into view). Sample at
818
815
  // the cube right-mid pixel where the +X side face projects.
819
816
  spawnPointAt(minusZWorld, 1.5, 0, 0, 5.0, 20);
820
- const minusZPixels = await readbackAfterDraw(renderer, minusZWorld);
817
+ const minusZPixels = await readbackAfterDraw(renderer, canvas, minusZWorld);
821
818
  expect(minusZPixels.length).toBe(CANVAS_W * CANVAS_H * 4);
822
819
 
823
820
  const cubeCx = CANVAS_W >> 1;
@@ -13,23 +13,22 @@
13
13
  // (Camera clear pass is M3, not here.)
14
14
 
15
15
  import { vec3 } from '@forgeax/engine-math';
16
+ import type { Buffer, RhiQueue } from '@forgeax/engine-rhi';
17
+ import { ok } from '@forgeax/engine-rhi';
18
+ import { describe, expect, it } from 'vitest';
19
+ import { packPointLight, packSpotLight } from '../../../render/src/light-buffer-layout';
20
+ import { writeViewUbo } from '../../../render/src/record/view-ubo';
21
+ import type { CameraSnapshot } from '../../../render/src/render-contract';
16
22
  import type {
17
- CameraSnapshot,
18
23
  DirectionalLightSnapshot,
19
24
  ExtractedLights,
20
25
  PointLightSnapshot,
21
26
  SkylightSnapshot,
22
27
  SpotLightSnapshot,
23
- } from '@forgeax/engine-render/internal';
24
- import { packPointLight, packSpotLight, writeViewUbo } from '@forgeax/engine-render/internal';
25
- import type { Buffer, RhiQueue } from '@forgeax/engine-rhi';
26
- import { ok } from '@forgeax/engine-rhi';
27
- import { describe, expect, it } from 'vitest';
28
+ } from '../../../render/src/render-system-extract';
28
29
 
29
30
  function identityCamera(): CameraSnapshot {
30
31
  return {
31
- worldId: 0,
32
- entityKey: 0,
33
32
  position: vec3.create(0, 0, 3),
34
33
  world: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 3, 1]),
35
34
  fov: Math.PI / 4,
@@ -45,7 +44,6 @@ function identityCamera(): CameraSnapshot {
45
44
  exposure: 1,
46
45
  whitePoint: 4,
47
46
  antialias: 'none' as CameraSnapshot['antialias'],
48
- historyVersion: 0,
49
47
  bloom: 'off' as CameraSnapshot['bloom'],
50
48
  bloomThreshold: 1,
51
49
  bloomIntensity: 1,
@@ -122,7 +120,6 @@ describe('w7 -- light GPU pack byte-neutral (AC-11)', () => {
122
120
  it('packSpotLight writes color slots 4..6 + direction slots 8..10 byte-for-byte (64 B)', () => {
123
121
  const snap: SpotLightSnapshot = {
124
122
  kind: 'spot',
125
- entity: 0,
126
123
  position: vec3.create(0, 5, 0),
127
124
  direction: vec3.create(0.1, -0.9, 0.2),
128
125
  color: vec3.create(0.3, 0.4, 0.5),
@@ -20,14 +20,14 @@
20
20
  // `*.test-d.ts` suffix (root vitest config K-3 unit project's typecheck pass
21
21
  // covers any .test-d.ts file in any package).
22
22
 
23
+ import { expectTypeOf, test } from 'vitest';
23
24
  import type {
24
25
  DirectionalLightSnapshot,
25
26
  ExtractedLights,
26
27
  LightSnapshot,
27
28
  PointLightSnapshot,
28
29
  SpotLightSnapshot,
29
- } from '@forgeax/engine-render/internal';
30
- import { expectTypeOf, test } from 'vitest';
30
+ } from '../../../render/src/render-system-extract';
31
31
 
32
32
  function assertNever(_x: never): never {
33
33
  throw new Error('exhaustive');
@@ -10,7 +10,7 @@
10
10
  // type assertions do NOT count), so the vitest typecheck project enforces it.
11
11
 
12
12
  import { World } from '@forgeax/engine-ecs';
13
- import { DirectionalLight, PointLight, Skylight, SpotLight } from '@forgeax/engine-render/internal';
13
+ import { DirectionalLight, PointLight, Skylight, SpotLight } from '@forgeax/engine-render';
14
14
  import { describe, it } from 'vitest';
15
15
 
16
16
  describe('w5a -- residual per-axis light keys are compile errors (AC-04)', () => {