@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
@@ -1,61 +1,49 @@
1
1
  // Runtime is the host assembly facade. Concrete Renderer construction and
2
- // frame interpretation live in @forgeax/engine-render/internal.
3
- import type { BundlerOptions, Renderer, RendererOptions } from '@forgeax/engine-render/internal';
4
- import { constructRenderer } from '@forgeax/engine-render/internal/construct-renderer';
2
+ // frame interpretation live in the render owner assembly.
3
+ import type { RenderError, Renderer, RendererOptions } from '@forgeax/engine-render';
4
+ import type { BundlerOptions } from '@forgeax/engine-render/internal/construct-renderer';
5
+ import { err, ok, type Result } from '@forgeax/engine-types';
5
6
  import { EngineEnvironmentError } from './errors/environment';
7
+ import { constructRuntimeRendererHost } from './renderer-host';
6
8
 
9
+ /**
10
+ * Assemble the sole public renderer host.
11
+ *
12
+ * Runtime owns backend selection and partial-construction cleanup. Render owns
13
+ * the scene/frame contract; successful construction returns the host that
14
+ * exposes attach, draw, inspect, observe, and recover. Expected failures are
15
+ * structured Result errors at the owning boundary; environment failures retain
16
+ * EngineEnvironmentError recovery guidance for the caller.
17
+ */
7
18
  export async function createRenderer(
8
19
  canvas: HTMLCanvasElement | OffscreenCanvas,
9
20
  options?: RendererOptions,
10
21
  bundler?: BundlerOptions,
11
- ): Promise<Renderer> {
22
+ ): Promise<Result<Renderer, EngineEnvironmentError | RenderError>> {
12
23
  if (options !== undefined && 'rhi' in options && options.rhi === undefined) {
13
- throw new EngineEnvironmentError('no usable rendering backend');
24
+ return err(new EngineEnvironmentError('no usable rendering backend'));
14
25
  }
15
26
  const rendererOptions: RendererOptions | undefined =
16
27
  options === undefined
17
28
  ? undefined
18
29
  : {
19
30
  ...(options.rhi === undefined ? {} : { rhi: options.rhi }),
20
- ...(options.rawDeviceForContextConfigure === undefined
21
- ? {}
22
- : { rawDeviceForContextConfigure: options.rawDeviceForContextConfigure }),
23
31
  ...(options.features === undefined ? {} : { features: options.features }),
24
32
  ...(options.profiler === undefined ? {} : { profiler: options.profiler }),
25
- ...(options.membershipTiming === undefined
26
- ? {}
27
- : { membershipTiming: options.membershipTiming }),
28
33
  ...(options.rhiInstrumentation === undefined
29
34
  ? {}
30
35
  : { rhiInstrumentation: options.rhiInstrumentation }),
36
+ ...(options.standardProfile === undefined
37
+ ? {}
38
+ : { standardProfile: options.standardProfile }),
31
39
  };
32
40
  try {
33
- return await constructRenderer(canvas, rendererOptions, bundler);
41
+ const constructed = await constructRuntimeRendererHost(canvas, rendererOptions, bundler);
42
+ if (!constructed.ok) return err(constructed.error);
43
+ return ok(constructed.value.renderer);
34
44
  } catch (cause) {
35
- if (isStructuredRenderError(cause)) throw cause;
36
- if (cause instanceof EngineEnvironmentError) throw cause;
45
+ if (cause instanceof EngineEnvironmentError) return err(cause);
37
46
  const detail = cause instanceof Error ? cause : new Error(String(cause));
38
- throw new EngineEnvironmentError('renderer construction failed', { webgpuError: detail });
47
+ return err(new EngineEnvironmentError('renderer construction failed', { webgpuError: detail }));
39
48
  }
40
49
  }
41
-
42
- function isStructuredRenderError(value: unknown): value is Error & {
43
- readonly code: string;
44
- readonly expected: string;
45
- readonly hint: string;
46
- readonly detail: unknown;
47
- } {
48
- if (!(value instanceof Error)) return false;
49
- const candidate = value as Partial<{
50
- code: unknown;
51
- expected: unknown;
52
- hint: unknown;
53
- detail: unknown;
54
- }>;
55
- return (
56
- typeof candidate.code === 'string' &&
57
- typeof candidate.expected === 'string' &&
58
- typeof candidate.hint === 'string' &&
59
- candidate.detail !== undefined
60
- );
61
- }
@@ -3,4 +3,4 @@
3
3
  export {
4
4
  EngineEnvironmentError,
5
5
  type EngineEnvironmentErrorDetail,
6
- } from '@forgeax/engine-render/internal';
6
+ } from '@forgeax/engine-render/internal/construct-renderer';
package/src/index.ts CHANGED
@@ -1,18 +1,16 @@
1
1
  // @forgeax/engine-runtime — public API surface (M3).
2
2
  //
3
3
  // Surface (K-4):
4
- // - createRenderer(canvas, options?) — async factory; uses WebGPU
5
- // exclusively; throws EngineEnvironmentError when no adapter is usable.
6
- // - Renderer / RendererOptions / RendererBackend / RendererLostInfo /
4
+ // - createRenderer(canvas, options?) — async Result factory; uses WebGPU
5
+ // exclusively and returns EngineEnvironmentError or RenderError on failure.
6
+ // - Renderer / RendererOptions / RendererLostInfo /
7
7
  // RendererLostListener — types for callers.
8
- // - EngineEnvironmentError — thrown when no backend is usable.
8
+ // - EngineEnvironmentError — returned when no backend is usable.
9
9
  //
10
10
  // What is **NOT** here, by design (acceptance grep checks negative existence):
11
11
  // - any internal backend module — locked by `package.json#exports`
12
12
  // entry `"./internal/*": null`.
13
13
 
14
- import { createRenderer as _createRendererForEngineAlias } from './createRenderer';
15
-
16
14
  /**
17
15
  * `acquireCanvasContext` facade re-export (M3 D-P3 / w15).
18
16
  *
@@ -27,7 +25,6 @@ import { createRenderer as _createRendererForEngineAlias } from './createRendere
27
25
  */
28
26
  export { acquireCanvasContext } from '@forgeax/engine-rhi-webgpu';
29
27
  export { defaultAssetDecoderContributions } from './asset-contributions';
30
- export { builtinAssetKind } from './asset-kind';
31
28
  export { createRenderer } from './createRenderer';
32
29
 
33
30
  // feat-20260704-runtime-tier1-decomposition M2 / w10 (D-3 / D-9): the top-level
@@ -38,53 +35,17 @@ export { createRenderer } from './createRenderer';
38
35
  // ./errors/<cluster> (NOT the transitional errors.ts barrel, deleted in w15;
39
36
  // NOT the @forgeax/engine-types zombie RuntimeErrorCode -- D-9).
40
37
 
41
- // Asset loading contracts live in @forgeax/engine-assets-runtime. This barrel
42
- // stays focused on renderer assembly and never re-exports asset-core symbols.
38
+ // feat-20260705-runtime-tier2-decomposition M1 / w14: the asset cluster error
39
+ // re-exports (AssetRuntimeError / *Detail types + MaterialResolvedEmptyPasses /
40
+ // SceneCollect* classes) moved to @forgeax/engine-assets-runtime. Consumers
41
+ // import them from that package directly (AC-105: runtime barrel exports zero
42
+ // asset-cluster symbols).
43
43
  // -- environment cluster --
44
44
  export { EngineEnvironmentError } from './errors/environment';
45
- export {
46
- type SpriteAnimationErrorCode,
47
- SpriteAnimationInvalidError,
48
- } from './errors/sprite-animation';
49
45
  // -- recover cluster --
50
46
  // -- render cluster --
51
47
  // -- skin cluster --
52
48
 
53
- /**
54
- * `Engine` namespace alias for `createRenderer` (w55 round 2 fix-up F-3
55
- * closure). Plan-strategy §7.1 / §7.2 / §7.4 + requirements.md §AI User
56
- * Affordances reference the factory in `Engine.create({ canvas })` form;
57
- * the concrete code-level entry is `createRenderer(canvas, options?)`. To
58
- * keep both call sites valid without forcing a doc-wide rewrite (the
59
- * plan/requirements text is appended-only audit history per architecture
60
- * principle 7), the namespace alias re-exports `createRenderer` under the
61
- * `Engine.create` shape — AI users can write either form and TypeScript
62
- * resolution lands on the same factory.
63
- *
64
- * Single SSOT: the runtime behaviour, signatures, and JSDoc all live on
65
- * `createRenderer`; `Engine.create` is a thin re-export (charter
66
- * proposition 1 progressive disclosure — both names are grep-able + lead
67
- * to the same body; proposition 5 consistent abstraction — the alias does
68
- * not introduce a second factory shape).
69
- *
70
- * Usage parity:
71
- *
72
- * import { createRenderer } from '@forgeax/engine-runtime';
73
- * const renderer = await createRenderer(canvas, { ... }, bundler?);
74
- *
75
- * // identical:
76
- * import { Engine } from '@forgeax/engine-runtime';
77
- * const renderer = await Engine.create(canvas, { ... }, bundler?);
78
- *
79
- * feat-20260608-create-app-param-surface-trim / M2 / R-8: Engine.create
80
- * is a thin re-export of createRenderer; the third BundlerOptions arg
81
- * forwards verbatim through the alias (no separate Engine.create
82
- * implementation -- `create: createRenderer` shape).
83
- */
84
- export const Engine = {
85
- create: _createRendererForEngineAlias,
86
- } as const;
87
-
88
49
  // ─── ECS render bridge (feat-20260509-ecs-render-bridge-mvp) ────────────────
89
50
  //
90
51
  // Single-import surface for the 5-component schema set + builtin asset handles
@@ -110,20 +71,19 @@ export const Engine = {
110
71
  * Read both fields directly through typed property access after the
111
72
  * `code === 'limit-exceeded'` discriminant narrows `err.detail`.
112
73
  *
113
- * The `Renderer.onError` channel fans out **both** error families —
114
- * `RhiError` (RHI layer) and `RuntimeError` (runtime layer, e.g.
115
- * `'equirect-projection-failed'`) so the listener parameter is the
116
- * `RhiError | RuntimeError` union (feat-20260531-skybox-env-background:
117
- * widened from `RhiError` only, dropping the prior `as any` fan-out cast).
118
- * The disjoint `RhiErrorCode` / `RuntimeErrorCode` literal sets let
119
- * `switch (e.code)` narrow each arm to the concrete class without a default.
74
+ * The `Renderer.subscribe` channel projects renderer-owned failures through
75
+ * one `RendererEvent` union. The public operation error is always `RenderError`;
76
+ * lower-layer causes remain structured in its detail instead of creating a
77
+ * second listener/error authority.
120
78
  *
121
79
  * @example
122
80
  * import {
123
81
  * RhiError, type RhiErrorCode, type LimitExceededDetail,
124
82
  * } from '@forgeax/engine-runtime';
125
- * import { type EquirectProjectionFailedDetail, type RendererError } from '@forgeax/engine-render';
126
- * renderer.onError((e: RendererError) => {
83
+ * import { type RenderError } from '@forgeax/engine-render';
84
+ * renderer.subscribe((event) => {
85
+ * if (event.kind !== 'error') return;
86
+ * const e: RenderError = event.error;
127
87
  * switch (e.code) {
128
88
  * case 'limit-exceeded': {
129
89
  * const detail = e.detail as LimitExceededDetail;
@@ -148,20 +108,6 @@ export {
148
108
  type RhiShaderCompileDetail,
149
109
  type RhiWebgpuRuntimeDetail,
150
110
  } from '@forgeax/engine-rhi';
151
- /**
152
- * feat-20260527-sprite-nineslice M4 / w16 (D-5 + AC-16): per-Renderer
153
- * EngineMetrics counter. Surfaced through `renderer.metrics`; exported here
154
- * so AI users can grep `EngineMetrics` and reach the public type for ts
155
- * generics, and so test utilities can construct a free-standing instance.
156
- *
157
- * @example
158
- * const renderer = await createRenderer(canvas);
159
- * // ...later, after the world has rendered for a few frames...
160
- * const counts = renderer.metrics.snapshot();
161
- * if (counts['nineslice.scale-too-small'] !== undefined) {
162
- * // surface a once-per-session UI hint, run a regression bench, etc.
163
- * }
164
- */
165
111
  /**
166
112
  * Asset system SSOT re-exports (feat-20260511-asset-system-v1 / w30 / D-P7 +
167
113
  * plan-strategy §7.4 discoverability dual-entry).
@@ -170,7 +116,7 @@ export {
170
116
  * 4-member union + `AssetError` class + `ASSET_ERROR_HINTS` per-code hint table);
171
117
  * this barrel is a thin re-export so AI users can write a single-line import —
172
118
  *
173
- * import type { Asset } from '@forgeax/engine-types';
119
+ * import type { Asset } from '@forgeax/engine-assets-runtime';
174
120
  * import type { Handle } from '@forgeax/engine-types';
175
121
  * import { AssetError } from '@forgeax/engine-runtime';
176
122
  *
@@ -191,9 +137,14 @@ export {
191
137
  type TextureAsset,
192
138
  type VertexAttributeMap,
193
139
  } from '@forgeax/engine-types';
194
- // Asset payload types are imported from @forgeax/engine-types. Primitive mesh
195
- // payloads are owned by @forgeax/engine-geometry and become ordinary per-World
196
- // shared references during host assembly.
140
+ // feat-20260705-runtime-tier2-decomposition M1 / w14: Asset / MeshAsset types
141
+ // moved to @forgeax/engine-assets-runtime (AC-105).
142
+ // feat-20260705-runtime-tier2-decomposition M1 / w14: AssetRegistry + the
143
+ // HANDLE_* builtin mesh handles moved to @forgeax/engine-assets-runtime (AC-105).
144
+ // feat-20260705-runtime-tier2-decomposition M1 / w14: the process-static
145
+ // BuiltinAssetRegistry tier (BUILTIN_* payloads) moved to
146
+ // @forgeax/engine-assets-runtime (AC-105). Geometry owns the shared runtime
147
+ // vertex layout.
197
148
  // Runtime-specific authoring components remain here. Domain authorities are
198
149
  // imported directly from @forgeax/engine-scene, @forgeax/engine-animation,
199
150
  // @forgeax/engine-skinning, and @forgeax/engine-render.
@@ -233,9 +184,8 @@ export { createDevImportTransport } from './dev-import-transport';
233
184
  * glyphTextLayoutSystem (feat-20260531-world-space-msdf-text-rendering) -- lays
234
185
  * out + bakes every `GlyphText` entity, attaching MeshFilter + MeshRenderer on
235
186
  * first observation and re-baking in place on a text / size / color change.
236
- * `renderer.attachWorld(world)` installs this derived-state owner before the
237
- * first `world.update()`; `renderer.draw()` only reads the published result.
238
- * `createApp` performs the attachment automatically.
187
+ * `createApp` attaches the World and owns the returned render lease before
188
+ * the first frame; `Renderer.draw` consumes only that lease-bound request.
239
189
  */
240
190
  /**
241
191
  * GpuBuffer / GpuTexture runtime wrappers + GpuResource union
@@ -253,12 +203,10 @@ export { createDevImportTransport } from './dev-import-transport';
253
203
  * `Result.err({ code: 'destroy-after-destroy' })`.
254
204
  */
255
205
  /**
256
- * feat-20260601-gpu-resource-store-extraction M1: the GPU residency store.
257
- * Reachable as `renderer.store`; exported here so AI users can construct one
258
- * directly for tests and `grep GpuResourceStore` discovers it.
259
206
  */
260
- // Runtime decoders are installed by Runtime/App assembly through the typed
261
- // AssetRegistry lease seam; this barrel does not expose a second loader table.
207
+ // feat-20260705-runtime-tier2-decomposition M1 / w14: the loader-injection
208
+ // surface (LoaderRegistry / wireDefaultLoaders / createDefaultLoaderRegistry)
209
+ // moved to @forgeax/engine-assets-runtime (AC-105).
262
210
  // feat-20260705-runtime-tier2-decomposition M2 / w25: the picking cluster
263
211
  // (pick / pickVertex / pickVertexOnEntity / pickTile + PickHit / VertexHit /
264
212
  // PickError / PickErrorCode / PickTileError / PickTileHit) moved to
@@ -278,10 +226,10 @@ export { createDevImportTransport } from './dev-import-transport';
278
226
  * Camera, DirectionalLight, MeshFilter, MeshRenderer,
279
227
  * } from '@forgeax/engine-render';
280
228
  * import { Transform } from '@forgeax/engine-scene';
281
- * import { createRenderer } from '@forgeax/engine-runtime';
229
+ * import { AssetRegistry, HANDLE_CUBE, HANDLE_TRIANGLE } from '@forgeax/engine-assets-runtime';
282
230
  */
283
- // Shared-reference resolution belongs to ECS; renderer only consumes the
284
- // owner projection supplied by the current World.
231
+ // feat-20260705-runtime-tier2-decomposition M1 / w14: resolveAssetHandle moved
232
+ // to @forgeax/engine-assets-runtime (AC-105).
285
233
  export type { SpriteParamValues } from './sprite-param-values';
286
234
  // feat-20260630-viewport-2x2-run-x-display-redesign M2 / w12 / plan-strategy D-2:
287
235
  // engine-neutral by-entity-id active camera selection (no editor concept).
@@ -303,7 +251,7 @@ export type { SpriteParamValues } from './sprite-param-values';
303
251
  * TRANSPARENT_SORT_CONFIG_KEY,
304
252
  * TRANSPARENT_SORT_MODE_LAYER_Y,
305
253
  * setTransparentSortConfig,
306
- * } from '@forgeax/engine-render/internal';
254
+ * } from '@forgeax/engine-render/authoring';
307
255
  * const r = setTransparentSortConfig(world,
308
256
  * { mode: TRANSPARENT_SORT_MODE_LAYER_Y, yzAlpha: 1.0 });
309
257
  */
@@ -337,8 +285,9 @@ export { spriteAnimationTickSystem } from './systems/sprite-animation-tick';
337
285
  // / probeVideoHighPerfUpload / VideoCapabilityDevice) moved to
338
286
  // @forgeax/engine-graphics-extras (AC-303). Zero shim -- import from that
339
287
  // package.
340
- // Typed asset loading is exposed by @forgeax/engine-assets-runtime. Renderer
341
- // construction consumes only owner projections and device services.
288
+ // feat-20260705-runtime-tier2-decomposition M1 / w14: createDefaultLoaderRegistry
289
+ // + wireDefaultLoaders moved to @forgeax/engine-assets-runtime. Consumers import
290
+ // them from that package directly (AC-105).
342
291
 
343
292
  // ─── Math namespace re-export (M2 / w15) ────────────────────────────────
344
293
 
@@ -378,15 +327,6 @@ export { quat } from '@forgeax/engine-math';
378
327
  // schema-derived field dispatch, engine-self-contained GUID resolution).
379
328
  // serializeSceneAssetToPack now uses schema-derived refs[] index (D-1/D-2).
380
329
  export { rootsToSceneAsset, serializeSceneAssetToPack } from './collect-scene-asset';
381
- export {
382
- createSceneAssetPort,
383
- type SceneAssetPort,
384
- type SceneAssetPortError,
385
- } from './scene-asset-port';
386
- export {
387
- SceneCollectAssetGuidUnresolvedError,
388
- SceneCollectEntityRefOutOfClosureError,
389
- } from './scene-collect-errors';
390
330
  // feat-20260626 M6 / m6-4: debug-draw auto-attach glue is re-exported from the
391
331
  // main barrel (was a separate tsup entry). The separate entry produced a SECOND
392
332
  // module copy of the mutable `registeredDebugDraw` registry: createApp set it on
@@ -414,26 +354,20 @@ export {
414
354
  // alongside the existing fullscreen post-process register / not-found /
415
355
  // reads-not-found codes. AI users `switch (err.code)` over the closed
416
356
  // 6-member union without `default`; .detail narrows per-code per charter P3.
417
- // feat-20260604 M3 / w19: render-graph-primitives — the public AI-user vocabulary
418
- // for assembling a render pipeline's per-frame graph (addScenePass /
419
- // addShadowPass / addSkyboxPass / addBloomPasses / addTonemapPass /
420
- // addFullscreenPass). The urp pipeline (w21) and any custom
421
- // pipeline use these factories — the dogfood proof of D-5.
357
+ // feat-20260604 M3 / w19: render-graph-primitives — low-level typed record helpers
358
+ // used by the Standard feature graph. Graph topology is declared by RenderFeaturePlan;
359
+ // recordSsao* and encodeFullscreenPass remain the executable RHI-facing leaves.
422
360
  // feat-20260601-customizable-render-pipeline-seam-and-dogfood-rend M1.
423
361
  /**
424
- * Render-pipeline surface. `renderer.registerPipeline(id, impl)` registers a
425
- * `RenderPipeline` logic; `renderer.installPipeline(handle)` installs the pipeline bound
426
- * by a `RenderPipelineAsset` handle from the renderer-owned projection. The built-in
427
- * `forgeax::urp` (`urpPipeline`) is the authoritative worked
428
- * example - it is dogfooded through the same public channel inside `createRenderer`.
362
+ * Render surface. The renderer host assembles one Standard pipeline and
363
+ * accepts closed RenderFeature declarations at App construction. Pipelines,
364
+ * device handles, and asset registries remain owner-internal implementation
365
+ * details rather than renderer methods.
429
366
  *
430
367
  * @example
431
- * import {
432
- * type RenderPipeline,
433
- * PipelineError, type PipelineErrorCode,
434
- * URP_PIPELINE_ID,
368
+ * import type {
369
+ * RenderFeaturePlan,
435
370
  * } from '@forgeax/engine-render';
436
- * // urpPipeline remains an engine-internal implementation.
437
371
  */
438
372
  // RenderPipelineContext is barrel-exported for typed pass encode closures.
439
373
  // feat-20260701-rootstosceneasset verify minor-edit (F2): collectSubtree is a
@@ -0,0 +1,33 @@
1
+ import type { AssetRegistry } from '@forgeax/engine-assets-runtime';
2
+ import type { RenderError, RendererOptions, RenderResult } from '@forgeax/engine-render';
3
+ import type {
4
+ BundlerOptions,
5
+ RendererHostAssembly,
6
+ } from '@forgeax/engine-render/internal/construct-renderer';
7
+ import { constructRendererHost } from '@forgeax/engine-render/internal/construct-renderer';
8
+ import { loadBackendPack } from './backend-selection';
9
+
10
+ export type {
11
+ BundlerOptions,
12
+ RendererHostAssembly,
13
+ } from '@forgeax/engine-render/internal/construct-renderer';
14
+
15
+ /** Assemble renderer plus asset services in the Runtime-owned backend host. */
16
+ export async function constructRuntimeRendererHost(
17
+ canvas: unknown,
18
+ options?: RendererOptions,
19
+ bundler?: BundlerOptions,
20
+ ): Promise<RenderResult<RendererHostAssembly, RenderError>> {
21
+ const first = await loadBackendPack(options);
22
+ if (!first.ok) throw first.error;
23
+ const constructed = await constructRendererHost(canvas, options, bundler, first.value);
24
+ if (constructed.ok || options?.rhi !== undefined || typeof globalThis === 'undefined') {
25
+ return constructed;
26
+ }
27
+ const fallback = await loadBackendPack(options, true);
28
+ if (!fallback.ok) return constructed;
29
+ return constructRendererHost(canvas, options, bundler, fallback.value);
30
+ }
31
+
32
+ export { loadRhiPack } from './backend-selection';
33
+ export type { AssetRegistry };
@@ -7,11 +7,11 @@
7
7
  // - missing joint inside subtree: structured error 'skin-joint-path-unresolved'.
8
8
 
9
9
  import { World } from '@forgeax/engine-ecs';
10
- import { postSpawnResolveJoints } from '@forgeax/engine-render/internal';
11
10
  import { ChildOf, Name } from '@forgeax/engine-scene';
12
11
  import { Skin } from '@forgeax/engine-skinning';
13
12
  import type { SkinAsset } from '@forgeax/engine-types';
14
13
  import { describe, expect, it, vi } from 'vitest';
14
+ import { postSpawnResolveJoints } from '../../../../render/src/scene-instances/post-spawn-resolve-joints';
15
15
 
16
16
  /**
17
17
  * Build a 3-joint linear chain `Root -> Spine -> Hip` rooted at a fresh entity,
@@ -0,0 +1,4 @@
1
+ export {
2
+ postSpawnResolveJoints,
3
+ type SkinJointResolver,
4
+ } from '../../../render/src/scene-instances/post-spawn-resolve-joints';
@@ -40,6 +40,7 @@
40
40
  // member land in the PARENT anchor's state, not the folded child anchor's; the
41
41
  // child anchor's own mountTimeOverrides is empty. See the M5 implement report.)
42
42
 
43
+ import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
43
44
  import {
44
45
  componentDefinition,
45
46
  type Component as EcsComponent,
@@ -55,7 +56,6 @@ import type {
55
56
  SceneAsset,
56
57
  SceneEntity,
57
58
  } from '@forgeax/engine-types';
58
- import type { SceneAssetPort } from '../scene-asset-port';
59
59
 
60
60
  /** Minimal structural view of a SceneInstanceState the fold reads (D-4 boundary:
61
61
  * `world.getSceneInstanceState(root).value` is structurally assignable). */
@@ -143,12 +143,8 @@ function liveFields(
143
143
  * MountOverride[] (child-namespace localIds, live value domain). See file
144
144
  * header for the full contract. Returns [] when nothing differs from source.
145
145
  */
146
- export function foldMountOverrides(
147
- world: World,
148
- assets: SceneAssetPort,
149
- state: FoldSceneInstanceState,
150
- ): MountOverride[] {
151
- const sourceRes = assets.resolve<SceneAsset>(
146
+ export function foldMountOverrides(world: World, state: FoldSceneInstanceState): MountOverride[] {
147
+ const sourceRes = resolveAssetHandle<SceneAsset>(
152
148
  world,
153
149
  state.source as unknown as Handle<string, 'shared'>,
154
150
  );
@@ -55,14 +55,14 @@
55
55
  // (5_000_000 ns/op working baseline; R1 F-2 defer note above).
56
56
 
57
57
  import { World } from '@forgeax/engine-ecs';
58
+ import { bench, describe } from 'vitest';
59
+ import type { TransparentEntry } from '../../../../render/src/systems/transparent-sort-config';
58
60
  import {
59
61
  setTransparentSortConfig,
60
62
  TRANSPARENT_SORT_MODE_LAYER_Y,
61
63
  TRANSPARENT_SORT_MODE_LAYER_YZ,
62
64
  TRANSPARENT_SORT_MODE_LAYER_Z,
63
- } from '@forgeax/engine-render/internal';
64
- import { bench, describe } from 'vitest';
65
- import type { TransparentEntry } from '../transparent-sort';
65
+ } from '../../../../render/src/systems/transparent-sort-config';
66
66
  import { transparentSortEntries } from '../transparent-sort';
67
67
  import { createXorshift32 } from './_xorshift';
68
68
 
@@ -58,13 +58,13 @@
58
58
  // charter P3 + P4 + P5 + F1.
59
59
 
60
60
  import { type EntityHandle, Time, type World } from '@forgeax/engine-ecs';
61
+ import { SpriteAnimationInvalidError } from '@forgeax/engine-ecs/projection';
61
62
  import {
62
63
  SpriteAnimation,
63
64
  SpriteRegionOverride,
64
65
  spritePlaybackModeFromU32,
65
66
  } from '@forgeax/engine-render/authoring';
66
67
  import { err, ok, type Result } from '@forgeax/engine-types';
67
- import { SpriteAnimationInvalidError } from '../errors/sprite-animation';
68
68
 
69
69
  /**
70
70
  * Walk every entity carrying `SpriteAnimation`, advance its dt
@@ -10,14 +10,15 @@
10
10
  // budget):
11
11
  //
12
12
  // 1. Walk `entries` once and project each into:
13
- // - `layers : Float64Array(n)` — primary sort key (Layer.value).
13
+ // - `layers : Int32Array(n)` — primary sort key (Layer.value).
14
14
  // - `sortVals : Float64Array(n)` — predicted sort value per entry,
15
15
  // derived from `mode` + `yzAlpha` + per-entry inputs OR the
16
16
  // per-entity `sortKey` override.
17
- // - `indices : Int32Array(n)` reusable `[0..n)` index buffer.
18
- // 2. Stable radix passes sort `indices` by material, sort value, then
19
- // layer. The least-significant-first order composes the same composite
20
- // ordering without a boxed JS comparator or per-call index array.
17
+ // - `indices : number[]` initially `[0..n)`.
18
+ // 2. `indices.sort((a, b) => ...)` with the composite comparator
19
+ // `(layers[a] - layers[b]) || (sortVals[a] - sortVals[b])`.
20
+ // Array.prototype.sort has been stable since ES2019; tie-breakers
21
+ // fall back to insertion order (charter F1 deterministic output).
21
22
  // 3. Return entries reordered by the sorted indices.
22
23
  //
23
24
  // Why SoA over Object-of-Structs comparator: V8's PSP / TimSort visits
@@ -58,29 +59,14 @@
58
59
  // archetypeStorage layout).
59
60
 
60
61
  import type { World } from '@forgeax/engine-ecs';
61
- import type { TransparentEntry } from '@forgeax/engine-render/internal';
62
+ import type { TransparentEntry } from '../../../render/src/systems/transparent-sort-config';
62
63
  import {
63
64
  getTransparentSortConfig,
64
65
  TRANSPARENT_SORT_MODE_DISTANCE,
65
66
  TRANSPARENT_SORT_MODE_LAYER_Y,
66
67
  TRANSPARENT_SORT_MODE_LAYER_YZ,
67
68
  TRANSPARENT_SORT_MODE_LAYER_Z,
68
- } from '@forgeax/engine-render/internal';
69
-
70
- export type { TransparentEntry } from '@forgeax/engine-render/internal';
71
-
72
- let transparentSortLayers = new Float64Array(0);
73
- let transparentSortValues = new Float64Array(0);
74
- let transparentSortMaterials = new Float64Array(0);
75
- let transparentSortIndices = new Int32Array(0);
76
-
77
- function ensureTransparentSortCapacity(n: number): void {
78
- if (transparentSortIndices.length >= n) return;
79
- transparentSortLayers = new Float64Array(n);
80
- transparentSortValues = new Float64Array(n);
81
- transparentSortMaterials = new Float64Array(n);
82
- transparentSortIndices = new Int32Array(n);
83
- }
69
+ } from '../../../render/src/systems/transparent-sort-config';
84
70
 
85
71
  /**
86
72
  * Sort the transparent-bucket entries by `(layer ASC, sortValue ASC,
@@ -121,28 +107,42 @@ export function transparentSortEntries(
121
107
  const mode = cfg.mode;
122
108
  const yzAlpha = cfg.yzAlpha;
123
109
 
124
- // SoA pre-projection columns. Reuse the columns and the stable radix index
125
- // buffer so steady-state sorting does not allocate a boxed index array.
126
- ensureTransparentSortCapacity(n);
127
- const layers = transparentSortLayers;
128
- const sortVals = transparentSortValues;
129
- const materials = transparentSortMaterials;
130
- const indices = transparentSortIndices.subarray(0, n);
110
+ // SoA pre-projection columns. Float64Array gives sub-ms / 10k bench
111
+ // headroom over Object-of-Structs comparator (D-8); Int32Array carries
112
+ // the signed i32 Layer.value verbatim (negatives preserved).
113
+ const layers = new Int32Array(n);
114
+ const sortVals = new Float64Array(n);
131
115
  for (let i = 0; i < n; i++) {
132
116
  const e = entries[i] as TransparentEntry;
133
117
  layers[i] = e.layer;
134
118
  sortVals[i] = computeSortValue(e, mode, yzAlpha, cameraPos);
135
- materials[i] = e.materialHandle;
136
- indices[i] = i;
137
119
  }
138
120
 
139
- // Stable least-significant passes compose the same order as the former
140
- // comparator: material is tertiary for modes 0/1/2, sortValue is secondary,
141
- // and layer is primary. Distance intentionally omits material, preserving
142
- // insertion order for exact distance ties.
143
- if (mode !== TRANSPARENT_SORT_MODE_DISTANCE) argsortInPlace(materials, indices);
144
- argsortInPlace(sortVals, indices);
145
- argsortInPlace(layers, indices);
121
+ // indices argsort Array.prototype.sort stability (ES2019+) preserves
122
+ // insertion order when the comparator returns 0. We avoid TypedArray.sort
123
+ // because its stability is not specified by the ECMAScript standard.
124
+ const indices: number[] = new Array(n);
125
+ for (let i = 0; i < n; i++) indices[i] = i;
126
+ indices.sort((a, b) => {
127
+ const la = layers[a] as number;
128
+ const lb = layers[b] as number;
129
+ if (la !== lb) return la - lb;
130
+ const va = sortVals[a] as number;
131
+ const vb = sortVals[b] as number;
132
+ if (va !== vb) return va < vb ? -1 : 1;
133
+ // Tertiary tiebreaker for modes 0/1/2: group same-materialHandle entries
134
+ // together so consecutive equal-(layer, sortVal, materialHandle) runs can
135
+ // collapse into fold buckets. Matches sortTransparentDispatch semantics.
136
+ // Not applied for DISTANCE (mode 3) — ties at exact same camera distance
137
+ // are undefined in depth order; stable insertion order is preserved there.
138
+ if (mode !== TRANSPARENT_SORT_MODE_DISTANCE) {
139
+ return (
140
+ (entries[a] as TransparentEntry).materialHandle -
141
+ (entries[b] as TransparentEntry).materialHandle
142
+ );
143
+ }
144
+ return 0;
145
+ });
146
146
 
147
147
  const sorted: TransparentEntry[] = new Array(n);
148
148
  for (let i = 0; i < n; i++) {
@@ -11,13 +11,13 @@
11
11
  // state, no further migration to a tilemap feature package).
12
12
 
13
13
  import type { EntityHandle, World } from '@forgeax/engine-ecs';
14
- import {
15
- TileLayer as runtimeTileLayer,
16
- Tilemap as runtimeTilemap,
17
- } from '@forgeax/engine-render/authoring';
18
14
  import { err, ok, type Result } from '@forgeax/engine-rhi';
19
15
  import { ChildOf } from '@forgeax/engine-scene';
20
16
  import { ASSET_ERROR_HINTS, AssetError } from '@forgeax/engine-types';
17
+ import {
18
+ TileLayer as runtimeTileLayer,
19
+ Tilemap as runtimeTilemap,
20
+ } from '../../render/src/components';
21
21
 
22
22
  function invalidValue(field: string, value: unknown, reason: string): AssetError {
23
23
  return new AssetError({
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=bind-group-cache-binding.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bind-group-cache-binding.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/bind-group-cache-binding.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=bind-group-cache-frame.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bind-group-cache-frame.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/bind-group-cache-frame.test.ts"],"names":[],"mappings":""}