@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
@@ -1,3 +1,5 @@
1
+ import * as SceneOwner from '@forgeax/engine-scene';
2
+
1
3
  // feat-20260707-engine-world-clone-transient-for-editor-ssot M1 / m1t2:
2
4
  // Collect transient skip test (AC-02 + AC-03).
3
5
  //
@@ -9,18 +11,17 @@
9
11
  // AC-03 control: non-transient components (Transform) produce output matching
10
12
  // pre-fix baseline — boolean judgment does not falsely swallow non-transient components.
11
13
 
14
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
12
15
  import { defineComponent, World } from '@forgeax/engine-ecs';
16
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
13
17
  import type { LocalEntityId, SceneAsset, SceneEntity } from '@forgeax/engine-types';
14
18
  import { describe, expect, it } from 'vitest';
15
- import '@forgeax/engine-render/internal';
16
- import '@forgeax/engine-render/internal';
17
- import * as SceneOwner from '@forgeax/engine-scene';
18
19
  import { rootsToSceneAsset } from '../collect-scene-asset';
20
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
19
21
  import { registerSceneComponents } from './helpers/register-scene-components';
20
- import { createTestSceneAssetStore } from './helpers/scene-asset-port';
21
22
 
22
- function makeRegistry() {
23
- return createTestSceneAssetStore();
23
+ function makeRegistry(): AssetRegistry {
24
+ return new AssetRegistry(makeMockShaderRegistry());
24
25
  }
25
26
 
26
27
  function localId(n: number): LocalEntityId {
@@ -29,7 +30,6 @@ function localId(n: number): LocalEntityId {
29
30
 
30
31
  // biome-ignore lint/suspicious/noExplicitAny: branded Handle types differ between allocSharedRef and instantiateScene
31
32
  function registerSceneAsset(world: World, asset: SceneAsset): any {
32
- registerSceneComponents(world);
33
33
  return world.allocSharedRef('SceneAsset', asset);
34
34
  }
35
35
 
@@ -45,13 +45,16 @@ describe('m1t2 — collect transient skip (AC-02 + AC-03)', () => {
45
45
  };
46
46
 
47
47
  const world = new World();
48
+ registerSceneComponents(world);
48
49
  const reg = makeRegistry();
50
+ const sg = AssetGuid.parse('00000000-0000-0000-0000-000000000000');
51
+ if (sg.ok) reg.catalog(sg.value, asset);
49
52
  const handle = registerSceneAsset(world, asset);
50
53
  const res = SceneOwner.worldInstantiateScene(world, handle);
51
54
  expect(res.ok).toBe(true);
52
55
  if (!res.ok) return;
53
56
 
54
- const collected = rootsToSceneAsset(reg.port, world, [res.value.root]);
57
+ const collected = rootsToSceneAsset(reg, world, [res.value.root]);
55
58
  expect(collected.ok).toBe(true);
56
59
  if (!collected.ok) return;
57
60
 
@@ -72,13 +75,16 @@ describe('m1t2 — collect transient skip (AC-02 + AC-03)', () => {
72
75
  };
73
76
 
74
77
  const world = new World();
78
+ registerSceneComponents(world);
75
79
  const reg = makeRegistry();
80
+ const sg = AssetGuid.parse('00000000-0000-0000-0000-000000000000');
81
+ if (sg.ok) reg.catalog(sg.value, asset);
76
82
  const handle = registerSceneAsset(world, asset);
77
83
  const res = SceneOwner.worldInstantiateScene(world, handle);
78
84
  expect(res.ok).toBe(true);
79
85
  if (!res.ok) return;
80
86
 
81
- const collected = rootsToSceneAsset(reg.port, world, [res.value.root]);
87
+ const collected = rootsToSceneAsset(reg, world, [res.value.root]);
82
88
  expect(collected.ok).toBe(true);
83
89
  if (!collected.ok) return;
84
90
 
@@ -113,13 +119,16 @@ describe('m1t2 — collect transient skip (AC-02 + AC-03)', () => {
113
119
  };
114
120
 
115
121
  const world = new World();
122
+ registerSceneComponents(world);
116
123
  const reg = makeRegistry();
124
+ const sg = AssetGuid.parse('00000000-0000-0000-0000-000000000000');
125
+ if (sg.ok) reg.catalog(sg.value, asset);
117
126
  const handle = registerSceneAsset(world, asset);
118
127
  const res = SceneOwner.worldInstantiateScene(world, handle);
119
128
  expect(res.ok).toBe(true);
120
129
  if (!res.ok) return;
121
130
 
122
- const collected = rootsToSceneAsset(reg.port, world, [res.value.root]);
131
+ const collected = rootsToSceneAsset(reg, world, [res.value.root]);
123
132
  expect(collected.ok).toBe(true);
124
133
  if (!collected.ok) return;
125
134
 
@@ -136,7 +145,7 @@ describe('m1t2 — collect transient skip (AC-02 + AC-03)', () => {
136
145
  });
137
146
 
138
147
  it('(d) control: non-transient component appears unchanged in output', () => {
139
- const ctrl = defineComponent('M1T2_Ctrl', { val: 'f32', label: 'string' });
148
+ const Control = defineComponent('M1T2_Ctrl', { val: 'f32', label: 'string' });
140
149
 
141
150
  const asset: SceneAsset = {
142
151
  kind: 'scene',
@@ -144,14 +153,16 @@ describe('m1t2 — collect transient skip (AC-02 + AC-03)', () => {
144
153
  };
145
154
 
146
155
  const world = new World();
147
- registerSceneComponents(world, [ctrl]);
156
+ registerSceneComponents(world, [Control]);
148
157
  const reg = makeRegistry();
158
+ const sg = AssetGuid.parse('00000000-0000-0000-0000-000000000000');
159
+ if (sg.ok) reg.catalog(sg.value, asset);
149
160
  const handle = registerSceneAsset(world, asset);
150
161
  const res = SceneOwner.worldInstantiateScene(world, handle);
151
162
  expect(res.ok).toBe(true);
152
163
  if (!res.ok) return;
153
164
 
154
- const collected = rootsToSceneAsset(reg.port, world, [res.value.root]);
165
+ const collected = rootsToSceneAsset(reg, world, [res.value.root]);
155
166
  expect(collected.ok).toBe(true);
156
167
  if (!collected.ok) return;
157
168
 
@@ -15,12 +15,7 @@
15
15
  // decision §2.6.
16
16
 
17
17
  import type { InputShapeOf, SchemaOf, ShapeOf } from '@forgeax/engine-ecs';
18
- import type {
19
- Camera,
20
- DirectionalLight,
21
- MeshFilter,
22
- MeshRenderer,
23
- } from '@forgeax/engine-render/internal';
18
+ import type { Camera, DirectionalLight, MeshFilter, MeshRenderer } from '@forgeax/engine-render';
24
19
  import type { ChildOf, Transform } from '@forgeax/engine-scene';
25
20
  import type { Handle } from '@forgeax/engine-types';
26
21
  import { describe, expectTypeOf, it } from 'vitest';
@@ -28,6 +28,7 @@
28
28
  // source as ancestorTitles[0]. Top-level imports merged + deduped.
29
29
 
30
30
  import { AnimationPlayer } from '@forgeax/engine-animation';
31
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
31
32
  import {
32
33
  type Component,
33
34
  defineComponent,
@@ -36,16 +37,6 @@ import {
36
37
  World,
37
38
  } from '@forgeax/engine-ecs';
38
39
  import { componentDefinition, componentId, componentSchema } from '@forgeax/engine-ecs/internal';
39
- import {
40
- GlyphText,
41
- SPRITE_PLAYBACK_MODE_CLAMP,
42
- SPRITE_PLAYBACK_MODE_LOOP,
43
- SpriteAnimation,
44
- type SpritePlaybackMode,
45
- SpriteRegionOverride,
46
- spritePlaybackModeFromU32,
47
- Tilemap,
48
- } from '@forgeax/engine-render/authoring';
49
40
  import {
50
41
  ANTIALIAS_NONE,
51
42
  BLOOM_DISABLED,
@@ -53,30 +44,40 @@ import {
53
44
  CAMERA_PROJECTION_PERSPECTIVE,
54
45
  Camera,
55
46
  DirectionalLight,
56
- extractFrame,
57
47
  Layer,
58
48
  MeshFilter,
59
49
  MeshRenderer,
60
50
  orthographic,
61
51
  perspective,
62
- prepareExtractContext,
63
52
  SceneInstance,
64
53
  SKYBOX_MODE_CUBEMAP,
65
54
  SkyboxBackground,
66
55
  type SkyboxMode,
67
56
  SortKey,
68
- skyboxModeFromF32,
69
57
  TONEMAP_NONE,
70
58
  TONEMAP_REINHARD,
71
59
  TONEMAP_REINHARD_EXTENDED,
72
- tonemapFromF32,
73
- } from '@forgeax/engine-render/internal';
60
+ } from '@forgeax/engine-render';
61
+ import {
62
+ GlyphText,
63
+ SpriteAnimation,
64
+ SpriteRegionOverride,
65
+ Tilemap,
66
+ } from '@forgeax/engine-render/authoring';
74
67
  import * as SceneOwner from '@forgeax/engine-scene';
75
68
  import { ChildOf, Children, propagateTransforms, Transform } from '@forgeax/engine-scene';
76
69
  import type { Handle, LocalEntityId, SceneAsset, SceneEntity } from '@forgeax/engine-types';
77
70
  import { toShared } from '@forgeax/engine-types';
78
71
  import { describe, expect, expectTypeOf, it } from 'vitest';
79
- import { createTestRenderAssetOwner } from './helpers/render-asset-port';
72
+ import { tonemapFromF32 } from '../../../render/src/components/camera';
73
+ import { skyboxModeFromF32 } from '../../../render/src/components/skybox-background';
74
+ import {
75
+ SPRITE_PLAYBACK_MODE_CLAMP,
76
+ SPRITE_PLAYBACK_MODE_LOOP,
77
+ type SpritePlaybackMode,
78
+ spritePlaybackModeFromU32,
79
+ } from '../../../render/src/components/sprite-playback-mode';
80
+ import { extractFrame, prepareExtractContext } from '../../../render/src/render-system-extract';
80
81
 
81
82
  {
82
83
  // --- from children.test.ts ---
@@ -2456,7 +2457,7 @@ import { createTestRenderAssetOwner } from './helpers/render-asset-port';
2456
2457
  describe('render-system-extract count-mismatch (w12, AC-05 a)', () => {
2457
2458
  it('single mesh single material: extract succeeds', () => {
2458
2459
  const world = new World();
2459
- const assets = createTestRenderAssetOwner(
2460
+ const assets = new AssetRegistry(
2460
2461
  // biome-ignore lint/suspicious/noExplicitAny: mock ShaderRegistry
2461
2462
  { findMaterialArtifact: () => ({ ok: false }) } as any,
2462
2463
  );
@@ -2501,7 +2502,7 @@ import { createTestRenderAssetOwner } from './helpers/render-asset-port';
2501
2502
  it('materials: [] with submeshes: [1] routes through D-Q7 case B mid-grey default (preserves legacy single-mesh-no-material path)', () => {
2502
2503
  const world = new World();
2503
2504
 
2504
- const assets = createTestRenderAssetOwner(
2505
+ const assets = new AssetRegistry(
2505
2506
  // biome-ignore lint/suspicious/noExplicitAny: mock ShaderRegistry
2506
2507
  { findMaterialArtifact: () => ({ ok: false }) } as any,
2507
2508
  );
@@ -2541,7 +2542,7 @@ import { createTestRenderAssetOwner } from './helpers/render-asset-port';
2541
2542
  it('materials overflow emits a diagnostic and ignores the extra override', () => {
2542
2543
  const world = new World();
2543
2544
 
2544
- const assets = createTestRenderAssetOwner(
2545
+ const assets = new AssetRegistry(
2545
2546
  // biome-ignore lint/suspicious/noExplicitAny: mock ShaderRegistry
2546
2547
  { findMaterialArtifact: () => ({ ok: false }) } as any,
2547
2548
  );
@@ -8,7 +8,7 @@
8
8
  // world it resolves against, so both defects are invisible there).
9
9
  //
10
10
  // The editor drives:
11
- // renderer.draw([editorWorld, sceneWorld], { cameraOwner: 0, resourceOwner: 1 })
11
+ // renderer.draw({ leases, camera: { lease: editorLease }, environment: { lease: sceneLease } })
12
12
  // - camera + gizmo (user-tier) meshes live in editorWorld (index 0)
13
13
  // - skybox (equirect->cube) + geometry live in sceneWorld (index 1)
14
14
  //
@@ -29,8 +29,8 @@
29
29
  // composite frames, (b) the composited frame is neither empty nor uniformly
30
30
  // black (skybox sky + lit geometry both reach the swap-chain).
31
31
 
32
+ import { HANDLE_CUBE } from '@forgeax/engine-assets-runtime';
32
33
  import { World } from '@forgeax/engine-ecs';
33
- import { createPrimitiveMesh } from '@forgeax/engine-geometry';
34
34
  import { halfFloat } from '@forgeax/engine-math';
35
35
  import {
36
36
  Camera,
@@ -41,14 +41,14 @@ import {
41
41
  SkyboxBackground,
42
42
  Skylight,
43
43
  TONEMAP_REINHARD_EXTENDED,
44
- } from '@forgeax/engine-render/internal';
44
+ } from '@forgeax/engine-render';
45
45
  import { Transform } from '@forgeax/engine-scene';
46
46
  import type { EquirectAsset, Handle, MaterialAsset, MeshAsset } from '@forgeax/engine-types';
47
47
  import { afterEach, describe, expect, it } from 'vitest';
48
48
  import { page } from 'vitest/browser';
49
- import { Engine } from '../index';
49
+ import { constructRuntimeRendererHost } from '../renderer-host';
50
50
 
51
- type EngineRenderer = Awaited<ReturnType<typeof Engine.create>>;
51
+ type EngineRenderer = import('@forgeax/engine-render').Renderer;
52
52
 
53
53
  // Suppress the known chromium teardown race (device GC'd while a shader
54
54
  // getCompilationInfo is in flight) — same guard the 9-light browser test uses.
@@ -121,11 +121,10 @@ function litBox(
121
121
  ],
122
122
  values: { baseColor: [color[0], color[1], color[2]], metallic: 0, roughness: 0.5 },
123
123
  });
124
- const cubeHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
125
124
  world
126
125
  .spawn(
127
126
  { component: Transform, data: { pos: [x, y, 0], scale: [1.2, 1.2, 1.2] } },
128
- { component: MeshFilter, data: { assetHandle: cubeHandle } },
127
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
129
128
  { component: MeshRenderer, data: { materials: [matHandle] } },
130
129
  )
131
130
  .unwrap();
@@ -159,7 +158,7 @@ async function decodePngBase64(b64: string): Promise<Uint8Array> {
159
158
 
160
159
  // Compositor-independent readback: drive N frames, then capture the actual
161
160
  // presented canvas via the CDP-backed page.screenshot (locator scoped to the
162
- // canvas). The createImageBitmap(canvas) path (renderer.readPixels) depends on
161
+ // canvas). The createImageBitmap(canvas) path is owned by this test harness and depends on
163
162
  // the chromium compositor having consumed the WebGPU swap-chain before the
164
163
  // bounce, which is unreliable headless/local (documented in
165
164
  // light-casters-9-light.browser.test.ts). The screenshot path reads the
@@ -167,15 +166,26 @@ async function decodePngBase64(b64: string): Promise<Uint8Array> {
167
166
  async function readbackAfterComposite(
168
167
  renderer: EngineRenderer,
169
168
  worlds: World[],
169
+ canvas: HTMLCanvasElement,
170
170
  canvasId: string,
171
171
  ): Promise<Uint8Array> {
172
- for (const world of worlds) {
173
- const attached = renderer.attachWorld(world);
172
+ const leases = worlds.map((world) => {
173
+ const attached = renderer.attach(world);
174
174
  if (!attached.ok) throw attached.error;
175
- }
175
+ return attached.value;
176
+ });
176
177
  for (let i = 0; i < FRAMES; i++) {
177
178
  for (const world of worlds) world.update(1 / 60).unwrap();
178
- const r = renderer.draw(worlds, { cameraOwner: 0, resourceOwner: 1 });
179
+ const cameraLease = leases[0];
180
+ const environmentLease = leases[1];
181
+ if (cameraLease === undefined || environmentLease === undefined) {
182
+ throw new Error('composite frame requires camera and environment leases');
183
+ }
184
+ const r = renderer.draw({
185
+ leases,
186
+ camera: { lease: cameraLease },
187
+ environment: { lease: environmentLease },
188
+ });
179
189
  if (!r.ok) throw new Error(`renderer.draw frame ${i} failed: ${r.error.code}`);
180
190
  await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));
181
191
  }
@@ -194,9 +204,17 @@ async function readbackAfterComposite(
194
204
  } catch {
195
205
  // Fallback: createImageBitmap(canvas) bounce (may read all-zero if the
196
206
  // compositor has not consumed the swap-chain — handled by the alpha gate).
197
- const r = await renderer.readPixels();
198
- if (!r.ok) throw new Error(`readPixels fallback failed: ${r.error.code}`);
199
- return r.value;
207
+ const bitmap = await createImageBitmap(canvas);
208
+ const offscreen = new OffscreenCanvas(bitmap.width, bitmap.height);
209
+ const context = offscreen.getContext('2d', { willReadFrequently: true });
210
+ if (context === null) {
211
+ bitmap.close();
212
+ throw new Error('OffscreenCanvas 2D context unavailable for canvas readback');
213
+ }
214
+ context.drawImage(bitmap, 0, 0);
215
+ const image = context.getImageData(0, 0, bitmap.width, bitmap.height);
216
+ bitmap.close();
217
+ return new Uint8Array(image.data.buffer, image.data.byteOffset, image.data.byteLength);
200
218
  }
201
219
  }
202
220
 
@@ -249,19 +267,28 @@ describe.skipIf(!browserReady)('composite + skybox + cross-world mesh (ENGINE-fi
249
267
  canvas.style.display = 'block';
250
268
  document.body.appendChild(canvas);
251
269
 
252
- renderer = await Engine.create(canvas, {}, { shaderManifestUrl: '/shaders/manifest.json' });
253
- expect(renderer.backend).toBe('webgpu');
254
- const ready = await renderer.ready;
255
- expect(ready.ok).toBe(true);
270
+ const host = await constructRuntimeRendererHost(
271
+ canvas,
272
+ {},
273
+ {
274
+ shaderManifestUrl: '/shaders/manifest.json',
275
+ },
276
+ );
277
+ expect(host.ok).toBe(true);
278
+ if (!host.ok) throw host.error;
279
+ renderer = host.value.renderer;
280
+ expect(renderer.inspect().state).toBe('alive');
256
281
 
257
282
  const diagnostics: Diag[] = [];
258
- renderer.onError((e) =>
283
+ renderer.subscribe((event) => {
284
+ if (event.kind !== 'error') return;
285
+ const error = event.error;
259
286
  diagnostics.push({
260
- code: e.code,
261
- hint: e.hint,
262
- detail: (e as unknown as { detail?: unknown }).detail,
263
- }),
264
- );
287
+ code: error.code,
288
+ hint: error.hint,
289
+ detail: (error as unknown as { detail?: unknown }).detail,
290
+ });
291
+ });
265
292
 
266
293
  // editorWorld (cameraOwner, index 0): camera + directional light + one
267
294
  // user-tier gizmo mesh. NO skybox, NO scene geometry.
@@ -329,7 +356,12 @@ describe.skipIf(!browserReady)('composite + skybox + cross-world mesh (ENGINE-fi
329
356
  litBox(sceneWorld, [0.15, 0.8, 0.2, 1], 0, 0);
330
357
  litBox(sceneWorld, [0.85, 0.15, 0.15, 1], 1.8, 0);
331
358
 
332
- const pixels = await readbackAfterComposite(renderer, [editorWorld, sceneWorld], canvas.id);
359
+ const pixels = await readbackAfterComposite(
360
+ renderer,
361
+ [editorWorld, sceneWorld],
362
+ canvas,
363
+ canvas.id,
364
+ );
333
365
  // The screenshot path returns the canvas element's composited surface
334
366
  // (clipped to its layout box, so its size is source-dependent); the
335
367
  // fallback createImageBitmap path returns exactly CANVAS_W*CANVAS_H*4.
@@ -350,7 +382,7 @@ describe.skipIf(!browserReady)('composite + skybox + cross-world mesh (ENGINE-fi
350
382
  // against the world it was extracted from. A cross-world resolution
351
383
  // surfaces one of two signatures depending on whether the foreign slot
352
384
  // is vacant or occupied in the (wrong) resource-owner world:
353
- // - vacant foreign slot -> shared-ref lookup miss -> `asset-not-registered`
385
+ // - vacant slot -> resolveAssetHandle miss -> `asset-not-registered`
354
386
  // - occupied slot -> wrong-kind payload (here the sceneWorld equirect
355
387
  // shares the gizmo's user-tier slot) -> ensureResident has no arm
356
388
  // for kind:'equirect' -> undefined -> `residentRes.ok` throws ->
@@ -0,0 +1,139 @@
1
+ import { numMipLevels } from '@forgeax/engine-assets-runtime';
2
+ import { ok, type RhiCaps } from '@forgeax/engine-rhi';
3
+ import type { TextureAsset } from '@forgeax/engine-types';
4
+ import { toShared } from '@forgeax/engine-types';
5
+ import { describe, expect, it } from 'vitest';
6
+ import { GpuResidencyCache } from '../../../render/src/device/gpu-residency';
7
+ import { deriveMipUploadLayout } from '../../../render/src/render-data';
8
+
9
+ type TextureCall = { readonly size: { readonly width: number; readonly height: number } };
10
+ type WriteCall = {
11
+ readonly data: Uint8Array;
12
+ readonly layout: { readonly bytesPerRow: number; readonly rowsPerImage: number };
13
+ readonly size: { readonly width: number; readonly height: number };
14
+ };
15
+
16
+ const caps: RhiCaps = {
17
+ backendKind: 'webgpu',
18
+ compute: true,
19
+ timestampQuery: false,
20
+ timestampPeriodNanoseconds: null,
21
+ indirectDrawing: false,
22
+ textureCompressionBc: true,
23
+ textureCompressionEtc2: false,
24
+ textureCompressionAstc: false,
25
+ multiDrawIndirect: false,
26
+ pushConstants: false,
27
+ textureBindingArray: false,
28
+ samplerAliasing: false,
29
+ firstInstanceIndirect: false,
30
+ storageBuffer: true,
31
+ storageTexture: false,
32
+ rgba16floatRenderable: true,
33
+ rg11b10ufloatRenderable: false,
34
+ float32Filterable: false,
35
+ maxColorAttachments: 8,
36
+ };
37
+
38
+ function makeStore(calls: { create: TextureCall[]; writes: WriteCall[] }): GpuResidencyCache {
39
+ const store = new GpuResidencyCache();
40
+ const texture = { tag: 'texture' };
41
+ store.configureGpuDevice(
42
+ {
43
+ limits: { maxTextureDimension2D: 16384 },
44
+ createTexture: (descriptor: TextureCall) => {
45
+ calls.create.push(descriptor);
46
+ return ok(texture);
47
+ },
48
+ createTextureView: () => ok({ tag: 'view' }),
49
+ destroyTexture: () => ok(undefined),
50
+ queue: {
51
+ writeTexture: (
52
+ _dst: unknown,
53
+ data: Uint8Array,
54
+ layout: WriteCall['layout'],
55
+ size: WriteCall['size'],
56
+ ) => {
57
+ calls.writes.push({ data, layout, size });
58
+ return ok(undefined);
59
+ },
60
+ submit: () => ok(undefined),
61
+ },
62
+ } as never,
63
+ undefined,
64
+ (() => ok(toShared<'EquirectAsset'>(1))) as never,
65
+ caps,
66
+ );
67
+ return store;
68
+ }
69
+
70
+ function compressedPod(): TextureAsset {
71
+ const layout = deriveMipUploadLayout(
72
+ 'bc7-rgba-unorm',
73
+ 2085,
74
+ 1573,
75
+ numMipLevels({ width: 2085, height: 1573 }),
76
+ );
77
+ const bytes = new Uint8Array(layout.reduce((total, level) => total + level.byteLength, 0));
78
+ for (const level of layout)
79
+ bytes.fill(level.level + 1, level.byteOffset, level.byteOffset + level.byteLength);
80
+ return {
81
+ kind: 'texture',
82
+ width: 2085,
83
+ height: 1573,
84
+ format: 'bc7-rgba-unorm',
85
+ data: bytes,
86
+ colorSpace: 'linear',
87
+ mipmap: true,
88
+ mipLevelCount: layout.length,
89
+ };
90
+ }
91
+
92
+ describe('compressed texture physical extent recorded-RHI witness [w36]', () => {
93
+ it('allocates and uploads BC7 physical extents while preserving logical asset metadata', () => {
94
+ const calls = { create: [] as TextureCall[], writes: [] as WriteCall[] };
95
+ const pod = compressedPod();
96
+ const expected = deriveMipUploadLayout(pod.format, pod.width, pod.height, numMipLevels(pod));
97
+
98
+ const result = makeStore(calls).ensureResident(toShared<'TextureAsset'>(36), pod);
99
+ if (!result.ok) throw result.error;
100
+
101
+ expect(pod.width).toBe(2085);
102
+ expect(pod.height).toBe(1573);
103
+ expect(calls.create).toHaveLength(1);
104
+ expect(calls.create[0]?.size).toMatchObject({ width: 2088, height: 1576 });
105
+ expect(calls.writes).toHaveLength(expected.length);
106
+ for (const [index, level] of expected.entries()) {
107
+ const write = calls.writes[index];
108
+ expect(write?.size).toMatchObject({
109
+ width: level.physicalWidth,
110
+ height: level.physicalHeight,
111
+ });
112
+ expect(write?.layout).toMatchObject({
113
+ bytesPerRow: level.bytesPerRow,
114
+ rowsPerImage: level.rowsPerImage,
115
+ });
116
+ expect(write?.data.byteLength).toBe(level.byteLength);
117
+ expect(write?.data[0]).toBe(level.level + 1);
118
+ }
119
+ });
120
+
121
+ it('keeps the uncompressed allocation and upload extent logical', () => {
122
+ const calls = { create: [] as TextureCall[], writes: [] as WriteCall[] };
123
+ const pod: TextureAsset = {
124
+ kind: 'texture',
125
+ width: 17,
126
+ height: 9,
127
+ format: 'rgba8unorm',
128
+ data: new Uint8Array(17 * 9 * 4),
129
+ colorSpace: 'linear',
130
+ mipmap: false,
131
+ };
132
+
133
+ expect(makeStore(calls).ensureResident(toShared<'TextureAsset'>(37), pod).ok).toBe(true);
134
+
135
+ expect(calls.create[0]?.size).toMatchObject({ width: 17, height: 9 });
136
+ expect(calls.writes[0]?.size).toMatchObject({ width: 17, height: 9 });
137
+ expect(calls.writes[0]?.layout).toMatchObject({ bytesPerRow: 68, rowsPerImage: 9 });
138
+ });
139
+ });
@@ -1,42 +1,55 @@
1
+ import { World } from '@forgeax/engine-ecs';
2
+ import type { Renderer } from '@forgeax/engine-render';
1
3
  import { rhi } from '@forgeax/engine-rhi-null';
2
4
  import { describe, expect, it } from 'vitest';
5
+ import { constructRendererHost } from '../../../render/src/construct-renderer';
3
6
  import { createRenderer } from '../createRenderer';
4
7
  import { EngineEnvironmentError } from '../errors/environment';
5
8
 
6
9
  function canvas(): HTMLCanvasElement {
7
- return {
8
- width: 64,
9
- height: 64,
10
- getContext: () => null,
11
- addEventListener: () => undefined,
12
- removeEventListener: () => undefined,
13
- } as unknown as HTMLCanvasElement;
10
+ return { width: 64, height: 64, getContext: () => null } as unknown as HTMLCanvasElement;
14
11
  }
15
12
 
16
- const manifest = `data:application/json,${encodeURIComponent(
17
- JSON.stringify({
18
- schemaVersion: '1.0.0',
19
- entries: [
20
- { hash: 'pbr00000', wgsl: '/* pbr stub */', glsl: '', bindings: '' },
21
- { hash: 'unlit000', wgsl: '/* unlit stub */', glsl: '', bindings: '' },
22
- { hash: 'tonemap0', wgsl: '/* tonemap stub */', glsl: '', bindings: '' },
23
- ],
24
- }),
25
- )}`;
13
+ const manifest = `data:application/json,${encodeURIComponent(JSON.stringify({ schemaVersion: '1.0.0', entries: [] }))}`;
26
14
 
27
- describe('runtime assembly contract', () => {
28
- it('resolves a renderer and exposes Result lifecycle methods', async () => {
29
- const renderer = await createRenderer(canvas(), { rhi }, { shaderManifestUrl: manifest });
30
- const ready = await renderer.ready;
31
- expect(ready.ok).toBe(true);
32
- expect(renderer.draw([], { cameraOwner: 0, resourceOwner: 0 }).ok).toBe(true);
33
- renderer.dispose();
34
- expect(renderer.draw([], { cameraOwner: 0, resourceOwner: 0 }).ok).toBe(false);
15
+ function frameRequest(lease: Parameters<Renderer['draw']>[0]['leases'][number]) {
16
+ return { leases: [lease], camera: { lease }, environment: { lease } };
17
+ }
18
+
19
+ describe('runtime renderer host assembly', () => {
20
+ it('returns assets beside the lease-only Renderer surface', async () => {
21
+ const host = await constructRendererHost(canvas(), { rhi }, { shaderManifestUrl: manifest });
22
+ expect(host.ok).toBe(true);
23
+ if (!host.ok) return;
24
+ expect(host.value.assets.inspect()).toBeDefined();
25
+ const world = new World();
26
+ const attached = host.value.renderer.attach(world);
27
+ expect(attached.ok).toBe(true);
28
+ if (!attached.ok) return;
29
+ expect(world.update().ok).toBe(true);
30
+ const frame = host.value.renderer.draw(frameRequest(attached.value));
31
+ expect(frame.ok).toBe(true);
32
+ if (frame.ok) {
33
+ const observed = await host.value.renderer.observe(frame.value, { include: ['timings'] });
34
+ expect(observed.ok).toBe(true);
35
+ }
36
+ host.value.renderer.dispose();
35
37
  });
36
38
 
37
- it('preserves structured environment rejection when no backend is available', async () => {
38
- await expect(createRenderer(canvas(), { rhi: undefined })).rejects.toBeInstanceOf(
39
- EngineEnvironmentError,
40
- );
39
+ it('keeps runtime construction errors structured', async () => {
40
+ const result = await createRenderer(canvas(), { rhi: undefined });
41
+ expect(result.ok).toBe(false);
42
+ if (!result.ok) expect(result.error).toBeInstanceOf(EngineEnvironmentError);
43
+ });
44
+
45
+ it('does not add removed backend or readiness properties', async () => {
46
+ const result = await createRenderer(canvas(), { rhi }, { shaderManifestUrl: manifest });
47
+ expect(result.ok).toBe(true);
48
+ if (!result.ok) return;
49
+ const renderer = result.value;
50
+ expect(renderer).not.toHaveProperty('backend');
51
+ expect(renderer).not.toHaveProperty('ready');
52
+ expect(renderer).not.toHaveProperty('assets');
53
+ renderer.dispose();
41
54
  });
42
55
  });