@forgeax/engine-runtime 0.1.3 → 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
@@ -7,20 +7,30 @@
7
7
  // Anchors: requirements AC-13 (Renderer.draw/ready Result form);
8
8
  // plan-strategy D-P7 break-point #4; w23 test SSOT.
9
9
 
10
- import type { Renderer, RenderResult } from '@forgeax/engine-render/internal';
11
- import type { RhiError } from '@forgeax/engine-rhi';
10
+ import type {
11
+ FrameReceipt,
12
+ RenderError,
13
+ Renderer,
14
+ RenderFrameInput,
15
+ RenderResult,
16
+ RenderWorldLease,
17
+ } from '@forgeax/engine-render';
12
18
  import { describe, expectTypeOf, it } from 'vitest';
13
19
 
14
- describe('AC-13 — Renderer.draw returns Result<void, RhiError>', () => {
15
- it('Renderer.draw(world) return type is Result<void, RhiError>', () => {
20
+ describe('M6 — Renderer.draw returns Result<FrameReceipt, RenderError>', () => {
21
+ it('Renderer.draw(request) return type is Result<FrameReceipt, RenderError>', () => {
16
22
  type RetType = ReturnType<Renderer['draw']>;
17
- expectTypeOf<RetType>().toEqualTypeOf<RenderResult<void, RhiError>>();
23
+ expectTypeOf<RetType>().toEqualTypeOf<RenderResult<FrameReceipt, RenderError>>();
18
24
  });
19
25
  });
20
26
 
21
- describe('AC-13 — Renderer.ready is Promise<Result<void, RhiError>>', () => {
22
- it('Renderer.ready type is Promise<Result<void, RhiError>>', () => {
23
- type ReadyType = Renderer['ready'];
24
- expectTypeOf<ReadyType>().toEqualTypeOf<Promise<RenderResult<void, RhiError>>>();
27
+ describe('M6 — Renderer.attach returns a lease and draw consumes it', () => {
28
+ it('Renderer.attach returns RenderWorldLease and draw consumes RenderFrameInput', () => {
29
+ type AttachType = Renderer['attach'];
30
+ type DrawArg = Parameters<Renderer['draw']>[0];
31
+ expectTypeOf<AttachType>().returns.toEqualTypeOf<
32
+ RenderResult<RenderWorldLease, import('@forgeax/engine-render').RenderError>
33
+ >();
34
+ expectTypeOf<DrawArg>().toEqualTypeOf<RenderFrameInput>();
25
35
  });
26
36
  });
@@ -6,14 +6,15 @@
6
6
  //
7
7
  // Tests drive recordFrame() directly with mock internals. All mock objects
8
8
  // are typed through `any` to avoid constructing full RhiDevice / PipelineState /
9
- // AssetRegistry / GpuResourceStore objects (each is ~50+ fields with branded
9
+ // AssetRegistry / GpuResidencyCache objects (each is ~50+ fields with branded
10
10
  // opaque types). The test surface is the recordFrame function — verify that
11
11
  // getCurrentTexture failure triggers reconfigure+retry and that consecutive
12
12
  // failures escalate to health internal-fault.
13
13
 
14
- import { acquireSwapChainTarget, HealthListenerRegistry } from '@forgeax/engine-render/internal';
15
14
  import { RhiError } from '@forgeax/engine-rhi';
16
15
  import { describe, expect, it } from 'vitest';
16
+ import { HealthListenerRegistry } from '../../../render/src/lifecycle';
17
+ import { acquireSwapChainTarget } from '../../../render/src/record/frame-targets';
17
18
 
18
19
  // biome-ignore lint/suspicious/noExplicitAny: mock objects are intentionally opaque in test code
19
20
  type MockObj = Record<string, any>;
@@ -24,9 +25,6 @@ function makePipelineState(): MockObj {
24
25
  format: 'bgra8unorm',
25
26
  colorAttachmentFormat: 'bgra8unorm-srgb',
26
27
  standardPipeline: { __brand: 'RP' },
27
- standardPipelineHdr: { __brand: 'RP' },
28
- standardPipelineMsaa: { __brand: 'RP' },
29
- standardPipelineHdrMsaa: { __brand: 'RP' },
30
28
  unlitPipeline: { __brand: 'RP' },
31
29
  unlitPipelineHdr: { __brand: 'RP' },
32
30
  unlitPipelineMsaa: { __brand: 'RP' },
@@ -0,0 +1,56 @@
1
+ import type { World } from '@forgeax/engine-ecs';
2
+ import type {
3
+ FrameReceipt,
4
+ RenderError,
5
+ Renderer,
6
+ RenderResult,
7
+ RenderWorldLease,
8
+ } from '@forgeax/engine-render';
9
+ import { createRenderer } from '../createRenderer';
10
+
11
+ export async function requireRenderer(
12
+ ...args: Parameters<typeof createRenderer>
13
+ ): Promise<Renderer> {
14
+ const result = await createRenderer(...args);
15
+ if (!result.ok) throw result.error;
16
+ return result.value;
17
+ }
18
+
19
+ const leasesByRenderer = new WeakMap<Renderer, Map<World, RenderWorldLease>>();
20
+
21
+ /** Adapt pre-lease multi-world fixtures to the public frame input contract. */
22
+ export function drawWithOwners(
23
+ renderer: Renderer,
24
+ worldsOrWorld: World | readonly World[],
25
+ options: { readonly cameraOwner?: number; readonly resourceOwner?: number } = {},
26
+ ): RenderResult<FrameReceipt, RenderError> {
27
+ const worlds = Array.isArray(worldsOrWorld) ? worldsOrWorld : [worldsOrWorld];
28
+ let leases = leasesByRenderer.get(renderer);
29
+ if (leases === undefined) {
30
+ leases = new Map();
31
+ leasesByRenderer.set(renderer, leases);
32
+ }
33
+ const attached = worlds.map((world) => {
34
+ const existing = leases.get(world);
35
+ if (existing !== undefined) return existing;
36
+ const result = renderer.attach(world);
37
+ if (!result.ok) throw result.error;
38
+ leases.set(world, result.value);
39
+ return result.value;
40
+ });
41
+ const camera = worlds[options.cameraOwner ?? 0];
42
+ const environment = worlds[options.resourceOwner ?? 0];
43
+ if (camera === undefined || environment === undefined) {
44
+ throw new Error('drawWithOwners requires cameraOwner/resourceOwner worlds');
45
+ }
46
+ const cameraLease = leases.get(camera);
47
+ const environmentLease = leases.get(environment);
48
+ if (cameraLease === undefined || environmentLease === undefined) {
49
+ throw new Error('drawWithOwners failed to attach owner worlds');
50
+ }
51
+ return renderer.draw({
52
+ leases: attached,
53
+ camera: { lease: cameraLease },
54
+ environment: { lease: environmentLease },
55
+ });
56
+ }
@@ -0,0 +1,59 @@
1
+ // Renderer public-surface and event-contract type assertions.
2
+
3
+ import type { RenderError, Renderer, RendererEvent } from '@forgeax/engine-render';
4
+
5
+ type RendererEventListener = (event: RendererEvent) => void;
6
+
7
+ import type {
8
+ // @ts-expect-error - BundlerOptions is an internal construct seam
9
+ BundlerOptions as _BundlerOptionsRemoved,
10
+ // @ts-expect-error - ConsoleHandle must not be exported from @forgeax/engine-runtime
11
+ ConsoleHandle as _ConsoleHandleRemoved,
12
+ // @ts-expect-error - StartConsoleOptions must not be exported from @forgeax/engine-runtime
13
+ StartConsoleOptions as _StartConsoleOptionsRemoved,
14
+ } from '@forgeax/engine-runtime';
15
+ import { describe, expectTypeOf, it } from 'vitest';
16
+
17
+ type _UnusedSink = _StartConsoleOptionsRemoved | _ConsoleHandleRemoved | _BundlerOptionsRemoved;
18
+
19
+ describe('Renderer public surface', () => {
20
+ it('does not expose removed console or legacy listener members', () => {
21
+ // @ts-expect-error - startConsole is internal to the runtime host
22
+ type _StartConsoleAbsent = Renderer['startConsole'];
23
+ // @ts-expect-error - onLost was replaced by subscribe(RendererEventListener)
24
+ type _OnLostAbsent = Renderer['onLost'];
25
+ // @ts-expect-error - onError was replaced by subscribe(RendererEventListener)
26
+ type _OnErrorAbsent = Renderer['onError'];
27
+ void (undefined as unknown as _StartConsoleAbsent | _OnLostAbsent | _OnErrorAbsent);
28
+
29
+ type RendererKey = keyof Renderer;
30
+ expectTypeOf<'attach'>().toExtend<RendererKey>();
31
+ expectTypeOf<'draw'>().toExtend<RendererKey>();
32
+ expectTypeOf<'dispose'>().toExtend<RendererKey>();
33
+ expectTypeOf<'subscribe'>().toExtend<RendererKey>();
34
+ expectTypeOf<'observe'>().toExtend<RendererKey>();
35
+ });
36
+ });
37
+
38
+ describe('subscribe projects the discriminated Renderer event contract', () => {
39
+ it('passes RendererEvent and exposes RenderError on the error arm', () => {
40
+ expectTypeOf<RendererEventListener>().parameter(0).toEqualTypeOf<RendererEvent>();
41
+ type ErrorEvent = Extract<RendererEvent, { readonly kind: 'error' }>;
42
+ expectTypeOf<ErrorEvent['error']>().toEqualTypeOf<RenderError>();
43
+ });
44
+
45
+ it('keeps state changes and errors exhaustively distinguishable', () => {
46
+ const describeEvent = (event: RendererEvent): string => {
47
+ switch (event.kind) {
48
+ case 'state-changed':
49
+ return `${event.previous}->${event.current}`;
50
+ case 'error':
51
+ return event.error.code;
52
+ }
53
+ };
54
+ expectTypeOf(describeEvent).returns.toEqualTypeOf<string>();
55
+ });
56
+ });
57
+
58
+ declare const __sink: _UnusedSink | undefined;
59
+ void __sink;
@@ -0,0 +1,111 @@
1
+ // M5 w19: Type-level verification that resolveAssetHandle return type
2
+ // includes stale error codes and supports exhaustive switch.
3
+ //
4
+ // AC-10: adding a new stale error code reachable from resolve-asset-handle.ts
5
+ // will cause tsc to fail, serving as a regression guard.
6
+ //
7
+ // Note: uses `shared-ref-stale` as an instanceof-tested guard in a switch
8
+ // that must handle all AssetErrorCode members WITHOUT a default case.
9
+ // Because vitest typecheck.enabled is not set in runtime, we verify the
10
+ // structural type inclusion via instanceof narrowing paths.
11
+ //
12
+ // biome-ignore-all lint/suspicious/noExplicitAny: type-level extract + test seams
13
+
14
+ // Type-level re-export to verify stale error codes appear in resolveAssetHandle
15
+ // return type. The return type is `Result<T, AssetErrorType | SharedRefStaleError | UniqueRefStaleError>`.
16
+ // This test verifies structural narrowing works.
17
+ import type { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
18
+ import { describe, expect, it } from 'vitest';
19
+
20
+ // Extract the Error union from resolveAssetHandle return type at the
21
+ // type level — this is a compile-time assertion.
22
+ type ResolveErrCode =
23
+ Extract<ReturnType<typeof resolveAssetHandle<any>>, { ok: false }> extends {
24
+ error: infer E extends { code: string };
25
+ }
26
+ ? E['code']
27
+ : never;
28
+
29
+ describe('resolveAssetHandle AC-10 stale error forwarding type gate', () => {
30
+ it('return type error union includes shared-ref-stale (compile-time)', () => {
31
+ // If shared-ref-stale is NOT in the union, the assignment below fails at tsc.
32
+ const _c1: ResolveErrCode = 'shared-ref-stale' as const;
33
+ void _c1;
34
+ expect(true).toBe(true);
35
+ });
36
+
37
+ it('return type error union includes unique-ref-stale (compile-time)', () => {
38
+ const _c2: ResolveErrCode = 'unique-ref-stale' as const;
39
+ void _c2;
40
+ expect(true).toBe(true);
41
+ });
42
+
43
+ it('return type error union includes asset-not-found (compile-time)', () => {
44
+ const _c3: ResolveErrCode = 'asset-not-found' as const;
45
+ void _c3;
46
+ expect(true).toBe(true);
47
+ });
48
+
49
+ it('exhaustive switch over AssetErrorCode (runtime guard for AC-10)', () => {
50
+ // A real consumer pattern: switch over all AssetErrorCode members plus
51
+ // the stale codes forwarded by resolveAssetHandle. This is a runtime
52
+ // test that the switch compiles — if a code is missing, tsc errors.
53
+ function mapErrorCode(code: string): string {
54
+ switch (code) {
55
+ case 'asset-not-found':
56
+ return 'NOT_FOUND';
57
+ case 'asset-parse-failed':
58
+ return 'PARSE';
59
+ case 'asset-format-unsupported':
60
+ return 'FORMAT';
61
+ case 'asset-fetch-failed':
62
+ return 'FETCH';
63
+ case 'asset-invalid-value':
64
+ return 'INVALID';
65
+ case 'cubemap-handle-missing':
66
+ return 'CUBEMAP';
67
+ case 'invalid-source-format':
68
+ return 'SRC_FORMAT';
69
+ case 'load-failed':
70
+ return 'LOAD';
71
+ case 'device-unsupported':
72
+ return 'DEVICE';
73
+ case 'ibl-precompute-not-dispatched':
74
+ return 'IBL';
75
+ case 'mesh-vertex-stride-mismatch':
76
+ return 'STRIDE';
77
+ case 'material-shader-ref-broken':
78
+ return 'SHADER_REF';
79
+ case 'material-circular-inheritance':
80
+ return 'CIRCULAR';
81
+ case 'loader-not-registered':
82
+ return 'LOADER';
83
+ case 'asset-not-imported':
84
+ return 'NOT_IMPORTED';
85
+ case 'texture-source-not-imported':
86
+ return 'TEX_NOT_IMPORTED';
87
+ case 'mesh-renderer-material-count-mismatch':
88
+ return 'MAT_COUNT';
89
+ case 'mesh-asset-submeshes-empty':
90
+ return 'SUBMESH_EMPTY';
91
+ case 'mesh-submesh-index-range-out-of-bounds':
92
+ return 'SUBMESH_OOB';
93
+ case 'tileset-region-index-out-of-range':
94
+ return 'TILESET_OOB';
95
+ case 'tileset-tile-entry-malformed':
96
+ return 'TILESET_MALFORMED';
97
+ case 'asset-invalidated':
98
+ return 'INVALIDATED';
99
+ // AC-10: stale error codes forwarded by resolveAssetHandle.
100
+ case 'shared-ref-stale':
101
+ return 'STALE_SHARED';
102
+ case 'unique-ref-stale':
103
+ return 'STALE_UNIQUE';
104
+ }
105
+ throw new Error(`Unhandled error code: ${code}`);
106
+ }
107
+ expect(mapErrorCode('shared-ref-stale')).toBe('STALE_SHARED');
108
+ expect(mapErrorCode('unique-ref-stale')).toBe('STALE_UNIQUE');
109
+ expect(mapErrorCode('asset-not-found')).toBe('NOT_FOUND');
110
+ });
111
+ });
@@ -0,0 +1,64 @@
1
+ // M7 w55 / M8 w59: resolveAssetHandle two-tier dispatch unit test.
2
+ //
3
+ // D-15 two-tier asset resolution: resolveAssetHandle(world, handle) dispatches
4
+ // by slot range — builtin slots (< BUILTIN_BASE) resolve through
5
+ // BuiltinAssetRegistry.resolve (process-static, no World needed); user-tier
6
+ // slots (>= BUILTIN_BASE) resolve through world.sharedRefs (minted via
7
+ // world.allocSharedRef). The AssetRegistry holds no handle->payload map.
8
+
9
+ import { BUILTIN_CUBE, HANDLE_CUBE, resolveAssetHandle } from '@forgeax/engine-assets-runtime';
10
+ import { World } from '@forgeax/engine-ecs';
11
+ import type { MeshAsset } from '@forgeax/engine-types';
12
+ import { BUILTIN_BASE } from '@forgeax/engine-types';
13
+ import { describe, expect, it } from 'vitest';
14
+
15
+ function mesh(): MeshAsset {
16
+ return {
17
+ kind: 'mesh',
18
+ vertices: new Float32Array([0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1]),
19
+ indices: new Uint16Array([0]),
20
+ attributes: {},
21
+ submeshes: [
22
+ {
23
+ indexOffset: 0,
24
+ indexCount: 1,
25
+ vertexCount: 12,
26
+ topology: 'triangle-list' as const,
27
+ },
28
+ ],
29
+ } as unknown as MeshAsset;
30
+ }
31
+
32
+ describe('resolveAssetHandle two-tier slot-range dispatch (AC-31)', () => {
33
+ it('builtin slot (< BUILTIN_BASE): resolves through BuiltinAssetRegistry', () => {
34
+ // HANDLE_CUBE has slot=1 < BUILTIN_BASE=1024.
35
+ // Builtins are process-static — the World is unused for this path.
36
+ const world = new World();
37
+ const res = resolveAssetHandle(world, HANDLE_CUBE);
38
+ expect(res.ok).toBe(true);
39
+ if (res.ok) expect(res.value).toBe(BUILTIN_CUBE);
40
+ });
41
+
42
+ it('user-tier slot (>= BUILTIN_BASE): resolves through world.sharedRefs', () => {
43
+ // User-tier payloads live in the per-World SharedRefStore, minted via
44
+ // world.allocSharedRef. resolveAssetHandle routes user-tier slots there.
45
+ const world = new World();
46
+ const payload = mesh();
47
+ const handle = world.allocSharedRef('MeshAsset', payload);
48
+ expect(handle).toBeGreaterThanOrEqual(BUILTIN_BASE);
49
+ const res = resolveAssetHandle<MeshAsset>(world, handle);
50
+ expect(res.ok).toBe(true);
51
+ if (res.ok) expect(res.value).toBe(payload);
52
+ });
53
+
54
+ it('user-tier handle not in this World returns asset-not-found', () => {
55
+ // A handle minted in a DIFFERENT world is absent from this world's
56
+ // SharedRefStore — resolveAssetHandle must return err(asset-not-found).
57
+ const world = new World();
58
+ const foreign = new World();
59
+ const foreignHandle = foreign.allocSharedRef('MeshAsset', mesh());
60
+ const res = resolveAssetHandle(world, foreignHandle);
61
+ expect(res.ok).toBe(false);
62
+ if (!res.ok) expect(res.error.code).toBe('asset-not-found');
63
+ });
64
+ });
@@ -31,7 +31,7 @@ await vi.hoisted(async () => {
31
31
 
32
32
  // Import the render-graph-primitives module to extract the functions under test.
33
33
  // We can reach them through the resolved module namespace.
34
- const mod = await import('@forgeax/engine-render/internal');
34
+ const mod = await import('../../../render/src/render-graph-primitives');
35
35
  // resolveDepthOnlyView is exported; resolveHdrDepthDepthOnlyView is not.
36
36
  // We can test the delegate equivalence by calling resolveDepthOnlyView with
37
37
  // the SSAO label, which is the exact body of the delegate.
@@ -0,0 +1,64 @@
1
+ // AC-15 deterministic name fallback — runtime integration (feat-20260618 w19).
2
+ //
3
+ // deriveAssetName's branch logic is unit-tested in @forgeax/engine-pack (w8);
4
+ // this test exercises the runtime wiring (resolveName passing the right args).
5
+ //
6
+ // Coverage:
7
+ // AC-15.1 — multi-asset package entry with no stored name -> basename(path),
8
+ // no throw (old add-only packs are a reachable state).
9
+ // AC-15.2 — null package with no stored name -> '' (the detectable
10
+ // "genuinely no name" signal), no throw.
11
+ // D-5 — builtin meshes resolve to '' (null package, no name).
12
+
13
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
14
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
15
+ import type { SamplerAsset } from '@forgeax/engine-types';
16
+ import { describe, expect, it } from 'vitest';
17
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
18
+
19
+ const MULTI_A = 'e0000000-0000-4000-e000-000000000001';
20
+ const MULTI_B = 'e0000000-0000-4000-e000-000000000002';
21
+ const NO_PKG = 'e0000000-0000-4000-e000-000000000003';
22
+ // Builtin cube GUID -- the constructor registers it with a null package (D-5).
23
+ const BUILTIN_CUBE_GUID = 'cbe42beb-8975-5096-b3a1-3dda4cb4c077';
24
+
25
+ function parseGuid(s: string): AssetGuid {
26
+ const r = AssetGuid.parse(s);
27
+ if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
28
+ return r.value;
29
+ }
30
+
31
+ function makeRegistry(): AssetRegistry {
32
+ return new AssetRegistry(makeMockShaderRegistry());
33
+ }
34
+
35
+ const sampler: SamplerAsset = { kind: 'sampler' };
36
+
37
+ describe('resolveName deterministic fallback (AC-15)', () => {
38
+ it('AC-15.1 multi-asset entry with no stored name falls back to basename', () => {
39
+ const reg = makeRegistry();
40
+ reg.catalog(parseGuid(MULTI_A), sampler);
41
+ reg.catalog(parseGuid(MULTI_B), sampler);
42
+ // Only MULTI_A carries a name; MULTI_B has none (old add-only pack).
43
+ reg._registerPackage('assets/world.glb', [MULTI_A, MULTI_B], new Map([[MULTI_A, 'Ground']]));
44
+
45
+ expect(() => reg.resolveName(MULTI_B)).not.toThrow();
46
+ expect(reg.resolveName(MULTI_B)).toBe('world.glb');
47
+ expect(reg.resolveName(MULTI_A)).toBe('Ground');
48
+ });
49
+
50
+ it('AC-15.2 null package with no name resolves to empty string', () => {
51
+ const reg = makeRegistry();
52
+ reg.catalog(parseGuid(NO_PKG), sampler);
53
+ reg._registerPackage(null, [NO_PKG]);
54
+
55
+ expect(() => reg.resolveName(NO_PKG)).not.toThrow();
56
+ expect(reg.resolveName(NO_PKG)).toBe('');
57
+ });
58
+
59
+ it('D-5 builtin mesh resolves to empty string (null package, no name)', () => {
60
+ const reg = makeRegistry();
61
+ expect(reg.packageOf(BUILTIN_CUBE_GUID)).toBe(null);
62
+ expect(reg.resolveName(BUILTIN_CUBE_GUID)).toBe('');
63
+ });
64
+ });
@@ -0,0 +1,38 @@
1
+ // resolveName null package — AC-03 (feat-20260618 w17).
2
+ //
3
+ // Red-first: written before w10 implements resolveName.
4
+ //
5
+ // Coverage:
6
+ // AC-03 — no-package asset: packageOf(guid) === null, resolveName returns the
7
+ // stored self name, and no synthetic guid path is minted (OOS-3).
8
+
9
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
10
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
11
+ import type { SamplerAsset } from '@forgeax/engine-types';
12
+ import { describe, expect, it } from 'vitest';
13
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
14
+
15
+ const NO_PKG_GUID = 'b0000000-0000-4000-b000-000000000001';
16
+
17
+ function parseGuid(s: string): AssetGuid {
18
+ const r = AssetGuid.parse(s);
19
+ if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
20
+ return r.value;
21
+ }
22
+
23
+ function makeRegistry(): AssetRegistry {
24
+ return new AssetRegistry(makeMockShaderRegistry());
25
+ }
26
+
27
+ const sampler: SamplerAsset = { kind: 'sampler' };
28
+
29
+ describe('resolveName null package (AC-03)', () => {
30
+ it('packageOf is null, resolveName returns the stored name, no synthetic path', () => {
31
+ const reg = makeRegistry();
32
+ reg.catalog(parseGuid(NO_PKG_GUID), sampler);
33
+ reg._registerPackage(null, [NO_PKG_GUID], new Map([[NO_PKG_GUID, 'myProcMesh']]));
34
+
35
+ expect(reg.packageOf(NO_PKG_GUID)).toBe(null);
36
+ expect(reg.resolveName(NO_PKG_GUID)).toBe('myProcMesh');
37
+ });
38
+ });
@@ -0,0 +1,65 @@
1
+ // AC-04 unified name resolution — single source of truth, no bypass (feat-20260618 w18).
2
+ //
3
+ // resolveName is the one runtime name-truth function and it delegates to the
4
+ // stateless deriveAssetName pure function (D-6). Every other name consumer reads
5
+ // resolveName or that same deriveAssetName -- none re-implements the XOR rule.
6
+ //
7
+ // This is a grep/fixture test, not a pure runtime assertion: it reads the source
8
+ // trees and asserts structural unification.
9
+ //
10
+ // M4 (w24/w22) wiring completed: inspect() now calls resolveName; the catalog
11
+ // builder now calls deriveAssetName. The grep assertions below confirm both
12
+ // paths route through the SSOT, no bypass.
13
+
14
+ import { readFileSync } from 'node:fs';
15
+ import { fileURLToPath } from 'node:url';
16
+ import { describe, expect, it } from 'vitest';
17
+
18
+ const here = fileURLToPath(new URL('.', import.meta.url));
19
+ const registrySrc = readFileSync(`${here}../../../assets-runtime/src/asset-registry.ts`, 'utf8');
20
+ const deriveSrc = readFileSync(
21
+ fileURLToPath(new URL('../../../pack/src/deriveAssetName.ts', import.meta.url)),
22
+ 'utf8',
23
+ );
24
+ const buildCatalogSrc = readFileSync(
25
+ fileURLToPath(new URL('../../../pack/src/catalog-builder.ts', import.meta.url)),
26
+ 'utf8',
27
+ );
28
+
29
+ describe('unified name resolution (AC-04)', () => {
30
+ it('deriveAssetName is the single XOR rule definition', () => {
31
+ expect(deriveSrc).toContain('export function deriveAssetName');
32
+ });
33
+
34
+ it('resolveName delegates to deriveAssetName (no inline XOR re-implementation)', () => {
35
+ expect(registrySrc).toContain("import { deriveAssetName } from '@forgeax/engine-pack/name'");
36
+ // resolveName returns the result of deriveAssetName, not a hand-rolled rule.
37
+ const body = registrySrc.slice(
38
+ registrySrc.indexOf('resolveName(guid: AssetGuid | string): string'),
39
+ );
40
+ const fnBody = body.slice(0, body.indexOf('\n }'));
41
+ expect(fnBody).toContain('return deriveAssetName(');
42
+ });
43
+
44
+ it('resolveName is the only public name accessor on the registry (no sibling getName)', () => {
45
+ expect(registrySrc).not.toMatch(/\n {2}getName\(/);
46
+ expect(registrySrc).not.toMatch(/\n {2}displayName\(/);
47
+ });
48
+
49
+ // M4 expansion (w24 landed): inspect() routes through resolveName
50
+ it('inspect() calls resolveName per entry (M4 w24 wiring)', () => {
51
+ // inspect() pushes { name: this.resolveName(guid) } -- no inline basename
52
+ expect(registrySrc).toContain('name: this.resolveName(guid)');
53
+ // No hardcoded '' placeholder left from M1/w3
54
+ expect(registrySrc).not.toContain("name: ''");
55
+ });
56
+
57
+ // M4 expansion (w22 landed): catalog-builder routes through deriveAssetName
58
+ it('catalog-builder imports and calls deriveAssetName (no inline XOR)', () => {
59
+ expect(buildCatalogSrc).toContain("import { deriveAssetName } from './deriveAssetName.js'");
60
+ expect(buildCatalogSrc).toContain('deriveAssetName(');
61
+ // No inline re-implementation of the XOR rule (no hand-rolled basename)
62
+ // The single deriveAssetName pure function handles all branches.
63
+ expect(buildCatalogSrc.match(/deriveAssetName\(/g)?.length ?? 0).toBeGreaterThanOrEqual(2);
64
+ });
65
+ });
@@ -0,0 +1,64 @@
1
+ // resolveName single / multi asset package — AC-01 + AC-02 (feat-20260618 w16).
2
+ //
3
+ // Red-first: written before w10 implements resolveName. Constructs the package
4
+ // state directly through registerPackage (Risk-2: no pack-index fetch needed).
5
+ //
6
+ // Coverage:
7
+ // AC-01 — single-asset package: resolveName === basename(path); the stored
8
+ // Asset POD carries no `name` property (name is never on the payload).
9
+ // AC-02 — multi-asset package: resolveName returns each entry's stored name.
10
+
11
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
12
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
13
+ import type { SamplerAsset } from '@forgeax/engine-types';
14
+ import { describe, expect, it } from 'vitest';
15
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
16
+
17
+ const SINGLE_GUID = 'a0000000-0000-4000-a000-000000000001';
18
+ const MULTI_A_GUID = 'a0000000-0000-4000-a000-000000000002';
19
+ const MULTI_B_GUID = 'a0000000-0000-4000-a000-000000000003';
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
+ function makeRegistry(): AssetRegistry {
28
+ return new AssetRegistry(makeMockShaderRegistry());
29
+ }
30
+
31
+ const sampler: SamplerAsset = { kind: 'sampler' };
32
+
33
+ describe('resolveName single-asset package (AC-01)', () => {
34
+ it('returns basename(path) and the POD has no name property', () => {
35
+ const reg = makeRegistry();
36
+ reg.catalog(parseGuid(SINGLE_GUID), sampler);
37
+ reg._registerPackage('assets/hero.glb', [SINGLE_GUID]);
38
+
39
+ expect(reg.resolveName(SINGLE_GUID)).toBe('hero.glb');
40
+
41
+ const stored = reg.lookup(SINGLE_GUID);
42
+ expect(stored).toBeDefined();
43
+ expect(Object.hasOwn(stored as object, 'name')).toBe(false);
44
+ });
45
+ });
46
+
47
+ describe('resolveName multi-asset package (AC-02)', () => {
48
+ it('returns each entry stored name', () => {
49
+ const reg = makeRegistry();
50
+ reg.catalog(parseGuid(MULTI_A_GUID), sampler);
51
+ reg.catalog(parseGuid(MULTI_B_GUID), sampler);
52
+ reg._registerPackage(
53
+ 'assets/char.glb',
54
+ [MULTI_A_GUID, MULTI_B_GUID],
55
+ new Map([
56
+ [MULTI_A_GUID, 'Body'],
57
+ [MULTI_B_GUID, 'Head'],
58
+ ]),
59
+ );
60
+
61
+ expect(reg.resolveName(MULTI_A_GUID)).toBe('Body');
62
+ expect(reg.resolveName(MULTI_B_GUID)).toBe('Head');
63
+ });
64
+ });