@forgeax/engine-runtime 0.1.4 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) hide show
  1. package/README.md +65 -83
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts +2 -0
  4. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts.map +1 -0
  5. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts +2 -0
  6. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts +2 -0
  8. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts.map +1 -0
  9. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts +11 -0
  10. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts.map +1 -0
  11. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts +2 -0
  12. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts.map +1 -0
  13. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts +2 -0
  14. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts.map +1 -0
  15. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts +2 -0
  16. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts.map +1 -0
  17. package/dist/__tests__/asset-registry-mounts.test.d.ts +2 -0
  18. package/dist/__tests__/asset-registry-mounts.test.d.ts.map +1 -0
  19. package/dist/__tests__/asset-registry.browser.test.d.ts +2 -0
  20. package/dist/__tests__/asset-registry.browser.test.d.ts.map +1 -0
  21. package/dist/__tests__/asset-registry.dawn.test.d.ts +2 -0
  22. package/dist/__tests__/asset-registry.dawn.test.d.ts.map +1 -0
  23. package/dist/__tests__/asset-registry.listCatalog.test.d.ts +2 -0
  24. package/dist/__tests__/asset-registry.listCatalog.test.d.ts.map +1 -0
  25. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts +2 -0
  26. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts.map +1 -0
  27. package/dist/__tests__/asset-registry.pack-cache.test.d.ts +2 -0
  28. package/dist/__tests__/asset-registry.pack-cache.test.d.ts.map +1 -0
  29. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts +2 -0
  30. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts.map +1 -0
  31. package/dist/__tests__/asset-registry.recursive.spec.d.ts +2 -0
  32. package/dist/__tests__/asset-registry.recursive.spec.d.ts.map +1 -0
  33. package/dist/__tests__/asset-registry.unit.test.d.ts +2 -0
  34. package/dist/__tests__/asset-registry.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/asset.unit.test.d.ts +2 -0
  36. package/dist/__tests__/asset.unit.test.d.ts.map +1 -0
  37. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts +2 -0
  38. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts.map +1 -0
  39. package/dist/__tests__/backend-selection.integration.test.d.ts +2 -0
  40. package/dist/__tests__/backend-selection.integration.test.d.ts.map +1 -0
  41. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts +2 -0
  42. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts.map +1 -0
  43. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts +2 -0
  44. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts.map +1 -0
  45. package/dist/__tests__/collect-scene-asset.test.d.ts +1 -2
  46. package/dist/__tests__/collect-scene-asset.test.d.ts.map +1 -1
  47. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts +2 -0
  48. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts.map +1 -0
  49. package/dist/__tests__/collect-transient-roundtrip.test.d.ts +1 -1
  50. package/dist/__tests__/collect-transient-roundtrip.test.d.ts.map +1 -1
  51. package/dist/__tests__/collect-transient-skip.test.d.ts +1 -2
  52. package/dist/__tests__/collect-transient-skip.test.d.ts.map +1 -1
  53. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts +2 -0
  54. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts.map +1 -0
  55. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts +2 -0
  56. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts.map +1 -0
  57. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts +2 -0
  58. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts.map +1 -0
  59. package/dist/__tests__/draw-published.d.ts +2 -2
  60. package/dist/__tests__/draw-published.d.ts.map +1 -1
  61. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts +2 -0
  62. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts.map +1 -0
  63. package/dist/__tests__/errors.unit.test.d.ts +2 -0
  64. package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
  65. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts +2 -0
  66. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts.map +1 -0
  67. package/dist/__tests__/fetch-binary-decompress.test.d.ts +2 -0
  68. package/dist/__tests__/fetch-binary-decompress.test.d.ts.map +1 -0
  69. package/dist/__tests__/four-path-compression.integration.test.d.ts +2 -0
  70. package/dist/__tests__/four-path-compression.integration.test.d.ts.map +1 -0
  71. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts +2 -0
  72. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts.map +1 -0
  73. package/dist/__tests__/guid-for-asset.unit.test.d.ts +2 -0
  74. package/dist/__tests__/guid-for-asset.unit.test.d.ts.map +1 -0
  75. package/dist/__tests__/handle-migration.test.d.ts +2 -0
  76. package/dist/__tests__/handle-migration.test.d.ts.map +1 -0
  77. package/dist/__tests__/helpers/register-runtime-components.d.ts.map +1 -1
  78. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts +2 -0
  79. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts.map +1 -0
  80. package/dist/__tests__/host-custom-kind-contract.test.d.ts +2 -0
  81. package/dist/__tests__/host-custom-kind-contract.test.d.ts.map +1 -0
  82. package/dist/__tests__/inspect-name.test.d.ts +2 -0
  83. package/dist/__tests__/inspect-name.test.d.ts.map +1 -0
  84. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts +2 -0
  85. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts.map +1 -0
  86. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts +2 -0
  87. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts.map +1 -0
  88. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts +2 -0
  89. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/loader-extract-graceful.test.d.ts +2 -0
  91. package/dist/__tests__/loader-extract-graceful.test.d.ts.map +1 -0
  92. package/dist/__tests__/loader-name-survival.test.d.ts +2 -0
  93. package/dist/__tests__/loader-name-survival.test.d.ts.map +1 -0
  94. package/dist/__tests__/mesh-bin-contract.test.d.ts +2 -0
  95. package/dist/__tests__/mesh-bin-contract.test.d.ts.map +1 -0
  96. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts +2 -0
  97. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts.map +1 -0
  98. package/dist/__tests__/mesh-bin.test.d.ts +2 -0
  99. package/dist/__tests__/mesh-bin.test.d.ts.map +1 -0
  100. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts +2 -0
  101. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts.map +1 -0
  102. package/dist/__tests__/new-kind-refs-contract.test.d.ts +2 -0
  103. package/dist/__tests__/new-kind-refs-contract.test.d.ts.map +1 -0
  104. package/dist/__tests__/package-promotion.test.d.ts +2 -0
  105. package/dist/__tests__/package-promotion.test.d.ts.map +1 -0
  106. package/dist/__tests__/package-rename.test.d.ts +2 -0
  107. package/dist/__tests__/package-rename.test.d.ts.map +1 -0
  108. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts +1 -1
  109. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts.map +1 -1
  110. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +1 -1
  111. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -1
  112. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts +10 -0
  113. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts.map +1 -0
  114. package/dist/__tests__/render-system-extract.unit.test.d.ts +2 -0
  115. package/dist/__tests__/render-system-extract.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/renderer-test-utils.d.ts +10 -0
  117. package/dist/__tests__/renderer-test-utils.d.ts.map +1 -0
  118. package/dist/__tests__/renderer.test-d.d.ts +2 -0
  119. package/dist/__tests__/renderer.test-d.d.ts.map +1 -0
  120. package/dist/__tests__/resolve-asset-handle-err.test.d.ts +2 -0
  121. package/dist/__tests__/resolve-asset-handle-err.test.d.ts.map +1 -0
  122. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts +2 -0
  123. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts.map +1 -0
  124. package/dist/__tests__/resolveName-fallback.test.d.ts +2 -0
  125. package/dist/__tests__/resolveName-fallback.test.d.ts.map +1 -0
  126. package/dist/__tests__/resolveName-null-package.test.d.ts +2 -0
  127. package/dist/__tests__/resolveName-null-package.test.d.ts.map +1 -0
  128. package/dist/__tests__/resolveName-unified-entry.test.d.ts +2 -0
  129. package/dist/__tests__/resolveName-unified-entry.test.d.ts.map +1 -0
  130. package/dist/__tests__/resolveName.test.d.ts +2 -0
  131. package/dist/__tests__/resolveName.test.d.ts.map +1 -0
  132. package/dist/__tests__/roots-to-scene-asset.test.d.ts +1 -1
  133. package/dist/__tests__/roots-to-scene-asset.test.d.ts.map +1 -1
  134. package/dist/__tests__/roundtrip-primitive.test.d.ts +2 -0
  135. package/dist/__tests__/roundtrip-primitive.test.d.ts.map +1 -0
  136. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts +2 -0
  137. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts.map +1 -0
  138. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts +2 -0
  139. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts.map +1 -0
  140. package/dist/__tests__/scene-mount-fixed-point.test.d.ts +2 -0
  141. package/dist/__tests__/scene-mount-fixed-point.test.d.ts.map +1 -0
  142. package/dist/__tests__/scene-mount-roundtrip.test.d.ts +2 -0
  143. package/dist/__tests__/scene-mount-roundtrip.test.d.ts.map +1 -0
  144. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts +2 -0
  145. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts.map +1 -0
  146. package/dist/__tests__/scene-sugar-instantiate.test.d.ts +2 -0
  147. package/dist/__tests__/scene-sugar-instantiate.test.d.ts.map +1 -0
  148. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts +2 -0
  149. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts.map +1 -0
  150. package/dist/__tests__/serialize-scene-asset.test.d.ts +1 -1
  151. package/dist/__tests__/serialize-scene-asset.test.d.ts.map +1 -1
  152. package/dist/__tests__/template-game-default-api-contract.test.d.ts +2 -0
  153. package/dist/__tests__/template-game-default-api-contract.test.d.ts.map +1 -0
  154. package/dist/__tests__/tileset-asset-validate.test.d.ts +2 -0
  155. package/dist/__tests__/tileset-asset-validate.test.d.ts.map +1 -0
  156. package/dist/__tests__/transcode-fallback.unit.test.d.ts +2 -0
  157. package/dist/__tests__/transcode-fallback.unit.test.d.ts.map +1 -0
  158. package/dist/__tests__/transient-runtime-behavior.test.d.ts +2 -0
  159. package/dist/__tests__/transient-runtime-behavior.test.d.ts.map +1 -0
  160. package/dist/__tests__/video-loader-consumption.test.d.ts +2 -0
  161. package/dist/__tests__/video-loader-consumption.test.d.ts.map +1 -0
  162. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts +2 -0
  163. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts.map +1 -0
  164. package/dist/backend-selection.d.ts +13 -0
  165. package/dist/backend-selection.d.ts.map +1 -0
  166. package/dist/collect-scene-asset.d.ts +7 -4
  167. package/dist/collect-scene-asset.d.ts.map +1 -1
  168. package/dist/createRenderer.d.ts +14 -2
  169. package/dist/createRenderer.d.ts.map +1 -1
  170. package/dist/errors/environment.d.ts +1 -1
  171. package/dist/errors/environment.d.ts.map +1 -1
  172. package/dist/index.d.ts +20 -82
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.mjs +107 -108
  175. package/dist/index.mjs.map +1 -1
  176. package/dist/renderer-host.d.ts +9 -0
  177. package/dist/renderer-host.d.ts.map +1 -0
  178. package/dist/renderer-host.mjs +62 -0
  179. package/dist/renderer-host.mjs.map +1 -0
  180. package/dist/scene-instances/index.d.ts +2 -0
  181. package/dist/scene-instances/index.d.ts.map +1 -0
  182. package/dist/scene-utils/mount-override-fold.d.ts +1 -2
  183. package/dist/scene-utils/mount-override-fold.d.ts.map +1 -1
  184. package/dist/systems/sprite-animation-tick.d.ts +1 -1
  185. package/dist/systems/sprite-animation-tick.d.ts.map +1 -1
  186. package/dist/systems/transparent-sort.d.ts +1 -2
  187. package/dist/systems/transparent-sort.d.ts.map +1 -1
  188. package/dist/tilemap-register-validate.d.ts.map +1 -1
  189. package/package.json +34 -33
  190. package/src/__tests__/active-camera.unit.test.ts +19 -9
  191. package/src/__tests__/animation-graph-collect-roundtrip.test.ts +213 -0
  192. package/src/__tests__/animation-graph-serialize.unit.test.ts +171 -0
  193. package/src/__tests__/append-injection.test.ts +1 -1
  194. package/src/__tests__/asset-brand-and-name-retirement.test.ts +102 -0
  195. package/src/__tests__/asset-error-exhaustive.test-d.ts +62 -0
  196. package/src/__tests__/asset-registry-guid-reverse.test.ts +608 -0
  197. package/src/__tests__/asset-registry-hdr-equirect.test.ts +78 -0
  198. package/src/__tests__/asset-registry-mesh-pack-payload.dawn.test.ts +232 -0
  199. package/src/__tests__/asset-registry-mounts.test.ts +806 -0
  200. package/src/__tests__/asset-registry.browser.test.ts +81 -0
  201. package/src/__tests__/asset-registry.dawn.test.ts +94 -0
  202. package/src/__tests__/asset-registry.listCatalog.test.ts +170 -0
  203. package/src/__tests__/asset-registry.mesh-bin.test.ts +316 -0
  204. package/src/__tests__/asset-registry.pack-cache.test.ts +969 -0
  205. package/src/__tests__/asset-registry.raw-container-failfast.test.ts +225 -0
  206. package/src/__tests__/asset-registry.recursive.spec.ts +1397 -0
  207. package/src/__tests__/asset-registry.unit.test.ts +1030 -0
  208. package/src/__tests__/asset.unit.test.ts +7107 -0
  209. package/src/__tests__/audio-load-by-guid.unit.test.ts +126 -0
  210. package/src/__tests__/backend-selection.integration.test.ts +11 -0
  211. package/src/__tests__/basis-catalog-dispatch.integration.test.ts +320 -0
  212. package/src/__tests__/bind-group-cache-keying.test.ts +4 -4
  213. package/src/__tests__/block-upload-math.unit.test.ts +2 -2
  214. package/src/__tests__/builtin-asset-registry.unit.test.ts +112 -0
  215. package/src/__tests__/builtin-shader-register-e2e.test.ts +1 -1
  216. package/src/__tests__/cache-false-eviction.test.ts +2 -1
  217. package/src/__tests__/cache-isolation-matrix.test.ts +2 -1
  218. package/src/__tests__/camera-clear-snapshot-equivalence.unit.test.ts +5 -6
  219. package/src/__tests__/clamp-to-last.e2e.browser.test.ts +29 -19
  220. package/src/__tests__/collect-scene-asset.test.ts +49 -52
  221. package/src/__tests__/collect-scene-mount-collapse.test.ts +391 -0
  222. package/src/__tests__/collect-subtree.unit.test.ts +1 -2
  223. package/src/__tests__/collect-transient-children-absent.test.ts +24 -10
  224. package/src/__tests__/collect-transient-roundtrip.test.ts +44 -20
  225. package/src/__tests__/collect-transient-skip.test.ts +24 -13
  226. package/src/__tests__/components.test-d.ts +1 -6
  227. package/src/__tests__/components.unit.test.ts +20 -19
  228. package/src/__tests__/composite-skybox-cross-world.browser.test.ts +59 -27
  229. package/src/__tests__/compressed-texture-physical-extent.integration.test.ts +139 -0
  230. package/src/__tests__/create-renderer-assembly.integration.test.ts +42 -29
  231. package/src/__tests__/createRenderer-dispose.test.ts +35 -402
  232. package/src/__tests__/createRenderer.browser-no-webgpu.test.ts +25 -30
  233. package/src/__tests__/createRenderer.unit.test.ts +1 -1
  234. package/src/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.ts +27 -63
  235. package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +56 -47
  236. package/src/__tests__/dawn/instances-per-instance-pbr.dawn.test.ts +49 -29
  237. package/src/__tests__/dawn/instances-shadow.dawn.test.ts +26 -15
  238. package/src/__tests__/dawn/instances-uniform-fallback.dawn.test.ts +13 -14
  239. package/src/__tests__/dawn/material-alpha.dawn.test.ts +23 -31
  240. package/src/__tests__/dawn/material-cooked-fixture.dawn.test.ts +24 -9
  241. package/src/__tests__/dawn/{mesh-update.dawn.test.ts → mesh-update-dawn.test.ts} +42 -134
  242. package/src/__tests__/dawn/mipmap-srgb-linear.dawn.test.ts +14 -7
  243. package/src/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.ts +16 -28
  244. package/src/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.ts +23 -39
  245. package/src/__tests__/dawn/upload-texture.dawn.test.ts +198 -0
  246. package/src/__tests__/dawn/user-handle-mesh-render.dawn.test.ts +12 -14
  247. package/src/__tests__/dawn/user-mesh-upload.dawn.test.ts +27 -22
  248. package/src/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.ts +25 -28
  249. package/src/__tests__/dawn/zero-manifest-ready.dawn.test.ts +10 -11
  250. package/src/__tests__/demo-sortscope-migration.unit.test.ts +5 -5
  251. package/src/__tests__/derive-bgl-integration.test.ts +34 -44
  252. package/src/__tests__/derive-render-data-skin.unit.test.ts +1 -1
  253. package/src/__tests__/draw-published.ts +11 -4
  254. package/src/__tests__/dynamic-texture-store.unit.test.ts +190 -0
  255. package/src/__tests__/equirect-bc6h.integration.test.ts +144 -21
  256. package/src/__tests__/errors.unit.test.ts +1227 -0
  257. package/src/__tests__/extract-frames-graceful-degradation.test.ts +3 -7
  258. package/src/__tests__/extract-frames-merge.test.ts +35 -22
  259. package/src/__tests__/extract-record-no-hardcoded-texture-fields.test.ts +5 -16
  260. package/src/__tests__/extract-skin-mismatch.unit.test.ts +322 -0
  261. package/src/__tests__/fetch-binary-decompress.test.ts +356 -0
  262. package/src/__tests__/four-path-compression.integration.test.ts +395 -0
  263. package/src/__tests__/frame-targets-shadow-regression.unit.test.ts +1 -1
  264. package/src/__tests__/fullscreen-feature-host.dawn.test.ts +80 -0
  265. package/src/__tests__/fullscreen-post-bgl-depth.test.ts +4 -2
  266. package/src/__tests__/fullscreen-post-depth-params-arity.test.ts +3 -3
  267. package/src/__tests__/fullscreen-post-process-pass.dawn.test.ts +39 -23
  268. package/src/__tests__/fullscreen-post-process-pass.unit.test.ts +4 -2
  269. package/src/__tests__/fxaa-pixel-diff.dawn.test.ts +28 -17
  270. package/src/__tests__/fxaa-validation-and-resize.dawn.test.ts +29 -18
  271. package/src/__tests__/fxaa-zero-overhead.dawn.test.ts +16 -12
  272. package/src/__tests__/geometry.unit.test.ts +525 -159
  273. package/src/__tests__/glyph-tilemap-worldid.test.ts +1 -1
  274. package/src/__tests__/gpu-resource-cow-survivor.test.ts +6 -4
  275. package/src/__tests__/guid-for-asset.unit.test.ts +102 -0
  276. package/src/__tests__/handle-migration.test.ts +136 -0
  277. package/src/__tests__/helpers/register-runtime-components.ts +4 -2
  278. package/src/__tests__/helpers/register-scene-components.ts +1 -1
  279. package/src/__tests__/host-custom-kind-contract.test-d.ts +47 -0
  280. package/src/__tests__/host-custom-kind-contract.test.ts +578 -0
  281. package/src/__tests__/inspect-name.test.ts +139 -0
  282. package/src/__tests__/instances.test-d.ts +1 -1
  283. package/src/__tests__/instantiate-mount-deferred-wiring.test.ts +112 -0
  284. package/src/__tests__/light-casters-9-light.browser.test.ts +73 -76
  285. package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +7 -10
  286. package/src/__tests__/light-snapshot.test-d.ts +2 -2
  287. package/src/__tests__/lights-vec-negative.unit.test.ts +1 -1
  288. package/src/__tests__/lights.unit.test.ts +31 -511
  289. package/src/__tests__/loadbyguid-payload.unit.test.ts +117 -0
  290. package/src/__tests__/loadbyguid-texture-intern.unit.test.ts +213 -0
  291. package/src/__tests__/loader-extract-graceful.test.ts +146 -0
  292. package/src/__tests__/loader-name-survival.test.ts +213 -0
  293. package/src/__tests__/m3-vec-negative.unit.test.ts +3 -2
  294. package/src/__tests__/material-texture-uv-scale.unit.test.ts +101 -31
  295. package/src/__tests__/materials.unit.test.ts +10 -27
  296. package/src/__tests__/mesh-bin-contract.test.ts +28 -0
  297. package/src/__tests__/mesh-bin-skin-roundtrip.unit.test.ts +149 -0
  298. package/src/__tests__/mesh-bin.test.ts +38 -0
  299. package/src/__tests__/mesh-loader-skin-contract.unit.test.ts +120 -0
  300. package/src/__tests__/mesh-ssbo-grow.unit.test.ts +3 -3
  301. package/src/__tests__/mip-gate.unit.test.ts +1 -1
  302. package/src/__tests__/msaa-sprite-pixel-diff.dawn.test.ts +29 -68
  303. package/src/__tests__/new-kind-refs-contract.test.ts +132 -0
  304. package/src/__tests__/node-shims.d.ts +4 -6
  305. package/src/__tests__/package-promotion.test.ts +88 -0
  306. package/src/__tests__/package-rename.test.ts +103 -0
  307. package/src/__tests__/pass-selector.unit.test.ts +2 -2
  308. package/src/__tests__/pbr-pipeline.unit.test.ts +21 -25
  309. package/src/__tests__/pipeline-builder-msaa.unit.test.ts +6 -9
  310. package/src/__tests__/pipeline-cache-keying.unit.test.ts +6 -9
  311. package/src/__tests__/pipeline-spec.test.ts +16 -177
  312. package/src/__tests__/pipeline.unit.test.ts +154 -1693
  313. package/src/__tests__/point-light-shadow.dawn.test.ts +33 -42
  314. package/src/__tests__/point-light-shadow.unit.test.ts +19 -60
  315. package/src/__tests__/post-process-error-codes.unit.test.ts +4 -1
  316. package/src/__tests__/post-process-params-component.unit.test.ts +1 -1
  317. package/src/__tests__/post-process-params-extract.unit.test.ts +2 -5
  318. package/src/__tests__/postprocess-camera-consistency.test.ts +4 -7
  319. package/src/__tests__/profiler-assembly.integration.test.ts +1 -1
  320. package/src/__tests__/propagate-transforms.dawn.test.ts +12 -11
  321. package/src/__tests__/record-worldid-isolation.test.ts +7 -29
  322. package/src/__tests__/recover-error-exhaustive.test-d.ts +1 -1
  323. package/src/__tests__/render-error-exhaustive.test-d.ts +117 -71
  324. package/src/__tests__/render-feature-assembly.test-d.ts +20 -9
  325. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +8 -6
  326. package/src/__tests__/render-feature-prepared-graphics.browser.test.ts +65 -559
  327. package/src/__tests__/render-feature-prepared-graphics.dawn.test.ts +57 -544
  328. package/src/__tests__/render-feature-prepared-graphics.fixture.ts +104 -0
  329. package/src/__tests__/render-feature-prepared-graphics.integration.test.ts +40 -248
  330. package/src/__tests__/render-feature-prepared-graphics.regression.integration.test.ts +83 -340
  331. package/src/__tests__/render-feature-recover.integration.test.ts +9 -49
  332. package/src/__tests__/render-feature-runtime-surface.test-d.ts +17 -20
  333. package/src/__tests__/render-schema-consumer.integration.test.ts +20 -13
  334. package/src/__tests__/render-schema-owner-boundary.unit.test.ts +2 -6
  335. package/src/__tests__/render-system-cross-world-overlay-queue.test.ts +5 -5
  336. package/src/__tests__/render-system-extract-dispatch-ordering.test.ts +16 -31
  337. package/src/__tests__/render-system-extract.test.ts +36 -51
  338. package/src/__tests__/render-system-extract.unit.test.ts +360 -0
  339. package/src/__tests__/render-system-fold-bucket.unit.test.ts +3 -5
  340. package/src/__tests__/render-system-fold-fallback.unit.test.ts +6 -3
  341. package/src/__tests__/render-system-fold-material.unit.test.ts +3 -5
  342. package/src/__tests__/render-system-fold-metrics.unit.test.ts +5 -5
  343. package/src/__tests__/render-system-fold-modegate.unit.test.ts +6 -6
  344. package/src/__tests__/render-system-fold.dawn.test.ts +7 -5
  345. package/src/__tests__/render-system-mega.test.ts +292 -190
  346. package/src/__tests__/render-system-owner-split-contract.test.ts +10 -32
  347. package/src/__tests__/render-system-record-multi-material-textureview.test.ts +59 -45
  348. package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +23 -29
  349. package/src/__tests__/render-system-record.test.ts +398 -235
  350. package/src/__tests__/render-system-record.unit.test.ts +25 -26
  351. package/src/__tests__/render-system-skin-bg.unit.test.ts +8 -12
  352. package/src/__tests__/renderer-consumer.test-d.ts +16 -3
  353. package/src/__tests__/renderer-health.unit.test.ts +26 -916
  354. package/src/__tests__/renderer-lifecycle.integration.test.ts +19 -6
  355. package/src/__tests__/renderer-recover.unit.test.ts +49 -1069
  356. package/src/__tests__/renderer-result.test-d.ts +19 -9
  357. package/src/__tests__/renderer-surface.unit.test.ts +3 -5
  358. package/src/__tests__/renderer-test-utils.ts +56 -0
  359. package/src/__tests__/renderer.test-d.ts +61 -0
  360. package/src/__tests__/resolve-asset-handle-err.test.ts +111 -0
  361. package/src/__tests__/resolve-asset-handle.unit.test.ts +64 -0
  362. package/src/__tests__/resolve-depth-only-view.test.ts +1 -1
  363. package/src/__tests__/resolveName-fallback.test.ts +64 -0
  364. package/src/__tests__/resolveName-null-package.test.ts +38 -0
  365. package/src/__tests__/resolveName-unified-entry.test.ts +65 -0
  366. package/src/__tests__/resolveName.test.ts +64 -0
  367. package/src/__tests__/rhi-null-command-flow.unit.test.ts +56 -260
  368. package/src/__tests__/rhi-null-renderer-lifecycle.unit.test.ts +41 -169
  369. package/src/__tests__/roots-to-scene-asset.test.ts +199 -93
  370. package/src/__tests__/roundtrip-primitive.test.ts +351 -0
  371. package/src/__tests__/scene-bare-guid-refs-instantiate.test.ts +123 -0
  372. package/src/__tests__/scene-equirect-roundtrip.test.ts +103 -16
  373. package/src/__tests__/scene-instance-authoring.integration.test.ts +8 -0
  374. package/src/__tests__/scene-instance-bridge.integration.test.ts +1 -1
  375. package/src/__tests__/scene-instance-component.test.ts +1 -1
  376. package/src/__tests__/scene-mount-fixed-point.test.ts +257 -0
  377. package/src/__tests__/scene-mount-roundtrip.test.ts +987 -0
  378. package/src/__tests__/scene-mount-wrapper-roundtrip.test.ts +202 -0
  379. package/src/__tests__/scene-sugar-instantiate.test.ts +324 -0
  380. package/src/__tests__/serialize-mounts-roundtrip.test.ts +533 -0
  381. package/src/__tests__/serialize-scene-asset.test.ts +219 -22
  382. package/src/__tests__/shadow-caster-empty-schema.test.ts +3 -3
  383. package/src/__tests__/shadow-csm-cascade-loadop.test.ts +37 -17
  384. package/src/__tests__/shadow-csm-component.test.ts +3 -5
  385. package/src/__tests__/shadow-csm-extract.test.ts +2 -100
  386. package/src/__tests__/shadow-csm-orthoz.test.ts +2 -16
  387. package/src/__tests__/shadow-csm-runtime-vary.dawn.test.ts +19 -14
  388. package/src/__tests__/shadow-csm-tile-consistency.test.ts +32 -26
  389. package/src/__tests__/shadow-csm-ubo.dawn.test.ts +8 -49
  390. package/src/__tests__/shadow-csm-ubo.test.ts +3 -25
  391. package/src/__tests__/shadow-csm-viewport.browser.test.ts +1 -1
  392. package/src/__tests__/shadow-fields-observable.dawn.test.ts +67 -56
  393. package/src/__tests__/shadow-m1.dawn.test.ts +8 -9
  394. package/src/__tests__/shadow-mesh-ssbo-order.test.ts +11 -27
  395. package/src/__tests__/skin-errors.unit.test.ts +1 -1
  396. package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +7 -5
  397. package/src/__tests__/skylight-lazy-projection.test.ts +36 -15
  398. package/src/__tests__/sparse-tag-scene-roundtrip.test.ts +5 -5
  399. package/src/__tests__/sprite-cullmode-flip.dawn.test.ts +47 -64
  400. package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +15 -14
  401. package/src/__tests__/sprite-lit-extract-branch.test.ts +1 -1
  402. package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +1 -1
  403. package/src/__tests__/ssao-bgl.test.ts +16 -9
  404. package/src/__tests__/ssao-buffers.test.ts +2 -2
  405. package/src/__tests__/ssao-data.test.ts +2 -2
  406. package/src/__tests__/ssao-errors.test.ts +1 -1
  407. package/src/__tests__/ssao-passes.test.ts +68 -392
  408. package/src/__tests__/ssao-pipelines.test.ts +1 -1
  409. package/src/__tests__/ssao-uniform-layout.test.ts +8 -6
  410. package/src/__tests__/stencil-outline-pixel.dawn.test.ts +25 -17
  411. package/src/__tests__/swap-chain-format.unit.test.ts +5 -7
  412. package/src/__tests__/systems.unit.test.ts +536 -1326
  413. package/src/__tests__/template-game-default-api-contract.test.ts +362 -0
  414. package/src/__tests__/text.unit.test.ts +56 -33
  415. package/src/__tests__/tilemap-childed-despawn.test.ts +8 -14
  416. package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +8 -12
  417. package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +2 -1
  418. package/src/__tests__/tilemap-chunk-extract.test.ts +13 -17
  419. package/src/__tests__/tilemap-dirty-rebuild.test.ts +7 -11
  420. package/src/__tests__/tilemap-material-cache.test.ts +8 -13
  421. package/src/__tests__/tilemap-multi-atlas.test.ts +12 -32
  422. package/src/__tests__/tilemap-owner-boundary.unit.test.ts +5 -2
  423. package/src/__tests__/tilemap-region-pack.test.ts +8 -12
  424. package/src/__tests__/tilemap-spawn-flip-pivot.test.ts +8 -12
  425. package/src/__tests__/tilemap-uv-inset.test.ts +11 -14
  426. package/src/__tests__/tilemap-validate.test.ts +1 -1
  427. package/src/__tests__/tileset-asset-validate.test.ts +638 -0
  428. package/src/__tests__/transcode-fallback.unit.test.ts +207 -0
  429. package/src/__tests__/transform-hierarchy-pixel-diff.dawn.test.ts +36 -28
  430. package/src/__tests__/transient-fields-collect.test.ts +28 -21
  431. package/src/__tests__/transient-runtime-behavior.test.ts +227 -0
  432. package/src/__tests__/transparent-sort-tilemap-sprite-interleave.test.ts +4 -4
  433. package/src/__tests__/variant-selection.unit.test.ts +1 -1
  434. package/src/__tests__/video-extract-bindgroup.dawn.test.ts +89 -136
  435. package/src/__tests__/video-loader-consumption.test.ts +86 -0
  436. package/src/__tests__/video-loader-smoke.dawn.test.ts +60 -0
  437. package/src/__tests__/view-ubo-layout.browser.test.ts +0 -22
  438. package/src/__tests__/world-entity-key.test.ts +1 -1
  439. package/src/__tests__/world-scene-despawn.test.ts +1 -1
  440. package/src/__tests__/world-scene-instantiate.test.ts +2 -36
  441. package/src/__tests__/world-scene-nested.test.ts +1 -1
  442. package/src/__tests__/world-scene-override.test.ts +1 -1
  443. package/src/backend-selection.ts +69 -0
  444. package/src/collect-scene-asset.ts +35 -23
  445. package/src/components/__tests__/camera.test-d.ts +1 -1
  446. package/src/components/__tests__/camera.test.ts +1 -1
  447. package/src/components/__tests__/sprite-animation.test-d.ts +2 -2
  448. package/src/components/__tests__/tile-layer.test-d.ts +1 -1
  449. package/src/components/__tests__/tile-layer.unit.test.ts +2 -2
  450. package/src/createRenderer.ts +24 -36
  451. package/src/errors/environment.ts +1 -1
  452. package/src/index.ts +51 -113
  453. package/src/renderer-host.ts +33 -0
  454. package/src/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.ts +1 -1
  455. package/src/scene-instances/index.ts +4 -0
  456. package/src/scene-utils/mount-override-fold.ts +3 -7
  457. package/src/systems/__tests__/transparent-sort.bench.ts +3 -3
  458. package/src/systems/sprite-animation-tick.ts +1 -1
  459. package/src/systems/transparent-sort.ts +38 -38
  460. package/src/tilemap-register-validate.ts +4 -4
  461. package/dist/__tests__/bind-group-cache-binding.test.d.ts +0 -2
  462. package/dist/__tests__/bind-group-cache-binding.test.d.ts.map +0 -1
  463. package/dist/__tests__/bind-group-cache-frame.test.d.ts +0 -2
  464. package/dist/__tests__/bind-group-cache-frame.test.d.ts.map +0 -1
  465. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts +0 -2
  466. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts.map +0 -1
  467. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts +0 -2
  468. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts.map +0 -1
  469. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts +0 -2
  470. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts.map +0 -1
  471. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts +0 -2
  472. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts.map +0 -1
  473. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts +0 -2
  474. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts.map +0 -1
  475. package/dist/__tests__/fog-producer-manifest.d.ts +0 -131
  476. package/dist/__tests__/fog-producer-manifest.d.ts.map +0 -1
  477. package/dist/__tests__/fog-producer-pixel-probe.d.ts +0 -42
  478. package/dist/__tests__/fog-producer-pixel-probe.d.ts.map +0 -1
  479. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts +0 -2
  480. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts.map +0 -1
  481. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts +0 -2
  482. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts.map +0 -1
  483. package/dist/__tests__/fog-producer-real-fixture.d.ts +0 -5
  484. package/dist/__tests__/fog-producer-real-fixture.d.ts.map +0 -1
  485. package/dist/__tests__/fog-producer-vfx-effect.d.ts +0 -3
  486. package/dist/__tests__/fog-producer-vfx-effect.d.ts.map +0 -1
  487. package/dist/__tests__/fog-scene-asset.integration.test.d.ts +0 -2
  488. package/dist/__tests__/fog-scene-asset.integration.test.d.ts.map +0 -1
  489. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts +0 -2
  490. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts.map +0 -1
  491. package/dist/__tests__/gpu-resource.test.d.ts +0 -2
  492. package/dist/__tests__/gpu-resource.test.d.ts.map +0 -1
  493. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts +0 -2
  494. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts.map +0 -1
  495. package/dist/__tests__/hdrp-buffers.unit.test.d.ts +0 -2
  496. package/dist/__tests__/hdrp-buffers.unit.test.d.ts.map +0 -1
  497. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts +0 -2
  498. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts.map +0 -1
  499. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts +0 -2
  500. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts.map +0 -1
  501. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts +0 -2
  502. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts.map +0 -1
  503. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts +0 -2
  504. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts.map +0 -1
  505. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts +0 -2
  506. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts.map +0 -1
  507. package/dist/__tests__/helpers/primitive-world.d.ts +0 -8
  508. package/dist/__tests__/helpers/primitive-world.d.ts.map +0 -1
  509. package/dist/__tests__/helpers/render-asset-port.d.ts +0 -15
  510. package/dist/__tests__/helpers/render-asset-port.d.ts.map +0 -1
  511. package/dist/__tests__/helpers/scene-asset-port.d.ts +0 -9
  512. package/dist/__tests__/helpers/scene-asset-port.d.ts.map +0 -1
  513. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts +0 -2
  514. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts.map +0 -1
  515. package/dist/__tests__/pipeline-layout-selection.test.d.ts +0 -2
  516. package/dist/__tests__/pipeline-layout-selection.test.d.ts.map +0 -1
  517. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts +0 -2
  518. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts.map +0 -1
  519. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts +0 -2
  520. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts.map +0 -1
  521. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts +0 -2
  522. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts.map +0 -1
  523. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts +0 -2
  524. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts.map +0 -1
  525. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts +0 -2
  526. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts.map +0 -1
  527. package/dist/__tests__/shadow-csm-pssm.test.d.ts +0 -2
  528. package/dist/__tests__/shadow-csm-pssm.test.d.ts.map +0 -1
  529. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts +0 -2
  530. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts.map +0 -1
  531. package/dist/__tests__/shadow-csm-viewport.test.d.ts +0 -2
  532. package/dist/__tests__/shadow-csm-viewport.test.d.ts.map +0 -1
  533. package/dist/__tests__/shadow-m2.dawn.test.d.ts +0 -2
  534. package/dist/__tests__/shadow-m2.dawn.test.d.ts.map +0 -1
  535. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts +0 -2
  536. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts.map +0 -1
  537. package/dist/__tests__/shadow-m3-calibrate.d.ts +0 -83
  538. package/dist/__tests__/shadow-m3-calibrate.d.ts.map +0 -1
  539. package/dist/__tests__/shadow-m3.dawn.test.d.ts +0 -2
  540. package/dist/__tests__/shadow-m3.dawn.test.d.ts.map +0 -1
  541. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts +0 -2
  542. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts.map +0 -1
  543. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts +0 -2
  544. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts.map +0 -1
  545. package/dist/__tests__/temporal-off-path.unit.test.d.ts +0 -2
  546. package/dist/__tests__/temporal-off-path.unit.test.d.ts.map +0 -1
  547. package/dist/__tests__/video-cache-regression.unit.test.d.ts +0 -2
  548. package/dist/__tests__/video-cache-regression.unit.test.d.ts.map +0 -1
  549. package/dist/asset-kind.d.ts +0 -4
  550. package/dist/asset-kind.d.ts.map +0 -1
  551. package/dist/errors/sprite-animation.d.ts +0 -3
  552. package/dist/errors/sprite-animation.d.ts.map +0 -1
  553. package/dist/scene-asset-port.d.ts +0 -17
  554. package/dist/scene-asset-port.d.ts.map +0 -1
  555. package/dist/scene-collect-errors.d.ts +0 -22
  556. package/dist/scene-collect-errors.d.ts.map +0 -1
  557. package/dist/shadow-m3-calibrate.d.ts +0 -40
  558. package/dist/shadow-m3-calibrate.d.ts.map +0 -1
  559. package/src/__tests__/bind-group-cache-binding.test.ts +0 -2513
  560. package/src/__tests__/bind-group-cache-frame.test.ts +0 -1511
  561. package/src/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.ts +0 -204
  562. package/src/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.ts +0 -297
  563. package/src/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.ts +0 -271
  564. package/src/__tests__/dispatch-fullscreen-pass-params.unit.test.ts +0 -321
  565. package/src/__tests__/fog-producer-manifest.ts +0 -162
  566. package/src/__tests__/fog-producer-pixel-probe.ts +0 -263
  567. package/src/__tests__/fog-producer-pixel.browser.test.ts +0 -26
  568. package/src/__tests__/fog-producer-pixel.dawn.test.ts +0 -55
  569. package/src/__tests__/fog-producer-real-fixture.ts +0 -805
  570. package/src/__tests__/fog-producer-vfx-effect.ts +0 -272
  571. package/src/__tests__/fog-scene-asset.integration.test.ts +0 -123
  572. package/src/__tests__/gpu-resource-store-cubemap-status.test.ts +0 -207
  573. package/src/__tests__/gpu-resource.test.ts +0 -1206
  574. package/src/__tests__/hdrp-bgl-slots.browser.test.ts +0 -50
  575. package/src/__tests__/hdrp-buffers.unit.test.ts +0 -70
  576. package/src/__tests__/hdrp-execute-filter.unit.test.ts +0 -200
  577. package/src/__tests__/hdrp-gbuffer-attachments.browser.test.ts +0 -64
  578. package/src/__tests__/hdrp-pipeline-asset-type.test-d.ts +0 -139
  579. package/src/__tests__/hdrp-ssao-boundary.test.ts +0 -237
  580. package/src/__tests__/hdrp-ssao-falsification.test.ts +0 -289
  581. package/src/__tests__/helpers/primitive-world.ts +0 -91
  582. package/src/__tests__/helpers/render-asset-port.ts +0 -65
  583. package/src/__tests__/helpers/scene-asset-port.ts +0 -23
  584. package/src/__tests__/material-derived-coordinates.integration.test.ts +0 -100
  585. package/src/__tests__/pipeline-layout-selection.test.ts +0 -298
  586. package/src/__tests__/post-process-reads-narrowing.test-d.ts +0 -52
  587. package/src/__tests__/post-process-register-roundtrip.dawn.test.ts +0 -230
  588. package/src/__tests__/render-feature-zero-feature.browser.test.ts +0 -152
  589. package/src/__tests__/render-pipeline-trivial.dawn.test.ts +0 -525
  590. package/src/__tests__/shadow-csm-caster-membership.test.ts +0 -232
  591. package/src/__tests__/shadow-csm-pssm.test.ts +0 -142
  592. package/src/__tests__/shadow-csm-temporal.browser.test.ts +0 -145
  593. package/src/__tests__/shadow-csm-viewport.test.ts +0 -74
  594. package/src/__tests__/shadow-m2.dawn.test.ts +0 -394
  595. package/src/__tests__/shadow-m3-calibrate-run.dawn.test.ts +0 -248
  596. package/src/__tests__/shadow-m3-calibrate.ts +0 -203
  597. package/src/__tests__/shadow-m3.dawn.test.ts +0 -288
  598. package/src/__tests__/shadow-probe-control-flow.dawn.test.ts +0 -264
  599. package/src/__tests__/shadow-quality-metrics.dawn.test.ts +0 -324
  600. package/src/__tests__/temporal-off-path.unit.test.ts +0 -69
  601. package/src/__tests__/video-cache-regression.unit.test.ts +0 -186
  602. package/src/asset-kind.ts +0 -7
  603. package/src/errors/sprite-animation.ts +0 -5
  604. package/src/scene-asset-port.ts +0 -32
  605. package/src/scene-collect-errors.ts +0 -30
  606. package/src/shadow-m3-calibrate.ts +0 -171
@@ -109,11 +109,11 @@ describe('w6 -- AC-07 storage+uniform variant test (degraded best-effort)', () =
109
109
  // end-to-end on dawn.
110
110
 
111
111
  const { World } = await import('@forgeax/engine-ecs');
112
- const { createPrimitiveMesh } = await import('@forgeax/engine-geometry');
113
- const { Camera, MeshRenderer } = await import('@forgeax/engine-render/internal');
114
- const { Instances } = await import('@forgeax/engine-render/internal');
115
- const { createRenderer } = await import('@forgeax/engine-runtime');
116
- const { MeshFilter } = await import('@forgeax/engine-render/internal');
112
+ const { AssetRegistry, HANDLE_CUBE } = await import('@forgeax/engine-assets-runtime');
113
+ const { Camera, MeshRenderer } = await import('@forgeax/engine-render');
114
+ const { Instances } = await import('@forgeax/engine-render');
115
+ const { constructRuntimeRendererHost } = await import('../../renderer-host');
116
+ const { MeshFilter } = await import('@forgeax/engine-render');
117
117
  const { Transform } = await import('@forgeax/engine-scene');
118
118
  const { buildEngineShaderManifest } = await import('@forgeax/engine-vite-plugin-shader');
119
119
  const ENGINE_MANIFEST_W6 = await buildEngineShaderManifest();
@@ -173,9 +173,9 @@ describe('w6 -- AC-07 storage+uniform variant test (degraded best-effort)', () =
173
173
  removeEventListener() {},
174
174
  } as unknown as HTMLCanvasElement;
175
175
 
176
- let renderer: Awaited<ReturnType<typeof createRenderer>>;
176
+ let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
177
177
  try {
178
- renderer = await createRenderer(
178
+ host = await constructRuntimeRendererHost(
179
179
  mockCanvas,
180
180
  {},
181
181
  { shaderManifestUrl: ENGINE_MANIFEST_URL_W6 },
@@ -183,11 +183,11 @@ describe('w6 -- AC-07 storage+uniform variant test (degraded best-effort)', () =
183
183
  } finally {
184
184
  globalThis.navigator.gpu.requestAdapter = origReq;
185
185
  }
186
- expect(renderer.backend).toBe('webgpu');
187
-
188
- const ready = await renderer.ready;
189
- expect(ready.ok).toBe(true);
190
- if (!ready.ok) return;
186
+ expect(host.ok).toBe(true);
187
+ if (!host.ok) throw host.error;
188
+ const { renderer, assets } = host.value;
189
+ expect(renderer.inspect().state).toBe('alive');
190
+ expect(assets).toBeInstanceOf(AssetRegistry);
191
191
 
192
192
  const matAsset: MaterialAsset = {
193
193
  kind: 'material',
@@ -222,7 +222,6 @@ describe('w6 -- AC-07 storage+uniform variant test (degraded best-effort)', () =
222
222
  }
223
223
 
224
224
  const world = new World();
225
- const cubeHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
226
225
  const matHandle = world.allocSharedRef<'MaterialAsset', MaterialAsset>(
227
226
  'MaterialAsset',
228
227
  matAsset,
@@ -236,7 +235,7 @@ describe('w6 -- AC-07 storage+uniform variant test (degraded best-effort)', () =
236
235
  scale: [0.3, 0.3, 0.3],
237
236
  },
238
237
  },
239
- { component: MeshFilter, data: { assetHandle: cubeHandle } },
238
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
240
239
  { component: MeshRenderer, data: { materials: [matHandle] } },
241
240
  { component: Instances, data: { transforms } },
242
241
  );
@@ -6,11 +6,11 @@ import {
6
6
  Materials,
7
7
  MeshFilter,
8
8
  MeshRenderer,
9
- } from '@forgeax/engine-render/internal';
10
- import { createRenderer } from '@forgeax/engine-runtime';
9
+ } from '@forgeax/engine-render';
11
10
  import { Transform } from '@forgeax/engine-scene';
12
11
  import type { TextureAsset } from '@forgeax/engine-types';
13
12
  import { describe, expect, it } from 'vitest';
13
+ import { constructRuntimeRendererHost } from '../../renderer-host';
14
14
 
15
15
  const WIDTH = 64;
16
16
  const HEIGHT = 64;
@@ -175,18 +175,25 @@ async function captureCase(testCase: AlphaCase): Promise<[number, number, number
175
175
  addEventListener() {},
176
176
  removeEventListener() {},
177
177
  } as unknown as HTMLCanvasElement;
178
- let renderer: Awaited<ReturnType<typeof createRenderer>>;
178
+ let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
179
179
  try {
180
- renderer = await createRenderer(canvas, {}, { shaderManifestUrl: ENGINE_MANIFEST_URL });
180
+ host = await constructRuntimeRendererHost(
181
+ canvas,
182
+ {},
183
+ {
184
+ shaderManifestUrl: ENGINE_MANIFEST_URL,
185
+ },
186
+ );
181
187
  } finally {
182
188
  globalThis.navigator.gpu.requestAdapter = original;
183
189
  }
184
- const ready = await renderer.ready;
185
- expect(ready.ok).toBe(true);
186
- if (!ready.ok || device === undefined) throw new Error('runtime Dawn renderer not ready');
190
+ expect(host.ok).toBe(true);
191
+ if (!host.ok || device === undefined) throw new Error('runtime Dawn renderer not ready');
192
+ const { renderer } = host.value;
193
+ expect(renderer.inspect().state).toBe('alive');
187
194
 
188
195
  const world = new World();
189
- const attachment = renderer.attachWorld(world);
196
+ const attachment = renderer.attach(world);
190
197
  if (!attachment.ok) throw attachment.error;
191
198
  const plane = createPlaneGeometry(2.8, 2.8);
192
199
  expect(plane.ok).toBe(true);
@@ -196,18 +203,8 @@ async function captureCase(testCase: AlphaCase): Promise<[number, number, number
196
203
  testCase.textureColor === undefined ? undefined : makeTexture(testCase.textureColor);
197
204
  const textureHandle =
198
205
  texture === undefined ? undefined : world.allocSharedRef('TextureAsset', texture);
199
- if (texture !== undefined && textureHandle !== undefined) {
200
- const uploaded = await renderer.store.uploadTexture(textureHandle, texture, {
201
- bytes: texture.data,
202
- width: 1,
203
- height: 1,
204
- mime: 'image/png',
205
- colorSpace: 'srgb',
206
- mipmap: false,
207
- });
208
- expect(uploaded.ok).toBe(true);
209
- if (!uploaded.ok) throw new Error('texture upload failed');
210
- }
206
+ // The renderer-owned record stage derives GPU residency from this world
207
+ // asset. No renderer store upload is part of the public contract.
211
208
  const renderState =
212
209
  testCase.mode === 'BLEND'
213
210
  ? {
@@ -242,16 +239,7 @@ async function captureCase(testCase: AlphaCase): Promise<[number, number, number
242
239
  renderState,
243
240
  ...(textureHandle === undefined
244
241
  ? {}
245
- : {
246
- baseColorTexture: {
247
- texture: textureHandle as never,
248
- coordinates: {
249
- set: 0,
250
- transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
251
- physicalUvScale: [1, 1],
252
- },
253
- },
254
- }),
242
+ : { baseColorTexture: { texture: textureHandle as never } }),
255
243
  ...(testCase.mode === 'MASK' && testCase.cutoff !== undefined
256
244
  ? { alphaCutoff: testCase.cutoff }
257
245
  : {}),
@@ -274,7 +262,11 @@ async function captureCase(testCase: AlphaCase): Promise<[number, number, number
274
262
  data: { direction: [0, 0, -1], color: [1, 1, 1], intensity: 1, castShadow: false },
275
263
  });
276
264
  world.update().unwrap();
277
- const drawn = renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
265
+ const drawn = renderer.draw({
266
+ leases: [attachment.value],
267
+ camera: { lease: attachment.value },
268
+ environment: { lease: attachment.value },
269
+ });
278
270
  expect(drawn.ok).toBe(true);
279
271
  if (!drawn.ok) throw new Error(`draw failed: ${drawn.error.code}`);
280
272
  await device.queue.onSubmittedWorkDone();
@@ -3,14 +3,20 @@ import { fileURLToPath } from 'node:url';
3
3
  import { describe, expect, it } from 'vitest';
4
4
 
5
5
  type CookedRecord = {
6
- readonly key: string;
7
- readonly bytes: string;
8
- readonly values: unknown;
6
+ readonly specializationKey: string;
7
+ readonly artifactDigest: string;
8
+ readonly artifact: { readonly digest: string; readonly bytes: readonly number[] };
9
9
  readonly resolved?: {
10
10
  readonly values?: unknown;
11
11
  };
12
12
  readonly receipt?: {
13
- readonly layoutIdentity?: string;
13
+ readonly identity?: {
14
+ readonly layoutIdentity?: string;
15
+ readonly programIdentity?: string;
16
+ readonly pipelineIdentity?: string;
17
+ readonly cookIdentity?: string;
18
+ readonly compilerFingerprint?: string;
19
+ };
14
20
  readonly schemaVersion?: string;
15
21
  };
16
22
  };
@@ -41,16 +47,25 @@ describe('custom-shader cooked MaterialAsset fixture', () => {
41
47
  const derived = fixture.assets.find((asset) => asset.payload.role === 'derived');
42
48
  expect(root?.payload.cooked).toBeDefined();
43
49
  expect(derived?.payload.cooked).toBeDefined();
44
- expect(derived?.payload.cooked?.key).toBe(root?.payload.cooked?.key);
45
- expect(derived?.payload.cooked?.bytes).toBe(root?.payload.cooked?.bytes);
46
- expect(derived?.payload.cooked?.values).toEqual(root?.payload.cooked?.values);
50
+ expect(derived?.payload.cooked?.specializationKey).toBe(
51
+ root?.payload.cooked?.specializationKey,
52
+ );
53
+ expect(derived?.payload.cooked?.artifactDigest).toBe(root?.payload.cooked?.artifactDigest);
54
+ expect(derived?.payload.cooked?.artifact.bytes).toEqual(root?.payload.cooked?.artifact.bytes);
55
+ expect(derived?.payload.cooked?.resolved?.values).toEqual(
56
+ root?.payload.cooked?.resolved?.values,
57
+ );
47
58
  });
48
59
 
49
60
  it('keeps cooked layout identity and authored coordinate transforms', () => {
50
61
  const root = fixture.assets.find((asset) => asset.payload.role === 'root');
51
62
  const cooked = root?.payload.cooked;
52
- expect(cooked?.receipt?.schemaVersion).toBe('material-cook/2');
53
- expect(cooked?.receipt?.layoutIdentity).toMatch(/^sha256-/);
63
+ expect(cooked?.receipt?.schemaVersion).toBe('material-cook/3');
64
+ expect(cooked?.receipt?.identity?.layoutIdentity).toMatch(/^sha256-/);
65
+ expect(cooked?.receipt?.identity?.programIdentity).toMatch(/^sha256:/);
66
+ expect(cooked?.receipt?.identity?.pipelineIdentity).toMatch(/^sha256:/);
67
+ expect(cooked?.receipt?.identity?.cookIdentity).toMatch(/^sha256:/);
68
+ expect(cooked?.receipt?.identity?.compilerFingerprint).toMatch(/^sha256-/);
54
69
  expect(cooked?.resolved?.values).toMatchObject({
55
70
  baseColorUvTransform: [0, 0, 1, 1],
56
71
  normalUvTransform: [0.125, 0.25, 2, 2],
@@ -1,26 +1,23 @@
1
- // mesh-update.dawn.test.ts - updateMesh in-place re-upload dawn-tier test
1
+ // mesh-update-dawn.test.ts - updateMesh in-place re-upload dawn-tier test
2
2
  // (feat-20260531-world-space-msdf-text-rendering M3 / w12).
3
3
  //
4
- // Verifies that updateMesh correctly writes same-shape vertex/index data into
5
- // existing GPU buffers, while explicit replaceMesh owns shape changes — all
6
- // without changing the mesh handle id.
4
+ // Verifies that updateMesh correctly writes new vertex/index data into
5
+ // existing GPU buffers and, on expansion, creates new buffers while
6
+ // destroying old ones — all without changing the mesh handle id.
7
7
  //
8
- // AC-08 falsification: if same-shape updateMesh leaked GPU buffers (create
9
- // without destroy), the dawn backend would surface this as resource exhaustion
10
- // or the buffer count would grow across repeated calls. This test validates the
11
- // structural invariants on a real GPU device.
8
+ // AC-08 falsification: if updateMesh leaked GPU buffers (create without
9
+ // destroy), the dawn backend would surface this as resource exhaustion
10
+ // or the buffer count would grow across repeated calls. This test
11
+ // validates the structural invariants on a real GPU device.
12
12
 
13
+ import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
13
14
  import { World } from '@forgeax/engine-ecs';
14
- import {
15
- deriveVertexLayoutProjection,
16
- PROCEDURAL_FLOATS_PER_VERTEX,
17
- } from '@forgeax/engine-geometry';
15
+ import { PROCEDURAL_FLOATS_PER_VERTEX } from '@forgeax/engine-geometry';
18
16
  import { mat4 } from '@forgeax/engine-math';
19
- import { GpuResourceStore } from '@forgeax/engine-render/internal';
20
- import { ok, type RhiDevice } from '@forgeax/engine-rhi';
21
- import { rhi } from '@forgeax/engine-rhi-webgpu';
17
+ import { ok } from '@forgeax/engine-rhi';
22
18
  import type { EquirectAsset, MeshAsset } from '@forgeax/engine-types';
23
19
  import { describe, expect, it } from 'vitest';
20
+ import { GpuResidencyCache } from '../../../../render/src/device/gpu-residency';
24
21
 
25
22
  const mockCaps = {
26
23
  backendKind: 'webgpu' as const,
@@ -44,32 +41,13 @@ const mockCaps = {
44
41
  maxColorAttachments: 8,
45
42
  };
46
43
 
47
- // feat-20260601-gpu-resource-store-extraction M1: mesh GPU residency + updateMesh
44
+ // feat-20260601-device/gpu-residency-extraction M1: mesh GPU residency + updateMesh
48
45
  // moved to the store, and register no longer auto-uploads (push severed). The
49
46
  // pull-model test premise: register the POD, then explicitly
50
47
  // `store.ensureResident(handle, pod)` to upload, then assert + updateMesh.
51
48
 
52
49
  const dawnReady = typeof navigator !== 'undefined' && navigator.gpu !== undefined;
53
50
 
54
- async function requestRhiDevice(): Promise<RhiDevice | undefined> {
55
- const adapterResult = await rhi.requestAdapter();
56
- expect(adapterResult.ok).toBe(true);
57
- if (!adapterResult.ok) return undefined;
58
- const deviceResult = await adapterResult.value.requestDevice();
59
- expect(deviceResult.ok).toBe(true);
60
- if (!deviceResult.ok) return undefined;
61
- return deviceResult.value;
62
- }
63
-
64
- function canonicalAttributes(vertexCount: number): MeshAsset['attributes'] {
65
- return {
66
- position: new Float32Array(vertexCount * 3),
67
- normal: new Float32Array(vertexCount * 3),
68
- uv: new Float32Array(vertexCount * 2),
69
- tangent: new Float32Array(vertexCount * 4),
70
- };
71
- }
72
-
73
51
  function makeSmallMesh(): MeshAsset {
74
52
  const vertices = new Float32Array(4 * PROCEDURAL_FLOATS_PER_VERTEX);
75
53
  const indices = new Uint16Array([0, 1, 2, 0, 2, 3]);
@@ -77,7 +55,7 @@ function makeSmallMesh(): MeshAsset {
77
55
  kind: 'mesh',
78
56
  vertices,
79
57
  indices,
80
- attributes: canonicalAttributes(4),
58
+ attributes: {},
81
59
  aabb: new Float32Array(6),
82
60
  submeshes: [
83
61
  {
@@ -100,7 +78,7 @@ function makeLargerMesh(): MeshAsset {
100
78
  kind: 'mesh',
101
79
  vertices,
102
80
  indices,
103
- attributes: canonicalAttributes(8),
81
+ attributes: {},
104
82
  aabb: new Float32Array(6),
105
83
  submeshes: [
106
84
  {
@@ -120,13 +98,16 @@ describe('w12 - updateMesh dawn-tier (AC-08)', () => {
120
98
  it.skipIf(!dawnReady)(
121
99
  '(a) updateMesh in-place re-upload does not create new vbo/ibo',
122
100
  async () => {
123
- const device = await requestRhiDevice();
124
- if (device === undefined) return;
101
+ const adapter = await navigator.gpu.requestAdapter();
102
+ expect(adapter).not.toBeNull();
103
+ if (adapter === null) return;
104
+ const device = await adapter.requestDevice();
125
105
 
126
- const store = new GpuResourceStore();
106
+ const store = new GpuResidencyCache();
127
107
  const world = new World();
128
108
  store.configureGpuDevice(
129
- device,
109
+ // biome-ignore lint/suspicious/noExplicitAny: structural rhi device shim
110
+ device as any,
130
111
  undefined,
131
112
  (w: World, pod: EquirectAsset) => ok(w.allocSharedRef('EquirectAsset', pod)),
132
113
  mockCaps,
@@ -162,15 +143,18 @@ describe('w12 - updateMesh dawn-tier (AC-08)', () => {
162
143
  );
163
144
 
164
145
  it.skipIf(!dawnReady)(
165
- '(b) shape mismatch is explicit, then replaceMesh rebuilds buffers with same handle id',
146
+ '(b) updateMesh expansion creates new buffers and destroys old ones, same handle id',
166
147
  async () => {
167
- const device = await requestRhiDevice();
168
- if (device === undefined) return;
148
+ const adapter = await navigator.gpu.requestAdapter();
149
+ expect(adapter).not.toBeNull();
150
+ if (adapter === null) return;
151
+ const device = await adapter.requestDevice();
169
152
 
170
- const store = new GpuResourceStore();
153
+ const store = new GpuResidencyCache();
171
154
  const world = new World();
172
155
  store.configureGpuDevice(
173
- device,
156
+ // biome-ignore lint/suspicious/noExplicitAny: structural rhi device shim
157
+ device as any,
174
158
  undefined,
175
159
  (w: World, pod: EquirectAsset) => ok(w.allocSharedRef('EquirectAsset', pod)),
176
160
  mockCaps,
@@ -186,15 +170,10 @@ describe('w12 - updateMesh dawn-tier (AC-08)', () => {
186
170
  const vboBefore = before.vertexBuffer;
187
171
  const iboBefore = before.indexBuffer;
188
172
 
189
- // A shape change must not be silently reinterpreted by updateMesh.
173
+ // Expansion: larger data exceeds current buffer capacity.
190
174
  const larger = makeLargerMesh();
191
175
  if (!(larger.indices instanceof Uint16Array)) return;
192
- const rejected = store.updateMesh(handle, larger.vertices, larger.indices);
193
- expect(rejected.ok).toBe(false);
194
- if (!rejected.ok) expect(rejected.error.code).toBe('mesh-shape-mismatch');
195
-
196
- const replaced = store.replaceMesh(handle, larger.vertices, larger.indices);
197
- expect(replaced.ok).toBe(true);
176
+ store.updateMesh(handle, larger.vertices, larger.indices);
198
177
 
199
178
  const after = store.getMeshGpuHandles(handle);
200
179
  expect(after).toBeDefined();
@@ -213,96 +192,25 @@ describe('w12 - updateMesh dawn-tier (AC-08)', () => {
213
192
  // indexCount should reflect the larger data.
214
193
  expect(after.indexCount).toBe(larger.indices.length);
215
194
 
216
- // The owning World still resolves the same handle after replacement.
217
- const result = world.sharedRefs.resolve<string, MeshAsset>(handle);
195
+ // The handle id is unchanged resolveAssetHandle still returns the payload.
196
+ const result = resolveAssetHandle<MeshAsset>(world, handle);
218
197
  expect(result.ok).toBe(true);
219
198
  },
220
199
  );
221
200
 
222
201
  it.skipIf(!dawnReady)(
223
- '(c) Uint32 + projected skin and multi-UV attributes survive whole and range updates',
224
- async () => {
225
- const device = await requestRhiDevice();
226
- if (device === undefined) return;
227
-
228
- const store = new GpuResourceStore();
229
- const world = new World();
230
- store.configureGpuDevice(
231
- device,
232
- undefined,
233
- (w: World, pod: EquirectAsset) => ok(w.allocSharedRef('EquirectAsset', pod)),
234
- mockCaps,
235
- );
236
-
237
- const vertexCount = 4;
238
- const indices = new Uint32Array([0, 1, 2, 0, 2, 3]);
239
- const attributes: MeshAsset['attributes'] = {
240
- position: new Float32Array(vertexCount * 3),
241
- normal: new Float32Array(vertexCount * 3),
242
- uv: new Float32Array(vertexCount * 2),
243
- tangent: new Float32Array(vertexCount * 4),
244
- skinIndex: new Uint16Array(vertexCount * 4),
245
- skinWeight: new Float32Array(vertexCount * 4),
246
- uv1: new Float32Array(vertexCount * 2),
247
- };
248
- const layoutProjection = deriveVertexLayoutProjection(attributes);
249
- const vertices = new Float32Array(
250
- (vertexCount * layoutProjection.arrayStride) / Float32Array.BYTES_PER_ELEMENT,
251
- );
252
- const mesh: MeshAsset = {
253
- kind: 'mesh',
254
- vertices,
255
- indices,
256
- attributes,
257
- aabb: new Float32Array(6),
258
- submeshes: [
259
- {
260
- indexOffset: 0,
261
- indexCount: indices.length,
262
- vertexCount,
263
- topology: 'triangle-list',
264
- materialSlot: 0,
265
- },
266
- ],
267
- materialSlots: [{ slotName: 'Default' }],
268
- };
269
- const handle = world.allocSharedRef('MeshAsset', mesh);
270
- const resident = store.ensureResident(handle, mesh);
271
- expect(resident.ok).toBe(true);
272
- const before = store.getMeshGpuHandles(handle);
273
- expect(before?.indexFormat).toBe('uint32');
274
- expect(before?.layoutProjection).toEqual(layoutProjection);
275
- expect(before?.layoutProjection.arrayStride).toBe(layoutProjection.arrayStride);
276
- expect(before?.vertexCount).toBe(vertexCount);
277
-
278
- const whole = store.updateMesh(handle, vertices, indices);
279
- expect(whole.ok).toBe(true);
280
- const range = store.updateMeshVertexRange(
281
- handle,
282
- new Float32Array(layoutProjection.arrayStride / Float32Array.BYTES_PER_ELEMENT),
283
- 1,
284
- 1,
285
- );
286
- expect(range.ok).toBe(true);
287
- const after = store.getMeshGpuHandles(handle);
288
- expect(after?.indexFormat).toBe('uint32');
289
- expect(after?.layoutProjection).toEqual(layoutProjection);
290
- expect(after?.layoutProjection.arrayStride).toBe(layoutProjection.arrayStride);
291
- expect(after?.vertexCount).toBe(vertexCount);
292
- expect(after?.indexCount).toBe(indices.length);
293
- },
294
- );
295
-
296
- it.skipIf(!dawnReady)(
297
- '(d) repeated 50-frame same-size updateMesh does not grow GPU buffer count',
202
+ '(c) repeated 50-frame same-size updateMesh does not grow GPU buffer count',
298
203
  async () => {
299
- const device = await requestRhiDevice();
300
- if (device === undefined) return;
204
+ const adapter = await navigator.gpu.requestAdapter();
205
+ expect(adapter).not.toBeNull();
206
+ if (adapter === null) return;
207
+ const device = await adapter.requestDevice();
301
208
 
302
- const store = new GpuResourceStore();
209
+ const store = new GpuResidencyCache();
303
210
  const world = new World();
304
211
  store.configureGpuDevice(
305
- device,
212
+ // biome-ignore lint/suspicious/noExplicitAny: structural rhi device shim
213
+ device as any,
306
214
  undefined,
307
215
  (w: World, pod: EquirectAsset) => ok(w.allocSharedRef('EquirectAsset', pod)),
308
216
  mockCaps,
@@ -11,22 +11,27 @@
11
11
  // correct mid-gray on mip level 1 of a 2x2 -> 1x1 source.
12
12
  //
13
13
  // The 6-fixture coverage promised in plan-tasks T-M3-02 acceptanceCheck:
14
+ // - 1x1 / 2x2 / 256x256 / non-pow2 dimension boundaries -> covered by
15
+ // the pure-formula `numMipLevels` unit tests (T-M3-01 (b) -- the formula
16
+ // SSOT does not need real-GPU verification);
14
17
  // - sRGB / linear physics -> covered by this dawn integration file
15
18
  // (the `*-srgb` view spec path is the only scenario requiring real GPU).
16
19
  //
17
20
  // Red-stage scaffolding: implementation lands in T-M3-04 (mipmap-generator.ts)
18
21
  // + T-M3-05 (uploadTexture call site).
19
22
 
23
+ import { numMipLevels } from '@forgeax/engine-assets-runtime';
20
24
  import { World } from '@forgeax/engine-ecs';
21
- import { GpuResourceStore } from '@forgeax/engine-render/internal';
22
25
  import type { DecodedImage, TextureAsset } from '@forgeax/engine-types';
23
26
  import { describe, expect, it } from 'vitest';
27
+ import { GpuResidencyCache } from '../../../../render/src/device/gpu-residency';
24
28
 
25
- // feat-20260601-gpu-resource-store-extraction M1: uploadTexture moved to the
29
+ // feat-20260601-device/gpu-residency-extraction M1: uploadTexture moved to the
26
30
  // store (POD carries format + mipmap flag, decoded carries pixel bytes; D-2).
27
31
  // These cases wire no GPU device, so the upload short-circuits to ok after the
28
32
  // consistency assertion (the actual mipmap blit needs a wired + prewarmed
29
- // device; that path is exercised by the smoke harness).
33
+ // device; that path is exercised by the smoke harness). numMipLevels assertions
34
+ // are pure-formula and unaffected.
30
35
 
31
36
  function makeTexture(
32
37
  format: GPUTextureFormat,
@@ -77,11 +82,12 @@ describe('T-M3-02 dawn mipmap chain on rgba8unorm-srgb (sRGB physics)', () => {
77
82
  bytes[i * 4 + 2] = 188;
78
83
  bytes[i * 4 + 3] = 255;
79
84
  }
80
- const store = new GpuResourceStore();
85
+ const store = new GpuResidencyCache();
81
86
  const pod = makeTexture('rgba8unorm-srgb', 2, 2, 'srgb', true);
82
87
  const handle = world.allocSharedRef<'TextureAsset', TextureAsset>('TextureAsset', pod);
83
88
  const res = await store.uploadTexture(handle, pod, decoded(bytes, 2, 2, 'srgb', true));
84
89
  expect(res.ok).toBe(true);
90
+ expect(numMipLevels({ width: 2, height: 2 })).toBe(2);
85
91
  });
86
92
  });
87
93
 
@@ -98,17 +104,18 @@ describe('T-M3-02 dawn mipmap chain on rgba8unorm (linear physics)', () => {
98
104
  bytes[i * 4 + 2] = 128;
99
105
  bytes[i * 4 + 3] = 255;
100
106
  }
101
- const store = new GpuResourceStore();
107
+ const store = new GpuResidencyCache();
102
108
  const pod = makeTexture('rgba8unorm', 2, 2, 'linear', true);
103
109
  const handle = world.allocSharedRef<'TextureAsset', TextureAsset>('TextureAsset', pod);
104
110
  const res = await store.uploadTexture(handle, pod, decoded(bytes, 2, 2, 'linear', true));
105
111
  expect(res.ok).toBe(true);
106
112
  });
107
113
 
108
- it('accepts a 256x256 mipmapped texture', async () => {
114
+ it('256x256 mipmap chain produces 9 levels (numMipLevels SSOT)', async () => {
115
+ expect(numMipLevels({ width: 256, height: 256 })).toBe(9);
109
116
  const world = new World();
110
117
  const bytes = new Uint8Array(256 * 256 * 4).fill(128);
111
- const store = new GpuResourceStore();
118
+ const store = new GpuResidencyCache();
112
119
  const pod = makeTexture('rgba8unorm', 256, 256, 'linear', true);
113
120
  const handle = world.allocSharedRef<'TextureAsset', TextureAsset>('TextureAsset', pod);
114
121
  const res = await store.uploadTexture(handle, pod, decoded(bytes, 256, 256, 'linear', true));
@@ -20,18 +20,12 @@
20
20
  import { World } from '@forgeax/engine-ecs';
21
21
  import { createBoxGeometry } from '@forgeax/engine-geometry';
22
22
  import { AssetGuid } from '@forgeax/engine-pack/guid';
23
- import {
24
- Camera,
25
- DirectionalLight,
26
- MeshFilter,
27
- MeshRenderer,
28
- } from '@forgeax/engine-render/internal';
29
- import { createRenderer } from '@forgeax/engine-runtime';
23
+ import { Camera, DirectionalLight, MeshFilter, MeshRenderer } from '@forgeax/engine-render';
30
24
  import { Transform } from '@forgeax/engine-scene';
31
25
  import type { MaterialAsset, MeshAsset, TextureAsset } from '@forgeax/engine-types';
32
26
  import { describe, expect, it } from 'vitest';
27
+ import { constructRuntimeRendererHost } from '../../renderer-host';
33
28
  import { drawPublished } from '../draw-published';
34
- import { createTestRenderAssetStore } from '../helpers/render-asset-port';
35
29
 
36
30
  const WIDTH = 256;
37
31
  const HEIGHT = 256;
@@ -207,25 +201,22 @@ describe('bug-20260522 AC-01 per-entity material texture isolation (dawn)', () =
207
201
  removeEventListener() {},
208
202
  } as unknown as HTMLCanvasElement;
209
203
 
210
- const assetStore = createTestRenderAssetStore();
211
- let renderer: Awaited<ReturnType<typeof createRenderer>>;
204
+ let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
212
205
  try {
213
- renderer = await createRenderer(
206
+ host = await constructRuntimeRendererHost(
214
207
  mockCanvas,
215
208
  {},
216
209
  {
217
210
  shaderManifestUrl: ENGINE_MANIFEST_URL,
218
- assetResolver: assetStore.resolver,
219
211
  },
220
212
  );
221
213
  } finally {
222
214
  globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
223
215
  }
224
- expect(renderer.backend).toBe('webgpu');
225
-
226
- const ready = await renderer.ready;
227
- expect(ready.ok).toBe(true);
228
- if (!ready.ok) return;
216
+ expect(host.ok).toBe(true);
217
+ if (!host.ok) throw host.error;
218
+ const { renderer, assets } = host.value;
219
+ expect(renderer.inspect().state).toBe('alive');
229
220
 
230
221
  const device = sharedDevice;
231
222
  expect(device).toBeDefined();
@@ -239,7 +230,7 @@ describe('bug-20260522 AC-01 per-entity material texture isolation (dawn)', () =
239
230
  // GUID; the extract stage resolves it via assets.lookup(guid) then mints a
240
231
  // user-tier column handle via world.allocSharedRef.
241
232
  const texGreenGuid = AssetGuid.random();
242
- assetStore.resolver.publish(AssetGuid.format(texGreenGuid), makeChequerTexture(0, 200, 0));
233
+ assets.catalog(texGreenGuid, makeChequerTexture(0, 200, 0));
243
234
  const matA = world.allocSharedRef<'MaterialAsset', MaterialAsset>('MaterialAsset', {
244
235
  kind: 'material',
245
236
  passes: [
@@ -421,25 +412,22 @@ describe('bug-20260522 AC-01 per-entity material texture isolation (dawn)', () =
421
412
  removeEventListener() {},
422
413
  } as unknown as HTMLCanvasElement;
423
414
 
424
- const assetStore = createTestRenderAssetStore();
425
- let renderer: Awaited<ReturnType<typeof createRenderer>>;
415
+ let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
426
416
  try {
427
- renderer = await createRenderer(
417
+ host = await constructRuntimeRendererHost(
428
418
  mockCanvas,
429
419
  {},
430
420
  {
431
421
  shaderManifestUrl: ENGINE_MANIFEST_URL,
432
- assetResolver: assetStore.resolver,
433
422
  },
434
423
  );
435
424
  } finally {
436
425
  globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
437
426
  }
438
- expect(renderer.backend).toBe('webgpu');
439
-
440
- const ready = await renderer.ready;
441
- expect(ready.ok).toBe(true);
442
- if (!ready.ok) return;
427
+ expect(host.ok).toBe(true);
428
+ if (!host.ok) throw host.error;
429
+ const { renderer, assets } = host.value;
430
+ expect(renderer.inspect().state).toBe('alive');
443
431
 
444
432
  const device = sharedDevice;
445
433
  expect(device).toBeDefined();
@@ -451,7 +439,7 @@ describe('bug-20260522 AC-01 per-entity material texture isolation (dawn)', () =
451
439
  // texture POD is catalogued (GUID->payload SSOT) and the extract stage
452
440
  // resolves it to a user-tier column handle via world.allocSharedRef.
453
441
  const texGreenGuid2 = AssetGuid.random();
454
- assetStore.resolver.publish(AssetGuid.format(texGreenGuid2), makeChequerTexture(0, 200, 0));
442
+ assets.catalog(texGreenGuid2, makeChequerTexture(0, 200, 0));
455
443
  const matA = world.allocSharedRef<'MaterialAsset', MaterialAsset>('MaterialAsset', {
456
444
  kind: 'material',
457
445
  passes: [