@forgeax/engine-runtime 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) hide show
  1. package/README.md +49 -83
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts +2 -0
  4. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts.map +1 -0
  5. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts +2 -0
  6. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts +2 -0
  8. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts.map +1 -0
  9. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts +11 -0
  10. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts.map +1 -0
  11. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts +2 -0
  12. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts.map +1 -0
  13. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts +2 -0
  14. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts.map +1 -0
  15. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts +2 -0
  16. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts.map +1 -0
  17. package/dist/__tests__/asset-registry-mounts.test.d.ts +2 -0
  18. package/dist/__tests__/asset-registry-mounts.test.d.ts.map +1 -0
  19. package/dist/__tests__/asset-registry.browser.test.d.ts +2 -0
  20. package/dist/__tests__/asset-registry.browser.test.d.ts.map +1 -0
  21. package/dist/__tests__/asset-registry.dawn.test.d.ts +2 -0
  22. package/dist/__tests__/asset-registry.dawn.test.d.ts.map +1 -0
  23. package/dist/__tests__/asset-registry.listCatalog.test.d.ts +2 -0
  24. package/dist/__tests__/asset-registry.listCatalog.test.d.ts.map +1 -0
  25. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts +2 -0
  26. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts.map +1 -0
  27. package/dist/__tests__/asset-registry.pack-cache.test.d.ts +2 -0
  28. package/dist/__tests__/asset-registry.pack-cache.test.d.ts.map +1 -0
  29. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts +2 -0
  30. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts.map +1 -0
  31. package/dist/__tests__/asset-registry.recursive.spec.d.ts +2 -0
  32. package/dist/__tests__/asset-registry.recursive.spec.d.ts.map +1 -0
  33. package/dist/__tests__/asset-registry.unit.test.d.ts +2 -0
  34. package/dist/__tests__/asset-registry.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/asset.unit.test.d.ts +2 -0
  36. package/dist/__tests__/asset.unit.test.d.ts.map +1 -0
  37. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts +2 -0
  38. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts.map +1 -0
  39. package/dist/__tests__/backend-selection.integration.test.d.ts +2 -0
  40. package/dist/__tests__/backend-selection.integration.test.d.ts.map +1 -0
  41. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts +2 -0
  42. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts.map +1 -0
  43. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts +2 -0
  44. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts.map +1 -0
  45. package/dist/__tests__/collect-scene-asset.test.d.ts +1 -2
  46. package/dist/__tests__/collect-scene-asset.test.d.ts.map +1 -1
  47. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts +2 -0
  48. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts.map +1 -0
  49. package/dist/__tests__/collect-transient-roundtrip.test.d.ts +1 -1
  50. package/dist/__tests__/collect-transient-roundtrip.test.d.ts.map +1 -1
  51. package/dist/__tests__/collect-transient-skip.test.d.ts +1 -2
  52. package/dist/__tests__/collect-transient-skip.test.d.ts.map +1 -1
  53. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts +2 -0
  54. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts.map +1 -0
  55. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts +2 -0
  56. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts.map +1 -0
  57. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts +2 -0
  58. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts.map +1 -0
  59. package/dist/__tests__/draw-published.d.ts +2 -2
  60. package/dist/__tests__/draw-published.d.ts.map +1 -1
  61. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts +2 -0
  62. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts.map +1 -0
  63. package/dist/__tests__/errors.unit.test.d.ts +2 -0
  64. package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
  65. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts +2 -0
  66. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts.map +1 -0
  67. package/dist/__tests__/fetch-binary-decompress.test.d.ts +2 -0
  68. package/dist/__tests__/fetch-binary-decompress.test.d.ts.map +1 -0
  69. package/dist/__tests__/four-path-compression.integration.test.d.ts +2 -0
  70. package/dist/__tests__/four-path-compression.integration.test.d.ts.map +1 -0
  71. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts +2 -0
  72. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts.map +1 -0
  73. package/dist/__tests__/guid-for-asset.unit.test.d.ts +2 -0
  74. package/dist/__tests__/guid-for-asset.unit.test.d.ts.map +1 -0
  75. package/dist/__tests__/handle-migration.test.d.ts +2 -0
  76. package/dist/__tests__/handle-migration.test.d.ts.map +1 -0
  77. package/dist/__tests__/helpers/register-runtime-components.d.ts.map +1 -1
  78. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts +2 -0
  79. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts.map +1 -0
  80. package/dist/__tests__/host-custom-kind-contract.test.d.ts +2 -0
  81. package/dist/__tests__/host-custom-kind-contract.test.d.ts.map +1 -0
  82. package/dist/__tests__/inspect-name.test.d.ts +2 -0
  83. package/dist/__tests__/inspect-name.test.d.ts.map +1 -0
  84. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts +2 -0
  85. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts.map +1 -0
  86. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts +2 -0
  87. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts.map +1 -0
  88. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts +2 -0
  89. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/loader-extract-graceful.test.d.ts +2 -0
  91. package/dist/__tests__/loader-extract-graceful.test.d.ts.map +1 -0
  92. package/dist/__tests__/loader-name-survival.test.d.ts +2 -0
  93. package/dist/__tests__/loader-name-survival.test.d.ts.map +1 -0
  94. package/dist/__tests__/mesh-bin-contract.test.d.ts +2 -0
  95. package/dist/__tests__/mesh-bin-contract.test.d.ts.map +1 -0
  96. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts +2 -0
  97. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts.map +1 -0
  98. package/dist/__tests__/mesh-bin.test.d.ts +2 -0
  99. package/dist/__tests__/mesh-bin.test.d.ts.map +1 -0
  100. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts +2 -0
  101. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts.map +1 -0
  102. package/dist/__tests__/new-kind-refs-contract.test.d.ts +2 -0
  103. package/dist/__tests__/new-kind-refs-contract.test.d.ts.map +1 -0
  104. package/dist/__tests__/package-promotion.test.d.ts +2 -0
  105. package/dist/__tests__/package-promotion.test.d.ts.map +1 -0
  106. package/dist/__tests__/package-rename.test.d.ts +2 -0
  107. package/dist/__tests__/package-rename.test.d.ts.map +1 -0
  108. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts +1 -1
  109. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts.map +1 -1
  110. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +1 -1
  111. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -1
  112. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts +10 -0
  113. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts.map +1 -0
  114. package/dist/__tests__/render-system-extract.unit.test.d.ts +2 -0
  115. package/dist/__tests__/render-system-extract.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/renderer-test-utils.d.ts +10 -0
  117. package/dist/__tests__/renderer-test-utils.d.ts.map +1 -0
  118. package/dist/__tests__/renderer.test-d.d.ts +2 -0
  119. package/dist/__tests__/renderer.test-d.d.ts.map +1 -0
  120. package/dist/__tests__/resolve-asset-handle-err.test.d.ts +2 -0
  121. package/dist/__tests__/resolve-asset-handle-err.test.d.ts.map +1 -0
  122. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts +2 -0
  123. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts.map +1 -0
  124. package/dist/__tests__/resolveName-fallback.test.d.ts +2 -0
  125. package/dist/__tests__/resolveName-fallback.test.d.ts.map +1 -0
  126. package/dist/__tests__/resolveName-null-package.test.d.ts +2 -0
  127. package/dist/__tests__/resolveName-null-package.test.d.ts.map +1 -0
  128. package/dist/__tests__/resolveName-unified-entry.test.d.ts +2 -0
  129. package/dist/__tests__/resolveName-unified-entry.test.d.ts.map +1 -0
  130. package/dist/__tests__/resolveName.test.d.ts +2 -0
  131. package/dist/__tests__/resolveName.test.d.ts.map +1 -0
  132. package/dist/__tests__/roots-to-scene-asset.test.d.ts +1 -1
  133. package/dist/__tests__/roots-to-scene-asset.test.d.ts.map +1 -1
  134. package/dist/__tests__/roundtrip-primitive.test.d.ts +2 -0
  135. package/dist/__tests__/roundtrip-primitive.test.d.ts.map +1 -0
  136. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts +2 -0
  137. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts.map +1 -0
  138. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts +2 -0
  139. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts.map +1 -0
  140. package/dist/__tests__/scene-mount-fixed-point.test.d.ts +2 -0
  141. package/dist/__tests__/scene-mount-fixed-point.test.d.ts.map +1 -0
  142. package/dist/__tests__/scene-mount-roundtrip.test.d.ts +2 -0
  143. package/dist/__tests__/scene-mount-roundtrip.test.d.ts.map +1 -0
  144. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts +2 -0
  145. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts.map +1 -0
  146. package/dist/__tests__/scene-sugar-instantiate.test.d.ts +2 -0
  147. package/dist/__tests__/scene-sugar-instantiate.test.d.ts.map +1 -0
  148. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts +2 -0
  149. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts.map +1 -0
  150. package/dist/__tests__/serialize-scene-asset.test.d.ts +1 -1
  151. package/dist/__tests__/serialize-scene-asset.test.d.ts.map +1 -1
  152. package/dist/__tests__/template-game-default-api-contract.test.d.ts +2 -0
  153. package/dist/__tests__/template-game-default-api-contract.test.d.ts.map +1 -0
  154. package/dist/__tests__/tileset-asset-validate.test.d.ts +2 -0
  155. package/dist/__tests__/tileset-asset-validate.test.d.ts.map +1 -0
  156. package/dist/__tests__/transcode-fallback.unit.test.d.ts +2 -0
  157. package/dist/__tests__/transcode-fallback.unit.test.d.ts.map +1 -0
  158. package/dist/__tests__/transient-runtime-behavior.test.d.ts +2 -0
  159. package/dist/__tests__/transient-runtime-behavior.test.d.ts.map +1 -0
  160. package/dist/__tests__/video-loader-consumption.test.d.ts +2 -0
  161. package/dist/__tests__/video-loader-consumption.test.d.ts.map +1 -0
  162. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts +2 -0
  163. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts.map +1 -0
  164. package/dist/backend-selection.d.ts +13 -0
  165. package/dist/backend-selection.d.ts.map +1 -0
  166. package/dist/collect-scene-asset.d.ts +3 -3
  167. package/dist/collect-scene-asset.d.ts.map +1 -1
  168. package/dist/createRenderer.d.ts +14 -2
  169. package/dist/createRenderer.d.ts.map +1 -1
  170. package/dist/errors/environment.d.ts +1 -1
  171. package/dist/errors/environment.d.ts.map +1 -1
  172. package/dist/index.d.ts +19 -81
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.mjs +105 -108
  175. package/dist/index.mjs.map +1 -1
  176. package/dist/renderer-host.d.ts +9 -0
  177. package/dist/renderer-host.d.ts.map +1 -0
  178. package/dist/renderer-host.mjs +62 -0
  179. package/dist/renderer-host.mjs.map +1 -0
  180. package/dist/scene-instances/index.d.ts +2 -0
  181. package/dist/scene-instances/index.d.ts.map +1 -0
  182. package/dist/scene-utils/mount-override-fold.d.ts +1 -2
  183. package/dist/scene-utils/mount-override-fold.d.ts.map +1 -1
  184. package/dist/systems/sprite-animation-tick.d.ts +1 -1
  185. package/dist/systems/sprite-animation-tick.d.ts.map +1 -1
  186. package/dist/systems/transparent-sort.d.ts +1 -2
  187. package/dist/systems/transparent-sort.d.ts.map +1 -1
  188. package/dist/tilemap-register-validate.d.ts.map +1 -1
  189. package/package.json +34 -33
  190. package/src/__tests__/active-camera.unit.test.ts +19 -9
  191. package/src/__tests__/animation-graph-collect-roundtrip.test.ts +213 -0
  192. package/src/__tests__/animation-graph-serialize.unit.test.ts +171 -0
  193. package/src/__tests__/append-injection.test.ts +1 -1
  194. package/src/__tests__/asset-brand-and-name-retirement.test.ts +102 -0
  195. package/src/__tests__/asset-error-exhaustive.test-d.ts +62 -0
  196. package/src/__tests__/asset-registry-guid-reverse.test.ts +575 -0
  197. package/src/__tests__/asset-registry-hdr-equirect.test.ts +78 -0
  198. package/src/__tests__/asset-registry-mesh-pack-payload.dawn.test.ts +232 -0
  199. package/src/__tests__/asset-registry-mounts.test.ts +806 -0
  200. package/src/__tests__/asset-registry.browser.test.ts +81 -0
  201. package/src/__tests__/asset-registry.dawn.test.ts +94 -0
  202. package/src/__tests__/asset-registry.listCatalog.test.ts +170 -0
  203. package/src/__tests__/asset-registry.mesh-bin.test.ts +316 -0
  204. package/src/__tests__/asset-registry.pack-cache.test.ts +969 -0
  205. package/src/__tests__/asset-registry.raw-container-failfast.test.ts +225 -0
  206. package/src/__tests__/asset-registry.recursive.spec.ts +1397 -0
  207. package/src/__tests__/asset-registry.unit.test.ts +1030 -0
  208. package/src/__tests__/asset.unit.test.ts +7107 -0
  209. package/src/__tests__/audio-load-by-guid.unit.test.ts +126 -0
  210. package/src/__tests__/backend-selection.integration.test.ts +11 -0
  211. package/src/__tests__/basis-catalog-dispatch.integration.test.ts +320 -0
  212. package/src/__tests__/bind-group-cache-keying.test.ts +4 -4
  213. package/src/__tests__/block-upload-math.unit.test.ts +2 -2
  214. package/src/__tests__/builtin-asset-registry.unit.test.ts +112 -0
  215. package/src/__tests__/builtin-shader-register-e2e.test.ts +1 -1
  216. package/src/__tests__/cache-false-eviction.test.ts +2 -1
  217. package/src/__tests__/cache-isolation-matrix.test.ts +2 -1
  218. package/src/__tests__/camera-clear-snapshot-equivalence.unit.test.ts +5 -6
  219. package/src/__tests__/clamp-to-last.e2e.browser.test.ts +29 -19
  220. package/src/__tests__/collect-scene-asset.test.ts +49 -52
  221. package/src/__tests__/collect-scene-mount-collapse.test.ts +391 -0
  222. package/src/__tests__/collect-subtree.unit.test.ts +1 -2
  223. package/src/__tests__/collect-transient-children-absent.test.ts +24 -10
  224. package/src/__tests__/collect-transient-roundtrip.test.ts +44 -20
  225. package/src/__tests__/collect-transient-skip.test.ts +24 -13
  226. package/src/__tests__/components.test-d.ts +1 -6
  227. package/src/__tests__/components.unit.test.ts +20 -19
  228. package/src/__tests__/composite-skybox-cross-world.browser.test.ts +59 -27
  229. package/src/__tests__/compressed-texture-physical-extent.integration.test.ts +139 -0
  230. package/src/__tests__/create-renderer-assembly.integration.test.ts +42 -29
  231. package/src/__tests__/createRenderer-dispose.test.ts +35 -402
  232. package/src/__tests__/createRenderer.browser-no-webgpu.test.ts +25 -30
  233. package/src/__tests__/createRenderer.unit.test.ts +1 -1
  234. package/src/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.ts +27 -63
  235. package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +56 -47
  236. package/src/__tests__/dawn/instances-per-instance-pbr.dawn.test.ts +49 -29
  237. package/src/__tests__/dawn/instances-shadow.dawn.test.ts +26 -15
  238. package/src/__tests__/dawn/instances-uniform-fallback.dawn.test.ts +13 -14
  239. package/src/__tests__/dawn/material-alpha.dawn.test.ts +23 -31
  240. package/src/__tests__/dawn/material-cooked-fixture.dawn.test.ts +0 -18
  241. package/src/__tests__/dawn/{mesh-update.dawn.test.ts → mesh-update-dawn.test.ts} +42 -134
  242. package/src/__tests__/dawn/mipmap-srgb-linear.dawn.test.ts +14 -7
  243. package/src/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.ts +16 -28
  244. package/src/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.ts +23 -39
  245. package/src/__tests__/dawn/upload-texture.dawn.test.ts +198 -0
  246. package/src/__tests__/dawn/user-handle-mesh-render.dawn.test.ts +12 -14
  247. package/src/__tests__/dawn/user-mesh-upload.dawn.test.ts +27 -22
  248. package/src/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.ts +25 -28
  249. package/src/__tests__/dawn/zero-manifest-ready.dawn.test.ts +10 -11
  250. package/src/__tests__/demo-sortscope-migration.unit.test.ts +5 -5
  251. package/src/__tests__/derive-bgl-integration.test.ts +34 -44
  252. package/src/__tests__/derive-render-data-skin.unit.test.ts +1 -1
  253. package/src/__tests__/draw-published.ts +11 -4
  254. package/src/__tests__/dynamic-texture-store.unit.test.ts +190 -0
  255. package/src/__tests__/equirect-bc6h.integration.test.ts +144 -21
  256. package/src/__tests__/errors.unit.test.ts +1203 -0
  257. package/src/__tests__/extract-frames-graceful-degradation.test.ts +3 -7
  258. package/src/__tests__/extract-frames-merge.test.ts +35 -22
  259. package/src/__tests__/extract-record-no-hardcoded-texture-fields.test.ts +5 -16
  260. package/src/__tests__/extract-skin-mismatch.unit.test.ts +322 -0
  261. package/src/__tests__/fetch-binary-decompress.test.ts +356 -0
  262. package/src/__tests__/four-path-compression.integration.test.ts +395 -0
  263. package/src/__tests__/frame-targets-shadow-regression.unit.test.ts +1 -1
  264. package/src/__tests__/fullscreen-feature-host.dawn.test.ts +80 -0
  265. package/src/__tests__/fullscreen-post-bgl-depth.test.ts +4 -2
  266. package/src/__tests__/fullscreen-post-depth-params-arity.test.ts +3 -3
  267. package/src/__tests__/fullscreen-post-process-pass.dawn.test.ts +39 -23
  268. package/src/__tests__/fullscreen-post-process-pass.unit.test.ts +4 -2
  269. package/src/__tests__/fxaa-pixel-diff.dawn.test.ts +28 -17
  270. package/src/__tests__/fxaa-validation-and-resize.dawn.test.ts +29 -18
  271. package/src/__tests__/fxaa-zero-overhead.dawn.test.ts +16 -12
  272. package/src/__tests__/geometry.unit.test.ts +525 -159
  273. package/src/__tests__/glyph-tilemap-worldid.test.ts +1 -1
  274. package/src/__tests__/gpu-resource-cow-survivor.test.ts +6 -4
  275. package/src/__tests__/guid-for-asset.unit.test.ts +102 -0
  276. package/src/__tests__/handle-migration.test.ts +136 -0
  277. package/src/__tests__/helpers/register-runtime-components.ts +4 -2
  278. package/src/__tests__/helpers/register-scene-components.ts +1 -1
  279. package/src/__tests__/host-custom-kind-contract.test-d.ts +47 -0
  280. package/src/__tests__/host-custom-kind-contract.test.ts +578 -0
  281. package/src/__tests__/inspect-name.test.ts +139 -0
  282. package/src/__tests__/instances.test-d.ts +1 -1
  283. package/src/__tests__/instantiate-mount-deferred-wiring.test.ts +112 -0
  284. package/src/__tests__/light-casters-9-light.browser.test.ts +73 -76
  285. package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +7 -10
  286. package/src/__tests__/light-snapshot.test-d.ts +2 -2
  287. package/src/__tests__/lights-vec-negative.unit.test.ts +1 -1
  288. package/src/__tests__/lights.unit.test.ts +16 -500
  289. package/src/__tests__/loadbyguid-payload.unit.test.ts +117 -0
  290. package/src/__tests__/loadbyguid-texture-intern.unit.test.ts +213 -0
  291. package/src/__tests__/loader-extract-graceful.test.ts +146 -0
  292. package/src/__tests__/loader-name-survival.test.ts +213 -0
  293. package/src/__tests__/m3-vec-negative.unit.test.ts +3 -2
  294. package/src/__tests__/material-texture-uv-scale.unit.test.ts +101 -31
  295. package/src/__tests__/materials.unit.test.ts +10 -27
  296. package/src/__tests__/mesh-bin-contract.test.ts +28 -0
  297. package/src/__tests__/mesh-bin-skin-roundtrip.unit.test.ts +149 -0
  298. package/src/__tests__/mesh-bin.test.ts +38 -0
  299. package/src/__tests__/mesh-loader-skin-contract.unit.test.ts +120 -0
  300. package/src/__tests__/mesh-ssbo-grow.unit.test.ts +3 -3
  301. package/src/__tests__/mip-gate.unit.test.ts +1 -1
  302. package/src/__tests__/msaa-sprite-pixel-diff.dawn.test.ts +29 -68
  303. package/src/__tests__/new-kind-refs-contract.test.ts +132 -0
  304. package/src/__tests__/node-shims.d.ts +4 -6
  305. package/src/__tests__/package-promotion.test.ts +88 -0
  306. package/src/__tests__/package-rename.test.ts +103 -0
  307. package/src/__tests__/pass-selector.unit.test.ts +2 -2
  308. package/src/__tests__/pbr-pipeline.unit.test.ts +14 -21
  309. package/src/__tests__/pipeline-builder-msaa.unit.test.ts +6 -9
  310. package/src/__tests__/pipeline-cache-keying.unit.test.ts +6 -9
  311. package/src/__tests__/pipeline-spec.test.ts +16 -177
  312. package/src/__tests__/pipeline.unit.test.ts +154 -1693
  313. package/src/__tests__/point-light-shadow.dawn.test.ts +33 -42
  314. package/src/__tests__/point-light-shadow.unit.test.ts +19 -60
  315. package/src/__tests__/post-process-error-codes.unit.test.ts +4 -1
  316. package/src/__tests__/post-process-params-component.unit.test.ts +1 -1
  317. package/src/__tests__/post-process-params-extract.unit.test.ts +2 -5
  318. package/src/__tests__/postprocess-camera-consistency.test.ts +4 -7
  319. package/src/__tests__/profiler-assembly.integration.test.ts +1 -1
  320. package/src/__tests__/propagate-transforms.dawn.test.ts +12 -11
  321. package/src/__tests__/record-worldid-isolation.test.ts +7 -29
  322. package/src/__tests__/recover-error-exhaustive.test-d.ts +1 -1
  323. package/src/__tests__/render-error-exhaustive.test-d.ts +81 -71
  324. package/src/__tests__/render-feature-assembly.test-d.ts +20 -9
  325. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +8 -6
  326. package/src/__tests__/render-feature-prepared-graphics.browser.test.ts +60 -558
  327. package/src/__tests__/render-feature-prepared-graphics.dawn.test.ts +57 -544
  328. package/src/__tests__/render-feature-prepared-graphics.fixture.ts +104 -0
  329. package/src/__tests__/render-feature-prepared-graphics.integration.test.ts +40 -248
  330. package/src/__tests__/render-feature-prepared-graphics.regression.integration.test.ts +83 -340
  331. package/src/__tests__/render-feature-recover.integration.test.ts +9 -49
  332. package/src/__tests__/render-feature-runtime-surface.test-d.ts +17 -20
  333. package/src/__tests__/render-schema-consumer.integration.test.ts +20 -13
  334. package/src/__tests__/render-schema-owner-boundary.unit.test.ts +2 -6
  335. package/src/__tests__/render-system-cross-world-overlay-queue.test.ts +5 -5
  336. package/src/__tests__/render-system-extract-dispatch-ordering.test.ts +16 -31
  337. package/src/__tests__/render-system-extract.test.ts +36 -51
  338. package/src/__tests__/render-system-extract.unit.test.ts +360 -0
  339. package/src/__tests__/render-system-fold-bucket.unit.test.ts +3 -5
  340. package/src/__tests__/render-system-fold-fallback.unit.test.ts +6 -3
  341. package/src/__tests__/render-system-fold-material.unit.test.ts +3 -5
  342. package/src/__tests__/render-system-fold-metrics.unit.test.ts +5 -5
  343. package/src/__tests__/render-system-fold-modegate.unit.test.ts +6 -6
  344. package/src/__tests__/render-system-fold.dawn.test.ts +7 -5
  345. package/src/__tests__/render-system-mega.test.ts +292 -190
  346. package/src/__tests__/render-system-owner-split-contract.test.ts +10 -32
  347. package/src/__tests__/render-system-record-multi-material-textureview.test.ts +59 -45
  348. package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +23 -29
  349. package/src/__tests__/render-system-record.test.ts +398 -235
  350. package/src/__tests__/render-system-record.unit.test.ts +25 -26
  351. package/src/__tests__/render-system-skin-bg.unit.test.ts +8 -12
  352. package/src/__tests__/renderer-consumer.test-d.ts +16 -3
  353. package/src/__tests__/renderer-health.unit.test.ts +26 -916
  354. package/src/__tests__/renderer-lifecycle.integration.test.ts +19 -6
  355. package/src/__tests__/renderer-recover.unit.test.ts +49 -1069
  356. package/src/__tests__/renderer-result.test-d.ts +19 -9
  357. package/src/__tests__/renderer-surface.unit.test.ts +3 -5
  358. package/src/__tests__/renderer-test-utils.ts +56 -0
  359. package/src/__tests__/renderer.test-d.ts +59 -0
  360. package/src/__tests__/resolve-asset-handle-err.test.ts +111 -0
  361. package/src/__tests__/resolve-asset-handle.unit.test.ts +64 -0
  362. package/src/__tests__/resolve-depth-only-view.test.ts +1 -1
  363. package/src/__tests__/resolveName-fallback.test.ts +64 -0
  364. package/src/__tests__/resolveName-null-package.test.ts +38 -0
  365. package/src/__tests__/resolveName-unified-entry.test.ts +65 -0
  366. package/src/__tests__/resolveName.test.ts +64 -0
  367. package/src/__tests__/rhi-null-command-flow.unit.test.ts +43 -261
  368. package/src/__tests__/rhi-null-renderer-lifecycle.unit.test.ts +41 -169
  369. package/src/__tests__/roots-to-scene-asset.test.ts +199 -93
  370. package/src/__tests__/roundtrip-primitive.test.ts +351 -0
  371. package/src/__tests__/scene-bare-guid-refs-instantiate.test.ts +123 -0
  372. package/src/__tests__/scene-equirect-roundtrip.test.ts +103 -16
  373. package/src/__tests__/scene-instance-authoring.integration.test.ts +8 -0
  374. package/src/__tests__/scene-instance-bridge.integration.test.ts +1 -1
  375. package/src/__tests__/scene-instance-component.test.ts +1 -1
  376. package/src/__tests__/scene-mount-fixed-point.test.ts +257 -0
  377. package/src/__tests__/scene-mount-roundtrip.test.ts +987 -0
  378. package/src/__tests__/scene-mount-wrapper-roundtrip.test.ts +202 -0
  379. package/src/__tests__/scene-sugar-instantiate.test.ts +324 -0
  380. package/src/__tests__/serialize-mounts-roundtrip.test.ts +533 -0
  381. package/src/__tests__/serialize-scene-asset.test.ts +219 -22
  382. package/src/__tests__/shadow-caster-empty-schema.test.ts +3 -3
  383. package/src/__tests__/shadow-csm-cascade-loadop.test.ts +37 -17
  384. package/src/__tests__/shadow-csm-component.test.ts +3 -5
  385. package/src/__tests__/shadow-csm-extract.test.ts +2 -100
  386. package/src/__tests__/shadow-csm-orthoz.test.ts +2 -16
  387. package/src/__tests__/shadow-csm-runtime-vary.dawn.test.ts +19 -14
  388. package/src/__tests__/shadow-csm-tile-consistency.test.ts +32 -26
  389. package/src/__tests__/shadow-csm-ubo.dawn.test.ts +8 -49
  390. package/src/__tests__/shadow-csm-ubo.test.ts +3 -25
  391. package/src/__tests__/shadow-csm-viewport.browser.test.ts +1 -1
  392. package/src/__tests__/shadow-fields-observable.dawn.test.ts +67 -56
  393. package/src/__tests__/shadow-m1.dawn.test.ts +8 -9
  394. package/src/__tests__/shadow-mesh-ssbo-order.test.ts +11 -27
  395. package/src/__tests__/skin-errors.unit.test.ts +1 -1
  396. package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +7 -5
  397. package/src/__tests__/skylight-lazy-projection.test.ts +36 -15
  398. package/src/__tests__/sparse-tag-scene-roundtrip.test.ts +5 -5
  399. package/src/__tests__/sprite-cullmode-flip.dawn.test.ts +47 -64
  400. package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +12 -11
  401. package/src/__tests__/sprite-lit-extract-branch.test.ts +1 -1
  402. package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +1 -1
  403. package/src/__tests__/ssao-bgl.test.ts +16 -9
  404. package/src/__tests__/ssao-buffers.test.ts +2 -2
  405. package/src/__tests__/ssao-data.test.ts +2 -2
  406. package/src/__tests__/ssao-errors.test.ts +1 -1
  407. package/src/__tests__/ssao-passes.test.ts +64 -392
  408. package/src/__tests__/ssao-pipelines.test.ts +1 -1
  409. package/src/__tests__/ssao-uniform-layout.test.ts +8 -6
  410. package/src/__tests__/stencil-outline-pixel.dawn.test.ts +25 -17
  411. package/src/__tests__/swap-chain-format.unit.test.ts +5 -7
  412. package/src/__tests__/systems.unit.test.ts +536 -1326
  413. package/src/__tests__/template-game-default-api-contract.test.ts +362 -0
  414. package/src/__tests__/text.unit.test.ts +56 -33
  415. package/src/__tests__/tilemap-childed-despawn.test.ts +8 -14
  416. package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +8 -12
  417. package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +2 -1
  418. package/src/__tests__/tilemap-chunk-extract.test.ts +13 -17
  419. package/src/__tests__/tilemap-dirty-rebuild.test.ts +7 -11
  420. package/src/__tests__/tilemap-material-cache.test.ts +8 -13
  421. package/src/__tests__/tilemap-multi-atlas.test.ts +12 -32
  422. package/src/__tests__/tilemap-owner-boundary.unit.test.ts +5 -2
  423. package/src/__tests__/tilemap-region-pack.test.ts +8 -12
  424. package/src/__tests__/tilemap-spawn-flip-pivot.test.ts +8 -12
  425. package/src/__tests__/tilemap-uv-inset.test.ts +11 -14
  426. package/src/__tests__/tilemap-validate.test.ts +1 -1
  427. package/src/__tests__/tileset-asset-validate.test.ts +638 -0
  428. package/src/__tests__/transcode-fallback.unit.test.ts +207 -0
  429. package/src/__tests__/transform-hierarchy-pixel-diff.dawn.test.ts +36 -28
  430. package/src/__tests__/transient-fields-collect.test.ts +28 -21
  431. package/src/__tests__/transient-runtime-behavior.test.ts +227 -0
  432. package/src/__tests__/transparent-sort-tilemap-sprite-interleave.test.ts +4 -4
  433. package/src/__tests__/variant-selection.unit.test.ts +1 -1
  434. package/src/__tests__/video-extract-bindgroup.dawn.test.ts +89 -136
  435. package/src/__tests__/video-loader-consumption.test.ts +86 -0
  436. package/src/__tests__/video-loader-smoke.dawn.test.ts +60 -0
  437. package/src/__tests__/view-ubo-layout.browser.test.ts +0 -22
  438. package/src/__tests__/world-entity-key.test.ts +1 -1
  439. package/src/__tests__/world-scene-despawn.test.ts +1 -1
  440. package/src/__tests__/world-scene-instantiate.test.ts +2 -36
  441. package/src/__tests__/world-scene-nested.test.ts +1 -1
  442. package/src/__tests__/world-scene-override.test.ts +1 -1
  443. package/src/backend-selection.ts +69 -0
  444. package/src/collect-scene-asset.ts +28 -23
  445. package/src/components/__tests__/camera.test-d.ts +1 -1
  446. package/src/components/__tests__/camera.test.ts +1 -1
  447. package/src/components/__tests__/sprite-animation.test-d.ts +2 -2
  448. package/src/components/__tests__/tile-layer.test-d.ts +1 -1
  449. package/src/components/__tests__/tile-layer.unit.test.ts +2 -2
  450. package/src/createRenderer.ts +24 -36
  451. package/src/errors/environment.ts +1 -1
  452. package/src/index.ts +47 -113
  453. package/src/renderer-host.ts +33 -0
  454. package/src/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.ts +1 -1
  455. package/src/scene-instances/index.ts +4 -0
  456. package/src/scene-utils/mount-override-fold.ts +3 -7
  457. package/src/systems/__tests__/transparent-sort.bench.ts +3 -3
  458. package/src/systems/sprite-animation-tick.ts +1 -1
  459. package/src/systems/transparent-sort.ts +38 -38
  460. package/src/tilemap-register-validate.ts +4 -4
  461. package/dist/__tests__/bind-group-cache-binding.test.d.ts +0 -2
  462. package/dist/__tests__/bind-group-cache-binding.test.d.ts.map +0 -1
  463. package/dist/__tests__/bind-group-cache-frame.test.d.ts +0 -2
  464. package/dist/__tests__/bind-group-cache-frame.test.d.ts.map +0 -1
  465. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts +0 -2
  466. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts.map +0 -1
  467. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts +0 -2
  468. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts.map +0 -1
  469. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts +0 -2
  470. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts.map +0 -1
  471. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts +0 -2
  472. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts.map +0 -1
  473. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts +0 -2
  474. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts.map +0 -1
  475. package/dist/__tests__/fog-producer-manifest.d.ts +0 -131
  476. package/dist/__tests__/fog-producer-manifest.d.ts.map +0 -1
  477. package/dist/__tests__/fog-producer-pixel-probe.d.ts +0 -42
  478. package/dist/__tests__/fog-producer-pixel-probe.d.ts.map +0 -1
  479. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts +0 -2
  480. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts.map +0 -1
  481. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts +0 -2
  482. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts.map +0 -1
  483. package/dist/__tests__/fog-producer-real-fixture.d.ts +0 -5
  484. package/dist/__tests__/fog-producer-real-fixture.d.ts.map +0 -1
  485. package/dist/__tests__/fog-producer-vfx-effect.d.ts +0 -3
  486. package/dist/__tests__/fog-producer-vfx-effect.d.ts.map +0 -1
  487. package/dist/__tests__/fog-scene-asset.integration.test.d.ts +0 -2
  488. package/dist/__tests__/fog-scene-asset.integration.test.d.ts.map +0 -1
  489. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts +0 -2
  490. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts.map +0 -1
  491. package/dist/__tests__/gpu-resource.test.d.ts +0 -2
  492. package/dist/__tests__/gpu-resource.test.d.ts.map +0 -1
  493. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts +0 -2
  494. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts.map +0 -1
  495. package/dist/__tests__/hdrp-buffers.unit.test.d.ts +0 -2
  496. package/dist/__tests__/hdrp-buffers.unit.test.d.ts.map +0 -1
  497. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts +0 -2
  498. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts.map +0 -1
  499. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts +0 -2
  500. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts.map +0 -1
  501. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts +0 -2
  502. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts.map +0 -1
  503. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts +0 -2
  504. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts.map +0 -1
  505. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts +0 -2
  506. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts.map +0 -1
  507. package/dist/__tests__/helpers/primitive-world.d.ts +0 -8
  508. package/dist/__tests__/helpers/primitive-world.d.ts.map +0 -1
  509. package/dist/__tests__/helpers/render-asset-port.d.ts +0 -15
  510. package/dist/__tests__/helpers/render-asset-port.d.ts.map +0 -1
  511. package/dist/__tests__/helpers/scene-asset-port.d.ts +0 -9
  512. package/dist/__tests__/helpers/scene-asset-port.d.ts.map +0 -1
  513. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts +0 -2
  514. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts.map +0 -1
  515. package/dist/__tests__/pipeline-layout-selection.test.d.ts +0 -2
  516. package/dist/__tests__/pipeline-layout-selection.test.d.ts.map +0 -1
  517. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts +0 -2
  518. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts.map +0 -1
  519. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts +0 -2
  520. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts.map +0 -1
  521. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts +0 -2
  522. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts.map +0 -1
  523. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts +0 -2
  524. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts.map +0 -1
  525. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts +0 -2
  526. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts.map +0 -1
  527. package/dist/__tests__/shadow-csm-pssm.test.d.ts +0 -2
  528. package/dist/__tests__/shadow-csm-pssm.test.d.ts.map +0 -1
  529. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts +0 -2
  530. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts.map +0 -1
  531. package/dist/__tests__/shadow-csm-viewport.test.d.ts +0 -2
  532. package/dist/__tests__/shadow-csm-viewport.test.d.ts.map +0 -1
  533. package/dist/__tests__/shadow-m2.dawn.test.d.ts +0 -2
  534. package/dist/__tests__/shadow-m2.dawn.test.d.ts.map +0 -1
  535. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts +0 -2
  536. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts.map +0 -1
  537. package/dist/__tests__/shadow-m3-calibrate.d.ts +0 -83
  538. package/dist/__tests__/shadow-m3-calibrate.d.ts.map +0 -1
  539. package/dist/__tests__/shadow-m3.dawn.test.d.ts +0 -2
  540. package/dist/__tests__/shadow-m3.dawn.test.d.ts.map +0 -1
  541. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts +0 -2
  542. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts.map +0 -1
  543. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts +0 -2
  544. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts.map +0 -1
  545. package/dist/__tests__/temporal-off-path.unit.test.d.ts +0 -2
  546. package/dist/__tests__/temporal-off-path.unit.test.d.ts.map +0 -1
  547. package/dist/__tests__/video-cache-regression.unit.test.d.ts +0 -2
  548. package/dist/__tests__/video-cache-regression.unit.test.d.ts.map +0 -1
  549. package/dist/asset-kind.d.ts +0 -4
  550. package/dist/asset-kind.d.ts.map +0 -1
  551. package/dist/errors/sprite-animation.d.ts +0 -3
  552. package/dist/errors/sprite-animation.d.ts.map +0 -1
  553. package/dist/scene-asset-port.d.ts +0 -17
  554. package/dist/scene-asset-port.d.ts.map +0 -1
  555. package/dist/scene-collect-errors.d.ts +0 -22
  556. package/dist/scene-collect-errors.d.ts.map +0 -1
  557. package/dist/shadow-m3-calibrate.d.ts +0 -40
  558. package/dist/shadow-m3-calibrate.d.ts.map +0 -1
  559. package/src/__tests__/bind-group-cache-binding.test.ts +0 -2513
  560. package/src/__tests__/bind-group-cache-frame.test.ts +0 -1511
  561. package/src/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.ts +0 -204
  562. package/src/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.ts +0 -297
  563. package/src/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.ts +0 -271
  564. package/src/__tests__/dispatch-fullscreen-pass-params.unit.test.ts +0 -321
  565. package/src/__tests__/fog-producer-manifest.ts +0 -162
  566. package/src/__tests__/fog-producer-pixel-probe.ts +0 -263
  567. package/src/__tests__/fog-producer-pixel.browser.test.ts +0 -26
  568. package/src/__tests__/fog-producer-pixel.dawn.test.ts +0 -55
  569. package/src/__tests__/fog-producer-real-fixture.ts +0 -805
  570. package/src/__tests__/fog-producer-vfx-effect.ts +0 -272
  571. package/src/__tests__/fog-scene-asset.integration.test.ts +0 -123
  572. package/src/__tests__/gpu-resource-store-cubemap-status.test.ts +0 -207
  573. package/src/__tests__/gpu-resource.test.ts +0 -1206
  574. package/src/__tests__/hdrp-bgl-slots.browser.test.ts +0 -50
  575. package/src/__tests__/hdrp-buffers.unit.test.ts +0 -70
  576. package/src/__tests__/hdrp-execute-filter.unit.test.ts +0 -200
  577. package/src/__tests__/hdrp-gbuffer-attachments.browser.test.ts +0 -64
  578. package/src/__tests__/hdrp-pipeline-asset-type.test-d.ts +0 -139
  579. package/src/__tests__/hdrp-ssao-boundary.test.ts +0 -237
  580. package/src/__tests__/hdrp-ssao-falsification.test.ts +0 -289
  581. package/src/__tests__/helpers/primitive-world.ts +0 -91
  582. package/src/__tests__/helpers/render-asset-port.ts +0 -65
  583. package/src/__tests__/helpers/scene-asset-port.ts +0 -23
  584. package/src/__tests__/material-derived-coordinates.integration.test.ts +0 -100
  585. package/src/__tests__/pipeline-layout-selection.test.ts +0 -298
  586. package/src/__tests__/post-process-reads-narrowing.test-d.ts +0 -52
  587. package/src/__tests__/post-process-register-roundtrip.dawn.test.ts +0 -230
  588. package/src/__tests__/render-feature-zero-feature.browser.test.ts +0 -152
  589. package/src/__tests__/render-pipeline-trivial.dawn.test.ts +0 -525
  590. package/src/__tests__/shadow-csm-caster-membership.test.ts +0 -232
  591. package/src/__tests__/shadow-csm-pssm.test.ts +0 -142
  592. package/src/__tests__/shadow-csm-temporal.browser.test.ts +0 -145
  593. package/src/__tests__/shadow-csm-viewport.test.ts +0 -74
  594. package/src/__tests__/shadow-m2.dawn.test.ts +0 -394
  595. package/src/__tests__/shadow-m3-calibrate-run.dawn.test.ts +0 -248
  596. package/src/__tests__/shadow-m3-calibrate.ts +0 -203
  597. package/src/__tests__/shadow-m3.dawn.test.ts +0 -288
  598. package/src/__tests__/shadow-probe-control-flow.dawn.test.ts +0 -264
  599. package/src/__tests__/shadow-quality-metrics.dawn.test.ts +0 -324
  600. package/src/__tests__/temporal-off-path.unit.test.ts +0 -69
  601. package/src/__tests__/video-cache-regression.unit.test.ts +0 -186
  602. package/src/asset-kind.ts +0 -7
  603. package/src/errors/sprite-animation.ts +0 -5
  604. package/src/scene-asset-port.ts +0 -32
  605. package/src/scene-collect-errors.ts +0 -30
  606. package/src/shadow-m3-calibrate.ts +0 -171
@@ -1,3 +1,5 @@
1
+ import * as SceneOwner from '@forgeax/engine-scene';
2
+
1
3
  // M2 test -- rootsToSceneAsset forest entry + schema-derived field conversion
2
4
  // (plan-strategy D-1/D-2/D-4/D-7/D-8).
3
5
  //
@@ -8,26 +10,45 @@
8
10
  // m2-t4: root ChildOf strip + cross-root closure refs (AC-09/10)
9
11
  // m2-t5: out-of-bounds fail-fast + GUID unresolved fail-fast + exhaustive switch (AC-11/12/17)
10
12
 
11
- import { defineComponent, type EntityHandle, World } from '@forgeax/engine-ecs';
12
- import { AssetGuid } from '@forgeax/engine-pack/guid';
13
+ import { AnimationPlayer } from '@forgeax/engine-animation';
14
+ import type { Asset } from '@forgeax/engine-assets-runtime';
13
15
  import {
16
+ AssetRegistry,
17
+ resolveAssetHandle,
14
18
  SceneCollectAssetGuidUnresolvedError,
15
19
  SceneCollectEntityRefOutOfClosureError,
16
- } from '@forgeax/engine-runtime';
17
- import type { Asset } from '@forgeax/engine-types';
18
- import { describe, expect, it } from 'vitest';
19
- import { rootsToSceneAsset } from '../collect-scene-asset';
20
- import '@forgeax/engine-render/internal';
20
+ } from '@forgeax/engine-assets-runtime';
21
+ import { defineComponent, type EntityHandle, World } from '@forgeax/engine-ecs';
22
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
23
+ import { SceneInstance } from '@forgeax/engine-render';
21
24
  import { ChildOf } from '@forgeax/engine-scene';
25
+ import type { Handle, SceneAsset } from '@forgeax/engine-types';
26
+ import { describe, expect, it } from 'vitest';
27
+ import { rootsToSceneAsset, serializeSceneAssetToPack } from '../collect-scene-asset';
28
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
22
29
  import { registerSceneComponents } from './helpers/register-scene-components';
23
- import { createTestSceneAssetStore, type TestSceneAssetStore } from './helpers/scene-asset-port';
30
+
31
+ function linkChildren(
32
+ world: World,
33
+ parent: EntityHandle,
34
+ children: readonly (EntityHandle | number)[],
35
+ ): void {
36
+ registerSceneComponents(world);
37
+ for (const child of children) {
38
+ const result = world.addComponent(child as EntityHandle, {
39
+ component: ChildOf,
40
+ data: { parent },
41
+ });
42
+ if (!result.ok) throw new Error(result.error.code);
43
+ }
44
+ }
24
45
 
25
46
  // ═══════════════════════════════════════════════════════════════════════════════
26
47
  // Helpers
27
48
  // ═══════════════════════════════════════════════════════════════════════════════
28
49
 
29
- function makeRegistry(): TestSceneAssetStore {
30
- return createTestSceneAssetStore();
50
+ function makeRegistry(): AssetRegistry {
51
+ return new AssetRegistry(makeMockShaderRegistry());
31
52
  }
32
53
 
33
54
  function makePayload(kind: Asset['kind']): Asset {
@@ -40,7 +61,7 @@ const Tag = defineComponent('Tag', { value: 'f32' });
40
61
  /** Spawn an entity with a component; return raw id. */
41
62
  // biome-ignore lint/suspicious/noExplicitAny: test helper bridging typed component tokens to World.spawn
42
63
  function s(w: World, comp: any, data: any): number {
43
- registerSceneComponents(w, [Tag, Test_EntityRef, Test_EntityArray, comp]);
64
+ registerSceneComponents(w, [comp]);
44
65
  // biome-ignore lint/suspicious/noExplicitAny: test helper adapter for World.spawn overload
45
66
  const r = w.spawn({ component: comp, data } as any);
46
67
  if (!r.ok) throw new Error('spawn failed');
@@ -73,21 +94,12 @@ describe('m2-t1: forest multi-root BFS closure + localId renumbering', () => {
73
94
  const e5 = stag(world, 5);
74
95
 
75
96
  // Tree A: e0 -> e1 -> e2
76
- world.addComponent(e1 as EntityHandle, {
77
- component: ChildOf,
78
- data: { parent: e0 as EntityHandle },
79
- });
80
- world.addComponent(e2 as EntityHandle, {
81
- component: ChildOf,
82
- data: { parent: e1 as EntityHandle },
83
- });
97
+ linkChildren(world, e0 as EntityHandle, [e1 as EntityHandle]);
98
+ linkChildren(world, e1 as EntityHandle, [e2 as EntityHandle]);
84
99
  // Tree C: e4 -> e5
85
- world.addComponent(e5 as EntityHandle, {
86
- component: ChildOf,
87
- data: { parent: e4 as EntityHandle },
88
- });
100
+ linkChildren(world, e4 as EntityHandle, [e5 as EntityHandle]);
89
101
 
90
- const result = rootsToSceneAsset(reg.port, world, [
102
+ const result = rootsToSceneAsset(reg, world, [
91
103
  e0 as EntityHandle,
92
104
  e3 as EntityHandle,
93
105
  e4 as EntityHandle,
@@ -104,20 +116,11 @@ describe('m2-t1: forest multi-root BFS closure + localId renumbering', () => {
104
116
  const e1 = stag(world, 1);
105
117
  const e2 = stag(world, 2);
106
118
  const e3 = stag(world, 3);
107
- world.addComponent(e1 as EntityHandle, {
108
- component: ChildOf,
109
- data: { parent: e0 as EntityHandle },
110
- });
111
- world.addComponent(e2 as EntityHandle, {
112
- component: ChildOf,
113
- data: { parent: e1 as EntityHandle },
114
- });
115
- world.addComponent(e3 as EntityHandle, {
116
- component: ChildOf,
117
- data: { parent: e2 as EntityHandle },
118
- });
119
+ linkChildren(world, e0 as EntityHandle, [e1 as EntityHandle]);
120
+ linkChildren(world, e1 as EntityHandle, [e2 as EntityHandle]);
121
+ linkChildren(world, e2 as EntityHandle, [e3 as EntityHandle]);
119
122
 
120
- const result = rootsToSceneAsset(reg.port, world, [e0 as EntityHandle, e1 as EntityHandle]);
123
+ const result = rootsToSceneAsset(reg, world, [e0 as EntityHandle, e1 as EntityHandle]);
121
124
  expect(result.ok).toBe(true);
122
125
  if (!result.ok) return;
123
126
  expect(result.value.entities).toHaveLength(4);
@@ -131,24 +134,11 @@ describe('m2-t1: forest multi-root BFS closure + localId renumbering', () => {
131
134
  const e2 = stag(world, 2);
132
135
  const e3 = stag(world, 3);
133
136
  const e4 = stag(world, 4);
134
- world.addComponent(e1 as EntityHandle, {
135
- component: ChildOf,
136
- data: { parent: e0 as EntityHandle },
137
- });
138
- world.addComponent(e2 as EntityHandle, {
139
- component: ChildOf,
140
- data: { parent: e0 as EntityHandle },
141
- });
142
- world.addComponent(e3 as EntityHandle, {
143
- component: ChildOf,
144
- data: { parent: e1 as EntityHandle },
145
- });
146
- world.addComponent(e4 as EntityHandle, {
147
- component: ChildOf,
148
- data: { parent: e2 as EntityHandle },
149
- });
137
+ linkChildren(world, e0 as EntityHandle, [e1 as EntityHandle, e2 as EntityHandle]);
138
+ linkChildren(world, e1 as EntityHandle, [e3 as EntityHandle]);
139
+ linkChildren(world, e2 as EntityHandle, [e4 as EntityHandle]);
150
140
 
151
- const result = rootsToSceneAsset(reg.port, world, [e0 as EntityHandle]);
141
+ const result = rootsToSceneAsset(reg, world, [e0 as EntityHandle]);
152
142
  expect(result.ok).toBe(true);
153
143
  if (!result.ok) return;
154
144
  const scene = result.value;
@@ -161,7 +151,7 @@ describe('m2-t1: forest multi-root BFS closure + localId renumbering', () => {
161
151
  it('empty roots produces empty SceneAsset (no error)', () => {
162
152
  const world = new World();
163
153
  const reg = makeRegistry();
164
- const result = rootsToSceneAsset(reg.port, world, []);
154
+ const result = rootsToSceneAsset(reg, world, []);
165
155
  expect(result.ok).toBe(true);
166
156
  if (!result.ok) return;
167
157
  expect(result.value.entities).toHaveLength(0);
@@ -179,12 +169,9 @@ describe('m2-t2: entity / array<entity> -> localId', () => {
179
169
 
180
170
  const r0 = stag(world, 0);
181
171
  const r1 = s(world, Test_EntityRef, { target: r0 });
182
- world.addComponent(r1 as EntityHandle, {
183
- component: ChildOf,
184
- data: { parent: r0 as EntityHandle },
185
- });
172
+ linkChildren(world, r0 as EntityHandle, [r1 as EntityHandle]);
186
173
 
187
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
174
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
188
175
  expect(result.ok).toBe(true);
189
176
  if (!result.ok) return;
190
177
  const scene = result.value;
@@ -206,21 +193,15 @@ describe('m2-t2: entity / array<entity> -> localId', () => {
206
193
  const r0 = stag(world, 0);
207
194
  const r1 = stag(world, 1);
208
195
  const r2 = stag(world, 2);
209
- world.addComponent(r1 as EntityHandle, {
210
- component: ChildOf,
211
- data: { parent: r0 as EntityHandle },
212
- });
213
- world.addComponent(r2 as EntityHandle, {
214
- component: ChildOf,
215
- data: { parent: r0 as EntityHandle },
216
- });
196
+ linkChildren(world, r0 as EntityHandle, [r1 as EntityHandle, r2 as EntityHandle]);
197
+ registerSceneComponents(world, [Test_EntityArray]);
217
198
  world.addComponent(r0 as EntityHandle, {
218
199
  component: Test_EntityArray,
219
200
  // biome-ignore lint/suspicious/noExplicitAny: entity handle arrays typed as EntityHandle[]; data schema matches component definition
220
201
  data: { targets: [r1 as EntityHandle, r2 as EntityHandle] } as any,
221
202
  });
222
203
 
223
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
204
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
224
205
  expect(result.ok).toBe(true);
225
206
  if (!result.ok) return;
226
207
  const scene = result.value;
@@ -248,7 +229,7 @@ describe('m2-t3: shared<> / array<shared<>> -> GUID', () => {
248
229
  const reg = makeRegistry();
249
230
  const guid = AssetGuid.parse('d0000000-d000-0000-0000-000000000001');
250
231
  if (!guid.ok) throw new Error('guid parse failed');
251
- reg.add(guid.value, assetPayload);
232
+ reg.catalog(guid.value, assetPayload);
252
233
 
253
234
  const world = new World();
254
235
  const handle = world.allocSharedRef('', assetPayload);
@@ -263,7 +244,7 @@ describe('m2-t3: shared<> / array<shared<>> -> GUID', () => {
263
244
  // biome-ignore lint/suspicious/noExplicitAny: Handle<> branded type is not directly assignable to component data field for schema 'shared<>'
264
245
  } as any);
265
246
 
266
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
247
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
267
248
  expect(result.ok).toBe(true);
268
249
  if (!result.ok) return;
269
250
  const scene = result.value;
@@ -283,8 +264,8 @@ describe('m2-t3: shared<> / array<shared<>> -> GUID', () => {
283
264
  const guidA = AssetGuid.parse('d0000000-d000-0000-0000-000000000001');
284
265
  const guidB = AssetGuid.parse('e0000000-e000-0000-0000-000000000001');
285
266
  if (!guidA.ok || !guidB.ok) throw new Error('guid parse failed');
286
- reg.add(guidA.value, assetA);
287
- reg.add(guidB.value, assetB);
267
+ reg.catalog(guidA.value, assetA);
268
+ reg.catalog(guidB.value, assetB);
288
269
 
289
270
  const world = new World();
290
271
  const hA = world.allocSharedRef('', assetA);
@@ -301,7 +282,7 @@ describe('m2-t3: shared<> / array<shared<>> -> GUID', () => {
301
282
  // biome-ignore lint/suspicious/noExplicitAny: test helper adapter for component spawn
302
283
  } as any);
303
284
 
304
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
285
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
305
286
  expect(result.ok).toBe(true);
306
287
  if (!result.ok) return;
307
288
  const scene = result.value;
@@ -339,7 +320,7 @@ describe('m2-t3: shared<> / array<shared<>> -> GUID', () => {
339
320
  // biome-ignore lint/suspicious/noExplicitAny: test helper adapter for component spawn
340
321
  } as any);
341
322
 
342
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
323
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
343
324
  expect(result.ok).toBe(true);
344
325
  if (!result.ok) return;
345
326
  const ent0 = result.value.entities[0];
@@ -359,7 +340,7 @@ describe('m2-t3: shared<> / array<shared<>> -> GUID', () => {
359
340
  const reg = makeRegistry();
360
341
  const world = new World();
361
342
  const uncataloged = makePayload('material');
362
- // allocSharedRef WITHOUT reg.add(...) -- the exact old bug shape.
343
+ // allocSharedRef WITHOUT reg.catalog(...) -- the exact old bug shape.
363
344
  const h = world.allocSharedRef('', uncataloged);
364
345
 
365
346
  const Test_HasSharedArray = defineComponent('Test_UncatMaterials', {
@@ -372,10 +353,10 @@ describe('m2-t3: shared<> / array<shared<>> -> GUID', () => {
372
353
  // biome-ignore lint/suspicious/noExplicitAny: test helper adapter for component spawn
373
354
  } as any);
374
355
 
375
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
356
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
376
357
  expect(result.ok).toBe(false);
377
358
  if (!result.ok) {
378
- expect(result.error.code).toBe('scene-collect-asset-guid-unresolved');
359
+ expect(result.error).toBeInstanceOf(SceneCollectAssetGuidUnresolvedError);
379
360
  }
380
361
  });
381
362
 
@@ -406,7 +387,7 @@ describe('m2-t3: shared<> / array<shared<>> -> GUID', () => {
406
387
  // Spawn WITHOUT setting `ref` -- it defaults to slot 0 (NULL sentinel).
407
388
  const r0 = s(world, Test_UnsetScalar, { tag: 42 });
408
389
 
409
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
390
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
410
391
  expect(result.ok).toBe(true);
411
392
  if (!result.ok) return;
412
393
  const ent0 = result.value.entities[0];
@@ -428,7 +409,7 @@ describe('m2-t3: shared<> / array<shared<>> -> GUID', () => {
428
409
  const reg = makeRegistry();
429
410
  const guidA = AssetGuid.parse('d0000000-d000-0000-0000-000000000009');
430
411
  if (!guidA.ok) throw new Error('guid parse failed');
431
- reg.add(guidA.value, assetA);
412
+ reg.catalog(guidA.value, assetA);
432
413
 
433
414
  const world = new World();
434
415
  const hA = world.allocSharedRef('', assetA);
@@ -445,7 +426,7 @@ describe('m2-t3: shared<> / array<shared<>> -> GUID', () => {
445
426
  // biome-ignore lint/suspicious/noExplicitAny: test helper adapter for component spawn
446
427
  } as any);
447
428
 
448
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
429
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
449
430
  expect(result.ok).toBe(true);
450
431
  if (!result.ok) return;
451
432
  const ent0 = result.value.entities[0];
@@ -475,7 +456,7 @@ describe('m2-t4: root ChildOf strip + cross-root closure refs', () => {
475
456
  const parent = stag(world, 99);
476
457
  const r0 = s(world, ChildOf, { parent: parent as EntityHandle });
477
458
 
478
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
459
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
479
460
  expect(result.ok).toBe(true);
480
461
  if (!result.ok) return;
481
462
  const scene = result.value;
@@ -494,15 +475,9 @@ describe('m2-t4: root ChildOf strip + cross-root closure refs', () => {
494
475
  const bRoot = stag(world, 1);
495
476
  const aChild = s(world, Test_EntityRef, { target: bRoot });
496
477
 
497
- world.addComponent(aChild as EntityHandle, {
498
- component: ChildOf,
499
- data: { parent: aRoot as EntityHandle },
500
- });
478
+ linkChildren(world, aRoot as EntityHandle, [aChild as EntityHandle]);
501
479
 
502
- const result = rootsToSceneAsset(reg.port, world, [
503
- aRoot as EntityHandle,
504
- bRoot as EntityHandle,
505
- ]);
480
+ const result = rootsToSceneAsset(reg, world, [aRoot as EntityHandle, bRoot as EntityHandle]);
506
481
  expect(result.ok).toBe(true);
507
482
  if (!result.ok) return;
508
483
  const scene = result.value;
@@ -535,7 +510,7 @@ describe('m2-t5: fail-fast error paths + exhaustive switch', () => {
535
510
  const external = stag(world, 99);
536
511
  const r0 = s(world, Test_EntityRef, { target: external });
537
512
 
538
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
513
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
539
514
  expect(result.ok).toBe(false);
540
515
 
541
516
  if (!result.ok) {
@@ -565,7 +540,7 @@ describe('m2-t5: fail-fast error paths + exhaustive switch', () => {
565
540
  src: handle as any,
566
541
  });
567
542
 
568
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
543
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
569
544
  expect(result.ok).toBe(false);
570
545
 
571
546
  if (!result.ok) {
@@ -584,7 +559,7 @@ describe('m2-t5: fail-fast error paths + exhaustive switch', () => {
584
559
  const external = stag(world, 99);
585
560
  const r0 = s(world, Test_EntityRef, { target: external });
586
561
 
587
- const result = rootsToSceneAsset(reg.port, world, [r0 as EntityHandle]);
562
+ const result = rootsToSceneAsset(reg, world, [r0 as EntityHandle]);
588
563
  expect(result.ok).toBe(false);
589
564
 
590
565
  if (!result.ok) {
@@ -603,3 +578,134 @@ describe('m2-t5: fail-fast error paths + exhaustive switch', () => {
603
578
  });
604
579
 
605
580
  // ═══════════════════════════════════════════════════════════════════════════════
581
+ // w19 — AC-07: end-to-end round-trip value equivalence
582
+ //
583
+ // The runtime synthesis of D-2 (GUID domain closed in assets-runtime) + D-3
584
+ // (collect fold) + D-4 (add-or-patch value gate). Mount a GLB-like child scene
585
+ // under a parent, addComponent(AnimationPlayer, { clips: [clipHandle] }) on a
586
+ // live member, save (rootsToSceneAsset + serialize), reopen (parse + instantiate),
587
+ // and assert the reopened member holds AnimationPlayer whose clip is a VALID
588
+ // handle that resolveAssetHandle retrieves to the SAME clip asset (value
589
+ // equivalence, not merely length/presence).
590
+ // ═══════════════════════════════════════════════════════════════════════════════
591
+
592
+ const W19_CLIP = 'aa19aa19-1919-4191-8191-191919191919';
593
+ const W19_CHILD = 'bb19bb19-1919-4191-8191-191919191919';
594
+ const W19_PARENT = 'cc19cc19-1919-4191-8191-191919191919';
595
+ const W19_SAVED = 'dd19dd19-1919-4191-8191-191919191919';
596
+
597
+ function pgc(s: string): AssetGuid {
598
+ const r = AssetGuid.parse(s);
599
+ if (!r.ok) throw new Error(`bad GUID: ${s}`);
600
+ return r.value;
601
+ }
602
+
603
+ function accessParse(reg: AssetRegistry) {
604
+ const internal = reg as unknown as {
605
+ parseAssetPayload(kind: string, payload: Record<string, unknown>, refs?: string[]): unknown;
606
+ };
607
+ return (
608
+ kind: string,
609
+ payload: Record<string, unknown>,
610
+ refs?: readonly string[] | undefined,
611
+ ): SceneAsset => {
612
+ const r = internal.parseAssetPayload(kind, payload, refs as string[] | undefined);
613
+ if (r === undefined) throw new Error('parse returned undefined');
614
+ return r as SceneAsset;
615
+ };
616
+ }
617
+
618
+ function findMember(w: World, root: EntityHandle): EntityHandle {
619
+ for (const c of w.iterDescendants(root)) {
620
+ if (c === root) continue;
621
+ if (!w.get(c, SceneInstance).ok) continue;
622
+ const st = SceneOwner.worldGetSceneInstanceState(w, c);
623
+ if (!st.ok) continue;
624
+ for (const [member] of st.value.entityToLocalId) return member;
625
+ }
626
+ throw new Error('no mounted member');
627
+ }
628
+
629
+ describe('w19 — end-to-end round-trip value equivalence (AC-07)', () => {
630
+ it('mount + addComponent(AnimationPlayer) survives save/reopen with value-equal clip', () => {
631
+ const reg = makeRegistry();
632
+ const w = new World();
633
+ registerSceneComponents(w, [AnimationPlayer]);
634
+
635
+ // Catalogue the clip asset that the AnimationPlayer will reference.
636
+ const clipAsset = { kind: 'animation-clip', duration: 1.5 } as unknown as Asset;
637
+ reg.catalog(pgc(W19_CLIP), clipAsset);
638
+
639
+ // Child (GLB-like) scene + parent scene that mounts it.
640
+ const child: SceneAsset = {
641
+ kind: 'scene',
642
+ entities: [{ localId: 0 as never, components: { Transform: { pos: [1, 0, 0] } } }],
643
+ };
644
+ reg.catalog(pgc(W19_CHILD), child as Asset);
645
+ const parent: SceneAsset = {
646
+ kind: 'scene',
647
+ entities: [{ localId: 0 as never, components: { Transform: { pos: [0, 0, 0] } } }],
648
+ mounts: [{ localId: 1 as never, source: W19_CHILD, memberFirst: 2 as never, memberCount: 1 }],
649
+ };
650
+ reg.catalog(pgc(W19_PARENT), parent as Asset);
651
+
652
+ const inst = reg.instantiate(
653
+ w.allocSharedRef('SceneAsset', parent) as Handle<'SceneAsset', 'shared'>,
654
+ w,
655
+ );
656
+ expect(inst.ok).toBe(true);
657
+ if (!inst.ok) return;
658
+ const root = inst.value;
659
+
660
+ // addComponent AnimationPlayer with a handle pointing at the catalogued clip.
661
+ const clipH = w.allocSharedRef('AnimationClip', clipAsset);
662
+ const member = findMember(w, root);
663
+ const add = w.addComponent(member, {
664
+ component: AnimationPlayer,
665
+ data: { clips: [clipH] } as never,
666
+ });
667
+ expect(add.ok).toBe(true);
668
+
669
+ // Save: collect (fold) + serialize.
670
+ const collect = rootsToSceneAsset(reg, w, [root]);
671
+ expect(collect.ok).toBe(true);
672
+ if (!collect.ok) return;
673
+ const ser = serializeSceneAssetToPack(collect.value, w.components.entries(), W19_SAVED);
674
+ expect(ser.ok).toBe(true);
675
+ if (!ser.ok) return;
676
+
677
+ // Reopen: parse + catalog + instantiate.
678
+ const assets = ser.value.assets as Array<Record<string, unknown>>;
679
+ const a0 = assets[0];
680
+ if (!a0) throw new Error('no asset');
681
+ const parsed = accessParse(reg)(
682
+ 'scene',
683
+ a0.payload as Record<string, unknown>,
684
+ a0.refs as readonly string[] | undefined,
685
+ );
686
+ reg.catalog(pgc(W19_SAVED), parsed as Asset);
687
+ const inst2 = reg.instantiate(
688
+ w.allocSharedRef('SceneAsset', parsed) as Handle<'SceneAsset', 'shared'>,
689
+ w,
690
+ );
691
+ expect(inst2.ok).toBe(true);
692
+ if (!inst2.ok) return;
693
+ const root2 = inst2.value;
694
+
695
+ // Assert: reopened member holds AnimationPlayer with a valid, value-equal clip.
696
+ const member2 = findMember(w, root2);
697
+ const apRes = w.get(member2, AnimationPlayer);
698
+ expect(apRes.ok).toBe(true);
699
+ if (!apRes.ok) return;
700
+ const clips2 = Array.from((apRes.value as { clips: ArrayLike<number> }).clips);
701
+ // slot 0 is a valid (non-zero) handle.
702
+ expect(clips2[0]).toBeGreaterThan(0);
703
+ // resolveAssetHandle retrieves the SAME clip asset (value equivalence).
704
+ const resolved = resolveAssetHandle(w, clips2[0] as unknown as Handle<string, 'shared'>);
705
+ expect(resolved.ok).toBe(true);
706
+ if (!resolved.ok) return;
707
+ const retrieved = resolved.value as unknown as { kind: string; duration: number };
708
+ expect(retrieved.kind).toBe('animation-clip');
709
+ expect(retrieved.duration).toBe(1.5);
710
+ });
711
+ });