@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
@@ -30,35 +30,11 @@
30
30
  // plan-strategy §2 D-3 (explicit `{ cameraOwner, resourceOwner }` required
31
31
  // indices) + §5.3 key test point + §3.3 interface example
32
32
 
33
- import { existsSync, readFileSync } from 'node:fs';
34
- import { dirname, resolve } from 'node:path';
35
- import { fileURLToPath } from 'node:url';
36
33
  import { World } from '@forgeax/engine-ecs';
37
- import { Camera, extractFrames, Skylight } from '@forgeax/engine-render/internal';
34
+ import { Camera, Skylight } from '@forgeax/engine-render';
38
35
  import { Transform } from '@forgeax/engine-scene';
39
36
  import { describe, expect, it } from 'vitest';
40
-
41
- const TEST_DIR = dirname(fileURLToPath(import.meta.url));
42
- const REPO_ROOT = resolve(TEST_DIR, '../../../..');
43
- const LEGACY_EXTRACT_PATH = resolve(REPO_ROOT, 'packages/render/src/extract/render-system.ts');
44
- const CANONICAL_EXTRACT_PATH = resolve(REPO_ROOT, 'packages/render/src/render-system-extract.ts');
45
- const EXTRACT_GATE_PATH = resolve(
46
- REPO_ROOT,
47
- 'scripts/forgeax/check-render-extract-single-query.mjs',
48
- );
49
-
50
- describe('render extract M1-R0 cohesion gate', () => {
51
- it('requires the extract owner to live below src/extract', () => {
52
- expect(existsSync(CANONICAL_EXTRACT_PATH)).toBe(true);
53
- expect(existsSync(LEGACY_EXTRACT_PATH)).toBe(false);
54
- });
55
-
56
- it('points the single-query gate at the canonical extract owner', () => {
57
- const gate = readFileSync(EXTRACT_GATE_PATH, 'utf8');
58
- expect(gate).toContain('packages/render/src/render-system-extract.ts');
59
- expect(gate).not.toContain('packages/render/src/extract/render-system.ts');
60
- });
61
- });
37
+ import { extractFrames } from '../../../render/src/render-system-extract';
62
38
 
63
39
  // The two-index owner shape w4-w6 will introduce. Declared locally so this
64
40
  // test states the contract independent of the (not-yet-updated) source type.
@@ -131,8 +107,9 @@ describe('extractFrames camera-owner / resource-owner split contract (w1, AC-08)
131
107
  // Skylight is surfaced from B (resourceOwner=1) — recognisable by intensity.
132
108
  // If skylight were (wrongly) read from cameraOwner world A, it would be
133
109
  // undefined (A has no skylight), so this assertion has discriminating power.
134
- expect(frame.environment.kind).toBe('none');
135
- expect(frame.environment.skylightCount).toBe(1);
110
+ expect(frame.skylight).toBeDefined();
111
+ expect(frame.skylight?.intensity).toBeCloseTo(SKYLIGHT_B_INTENSITY);
112
+ expect(frame.skylightCount).toBe(1);
136
113
  });
137
114
 
138
115
  // ── Combination 2: same world is both owners (degenerate — old owner semantics) ──
@@ -173,10 +150,10 @@ describe('extractFrames camera-owner / resource-owner split contract (w1, AC-08)
173
150
  // Both camera and singleton resource resolve from world 0 only.
174
151
  expect(frame.cameras.length).toBe(1);
175
152
  expect(frame.cameras[0]?.far).toBe(CAMERA_A_FAR);
176
- expect(frame.environment.kind).toBe('none');
153
+ expect(frame.skylight?.intensity).toBeCloseTo(SKYLIGHT_B_INTENSITY);
177
154
  // skylightCount reports the OWNER (resource) world's live skylight count,
178
155
  // not the other world's — proves no cross-world leak in the degenerate case.
179
- expect(frame.environment.skylightCount).toBe(1);
156
+ expect(frame.skylightCount).toBe(1);
180
157
  });
181
158
 
182
159
  // ── Combination 3: owners swapped — camera from B, resource from A ──
@@ -194,7 +171,8 @@ describe('extractFrames camera-owner / resource-owner split contract (w1, AC-08)
194
171
  // Skylight surfaced from world0 (resourceOwner=0). If the code read skylight
195
172
  // from cameraOwner (world1, no skylight) this would be undefined — so the
196
173
  // swap direction is genuinely exercised.
197
- expect(frame.environment.kind).toBe('none');
198
- expect(frame.environment.skylightCount).toBe(1);
174
+ expect(frame.skylight).toBeDefined();
175
+ expect(frame.skylight?.intensity).toBeCloseTo(SKYLIGHT_B_INTENSITY);
176
+ expect(frame.skylightCount).toBe(1);
199
177
  });
200
178
  });
@@ -33,7 +33,6 @@ import type { World as WorldType } from '@forgeax/engine-ecs';
33
33
  import type { Renderer as RendererType } from '@forgeax/engine-render';
34
34
  import type { Handle, MaterialAsset, MeshAsset, TextureAsset } from '@forgeax/engine-types';
35
35
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
36
- import { registerRuntimeComponents } from './helpers/register-runtime-components';
37
36
 
38
37
  function canonicalTestMeshAttributes(vertexCount: number) {
39
38
  return {
@@ -236,22 +235,52 @@ function buildManifestDataUrl(): string {
236
235
  }
237
236
 
238
237
  interface RendererLike {
239
- ready: Promise<unknown>;
238
+ subscribe: RendererType['subscribe'];
240
239
  draw: (worlds: unknown, opts: { cameraOwner: number; resourceOwner: number }) => void;
241
- onError: (cb: (err: { code: string }) => void) => () => void;
240
+ }
241
+
242
+ function unwrapRendererError(value: unknown): { code: string; detail?: unknown } {
243
+ let current = value as { code: string; detail?: unknown };
244
+ while (
245
+ current.detail !== undefined &&
246
+ typeof current.detail === 'object' &&
247
+ current.detail !== null
248
+ ) {
249
+ const cause = (current.detail as { cause?: unknown }).cause;
250
+ if (
251
+ cause === undefined ||
252
+ typeof cause !== 'object' ||
253
+ cause === null ||
254
+ typeof (cause as { code?: unknown }).code !== 'string'
255
+ ) {
256
+ break;
257
+ }
258
+ current = cause as { code: string; detail?: unknown };
259
+ }
260
+ return current;
242
261
  }
243
262
 
244
263
  async function importEngine(): Promise<{
245
- createRenderer: (canvas: unknown, opts?: unknown, opts2?: unknown) => Promise<RendererLike>;
264
+ createRenderer: (...args: readonly unknown[]) => Promise<RendererLike>;
246
265
  }> {
247
- return (await import('../createRenderer')) as never;
266
+ const engine = (await import('../createRenderer')) as {
267
+ createRenderer: (...args: readonly unknown[]) => Promise<unknown>;
268
+ };
269
+ return {
270
+ createRenderer: async (...args: readonly unknown[]) => {
271
+ const result = (await engine.createRenderer(...args)) as
272
+ | { readonly ok: true; readonly value: unknown }
273
+ | { readonly ok: false; readonly error: unknown };
274
+ if (!result.ok) throw result.error;
275
+ return result.value as RendererLike;
276
+ },
277
+ };
248
278
  }
249
279
 
250
280
  async function importEcs(): Promise<{
251
281
  World: new () => {
252
282
  spawn: (...componentDatas: unknown[]) => unknown;
253
283
  allocSharedRef: <Target extends string, T>(target: Target, payload: T) => number;
254
- components: WorldType['components'];
255
284
  };
256
285
  }> {
257
286
  return (await import('@forgeax/engine-ecs')) as never;
@@ -265,7 +294,7 @@ async function importComponents(): Promise<{
265
294
  DirectionalLight: unknown;
266
295
  }> {
267
296
  return {
268
- ...(await import('@forgeax/engine-render/internal')),
297
+ ...(await import('@forgeax/engine-render')),
269
298
  ...(await import('@forgeax/engine-scene')),
270
299
  } as never;
271
300
  }
@@ -354,7 +383,6 @@ async function setupRenderer(
354
383
  shaderManifestUrl: buildManifestDataUrl(),
355
384
  },
356
385
  );
357
- await renderer.ready;
358
386
  return { renderer };
359
387
  }
360
388
 
@@ -362,7 +390,6 @@ async function spawnPbrMultiMaterialScene(): Promise<unknown> {
362
390
  const { World } = await importEcs();
363
391
  const C = await importComponents();
364
392
  const world = new World();
365
- registerRuntimeComponents(world);
366
393
 
367
394
  // Mint the 3-submesh mesh as a user-tier column handle.
368
395
  const meshHandle = world.allocSharedRef('MeshAsset', threeSubmeshMesh()) as unknown as Handle<
@@ -383,6 +410,12 @@ async function spawnPbrMultiMaterialScene(): Promise<unknown> {
383
410
  >,
384
411
  );
385
412
  }
413
+ // Use numeric handles directly in values. Strings are not resolved
414
+ // by render-system-extract (which gates on
415
+ // `typeof pv.baseColorTexture === 'number'`); only the disk-pack
416
+ // materialLoader resolves refs[]-index. Tests targeting the in-memory
417
+ // extract path must pass numeric handles.
418
+
386
419
  // Mint 3 distinct PBR materials, each pointing at a different
387
420
  // baseColorTexture handle. shadingModel is 'standard' so the non-sprite
388
421
  // branch in record fires; this is the branch that builds the BG with
@@ -402,14 +435,7 @@ async function spawnPbrMultiMaterialScene(): Promise<unknown> {
402
435
  baseColor: [1, 1, 1],
403
436
  metallic: 0,
404
437
  roughness: 0.5,
405
- baseColorTexture: {
406
- texture: textureHandles[i] as unknown as string,
407
- coordinates: {
408
- set: 0,
409
- transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
410
- physicalUvScale: [1, 1],
411
- },
412
- },
438
+ baseColorTexture: textureHandles[i] as unknown as number,
413
439
  },
414
440
  } as unknown as MaterialAsset) as unknown as Handle<'MaterialAsset', 'shared'>;
415
441
  materialHandles.push(matHandle);
@@ -433,7 +459,7 @@ async function spawnPbrMultiMaterialScene(): Promise<unknown> {
433
459
  { component: C.Transform, data: cameraTransform() },
434
460
  );
435
461
  world.spawn(
436
- { component: C.DirectionalLight, data: { direction: [-0.5, -1, -0.3] } },
462
+ { component: C.DirectionalLight, data: {} },
437
463
  { component: C.Transform, data: cameraTransform() },
438
464
  );
439
465
  world.spawn(
@@ -458,16 +484,18 @@ describe('record: per-submesh PBR material BG textureView (bug-20260610 D2 regre
458
484
  const spies = makeSpies();
459
485
  const { renderer } = await setupRenderer(spies);
460
486
  const errors: string[] = [];
461
- renderer.onError((e) => errors.push(e.code));
487
+ renderer.subscribe((event) => {
488
+ if (event.kind === 'error') errors.push(event.error.code);
489
+ });
462
490
 
463
491
  const world = await spawnPbrMultiMaterialScene();
464
- if (!(renderer as unknown as RendererType).attachWorld(world as WorldType).ok) {
492
+ if (!(renderer as unknown as RendererType).attach(world as WorldType).ok) {
465
493
  throw new Error('World attachment failed');
466
494
  }
467
495
  (world as WorldType).update().unwrap();
468
496
  renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
469
497
  await new Promise((resolve) => setTimeout(resolve, 0));
470
- if (!(renderer as unknown as RendererType).attachWorld(world as WorldType).ok) {
498
+ if (!(renderer as unknown as RendererType).attach(world as WorldType).ok) {
471
499
  throw new Error('World attachment failed');
472
500
  }
473
501
  (world as WorldType).update().unwrap();
@@ -484,14 +512,6 @@ describe('record: per-submesh PBR material BG textureView (bug-20260610 D2 regre
484
512
  // GREEN at C3: 3 calls, one per submesh's distinct material.
485
513
  expect(pbrBgCalls.length).toBeGreaterThanOrEqual(3);
486
514
 
487
- // Compact authored material values still bind the full shared PBR UBO;
488
- // binding a 32-byte authored slot against the 288-byte shader layout
489
- // invalidates the command buffer before any pixels are produced.
490
- for (const call of pbrBgCalls) {
491
- const binding0 = call.entries.find((e) => e.binding === 0);
492
- expect(binding0?.resource).toMatchObject({ size: 288 });
493
- }
494
-
495
515
  // Assertion (b): the binding-2 (baseColor) textureView resources are
496
516
  // pairwise distinct across the 3 calls. RED at C2: only one call exists
497
517
  // so the set size is 1; GREEN at C3: each call's binding-2 references a
@@ -530,12 +550,11 @@ describe('record: per-submesh PBR material BG textureView (bug-20260610 D2 regre
530
550
  // to the 1x1 white view silently -- rendering flat with no warn / RhiError,
531
551
  // which is exactly what made the "GLB renders flat" symptom undiagnosable.
532
552
  // The record path now mirrors the sprite telemetry: warn-once console.warn +
533
- // per-frame RhiError('asset-not-registered') + affected-draw suppression.
553
+ // per-frame RhiError('asset-not-registered') + debug-pink baseColor override.
534
554
  async function spawnPbrMissingTextureScene(): Promise<unknown> {
535
555
  const { World } = await importEcs();
536
556
  const C = await importComponents();
537
557
  const world = new World();
538
- registerRuntimeComponents(world);
539
558
 
540
559
  // Single-submesh mesh so materials.length (1) matches submeshes.length (1)
541
560
  // and the entity passes the material-count-mismatch gate to reach the
@@ -562,7 +581,7 @@ async function spawnPbrMissingTextureScene(): Promise<unknown> {
562
581
  // maxTextureDimension2D of 1 while this texture is 2x2. This is the exact
563
582
  // "handle present, GPU capability refusal" condition the record-stage
564
583
  // telemetry guards -- the structured ImageError must survive alongside the
565
- // affected-draw suppression.
584
+ // existing debug-pink fallback.
566
585
  const unresidentTexture = {
567
586
  kind: 'texture',
568
587
  width: 2,
@@ -590,14 +609,7 @@ async function spawnPbrMissingTextureScene(): Promise<unknown> {
590
609
  baseColor: [1, 1, 1],
591
610
  metallic: 0,
592
611
  roughness: 0.5,
593
- baseColorTexture: {
594
- texture: badTexHandleId as unknown as string,
595
- coordinates: {
596
- set: 0,
597
- transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
598
- physicalUvScale: [1, 1],
599
- },
600
- },
612
+ baseColorTexture: badTexHandleId,
601
613
  },
602
614
  } as unknown as MaterialAsset) as unknown as Handle<'MaterialAsset', 'shared'>;
603
615
 
@@ -619,7 +631,7 @@ async function spawnPbrMissingTextureScene(): Promise<unknown> {
619
631
  { component: C.Transform, data: cameraTransform() },
620
632
  );
621
633
  world.spawn(
622
- { component: C.DirectionalLight, data: { direction: [-0.5, -1, -0.3] } },
634
+ { component: C.DirectionalLight, data: {} },
623
635
  { component: C.Transform, data: cameraTransform() },
624
636
  );
625
637
  world.spawn(
@@ -644,7 +656,9 @@ describe('record: PBR missing baseColorTexture telemetry (feat-future-pbr-missin
644
656
  const spies = makeSpies();
645
657
  const { renderer } = await setupRenderer(spies, 1);
646
658
  const errors: Array<{ code: string; detail?: unknown }> = [];
647
- renderer.onError((e) => errors.push(e as { code: string; detail?: unknown }));
659
+ renderer.subscribe((event) => {
660
+ if (event.kind === 'error') errors.push(unwrapRendererError(event.error));
661
+ });
648
662
 
649
663
  const { world, badTexHandleId } = (await spawnPbrMissingTextureScene()) as {
650
664
  world: unknown;
@@ -654,12 +668,12 @@ describe('record: PBR missing baseColorTexture telemetry (feat-future-pbr-missin
654
668
  // Two frames: the RhiError fires per-frame (machine-readable signal), but
655
669
  // the console.warn fires exactly once (warn-once across RenderSystem
656
670
  // lifetime -- signal/noise floor, charter P3).
657
- if (!(renderer as unknown as RendererType).attachWorld(world as WorldType).ok) {
671
+ if (!(renderer as unknown as RendererType).attach(world as WorldType).ok) {
658
672
  throw new Error('World attachment failed');
659
673
  }
660
674
  (world as WorldType).update().unwrap();
661
675
  renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
662
- if (!(renderer as unknown as RendererType).attachWorld(world as WorldType).ok) {
676
+ if (!(renderer as unknown as RendererType).attach(world as WorldType).ok) {
663
677
  throw new Error('World attachment failed');
664
678
  }
665
679
  (world as WorldType).update().unwrap();
@@ -676,7 +690,7 @@ describe('record: PBR missing baseColorTexture telemetry (feat-future-pbr-missin
676
690
  String(c[0]).includes('baseColor texture'),
677
691
  );
678
692
  expect(baseColorWarns.length).toBe(1);
679
- expect(String(baseColorWarns[0]?.[0])).toContain('skipping draw');
693
+ expect(String(baseColorWarns[0]?.[0])).toContain('debug pink');
680
694
  } finally {
681
695
  warnSpy.mockRestore();
682
696
  }
@@ -26,7 +26,6 @@ import type { World as WorldType } from '@forgeax/engine-ecs';
26
26
  import type { Renderer as RendererType } from '@forgeax/engine-render';
27
27
  import type { Handle, MaterialAsset, MeshAsset, TextureAsset } from '@forgeax/engine-types';
28
28
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
29
- import { registerRuntimeComponents } from './helpers/register-runtime-components';
30
29
 
31
30
  function canonicalTestMeshAttributes(vertexCount: number) {
32
31
  return {
@@ -200,21 +199,30 @@ function buildManifestDataUrl(): string {
200
199
  }
201
200
 
202
201
  interface RendererLike {
203
- ready: Promise<unknown>;
202
+ subscribe: RendererType['subscribe'];
204
203
  draw: (worlds: unknown, opts: { cameraOwner: number; resourceOwner: number }) => void;
205
- onError: (cb: (err: { code: string }) => void) => () => void;
206
204
  }
207
205
 
208
206
  async function importEngine(): Promise<{
209
- createRenderer: (canvas: unknown, opts?: unknown, opts2?: unknown) => Promise<RendererLike>;
207
+ createRenderer: (...args: readonly unknown[]) => Promise<RendererLike>;
210
208
  }> {
211
- return (await import('../createRenderer')) as never;
209
+ const engine = (await import('../createRenderer')) as {
210
+ createRenderer: (...args: readonly unknown[]) => Promise<unknown>;
211
+ };
212
+ return {
213
+ createRenderer: async (...args: readonly unknown[]) => {
214
+ const result = (await engine.createRenderer(...args)) as
215
+ | { readonly ok: true; readonly value: unknown }
216
+ | { readonly ok: false; readonly error: unknown };
217
+ if (!result.ok) throw result.error;
218
+ return result.value as RendererLike;
219
+ },
220
+ };
212
221
  }
213
222
  async function importEcs(): Promise<{
214
223
  World: new () => {
215
224
  spawn: (...componentDatas: unknown[]) => unknown;
216
225
  allocSharedRef: <Target extends string, T>(target: Target, payload: T) => number;
217
- components: WorldType['components'];
218
226
  };
219
227
  }> {
220
228
  return (await import('@forgeax/engine-ecs')) as never;
@@ -227,7 +235,7 @@ async function importComponents(): Promise<{
227
235
  DirectionalLight: unknown;
228
236
  }> {
229
237
  return {
230
- ...(await import('@forgeax/engine-render/internal')),
238
+ ...(await import('@forgeax/engine-render')),
231
239
  ...(await import('@forgeax/engine-scene')),
232
240
  } as never;
233
241
  }
@@ -290,7 +298,6 @@ async function setupRenderer(spies: DeviceSpies): Promise<{ renderer: RendererLi
290
298
  {},
291
299
  { shaderManifestUrl: buildManifestDataUrl() },
292
300
  );
293
- await renderer.ready;
294
301
  return { renderer };
295
302
  }
296
303
 
@@ -304,7 +311,6 @@ async function spawnMixedTransparentScene(): Promise<{
304
311
  const { World } = await importEcs();
305
312
  const C = await importComponents();
306
313
  const world = new World();
307
- registerRuntimeComponents(world);
308
314
 
309
315
  const meshHandle = world.allocSharedRef('MeshAsset', twoSubmeshMesh()) as unknown as Handle<
310
316
  'MeshAsset',
@@ -327,14 +333,7 @@ async function spawnMixedTransparentScene(): Promise<{
327
333
  baseColor: [1, 1, 1],
328
334
  metallic: 0,
329
335
  roughness: 0.5,
330
- baseColorTexture: {
331
- texture: opaqueTexHandle as unknown as string,
332
- coordinates: {
333
- set: 0,
334
- transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
335
- physicalUvScale: [1, 1],
336
- },
337
- },
336
+ baseColorTexture: opaqueTexHandle,
338
337
  },
339
338
  } as unknown as MaterialAsset) as unknown as Handle<'MaterialAsset', 'shared'>;
340
339
 
@@ -363,14 +362,7 @@ async function spawnMixedTransparentScene(): Promise<{
363
362
  baseColor: [1, 1, 1],
364
363
  metallic: 0,
365
364
  roughness: 0.5,
366
- baseColorTexture: {
367
- texture: blendTexHandle as unknown as string,
368
- coordinates: {
369
- set: 0,
370
- transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
371
- physicalUvScale: [1, 1],
372
- },
373
- },
365
+ baseColorTexture: blendTexHandle,
374
366
  },
375
367
  } as unknown as MaterialAsset) as unknown as Handle<'MaterialAsset', 'shared'>;
376
368
 
@@ -392,7 +384,7 @@ async function spawnMixedTransparentScene(): Promise<{
392
384
  { component: C.Transform, data: cameraTransform() },
393
385
  );
394
386
  world.spawn(
395
- { component: C.DirectionalLight, data: { direction: [-0.5, -1, -0.3] } },
387
+ { component: C.DirectionalLight, data: {} },
396
388
  { component: C.Transform, data: cameraTransform() },
397
389
  );
398
390
  world.spawn(
@@ -419,16 +411,18 @@ describe('record: per-submesh transparency (feat-city-glb Bug 5)', () => {
419
411
  const spies = makeSpies();
420
412
  const { renderer } = await setupRenderer(spies);
421
413
  const errors: string[] = [];
422
- renderer.onError((e) => errors.push(e.code));
414
+ renderer.subscribe((event) => {
415
+ if (event.kind === 'error') errors.push(event.error.code);
416
+ });
423
417
 
424
418
  const { world } = await spawnMixedTransparentScene();
425
- if (!(renderer as unknown as RendererType).attachWorld(world as WorldType).ok) {
419
+ if (!(renderer as unknown as RendererType).attach(world as WorldType).ok) {
426
420
  throw new Error('World attachment failed');
427
421
  }
428
422
  (world as WorldType).update().unwrap();
429
423
  renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
430
424
  await new Promise((resolve) => setTimeout(resolve, 0));
431
- if (!(renderer as unknown as RendererType).attachWorld(world as WorldType).ok) {
425
+ if (!(renderer as unknown as RendererType).attach(world as WorldType).ok) {
432
426
  throw new Error('World attachment failed');
433
427
  }
434
428
  (world as WorldType).update().unwrap();