@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
@@ -25,40 +25,24 @@ function expectValidatedOrderedLoop(
25
25
  expect(body).toContain(`${dynamicOffsetBindGroup}, [${indexName} * MESH_PER_ENTITY_STRIDE]`);
26
26
  }
27
27
 
28
- function expectShadowEntriesLoop(signature: string, dynamicOffsetBindGroup: string): void {
29
- const body = sourceAfter(signature);
30
- expect(body).toContain('for (const { entry, validatedIndex: ei } of shadowEntries)');
31
- expect(body).toContain(`${dynamicOffsetBindGroup}, [ei * MESH_PER_ENTITY_STRIDE]`);
32
- }
33
-
34
28
  describe('shadow mesh SSBO order', () => {
35
- it('uses the upload order for directional, point, and spot shadow offsets', () => {
29
+ it('uses the upload order for typed directional, point, and spot shadow offsets', () => {
36
30
  expectValidatedOrderedLoop(
37
31
  'function recordShadowCasterDraws(',
38
32
  'i',
39
33
  'shadowPass.setBindGroup(2, shadowMeshBindGroup',
40
34
  );
41
- expectShadowEntriesLoop(
42
- 'export function recordPointShadowPass(',
43
- 'pass.setBindGroup(2, meshBindGroup',
44
- );
45
- expectShadowEntriesLoop(
46
- 'function recordSpotShadowGeometry(',
47
- 'pass.setBindGroup(2, meshBindGroup',
48
- );
49
- });
50
-
51
- it('keeps directional candidate union out of legacy point/spot caster domains', () => {
52
- const point = sourceAfter('export function recordPointShadowPass(');
53
- const spot = sourceAfter('function recordSpotShadowGeometry(');
54
- expect(shadowPass).toContain(
35
+ expect(shadowPass).toContain('export function encodeDirectionalShadowPass(');
36
+ expect(shadowPass).toContain('export function encodePointShadowPass(');
37
+ expect(shadowPass).toContain('export function encodeSpotShadowPass(');
38
+ const spotBody = sourceAfter('export function encodeSpotShadowPass(');
39
+ expect(spotBody).toContain('recordShadowCasterDraws(');
40
+ expect(spotBody).toContain(
55
41
  "buildMatchedRenderableIndices(c.dispatch, { LightMode: ['ShadowCaster'] })",
56
42
  );
57
- expect(point).toContain('const mainMembership = mainShadowMembership(c);');
58
- expect(point).toContain('c.validatedShadowEntries ??');
59
- expect(point).toContain('isMainShadowRenderable(entry, mainMembership)');
60
- expect(spot).toContain('const mainMembership = mainShadowMembership(c);');
61
- expect(spot).toContain('c.validatedShadowEntries ??');
62
- expect(spot).toContain('isMainShadowRenderable(entry, mainMembership)');
43
+ expect(shadowPass).not.toContain('export function recordShadowPass(');
44
+ expect(shadowPass).not.toContain('export function recordPointShadowPass(');
45
+ expect(shadowPass).not.toContain('export function recordSpotShadowPass(');
46
+ expect(shadowPass).not.toContain('function recordSpotShadowGeometry(');
63
47
  });
64
48
  });
@@ -1,5 +1,5 @@
1
- import { SkinMaterialMismatchError } from '@forgeax/engine-render/internal';
2
1
  import { describe, expect, it } from 'vitest';
2
+ import { SkinMaterialMismatchError } from '../../../render/src/errors/render';
3
3
 
4
4
  describe('render skin errors stay outside skinning binding', () => {
5
5
  it('retains material failures in runtime render error cluster', () => {
@@ -12,12 +12,14 @@ const extractPath = (() => {
12
12
  return join(here, '..', '..', '..', 'render', 'src', 'render-system-extract.ts');
13
13
  })();
14
14
 
15
- describe('query-row hot-field access (AC-03 gate)', () => {
16
- it('keeps skin and instance hot fields on the token-first query row', () => {
15
+ describe('_getArrayView count (AC-03 gate)', () => {
16
+ it('keeps skin and instance hot fields on column views', () => {
17
17
  const src = readFileSync(extractPath, 'utf8');
18
- expect(src).not.toContain('_getArrayView(');
19
- expect(src).toContain('row.get(Instances)');
20
- expect(src).toContain('row.get(SpriteInstances)');
18
+ expect(src).toContain("_getArrayView(jointEntity, Transform, 'world')");
19
+ expect(src).toContain("_getArrayView(entity, Instances, 'transforms')");
20
+ expect(src).toContain("_getArrayView(entity, SpriteInstances, 'transforms')");
21
+ expect(src).toContain("_getArrayView(entity, SpriteInstances, 'regions')");
22
+ expect(src).not.toMatch(/^\s*const\s+\w+\s*=\s*world\.get\(jointEntity, Transform\)/m);
21
23
  expect(src).not.toMatch(/^\s*const\s+\w+\s*=\s*world\.get\(entity, Instances\)/m);
22
24
  });
23
25
  });
@@ -22,18 +22,19 @@
22
22
 
23
23
  import type { World as WorldType } from '@forgeax/engine-ecs';
24
24
  import { World } from '@forgeax/engine-ecs';
25
+ import type { RhiCaps } from '@forgeax/engine-rhi';
26
+ import type { EquirectAsset, Handle } from '@forgeax/engine-types';
27
+ import { toShared } from '@forgeax/engine-types';
28
+ import { afterEach, describe, expect, it, vi } from 'vitest';
29
+ import { DeviceScope } from '../../../render/src/device/device-scope';
30
+ import { GpuResidencyCache } from '../../../render/src/device/gpu-residency';
31
+ import { RhiErrorListenerRegistry } from '../../../render/src/lifecycle';
25
32
  import {
26
33
  driveLazyEquirectProjection,
27
- GpuResourceStore,
28
- RhiErrorListenerRegistry,
29
34
  selectLazyEquirectHandle,
30
35
  warnMultiSkybox,
31
36
  warnMultiSkylight,
32
- } from '@forgeax/engine-render/internal';
33
- import type { RhiCaps } from '@forgeax/engine-rhi';
34
- import type { EquirectAsset, Handle } from '@forgeax/engine-types';
35
- import { toShared } from '@forgeax/engine-types';
36
- import { afterEach, describe, expect, it, vi } from 'vitest';
37
+ } from '../../../render/src/record/helpers';
37
38
 
38
39
  // ── caps probes ──────────────────────────────────────────────────────────────
39
40
 
@@ -73,7 +74,18 @@ function makeReadyDevice(probe: DeviceProbe): any {
73
74
  createPipelineLayout: () => okShim({ __mock: 'layout' }),
74
75
  createRenderPipeline: () => okShim({ __mock: 'pipeline' }),
75
76
  createBindGroup: () => okShim({ __mock: 'bindGroup' }),
76
- createCommandEncoder: () => okShim({ __mock: 'encoder', beginRenderPass: () => ({}) }),
77
+ createCommandEncoder: () =>
78
+ okShim({
79
+ __mock: 'encoder',
80
+ beginRenderPass: () => ({
81
+ setPipeline: () => undefined,
82
+ setBindGroup: () => undefined,
83
+ setVertexBuffer: () => undefined,
84
+ draw: () => undefined,
85
+ end: () => undefined,
86
+ }),
87
+ finish: () => okShim({ __mock: 'command-buffer' }),
88
+ }),
77
89
  createBuffer: (desc: { size?: number }) => okShim({ __mock: 'buffer', size: desc.size ?? 0 }),
78
90
  createTexture: () => {
79
91
  probe.textures += 1;
@@ -84,9 +96,9 @@ function makeReadyDevice(probe: DeviceProbe): any {
84
96
  },
85
97
  createTextureView: () => okShim({ __mock: 'view' }),
86
98
  queue: {
87
- writeTexture: () => undefined,
88
- writeBuffer: () => undefined,
89
- submit: () => undefined,
99
+ writeTexture: () => okShim(undefined),
100
+ writeBuffer: () => okShim(undefined),
101
+ submit: () => okShim(undefined),
90
102
  },
91
103
  };
92
104
  }
@@ -98,7 +110,11 @@ function makeFailingDevice(): any {
98
110
  createShaderModule: () => okShim({ __mock: 'shader' }),
99
111
  createTexture: () => ({ ok: false as const, error: undefined }),
100
112
  createTextureView: () => ({ ok: false as const, error: undefined }),
101
- queue: { writeTexture: () => undefined, writeBuffer: () => undefined, submit: () => undefined },
113
+ queue: {
114
+ writeTexture: () => okShim(undefined),
115
+ writeBuffer: () => okShim(undefined),
116
+ submit: () => okShim(undefined),
117
+ },
102
118
  };
103
119
  }
104
120
 
@@ -123,8 +139,8 @@ function equirectPod(width = 4, height = 2): EquirectAsset {
123
139
  // by recordMainPass off the global cache views (out of scope for this unit test,
124
140
  // covered by the dawn IBL readback test). This unit test asserts the lazy
125
141
  // trigger's launch / dedup / caps-gate / fail-once-and-no-retry bookkeeping.
126
- function configuredStore(device: unknown, caps: RhiCaps): GpuResourceStore {
127
- const store = new GpuResourceStore();
142
+ function configuredStore(device: unknown, caps: RhiCaps): GpuResidencyCache {
143
+ const store = new GpuResidencyCache();
128
144
  let next = 9000;
129
145
  store.configureGpuDevice(
130
146
  // biome-ignore lint/suspicious/noExplicitAny: mock device satisfies MipmapBlitDevice structurally
@@ -133,13 +149,18 @@ function configuredStore(device: unknown, caps: RhiCaps): GpuResourceStore {
133
149
  (() => okShim(toShared<'EquirectAsset'>(next++))) as never,
134
150
  caps,
135
151
  );
152
+ store.configureIblDevice(
153
+ device as import('@forgeax/engine-rhi').RhiDevice,
154
+ async (_device, desc) => okShim({ __mock: 'shader', label: desc.label ?? '' }) as never,
155
+ );
156
+ store.bindDeviceScope(DeviceScope.create(0, 'skylight-lazy-test'));
136
157
  return store;
137
158
  }
138
159
 
139
160
  // Minimal RenderSystemInternals surface driveLazyEquirectProjection touches:
140
161
  // gpuStore, errorRegistry, device.caps. Everything else is unused by the arm.
141
162
  function makeInternals(
142
- store: GpuResourceStore,
163
+ store: GpuResidencyCache,
143
164
  errorRegistry: RhiErrorListenerRegistry,
144
165
  caps: RhiCaps,
145
166
  ) {
@@ -1,6 +1,6 @@
1
+ import type { AssetRegistry } from '@forgeax/engine-assets-runtime';
1
2
  import { defineComponent, World } from '@forgeax/engine-ecs';
2
- import { createSceneAssetPort } from '@forgeax/engine-runtime';
3
- import { worldInstantiateScene } from '@forgeax/engine-scene';
3
+ import * as SceneOwner from '@forgeax/engine-scene';
4
4
  import { describe, expect, it } from 'vitest';
5
5
  import { rootsToSceneAsset } from '../collect-scene-asset';
6
6
  import { registerSceneComponents } from './helpers/register-scene-components';
@@ -22,8 +22,8 @@ describe('sparse tag scene persistence', () => {
22
22
  const entity = source
23
23
  .spawn({ component: Selected, data: {} }, { component: RuntimeOnly, data: {} })
24
24
  .unwrap();
25
- const assets = createSceneAssetPort(() => undefined);
26
- const collected = rootsToSceneAsset(assets, source, [entity]).unwrap();
25
+ const registry = {} as AssetRegistry;
26
+ const collected = rootsToSceneAsset(registry, source, [entity]).unwrap();
27
27
  const components = collected.entities[0]?.components as
28
28
  | Record<string, Record<string, unknown>>
29
29
  | undefined;
@@ -34,7 +34,7 @@ describe('sparse tag scene persistence', () => {
34
34
  const target = new World();
35
35
  registerSceneComponents(target, [Selected, RuntimeOnly]);
36
36
  const handle = target.allocSharedRef('SceneAsset', collected);
37
- worldInstantiateScene(target, handle).unwrap();
37
+ SceneOwner.worldInstantiateScene(target, handle).unwrap();
38
38
  expect(
39
39
  Array.from(target.query({ with: [Selected] }).unwrap(), (row) => row.entity),
40
40
  ).toHaveLength(1);
@@ -20,19 +20,19 @@
20
20
  // Anchors: plan-tasks m2-t5; plan-strategy §D-8 (sprite cullMode 'none')
21
21
  // + §R-5 (sprite single-frame baseline non-degradation).
22
22
 
23
+ import { HANDLE_QUAD } from '@forgeax/engine-assets-runtime';
23
24
  import { World } from '@forgeax/engine-ecs';
24
- import { createPrimitiveMesh } from '@forgeax/engine-geometry';
25
- import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '@forgeax/engine-render/authoring';
26
25
  import {
27
26
  ANTIALIAS_NONE,
28
27
  Camera,
29
28
  MeshFilter,
30
29
  MeshRenderer,
31
30
  TONEMAP_NONE,
32
- } from '@forgeax/engine-render/internal';
31
+ } from '@forgeax/engine-render';
32
+ import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '@forgeax/engine-render/authoring';
33
33
  import { Transform } from '@forgeax/engine-scene';
34
34
  import { describe, expect, it } from 'vitest';
35
- import { createRenderer } from '../index';
35
+ import { constructRuntimeRendererHost } from '../renderer-host';
36
36
 
37
37
  const WIDTH = 256;
38
38
  const HEIGHT = 256;
@@ -94,7 +94,6 @@ function spawnFlippedSpriteScene(
94
94
  sx: number,
95
95
  sy: number,
96
96
  ): void {
97
- const quadHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('quad').unwrap());
98
97
  world.spawn(
99
98
  {
100
99
  component: Transform,
@@ -104,7 +103,7 @@ function spawnFlippedSpriteScene(
104
103
  scale: [sx, sy, 1],
105
104
  },
106
105
  },
107
- { component: MeshFilter, data: { assetHandle: quadHandle } },
106
+ { component: MeshFilter, data: { assetHandle: HANDLE_QUAD } },
108
107
  { component: MeshRenderer, data: { materials: [spriteMaterial as never] } },
109
108
  );
110
109
  world.spawn(
@@ -207,21 +206,24 @@ describe('feat-20260608 M2 m2-t5: sprite pipeline cullMode "none" lets H/V flipp
207
206
  removeEventListener() {},
208
207
  } as unknown as HTMLCanvasElement;
209
208
 
210
- let renderer: Awaited<ReturnType<typeof createRenderer>>;
209
+ let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
211
210
  try {
212
- renderer = await createRenderer(mockCanvas, {}, { shaderManifestUrl: ENGINE_MANIFEST_URL });
211
+ host = await constructRuntimeRendererHost(
212
+ mockCanvas,
213
+ {},
214
+ {
215
+ shaderManifestUrl: ENGINE_MANIFEST_URL,
216
+ },
217
+ );
213
218
  } finally {
214
219
  globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
215
220
  }
216
- expect(renderer.backend).toBe('webgpu');
217
- const ready = await renderer.ready;
218
- expect(ready.ok).toBe(true);
219
- if (!ready.ok) return;
221
+ expect(host.ok).toBe(true);
222
+ if (!host.ok) throw host.error;
223
+ const { renderer } = host.value;
224
+ expect(renderer.inspect().state).toBe('alive');
220
225
  const device = sharedDevice;
221
226
  if (device === undefined) throw new Error('GPUDevice not captured');
222
-
223
- const assets = renderer.assets;
224
- if (assets === null) throw new Error('AssetRegistry is null');
225
227
  const worldFlip = new World();
226
228
 
227
229
  const synth = buildSyntheticRgba();
@@ -235,17 +237,6 @@ describe('feat-20260608 M2 m2-t5: sprite pipeline cullMode "none" lets H/V flipp
235
237
  mipmap: false,
236
238
  };
237
239
  const textureHandle = worldFlip.allocSharedRef('TextureAsset', synthPod as never);
238
- const uploadRes = await renderer.store.uploadTexture(textureHandle, synthPod as never, {
239
- bytes: synth.data,
240
- width: synth.width,
241
- height: synth.height,
242
- mime: 'image/png',
243
- colorSpace: 'srgb',
244
- mipmap: false,
245
- });
246
- expect(uploadRes.ok, 'sprite texture upload').toBe(true);
247
- if (!uploadRes.ok) return;
248
-
249
240
  const samplerHandle = worldFlip.allocSharedRef('SamplerAsset', {
250
241
  kind: 'sampler',
251
242
  magFilter: 'linear',
@@ -281,14 +272,7 @@ describe('feat-20260608 M2 m2-t5: sprite pipeline cullMode "none" lets H/V flipp
281
272
  // pivotAndSize / baseColorTexture). The legacy baseColor / texture /
282
273
  // pivot field names lose their backwards-compat fold post-R1.
283
274
  colorTint: [1.0, 1.0, 1.0, 1.0],
284
- baseColorTexture: {
285
- texture: textureHandle,
286
- coordinates: {
287
- set: 0,
288
- transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
289
- physicalUvScale: [1, 1],
290
- },
291
- },
275
+ baseColorTexture: textureHandle,
292
276
  sampler: samplerHandle,
293
277
  region: [0, 0, 1, 1],
294
278
  pivotAndSize: [0.5, 0.5, 1, 1],
@@ -298,9 +282,15 @@ describe('feat-20260608 M2 m2-t5: sprite pipeline cullMode "none" lets H/V flipp
298
282
  // Render an H-flipped sprite (scale.x < 0). With cullMode='back' this
299
283
  // would be culled and the centre would stay clear-colour-black.
300
284
  spawnFlippedSpriteScene(worldFlip, spriteMaterial, /* sx= */ -1, /* sy= */ 1);
301
- expect(renderer.attachWorld(worldFlip).ok).toBe(true);
285
+ const attachment = renderer.attach(worldFlip);
286
+ expect(attachment.ok).toBe(true);
287
+ if (!attachment.ok) throw attachment.error;
302
288
  worldFlip.update(1 / 60).unwrap();
303
- const drawn = renderer.draw([worldFlip], { cameraOwner: 0, resourceOwner: 0 });
289
+ const drawn = renderer.draw({
290
+ leases: [attachment.value],
291
+ camera: { lease: attachment.value },
292
+ environment: { lease: attachment.value },
293
+ });
304
294
  await device.queue.onSubmittedWorkDone();
305
295
  expect(drawn.ok, 'H-flipped sprite draw').toBe(true);
306
296
 
@@ -369,21 +359,24 @@ describe('feat-20260608 M2 m2-t5: sprite pipeline cullMode "none" lets H/V flipp
369
359
  removeEventListener() {},
370
360
  } as unknown as HTMLCanvasElement;
371
361
 
372
- let renderer: Awaited<ReturnType<typeof createRenderer>>;
362
+ let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
373
363
  try {
374
- renderer = await createRenderer(mockCanvas, {}, { shaderManifestUrl: ENGINE_MANIFEST_URL });
364
+ host = await constructRuntimeRendererHost(
365
+ mockCanvas,
366
+ {},
367
+ {
368
+ shaderManifestUrl: ENGINE_MANIFEST_URL,
369
+ },
370
+ );
375
371
  } finally {
376
372
  globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
377
373
  }
378
- expect(renderer.backend).toBe('webgpu');
379
- const ready = await renderer.ready;
380
- expect(ready.ok).toBe(true);
381
- if (!ready.ok) return;
374
+ expect(host.ok).toBe(true);
375
+ if (!host.ok) throw host.error;
376
+ const { renderer } = host.value;
377
+ expect(renderer.inspect().state).toBe('alive');
382
378
  const device = sharedDevice;
383
379
  if (device === undefined) throw new Error('GPUDevice not captured');
384
-
385
- const assets = renderer.assets;
386
- if (assets === null) throw new Error('AssetRegistry is null');
387
380
  const worldFlipBoth = new World();
388
381
 
389
382
  const synth = buildSyntheticRgba();
@@ -397,15 +390,6 @@ describe('feat-20260608 M2 m2-t5: sprite pipeline cullMode "none" lets H/V flipp
397
390
  mipmap: false,
398
391
  };
399
392
  const textureHandle = worldFlipBoth.allocSharedRef('TextureAsset', synthPod as never);
400
- await renderer.store.uploadTexture(textureHandle, synthPod as never, {
401
- bytes: synth.data,
402
- width: synth.width,
403
- height: synth.height,
404
- mime: 'image/png',
405
- colorSpace: 'srgb',
406
- mipmap: false,
407
- });
408
-
409
393
  const samplerHandle = worldFlipBoth.allocSharedRef('SamplerAsset', {
410
394
  kind: 'sampler',
411
395
  magFilter: 'linear',
@@ -441,14 +425,7 @@ describe('feat-20260608 M2 m2-t5: sprite pipeline cullMode "none" lets H/V flipp
441
425
  // pivotAndSize / baseColorTexture). The legacy baseColor / texture /
442
426
  // pivot field names lose their backwards-compat fold post-R1.
443
427
  colorTint: [1.0, 1.0, 1.0, 1.0],
444
- baseColorTexture: {
445
- texture: textureHandle,
446
- coordinates: {
447
- set: 0,
448
- transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
449
- physicalUvScale: [1, 1],
450
- },
451
- },
428
+ baseColorTexture: textureHandle,
452
429
  sampler: samplerHandle,
453
430
  region: [0, 0, 1, 1],
454
431
  pivotAndSize: [0.5, 0.5, 1, 1],
@@ -456,9 +433,15 @@ describe('feat-20260608 M2 m2-t5: sprite pipeline cullMode "none" lets H/V flipp
456
433
  } as never);
457
434
 
458
435
  spawnFlippedSpriteScene(worldFlipBoth, spriteMaterial, /* sx= */ -1, /* sy= */ -1);
459
- expect(renderer.attachWorld(worldFlipBoth).ok).toBe(true);
436
+ const attachmentBoth = renderer.attach(worldFlipBoth);
437
+ expect(attachmentBoth.ok).toBe(true);
438
+ if (!attachmentBoth.ok) throw attachmentBoth.error;
460
439
  worldFlipBoth.update(1 / 60).unwrap();
461
- const drawn = renderer.draw([worldFlipBoth], { cameraOwner: 0, resourceOwner: 0 });
440
+ const drawn = renderer.draw({
441
+ leases: [attachmentBoth.value],
442
+ camera: { lease: attachmentBoth.value },
443
+ environment: { lease: attachmentBoth.value },
444
+ });
462
445
  await device.queue.onSubmittedWorkDone();
463
446
  expect(drawn.ok).toBe(true);
464
447
 
@@ -15,14 +15,15 @@
15
15
  // white texture; BGL JSON unchanged across sprite vs sprite-lit)
16
16
  // - requirements AC-07
17
17
 
18
- import type { PipelineSpec } from '@forgeax/engine-render/internal';
18
+ import { describe, expect, it } from 'vitest';
19
+ import { mergeSkylightIntoMaterialBgl } from '../../../render/src/ibl/skylight-bind-group';
19
20
  import {
20
- buildBindGroupLayoutDescriptor,
21
+ appendInjection,
21
22
  buildPbrMaterialUserRegionEntries,
22
23
  buildPbrViewBglEntries,
23
- mergeSkylightIntoMaterialBgl,
24
- } from '@forgeax/engine-render/internal';
25
- import { describe, expect, it } from 'vitest';
24
+ } from '../../../render/src/pbr-pipeline';
25
+ import type { PipelineSpec } from '../../../render/src/pipeline-spec';
26
+ import { buildBindGroupLayoutDescriptor } from '../../../render/src/pipeline-spec';
26
27
 
27
28
  function makeSpec(shaderId: string): PipelineSpec {
28
29
  return {
@@ -119,22 +120,22 @@ describe('sprite-lit BGL byte-identical to sprite (AC-07, w4/w5 close)', () => {
119
120
  describe('material BGL congruence (pbr-material-merged / unlit-material)', () => {
120
121
  it('pbr-material-user-region entries are 13 (PBR layout reused by sprite & sprite-lit)', () => {
121
122
  // sprite + sprite-lit use the default standard-PBR user-region
122
- // schema (6 texture fields produce 13 BGL entries after std140 merge).
123
+ // schema (5 user fields produce 7 BGL entries after std140 merge).
123
124
  // Both share the same userRegion shape and therefore the same BGL.
124
125
  const base = buildPbrMaterialUserRegionEntries();
125
126
  expect(base.length).toBe(13);
126
127
  });
127
128
 
128
- it('pbr-material-merged stays 20 entries (sprite/sprite-lit do not change material BGL shape)', () => {
129
+ it('pbr-material-merged stays 24 entries (sprite/sprite-lit do not change material BGL shape)', () => {
129
130
  const merged = buildBindGroupLayoutDescriptor(makeSpec('forgeax::sprite-lit'), {
130
131
  kind: 'pbr-material-merged',
131
132
  });
132
- expect(merged.entries.length).toBe(20);
133
- // mergeSkylightIntoMaterialBgl stays append-only against the derived
134
- // user-region; material textures own emissive and occlusion.
133
+ expect(merged.entries.length).toBe(24);
134
+ // mergeSkylightIntoMaterialBgl + lightmap injection must stay
135
+ // append-only against the 7-entry PBR base.
135
136
  const base = buildPbrMaterialUserRegionEntries();
136
137
  const afterSky = mergeSkylightIntoMaterialBgl(base);
137
- const expected = afterSky;
138
+ const expected = [...afterSky, ...appendInjection(afterSky, 'lightmap')];
138
139
  expect(merged.entries).toEqual(expected);
139
140
  });
140
141
  });
@@ -26,8 +26,8 @@
26
26
  // - requirements AC-01 / AC-02 (post-rewrite)
27
27
 
28
28
  import { fileURLToPath } from 'node:url';
29
- import type { MaterialSnapshot } from '@forgeax/engine-render/internal';
30
29
  import { describe, expect, it } from 'vitest';
30
+ import type { MaterialSnapshot } from '../../../render/src/render-system-extract';
31
31
 
32
32
  describe('sprite-lit extract branch (D-9 remap, AC-02 + AC-01)', () => {
33
33
  describe('sprite-lit routes via materialShaderId (AC-01 D-10 remap)', () => {
@@ -113,7 +113,7 @@ describe('sprite-lit pipeline cache-key string isolation (D-11 remap, AC-08)', (
113
113
  // recognised material shader.
114
114
  const fs = await import('node:fs');
115
115
  const src = fs.readFileSync(
116
- fileURLToPath(new URL('../../../render/src/renderer/renderer-factory.ts', import.meta.url)),
116
+ fileURLToPath(new URL('../../../render/src/assembly/factory.ts', import.meta.url)),
117
117
  'utf8',
118
118
  );
119
119
  // Once t7 wires it, both literals appear (sprite already in tree).
@@ -22,15 +22,6 @@
22
22
  // the existing 5-entry assertions in pipeline.unit.test.ts are migrated
23
23
  // holistically (one-cut, no v1/v2 dual fixture).
24
24
 
25
- import type { HdrpBuffers, RenderSystemRuntime } from '@forgeax/engine-render/internal';
26
- import {
27
- createHdrpBindGroupLayoutDescriptor,
28
- createHdrpClusterMembershipBindGroup,
29
- createHdrpClusterMembershipBindGroupLayoutDescriptor,
30
- createHdrpUnifiedBindGroup,
31
- getOrCreateSsaoFallbackTexture,
32
- packClusterUniform,
33
- } from '@forgeax/engine-render/internal';
34
25
  import type {
35
26
  BindGroupLayout,
36
27
  Buffer,
@@ -40,6 +31,16 @@ import type {
40
31
  TextureView,
41
32
  } from '@forgeax/engine-rhi';
42
33
  import { describe, expect, it, vi } from 'vitest';
34
+ import type { HdrpBuffers } from '../../../render/src/hdrp-buffers';
35
+ import {
36
+ createHdrpClusterMembershipBindGroup,
37
+ createHdrpClusterMembershipBindGroupLayoutDescriptor,
38
+ createHdrpUnifiedBindGroup,
39
+ getOrCreateSsaoFallbackTexture,
40
+ packClusterUniform,
41
+ } from '../../../render/src/hdrp-buffers';
42
+ import { createHdrpBindGroupLayoutDescriptor } from '../../../render/src/pipeline-spec';
43
+ import type { RenderSystemRuntime } from '../../../render/src/render-system';
43
44
 
44
45
  const FRAGMENT_VISIBILITY = 0x2;
45
46
  const COMPUTE_VISIBILITY = 0x4;
@@ -160,6 +161,12 @@ describe('HDRP GPU membership producer bind-group contract', () => {
160
161
  expect(storagePayload[3]).toBe(256);
161
162
  });
162
163
 
164
+ it('keeps enabled SSAO intensity in the zero-punctual-light uniform path', () => {
165
+ const payload = new Float32Array(packClusterUniform({ x: 16, y: 9, z: 24 }, 0.1, 50, 1, 0));
166
+ expect(payload[3]).toBe(0);
167
+ expect(payload[7]).toBe(1);
168
+ });
169
+
163
170
  it('uses four compute-only bindings with read-write membership output', () => {
164
171
  const desc = createHdrpClusterMembershipBindGroupLayoutDescriptor();
165
172
  expect(desc.entries?.map((entry) => entry.binding)).toEqual([0, 1, 2, 3]);
@@ -9,10 +9,10 @@
9
9
  //
10
10
  // AC-05 anchor: lazy alloc + hdrp-ssao-* labels + call-count assertions.
11
11
 
12
- import type { RenderSystemRuntime } from '@forgeax/engine-render/internal';
13
- import { getOrCreateSsaoBuffers } from '@forgeax/engine-render/internal';
14
12
  import type { Buffer, RhiCaps, RhiDevice, Texture } from '@forgeax/engine-rhi';
15
13
  import { describe, expect, it, vi } from 'vitest';
14
+ import type { RenderSystemRuntime } from '../../../render/src/render-system';
15
+ import { getOrCreateSsaoBuffers } from '../../../render/src/ssao-buffers';
16
16
 
17
17
  function mockTexture(label?: string): Texture {
18
18
  return { label: label ?? 'mock-tex' } as unknown as Texture;
@@ -1,4 +1,4 @@
1
- // ssao-data.test.ts -- M1 / w1: kernel distribution test (TDD red phase).
1
+ // ssao-kernel.test.ts -- M1 / w1: kernel distribution test (TDD red phase).
2
2
  //
3
3
  // Asserts:
4
4
  // - generateSsaoKernel() returns 64 vec3 samples.
@@ -10,8 +10,8 @@
10
10
  //
11
11
  // AC-03 anchor: kernel length 64 + distribution properties.
12
12
 
13
- import { generateSsaoKernel, generateSsaoNoise } from '@forgeax/engine-render/internal';
14
13
  import { describe, expect, it } from 'vitest';
14
+ import { generateSsaoKernel, generateSsaoNoise } from '../../../render/src/ssao-buffers';
15
15
 
16
16
  function readFloat(v: Float32Array, idx: number): number {
17
17
  const val = v[idx];
@@ -17,8 +17,8 @@
17
17
  // RED before w10 (SSAO codes not yet added to PostProcessErrorCode).
18
18
  // GREEN after w10 extends the union.
19
19
 
20
- import { PostProcessError } from '@forgeax/engine-render/internal';
21
20
  import { describe, expect, it } from 'vitest';
21
+ import { PostProcessError } from '../../../render/src/post-process-errors';
22
22
 
23
23
  describe('SSAO PostProcessErrorCode exhaustive switch (M2 / w9)', () => {
24
24
  it('(a) PostProcessErrorCode union has the 2 SSAO validation members', () => {