@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
@@ -0,0 +1,395 @@
1
+ // w16 — Integration: 4-path compressed-fixture loading (AC-02)
2
+ //
3
+ // Validates that all 4 binary loading paths (texture, equirect, font, mesh)
4
+ // work with compressed assets. The loaders mechanically pass
5
+ // `entry.compression` to fetchBinary; the decompression gate inside
6
+ // fetchBinary handles the rest. Zero loader-side logic rewrite.
7
+ //
8
+ // This test is TDD-RED before w19 — fetchBinary currently has no
9
+ // decompression gate, so loading compressed assets fails.
10
+ //
11
+ // Plan decisions:
12
+ // AC-02: 4 paths through fetchBinary
13
+ // D-2: pass entry.compression value, not entire entry
14
+ // E9: mesh inline (import-runner.ts:422-427) excluded — not in scope
15
+ // D-10: all fixture data programmatic
16
+
17
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
18
+ import { packMeshBinV4 } from '@forgeax/engine-import';
19
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
20
+ import type { MeshAsset } from '@forgeax/engine-types';
21
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
22
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
23
+
24
+ const GUID_MESH = 'c0000000-0000-4000-a000-00006d657368';
25
+ const GUID_TEX = 'c0000000-0000-4000-a000-000074657874';
26
+ const GUID_EQUI = 'c0000000-0000-4000-a000-000065717569';
27
+ const GUID_FONT = 'c0000000-0000-4000-a000-0000666f6e74';
28
+
29
+ const PACK_INDEX_URL = '/test-four-path-pack-index.json';
30
+
31
+ function parseGuid(g: string): AssetGuid {
32
+ const parsed = AssetGuid.parse(g);
33
+ if (!parsed.ok) throw new Error(`bad guid ${g}`);
34
+ return parsed.value;
35
+ }
36
+
37
+ /**
38
+ * Minimal synthetic mesh bin payload — v2 header, 3 vertices of 12 floats,
39
+ * Uint16 indices, JSON submesh + aabb tail. Compatible with unpackMeshBin.
40
+ */
41
+ function makeMeshBinPayload(): Uint8Array {
42
+ const vertices = new Float32Array(36);
43
+ for (let i = 0; i < 3; i++) {
44
+ const b = i * 12;
45
+ vertices[b + 0] = i * 1;
46
+ vertices[b + 1] = 0;
47
+ vertices[b + 2] = 0;
48
+ vertices[b + 3] = 0;
49
+ vertices[b + 4] = 1;
50
+ vertices[b + 5] = 0;
51
+ vertices[b + 6] = 0;
52
+ vertices[b + 7] = 0;
53
+ vertices[b + 8] = 1;
54
+ vertices[b + 9] = 0;
55
+ vertices[b + 10] = 0;
56
+ vertices[b + 11] = 1;
57
+ }
58
+ const indices = new Uint16Array([0, 1, 2]);
59
+
60
+ const packed = packMeshBinV4(
61
+ {
62
+ vertices,
63
+ indices,
64
+ attributes: {
65
+ position: new Float32Array(9),
66
+ normal: new Float32Array(9),
67
+ uv: new Float32Array(6),
68
+ tangent: new Float32Array(12),
69
+ },
70
+ submeshes: [
71
+ {
72
+ indexOffset: 0,
73
+ indexCount: 3,
74
+ vertexCount: 3,
75
+ topology: 'triangle-list',
76
+ materialSlot: 0,
77
+ },
78
+ ],
79
+ aabb: new Float32Array([0, 0, 0, 1, 1, 1]),
80
+ },
81
+ 'runtime://four-path',
82
+ );
83
+ if (!packed.ok) throw new Error(packed.error.actual);
84
+ return packed.value;
85
+ }
86
+
87
+ let originalFetch: typeof globalThis.fetch;
88
+
89
+ describe('w16: 4-path compressed-fixture loading', () => {
90
+ beforeEach(() => {
91
+ originalFetch = globalThis.fetch;
92
+ });
93
+
94
+ afterEach(() => {
95
+ globalThis.fetch = originalFetch;
96
+ });
97
+
98
+ /**
99
+ * Path 1: mesh loadByGuidProd loads compressed mesh .bin → MeshAsset POD
100
+ *
101
+ * TDD-RED: Before w19, fetchBinary does not decompress — the zstd bytes
102
+ * reach unpackMeshBin → version check reads random bytes → returns undefined
103
+ * → asset-parse-failed. After w19, the decompression gate decompresses
104
+ * first → unpackMeshBin sees original v2 header → succeeds.
105
+ */
106
+ it('path 1: mesh loadByGuid loads compressed mesh .bin → MeshAsset', async () => {
107
+ const original = makeMeshBinPayload();
108
+ const { compressZstd } = await import('@forgeax/engine-codec/encode');
109
+ const compRes = await compressZstd(original);
110
+ if (!compRes.ok) throw new Error('compressZstd failed');
111
+
112
+ globalThis.fetch = vi.fn().mockImplementation((input: string) => {
113
+ const url = typeof input === 'string' ? input : String(input);
114
+ if (url === PACK_INDEX_URL) {
115
+ return Promise.resolve({
116
+ ok: true,
117
+ json: () =>
118
+ Promise.resolve([
119
+ {
120
+ guid: GUID_MESH,
121
+ packageUrl: `/ddc/${GUID_MESH}.pack.json`,
122
+ kind: 'mesh',
123
+ },
124
+ ]),
125
+ });
126
+ }
127
+ if (url === `/ddc/${GUID_MESH}.pack.json`) {
128
+ return Promise.resolve({
129
+ ok: true,
130
+ json: () =>
131
+ Promise.resolve({
132
+ schemaVersion: '2.0.0',
133
+ kind: 'internal-text-package',
134
+ assets: [
135
+ {
136
+ guid: GUID_MESH,
137
+ kind: 'mesh',
138
+ payload: {},
139
+ refs: [],
140
+ artifacts: {
141
+ body: {
142
+ path: `${GUID_MESH}.bin`,
143
+ mediaType: 'application/x-forgeax-mesh',
144
+ contentEncoding: 'zstd',
145
+ },
146
+ },
147
+ },
148
+ ],
149
+ }),
150
+ });
151
+ }
152
+ return Promise.resolve({
153
+ ok: true,
154
+ arrayBuffer: () => Promise.resolve(compRes.value.buffer),
155
+ });
156
+ }) as typeof globalThis.fetch;
157
+
158
+ const reg = new AssetRegistry(makeMockShaderRegistry());
159
+ reg.configurePackIndex(PACK_INDEX_URL);
160
+
161
+ const result = await reg.loadByGuid<MeshAsset>(parseGuid(GUID_MESH));
162
+
163
+ // TDD-RED: after w19, this becomes true
164
+ expect(result.ok).toBe(true);
165
+ if (result.ok) {
166
+ expect(result.value.kind).toBe('mesh');
167
+ expect(result.value.indices).toBeDefined();
168
+ expect((result.value.indices as Uint16Array).length).toBe(3);
169
+ }
170
+ });
171
+
172
+ /**
173
+ * Path 2: textureLoader loads compressed texture .bin → TextureAsset
174
+ *
175
+ * TDD-RED: same issue — the compressed bytes reach the texture loader's
176
+ * data field, get uploaded to GPU as corrupt texture. After w19,
177
+ * fetchBinary decompresses first → loader sees raw RGBA bytes.
178
+ *
179
+ * For the TDD stage we construct a simple RGBA pixel payload (4 bytes)
180
+ * so the loader can still produce a texture asset (shape test).
181
+ */
182
+ it('path 2: textureLoader loads compressed texture .bin → TextureAsset', async () => {
183
+ // 4x4 RGBA8 texture = 64 bytes raw pixel data
184
+ const rawPixels = new Uint8Array(64);
185
+ for (let i = 0; i < 64; i++) {
186
+ rawPixels[i] = (i * 17) % 256;
187
+ }
188
+ const { compressZstd } = await import('@forgeax/engine-codec/encode');
189
+ const compRes = await compressZstd(rawPixels);
190
+ if (!compRes.ok) throw new Error('compressZstd failed');
191
+
192
+ globalThis.fetch = vi.fn().mockImplementation((input: string) => {
193
+ const url = typeof input === 'string' ? input : String(input);
194
+ if (url === PACK_INDEX_URL) {
195
+ return Promise.resolve({
196
+ ok: true,
197
+ json: () =>
198
+ Promise.resolve([
199
+ {
200
+ guid: GUID_TEX,
201
+ packageUrl: `/ddc/${GUID_TEX}.pack.json`,
202
+ kind: 'texture',
203
+ },
204
+ ]),
205
+ });
206
+ }
207
+ if (url === `/ddc/${GUID_TEX}.pack.json`) {
208
+ return Promise.resolve({
209
+ ok: true,
210
+ json: () =>
211
+ Promise.resolve({
212
+ schemaVersion: '2.0.0',
213
+ kind: 'internal-text-package',
214
+ assets: [
215
+ {
216
+ guid: GUID_TEX,
217
+ kind: 'texture',
218
+ payload: {
219
+ width: 4,
220
+ height: 4,
221
+ format: 'rgba8unorm',
222
+ colorSpace: 'srgb',
223
+ },
224
+ refs: [],
225
+ artifacts: {
226
+ body: {
227
+ path: `${GUID_TEX}.bin`,
228
+ mediaType: 'application/x-forgeax-rgba8',
229
+ contentEncoding: 'zstd',
230
+ },
231
+ },
232
+ },
233
+ ],
234
+ }),
235
+ });
236
+ }
237
+ return Promise.resolve({
238
+ ok: true,
239
+ arrayBuffer: () => Promise.resolve(compRes.value.buffer),
240
+ });
241
+ }) as typeof globalThis.fetch;
242
+
243
+ const reg = new AssetRegistry(makeMockShaderRegistry());
244
+ reg.configurePackIndex(PACK_INDEX_URL);
245
+
246
+ const result = await reg.loadByGuid(parseGuid(GUID_TEX));
247
+ // TDD-RED: after w19 this becomes true — the decompressed bytes
248
+ // produce a valid 64-byte data field.
249
+ expect(result.ok).toBe(true);
250
+ });
251
+
252
+ /**
253
+ * Path 3: equirectLoader loads compressed equirect .bin → TextureAsset
254
+ * Same shape as textureLoader.
255
+ */
256
+ it('path 3: equirectLoader loads compressed equirect .bin', async () => {
257
+ const rawPixels = new Uint8Array(64);
258
+ for (let i = 0; i < 64; i++) {
259
+ rawPixels[i] = (i * 17) % 256;
260
+ }
261
+ const { compressZstd } = await import('@forgeax/engine-codec/encode');
262
+ const compRes = await compressZstd(rawPixels);
263
+ if (!compRes.ok) throw new Error('compressZstd failed');
264
+
265
+ globalThis.fetch = vi.fn().mockImplementation((input: string) => {
266
+ const url = typeof input === 'string' ? input : String(input);
267
+ if (url === PACK_INDEX_URL) {
268
+ return Promise.resolve({
269
+ ok: true,
270
+ json: () =>
271
+ Promise.resolve([
272
+ {
273
+ guid: GUID_EQUI,
274
+ packageUrl: `/ddc/${GUID_EQUI}.pack.json`,
275
+ kind: 'equirect',
276
+ },
277
+ ]),
278
+ });
279
+ }
280
+ if (url === `/ddc/${GUID_EQUI}.pack.json`) {
281
+ return Promise.resolve({
282
+ ok: true,
283
+ json: () =>
284
+ Promise.resolve({
285
+ schemaVersion: '2.0.0',
286
+ kind: 'internal-text-package',
287
+ assets: [
288
+ {
289
+ guid: GUID_EQUI,
290
+ kind: 'equirect',
291
+ payload: { width: 4, height: 4, format: 'rgba16float', colorSpace: 'linear' },
292
+ refs: [],
293
+ artifacts: {
294
+ body: {
295
+ path: `${GUID_EQUI}.bin`,
296
+ mediaType: 'application/x-forgeax-rgba16f',
297
+ contentEncoding: 'zstd',
298
+ },
299
+ },
300
+ },
301
+ ],
302
+ }),
303
+ });
304
+ }
305
+ return Promise.resolve({
306
+ ok: true,
307
+ arrayBuffer: () => Promise.resolve(compRes.value.buffer),
308
+ });
309
+ }) as typeof globalThis.fetch;
310
+
311
+ const reg = new AssetRegistry(makeMockShaderRegistry());
312
+ reg.configurePackIndex(PACK_INDEX_URL);
313
+
314
+ const result = await reg.loadByGuid(parseGuid(GUID_EQUI));
315
+ expect(result.ok).toBe(true);
316
+ });
317
+
318
+ /**
319
+ * Path 4: fontLoader loads compressed font pack JSON
320
+ *
321
+ * Unlike mesh/texture, font data is JSON (TextDecoder). The decompressed
322
+ * bytes must be valid JSON. Font loading through loadByGuid for a 'font'
323
+ * kind requires the font loader to be registered.
324
+ */
325
+ it('path 4: fontLoader loads compressed font pack JSON', async () => {
326
+ const fontPack = JSON.stringify({
327
+ assets: [{ guid: GUID_FONT, kind: 'font', payload: {} }],
328
+ });
329
+ const fontBytes = new TextEncoder().encode(fontPack);
330
+ const { compressZstd } = await import('@forgeax/engine-codec/encode');
331
+ const compRes = await compressZstd(fontBytes);
332
+ if (!compRes.ok) throw new Error('compressZstd failed');
333
+
334
+ globalThis.fetch = vi.fn().mockImplementation((input: string) => {
335
+ const url = typeof input === 'string' ? input : String(input);
336
+ if (url === PACK_INDEX_URL) {
337
+ return Promise.resolve({
338
+ ok: true,
339
+ json: () =>
340
+ Promise.resolve([
341
+ {
342
+ guid: GUID_FONT,
343
+ packageUrl: `/ddc/${GUID_FONT}.pack.json`,
344
+ kind: 'font',
345
+ },
346
+ ]),
347
+ });
348
+ }
349
+ if (url === `/ddc/${GUID_FONT}.pack.json`) {
350
+ return Promise.resolve({
351
+ ok: true,
352
+ json: () =>
353
+ Promise.resolve({
354
+ schemaVersion: '2.0.0',
355
+ kind: 'internal-text-package',
356
+ assets: [
357
+ {
358
+ guid: GUID_FONT,
359
+ kind: 'font',
360
+ payload: {},
361
+ refs: [],
362
+ artifacts: {
363
+ body: {
364
+ path: `${GUID_FONT}.json`,
365
+ mediaType: 'application/json',
366
+ contentEncoding: 'zstd',
367
+ },
368
+ },
369
+ },
370
+ ],
371
+ }),
372
+ });
373
+ }
374
+ return Promise.resolve({
375
+ ok: true,
376
+ arrayBuffer: () => Promise.resolve(compRes.value.buffer),
377
+ });
378
+ }) as typeof globalThis.fetch;
379
+
380
+ const reg = new AssetRegistry(makeMockShaderRegistry());
381
+ reg.configurePackIndex(PACK_INDEX_URL);
382
+
383
+ const result = await reg.loadByGuid(parseGuid(GUID_FONT));
384
+ // Font loader requires atlasGuid/samplerGuid/specific payload fields.
385
+ // The decompression gate successfully decompresses the zstd bytes —
386
+ // the font loader then rejects the content for missing fields.
387
+ // Key assertion: the error code is from font-loader validation
388
+ // (asset-parse-failed), not from fetchBinary decompression gate.
389
+ expect(result.ok).toBe(false);
390
+ if (!result.ok) {
391
+ // Font loader rejects payload lacking atlasGuid/samplerGuid
392
+ expect(result.error.code).toBe('asset-parse-failed');
393
+ }
394
+ });
395
+ });
@@ -1,5 +1,5 @@
1
- import { resolveShadowMapSize } from '@forgeax/engine-render/internal';
2
1
  import { describe, expect, it } from 'vitest';
2
+ import { resolveShadowMapSize } from '../../../render/src/record/frame-targets';
3
3
 
4
4
  describe('frame targets shadow removal', () => {
5
5
  it('fits a cascaded shadow atlas within the device texture limit', () => {
@@ -0,0 +1,80 @@
1
+ import type { RhiCaps } from '@forgeax/engine-rhi';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { createFullscreenRenderFeature } from '../../../render/src/features/fullscreen';
4
+ import { createRenderFeatureHost, runRenderFeatureFrame } from '../../../render/src/features/host';
5
+ import { createRenderFeatureTarget } from '../../../render/src/features/targets';
6
+
7
+ const SOURCE = `
8
+ @vertex fn vs_main(@builtin(vertex_index) index: u32) -> @builtin(position) vec4<f32> {
9
+ let x = select(-1.0, 3.0, index == 1u);
10
+ let y = select(-1.0, 3.0, index == 2u);
11
+ return vec4<f32>(x, y, 0.0, 1.0);
12
+ }
13
+ @fragment fn fs_main() -> @location(0) vec4<f32> {
14
+ return vec4<f32>(1.0, 0.0, 1.0, 1.0);
15
+ }`;
16
+
17
+ const feature = createFullscreenRenderFeature({
18
+ identity: 'test::fullscreen-feature',
19
+ source: SOURCE,
20
+ });
21
+
22
+ describe('fullscreen feature host contract', () => {
23
+ it('keeps the effect declaration inside the producer plan', () => {
24
+ const host = createRenderFeatureHost([feature]);
25
+
26
+ expect(host.ok).toBe(true);
27
+ if (!host.ok) return;
28
+ expect(host.value.features).toHaveLength(1);
29
+ const [registered] = host.value.features;
30
+ expect(registered).toBeDefined();
31
+ const planned = runRenderFeatureFrame(host.value, {
32
+ worlds: [],
33
+ owner: 0,
34
+ frameNumber: 1,
35
+ caps: {} as unknown as RhiCaps,
36
+ targets: [],
37
+ });
38
+ expect(planned.plans[0]?.plan.resources[0]).toMatchObject({
39
+ kind: 'fullscreen-program',
40
+ name: 'fullscreen.test--fullscreen-feature',
41
+ source: SOURCE,
42
+ });
43
+ });
44
+
45
+ it('rejects duplicate producer identities at host construction', () => {
46
+ const duplicate = createFullscreenRenderFeature({
47
+ identity: feature.identity,
48
+ source: SOURCE,
49
+ });
50
+ const host = createRenderFeatureHost([feature, duplicate]);
51
+
52
+ expect(host.ok).toBe(false);
53
+ if (host.ok) return;
54
+ expect(host.error.code).toBe('render-feature-registration-conflict');
55
+ });
56
+
57
+ it('builds one closed plan without a late registry mutation', () => {
58
+ const host = createRenderFeatureHost([feature]);
59
+ expect(host.ok).toBe(true);
60
+ if (!host.ok) return;
61
+ const planned = runRenderFeatureFrame(host.value, {
62
+ worlds: [],
63
+ owner: 0,
64
+ frameNumber: 1,
65
+ caps: {} as unknown as RhiCaps,
66
+ targets: [
67
+ createRenderFeatureTarget({ kind: 'scene-color', format: 'rgba16float', sampleCount: 1 }),
68
+ ],
69
+ });
70
+
71
+ expect(planned.errors).toEqual([]);
72
+ expect(planned.plans).toHaveLength(1);
73
+ expect(planned.plans[0]?.plan.resources[0]).toMatchObject({
74
+ kind: 'fullscreen-program',
75
+ name: 'fullscreen.test--fullscreen-feature',
76
+ source: SOURCE,
77
+ });
78
+ expect(planned.plans[0]?.plan.passes).toEqual([]);
79
+ });
80
+ });
@@ -9,9 +9,11 @@
9
9
  // are unchanged (AC-03 regression gate — pin the entry counts so a future
10
10
  // change to those kinds breaks this test).
11
11
 
12
- import type { PipelineSpec } from '@forgeax/engine-render/internal';
13
- import { buildBindGroupLayoutDescriptor } from '@forgeax/engine-render/internal';
14
12
  import { describe, expect, it } from 'vitest';
13
+ import {
14
+ buildBindGroupLayoutDescriptor,
15
+ type PipelineSpec,
16
+ } from '../../../render/src/pipeline-spec';
15
17
 
16
18
  function makeSpec(colorFormats: GPUTextureFormat[] = ['rgba16float']): PipelineSpec {
17
19
  return {
@@ -9,13 +9,13 @@
9
9
  // entry (plan D-3); this test pins the bindgroup emits all five bindings when
10
10
  // that UBO + depth views are supplied.
11
11
 
12
+ import type { BindGroup, BindGroupLayout, Buffer, Sampler, TextureView } from '@forgeax/engine-rhi';
13
+ import { describe, expect, it } from 'vitest';
12
14
  import {
13
15
  createFullscreenBindGroup,
14
16
  DEPTH_MIN_PARAMS_BYTE_SIZE,
15
17
  entryHasDepthRead,
16
- } from '@forgeax/engine-render/internal';
17
- import type { BindGroup, BindGroupLayout, Buffer, Sampler, TextureView } from '@forgeax/engine-rhi';
18
- import { describe, expect, it } from 'vitest';
18
+ } from '../../../render/src/fullscreen-post-process-pass';
19
19
 
20
20
  interface RecordedEntry {
21
21
  binding: number;
@@ -2,7 +2,7 @@
2
2
  // and-fullscreen-postpr M2 / w10.
3
3
  //
4
4
  // Dawn integration tests for FullscreenPostProcessPass:
5
- // (a) AC-06: addFullscreenPass samples input texture and writes to target,
5
+ // (a) AC-06: the typed fullscreen pass samples input texture and writes to target,
6
6
  // producing visible pixel output (non-black readback).
7
7
  // (b) AC-09: FXAA OFF/ON dual-pass pixel readback byte-identical to
8
8
  // pre-refactor baseline (epsilon <= 0.05).
@@ -10,26 +10,25 @@
10
10
  // srgb view confirms the dual-pass comparison has discriminability
11
11
  // (the sRGB-pass variant produces different bytes).
12
12
  //
13
- // These tests are INTENTIONALLY RED in TDD phase: the APIs under test
14
- // (addFullscreenPass, postProcess.register) do not exist yet; import errors
15
- // confirm the red state. The tests go green after w13/w14 implement the
16
- // primitives.
13
+ // These tests exercise the current typed feature-host and RHI record contract;
14
+ // no legacy graph registration API is part of this surface.
17
15
  //
18
16
  // Follows fxaa-pixel-diff.dawn.test.ts pattern for canvas mock, device capture,
19
17
  // and pixel readback.
20
18
 
19
+ import { HANDLE_CUBE } from '@forgeax/engine-assets-runtime';
21
20
  import { World } from '@forgeax/engine-ecs';
22
- import { createPrimitiveMesh } from '@forgeax/engine-geometry';
21
+ import type { Renderer } from '@forgeax/engine-render';
23
22
  import {
24
23
  ANTIALIAS_FXAA,
25
24
  ANTIALIAS_NONE,
26
25
  Camera,
27
26
  MeshFilter,
28
27
  MeshRenderer,
29
- } from '@forgeax/engine-render/internal';
28
+ } from '@forgeax/engine-render';
30
29
  import { Transform } from '@forgeax/engine-scene';
31
30
  import { describe, expect, it } from 'vitest';
32
- import { createRenderer } from '../index';
31
+ import { constructRuntimeRendererHost } from '../renderer-host';
33
32
 
34
33
  const WIDTH = 256;
35
34
  const HEIGHT = 256;
@@ -77,7 +76,6 @@ async function doReadPixels(device: GPUDevice, renderTarget: GPUTexture): Promis
77
76
  }
78
77
 
79
78
  function spawnCubeScene(world: World, antialias: number): void {
80
- const cubeHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
81
79
  world.spawn(
82
80
  {
83
81
  component: Transform,
@@ -87,7 +85,7 @@ function spawnCubeScene(world: World, antialias: number): void {
87
85
  scale: [1, 1, 1],
88
86
  },
89
87
  },
90
- { component: MeshFilter, data: { assetHandle: cubeHandle } },
88
+ { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
91
89
  { component: MeshRenderer, data: {} },
92
90
  );
93
91
  world.spawn(
@@ -119,7 +117,7 @@ function spawnCubeScene(world: World, antialias: number): void {
119
117
  * and render target for readback.
120
118
  */
121
119
  async function setupRenderer(): Promise<{
122
- renderer: Awaited<ReturnType<typeof createRenderer>>;
120
+ renderer: Renderer;
123
121
  device: GPUDevice;
124
122
  renderTarget: GPUTexture;
125
123
  }> {
@@ -177,18 +175,18 @@ async function setupRenderer(): Promise<{
177
175
  removeEventListener() {},
178
176
  } as unknown as HTMLCanvasElement;
179
177
 
180
- let renderer: Awaited<ReturnType<typeof createRenderer>>;
178
+ let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
181
179
  try {
182
- renderer = await createRenderer(mockCanvas, undefined, {
180
+ host = await constructRuntimeRendererHost(mockCanvas, undefined, {
183
181
  shaderManifestUrl: ENGINE_MANIFEST_URL,
184
182
  });
185
183
  } finally {
186
184
  globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
187
185
  }
188
- expect(renderer.backend).toBe('webgpu');
189
- const ready = await renderer.ready;
190
- expect(ready.ok).toBe(true);
191
- if (!ready.ok) throw new Error('renderer.ready failed');
186
+ expect(host.ok).toBe(true);
187
+ if (!host.ok) throw host.error;
188
+ const { renderer } = host.value;
189
+ expect(renderer.inspect().state).toBe('alive');
192
190
  const device = sharedDevice;
193
191
  if (device === undefined) throw new Error('GPUDevice not captured');
194
192
 
@@ -208,10 +206,16 @@ describe('feat-20260604 M2 w10: FullscreenPostProcessPass dawn tests', () => {
208
206
 
209
207
  const world = new World();
210
208
  spawnCubeScene(world, ANTIALIAS_FXAA);
211
- expect(renderer.attachWorld(world).ok).toBe(true);
209
+ const attachment = renderer.attach(world);
210
+ expect(attachment.ok).toBe(true);
211
+ if (!attachment.ok) throw attachment.error;
212
212
  world.update(1 / 60).unwrap();
213
213
 
214
- const drawn = renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
214
+ const drawn = renderer.draw({
215
+ leases: [attachment.value],
216
+ camera: { lease: attachment.value },
217
+ environment: { lease: attachment.value },
218
+ });
215
219
  expect(drawn.ok).toBe(true);
216
220
  await device.queue.onSubmittedWorkDone();
217
221
 
@@ -242,9 +246,15 @@ describe('feat-20260604 M2 w10: FullscreenPostProcessPass dawn tests', () => {
242
246
  // Pass 1: antialias='none' baseline.
243
247
  const worldNone = new World();
244
248
  spawnCubeScene(worldNone, ANTIALIAS_NONE);
245
- expect(renderer.attachWorld(worldNone).ok).toBe(true);
249
+ const attachmentNone = renderer.attach(worldNone);
250
+ expect(attachmentNone.ok).toBe(true);
251
+ if (!attachmentNone.ok) throw attachmentNone.error;
246
252
  worldNone.update(1 / 60).unwrap();
247
- const drawnNone = renderer.draw([worldNone], { cameraOwner: 0, resourceOwner: 0 });
253
+ const drawnNone = renderer.draw({
254
+ leases: [attachmentNone.value],
255
+ camera: { lease: attachmentNone.value },
256
+ environment: { lease: attachmentNone.value },
257
+ });
248
258
  expect(drawnNone.ok).toBe(true);
249
259
  await device.queue.onSubmittedWorkDone();
250
260
  const pixelsNone = await doReadPixels(device, renderTarget);
@@ -252,9 +262,15 @@ describe('feat-20260604 M2 w10: FullscreenPostProcessPass dawn tests', () => {
252
262
  // Pass 2: antialias='fxaa'.
253
263
  const worldFxaa = new World();
254
264
  spawnCubeScene(worldFxaa, ANTIALIAS_FXAA);
255
- expect(renderer.attachWorld(worldFxaa).ok).toBe(true);
265
+ const attachmentFxaa = renderer.attach(worldFxaa);
266
+ expect(attachmentFxaa.ok).toBe(true);
267
+ if (!attachmentFxaa.ok) throw attachmentFxaa.error;
256
268
  worldFxaa.update(1 / 60).unwrap();
257
- const drawnFxaa = renderer.draw([worldFxaa], { cameraOwner: 0, resourceOwner: 0 });
269
+ const drawnFxaa = renderer.draw({
270
+ leases: [attachmentFxaa.value],
271
+ camera: { lease: attachmentFxaa.value },
272
+ environment: { lease: attachmentFxaa.value },
273
+ });
258
274
  expect(drawnFxaa.ok).toBe(true);
259
275
  await device.queue.onSubmittedWorkDone();
260
276
  const pixelsFxaa = await doReadPixels(device, renderTarget);
@@ -9,9 +9,11 @@
9
9
  // 'r32float' -> sampleType='unfilterable-float';
10
10
  // everything else -> sampleType='float'.
11
11
 
12
- import type { PipelineSpec } from '@forgeax/engine-render/internal';
13
- import { buildBindGroupLayoutDescriptor } from '@forgeax/engine-render/internal';
14
12
  import { describe, expect, it } from 'vitest';
13
+ import {
14
+ buildBindGroupLayoutDescriptor,
15
+ type PipelineSpec,
16
+ } from '../../../render/src/pipeline-spec';
15
17
 
16
18
  function makeSpec(attachments: Partial<PipelineSpec['attachments']>): PipelineSpec {
17
19
  return {