@forgeax/engine-runtime 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -44,21 +44,14 @@
44
44
  // Each scene captures the rendered RGBA, then the comparator across the two
45
45
  // captured byte arrays asserts mid-band divergence.
46
46
 
47
- import { createWorldContext, World } from '@forgeax/engine-ecs';
48
- import { createPrimitiveMesh } from '@forgeax/engine-geometry';
49
- import { renderComponentsPlugin } from '@forgeax/engine-render';
47
+ import { AssetRegistry, HANDLE_QUAD } from '@forgeax/engine-assets-runtime';
48
+ import { World } from '@forgeax/engine-ecs';
49
+ import { Camera, MeshFilter, MeshRenderer } from '@forgeax/engine-render';
50
50
  import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '@forgeax/engine-render/authoring';
51
- import {
52
- ANTIALIAS_NONE,
53
- Camera,
54
- MeshFilter,
55
- MeshRenderer,
56
- TONEMAP_NONE,
57
- } from '@forgeax/engine-render/internal';
58
- import { createRenderer } from '@forgeax/engine-runtime';
59
- import { scenePlugin, Transform } from '@forgeax/engine-scene';
51
+ import { Transform } from '@forgeax/engine-scene';
60
52
  import type { MaterialAsset, TextureAsset } from '@forgeax/engine-types';
61
53
  import { describe, expect, it } from 'vitest';
54
+ import { constructRuntimeRendererHost } from '../../renderer-host';
62
55
  import { drawPublished } from '../draw-published';
63
56
 
64
57
  const WIDTH = 64;
@@ -179,39 +172,28 @@ async function renderOneFrame(opts: {
179
172
  removeEventListener() {},
180
173
  } as unknown as HTMLCanvasElement;
181
174
 
182
- let renderer: Awaited<ReturnType<typeof createRenderer>>;
175
+ let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
183
176
  try {
184
- renderer = await createRenderer(mockCanvas, {}, { shaderManifestUrl: ENGINE_MANIFEST_URL });
177
+ host = await constructRuntimeRendererHost(
178
+ mockCanvas,
179
+ {},
180
+ {
181
+ shaderManifestUrl: ENGINE_MANIFEST_URL,
182
+ },
183
+ );
185
184
  } finally {
186
185
  globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
187
186
  }
188
- expect(renderer.backend).toBe('webgpu');
189
-
190
- const ready = await renderer.ready;
191
- expect(ready.ok).toBe(true);
192
- if (!ready.ok) throw new Error('renderer not ready');
187
+ expect(host.ok).toBe(true);
188
+ if (!host.ok) throw host.error;
189
+ const { renderer, assets } = host.value;
190
+ expect(renderer.inspect().state).toBe('alive');
191
+ expect(assets).toBeInstanceOf(AssetRegistry);
193
192
 
194
193
  const world = new World();
195
- await createWorldContext(world, [renderComponentsPlugin(), scenePlugin()]);
196
- const nineSliceHandle = world.internSharedRef(
197
- 'MeshAsset',
198
- createPrimitiveMesh('nine-slice-quad').unwrap(),
199
- );
200
194
 
201
195
  const texAsset = makeCornerCheckerTexture();
202
196
  const texHandle = world.allocSharedRef<'TextureAsset', TextureAsset>('TextureAsset', texAsset);
203
- // feat-20260601-gpu-resource-store-extraction M1: explicit texture GPU upload.
204
- const texUploadRes = await renderer.store.uploadTexture(texHandle, texAsset, {
205
- bytes: texAsset.data as Uint8Array,
206
- width: texAsset.width,
207
- height: texAsset.height,
208
- mime: 'image/png',
209
- colorSpace: texAsset.colorSpace,
210
- mipmap: texAsset.mipmap,
211
- });
212
- expect(texUploadRes.ok).toBe(true);
213
- if (!texUploadRes.ok) throw new Error('texture upload failed');
214
-
215
197
  // D-4 explicit constraint: tile mode uses the sprite pipeline's shared
216
198
  // renderer-owned repeat sampler, so vertex-shader-emitted uv > 1 wraps via
217
199
  // the hardware sampler. Both scenes use that same configuration; the only
@@ -237,37 +219,28 @@ async function renderOneFrame(opts: {
237
219
  { name: 'baseColorTexture', type: 'texture', optional: true },
238
220
  ],
239
221
  values: {
240
- colorTint: [1, 1, 1, 1],
241
- region: [0, 0, 1, 1],
242
- pivotAndSize: [0.5, 0.5, 1, 1],
243
222
  // feat-20260625 M3 / w11 (D-4): UBO-aligned field names. The
244
223
  // extract-stage backwards-compat fold (render-system-extract.ts
245
224
  // L2344) keeps the legacy `slices` + `sliceMode` split working for
246
225
  // unmigrated demos, but new tests declare the UBO-aligned
247
226
  // `slicesAndMode` vec4 directly: `.xyz` = [left, top, right] in UV,
248
227
  // `.w` carries the sliceMode sentinel (>=0 stretch, <0 tile).
249
- baseColorTexture: {
250
- texture: texHandle as unknown as never,
251
- coordinates: {
252
- set: 0,
253
- transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
254
- physicalUvScale: [1, 1],
255
- },
256
- },
228
+ baseColorTexture: { texture: texHandle as unknown as never },
257
229
  slicesAndMode: [0.25, 0.25, 0.25, opts.sliceMode === 1 ? -0.25 : 0.25],
258
230
  },
259
231
  });
260
232
 
261
233
  const errors: unknown[] = [];
262
- renderer.onError((e) => {
263
- errors.push(e);
234
+ renderer.subscribe((event) => {
235
+ if (event.kind !== 'error') return;
236
+ errors.push(event.error);
264
237
  });
265
238
 
266
239
  // ASYMMETRIC scale: x=4*y. Under uniform 9-slice mapping the corners stay
267
240
  // square so the central band is highly stretched; without 9-slice (legacy
268
241
  // path) the entire quad stretches as one. The asymmetry amplifies the
269
242
  // mid-band pixel divergence between the two modes after w15 lands.
270
- const spriteSpawn = world.spawn(
243
+ world.spawn(
271
244
  {
272
245
  component: Transform,
273
246
  data: {
@@ -276,12 +249,10 @@ async function renderOneFrame(opts: {
276
249
  scale: [opts.scaleX, opts.scaleY, 1],
277
250
  },
278
251
  },
279
- { component: MeshFilter, data: { assetHandle: nineSliceHandle } },
252
+ { component: MeshFilter, data: { assetHandle: HANDLE_QUAD } },
280
253
  { component: MeshRenderer, data: { materials: [matHandle] } },
281
254
  );
282
- expect(spriteSpawn.ok).toBe(true);
283
-
284
- const cameraSpawn = world.spawn(
255
+ world.spawn(
285
256
  {
286
257
  component: Transform,
287
258
  data: {
@@ -292,17 +263,9 @@ async function renderOneFrame(opts: {
292
263
  },
293
264
  {
294
265
  component: Camera,
295
- data: {
296
- fov: Math.PI / 4,
297
- aspect: 1,
298
- near: 0.1,
299
- far: 100,
300
- tonemap: TONEMAP_NONE,
301
- antialias: ANTIALIAS_NONE,
302
- },
266
+ data: { fov: Math.PI / 4, aspect: 1, near: 0.1, far: 100 },
303
267
  },
304
268
  );
305
- expect(cameraSpawn.ok).toBe(true);
306
269
 
307
270
  const drawn = drawPublished(renderer, world);
308
271
  expect(drawn.ok).toBe(true);
@@ -371,6 +334,7 @@ describe('feat-20260527-sprite-nineslice w14 dawn smoke (stretch vs tile diverge
371
334
  // x-band differ between modes; pre-w15 the two scenes are byte-identical.
372
335
  const stretch = await renderOneFrame({ sliceMode: 0, scaleX: 4, scaleY: 1 });
373
336
  const tile = await renderOneFrame({ sliceMode: 1, scaleX: 4, scaleY: 1 });
337
+
374
338
  expect(stretch.errors).toEqual([]);
375
339
  expect(tile.errors).toEqual([]);
376
340
 
@@ -16,14 +16,16 @@
16
16
 
17
17
  import { World } from '@forgeax/engine-ecs';
18
18
  import { composeShader } from '@forgeax/engine-naga';
19
+ import { ok, type RhiDevice, type Texture } from '@forgeax/engine-rhi';
20
+ import { _internal_getRawDevice, createShaderModule, rhi } from '@forgeax/engine-rhi-webgpu';
21
+ import type { EquirectAsset, TextureFormat } from '@forgeax/engine-types';
22
+ import { describe, expect, it } from 'vitest';
23
+ import { DeviceScope } from '../../../../render/src/device/device-scope';
24
+ import { GpuResidencyCache } from '../../../../render/src/device/gpu-residency';
19
25
  import {
20
- GpuResourceStore,
21
26
  getOrCreateIblCache,
22
27
  setIblComposedShaders,
23
- } from '@forgeax/engine-render/internal';
24
- import { ok } from '@forgeax/engine-rhi';
25
- import type { EquirectAsset, TextureFormat } from '@forgeax/engine-types';
26
- import { describe, expect, it } from 'vitest';
28
+ } from '../../../../render/src/ibl/IblPipelineCache';
27
29
 
28
30
  const mockCaps = {
29
31
  backendKind: 'webgpu' as const,
@@ -47,7 +49,7 @@ const mockCaps = {
47
49
  maxColorAttachments: 8,
48
50
  };
49
51
 
50
- // feat-20260601-gpu-resource-store-extraction M1 (D-3 falsifiable anchor): a
52
+ // feat-20260601-device/gpu-residency-extraction M1 (D-3 falsifiable anchor): a
51
53
  // single store._uploadCubemapFromEquirect(world, srcHandle, srcPod) returns the
52
54
  // cube handle, and store.getCubemapGpuTexture(cubeHandle) reads it back -- the
53
55
  // single-call contract is preserved. The cube POD register-relay is injected
@@ -114,8 +116,17 @@ function makeWhiteEquirect(): EquirectAsset {
114
116
  };
115
117
  }
116
118
 
117
- // biome-ignore lint/suspicious/noExplicitAny: native GPUDevice has minimal typing here
118
- async function readbackRgba16f(device: any, texture: any, arrayLayer: number, mipLevel: number) {
119
+ /** Raw resource conversion is confined to this Dawn readback boundary. */
120
+ function rawTexture(texture: Texture): GPUTexture {
121
+ return texture as unknown as GPUTexture;
122
+ }
123
+
124
+ async function readbackRgba16f(
125
+ device: GPUDevice,
126
+ texture: GPUTexture,
127
+ arrayLayer: number,
128
+ mipLevel: number,
129
+ ): Promise<number[]> {
119
130
  // Read one pixel from (0,0) of (face=arrayLayer, mip=mipLevel).
120
131
  const bytesPerRow = 256;
121
132
  const buffer = device.createBuffer({
@@ -159,81 +170,79 @@ describe('t51 (M3.5) -- dawn IBL 4-pass non-zero readback', () => {
159
170
  // dawn-node tests stand in for vite-plugin-shader by composing on
160
171
  // demand via @forgeax/engine-naga.
161
172
  await composeIblShadersForDawn();
162
- // biome-ignore lint/suspicious/noExplicitAny: dynamic global navigator typed minimally
163
- const adapter = await (navigator as any).gpu.requestAdapter();
164
- const device = await adapter.requestDevice();
165
-
166
- const store = new GpuResourceStore();
173
+ const adapterResult = await rhi.requestAdapter();
174
+ if (!adapterResult.ok) throw adapterResult.error;
175
+ const deviceResult = await adapterResult.value.requestDevice();
176
+ if (!deviceResult.ok) throw deviceResult.error;
177
+ const rhiDevice: RhiDevice = deviceResult.value;
178
+ const rawDevice = _internal_getRawDevice(rhiDevice);
179
+ if (rawDevice === undefined) {
180
+ throw new Error('Dawn IBL readback requires the RHI WebGPU raw-device test boundary');
181
+ }
182
+
183
+ const store = new GpuResidencyCache();
184
+ const scope = DeviceScope.create(0, 'ibl-dawn-test');
185
+ store.bindDeviceScope(scope);
167
186
  const world = new World();
168
187
  const equirect = makeWhiteEquirect();
169
188
  const equirectHandle = world.allocSharedRef('EquirectAsset', equirect);
170
189
 
171
- // We pass the raw GPUDevice directly so the runtime exercises the
172
- // same dawn path that user-mesh-upload.dawn.test.ts uses. The cube POD
173
- // register-relay is injected here (D-3).
190
+ // The production path receives the opaque RhiDevice and the same
191
+ // Result-returning shader factory used by the WebGPU backend. Raw GPU
192
+ // access remains confined to readback below.
174
193
  store.configureGpuDevice(
175
- // biome-ignore lint/suspicious/noExplicitAny: dawn device shape
176
- device as any,
177
- // biome-ignore lint/suspicious/noExplicitAny: dawn device shape
178
- async (d: any, desc: { code: string; label?: string }) => {
179
- const mod = d.createShaderModule({ code: desc.code, label: desc.label });
180
- // biome-ignore lint/suspicious/noExplicitAny: matching shim Result shape
181
- return { ok: true, value: mod, unwrap: () => mod, unwrapOr: () => mod } as any;
182
- },
194
+ rhiDevice,
195
+ undefined,
183
196
  (w: World, pod: EquirectAsset) => ok(w.allocSharedRef('EquirectAsset', pod)),
184
197
  mockCaps,
185
198
  );
199
+ store.configureIblDevice(rhiDevice, createShaderModule);
186
200
 
187
201
  // Single call returns the cube handle (D-3 single-call contract). The
188
202
  // projection method is @internal (private) after feat-20260630 M2 / w11;
189
203
  // the dawn test reaches it through the store internals.
190
- // biome-ignore lint/suspicious/noExplicitAny: private method access for the dawn IBL readback probe
191
- const result = await (store as any)._uploadCubemapFromEquirect(
192
- world,
193
- equirectHandle,
194
- equirect,
195
- );
204
+ const result = await store._uploadCubemapFromEquirect(world, equirectHandle, equirect);
196
205
  expect(result.ok).toBe(true);
197
206
  if (!result.ok) return;
198
207
 
199
208
  const cubeHandle = result.value;
200
- // biome-ignore lint/suspicious/noExplicitAny: opaque GPU texture
201
- const cubeTexture = store.getCubemapGpuTexture(cubeHandle as any);
209
+ const cubeTexture = store.getCubemapGpuTexture(cubeHandle);
202
210
  expect(cubeTexture).toBeDefined();
211
+ if (cubeTexture === undefined) return;
203
212
 
204
- // feat-20260612 M3 / w11 (1c76c1b9): GpuResourceStore handle maps now
213
+ // feat-20260612 M3 / w11 (1c76c1b9): GpuResidencyCache handle maps now
205
214
  // hold the GpuTexture wrapper (`{handle, isDestroyed, destroy()}`).
206
215
  // dawn-node `copyTextureToBuffer` consumes the raw GPUTexture handle,
207
216
  // so the wrapper unwrap goes via `.handle` here. The IBL cache slots
208
217
  // below still hold raw textures (the ibl/IblPipelineCache wrapping is
209
218
  // OOS for this feat -- D-8 / OOS-10).
210
- // biome-ignore lint/suspicious/noExplicitAny: opaque GPU texture
211
- const cubeRaw = (cubeTexture as any).handle;
219
+ const cubeRaw = rawTexture(cubeTexture.handle);
212
220
 
213
221
  // (a) equirect-to-cube face 0 center pixel != 0
214
- const cubePx = await readbackRgba16f(device, cubeRaw, 0, 0);
222
+ const cubePx = await readbackRgba16f(rawDevice, cubeRaw, 0, 0);
215
223
  expect(cubePx.some((c) => c !== 0)).toBe(true);
216
224
 
217
225
  // (b) irradiance, (c) prefilter, (d) brdfLut: the textures live on
218
- // IblPipelineCache after t52/t53. Read via cache slots.
219
- const cache = getOrCreateIblCache(device);
220
- // biome-ignore lint/suspicious/noExplicitAny: cache slots typed any
221
- const irrTex = (cache as any).irradianceTexture;
222
- // biome-ignore lint/suspicious/noExplicitAny: cache slots typed any
223
- const prefTex = (cache as any).prefilterTexture;
224
- // biome-ignore lint/suspicious/noExplicitAny: cache slots typed any
225
- const brdfTex = (cache as any).brdfLutTexture;
226
+ // IblPipelineCache after t52/t53. Read opaque cache slots through the
227
+ // test-only raw texture boundary.
228
+ const cache = getOrCreateIblCache(scope);
229
+ const {
230
+ irradianceTexture: irrTex,
231
+ prefilterTexture: prefTex,
232
+ brdfLutTexture: brdfTex,
233
+ } = cache;
226
234
  expect(irrTex).toBeDefined();
227
235
  expect(prefTex).toBeDefined();
228
236
  expect(brdfTex).toBeDefined();
237
+ if (irrTex === undefined || prefTex === undefined || brdfTex === undefined) return;
229
238
 
230
- const irrPx = await readbackRgba16f(device, irrTex, 0, 0);
239
+ const irrPx = await readbackRgba16f(rawDevice, rawTexture(irrTex), 0, 0);
231
240
  expect(irrPx.some((c) => c !== 0)).toBe(true);
232
241
 
233
- const prefPx = await readbackRgba16f(device, prefTex, 0, 0);
242
+ const prefPx = await readbackRgba16f(rawDevice, rawTexture(prefTex), 0, 0);
234
243
  expect(prefPx.some((c) => c !== 0)).toBe(true);
235
244
 
236
- const brdfPx = await readbackRgba16f(device, brdfTex, 0, 0);
245
+ const brdfPx = await readbackRgba16f(rawDevice, rawTexture(brdfTex), 0, 0);
237
246
  expect(brdfPx.some((c) => c !== 0)).toBe(true);
238
247
  },
239
248
  60_000,
@@ -24,19 +24,19 @@
24
24
  // Falsification is exercised by the parity smoke (AC-08) and learn-render
25
25
  // M3 smoke (AC-09).
26
26
 
27
+ import { AssetRegistry, HANDLE_CUBE } from '@forgeax/engine-assets-runtime';
27
28
  import { World } from '@forgeax/engine-ecs';
28
- import { createPrimitiveMesh } from '@forgeax/engine-geometry';
29
29
  import {
30
30
  Camera,
31
31
  DirectionalLight,
32
32
  Instances,
33
33
  MeshFilter,
34
34
  MeshRenderer,
35
- } from '@forgeax/engine-render/internal';
36
- import { createRenderer } from '@forgeax/engine-runtime';
35
+ } from '@forgeax/engine-render';
37
36
  import { Transform } from '@forgeax/engine-scene';
38
37
  import type { MaterialAsset } from '@forgeax/engine-types';
39
38
  import { describe, expect, it } from 'vitest';
39
+ import { constructRuntimeRendererHost } from '../../renderer-host';
40
40
  import { drawPublished } from '../draw-published';
41
41
 
42
42
  const WIDTH = 512;
@@ -147,17 +147,23 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
147
147
  removeEventListener() {},
148
148
  } as unknown as HTMLCanvasElement;
149
149
 
150
- let renderer: Awaited<ReturnType<typeof createRenderer>>;
150
+ let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
151
151
  try {
152
- renderer = await createRenderer(mockCanvas, {}, { shaderManifestUrl: ENGINE_MANIFEST_URL });
152
+ host = await constructRuntimeRendererHost(
153
+ mockCanvas,
154
+ {},
155
+ {
156
+ shaderManifestUrl: ENGINE_MANIFEST_URL,
157
+ },
158
+ );
153
159
  } finally {
154
160
  globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
155
161
  }
156
- expect(renderer.backend).toBe('webgpu');
157
-
158
- const ready = await renderer.ready;
159
- expect(ready.ok).toBe(true);
160
- if (!ready.ok) return;
162
+ expect(host.ok).toBe(true);
163
+ if (!host.ok) throw host.error;
164
+ const { renderer, assets } = host.value;
165
+ expect(renderer.inspect().state).toBe('alive');
166
+ expect(assets).toBeInstanceOf(AssetRegistry);
161
167
 
162
168
  // Material creation (PBR standard). D-18: a shared-ref handle is per-World;
163
169
  // each frame's World allocs the same payload to get a handle it can resolve.
@@ -182,7 +188,6 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
182
188
 
183
189
  // --- Frame A: instances=N (grid spread) ---
184
190
  const worldN = new World();
185
- const cubeHandleN = worldN.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
186
191
  const matHandleN = worldN.allocSharedRef<'MaterialAsset', MaterialAsset>(
187
192
  'MaterialAsset',
188
193
  matAsset,
@@ -196,7 +201,7 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
196
201
  scale: [0.5, 0.5, 0.5],
197
202
  },
198
203
  },
199
- { component: MeshFilter, data: { assetHandle: cubeHandleN } },
204
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
200
205
  { component: MeshRenderer, data: { materials: [matHandleN] } },
201
206
  { component: Instances, data: { transforms: transformsN } },
202
207
  );
@@ -263,7 +268,6 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
263
268
  singleTransform[15] = 1;
264
269
 
265
270
  const world1 = new World();
266
- const cubeHandle1 = world1.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
267
271
  const matHandle1 = world1.allocSharedRef<'MaterialAsset', MaterialAsset>(
268
272
  'MaterialAsset',
269
273
  matAsset,
@@ -277,7 +281,7 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
277
281
  scale: [0.5, 0.5, 0.5],
278
282
  },
279
283
  },
280
- { component: MeshFilter, data: { assetHandle: cubeHandle1 } },
284
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
281
285
  { component: MeshRenderer, data: { materials: [matHandle1] } },
282
286
  { component: Instances, data: { transforms: singleTransform } },
283
287
  );
@@ -428,17 +432,23 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
428
432
  removeEventListener() {},
429
433
  } as unknown as HTMLCanvasElement;
430
434
 
431
- let renderer2: Awaited<ReturnType<typeof createRenderer>>;
435
+ let host2: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
432
436
  try {
433
- renderer2 = await createRenderer(mockCanvas2, {}, { shaderManifestUrl: ENGINE_MANIFEST_URL });
437
+ host2 = await constructRuntimeRendererHost(
438
+ mockCanvas2,
439
+ {},
440
+ {
441
+ shaderManifestUrl: ENGINE_MANIFEST_URL,
442
+ },
443
+ );
434
444
  } finally {
435
445
  globalThis.navigator.gpu.requestAdapter = origReqAdapter2;
436
446
  }
437
- expect(renderer2.backend).toBe('webgpu');
438
-
439
- const ready2 = await renderer2.ready;
440
- expect(ready2.ok).toBe(true);
441
- if (!ready2.ok) return;
447
+ expect(host2.ok).toBe(true);
448
+ if (!host2.ok) throw host2.error;
449
+ const { renderer: renderer2, assets: assets2 } = host2.value;
450
+ expect(renderer2.inspect().state).toBe('alive');
451
+ expect(assets2).toBeInstanceOf(AssetRegistry);
442
452
 
443
453
  // Unlit material
444
454
  const matAsset2: MaterialAsset = {
@@ -457,7 +467,6 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
457
467
 
458
468
  // Frame A: N instances
459
469
  const worldN2 = new World();
460
- const cubeHandleN2 = worldN2.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
461
470
  const matHandleN2 = worldN2.allocSharedRef<'MaterialAsset', MaterialAsset>(
462
471
  'MaterialAsset',
463
472
  matAsset2,
@@ -471,7 +480,7 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
471
480
  scale: [0.5, 0.5, 0.5],
472
481
  },
473
482
  },
474
- { component: MeshFilter, data: { assetHandle: cubeHandleN2 } },
483
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
475
484
  { component: MeshRenderer, data: { materials: [matHandleN2] } },
476
485
  { component: Instances, data: { transforms: transformsN2 } },
477
486
  );
@@ -486,11 +495,17 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
486
495
  },
487
496
  { component: Camera, data: { fov: (45 * Math.PI) / 180, aspect: 1, near: 0.1, far: 200 } },
488
497
  );
489
- expect(renderer2.attachWorld(worldN2).ok).toBe(true);
498
+ const attachmentN2 = renderer2.attach(worldN2);
499
+ expect(attachmentN2.ok).toBe(true);
500
+ if (!attachmentN2.ok) throw attachmentN2.error;
490
501
 
491
502
  for (let i = 0; i < 5; i++) {
492
503
  worldN2.update(1 / 60).unwrap();
493
- const r = renderer2.draw([worldN2], { cameraOwner: 0, resourceOwner: 0 });
504
+ const r = renderer2.draw({
505
+ leases: [attachmentN2.value],
506
+ camera: { lease: attachmentN2.value },
507
+ environment: { lease: attachmentN2.value },
508
+ });
494
509
  if (!r.ok) throw new Error(`draw N frame ${i} error: ${r.error.code}`);
495
510
  }
496
511
 
@@ -531,7 +546,6 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
531
546
  singleTransform2[15] = 1;
532
547
 
533
548
  const world12 = new World();
534
- const cubeHandle12 = world12.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
535
549
  const matHandle12 = world12.allocSharedRef<'MaterialAsset', MaterialAsset>(
536
550
  'MaterialAsset',
537
551
  matAsset2,
@@ -545,7 +559,7 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
545
559
  scale: [0.5, 0.5, 0.5],
546
560
  },
547
561
  },
548
- { component: MeshFilter, data: { assetHandle: cubeHandle12 } },
562
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
549
563
  { component: MeshRenderer, data: { materials: [matHandle12] } },
550
564
  { component: Instances, data: { transforms: singleTransform2 } },
551
565
  );
@@ -560,11 +574,17 @@ describe('w2 -- PBR dual-state dawn smoke (AC-01 / AC-06, RED before w4)', () =>
560
574
  },
561
575
  { component: Camera, data: { fov: (45 * Math.PI) / 180, aspect: 1, near: 0.1, far: 200 } },
562
576
  );
563
- expect(renderer2.attachWorld(world12).ok).toBe(true);
577
+ const attachment12 = renderer2.attach(world12);
578
+ expect(attachment12.ok).toBe(true);
579
+ if (!attachment12.ok) throw attachment12.error;
564
580
 
565
581
  for (let i = 0; i < 5; i++) {
566
582
  world12.update(1 / 60).unwrap();
567
- const r = renderer2.draw([world12], { cameraOwner: 0, resourceOwner: 0 });
583
+ const r = renderer2.draw({
584
+ leases: [attachment12.value],
585
+ camera: { lease: attachment12.value },
586
+ environment: { lease: attachment12.value },
587
+ });
568
588
  if (!r.ok) throw new Error(`draw 1 frame ${i} error: ${r.error.code}`);
569
589
  }
570
590
  await device2.queue.onSubmittedWorkDone();
@@ -30,19 +30,19 @@
30
30
  // gate passes while browser renders black) + comparison-demo-exposes-frozen-fxaa
31
31
  // (assert two states differ, don't match one self-made baseline).
32
32
 
33
+ import { AssetRegistry, HANDLE_CUBE } from '@forgeax/engine-assets-runtime';
33
34
  import { World } from '@forgeax/engine-ecs';
34
- import { createPrimitiveMesh } from '@forgeax/engine-geometry';
35
35
  import {
36
36
  Camera,
37
37
  DirectionalLight,
38
38
  Instances,
39
39
  MeshFilter,
40
40
  MeshRenderer,
41
- } from '@forgeax/engine-render/internal';
42
- import { createRenderer } from '@forgeax/engine-runtime';
41
+ } from '@forgeax/engine-render';
43
42
  import { Transform } from '@forgeax/engine-scene';
44
43
  import type { MaterialAsset } from '@forgeax/engine-types';
45
44
  import { describe, expect, it } from 'vitest';
45
+ import { constructRuntimeRendererHost } from '../../renderer-host';
46
46
 
47
47
  const WIDTH = 256;
48
48
  const HEIGHT = 256;
@@ -154,20 +154,25 @@ describe('w10 -- shadow instanced dawn smoke (AC-05 behavioral)', () => {
154
154
  removeEventListener() {},
155
155
  } as unknown as HTMLCanvasElement;
156
156
 
157
- let renderer: Awaited<ReturnType<typeof createRenderer>>;
157
+ let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
158
158
  try {
159
- renderer = await createRenderer(mockCanvas, {}, { shaderManifestUrl: ENGINE_MANIFEST_URL });
159
+ host = await constructRuntimeRendererHost(
160
+ mockCanvas,
161
+ {},
162
+ {
163
+ shaderManifestUrl: ENGINE_MANIFEST_URL,
164
+ },
165
+ );
160
166
  } finally {
161
167
  globalThis.navigator.gpu.requestAdapter = _saved;
162
168
  }
163
- expect(renderer.backend).toBe('webgpu');
164
-
165
- const ready = await renderer.ready;
166
- expect(ready.ok).toBe(true);
167
- if (!ready.ok) return;
169
+ expect(host.ok).toBe(true);
170
+ if (!host.ok) throw host.error;
171
+ const { renderer, assets } = host.value;
172
+ expect(renderer.inspect().state).toBe('alive');
173
+ expect(assets).toBeInstanceOf(AssetRegistry);
168
174
 
169
175
  const world = new World();
170
- const cubeHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
171
176
 
172
177
  const matHandle = world.allocSharedRef<'MaterialAsset', MaterialAsset>('MaterialAsset', {
173
178
  kind: 'material',
@@ -217,7 +222,7 @@ describe('w10 -- shadow instanced dawn smoke (AC-05 behavioral)', () => {
217
222
  scale: [12, 0.2, 12],
218
223
  },
219
224
  },
220
- { component: MeshFilter, data: { assetHandle: cubeHandle } },
225
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
221
226
  { component: MeshRenderer, data: { materials: [floorMatHandle] } },
222
227
  );
223
228
 
@@ -275,17 +280,23 @@ describe('w10 -- shadow instanced dawn smoke (AC-05 behavioral)', () => {
275
280
  scale: [0.5, 0.5, 0.5],
276
281
  },
277
282
  },
278
- { component: MeshFilter, data: { assetHandle: cubeHandle } },
283
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
279
284
  { component: MeshRenderer, data: { materials: [matHandle] } },
280
285
  { component: Instances, data: { transforms: instanceTransforms } },
281
286
  );
282
287
 
283
288
  // Render 300 frames for temporal stability (PCF shadow, light accumulation)
284
- expect(renderer.attachWorld(world).ok).toBe(true);
289
+ const attachment = renderer.attach(world);
290
+ expect(attachment.ok).toBe(true);
291
+ if (!attachment.ok) throw attachment.error;
285
292
  let drawErrors = 0;
286
293
  for (let i = 0; i < 300; i++) {
287
294
  world.update(1 / 60).unwrap();
288
- const r = renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
295
+ const r = renderer.draw({
296
+ leases: [attachment.value],
297
+ camera: { lease: attachment.value },
298
+ environment: { lease: attachment.value },
299
+ });
289
300
  if (!r.ok) drawErrors++;
290
301
  }
291
302
  expect(drawErrors).toBe(0);