@forgeax/engine-runtime 0.1.4 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) hide show
  1. package/README.md +65 -83
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts +2 -0
  4. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts.map +1 -0
  5. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts +2 -0
  6. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts +2 -0
  8. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts.map +1 -0
  9. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts +11 -0
  10. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts.map +1 -0
  11. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts +2 -0
  12. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts.map +1 -0
  13. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts +2 -0
  14. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts.map +1 -0
  15. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts +2 -0
  16. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts.map +1 -0
  17. package/dist/__tests__/asset-registry-mounts.test.d.ts +2 -0
  18. package/dist/__tests__/asset-registry-mounts.test.d.ts.map +1 -0
  19. package/dist/__tests__/asset-registry.browser.test.d.ts +2 -0
  20. package/dist/__tests__/asset-registry.browser.test.d.ts.map +1 -0
  21. package/dist/__tests__/asset-registry.dawn.test.d.ts +2 -0
  22. package/dist/__tests__/asset-registry.dawn.test.d.ts.map +1 -0
  23. package/dist/__tests__/asset-registry.listCatalog.test.d.ts +2 -0
  24. package/dist/__tests__/asset-registry.listCatalog.test.d.ts.map +1 -0
  25. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts +2 -0
  26. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts.map +1 -0
  27. package/dist/__tests__/asset-registry.pack-cache.test.d.ts +2 -0
  28. package/dist/__tests__/asset-registry.pack-cache.test.d.ts.map +1 -0
  29. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts +2 -0
  30. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts.map +1 -0
  31. package/dist/__tests__/asset-registry.recursive.spec.d.ts +2 -0
  32. package/dist/__tests__/asset-registry.recursive.spec.d.ts.map +1 -0
  33. package/dist/__tests__/asset-registry.unit.test.d.ts +2 -0
  34. package/dist/__tests__/asset-registry.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/asset.unit.test.d.ts +2 -0
  36. package/dist/__tests__/asset.unit.test.d.ts.map +1 -0
  37. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts +2 -0
  38. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts.map +1 -0
  39. package/dist/__tests__/backend-selection.integration.test.d.ts +2 -0
  40. package/dist/__tests__/backend-selection.integration.test.d.ts.map +1 -0
  41. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts +2 -0
  42. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts.map +1 -0
  43. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts +2 -0
  44. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts.map +1 -0
  45. package/dist/__tests__/collect-scene-asset.test.d.ts +1 -2
  46. package/dist/__tests__/collect-scene-asset.test.d.ts.map +1 -1
  47. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts +2 -0
  48. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts.map +1 -0
  49. package/dist/__tests__/collect-transient-roundtrip.test.d.ts +1 -1
  50. package/dist/__tests__/collect-transient-roundtrip.test.d.ts.map +1 -1
  51. package/dist/__tests__/collect-transient-skip.test.d.ts +1 -2
  52. package/dist/__tests__/collect-transient-skip.test.d.ts.map +1 -1
  53. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts +2 -0
  54. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts.map +1 -0
  55. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts +2 -0
  56. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts.map +1 -0
  57. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts +2 -0
  58. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts.map +1 -0
  59. package/dist/__tests__/draw-published.d.ts +2 -2
  60. package/dist/__tests__/draw-published.d.ts.map +1 -1
  61. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts +2 -0
  62. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts.map +1 -0
  63. package/dist/__tests__/errors.unit.test.d.ts +2 -0
  64. package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
  65. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts +2 -0
  66. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts.map +1 -0
  67. package/dist/__tests__/fetch-binary-decompress.test.d.ts +2 -0
  68. package/dist/__tests__/fetch-binary-decompress.test.d.ts.map +1 -0
  69. package/dist/__tests__/four-path-compression.integration.test.d.ts +2 -0
  70. package/dist/__tests__/four-path-compression.integration.test.d.ts.map +1 -0
  71. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts +2 -0
  72. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts.map +1 -0
  73. package/dist/__tests__/guid-for-asset.unit.test.d.ts +2 -0
  74. package/dist/__tests__/guid-for-asset.unit.test.d.ts.map +1 -0
  75. package/dist/__tests__/handle-migration.test.d.ts +2 -0
  76. package/dist/__tests__/handle-migration.test.d.ts.map +1 -0
  77. package/dist/__tests__/helpers/register-runtime-components.d.ts.map +1 -1
  78. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts +2 -0
  79. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts.map +1 -0
  80. package/dist/__tests__/host-custom-kind-contract.test.d.ts +2 -0
  81. package/dist/__tests__/host-custom-kind-contract.test.d.ts.map +1 -0
  82. package/dist/__tests__/inspect-name.test.d.ts +2 -0
  83. package/dist/__tests__/inspect-name.test.d.ts.map +1 -0
  84. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts +2 -0
  85. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts.map +1 -0
  86. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts +2 -0
  87. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts.map +1 -0
  88. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts +2 -0
  89. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/loader-extract-graceful.test.d.ts +2 -0
  91. package/dist/__tests__/loader-extract-graceful.test.d.ts.map +1 -0
  92. package/dist/__tests__/loader-name-survival.test.d.ts +2 -0
  93. package/dist/__tests__/loader-name-survival.test.d.ts.map +1 -0
  94. package/dist/__tests__/mesh-bin-contract.test.d.ts +2 -0
  95. package/dist/__tests__/mesh-bin-contract.test.d.ts.map +1 -0
  96. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts +2 -0
  97. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts.map +1 -0
  98. package/dist/__tests__/mesh-bin.test.d.ts +2 -0
  99. package/dist/__tests__/mesh-bin.test.d.ts.map +1 -0
  100. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts +2 -0
  101. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts.map +1 -0
  102. package/dist/__tests__/new-kind-refs-contract.test.d.ts +2 -0
  103. package/dist/__tests__/new-kind-refs-contract.test.d.ts.map +1 -0
  104. package/dist/__tests__/package-promotion.test.d.ts +2 -0
  105. package/dist/__tests__/package-promotion.test.d.ts.map +1 -0
  106. package/dist/__tests__/package-rename.test.d.ts +2 -0
  107. package/dist/__tests__/package-rename.test.d.ts.map +1 -0
  108. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts +1 -1
  109. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts.map +1 -1
  110. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +1 -1
  111. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -1
  112. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts +10 -0
  113. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts.map +1 -0
  114. package/dist/__tests__/render-system-extract.unit.test.d.ts +2 -0
  115. package/dist/__tests__/render-system-extract.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/renderer-test-utils.d.ts +10 -0
  117. package/dist/__tests__/renderer-test-utils.d.ts.map +1 -0
  118. package/dist/__tests__/renderer.test-d.d.ts +2 -0
  119. package/dist/__tests__/renderer.test-d.d.ts.map +1 -0
  120. package/dist/__tests__/resolve-asset-handle-err.test.d.ts +2 -0
  121. package/dist/__tests__/resolve-asset-handle-err.test.d.ts.map +1 -0
  122. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts +2 -0
  123. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts.map +1 -0
  124. package/dist/__tests__/resolveName-fallback.test.d.ts +2 -0
  125. package/dist/__tests__/resolveName-fallback.test.d.ts.map +1 -0
  126. package/dist/__tests__/resolveName-null-package.test.d.ts +2 -0
  127. package/dist/__tests__/resolveName-null-package.test.d.ts.map +1 -0
  128. package/dist/__tests__/resolveName-unified-entry.test.d.ts +2 -0
  129. package/dist/__tests__/resolveName-unified-entry.test.d.ts.map +1 -0
  130. package/dist/__tests__/resolveName.test.d.ts +2 -0
  131. package/dist/__tests__/resolveName.test.d.ts.map +1 -0
  132. package/dist/__tests__/roots-to-scene-asset.test.d.ts +1 -1
  133. package/dist/__tests__/roots-to-scene-asset.test.d.ts.map +1 -1
  134. package/dist/__tests__/roundtrip-primitive.test.d.ts +2 -0
  135. package/dist/__tests__/roundtrip-primitive.test.d.ts.map +1 -0
  136. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts +2 -0
  137. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts.map +1 -0
  138. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts +2 -0
  139. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts.map +1 -0
  140. package/dist/__tests__/scene-mount-fixed-point.test.d.ts +2 -0
  141. package/dist/__tests__/scene-mount-fixed-point.test.d.ts.map +1 -0
  142. package/dist/__tests__/scene-mount-roundtrip.test.d.ts +2 -0
  143. package/dist/__tests__/scene-mount-roundtrip.test.d.ts.map +1 -0
  144. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts +2 -0
  145. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts.map +1 -0
  146. package/dist/__tests__/scene-sugar-instantiate.test.d.ts +2 -0
  147. package/dist/__tests__/scene-sugar-instantiate.test.d.ts.map +1 -0
  148. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts +2 -0
  149. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts.map +1 -0
  150. package/dist/__tests__/serialize-scene-asset.test.d.ts +1 -1
  151. package/dist/__tests__/serialize-scene-asset.test.d.ts.map +1 -1
  152. package/dist/__tests__/template-game-default-api-contract.test.d.ts +2 -0
  153. package/dist/__tests__/template-game-default-api-contract.test.d.ts.map +1 -0
  154. package/dist/__tests__/tileset-asset-validate.test.d.ts +2 -0
  155. package/dist/__tests__/tileset-asset-validate.test.d.ts.map +1 -0
  156. package/dist/__tests__/transcode-fallback.unit.test.d.ts +2 -0
  157. package/dist/__tests__/transcode-fallback.unit.test.d.ts.map +1 -0
  158. package/dist/__tests__/transient-runtime-behavior.test.d.ts +2 -0
  159. package/dist/__tests__/transient-runtime-behavior.test.d.ts.map +1 -0
  160. package/dist/__tests__/video-loader-consumption.test.d.ts +2 -0
  161. package/dist/__tests__/video-loader-consumption.test.d.ts.map +1 -0
  162. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts +2 -0
  163. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts.map +1 -0
  164. package/dist/backend-selection.d.ts +13 -0
  165. package/dist/backend-selection.d.ts.map +1 -0
  166. package/dist/collect-scene-asset.d.ts +7 -4
  167. package/dist/collect-scene-asset.d.ts.map +1 -1
  168. package/dist/createRenderer.d.ts +14 -2
  169. package/dist/createRenderer.d.ts.map +1 -1
  170. package/dist/errors/environment.d.ts +1 -1
  171. package/dist/errors/environment.d.ts.map +1 -1
  172. package/dist/index.d.ts +20 -82
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.mjs +107 -108
  175. package/dist/index.mjs.map +1 -1
  176. package/dist/renderer-host.d.ts +9 -0
  177. package/dist/renderer-host.d.ts.map +1 -0
  178. package/dist/renderer-host.mjs +62 -0
  179. package/dist/renderer-host.mjs.map +1 -0
  180. package/dist/scene-instances/index.d.ts +2 -0
  181. package/dist/scene-instances/index.d.ts.map +1 -0
  182. package/dist/scene-utils/mount-override-fold.d.ts +1 -2
  183. package/dist/scene-utils/mount-override-fold.d.ts.map +1 -1
  184. package/dist/systems/sprite-animation-tick.d.ts +1 -1
  185. package/dist/systems/sprite-animation-tick.d.ts.map +1 -1
  186. package/dist/systems/transparent-sort.d.ts +1 -2
  187. package/dist/systems/transparent-sort.d.ts.map +1 -1
  188. package/dist/tilemap-register-validate.d.ts.map +1 -1
  189. package/package.json +34 -33
  190. package/src/__tests__/active-camera.unit.test.ts +19 -9
  191. package/src/__tests__/animation-graph-collect-roundtrip.test.ts +213 -0
  192. package/src/__tests__/animation-graph-serialize.unit.test.ts +171 -0
  193. package/src/__tests__/append-injection.test.ts +1 -1
  194. package/src/__tests__/asset-brand-and-name-retirement.test.ts +102 -0
  195. package/src/__tests__/asset-error-exhaustive.test-d.ts +62 -0
  196. package/src/__tests__/asset-registry-guid-reverse.test.ts +608 -0
  197. package/src/__tests__/asset-registry-hdr-equirect.test.ts +78 -0
  198. package/src/__tests__/asset-registry-mesh-pack-payload.dawn.test.ts +232 -0
  199. package/src/__tests__/asset-registry-mounts.test.ts +806 -0
  200. package/src/__tests__/asset-registry.browser.test.ts +81 -0
  201. package/src/__tests__/asset-registry.dawn.test.ts +94 -0
  202. package/src/__tests__/asset-registry.listCatalog.test.ts +170 -0
  203. package/src/__tests__/asset-registry.mesh-bin.test.ts +316 -0
  204. package/src/__tests__/asset-registry.pack-cache.test.ts +969 -0
  205. package/src/__tests__/asset-registry.raw-container-failfast.test.ts +225 -0
  206. package/src/__tests__/asset-registry.recursive.spec.ts +1397 -0
  207. package/src/__tests__/asset-registry.unit.test.ts +1030 -0
  208. package/src/__tests__/asset.unit.test.ts +7107 -0
  209. package/src/__tests__/audio-load-by-guid.unit.test.ts +126 -0
  210. package/src/__tests__/backend-selection.integration.test.ts +11 -0
  211. package/src/__tests__/basis-catalog-dispatch.integration.test.ts +320 -0
  212. package/src/__tests__/bind-group-cache-keying.test.ts +4 -4
  213. package/src/__tests__/block-upload-math.unit.test.ts +2 -2
  214. package/src/__tests__/builtin-asset-registry.unit.test.ts +112 -0
  215. package/src/__tests__/builtin-shader-register-e2e.test.ts +1 -1
  216. package/src/__tests__/cache-false-eviction.test.ts +2 -1
  217. package/src/__tests__/cache-isolation-matrix.test.ts +2 -1
  218. package/src/__tests__/camera-clear-snapshot-equivalence.unit.test.ts +5 -6
  219. package/src/__tests__/clamp-to-last.e2e.browser.test.ts +29 -19
  220. package/src/__tests__/collect-scene-asset.test.ts +49 -52
  221. package/src/__tests__/collect-scene-mount-collapse.test.ts +391 -0
  222. package/src/__tests__/collect-subtree.unit.test.ts +1 -2
  223. package/src/__tests__/collect-transient-children-absent.test.ts +24 -10
  224. package/src/__tests__/collect-transient-roundtrip.test.ts +44 -20
  225. package/src/__tests__/collect-transient-skip.test.ts +24 -13
  226. package/src/__tests__/components.test-d.ts +1 -6
  227. package/src/__tests__/components.unit.test.ts +20 -19
  228. package/src/__tests__/composite-skybox-cross-world.browser.test.ts +59 -27
  229. package/src/__tests__/compressed-texture-physical-extent.integration.test.ts +139 -0
  230. package/src/__tests__/create-renderer-assembly.integration.test.ts +42 -29
  231. package/src/__tests__/createRenderer-dispose.test.ts +35 -402
  232. package/src/__tests__/createRenderer.browser-no-webgpu.test.ts +25 -30
  233. package/src/__tests__/createRenderer.unit.test.ts +1 -1
  234. package/src/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.ts +27 -63
  235. package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +56 -47
  236. package/src/__tests__/dawn/instances-per-instance-pbr.dawn.test.ts +49 -29
  237. package/src/__tests__/dawn/instances-shadow.dawn.test.ts +26 -15
  238. package/src/__tests__/dawn/instances-uniform-fallback.dawn.test.ts +13 -14
  239. package/src/__tests__/dawn/material-alpha.dawn.test.ts +23 -31
  240. package/src/__tests__/dawn/material-cooked-fixture.dawn.test.ts +24 -9
  241. package/src/__tests__/dawn/{mesh-update.dawn.test.ts → mesh-update-dawn.test.ts} +42 -134
  242. package/src/__tests__/dawn/mipmap-srgb-linear.dawn.test.ts +14 -7
  243. package/src/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.ts +16 -28
  244. package/src/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.ts +23 -39
  245. package/src/__tests__/dawn/upload-texture.dawn.test.ts +198 -0
  246. package/src/__tests__/dawn/user-handle-mesh-render.dawn.test.ts +12 -14
  247. package/src/__tests__/dawn/user-mesh-upload.dawn.test.ts +27 -22
  248. package/src/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.ts +25 -28
  249. package/src/__tests__/dawn/zero-manifest-ready.dawn.test.ts +10 -11
  250. package/src/__tests__/demo-sortscope-migration.unit.test.ts +5 -5
  251. package/src/__tests__/derive-bgl-integration.test.ts +34 -44
  252. package/src/__tests__/derive-render-data-skin.unit.test.ts +1 -1
  253. package/src/__tests__/draw-published.ts +11 -4
  254. package/src/__tests__/dynamic-texture-store.unit.test.ts +190 -0
  255. package/src/__tests__/equirect-bc6h.integration.test.ts +144 -21
  256. package/src/__tests__/errors.unit.test.ts +1227 -0
  257. package/src/__tests__/extract-frames-graceful-degradation.test.ts +3 -7
  258. package/src/__tests__/extract-frames-merge.test.ts +35 -22
  259. package/src/__tests__/extract-record-no-hardcoded-texture-fields.test.ts +5 -16
  260. package/src/__tests__/extract-skin-mismatch.unit.test.ts +322 -0
  261. package/src/__tests__/fetch-binary-decompress.test.ts +356 -0
  262. package/src/__tests__/four-path-compression.integration.test.ts +395 -0
  263. package/src/__tests__/frame-targets-shadow-regression.unit.test.ts +1 -1
  264. package/src/__tests__/fullscreen-feature-host.dawn.test.ts +80 -0
  265. package/src/__tests__/fullscreen-post-bgl-depth.test.ts +4 -2
  266. package/src/__tests__/fullscreen-post-depth-params-arity.test.ts +3 -3
  267. package/src/__tests__/fullscreen-post-process-pass.dawn.test.ts +39 -23
  268. package/src/__tests__/fullscreen-post-process-pass.unit.test.ts +4 -2
  269. package/src/__tests__/fxaa-pixel-diff.dawn.test.ts +28 -17
  270. package/src/__tests__/fxaa-validation-and-resize.dawn.test.ts +29 -18
  271. package/src/__tests__/fxaa-zero-overhead.dawn.test.ts +16 -12
  272. package/src/__tests__/geometry.unit.test.ts +525 -159
  273. package/src/__tests__/glyph-tilemap-worldid.test.ts +1 -1
  274. package/src/__tests__/gpu-resource-cow-survivor.test.ts +6 -4
  275. package/src/__tests__/guid-for-asset.unit.test.ts +102 -0
  276. package/src/__tests__/handle-migration.test.ts +136 -0
  277. package/src/__tests__/helpers/register-runtime-components.ts +4 -2
  278. package/src/__tests__/helpers/register-scene-components.ts +1 -1
  279. package/src/__tests__/host-custom-kind-contract.test-d.ts +47 -0
  280. package/src/__tests__/host-custom-kind-contract.test.ts +578 -0
  281. package/src/__tests__/inspect-name.test.ts +139 -0
  282. package/src/__tests__/instances.test-d.ts +1 -1
  283. package/src/__tests__/instantiate-mount-deferred-wiring.test.ts +112 -0
  284. package/src/__tests__/light-casters-9-light.browser.test.ts +73 -76
  285. package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +7 -10
  286. package/src/__tests__/light-snapshot.test-d.ts +2 -2
  287. package/src/__tests__/lights-vec-negative.unit.test.ts +1 -1
  288. package/src/__tests__/lights.unit.test.ts +31 -511
  289. package/src/__tests__/loadbyguid-payload.unit.test.ts +117 -0
  290. package/src/__tests__/loadbyguid-texture-intern.unit.test.ts +213 -0
  291. package/src/__tests__/loader-extract-graceful.test.ts +146 -0
  292. package/src/__tests__/loader-name-survival.test.ts +213 -0
  293. package/src/__tests__/m3-vec-negative.unit.test.ts +3 -2
  294. package/src/__tests__/material-texture-uv-scale.unit.test.ts +101 -31
  295. package/src/__tests__/materials.unit.test.ts +10 -27
  296. package/src/__tests__/mesh-bin-contract.test.ts +28 -0
  297. package/src/__tests__/mesh-bin-skin-roundtrip.unit.test.ts +149 -0
  298. package/src/__tests__/mesh-bin.test.ts +38 -0
  299. package/src/__tests__/mesh-loader-skin-contract.unit.test.ts +120 -0
  300. package/src/__tests__/mesh-ssbo-grow.unit.test.ts +3 -3
  301. package/src/__tests__/mip-gate.unit.test.ts +1 -1
  302. package/src/__tests__/msaa-sprite-pixel-diff.dawn.test.ts +29 -68
  303. package/src/__tests__/new-kind-refs-contract.test.ts +132 -0
  304. package/src/__tests__/node-shims.d.ts +4 -6
  305. package/src/__tests__/package-promotion.test.ts +88 -0
  306. package/src/__tests__/package-rename.test.ts +103 -0
  307. package/src/__tests__/pass-selector.unit.test.ts +2 -2
  308. package/src/__tests__/pbr-pipeline.unit.test.ts +21 -25
  309. package/src/__tests__/pipeline-builder-msaa.unit.test.ts +6 -9
  310. package/src/__tests__/pipeline-cache-keying.unit.test.ts +6 -9
  311. package/src/__tests__/pipeline-spec.test.ts +16 -177
  312. package/src/__tests__/pipeline.unit.test.ts +154 -1693
  313. package/src/__tests__/point-light-shadow.dawn.test.ts +33 -42
  314. package/src/__tests__/point-light-shadow.unit.test.ts +19 -60
  315. package/src/__tests__/post-process-error-codes.unit.test.ts +4 -1
  316. package/src/__tests__/post-process-params-component.unit.test.ts +1 -1
  317. package/src/__tests__/post-process-params-extract.unit.test.ts +2 -5
  318. package/src/__tests__/postprocess-camera-consistency.test.ts +4 -7
  319. package/src/__tests__/profiler-assembly.integration.test.ts +1 -1
  320. package/src/__tests__/propagate-transforms.dawn.test.ts +12 -11
  321. package/src/__tests__/record-worldid-isolation.test.ts +7 -29
  322. package/src/__tests__/recover-error-exhaustive.test-d.ts +1 -1
  323. package/src/__tests__/render-error-exhaustive.test-d.ts +117 -71
  324. package/src/__tests__/render-feature-assembly.test-d.ts +20 -9
  325. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +8 -6
  326. package/src/__tests__/render-feature-prepared-graphics.browser.test.ts +65 -559
  327. package/src/__tests__/render-feature-prepared-graphics.dawn.test.ts +57 -544
  328. package/src/__tests__/render-feature-prepared-graphics.fixture.ts +104 -0
  329. package/src/__tests__/render-feature-prepared-graphics.integration.test.ts +40 -248
  330. package/src/__tests__/render-feature-prepared-graphics.regression.integration.test.ts +83 -340
  331. package/src/__tests__/render-feature-recover.integration.test.ts +9 -49
  332. package/src/__tests__/render-feature-runtime-surface.test-d.ts +17 -20
  333. package/src/__tests__/render-schema-consumer.integration.test.ts +20 -13
  334. package/src/__tests__/render-schema-owner-boundary.unit.test.ts +2 -6
  335. package/src/__tests__/render-system-cross-world-overlay-queue.test.ts +5 -5
  336. package/src/__tests__/render-system-extract-dispatch-ordering.test.ts +16 -31
  337. package/src/__tests__/render-system-extract.test.ts +36 -51
  338. package/src/__tests__/render-system-extract.unit.test.ts +360 -0
  339. package/src/__tests__/render-system-fold-bucket.unit.test.ts +3 -5
  340. package/src/__tests__/render-system-fold-fallback.unit.test.ts +6 -3
  341. package/src/__tests__/render-system-fold-material.unit.test.ts +3 -5
  342. package/src/__tests__/render-system-fold-metrics.unit.test.ts +5 -5
  343. package/src/__tests__/render-system-fold-modegate.unit.test.ts +6 -6
  344. package/src/__tests__/render-system-fold.dawn.test.ts +7 -5
  345. package/src/__tests__/render-system-mega.test.ts +292 -190
  346. package/src/__tests__/render-system-owner-split-contract.test.ts +10 -32
  347. package/src/__tests__/render-system-record-multi-material-textureview.test.ts +59 -45
  348. package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +23 -29
  349. package/src/__tests__/render-system-record.test.ts +398 -235
  350. package/src/__tests__/render-system-record.unit.test.ts +25 -26
  351. package/src/__tests__/render-system-skin-bg.unit.test.ts +8 -12
  352. package/src/__tests__/renderer-consumer.test-d.ts +16 -3
  353. package/src/__tests__/renderer-health.unit.test.ts +26 -916
  354. package/src/__tests__/renderer-lifecycle.integration.test.ts +19 -6
  355. package/src/__tests__/renderer-recover.unit.test.ts +49 -1069
  356. package/src/__tests__/renderer-result.test-d.ts +19 -9
  357. package/src/__tests__/renderer-surface.unit.test.ts +3 -5
  358. package/src/__tests__/renderer-test-utils.ts +56 -0
  359. package/src/__tests__/renderer.test-d.ts +61 -0
  360. package/src/__tests__/resolve-asset-handle-err.test.ts +111 -0
  361. package/src/__tests__/resolve-asset-handle.unit.test.ts +64 -0
  362. package/src/__tests__/resolve-depth-only-view.test.ts +1 -1
  363. package/src/__tests__/resolveName-fallback.test.ts +64 -0
  364. package/src/__tests__/resolveName-null-package.test.ts +38 -0
  365. package/src/__tests__/resolveName-unified-entry.test.ts +65 -0
  366. package/src/__tests__/resolveName.test.ts +64 -0
  367. package/src/__tests__/rhi-null-command-flow.unit.test.ts +56 -260
  368. package/src/__tests__/rhi-null-renderer-lifecycle.unit.test.ts +41 -169
  369. package/src/__tests__/roots-to-scene-asset.test.ts +199 -93
  370. package/src/__tests__/roundtrip-primitive.test.ts +351 -0
  371. package/src/__tests__/scene-bare-guid-refs-instantiate.test.ts +123 -0
  372. package/src/__tests__/scene-equirect-roundtrip.test.ts +103 -16
  373. package/src/__tests__/scene-instance-authoring.integration.test.ts +8 -0
  374. package/src/__tests__/scene-instance-bridge.integration.test.ts +1 -1
  375. package/src/__tests__/scene-instance-component.test.ts +1 -1
  376. package/src/__tests__/scene-mount-fixed-point.test.ts +257 -0
  377. package/src/__tests__/scene-mount-roundtrip.test.ts +987 -0
  378. package/src/__tests__/scene-mount-wrapper-roundtrip.test.ts +202 -0
  379. package/src/__tests__/scene-sugar-instantiate.test.ts +324 -0
  380. package/src/__tests__/serialize-mounts-roundtrip.test.ts +533 -0
  381. package/src/__tests__/serialize-scene-asset.test.ts +219 -22
  382. package/src/__tests__/shadow-caster-empty-schema.test.ts +3 -3
  383. package/src/__tests__/shadow-csm-cascade-loadop.test.ts +37 -17
  384. package/src/__tests__/shadow-csm-component.test.ts +3 -5
  385. package/src/__tests__/shadow-csm-extract.test.ts +2 -100
  386. package/src/__tests__/shadow-csm-orthoz.test.ts +2 -16
  387. package/src/__tests__/shadow-csm-runtime-vary.dawn.test.ts +19 -14
  388. package/src/__tests__/shadow-csm-tile-consistency.test.ts +32 -26
  389. package/src/__tests__/shadow-csm-ubo.dawn.test.ts +8 -49
  390. package/src/__tests__/shadow-csm-ubo.test.ts +3 -25
  391. package/src/__tests__/shadow-csm-viewport.browser.test.ts +1 -1
  392. package/src/__tests__/shadow-fields-observable.dawn.test.ts +67 -56
  393. package/src/__tests__/shadow-m1.dawn.test.ts +8 -9
  394. package/src/__tests__/shadow-mesh-ssbo-order.test.ts +11 -27
  395. package/src/__tests__/skin-errors.unit.test.ts +1 -1
  396. package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +7 -5
  397. package/src/__tests__/skylight-lazy-projection.test.ts +36 -15
  398. package/src/__tests__/sparse-tag-scene-roundtrip.test.ts +5 -5
  399. package/src/__tests__/sprite-cullmode-flip.dawn.test.ts +47 -64
  400. package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +15 -14
  401. package/src/__tests__/sprite-lit-extract-branch.test.ts +1 -1
  402. package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +1 -1
  403. package/src/__tests__/ssao-bgl.test.ts +16 -9
  404. package/src/__tests__/ssao-buffers.test.ts +2 -2
  405. package/src/__tests__/ssao-data.test.ts +2 -2
  406. package/src/__tests__/ssao-errors.test.ts +1 -1
  407. package/src/__tests__/ssao-passes.test.ts +68 -392
  408. package/src/__tests__/ssao-pipelines.test.ts +1 -1
  409. package/src/__tests__/ssao-uniform-layout.test.ts +8 -6
  410. package/src/__tests__/stencil-outline-pixel.dawn.test.ts +25 -17
  411. package/src/__tests__/swap-chain-format.unit.test.ts +5 -7
  412. package/src/__tests__/systems.unit.test.ts +536 -1326
  413. package/src/__tests__/template-game-default-api-contract.test.ts +362 -0
  414. package/src/__tests__/text.unit.test.ts +56 -33
  415. package/src/__tests__/tilemap-childed-despawn.test.ts +8 -14
  416. package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +8 -12
  417. package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +2 -1
  418. package/src/__tests__/tilemap-chunk-extract.test.ts +13 -17
  419. package/src/__tests__/tilemap-dirty-rebuild.test.ts +7 -11
  420. package/src/__tests__/tilemap-material-cache.test.ts +8 -13
  421. package/src/__tests__/tilemap-multi-atlas.test.ts +12 -32
  422. package/src/__tests__/tilemap-owner-boundary.unit.test.ts +5 -2
  423. package/src/__tests__/tilemap-region-pack.test.ts +8 -12
  424. package/src/__tests__/tilemap-spawn-flip-pivot.test.ts +8 -12
  425. package/src/__tests__/tilemap-uv-inset.test.ts +11 -14
  426. package/src/__tests__/tilemap-validate.test.ts +1 -1
  427. package/src/__tests__/tileset-asset-validate.test.ts +638 -0
  428. package/src/__tests__/transcode-fallback.unit.test.ts +207 -0
  429. package/src/__tests__/transform-hierarchy-pixel-diff.dawn.test.ts +36 -28
  430. package/src/__tests__/transient-fields-collect.test.ts +28 -21
  431. package/src/__tests__/transient-runtime-behavior.test.ts +227 -0
  432. package/src/__tests__/transparent-sort-tilemap-sprite-interleave.test.ts +4 -4
  433. package/src/__tests__/variant-selection.unit.test.ts +1 -1
  434. package/src/__tests__/video-extract-bindgroup.dawn.test.ts +89 -136
  435. package/src/__tests__/video-loader-consumption.test.ts +86 -0
  436. package/src/__tests__/video-loader-smoke.dawn.test.ts +60 -0
  437. package/src/__tests__/view-ubo-layout.browser.test.ts +0 -22
  438. package/src/__tests__/world-entity-key.test.ts +1 -1
  439. package/src/__tests__/world-scene-despawn.test.ts +1 -1
  440. package/src/__tests__/world-scene-instantiate.test.ts +2 -36
  441. package/src/__tests__/world-scene-nested.test.ts +1 -1
  442. package/src/__tests__/world-scene-override.test.ts +1 -1
  443. package/src/backend-selection.ts +69 -0
  444. package/src/collect-scene-asset.ts +35 -23
  445. package/src/components/__tests__/camera.test-d.ts +1 -1
  446. package/src/components/__tests__/camera.test.ts +1 -1
  447. package/src/components/__tests__/sprite-animation.test-d.ts +2 -2
  448. package/src/components/__tests__/tile-layer.test-d.ts +1 -1
  449. package/src/components/__tests__/tile-layer.unit.test.ts +2 -2
  450. package/src/createRenderer.ts +24 -36
  451. package/src/errors/environment.ts +1 -1
  452. package/src/index.ts +51 -113
  453. package/src/renderer-host.ts +33 -0
  454. package/src/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.ts +1 -1
  455. package/src/scene-instances/index.ts +4 -0
  456. package/src/scene-utils/mount-override-fold.ts +3 -7
  457. package/src/systems/__tests__/transparent-sort.bench.ts +3 -3
  458. package/src/systems/sprite-animation-tick.ts +1 -1
  459. package/src/systems/transparent-sort.ts +38 -38
  460. package/src/tilemap-register-validate.ts +4 -4
  461. package/dist/__tests__/bind-group-cache-binding.test.d.ts +0 -2
  462. package/dist/__tests__/bind-group-cache-binding.test.d.ts.map +0 -1
  463. package/dist/__tests__/bind-group-cache-frame.test.d.ts +0 -2
  464. package/dist/__tests__/bind-group-cache-frame.test.d.ts.map +0 -1
  465. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts +0 -2
  466. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts.map +0 -1
  467. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts +0 -2
  468. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts.map +0 -1
  469. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts +0 -2
  470. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts.map +0 -1
  471. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts +0 -2
  472. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts.map +0 -1
  473. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts +0 -2
  474. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts.map +0 -1
  475. package/dist/__tests__/fog-producer-manifest.d.ts +0 -131
  476. package/dist/__tests__/fog-producer-manifest.d.ts.map +0 -1
  477. package/dist/__tests__/fog-producer-pixel-probe.d.ts +0 -42
  478. package/dist/__tests__/fog-producer-pixel-probe.d.ts.map +0 -1
  479. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts +0 -2
  480. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts.map +0 -1
  481. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts +0 -2
  482. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts.map +0 -1
  483. package/dist/__tests__/fog-producer-real-fixture.d.ts +0 -5
  484. package/dist/__tests__/fog-producer-real-fixture.d.ts.map +0 -1
  485. package/dist/__tests__/fog-producer-vfx-effect.d.ts +0 -3
  486. package/dist/__tests__/fog-producer-vfx-effect.d.ts.map +0 -1
  487. package/dist/__tests__/fog-scene-asset.integration.test.d.ts +0 -2
  488. package/dist/__tests__/fog-scene-asset.integration.test.d.ts.map +0 -1
  489. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts +0 -2
  490. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts.map +0 -1
  491. package/dist/__tests__/gpu-resource.test.d.ts +0 -2
  492. package/dist/__tests__/gpu-resource.test.d.ts.map +0 -1
  493. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts +0 -2
  494. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts.map +0 -1
  495. package/dist/__tests__/hdrp-buffers.unit.test.d.ts +0 -2
  496. package/dist/__tests__/hdrp-buffers.unit.test.d.ts.map +0 -1
  497. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts +0 -2
  498. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts.map +0 -1
  499. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts +0 -2
  500. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts.map +0 -1
  501. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts +0 -2
  502. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts.map +0 -1
  503. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts +0 -2
  504. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts.map +0 -1
  505. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts +0 -2
  506. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts.map +0 -1
  507. package/dist/__tests__/helpers/primitive-world.d.ts +0 -8
  508. package/dist/__tests__/helpers/primitive-world.d.ts.map +0 -1
  509. package/dist/__tests__/helpers/render-asset-port.d.ts +0 -15
  510. package/dist/__tests__/helpers/render-asset-port.d.ts.map +0 -1
  511. package/dist/__tests__/helpers/scene-asset-port.d.ts +0 -9
  512. package/dist/__tests__/helpers/scene-asset-port.d.ts.map +0 -1
  513. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts +0 -2
  514. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts.map +0 -1
  515. package/dist/__tests__/pipeline-layout-selection.test.d.ts +0 -2
  516. package/dist/__tests__/pipeline-layout-selection.test.d.ts.map +0 -1
  517. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts +0 -2
  518. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts.map +0 -1
  519. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts +0 -2
  520. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts.map +0 -1
  521. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts +0 -2
  522. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts.map +0 -1
  523. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts +0 -2
  524. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts.map +0 -1
  525. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts +0 -2
  526. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts.map +0 -1
  527. package/dist/__tests__/shadow-csm-pssm.test.d.ts +0 -2
  528. package/dist/__tests__/shadow-csm-pssm.test.d.ts.map +0 -1
  529. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts +0 -2
  530. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts.map +0 -1
  531. package/dist/__tests__/shadow-csm-viewport.test.d.ts +0 -2
  532. package/dist/__tests__/shadow-csm-viewport.test.d.ts.map +0 -1
  533. package/dist/__tests__/shadow-m2.dawn.test.d.ts +0 -2
  534. package/dist/__tests__/shadow-m2.dawn.test.d.ts.map +0 -1
  535. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts +0 -2
  536. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts.map +0 -1
  537. package/dist/__tests__/shadow-m3-calibrate.d.ts +0 -83
  538. package/dist/__tests__/shadow-m3-calibrate.d.ts.map +0 -1
  539. package/dist/__tests__/shadow-m3.dawn.test.d.ts +0 -2
  540. package/dist/__tests__/shadow-m3.dawn.test.d.ts.map +0 -1
  541. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts +0 -2
  542. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts.map +0 -1
  543. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts +0 -2
  544. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts.map +0 -1
  545. package/dist/__tests__/temporal-off-path.unit.test.d.ts +0 -2
  546. package/dist/__tests__/temporal-off-path.unit.test.d.ts.map +0 -1
  547. package/dist/__tests__/video-cache-regression.unit.test.d.ts +0 -2
  548. package/dist/__tests__/video-cache-regression.unit.test.d.ts.map +0 -1
  549. package/dist/asset-kind.d.ts +0 -4
  550. package/dist/asset-kind.d.ts.map +0 -1
  551. package/dist/errors/sprite-animation.d.ts +0 -3
  552. package/dist/errors/sprite-animation.d.ts.map +0 -1
  553. package/dist/scene-asset-port.d.ts +0 -17
  554. package/dist/scene-asset-port.d.ts.map +0 -1
  555. package/dist/scene-collect-errors.d.ts +0 -22
  556. package/dist/scene-collect-errors.d.ts.map +0 -1
  557. package/dist/shadow-m3-calibrate.d.ts +0 -40
  558. package/dist/shadow-m3-calibrate.d.ts.map +0 -1
  559. package/src/__tests__/bind-group-cache-binding.test.ts +0 -2513
  560. package/src/__tests__/bind-group-cache-frame.test.ts +0 -1511
  561. package/src/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.ts +0 -204
  562. package/src/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.ts +0 -297
  563. package/src/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.ts +0 -271
  564. package/src/__tests__/dispatch-fullscreen-pass-params.unit.test.ts +0 -321
  565. package/src/__tests__/fog-producer-manifest.ts +0 -162
  566. package/src/__tests__/fog-producer-pixel-probe.ts +0 -263
  567. package/src/__tests__/fog-producer-pixel.browser.test.ts +0 -26
  568. package/src/__tests__/fog-producer-pixel.dawn.test.ts +0 -55
  569. package/src/__tests__/fog-producer-real-fixture.ts +0 -805
  570. package/src/__tests__/fog-producer-vfx-effect.ts +0 -272
  571. package/src/__tests__/fog-scene-asset.integration.test.ts +0 -123
  572. package/src/__tests__/gpu-resource-store-cubemap-status.test.ts +0 -207
  573. package/src/__tests__/gpu-resource.test.ts +0 -1206
  574. package/src/__tests__/hdrp-bgl-slots.browser.test.ts +0 -50
  575. package/src/__tests__/hdrp-buffers.unit.test.ts +0 -70
  576. package/src/__tests__/hdrp-execute-filter.unit.test.ts +0 -200
  577. package/src/__tests__/hdrp-gbuffer-attachments.browser.test.ts +0 -64
  578. package/src/__tests__/hdrp-pipeline-asset-type.test-d.ts +0 -139
  579. package/src/__tests__/hdrp-ssao-boundary.test.ts +0 -237
  580. package/src/__tests__/hdrp-ssao-falsification.test.ts +0 -289
  581. package/src/__tests__/helpers/primitive-world.ts +0 -91
  582. package/src/__tests__/helpers/render-asset-port.ts +0 -65
  583. package/src/__tests__/helpers/scene-asset-port.ts +0 -23
  584. package/src/__tests__/material-derived-coordinates.integration.test.ts +0 -100
  585. package/src/__tests__/pipeline-layout-selection.test.ts +0 -298
  586. package/src/__tests__/post-process-reads-narrowing.test-d.ts +0 -52
  587. package/src/__tests__/post-process-register-roundtrip.dawn.test.ts +0 -230
  588. package/src/__tests__/render-feature-zero-feature.browser.test.ts +0 -152
  589. package/src/__tests__/render-pipeline-trivial.dawn.test.ts +0 -525
  590. package/src/__tests__/shadow-csm-caster-membership.test.ts +0 -232
  591. package/src/__tests__/shadow-csm-pssm.test.ts +0 -142
  592. package/src/__tests__/shadow-csm-temporal.browser.test.ts +0 -145
  593. package/src/__tests__/shadow-csm-viewport.test.ts +0 -74
  594. package/src/__tests__/shadow-m2.dawn.test.ts +0 -394
  595. package/src/__tests__/shadow-m3-calibrate-run.dawn.test.ts +0 -248
  596. package/src/__tests__/shadow-m3-calibrate.ts +0 -203
  597. package/src/__tests__/shadow-m3.dawn.test.ts +0 -288
  598. package/src/__tests__/shadow-probe-control-flow.dawn.test.ts +0 -264
  599. package/src/__tests__/shadow-quality-metrics.dawn.test.ts +0 -324
  600. package/src/__tests__/temporal-off-path.unit.test.ts +0 -69
  601. package/src/__tests__/video-cache-regression.unit.test.ts +0 -186
  602. package/src/asset-kind.ts +0 -7
  603. package/src/errors/sprite-animation.ts +0 -5
  604. package/src/scene-asset-port.ts +0 -32
  605. package/src/scene-collect-errors.ts +0 -30
  606. package/src/shadow-m3-calibrate.ts +0 -171
@@ -0,0 +1,86 @@
1
+ // feat-20260623-world-space-video-asset M2 / w3 — AC-02: VideoAsset
2
+ // consumption-path type inference in a real unit test (not just test-d).
3
+ //
4
+ // AC-02 (requirements.md:76-78): `const v = await registry.loadByGuid<VideoAsset>(guid)`
5
+ // must return a VideoAsset where `v.url` is inferable as `string` without
6
+ // an `as` cast. `switch (asset.kind)` must narrow to VideoAsset on
7
+ // `case 'video'` with TypeScript exhaustiveness.
8
+ //
9
+ // Pattern: host-custom-kind-contract.test.ts:38-75 (loadByGuid<P> + no as cast).
10
+ // This is the TDD test for M2 — it verifies the consumption path works
11
+ // with catalogued payloads (dev path). The prod (pack-index) path is
12
+ // enabled by videoLoader in w4.
13
+ //
14
+ // Structural variant (b) from video-asset-union.test-d.ts moved into a real
15
+ // unit so the consumption path is exercised with a concrete AssetRegistry,
16
+ // not just a *.test-d.ts compile-only check.
17
+
18
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
19
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
20
+ import type { Asset, VideoAsset } from '@forgeax/engine-types';
21
+ import { describe, expect, it } from 'vitest';
22
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
23
+
24
+ function parseGuid(s: string): AssetGuid {
25
+ const r = AssetGuid.parse(s);
26
+ if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
27
+ return r.value;
28
+ }
29
+
30
+ function makeRegistry(): AssetRegistry {
31
+ return new AssetRegistry(makeMockShaderRegistry());
32
+ }
33
+
34
+ describe('AC-02 — VideoAsset consumption path type inference (real unit)', () => {
35
+ it('loadByGuid<VideoAsset> returns payload with .url inferable as string, no as cast', async () => {
36
+ const reg = makeRegistry();
37
+
38
+ const guid = parseGuid('c0000000-0000-4000-a000-00000000a001');
39
+ const video: VideoAsset = { kind: 'video', url: 'test-clip.webm' };
40
+
41
+ reg.catalog(guid, video);
42
+
43
+ // loadByGuid<VideoAsset> returns Result<VideoAsset, ...>.
44
+ // v.url is inferable as string without any `as VideoAsset` cast.
45
+ const loadResult = await reg.loadByGuid<VideoAsset>(guid);
46
+ expect(loadResult.ok).toBe(true);
47
+ if (!loadResult.ok) throw new Error('unreachable');
48
+ const v = loadResult.value;
49
+ // Type inference: v.url is string; no `as` cast needed.
50
+ expect(v.url).toBe('test-clip.webm');
51
+ expect(v.kind).toBe('video');
52
+ });
53
+
54
+ it('switch(asset.kind) narrows to VideoAsset on case "video"', () => {
55
+ // The Asset union (15 members) includes VideoAsset per M1/w2.
56
+ // TS strict + exhaustive switch ensures this compiles only if
57
+ // 'video' is a recognised discriminant that narrows to VideoAsset.
58
+ const asset: Asset = { kind: 'video', url: 'switch-test.webm' };
59
+ switch (asset.kind) {
60
+ case 'video':
61
+ // Narrowed to VideoAsset — .url is string, no `as`.
62
+ expect(asset.url).toBe('switch-test.webm');
63
+ break;
64
+ default:
65
+ // TS exhaustiveness: the 14 other Asset.kind discriminants
66
+ // are covered by this branch; the switch would fail to compile
67
+ // if 'video' were absent from the union.
68
+ break;
69
+ }
70
+ });
71
+
72
+ it('registry.lookup<VideoAsset> returns catalogued payload with .url accessible', () => {
73
+ const reg = makeRegistry();
74
+
75
+ const guid = parseGuid('c0000000-0000-4000-a000-00000000a002');
76
+ const video: VideoAsset = { kind: 'video', url: 'lookup-test.webm' };
77
+
78
+ reg.catalog(guid, video);
79
+ const v = reg.lookup<VideoAsset>(guid);
80
+ expect(v).toBeDefined();
81
+ // biome-ignore lint/style/noNonNullAssertion: asserted above
82
+ expect(v!.url).toBe('lookup-test.webm');
83
+ // biome-ignore lint/style/noNonNullAssertion: asserted above
84
+ expect(v!.kind).toBe('video');
85
+ });
86
+ });
@@ -0,0 +1,60 @@
1
+ // feat-20260623-world-space-video-asset M2 / w5 — AC-03: dawn structural
2
+ // smoke for the VideoAsset register + loadByGuid link.
3
+ //
4
+ // AC-03 (requirements.md): register a VideoAsset { url } via catalog,
5
+ // loadByGuid<VideoAsset> returns the payload successfully, process exit
6
+ // code 0. Structural-only — dawn-node has no HTMLVideoElement, so no
7
+ // pixel verification (plan-strategy S5.2).
8
+ //
9
+ // The default loader set (wireDefaultLoaders) already includes videoLoader
10
+ // (w4), so the AssetRegistry's built-in loaders field dispatches 'video'
11
+ // kind through videoLoader without manual registration.
12
+
13
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
14
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
15
+ import type { VideoAsset } from '@forgeax/engine-types';
16
+ import { describe, expect, it } from 'vitest';
17
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
18
+
19
+ const GUID_SMOKE_A = '00000000-0000-7000-8000-00000000a010';
20
+
21
+ function parseGuid(s: string): AssetGuid {
22
+ const r = AssetGuid.parse(s);
23
+ if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
24
+ return r.value;
25
+ }
26
+
27
+ describe('AC-03 — VideoAsset register + loadByGuid dawn structural smoke', () => {
28
+ it('catalog + loadByGuid<VideoAsset> round-trips payload in dawn context', async () => {
29
+ const reg = new AssetRegistry(makeMockShaderRegistry());
30
+
31
+ const guid = parseGuid(GUID_SMOKE_A);
32
+ const video: VideoAsset = { kind: 'video', url: 'test-clip.webm' };
33
+
34
+ reg.catalog(guid, video);
35
+
36
+ const result = await reg.loadByGuid<VideoAsset>(guid);
37
+ expect(result.ok).toBe(true);
38
+ if (!result.ok) throw new Error('expected ok');
39
+ expect(result.value.url).toBe('test-clip.webm');
40
+ expect(result.value.kind).toBe('video');
41
+ });
42
+
43
+ it('loadByGuid succeeds when videoLoader dispatches through default loader set', async () => {
44
+ // The AssetRegistry constructor wires the default loader set via
45
+ // createDefaultLoaderRegistry(), which includes videoLoader (w4).
46
+ // This test verifies the dispatch path works without manual
47
+ // registry.loaders.register(videoLoader).
48
+ const reg = new AssetRegistry(makeMockShaderRegistry());
49
+
50
+ // Confirm 'video' is in the registered kinds.
51
+ expect(reg.loaders.registeredKinds()).toContain('video');
52
+ expect(reg.loaders.get('video')).toBeDefined();
53
+
54
+ const guid = parseGuid('00000000-0000-7000-8000-00000000a011');
55
+ reg.catalog(guid, { kind: 'video', url: 'loader-dispatch.webm' } as VideoAsset);
56
+
57
+ const result = await reg.loadByGuid<VideoAsset>(guid);
58
+ expect(result.ok).toBe(true);
59
+ });
60
+ });
@@ -31,10 +31,6 @@
31
31
  // (w15, AC-12 / AC-14); this gate locks the byte layout itself.
32
32
 
33
33
  import { describe, expect, it } from 'vitest';
34
- // @ts-expect-error Vite provides raw text imports to the browser test runner.
35
- import viewUboSource from '../../../render/src/record/view-ubo.ts?raw';
36
- // @ts-expect-error Vite provides raw text imports to the browser test runner.
37
- import commonViewSource from '../../../shader/src/common.wgsl?raw';
38
34
 
39
35
  const browserReady = typeof navigator !== 'undefined' && navigator.gpu !== undefined;
40
36
 
@@ -163,21 +159,3 @@ describe('w4 view UBO 240 B std140 layout (AC-06, browser)', () => {
163
159
  },
164
160
  );
165
161
  });
166
-
167
- describe('Fog View ABI transport (M2)', () => {
168
- it('host payload grows beyond the stale 784 B prefix and carries Fog facts', async () => {
169
- const source = await viewUboSource;
170
- expect(source).toContain('VIEW_PAYLOAD_FLOATS = 240');
171
- expect(source).toContain('heightFalloff');
172
- expect(source).toContain('maxOpacity');
173
- expect(source).not.toContain('VIEW_PAYLOAD_FLOATS = 196');
174
- });
175
-
176
- it('shader View carries Fog in the existing uniform binding', async () => {
177
- const [viewSource, commonSource] = await Promise.all([viewUboSource, commonViewSource]);
178
- expect(viewSource).toContain('viewPayload[232]');
179
- expect(commonSource).toContain('fog : FogViewParams');
180
- expect(commonSource).toContain('@group(0) @binding(0) var<uniform> view : View;');
181
- expect(commonSource).not.toContain('@group(0) @binding(10)');
182
- });
183
- });
@@ -14,8 +14,8 @@
14
14
  // plan-strategy D-1/D-9
15
15
  // requirements AC-03
16
16
 
17
- import { worldEntityKey } from '@forgeax/engine-render/internal';
18
17
  import { describe, expect, it } from 'vitest';
18
+ import { worldEntityKey } from '../../../render/src/record/frame-snapshot';
19
19
 
20
20
  describe('worldEntityKey', () => {
21
21
  // ── Identity: worldId=0 ──────────────────────────────────────────────────
@@ -10,7 +10,7 @@
10
10
  // - opts.keepDetached preserves members marked via detachSceneMember.
11
11
 
12
12
  import { World } from '@forgeax/engine-ecs';
13
- import { SceneInstance } from '@forgeax/engine-render/internal';
13
+ import { SceneInstance } from '@forgeax/engine-render';
14
14
  import {
15
15
  ChildOf,
16
16
  Transform,
@@ -19,10 +19,9 @@
19
19
  // w23: perf — 100 entities x 5 components instantiates < 50ms (plan §5.4).
20
20
 
21
21
  import { defineComponent, World } from '@forgeax/engine-ecs';
22
- import { SceneInstance } from '@forgeax/engine-render/internal';
22
+ import { SceneInstance } from '@forgeax/engine-render';
23
23
  import {
24
24
  ChildOf,
25
- Children,
26
25
  Transform,
27
26
  worldGetSceneAssetForInstance,
28
27
  worldInstantiateScene,
@@ -35,7 +34,7 @@ function registerSceneAsset(
35
34
  asset: SceneAsset,
36
35
  extraComponents: readonly Parameters<World['components']['register']>[0][] = [],
37
36
  ): Handle<'SceneAsset', 'shared'> {
38
- for (const component of [SceneInstance, ChildOf, Children, Transform, ...extraComponents]) {
37
+ for (const component of [SceneInstance, ChildOf, Transform, ...extraComponents]) {
39
38
  world.components.register(component).unwrap();
40
39
  }
41
40
  return world.allocSharedRef('SceneAsset', asset);
@@ -193,36 +192,3 @@ describe('world.instantiateScene perf (w23) — 100 entities x 5 components', ()
193
192
  expect(dt).toBeLessThan(50);
194
193
  });
195
194
  });
196
-
197
- describe('M2 direct Scene owner contract', () => {
198
- it('keeps successful member materialization and diagnostics on the real World path', () => {
199
- const world = new World();
200
- const asset: SceneAsset = {
201
- kind: 'scene',
202
- entities: [{ localId: 0 as never, components: { Transform: {} } }],
203
- };
204
- const result = worldInstantiateScene(world, registerSceneAsset(world, asset));
205
-
206
- expect(result.ok).toBe(true);
207
- if (!result.ok) return;
208
- expect(result.value.diagnostics).toEqual([]);
209
- const instance = world.get(result.value.root, SceneInstance);
210
- expect(instance.ok).toBe(true);
211
- if (instance.ok) expect(instance.value.mapping.length).toBe(1);
212
- });
213
-
214
- it('rolls back a failed component lookup without a partial SceneInstance root', () => {
215
- const world = new World();
216
- const result = worldInstantiateScene(
217
- world,
218
- registerSceneAsset(world, {
219
- kind: 'scene',
220
- entities: [{ localId: 0 as never, components: { M2MissingComponent: { value: 3 } } }],
221
- } as SceneAsset),
222
- );
223
-
224
- expect(result.ok).toBe(false);
225
- const query = world.query({ read: [SceneInstance] });
226
- expect(query.ok ? Array.from(query.value) : []).toHaveLength(0);
227
- });
228
- });
@@ -16,7 +16,7 @@ import * as SceneOwner from '@forgeax/engine-scene';
16
16
  // do not leak across mount instances)
17
17
 
18
18
  import { defineComponent, World } from '@forgeax/engine-ecs';
19
- import { SceneInstance } from '@forgeax/engine-render/internal';
19
+ import { SceneInstance } from '@forgeax/engine-render';
20
20
  import { ChildOf } from '@forgeax/engine-scene';
21
21
  import type { Handle, SceneAsset } from '@forgeax/engine-types';
22
22
  import { err, ok } from '@forgeax/engine-types';
@@ -16,7 +16,7 @@ import * as SceneOwner from '@forgeax/engine-scene';
16
16
  // with detail.{ comp, field, expectedType, actualType }.
17
17
 
18
18
  import { defineComponent, World } from '@forgeax/engine-ecs';
19
- import { SceneInstance } from '@forgeax/engine-render/internal';
19
+ import { SceneInstance } from '@forgeax/engine-render';
20
20
  import { Transform } from '@forgeax/engine-scene';
21
21
  import type { Handle, SceneAsset } from '@forgeax/engine-types';
22
22
  import { ok } from '@forgeax/engine-types';
@@ -0,0 +1,69 @@
1
+ import type { RendererOptions } from '@forgeax/engine-render';
2
+ import type { RhiBackendPack } from '@forgeax/engine-render/internal/construct-renderer';
3
+ import { err, ok, RhiError } from '@forgeax/engine-rhi';
4
+ import * as rhiWebgpu from '@forgeax/engine-rhi-webgpu';
5
+
6
+ export function loadRhiPack(
7
+ mod: Record<string, unknown>,
8
+ instrumentation?: RhiBackendPack['instrumentation'],
9
+ ): RhiBackendPack {
10
+ const rhi = mod.rhi as unknown as RhiBackendPack['rhi'];
11
+ const createShaderModule = mod.createShaderModule as
12
+ | RhiBackendPack['createShaderModule']
13
+ | undefined;
14
+ const translateErrorEventToRhiError = mod.translateErrorEventToRhiError as
15
+ | RhiBackendPack['translateErrorEventToRhiError']
16
+ | undefined;
17
+ const rawDeviceAccessor = mod._internal_getRawDevice as unknown as
18
+ | RhiBackendPack['_internal_getRawDevice']
19
+ | undefined;
20
+ const backendInstrumentation = mod.instrumentation as
21
+ | RhiBackendPack['instrumentation']
22
+ | undefined;
23
+ const pack: RhiBackendPack = {
24
+ rhi,
25
+ ...(createShaderModule === undefined ? {} : { createShaderModule }),
26
+ ...(translateErrorEventToRhiError === undefined ? {} : { translateErrorEventToRhiError }),
27
+ ...(rawDeviceAccessor === undefined ? {} : { _internal_getRawDevice: rawDeviceAccessor }),
28
+ };
29
+ const resolvedInstrumentation = instrumentation ?? backendInstrumentation;
30
+ return resolvedInstrumentation === undefined
31
+ ? pack
32
+ : { ...pack, instrumentation: resolvedInstrumentation };
33
+ }
34
+
35
+ /** Selects one backend pack; render receives only this typed owner contract. */
36
+ export async function loadBackendPack(
37
+ options: RendererOptions | undefined,
38
+ preferWgpu = false,
39
+ ): Promise<
40
+ | { readonly ok: true; readonly value: RhiBackendPack }
41
+ | { readonly ok: false; readonly error: RhiError }
42
+ > {
43
+ const explicit = options?.rhi;
44
+ if (explicit !== undefined && explicit !== null) {
45
+ return ok(loadRhiPack({ rhi: explicit, ...(explicit as object) }, options?.rhiInstrumentation));
46
+ }
47
+ const nav =
48
+ typeof globalThis === 'undefined'
49
+ ? undefined
50
+ : (globalThis as { navigator?: { gpu?: unknown } }).navigator;
51
+ if (!preferWgpu && nav?.gpu !== undefined && nav.gpu !== null) {
52
+ return ok(
53
+ loadRhiPack(rhiWebgpu as unknown as Record<string, unknown>, options?.rhiInstrumentation),
54
+ );
55
+ }
56
+ try {
57
+ const mod = (await import('@forgeax/engine-rhi-wgpu')) as Record<string, unknown>;
58
+ await (mod.ensureReady as () => Promise<unknown>)();
59
+ return ok(loadRhiPack(mod, options?.rhiInstrumentation));
60
+ } catch (cause) {
61
+ return err(
62
+ new RhiError({
63
+ code: 'rhi-not-available',
64
+ expected: 'a usable RHI backend is available',
65
+ hint: `failed to load wgpu backend: ${String(cause)}`,
66
+ }),
67
+ );
68
+ }
69
+ }
@@ -24,7 +24,7 @@
24
24
  // ── serialize mounts (M3) ──
25
25
  // serializeSceneAssetToPack maps in-memory mounts[].source GUID strings to
26
26
  // refs[] indices, memberFirst/memberCount/localId/parent numeric pass-through.
27
- // the scene asset loader carries mounts through the reload
27
+ // _resolveSceneGuids (asset-registry.ts) carries mounts through the reload
28
28
  // chain: recursively resolves child scene GUIDs, registers child copies in
29
29
  // the origin reverse-index (D-7), and protects against mount-source cycles
30
30
  // (R-9). registry.instantiate wires an identity resolver so resolved mount
@@ -32,7 +32,7 @@
32
32
  //
33
33
  // ── round-trip closure ──
34
34
  // The round-trip instantiate -> collect (rootsToSceneAsset) -> serialize
35
- // (serializeSceneAssetToPack) -> reload through the typed scene port
35
+ // (serializeSceneAssetToPack) -> reload (loadByGuid + registry.instantiate)
36
36
  // -> instantiate produces a structurally equivalent live subtree (AC-04).
37
37
  // The equivalence benchmark is a second collect (fixed-point): after the
38
38
  // first reload, the second collect output equals the first (D-9 normalization
@@ -44,6 +44,12 @@
44
44
  // proven to be a mount entity, components is left undefined (one-time
45
45
  // normalization on first reload; fixed-point from second collect onward).
46
46
 
47
+ import {
48
+ builtinMeshGuid,
49
+ resolveAssetHandle,
50
+ SceneCollectAssetGuidUnresolvedError,
51
+ SceneCollectEntityRefOutOfClosureError,
52
+ } from '@forgeax/engine-assets-runtime';
47
53
  import {
48
54
  componentDefinition,
49
55
  type Component as EcsComponent,
@@ -52,9 +58,10 @@ import {
52
58
  } from '@forgeax/engine-ecs';
53
59
  import { classifyEntityField } from '@forgeax/engine-ecs/externalization';
54
60
  import { componentSchema } from '@forgeax/engine-ecs/internal';
55
- import { collectSubtree, SceneInstance } from '@forgeax/engine-render/internal';
61
+ import { SceneInstance } from '@forgeax/engine-render';
56
62
  import { err, ok, type Result } from '@forgeax/engine-rhi';
57
63
  import {
64
+ collectSubtree,
58
65
  externalizeSceneAsset,
59
66
  SCENE_COLLECT_PROFILE,
60
67
  worldGetSceneAssetForInstance,
@@ -69,13 +76,13 @@ import type {
69
76
  SceneEntity,
70
77
  SceneInstanceMount,
71
78
  } from '@forgeax/engine-types';
72
- import type { SceneAssetPort } from './scene-asset-port';
73
- import {
74
- SceneCollectAssetGuidUnresolvedError,
75
- SceneCollectEntityRefOutOfClosureError,
76
- } from './scene-collect-errors';
77
79
  import { foldMountOverrides } from './scene-utils/mount-override-fold';
78
80
 
81
+ /** The collector needs identity lookup, not an authoring registry implementation. */
82
+ export interface SceneAssetGuidLookup {
83
+ guidOf(asset: Asset): string | undefined;
84
+ }
85
+
79
86
  // Shared helpers
80
87
  function _isArrayLike(value: unknown): value is ArrayLike<unknown> {
81
88
  // SceneAsset values are ordinary JSON arrays at the boundary. Use the
@@ -114,14 +121,16 @@ function classifyFieldSchema(fieldType: string | undefined): SchemaFieldClass |
114
121
  // lives in exactly one place; `field` names the failing field in the error.
115
122
  function _handleToGuid(
116
123
  world: World,
117
- assets: SceneAssetPort,
124
+ registry: SceneAssetGuidLookup,
118
125
  handle: number,
119
126
  field: string,
120
127
  ): Result<string | undefined, SceneCollectAssetGuidUnresolvedError> {
121
128
  if (handle === 0) return ok(undefined); // NULL sentinel
122
- const assetRes = assets.resolve(world, handle as unknown as Handle<string, 'shared'>);
129
+ const builtinGuid = builtinMeshGuid(handle as unknown as Handle<string, 'shared'>);
130
+ if (builtinGuid !== undefined) return ok(builtinGuid);
131
+ const assetRes = resolveAssetHandle(world, handle as unknown as Handle<string, 'shared'>);
123
132
  if (!assetRes.ok) return err(new SceneCollectAssetGuidUnresolvedError(field, handle));
124
- const guid = assets.guidOf(assetRes.value as Asset);
133
+ const guid = registry.guidOf(assetRes.value as Asset);
125
134
  if (guid === undefined) return err(new SceneCollectAssetGuidUnresolvedError(field, handle));
126
135
  return ok(guid);
127
136
  }
@@ -133,14 +142,14 @@ function _handleToGuid(
133
142
  // values pass through untouched.
134
143
  function _serializeSharedFieldValue(
135
144
  world: World,
136
- assets: SceneAssetPort,
145
+ registry: SceneAssetGuidLookup,
137
146
  classification: SchemaFieldClass,
138
147
  value: unknown,
139
148
  field: string,
140
149
  ): Result<unknown, SceneCollectAssetGuidUnresolvedError> {
141
150
  if (classification.scalar) {
142
151
  if (typeof value !== 'number') return ok(value);
143
- return _handleToGuid(world, assets, value, field); // undefined -> caller omits
152
+ return _handleToGuid(world, registry, value, field); // undefined -> caller omits
144
153
  }
145
154
  if (!Array.isArray(value)) return ok(value);
146
155
  const mapped: Array<string | number> = [];
@@ -149,7 +158,7 @@ function _serializeSharedFieldValue(
149
158
  mapped.push(elem as number);
150
159
  continue;
151
160
  }
152
- const g = _handleToGuid(world, assets, elem, field);
161
+ const g = _handleToGuid(world, registry, elem, field);
153
162
  if (!g.ok) return g;
154
163
  mapped.push(g.value ?? 0); // NULL sentinel keeps positional 0
155
164
  }
@@ -164,7 +173,7 @@ function _serializeSharedFieldValue(
164
173
  // override IS that field so it cannot be omitted). Non-shared fields pass through.
165
174
  function _serializeOverrideValueHandles(
166
175
  world: World,
167
- assets: SceneAssetPort,
176
+ registry: SceneAssetGuidLookup,
168
177
  ov: MountOverride,
169
178
  ): Result<unknown, SceneCollectAssetGuidUnresolvedError> {
170
179
  const comp = world.components.resolve(ov.comp);
@@ -172,7 +181,7 @@ function _serializeOverrideValueHandles(
172
181
  if (ov.field !== undefined) {
173
182
  const classification = schema ? classifyFieldSchema(schema[ov.field]) : undefined;
174
183
  if (!classification || classification.kind !== 'shared') return ok(ov.value);
175
- const conv = _serializeSharedFieldValue(world, assets, classification, ov.value, ov.field);
184
+ const conv = _serializeSharedFieldValue(world, registry, classification, ov.value, ov.field);
176
185
  if (!conv.ok) return conv;
177
186
  // Field-patch: keep the field even at NULL sentinel (the override IS the
178
187
  // field); undefined only arises for a scalar handle 0 -> emit 0.
@@ -192,7 +201,7 @@ function _serializeOverrideValueHandles(
192
201
  }
193
202
  const conv = _serializeSharedFieldValue(
194
203
  world,
195
- assets,
204
+ registry,
196
205
  classification,
197
206
  src[fieldName],
198
207
  fieldName,
@@ -251,7 +260,7 @@ export function serializeSceneAssetToPack(
251
260
  * filter (not subtree pruning): graft entities under members survive as owned.
252
261
  */
253
262
  export function rootsToSceneAsset(
254
- assets: SceneAssetPort,
263
+ registry: SceneAssetGuidLookup,
255
264
  world: World,
256
265
  roots: EntityHandle[],
257
266
  ): Result<
@@ -402,7 +411,10 @@ export function rootsToSceneAsset(
402
411
  sh.error as unknown as number,
403
412
  ),
404
413
  );
405
- const pr = assets.resolve<SceneAsset>(world, sh.value as unknown as Handle<string, 'shared'>);
414
+ const pr = resolveAssetHandle<SceneAsset>(
415
+ world,
416
+ sh.value as unknown as Handle<string, 'shared'>,
417
+ );
406
418
  if (!pr.ok)
407
419
  return err(
408
420
  new SceneCollectAssetGuidUnresolvedError(
@@ -410,7 +422,7 @@ export function rootsToSceneAsset(
410
422
  sh.value as unknown as number,
411
423
  ),
412
424
  );
413
- const g = assets.guidOf(pr.value as Asset);
425
+ const g = registry.guidOf(pr.value as Asset);
414
426
  if (g === undefined)
415
427
  return err(
416
428
  new SceneCollectAssetGuidUnresolvedError(
@@ -482,11 +494,11 @@ export function rootsToSceneAsset(
482
494
  let mountOverrides: MountOverride[] | undefined;
483
495
  const foldStateRes = worldGetSceneInstanceState(world, a.entityRaw as EntityHandle);
484
496
  if (foldStateRes.ok) {
485
- const rawOverrides = foldMountOverrides(world, assets, foldStateRes.value);
497
+ const rawOverrides = foldMountOverrides(world, foldStateRes.value);
486
498
  if (rawOverrides.length > 0) {
487
499
  mountOverrides = [];
488
500
  for (const ov of rawOverrides) {
489
- const convRes = _serializeOverrideValueHandles(world, assets, ov);
501
+ const convRes = _serializeOverrideValueHandles(world, registry, ov);
490
502
  if (!convRes.ok) return convRes;
491
503
  mountOverrides.push({
492
504
  ...ov,
@@ -664,7 +676,7 @@ export function rootsToSceneAsset(
664
676
  }
665
677
  const conv = _serializeSharedFieldValue(
666
678
  world,
667
- assets,
679
+ registry,
668
680
  sharedClass,
669
681
  normalized,
670
682
  fieldName,
@@ -7,8 +7,8 @@
7
7
  // Charter P3: required-field omission must produce compile-time error,
8
8
  // not runtime silent fallback.
9
9
 
10
- import { orthographic, perspective } from '@forgeax/engine-render/internal';
11
10
  import { describe, expectTypeOf, it } from 'vitest';
11
+ import { orthographic, perspective } from '../../../../render/src/components/camera';
12
12
 
13
13
  describe('perspective factory type-level', () => {
14
14
  it('perspective({ fov: 60, aspect: 4/3 }) type-checks OK', () => {
@@ -14,8 +14,8 @@
14
14
  // exercises the world.get path.
15
15
 
16
16
  import { World } from '@forgeax/engine-ecs';
17
- import { Camera, perspective } from '@forgeax/engine-render/internal';
18
17
  import { describe, expect, expectTypeOf, it } from 'vitest';
18
+ import { Camera, perspective } from '../../../../render/src/components/camera';
19
19
 
20
20
  describe('camera.ts autoAspect bool column (w8)', () => {
21
21
  it('world.get(cam, Camera).autoAspect reads a JS boolean, not a number', () => {
@@ -45,11 +45,11 @@
45
45
 
46
46
  import type { Component, SchemaOf, ShapeOf } from '@forgeax/engine-ecs';
47
47
  import type { SpriteAnimation } from '@forgeax/engine-render/authoring';
48
+ import { describe, expectTypeOf, it } from 'vitest';
48
49
  import {
49
50
  SPRITE_PLAYBACK_MODE_CLAMP,
50
51
  SPRITE_PLAYBACK_MODE_LOOP,
51
- } from '@forgeax/engine-render/authoring';
52
- import { describe, expectTypeOf, it } from 'vitest';
52
+ } from '../../../../render/src/components/sprite-playback-mode';
53
53
 
54
54
  describe('SpriteAnimation — Component token shape (AC-02 schema lock)', () => {
55
55
  it("name literal type is 'SpriteAnimation'", () => {
@@ -5,9 +5,9 @@
5
5
  // AGENTS.md §Component naming.
6
6
 
7
7
  import type { EcsError, EntityHandle, SchemaOf, World } from '@forgeax/engine-ecs';
8
- import { markTileLayerDirty, type TileLayer } from '@forgeax/engine-render/authoring';
9
8
  import type { Result } from '@forgeax/engine-types';
10
9
  import { describe, expectTypeOf, it } from 'vitest';
10
+ import { markTileLayerDirty, type TileLayer } from '../../../../render/src/components/tile-layer';
11
11
 
12
12
  describe('TileLayer component schema (M0 baseline)', () => {
13
13
  it('type-level: schema fields remain owner-defined and typed', () => {
@@ -26,13 +26,13 @@
26
26
  // P1 (progressive disclosure — `'layer'` / `'per-cell'` reads directly).
27
27
 
28
28
  import { World } from '@forgeax/engine-ecs';
29
+ import { describe, expect, expectTypeOf, it } from 'vitest';
29
30
  import {
30
31
  decodeSortScope,
31
32
  encodeSortScope,
32
33
  type SortScope,
33
34
  TileLayer,
34
- } from '@forgeax/engine-render/authoring';
35
- import { describe, expect, expectTypeOf, it } from 'vitest';
35
+ } from '../../../../render/src/components';
36
36
 
37
37
  describe('TileLayer.sortScope union lock (w5, round-2 production)', () => {
38
38
  it("'layer' is assignable to SortScope", () => {