@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
@@ -9,7 +9,7 @@
9
9
  // No existing green test reached it - the MSAA demo scene is pure mesh
10
10
  // (triangle/cube/quad/sphere) and the hello-sprite smoke runs antialias=none.
11
11
  //
12
- // This test renders a sprite entity (a World-owned unit quad + forgeax::sprite material)
12
+ // This test renders a sprite entity (HANDLE_QUAD + forgeax::sprite material)
13
13
  // behind a default perspective Camera with tonemap=none, once at
14
14
  // antialias=none and once at antialias=msaa, and asserts:
15
15
  // (1) the MSAA pass emits 0 RhiError - if the sprite sub-pass paired a
@@ -34,9 +34,8 @@
34
34
  // covered by the hello-sprite smoke FPS gate (smoke green = no
35
35
  // regression beyond the SMOKE_PIXEL_THRESHOLD eps).
36
36
 
37
+ import { HANDLE_QUAD } from '@forgeax/engine-assets-runtime';
37
38
  import { World } from '@forgeax/engine-ecs';
38
- import { createPrimitiveMesh } from '@forgeax/engine-geometry';
39
- import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '@forgeax/engine-render/authoring';
40
39
  import {
41
40
  ANTIALIAS_MSAA,
42
41
  ANTIALIAS_NONE,
@@ -44,11 +43,11 @@ import {
44
43
  MeshFilter,
45
44
  MeshRenderer,
46
45
  TONEMAP_NONE,
47
- } from '@forgeax/engine-render/internal';
46
+ } from '@forgeax/engine-render';
47
+ import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '@forgeax/engine-render/authoring';
48
48
  import { Transform } from '@forgeax/engine-scene';
49
- import type { Asset } from '@forgeax/engine-types';
50
49
  import { describe, expect, it } from 'vitest';
51
- import { createRenderer } from '../index';
50
+ import { constructRuntimeRendererHost } from '../renderer-host';
52
51
  import { drawPublished } from './draw-published';
53
52
 
54
53
  const WIDTH = 256;
@@ -124,14 +123,13 @@ function buildSyntheticRgba(): { width: number; height: number; data: Uint8Array
124
123
 
125
124
  function spawnSpriteScene(world: World, spriteMaterialPayload: unknown, antialias: number): void {
126
125
  // feat-20260614 M8: MeshRenderer.materials holds a per-World column handle
127
- // (numeric); mint it from the published material payload on the World the
126
+ // (numeric); mint it from the catalogued material payload on the World the
128
127
  // scene is spawned into. The material's texture/sampler values are GUID
129
128
  // strings the extract stage resolves to per-World handles.
130
129
  const spriteMaterial = world.allocSharedRef('MaterialAsset', spriteMaterialPayload);
131
130
  // A rotated quad gives diagonal sprite edges so MSAA has something to
132
131
  // smooth (the camera-facing axis-aligned quad would expose almost no
133
132
  // edge to antialias).
134
- const meshHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('quad').unwrap());
135
133
  world.spawn(
136
134
  {
137
135
  component: Transform,
@@ -141,7 +139,7 @@ function spawnSpriteScene(world: World, spriteMaterialPayload: unknown, antialia
141
139
  scale: [1, 1, 1],
142
140
  },
143
141
  },
144
- { component: MeshFilter, data: { assetHandle: meshHandle } },
142
+ { component: MeshFilter, data: { assetHandle: HANDLE_QUAD } },
145
143
  { component: MeshRenderer, data: { materials: [spriteMaterial as never] } },
146
144
  );
147
145
  world.spawn(
@@ -224,59 +222,33 @@ describe('feat-20260604-msaa M2 w9 [F-1]: LDR sprite + MSAA split sub-pass cover
224
222
  removeEventListener() {},
225
223
  } as unknown as HTMLCanvasElement;
226
224
 
227
- const payloads = new Map<string, Asset>();
228
- let assetEpoch = 0;
229
- const assetResolver = {
230
- get epoch(): number {
231
- return assetEpoch;
232
- },
233
- lookup<T extends Asset>(guid: string): T | undefined {
234
- return payloads.get(guid) as T | undefined;
235
- },
236
- guidOf(asset: Asset): string | undefined {
237
- for (const [guid, payload] of payloads) {
238
- if (payload === asset) return guid;
239
- }
240
- return undefined;
241
- },
242
- publish(guid: string, asset: Asset): void {
243
- payloads.set(guid, asset);
244
- assetEpoch += 1;
245
- },
246
- };
247
-
248
- let renderer: Awaited<ReturnType<typeof createRenderer>>;
225
+ let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
249
226
  try {
250
- renderer = await createRenderer(
227
+ host = await constructRuntimeRendererHost(
251
228
  mockCanvas,
252
229
  {},
253
230
  {
254
231
  shaderManifestUrl: ENGINE_MANIFEST_URL,
255
- assetResolver,
256
232
  },
257
233
  );
258
234
  } finally {
259
235
  globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
260
236
  }
261
- expect(renderer.backend).toBe('webgpu');
262
- const ready = await renderer.ready;
263
- expect(ready.ok).toBe(true);
264
- if (!ready.ok) return;
237
+ expect(host.ok).toBe(true);
238
+ if (!host.ok) throw host.error;
239
+ const { renderer, assets } = host.value;
240
+ expect(renderer.inspect().state).toBe('alive');
265
241
  const device = sharedDevice;
266
242
  if (device === undefined) throw new Error('GPUDevice not captured');
267
243
 
268
- const assets = assetResolver;
269
-
270
244
  // Catalogue + upload a small sprite texture, a sampler, and a
271
245
  // forgeax::sprite material. feat-20260625 M2/M3 (D-3): sprite is now
272
246
  // a regular material whose `transparent: true` first-pass flag (not
273
247
  // the legacy shadingModel='sprite' arm) drives the LDR split sub-pass
274
- // in the record stage. The resolver holds GUID->
248
+ // in the record stage. feat-20260614 M8: AssetRegistry holds GUID->
275
249
  // payload only (no handle concept); texture/sampler are referenced
276
250
  // from the material values by GUID string and resolved to per-
277
- // World column handles at extract. The explicit uploadTexture call
278
- // exercises the GPU residency path via a column handle minted on an
279
- // upload-only World.
251
+ // World column handles at extract. The record stage owns GPU residency.
280
252
  //
281
253
  // Falsification (smoke harness sensitivity claim, not committed to CI):
282
254
  // if the sprite pass's blend state is hand-rewritten to `src=one /
@@ -298,28 +270,19 @@ describe('feat-20260604-msaa M2 w9 [F-1]: LDR sprite + MSAA split sub-pass cover
298
270
  const TEX_GUID = '00000000-0000-7000-8000-0000000005a1';
299
271
  const SAMPLER_GUID = '00000000-0000-7000-8000-0000000005a2';
300
272
  const MATERIAL_GUID = '00000000-0000-7000-8000-0000000005a3';
301
- assets.publish(TEX_GUID, synthPod as never);
273
+ const texCatalog = assets.catalog(TEX_GUID, synthPod as never);
274
+ expect(texCatalog.ok, 'sprite texture catalog').toBe(true);
275
+ if (!texCatalog.ok) return;
302
276
 
303
- const uploadWorld = new World();
304
- const textureHandle = uploadWorld.allocSharedRef('TextureAsset', synthPod);
305
- const uploadRes = await renderer.store.uploadTexture(textureHandle, synthPod as never, {
306
- bytes: synth.data,
307
- width: synth.width,
308
- height: synth.height,
309
- mime: 'image/png',
310
- colorSpace: 'srgb',
311
- mipmap: false,
312
- });
313
- expect(uploadRes.ok, 'sprite texture upload').toBe(true);
314
- if (!uploadRes.ok) return;
315
-
316
- assets.publish(SAMPLER_GUID, {
277
+ const samplerCatalog = assets.catalog(SAMPLER_GUID, {
317
278
  kind: 'sampler',
318
279
  magFilter: 'linear',
319
280
  minFilter: 'linear',
320
281
  addressModeU: 'repeat',
321
282
  addressModeV: 'repeat',
322
283
  } as never);
284
+ expect(samplerCatalog.ok, 'sampler catalog').toBe(true);
285
+ if (!samplerCatalog.ok) return;
323
286
 
324
287
  const spriteMaterialPayload = {
325
288
  kind: 'material' as const,
@@ -343,20 +306,15 @@ describe('feat-20260604-msaa M2 w9 [F-1]: LDR sprite + MSAA split sub-pass cover
343
306
  // older demos keep rendering during migration; new code declares
344
307
  // the UBO-aligned forms directly.
345
308
  colorTint: [1.0, 0.4, 0.4, 1.0],
346
- baseColorTexture: {
347
- texture: TEX_GUID,
348
- coordinates: {
349
- set: 0,
350
- transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
351
- physicalUvScale: [1, 1],
352
- },
353
- },
309
+ baseColorTexture: TEX_GUID,
354
310
  sampler: SAMPLER_GUID,
355
311
  region: [0, 0, 1, 1],
356
312
  pivotAndSize: [0.5, 0.5, 1, 1],
357
313
  },
358
314
  };
359
- assets.publish(MATERIAL_GUID, spriteMaterialPayload as never);
315
+ const matCatalog = assets.catalog(MATERIAL_GUID, spriteMaterialPayload as never);
316
+ expect(matCatalog.ok, 'sprite material catalog').toBe(true);
317
+ if (!matCatalog.ok) return;
360
318
 
361
319
  // Pass 1: antialias=none baseline.
362
320
  const worldNone = new World();
@@ -372,7 +330,10 @@ describe('feat-20260604-msaa M2 w9 [F-1]: LDR sprite + MSAA split sub-pass cover
372
330
  // under MSAA. Capture every RhiError fired through the renderer's
373
331
  // fan-out channel during this draw.
374
332
  const msaaErrors: Array<{ code: string }> = [];
375
- const unsubscribe = renderer.onError((err) => msaaErrors.push({ code: err.code }));
333
+ const unsubscribe = renderer.subscribe((event) => {
334
+ if (event.kind !== 'error') return;
335
+ msaaErrors.push({ code: event.error.code });
336
+ });
376
337
  const worldMsaa = new World();
377
338
  spawnSpriteScene(worldMsaa, spriteMaterialPayload, ANTIALIAS_MSAA);
378
339
  const drawnMsaa = drawPublished(renderer, worldMsaa);
@@ -0,0 +1,132 @@
1
+ // feat-20260622 M6 / w23 — AC-07 contract: a new reference does NOT require any
2
+ // change to a graph-walk axis. The recursion source is `envelope.refs` (D-5), so
3
+ // when the importer puts a referenced GUID into refs[], the recursive loadByGuid
4
+ // walk pulls it -- no exhaustive `switch (asset.kind)` arm to add, no per-kind
5
+ // runtime walker to extend. feat-20260623 M2: the ASSET_BRAND table (the only
6
+ // kind-exhaustive mapping a new Asset kind previously touched) is now retired;
7
+ // a new kind requires zero engine-type changes (brand concept eliminated).
8
+ //
9
+ // This locks the structural win of the refs-as-SSOT pivot: adding a reference
10
+ // field to any Asset member surfaces in the load graph through refs[] alone.
11
+ //
12
+ // The retired graph-walk mechanisms (collect-refs.ts + the
13
+ // asset-registry.recursive.test-d.ts exhaustive-switch guard) are deleted in
14
+ // w19; their absence is enforced structurally -- nothing imports them and the
15
+ // milestone grep gate asserts the retired ref-collection switch leaves zero
16
+ // references across the tree.
17
+ // (A filesystem existsSync check is intentionally avoided: node:fs/node:path
18
+ // named imports are outside @types/node coverage in the runtime tsconfig.)
19
+
20
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
21
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
22
+ import type { MaterialAsset } from '@forgeax/engine-types';
23
+ import { afterEach, describe, expect, it, vi } from 'vitest';
24
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
25
+
26
+ const PARENT_GUID = 'c0000000-0000-4000-c000-000000000001';
27
+ const EXTRA_REF_GUID = 'c0000000-0000-4000-c000-000000000002';
28
+
29
+ function parseGuid(s: string): AssetGuid {
30
+ const r = AssetGuid.parse(s);
31
+ if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
32
+ return r.value;
33
+ }
34
+
35
+ function makeRegistry(): AssetRegistry {
36
+ return new AssetRegistry(makeMockShaderRegistry());
37
+ }
38
+
39
+ const stubMaterial: MaterialAsset = {
40
+ kind: 'material',
41
+ passes: [
42
+ {
43
+ name: 'forward',
44
+ program: { module: 'test::dummy' },
45
+ renderState: { tags: { LightMode: 'Forward' } },
46
+ },
47
+ ],
48
+ values: {},
49
+ };
50
+
51
+ afterEach(() => {
52
+ // biome-ignore lint/suspicious/noExplicitAny: test teardown
53
+ delete (globalThis as any).fetch;
54
+ });
55
+
56
+ describe('AC-07 — a new reference appears in the load graph via envelope.refs', () => {
57
+ it('an extra ref the importer adds to refs[] is recursively loaded', async () => {
58
+ const reg = makeRegistry();
59
+
60
+ // The "extra reference" sub-asset is pre-registered in dev mode so the
61
+ // recursive walk hits the fast-path. Stand-in for "importer added a brand
62
+ // new reference field whose GUID it dropped into refs[]".
63
+ reg.catalog(parseGuid(EXTRA_REF_GUID), {
64
+ kind: 'texture',
65
+ width: 1,
66
+ height: 1,
67
+ format: 'rgba8unorm',
68
+ data: new Uint8Array(4),
69
+ colorSpace: 'srgb',
70
+ mipmap: false,
71
+ });
72
+
73
+ const packIndex = [
74
+ { guid: PARENT_GUID, packageUrl: '/packs/parent.pack.json', kind: 'material' },
75
+ ];
76
+ // The pack body carries refs[] = [EXTRA_REF_GUID]. No new switch arm, no
77
+ // per-kind walker change -- the GUID in refs[] is the entire wiring.
78
+ const parentPack = {
79
+ schemaVersion: '2.0.0',
80
+ kind: 'internal-text-package',
81
+ assets: [
82
+ {
83
+ guid: PARENT_GUID,
84
+ kind: 'material',
85
+ payload: {
86
+ passes: [
87
+ {
88
+ name: 'forward',
89
+ program: { module: 'test::dummy' },
90
+ renderState: { tags: { LightMode: 'Forward' } },
91
+ },
92
+ ],
93
+ values: {},
94
+ },
95
+ refs: [EXTRA_REF_GUID],
96
+ },
97
+ ],
98
+ };
99
+
100
+ reg.configurePackIndex('/pack-index.json');
101
+ const fetchMock = vi.fn().mockImplementation((url: string) => {
102
+ if (url === '/pack-index.json') {
103
+ return Promise.resolve({ ok: true, json: () => Promise.resolve(packIndex) });
104
+ }
105
+ if (url === '/packs/parent.pack.json') {
106
+ return Promise.resolve({ ok: true, json: () => Promise.resolve(parentPack) });
107
+ }
108
+ return Promise.resolve({ ok: false, status: 404 });
109
+ });
110
+ globalThis.fetch = fetchMock as typeof globalThis.fetch;
111
+
112
+ const result = await reg.loadByGuid<MaterialAsset>(parseGuid(PARENT_GUID));
113
+ expect(result.ok).toBe(true);
114
+ // The extra reference is in the load graph purely because it is in refs[].
115
+ expect(reg.lookup(parseGuid(EXTRA_REF_GUID))).not.toBe(undefined);
116
+ });
117
+
118
+ it('catalog() inline path: refs[] drives recursion with no walker', async () => {
119
+ const reg = makeRegistry();
120
+ reg.catalog(parseGuid(EXTRA_REF_GUID), {
121
+ kind: 'sampler',
122
+ magFilter: 'linear',
123
+ minFilter: 'linear',
124
+ });
125
+ // Direct register with an explicit refs edge; loadByGuid fast-path returns
126
+ // the body and the refs edge is the recursion source.
127
+ reg.catalog(parseGuid(PARENT_GUID), stubMaterial, [{ guid: EXTRA_REF_GUID }]);
128
+ const result = await reg.loadByGuid<MaterialAsset>(parseGuid(PARENT_GUID));
129
+ expect(result.ok).toBe(true);
130
+ expect(reg.lookup(parseGuid(EXTRA_REF_GUID))).not.toBe(undefined);
131
+ });
132
+ });
@@ -1,14 +1,12 @@
1
1
  // Ambient declarations for node:* modules used by dawn tests that read the
2
2
  // hello-triangle compiled shader manifest at runtime. The runtime package's
3
3
  // tsconfig does not enable @types/node (production target is browser); these
4
- // minimal shims keep tsc green for the 3 shadow dawn test files only.
4
+ // minimal shims keep tsc green for the small set of dawn test files that read
5
+ // compiled shader manifests at runtime.
5
6
  //
6
- // Used by:
7
- // - shadow-m2.dawn.test.ts
8
- // - shadow-m3.dawn.test.ts
9
- // - shadow-m3-calibrate-run.dawn.test.ts
7
+ // Used by shader-manifest Dawn fixtures and the runtime benchmark fixtures.
10
8
  // - tilemap-chunk-y-sort-bench.unit.test.ts (perf_hooks + process.env)
11
- // - render-system-fold-scene-instances.unit.test.ts (readdirSync + dirname)
9
+ // - record-fold-scene-instances.unit.test.ts (readdirSync + dirname)
12
10
  // - basis-catalog-dispatch.integration.test.ts (existsSync pkg-built gate)
13
11
 
14
12
  declare module 'node:fs' {
@@ -0,0 +1,88 @@
1
+ // 1->N package promotion idempotence — AC-05 (feat-20260618 w12).
2
+ //
3
+ // Red-first: written before w11 adds the promotion branch to registerPackage.
4
+ //
5
+ // Coverage:
6
+ // AC-05 — when a single-asset package gains a second asset, the original
7
+ // asset's derived basename is frozen as its stored name so it keeps
8
+ // the same resolveName (now via the multi-asset branch), with no error
9
+ // and no caller awareness. Promotion is idempotent: re-registering the
10
+ // same path does not overwrite an already-frozen name.
11
+ //
12
+ // The promotion is observable through `package.xor-invariant-violated`: when the
13
+ // original asset already carries a stored name at promotion time (the abnormal
14
+ // single-asset-with-name state, D-4), the freeze must not overwrite it and the
15
+ // soft-violation counter increments. Without w11 there is no promotion branch,
16
+ // so the counter never fires (the falsifying assertion).
17
+
18
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
19
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
20
+ import type { SamplerAsset } from '@forgeax/engine-types';
21
+ import { describe, expect, it } from 'vitest';
22
+ import { createEngineMetrics } from '../../../render/src/engine-metrics';
23
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
24
+
25
+ const G1 = 'c0000000-0000-4000-c000-000000000001';
26
+ const G2 = 'c0000000-0000-4000-c000-000000000002';
27
+ const PATH = 'assets/scene.glb';
28
+
29
+ function parseGuid(s: string): AssetGuid {
30
+ const r = AssetGuid.parse(s);
31
+ if (!r.ok) throw new Error(`invalid test GUID: ${s}`);
32
+ return r.value;
33
+ }
34
+
35
+ function makeRegistry(): AssetRegistry {
36
+ return new AssetRegistry(makeMockShaderRegistry());
37
+ }
38
+
39
+ const sampler: SamplerAsset = { kind: 'sampler' };
40
+
41
+ describe('1->N package promotion (AC-05)', () => {
42
+ it('single asset derives basename', () => {
43
+ const reg = makeRegistry();
44
+ reg.catalog(parseGuid(G1), sampler);
45
+ reg._registerPackage(PATH, [G1]);
46
+ expect(reg.resolveName(G1)).toBe('scene.glb');
47
+ });
48
+
49
+ it('adding a second asset keeps the original name unchanged, no error', () => {
50
+ const reg = makeRegistry();
51
+ reg.catalog(parseGuid(G1), sampler);
52
+ reg._registerPackage(PATH, [G1]);
53
+ reg.catalog(parseGuid(G2), sampler);
54
+ reg._registerPackage(PATH, [G2], new Map([[G2, 'SecondAsset']]));
55
+
56
+ expect(reg.resolveName(G1)).toBe('scene.glb');
57
+ expect(reg.resolveName(G2)).toBe('SecondAsset');
58
+ expect(reg.packageOf(G1)?.assetCount).toBe(2);
59
+ });
60
+
61
+ it('re-registering the same path is idempotent (does not overwrite frozen name)', () => {
62
+ const reg = makeRegistry();
63
+ reg.catalog(parseGuid(G1), sampler);
64
+ reg._registerPackage(PATH, [G1]);
65
+ reg.catalog(parseGuid(G2), sampler);
66
+ reg._registerPackage(PATH, [G2], new Map([[G2, 'SecondAsset']]));
67
+ reg._registerPackage(PATH, [G1, G2], new Map([[G2, 'SecondAsset']]));
68
+
69
+ expect(reg.resolveName(G1)).toBe('scene.glb');
70
+ expect(reg.resolveName(G2)).toBe('SecondAsset');
71
+ });
72
+
73
+ it('abnormal single-asset-with-name state bumps the xor counter and is not overwritten', () => {
74
+ const reg = makeRegistry();
75
+ const metrics = createEngineMetrics();
76
+ reg.setMetrics(metrics);
77
+ // Abnormal: a single-asset package whose lone asset already carries a name.
78
+ reg.catalog(parseGuid(G1), sampler);
79
+ reg._registerPackage(PATH, [G1], new Map([[G1, 'PreNamed']]));
80
+ reg.catalog(parseGuid(G2), sampler);
81
+ // Promotion fires: the pre-existing name is preserved (not overwritten by
82
+ // basename) and the soft-violation counter records the abnormal state.
83
+ reg._registerPackage(PATH, [G2], new Map([[G2, 'SecondAsset']]));
84
+
85
+ expect(reg.resolveName(G1)).toBe('PreNamed');
86
+ expect(metrics.snapshot()['package.xor-invariant-violated']).toBe(1);
87
+ });
88
+ });
@@ -0,0 +1,103 @@
1
+ // rename API (in-memory) three classes + two error paths — AC-06 (feat-20260618 w14).
2
+ //
3
+ // Red-first: written before w13 implements rename.
4
+ //
5
+ // Coverage:
6
+ // 1. null-package asset rename -> resolveName returns the new name
7
+ // 2. multi-asset package rename -> resolveName returns the new name
8
+ // 3. single-asset package rename -> resolveName + packagePath leaf both sync
9
+ // 4. name collision inside the same package -> err(asset-invalid-value)
10
+ // 5. target guid not registered -> err(asset-not-found)
11
+
12
+ import { AssetRegistry } from '@forgeax/engine-assets-runtime';
13
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
14
+ import type { SamplerAsset } from '@forgeax/engine-types';
15
+ import { describe, expect, it } from 'vitest';
16
+ import { makeMockShaderRegistry } from './helpers/mock-shader-registry';
17
+
18
+ const NULL_PKG = 'd0000000-0000-4000-d000-000000000001';
19
+ const MULTI_A = 'd0000000-0000-4000-d000-000000000002';
20
+ const MULTI_B = 'd0000000-0000-4000-d000-000000000003';
21
+ const SINGLE = 'd0000000-0000-4000-d000-000000000004';
22
+ const MISSING = 'd0000000-0000-4000-d000-0000000000ff';
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
+ const sampler: SamplerAsset = { kind: 'sampler' };
35
+
36
+ describe('rename API (AC-06)', () => {
37
+ it('null-package asset rename updates the stored name', () => {
38
+ const reg = makeRegistry();
39
+ reg.catalog(parseGuid(NULL_PKG), sampler);
40
+ reg._registerPackage(null, [NULL_PKG], new Map([[NULL_PKG, 'old']]));
41
+
42
+ const r = reg.rename(NULL_PKG, 'fresh');
43
+ expect(r.ok).toBe(true);
44
+ expect(reg.resolveName(NULL_PKG)).toBe('fresh');
45
+ });
46
+
47
+ it('multi-asset package rename updates the entry stored name', () => {
48
+ const reg = makeRegistry();
49
+ reg.catalog(parseGuid(MULTI_A), sampler);
50
+ reg.catalog(parseGuid(MULTI_B), sampler);
51
+ reg._registerPackage(
52
+ 'assets/char.glb',
53
+ [MULTI_A, MULTI_B],
54
+ new Map([
55
+ [MULTI_A, 'Body'],
56
+ [MULTI_B, 'Head'],
57
+ ]),
58
+ );
59
+
60
+ const r = reg.rename(MULTI_A, 'Torso');
61
+ expect(r.ok).toBe(true);
62
+ expect(reg.resolveName(MULTI_A)).toBe('Torso');
63
+ expect(reg.resolveName(MULTI_B)).toBe('Head');
64
+ });
65
+
66
+ it('single-asset package rename syncs resolveName and packagePath leaf', () => {
67
+ const reg = makeRegistry();
68
+ reg.catalog(parseGuid(SINGLE), sampler);
69
+ reg._registerPackage('assets/hero.glb', [SINGLE]);
70
+
71
+ const r = reg.rename(SINGLE, 'villain');
72
+ expect(r.ok).toBe(true);
73
+ expect(reg.resolveName(SINGLE)).toBe('villain');
74
+ const pkg = reg.packageOf(SINGLE);
75
+ expect(pkg).not.toBeNull();
76
+ expect(pkg?.path.endsWith('villain')).toBe(true);
77
+ });
78
+
79
+ it('name collision inside the same package returns asset-invalid-value', () => {
80
+ const reg = makeRegistry();
81
+ reg.catalog(parseGuid(MULTI_A), sampler);
82
+ reg.catalog(parseGuid(MULTI_B), sampler);
83
+ reg._registerPackage(
84
+ 'assets/char.glb',
85
+ [MULTI_A, MULTI_B],
86
+ new Map([
87
+ [MULTI_A, 'Body'],
88
+ [MULTI_B, 'Head'],
89
+ ]),
90
+ );
91
+
92
+ const r = reg.rename(MULTI_A, 'Head');
93
+ expect(r.ok).toBe(false);
94
+ if (!r.ok) expect(r.error.code).toBe('asset-invalid-value');
95
+ });
96
+
97
+ it('renaming a missing guid returns asset-not-found', () => {
98
+ const reg = makeRegistry();
99
+ const r = reg.rename(MISSING, 'whatever');
100
+ expect(r.ok).toBe(false);
101
+ if (!r.ok) expect(r.error.code).toBe('asset-not-found');
102
+ });
103
+ });
@@ -1,9 +1,9 @@
1
- import { matchPass, selectPasses } from '@forgeax/engine-render/internal';
2
1
  import type { MaterialPass, PassSelector } from '@forgeax/engine-types';
3
2
  import { describe, expect, it } from 'vitest';
3
+ import { matchPass, selectPasses } from '../../../render/src/systems/pass-selector';
4
4
 
5
5
  /*
6
- * feat-20260609 M1 / T-003: AddScenePass/AddShadowPass selector required.
6
+ * feat-20260609 M1 / T-003: typed scene/shadow selector required.
7
7
  *
8
8
  * These tests verify the PassSelector matching semantics:
9
9
  * - selector: {} matches every pass (AC-02)
@@ -10,16 +10,14 @@
10
10
  // must be replaced by buildBindGroupLayoutDescriptor calls without changing
11
11
  // what the device sees.
12
12
 
13
- import type { PipelineSpec } from '@forgeax/engine-render/internal';
13
+ import { describe, expect, it } from 'vitest';
14
14
  import {
15
15
  appendInjection,
16
- buildBindGroupLayoutDescriptor,
17
16
  buildPbrMaterialUserRegionEntries,
18
17
  buildPbrViewBglEntries,
19
- } from '@forgeax/engine-render/internal';
20
- import { DEFAULT_UNLIT_PARAM_SCHEMA } from '@forgeax/engine-shader';
21
- import { derive } from '@forgeax/engine-types';
22
- import { describe, expect, it } from 'vitest';
18
+ } from '../../../render/src/pbr-pipeline';
19
+ import type { PipelineSpec } from '../../../render/src/pipeline-spec';
20
+ import { buildBindGroupLayoutDescriptor } from '../../../render/src/pipeline-spec';
23
21
 
24
22
  // Stable spec stub — the dispatcher uses spec.shader for reflection only when
25
23
  // a registry is supplied; without registry the BGL shape comes purely from
@@ -81,22 +79,22 @@ describe('buildBindGroupLayoutDescriptor — pbr-pipeline 6 sites byte-equiv', (
81
79
  });
82
80
 
83
81
  describe('pbr-material-merged', () => {
84
- it('20 entries: user-region 13 (derived) + ibl 7', () => {
82
+ it('24 entries: user-region 13 (derived) + ibl 7 + lightmap 4', () => {
85
83
  const spec = makeSpec();
86
84
  const out = buildBindGroupLayoutDescriptor(spec, {
87
85
  kind: 'pbr-material-merged',
88
86
  });
89
87
  // Post-M2 (D-1): user-region comes from derive(paramSchema).bglEntries
90
- // (built-in standard-PBR 6-texture fallback), then IBL is appended at
91
- // start = userRegion.length.
88
+ // (built-in standard-PBR 4-texture fallback), then IBL + lightmap are
89
+ // appended at start = userRegion.length.
92
90
  const userRegion = buildPbrMaterialUserRegionEntries();
93
91
  const afterIbl = [...userRegion, ...appendInjection(userRegion, 'ibl')];
94
92
  const expected = {
95
93
  label: 'pbr-material-skylight-bgl',
96
- entries: afterIbl,
94
+ entries: [...afterIbl, ...appendInjection(afterIbl, 'lightmap')],
97
95
  };
98
96
  expect(out).toEqual(expected);
99
- expect(out.entries.length).toBe(20);
97
+ expect(out.entries.length).toBe(24);
100
98
  });
101
99
  });
102
100
 
@@ -159,7 +157,7 @@ describe('buildBindGroupLayoutDescriptor — pbr-pipeline 6 sites byte-equiv', (
159
157
  });
160
158
 
161
159
  describe('pbr-skin-mesh-array', () => {
162
- it('storageBuffer=true: mesh plus current/previous palettes use dynamic offsets', () => {
160
+ it('storageBuffer=true: 2 entries, both dynamic offset', () => {
163
161
  const spec = makeSpec();
164
162
  const out = buildBindGroupLayoutDescriptor(spec, {
165
163
  kind: 'pbr-skin-mesh-array',
@@ -170,16 +168,11 @@ describe('buildBindGroupLayoutDescriptor — pbr-pipeline 6 sites byte-equiv', (
170
168
  entries: [
171
169
  {
172
170
  binding: 0,
173
- visibility: 0x3,
174
- buffer: { type: 'read-only-storage', hasDynamicOffset: true },
175
- },
176
- {
177
- binding: 1,
178
171
  visibility: 0x1,
179
172
  buffer: { type: 'read-only-storage', hasDynamicOffset: true },
180
173
  },
181
174
  {
182
- binding: 2,
175
+ binding: 1,
183
176
  visibility: 0x1,
184
177
  buffer: { type: 'read-only-storage', hasDynamicOffset: true },
185
178
  },
@@ -189,16 +182,16 @@ describe('buildBindGroupLayoutDescriptor — pbr-pipeline 6 sites byte-equiv', (
189
182
  });
190
183
 
191
184
  describe('unlit-material', () => {
192
- it('3 entries: reflected unlit material only (no skylight injection)', () => {
185
+ it('13 entries: base PBR material only (no skylight injection)', () => {
193
186
  const spec = makeSpec();
194
187
  const out = buildBindGroupLayoutDescriptor(spec, {
195
188
  kind: 'unlit-material',
196
189
  });
197
190
  expect(out).toEqual({
198
191
  label: 'unlit-material-bgl',
199
- entries: buildPbrMaterialUserRegionEntries(derive(DEFAULT_UNLIT_PARAM_SCHEMA)),
192
+ entries: buildPbrMaterialUserRegionEntries(),
200
193
  });
201
- expect(out.entries.length).toBe(3);
194
+ expect(out.entries.length).toBe(13);
202
195
  });
203
196
  });
204
197
  });