@forgeax/engine-runtime 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) hide show
  1. package/README.md +49 -83
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts +2 -0
  4. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts.map +1 -0
  5. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts +2 -0
  6. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts +2 -0
  8. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts.map +1 -0
  9. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts +11 -0
  10. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts.map +1 -0
  11. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts +2 -0
  12. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts.map +1 -0
  13. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts +2 -0
  14. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts.map +1 -0
  15. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts +2 -0
  16. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts.map +1 -0
  17. package/dist/__tests__/asset-registry-mounts.test.d.ts +2 -0
  18. package/dist/__tests__/asset-registry-mounts.test.d.ts.map +1 -0
  19. package/dist/__tests__/asset-registry.browser.test.d.ts +2 -0
  20. package/dist/__tests__/asset-registry.browser.test.d.ts.map +1 -0
  21. package/dist/__tests__/asset-registry.dawn.test.d.ts +2 -0
  22. package/dist/__tests__/asset-registry.dawn.test.d.ts.map +1 -0
  23. package/dist/__tests__/asset-registry.listCatalog.test.d.ts +2 -0
  24. package/dist/__tests__/asset-registry.listCatalog.test.d.ts.map +1 -0
  25. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts +2 -0
  26. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts.map +1 -0
  27. package/dist/__tests__/asset-registry.pack-cache.test.d.ts +2 -0
  28. package/dist/__tests__/asset-registry.pack-cache.test.d.ts.map +1 -0
  29. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts +2 -0
  30. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts.map +1 -0
  31. package/dist/__tests__/asset-registry.recursive.spec.d.ts +2 -0
  32. package/dist/__tests__/asset-registry.recursive.spec.d.ts.map +1 -0
  33. package/dist/__tests__/asset-registry.unit.test.d.ts +2 -0
  34. package/dist/__tests__/asset-registry.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/asset.unit.test.d.ts +2 -0
  36. package/dist/__tests__/asset.unit.test.d.ts.map +1 -0
  37. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts +2 -0
  38. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts.map +1 -0
  39. package/dist/__tests__/backend-selection.integration.test.d.ts +2 -0
  40. package/dist/__tests__/backend-selection.integration.test.d.ts.map +1 -0
  41. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts +2 -0
  42. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts.map +1 -0
  43. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts +2 -0
  44. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts.map +1 -0
  45. package/dist/__tests__/collect-scene-asset.test.d.ts +1 -2
  46. package/dist/__tests__/collect-scene-asset.test.d.ts.map +1 -1
  47. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts +2 -0
  48. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts.map +1 -0
  49. package/dist/__tests__/collect-transient-roundtrip.test.d.ts +1 -1
  50. package/dist/__tests__/collect-transient-roundtrip.test.d.ts.map +1 -1
  51. package/dist/__tests__/collect-transient-skip.test.d.ts +1 -2
  52. package/dist/__tests__/collect-transient-skip.test.d.ts.map +1 -1
  53. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts +2 -0
  54. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts.map +1 -0
  55. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts +2 -0
  56. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts.map +1 -0
  57. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts +2 -0
  58. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts.map +1 -0
  59. package/dist/__tests__/draw-published.d.ts +2 -2
  60. package/dist/__tests__/draw-published.d.ts.map +1 -1
  61. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts +2 -0
  62. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts.map +1 -0
  63. package/dist/__tests__/errors.unit.test.d.ts +2 -0
  64. package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
  65. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts +2 -0
  66. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts.map +1 -0
  67. package/dist/__tests__/fetch-binary-decompress.test.d.ts +2 -0
  68. package/dist/__tests__/fetch-binary-decompress.test.d.ts.map +1 -0
  69. package/dist/__tests__/four-path-compression.integration.test.d.ts +2 -0
  70. package/dist/__tests__/four-path-compression.integration.test.d.ts.map +1 -0
  71. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts +2 -0
  72. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts.map +1 -0
  73. package/dist/__tests__/guid-for-asset.unit.test.d.ts +2 -0
  74. package/dist/__tests__/guid-for-asset.unit.test.d.ts.map +1 -0
  75. package/dist/__tests__/handle-migration.test.d.ts +2 -0
  76. package/dist/__tests__/handle-migration.test.d.ts.map +1 -0
  77. package/dist/__tests__/helpers/register-runtime-components.d.ts.map +1 -1
  78. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts +2 -0
  79. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts.map +1 -0
  80. package/dist/__tests__/host-custom-kind-contract.test.d.ts +2 -0
  81. package/dist/__tests__/host-custom-kind-contract.test.d.ts.map +1 -0
  82. package/dist/__tests__/inspect-name.test.d.ts +2 -0
  83. package/dist/__tests__/inspect-name.test.d.ts.map +1 -0
  84. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts +2 -0
  85. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts.map +1 -0
  86. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts +2 -0
  87. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts.map +1 -0
  88. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts +2 -0
  89. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/loader-extract-graceful.test.d.ts +2 -0
  91. package/dist/__tests__/loader-extract-graceful.test.d.ts.map +1 -0
  92. package/dist/__tests__/loader-name-survival.test.d.ts +2 -0
  93. package/dist/__tests__/loader-name-survival.test.d.ts.map +1 -0
  94. package/dist/__tests__/mesh-bin-contract.test.d.ts +2 -0
  95. package/dist/__tests__/mesh-bin-contract.test.d.ts.map +1 -0
  96. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts +2 -0
  97. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts.map +1 -0
  98. package/dist/__tests__/mesh-bin.test.d.ts +2 -0
  99. package/dist/__tests__/mesh-bin.test.d.ts.map +1 -0
  100. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts +2 -0
  101. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts.map +1 -0
  102. package/dist/__tests__/new-kind-refs-contract.test.d.ts +2 -0
  103. package/dist/__tests__/new-kind-refs-contract.test.d.ts.map +1 -0
  104. package/dist/__tests__/package-promotion.test.d.ts +2 -0
  105. package/dist/__tests__/package-promotion.test.d.ts.map +1 -0
  106. package/dist/__tests__/package-rename.test.d.ts +2 -0
  107. package/dist/__tests__/package-rename.test.d.ts.map +1 -0
  108. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts +1 -1
  109. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts.map +1 -1
  110. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +1 -1
  111. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -1
  112. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts +10 -0
  113. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts.map +1 -0
  114. package/dist/__tests__/render-system-extract.unit.test.d.ts +2 -0
  115. package/dist/__tests__/render-system-extract.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/renderer-test-utils.d.ts +10 -0
  117. package/dist/__tests__/renderer-test-utils.d.ts.map +1 -0
  118. package/dist/__tests__/renderer.test-d.d.ts +2 -0
  119. package/dist/__tests__/renderer.test-d.d.ts.map +1 -0
  120. package/dist/__tests__/resolve-asset-handle-err.test.d.ts +2 -0
  121. package/dist/__tests__/resolve-asset-handle-err.test.d.ts.map +1 -0
  122. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts +2 -0
  123. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts.map +1 -0
  124. package/dist/__tests__/resolveName-fallback.test.d.ts +2 -0
  125. package/dist/__tests__/resolveName-fallback.test.d.ts.map +1 -0
  126. package/dist/__tests__/resolveName-null-package.test.d.ts +2 -0
  127. package/dist/__tests__/resolveName-null-package.test.d.ts.map +1 -0
  128. package/dist/__tests__/resolveName-unified-entry.test.d.ts +2 -0
  129. package/dist/__tests__/resolveName-unified-entry.test.d.ts.map +1 -0
  130. package/dist/__tests__/resolveName.test.d.ts +2 -0
  131. package/dist/__tests__/resolveName.test.d.ts.map +1 -0
  132. package/dist/__tests__/roots-to-scene-asset.test.d.ts +1 -1
  133. package/dist/__tests__/roots-to-scene-asset.test.d.ts.map +1 -1
  134. package/dist/__tests__/roundtrip-primitive.test.d.ts +2 -0
  135. package/dist/__tests__/roundtrip-primitive.test.d.ts.map +1 -0
  136. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts +2 -0
  137. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts.map +1 -0
  138. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts +2 -0
  139. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts.map +1 -0
  140. package/dist/__tests__/scene-mount-fixed-point.test.d.ts +2 -0
  141. package/dist/__tests__/scene-mount-fixed-point.test.d.ts.map +1 -0
  142. package/dist/__tests__/scene-mount-roundtrip.test.d.ts +2 -0
  143. package/dist/__tests__/scene-mount-roundtrip.test.d.ts.map +1 -0
  144. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts +2 -0
  145. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts.map +1 -0
  146. package/dist/__tests__/scene-sugar-instantiate.test.d.ts +2 -0
  147. package/dist/__tests__/scene-sugar-instantiate.test.d.ts.map +1 -0
  148. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts +2 -0
  149. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts.map +1 -0
  150. package/dist/__tests__/serialize-scene-asset.test.d.ts +1 -1
  151. package/dist/__tests__/serialize-scene-asset.test.d.ts.map +1 -1
  152. package/dist/__tests__/template-game-default-api-contract.test.d.ts +2 -0
  153. package/dist/__tests__/template-game-default-api-contract.test.d.ts.map +1 -0
  154. package/dist/__tests__/tileset-asset-validate.test.d.ts +2 -0
  155. package/dist/__tests__/tileset-asset-validate.test.d.ts.map +1 -0
  156. package/dist/__tests__/transcode-fallback.unit.test.d.ts +2 -0
  157. package/dist/__tests__/transcode-fallback.unit.test.d.ts.map +1 -0
  158. package/dist/__tests__/transient-runtime-behavior.test.d.ts +2 -0
  159. package/dist/__tests__/transient-runtime-behavior.test.d.ts.map +1 -0
  160. package/dist/__tests__/video-loader-consumption.test.d.ts +2 -0
  161. package/dist/__tests__/video-loader-consumption.test.d.ts.map +1 -0
  162. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts +2 -0
  163. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts.map +1 -0
  164. package/dist/backend-selection.d.ts +13 -0
  165. package/dist/backend-selection.d.ts.map +1 -0
  166. package/dist/collect-scene-asset.d.ts +3 -3
  167. package/dist/collect-scene-asset.d.ts.map +1 -1
  168. package/dist/createRenderer.d.ts +14 -2
  169. package/dist/createRenderer.d.ts.map +1 -1
  170. package/dist/errors/environment.d.ts +1 -1
  171. package/dist/errors/environment.d.ts.map +1 -1
  172. package/dist/index.d.ts +19 -81
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.mjs +105 -108
  175. package/dist/index.mjs.map +1 -1
  176. package/dist/renderer-host.d.ts +9 -0
  177. package/dist/renderer-host.d.ts.map +1 -0
  178. package/dist/renderer-host.mjs +62 -0
  179. package/dist/renderer-host.mjs.map +1 -0
  180. package/dist/scene-instances/index.d.ts +2 -0
  181. package/dist/scene-instances/index.d.ts.map +1 -0
  182. package/dist/scene-utils/mount-override-fold.d.ts +1 -2
  183. package/dist/scene-utils/mount-override-fold.d.ts.map +1 -1
  184. package/dist/systems/sprite-animation-tick.d.ts +1 -1
  185. package/dist/systems/sprite-animation-tick.d.ts.map +1 -1
  186. package/dist/systems/transparent-sort.d.ts +1 -2
  187. package/dist/systems/transparent-sort.d.ts.map +1 -1
  188. package/dist/tilemap-register-validate.d.ts.map +1 -1
  189. package/package.json +34 -33
  190. package/src/__tests__/active-camera.unit.test.ts +19 -9
  191. package/src/__tests__/animation-graph-collect-roundtrip.test.ts +213 -0
  192. package/src/__tests__/animation-graph-serialize.unit.test.ts +171 -0
  193. package/src/__tests__/append-injection.test.ts +1 -1
  194. package/src/__tests__/asset-brand-and-name-retirement.test.ts +102 -0
  195. package/src/__tests__/asset-error-exhaustive.test-d.ts +62 -0
  196. package/src/__tests__/asset-registry-guid-reverse.test.ts +575 -0
  197. package/src/__tests__/asset-registry-hdr-equirect.test.ts +78 -0
  198. package/src/__tests__/asset-registry-mesh-pack-payload.dawn.test.ts +232 -0
  199. package/src/__tests__/asset-registry-mounts.test.ts +806 -0
  200. package/src/__tests__/asset-registry.browser.test.ts +81 -0
  201. package/src/__tests__/asset-registry.dawn.test.ts +94 -0
  202. package/src/__tests__/asset-registry.listCatalog.test.ts +170 -0
  203. package/src/__tests__/asset-registry.mesh-bin.test.ts +316 -0
  204. package/src/__tests__/asset-registry.pack-cache.test.ts +969 -0
  205. package/src/__tests__/asset-registry.raw-container-failfast.test.ts +225 -0
  206. package/src/__tests__/asset-registry.recursive.spec.ts +1397 -0
  207. package/src/__tests__/asset-registry.unit.test.ts +1030 -0
  208. package/src/__tests__/asset.unit.test.ts +7107 -0
  209. package/src/__tests__/audio-load-by-guid.unit.test.ts +126 -0
  210. package/src/__tests__/backend-selection.integration.test.ts +11 -0
  211. package/src/__tests__/basis-catalog-dispatch.integration.test.ts +320 -0
  212. package/src/__tests__/bind-group-cache-keying.test.ts +4 -4
  213. package/src/__tests__/block-upload-math.unit.test.ts +2 -2
  214. package/src/__tests__/builtin-asset-registry.unit.test.ts +112 -0
  215. package/src/__tests__/builtin-shader-register-e2e.test.ts +1 -1
  216. package/src/__tests__/cache-false-eviction.test.ts +2 -1
  217. package/src/__tests__/cache-isolation-matrix.test.ts +2 -1
  218. package/src/__tests__/camera-clear-snapshot-equivalence.unit.test.ts +5 -6
  219. package/src/__tests__/clamp-to-last.e2e.browser.test.ts +29 -19
  220. package/src/__tests__/collect-scene-asset.test.ts +49 -52
  221. package/src/__tests__/collect-scene-mount-collapse.test.ts +391 -0
  222. package/src/__tests__/collect-subtree.unit.test.ts +1 -2
  223. package/src/__tests__/collect-transient-children-absent.test.ts +24 -10
  224. package/src/__tests__/collect-transient-roundtrip.test.ts +44 -20
  225. package/src/__tests__/collect-transient-skip.test.ts +24 -13
  226. package/src/__tests__/components.test-d.ts +1 -6
  227. package/src/__tests__/components.unit.test.ts +20 -19
  228. package/src/__tests__/composite-skybox-cross-world.browser.test.ts +59 -27
  229. package/src/__tests__/compressed-texture-physical-extent.integration.test.ts +139 -0
  230. package/src/__tests__/create-renderer-assembly.integration.test.ts +42 -29
  231. package/src/__tests__/createRenderer-dispose.test.ts +35 -402
  232. package/src/__tests__/createRenderer.browser-no-webgpu.test.ts +25 -30
  233. package/src/__tests__/createRenderer.unit.test.ts +1 -1
  234. package/src/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.ts +27 -63
  235. package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +56 -47
  236. package/src/__tests__/dawn/instances-per-instance-pbr.dawn.test.ts +49 -29
  237. package/src/__tests__/dawn/instances-shadow.dawn.test.ts +26 -15
  238. package/src/__tests__/dawn/instances-uniform-fallback.dawn.test.ts +13 -14
  239. package/src/__tests__/dawn/material-alpha.dawn.test.ts +23 -31
  240. package/src/__tests__/dawn/material-cooked-fixture.dawn.test.ts +0 -18
  241. package/src/__tests__/dawn/{mesh-update.dawn.test.ts → mesh-update-dawn.test.ts} +42 -134
  242. package/src/__tests__/dawn/mipmap-srgb-linear.dawn.test.ts +14 -7
  243. package/src/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.ts +16 -28
  244. package/src/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.ts +23 -39
  245. package/src/__tests__/dawn/upload-texture.dawn.test.ts +198 -0
  246. package/src/__tests__/dawn/user-handle-mesh-render.dawn.test.ts +12 -14
  247. package/src/__tests__/dawn/user-mesh-upload.dawn.test.ts +27 -22
  248. package/src/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.ts +25 -28
  249. package/src/__tests__/dawn/zero-manifest-ready.dawn.test.ts +10 -11
  250. package/src/__tests__/demo-sortscope-migration.unit.test.ts +5 -5
  251. package/src/__tests__/derive-bgl-integration.test.ts +34 -44
  252. package/src/__tests__/derive-render-data-skin.unit.test.ts +1 -1
  253. package/src/__tests__/draw-published.ts +11 -4
  254. package/src/__tests__/dynamic-texture-store.unit.test.ts +190 -0
  255. package/src/__tests__/equirect-bc6h.integration.test.ts +144 -21
  256. package/src/__tests__/errors.unit.test.ts +1203 -0
  257. package/src/__tests__/extract-frames-graceful-degradation.test.ts +3 -7
  258. package/src/__tests__/extract-frames-merge.test.ts +35 -22
  259. package/src/__tests__/extract-record-no-hardcoded-texture-fields.test.ts +5 -16
  260. package/src/__tests__/extract-skin-mismatch.unit.test.ts +322 -0
  261. package/src/__tests__/fetch-binary-decompress.test.ts +356 -0
  262. package/src/__tests__/four-path-compression.integration.test.ts +395 -0
  263. package/src/__tests__/frame-targets-shadow-regression.unit.test.ts +1 -1
  264. package/src/__tests__/fullscreen-feature-host.dawn.test.ts +80 -0
  265. package/src/__tests__/fullscreen-post-bgl-depth.test.ts +4 -2
  266. package/src/__tests__/fullscreen-post-depth-params-arity.test.ts +3 -3
  267. package/src/__tests__/fullscreen-post-process-pass.dawn.test.ts +39 -23
  268. package/src/__tests__/fullscreen-post-process-pass.unit.test.ts +4 -2
  269. package/src/__tests__/fxaa-pixel-diff.dawn.test.ts +28 -17
  270. package/src/__tests__/fxaa-validation-and-resize.dawn.test.ts +29 -18
  271. package/src/__tests__/fxaa-zero-overhead.dawn.test.ts +16 -12
  272. package/src/__tests__/geometry.unit.test.ts +525 -159
  273. package/src/__tests__/glyph-tilemap-worldid.test.ts +1 -1
  274. package/src/__tests__/gpu-resource-cow-survivor.test.ts +6 -4
  275. package/src/__tests__/guid-for-asset.unit.test.ts +102 -0
  276. package/src/__tests__/handle-migration.test.ts +136 -0
  277. package/src/__tests__/helpers/register-runtime-components.ts +4 -2
  278. package/src/__tests__/helpers/register-scene-components.ts +1 -1
  279. package/src/__tests__/host-custom-kind-contract.test-d.ts +47 -0
  280. package/src/__tests__/host-custom-kind-contract.test.ts +578 -0
  281. package/src/__tests__/inspect-name.test.ts +139 -0
  282. package/src/__tests__/instances.test-d.ts +1 -1
  283. package/src/__tests__/instantiate-mount-deferred-wiring.test.ts +112 -0
  284. package/src/__tests__/light-casters-9-light.browser.test.ts +73 -76
  285. package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +7 -10
  286. package/src/__tests__/light-snapshot.test-d.ts +2 -2
  287. package/src/__tests__/lights-vec-negative.unit.test.ts +1 -1
  288. package/src/__tests__/lights.unit.test.ts +16 -500
  289. package/src/__tests__/loadbyguid-payload.unit.test.ts +117 -0
  290. package/src/__tests__/loadbyguid-texture-intern.unit.test.ts +213 -0
  291. package/src/__tests__/loader-extract-graceful.test.ts +146 -0
  292. package/src/__tests__/loader-name-survival.test.ts +213 -0
  293. package/src/__tests__/m3-vec-negative.unit.test.ts +3 -2
  294. package/src/__tests__/material-texture-uv-scale.unit.test.ts +101 -31
  295. package/src/__tests__/materials.unit.test.ts +10 -27
  296. package/src/__tests__/mesh-bin-contract.test.ts +28 -0
  297. package/src/__tests__/mesh-bin-skin-roundtrip.unit.test.ts +149 -0
  298. package/src/__tests__/mesh-bin.test.ts +38 -0
  299. package/src/__tests__/mesh-loader-skin-contract.unit.test.ts +120 -0
  300. package/src/__tests__/mesh-ssbo-grow.unit.test.ts +3 -3
  301. package/src/__tests__/mip-gate.unit.test.ts +1 -1
  302. package/src/__tests__/msaa-sprite-pixel-diff.dawn.test.ts +29 -68
  303. package/src/__tests__/new-kind-refs-contract.test.ts +132 -0
  304. package/src/__tests__/node-shims.d.ts +4 -6
  305. package/src/__tests__/package-promotion.test.ts +88 -0
  306. package/src/__tests__/package-rename.test.ts +103 -0
  307. package/src/__tests__/pass-selector.unit.test.ts +2 -2
  308. package/src/__tests__/pbr-pipeline.unit.test.ts +14 -21
  309. package/src/__tests__/pipeline-builder-msaa.unit.test.ts +6 -9
  310. package/src/__tests__/pipeline-cache-keying.unit.test.ts +6 -9
  311. package/src/__tests__/pipeline-spec.test.ts +16 -177
  312. package/src/__tests__/pipeline.unit.test.ts +154 -1693
  313. package/src/__tests__/point-light-shadow.dawn.test.ts +33 -42
  314. package/src/__tests__/point-light-shadow.unit.test.ts +19 -60
  315. package/src/__tests__/post-process-error-codes.unit.test.ts +4 -1
  316. package/src/__tests__/post-process-params-component.unit.test.ts +1 -1
  317. package/src/__tests__/post-process-params-extract.unit.test.ts +2 -5
  318. package/src/__tests__/postprocess-camera-consistency.test.ts +4 -7
  319. package/src/__tests__/profiler-assembly.integration.test.ts +1 -1
  320. package/src/__tests__/propagate-transforms.dawn.test.ts +12 -11
  321. package/src/__tests__/record-worldid-isolation.test.ts +7 -29
  322. package/src/__tests__/recover-error-exhaustive.test-d.ts +1 -1
  323. package/src/__tests__/render-error-exhaustive.test-d.ts +81 -71
  324. package/src/__tests__/render-feature-assembly.test-d.ts +20 -9
  325. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +8 -6
  326. package/src/__tests__/render-feature-prepared-graphics.browser.test.ts +60 -558
  327. package/src/__tests__/render-feature-prepared-graphics.dawn.test.ts +57 -544
  328. package/src/__tests__/render-feature-prepared-graphics.fixture.ts +104 -0
  329. package/src/__tests__/render-feature-prepared-graphics.integration.test.ts +40 -248
  330. package/src/__tests__/render-feature-prepared-graphics.regression.integration.test.ts +83 -340
  331. package/src/__tests__/render-feature-recover.integration.test.ts +9 -49
  332. package/src/__tests__/render-feature-runtime-surface.test-d.ts +17 -20
  333. package/src/__tests__/render-schema-consumer.integration.test.ts +20 -13
  334. package/src/__tests__/render-schema-owner-boundary.unit.test.ts +2 -6
  335. package/src/__tests__/render-system-cross-world-overlay-queue.test.ts +5 -5
  336. package/src/__tests__/render-system-extract-dispatch-ordering.test.ts +16 -31
  337. package/src/__tests__/render-system-extract.test.ts +36 -51
  338. package/src/__tests__/render-system-extract.unit.test.ts +360 -0
  339. package/src/__tests__/render-system-fold-bucket.unit.test.ts +3 -5
  340. package/src/__tests__/render-system-fold-fallback.unit.test.ts +6 -3
  341. package/src/__tests__/render-system-fold-material.unit.test.ts +3 -5
  342. package/src/__tests__/render-system-fold-metrics.unit.test.ts +5 -5
  343. package/src/__tests__/render-system-fold-modegate.unit.test.ts +6 -6
  344. package/src/__tests__/render-system-fold.dawn.test.ts +7 -5
  345. package/src/__tests__/render-system-mega.test.ts +292 -190
  346. package/src/__tests__/render-system-owner-split-contract.test.ts +10 -32
  347. package/src/__tests__/render-system-record-multi-material-textureview.test.ts +59 -45
  348. package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +23 -29
  349. package/src/__tests__/render-system-record.test.ts +398 -235
  350. package/src/__tests__/render-system-record.unit.test.ts +25 -26
  351. package/src/__tests__/render-system-skin-bg.unit.test.ts +8 -12
  352. package/src/__tests__/renderer-consumer.test-d.ts +16 -3
  353. package/src/__tests__/renderer-health.unit.test.ts +26 -916
  354. package/src/__tests__/renderer-lifecycle.integration.test.ts +19 -6
  355. package/src/__tests__/renderer-recover.unit.test.ts +49 -1069
  356. package/src/__tests__/renderer-result.test-d.ts +19 -9
  357. package/src/__tests__/renderer-surface.unit.test.ts +3 -5
  358. package/src/__tests__/renderer-test-utils.ts +56 -0
  359. package/src/__tests__/renderer.test-d.ts +59 -0
  360. package/src/__tests__/resolve-asset-handle-err.test.ts +111 -0
  361. package/src/__tests__/resolve-asset-handle.unit.test.ts +64 -0
  362. package/src/__tests__/resolve-depth-only-view.test.ts +1 -1
  363. package/src/__tests__/resolveName-fallback.test.ts +64 -0
  364. package/src/__tests__/resolveName-null-package.test.ts +38 -0
  365. package/src/__tests__/resolveName-unified-entry.test.ts +65 -0
  366. package/src/__tests__/resolveName.test.ts +64 -0
  367. package/src/__tests__/rhi-null-command-flow.unit.test.ts +43 -261
  368. package/src/__tests__/rhi-null-renderer-lifecycle.unit.test.ts +41 -169
  369. package/src/__tests__/roots-to-scene-asset.test.ts +199 -93
  370. package/src/__tests__/roundtrip-primitive.test.ts +351 -0
  371. package/src/__tests__/scene-bare-guid-refs-instantiate.test.ts +123 -0
  372. package/src/__tests__/scene-equirect-roundtrip.test.ts +103 -16
  373. package/src/__tests__/scene-instance-authoring.integration.test.ts +8 -0
  374. package/src/__tests__/scene-instance-bridge.integration.test.ts +1 -1
  375. package/src/__tests__/scene-instance-component.test.ts +1 -1
  376. package/src/__tests__/scene-mount-fixed-point.test.ts +257 -0
  377. package/src/__tests__/scene-mount-roundtrip.test.ts +987 -0
  378. package/src/__tests__/scene-mount-wrapper-roundtrip.test.ts +202 -0
  379. package/src/__tests__/scene-sugar-instantiate.test.ts +324 -0
  380. package/src/__tests__/serialize-mounts-roundtrip.test.ts +533 -0
  381. package/src/__tests__/serialize-scene-asset.test.ts +219 -22
  382. package/src/__tests__/shadow-caster-empty-schema.test.ts +3 -3
  383. package/src/__tests__/shadow-csm-cascade-loadop.test.ts +37 -17
  384. package/src/__tests__/shadow-csm-component.test.ts +3 -5
  385. package/src/__tests__/shadow-csm-extract.test.ts +2 -100
  386. package/src/__tests__/shadow-csm-orthoz.test.ts +2 -16
  387. package/src/__tests__/shadow-csm-runtime-vary.dawn.test.ts +19 -14
  388. package/src/__tests__/shadow-csm-tile-consistency.test.ts +32 -26
  389. package/src/__tests__/shadow-csm-ubo.dawn.test.ts +8 -49
  390. package/src/__tests__/shadow-csm-ubo.test.ts +3 -25
  391. package/src/__tests__/shadow-csm-viewport.browser.test.ts +1 -1
  392. package/src/__tests__/shadow-fields-observable.dawn.test.ts +67 -56
  393. package/src/__tests__/shadow-m1.dawn.test.ts +8 -9
  394. package/src/__tests__/shadow-mesh-ssbo-order.test.ts +11 -27
  395. package/src/__tests__/skin-errors.unit.test.ts +1 -1
  396. package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +7 -5
  397. package/src/__tests__/skylight-lazy-projection.test.ts +36 -15
  398. package/src/__tests__/sparse-tag-scene-roundtrip.test.ts +5 -5
  399. package/src/__tests__/sprite-cullmode-flip.dawn.test.ts +47 -64
  400. package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +12 -11
  401. package/src/__tests__/sprite-lit-extract-branch.test.ts +1 -1
  402. package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +1 -1
  403. package/src/__tests__/ssao-bgl.test.ts +16 -9
  404. package/src/__tests__/ssao-buffers.test.ts +2 -2
  405. package/src/__tests__/ssao-data.test.ts +2 -2
  406. package/src/__tests__/ssao-errors.test.ts +1 -1
  407. package/src/__tests__/ssao-passes.test.ts +64 -392
  408. package/src/__tests__/ssao-pipelines.test.ts +1 -1
  409. package/src/__tests__/ssao-uniform-layout.test.ts +8 -6
  410. package/src/__tests__/stencil-outline-pixel.dawn.test.ts +25 -17
  411. package/src/__tests__/swap-chain-format.unit.test.ts +5 -7
  412. package/src/__tests__/systems.unit.test.ts +536 -1326
  413. package/src/__tests__/template-game-default-api-contract.test.ts +362 -0
  414. package/src/__tests__/text.unit.test.ts +56 -33
  415. package/src/__tests__/tilemap-childed-despawn.test.ts +8 -14
  416. package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +8 -12
  417. package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +2 -1
  418. package/src/__tests__/tilemap-chunk-extract.test.ts +13 -17
  419. package/src/__tests__/tilemap-dirty-rebuild.test.ts +7 -11
  420. package/src/__tests__/tilemap-material-cache.test.ts +8 -13
  421. package/src/__tests__/tilemap-multi-atlas.test.ts +12 -32
  422. package/src/__tests__/tilemap-owner-boundary.unit.test.ts +5 -2
  423. package/src/__tests__/tilemap-region-pack.test.ts +8 -12
  424. package/src/__tests__/tilemap-spawn-flip-pivot.test.ts +8 -12
  425. package/src/__tests__/tilemap-uv-inset.test.ts +11 -14
  426. package/src/__tests__/tilemap-validate.test.ts +1 -1
  427. package/src/__tests__/tileset-asset-validate.test.ts +638 -0
  428. package/src/__tests__/transcode-fallback.unit.test.ts +207 -0
  429. package/src/__tests__/transform-hierarchy-pixel-diff.dawn.test.ts +36 -28
  430. package/src/__tests__/transient-fields-collect.test.ts +28 -21
  431. package/src/__tests__/transient-runtime-behavior.test.ts +227 -0
  432. package/src/__tests__/transparent-sort-tilemap-sprite-interleave.test.ts +4 -4
  433. package/src/__tests__/variant-selection.unit.test.ts +1 -1
  434. package/src/__tests__/video-extract-bindgroup.dawn.test.ts +89 -136
  435. package/src/__tests__/video-loader-consumption.test.ts +86 -0
  436. package/src/__tests__/video-loader-smoke.dawn.test.ts +60 -0
  437. package/src/__tests__/view-ubo-layout.browser.test.ts +0 -22
  438. package/src/__tests__/world-entity-key.test.ts +1 -1
  439. package/src/__tests__/world-scene-despawn.test.ts +1 -1
  440. package/src/__tests__/world-scene-instantiate.test.ts +2 -36
  441. package/src/__tests__/world-scene-nested.test.ts +1 -1
  442. package/src/__tests__/world-scene-override.test.ts +1 -1
  443. package/src/backend-selection.ts +69 -0
  444. package/src/collect-scene-asset.ts +28 -23
  445. package/src/components/__tests__/camera.test-d.ts +1 -1
  446. package/src/components/__tests__/camera.test.ts +1 -1
  447. package/src/components/__tests__/sprite-animation.test-d.ts +2 -2
  448. package/src/components/__tests__/tile-layer.test-d.ts +1 -1
  449. package/src/components/__tests__/tile-layer.unit.test.ts +2 -2
  450. package/src/createRenderer.ts +24 -36
  451. package/src/errors/environment.ts +1 -1
  452. package/src/index.ts +47 -113
  453. package/src/renderer-host.ts +33 -0
  454. package/src/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.ts +1 -1
  455. package/src/scene-instances/index.ts +4 -0
  456. package/src/scene-utils/mount-override-fold.ts +3 -7
  457. package/src/systems/__tests__/transparent-sort.bench.ts +3 -3
  458. package/src/systems/sprite-animation-tick.ts +1 -1
  459. package/src/systems/transparent-sort.ts +38 -38
  460. package/src/tilemap-register-validate.ts +4 -4
  461. package/dist/__tests__/bind-group-cache-binding.test.d.ts +0 -2
  462. package/dist/__tests__/bind-group-cache-binding.test.d.ts.map +0 -1
  463. package/dist/__tests__/bind-group-cache-frame.test.d.ts +0 -2
  464. package/dist/__tests__/bind-group-cache-frame.test.d.ts.map +0 -1
  465. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts +0 -2
  466. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts.map +0 -1
  467. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts +0 -2
  468. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts.map +0 -1
  469. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts +0 -2
  470. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts.map +0 -1
  471. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts +0 -2
  472. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts.map +0 -1
  473. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts +0 -2
  474. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts.map +0 -1
  475. package/dist/__tests__/fog-producer-manifest.d.ts +0 -131
  476. package/dist/__tests__/fog-producer-manifest.d.ts.map +0 -1
  477. package/dist/__tests__/fog-producer-pixel-probe.d.ts +0 -42
  478. package/dist/__tests__/fog-producer-pixel-probe.d.ts.map +0 -1
  479. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts +0 -2
  480. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts.map +0 -1
  481. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts +0 -2
  482. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts.map +0 -1
  483. package/dist/__tests__/fog-producer-real-fixture.d.ts +0 -5
  484. package/dist/__tests__/fog-producer-real-fixture.d.ts.map +0 -1
  485. package/dist/__tests__/fog-producer-vfx-effect.d.ts +0 -3
  486. package/dist/__tests__/fog-producer-vfx-effect.d.ts.map +0 -1
  487. package/dist/__tests__/fog-scene-asset.integration.test.d.ts +0 -2
  488. package/dist/__tests__/fog-scene-asset.integration.test.d.ts.map +0 -1
  489. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts +0 -2
  490. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts.map +0 -1
  491. package/dist/__tests__/gpu-resource.test.d.ts +0 -2
  492. package/dist/__tests__/gpu-resource.test.d.ts.map +0 -1
  493. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts +0 -2
  494. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts.map +0 -1
  495. package/dist/__tests__/hdrp-buffers.unit.test.d.ts +0 -2
  496. package/dist/__tests__/hdrp-buffers.unit.test.d.ts.map +0 -1
  497. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts +0 -2
  498. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts.map +0 -1
  499. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts +0 -2
  500. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts.map +0 -1
  501. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts +0 -2
  502. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts.map +0 -1
  503. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts +0 -2
  504. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts.map +0 -1
  505. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts +0 -2
  506. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts.map +0 -1
  507. package/dist/__tests__/helpers/primitive-world.d.ts +0 -8
  508. package/dist/__tests__/helpers/primitive-world.d.ts.map +0 -1
  509. package/dist/__tests__/helpers/render-asset-port.d.ts +0 -15
  510. package/dist/__tests__/helpers/render-asset-port.d.ts.map +0 -1
  511. package/dist/__tests__/helpers/scene-asset-port.d.ts +0 -9
  512. package/dist/__tests__/helpers/scene-asset-port.d.ts.map +0 -1
  513. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts +0 -2
  514. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts.map +0 -1
  515. package/dist/__tests__/pipeline-layout-selection.test.d.ts +0 -2
  516. package/dist/__tests__/pipeline-layout-selection.test.d.ts.map +0 -1
  517. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts +0 -2
  518. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts.map +0 -1
  519. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts +0 -2
  520. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts.map +0 -1
  521. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts +0 -2
  522. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts.map +0 -1
  523. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts +0 -2
  524. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts.map +0 -1
  525. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts +0 -2
  526. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts.map +0 -1
  527. package/dist/__tests__/shadow-csm-pssm.test.d.ts +0 -2
  528. package/dist/__tests__/shadow-csm-pssm.test.d.ts.map +0 -1
  529. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts +0 -2
  530. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts.map +0 -1
  531. package/dist/__tests__/shadow-csm-viewport.test.d.ts +0 -2
  532. package/dist/__tests__/shadow-csm-viewport.test.d.ts.map +0 -1
  533. package/dist/__tests__/shadow-m2.dawn.test.d.ts +0 -2
  534. package/dist/__tests__/shadow-m2.dawn.test.d.ts.map +0 -1
  535. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts +0 -2
  536. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts.map +0 -1
  537. package/dist/__tests__/shadow-m3-calibrate.d.ts +0 -83
  538. package/dist/__tests__/shadow-m3-calibrate.d.ts.map +0 -1
  539. package/dist/__tests__/shadow-m3.dawn.test.d.ts +0 -2
  540. package/dist/__tests__/shadow-m3.dawn.test.d.ts.map +0 -1
  541. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts +0 -2
  542. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts.map +0 -1
  543. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts +0 -2
  544. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts.map +0 -1
  545. package/dist/__tests__/temporal-off-path.unit.test.d.ts +0 -2
  546. package/dist/__tests__/temporal-off-path.unit.test.d.ts.map +0 -1
  547. package/dist/__tests__/video-cache-regression.unit.test.d.ts +0 -2
  548. package/dist/__tests__/video-cache-regression.unit.test.d.ts.map +0 -1
  549. package/dist/asset-kind.d.ts +0 -4
  550. package/dist/asset-kind.d.ts.map +0 -1
  551. package/dist/errors/sprite-animation.d.ts +0 -3
  552. package/dist/errors/sprite-animation.d.ts.map +0 -1
  553. package/dist/scene-asset-port.d.ts +0 -17
  554. package/dist/scene-asset-port.d.ts.map +0 -1
  555. package/dist/scene-collect-errors.d.ts +0 -22
  556. package/dist/scene-collect-errors.d.ts.map +0 -1
  557. package/dist/shadow-m3-calibrate.d.ts +0 -40
  558. package/dist/shadow-m3-calibrate.d.ts.map +0 -1
  559. package/src/__tests__/bind-group-cache-binding.test.ts +0 -2513
  560. package/src/__tests__/bind-group-cache-frame.test.ts +0 -1511
  561. package/src/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.ts +0 -204
  562. package/src/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.ts +0 -297
  563. package/src/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.ts +0 -271
  564. package/src/__tests__/dispatch-fullscreen-pass-params.unit.test.ts +0 -321
  565. package/src/__tests__/fog-producer-manifest.ts +0 -162
  566. package/src/__tests__/fog-producer-pixel-probe.ts +0 -263
  567. package/src/__tests__/fog-producer-pixel.browser.test.ts +0 -26
  568. package/src/__tests__/fog-producer-pixel.dawn.test.ts +0 -55
  569. package/src/__tests__/fog-producer-real-fixture.ts +0 -805
  570. package/src/__tests__/fog-producer-vfx-effect.ts +0 -272
  571. package/src/__tests__/fog-scene-asset.integration.test.ts +0 -123
  572. package/src/__tests__/gpu-resource-store-cubemap-status.test.ts +0 -207
  573. package/src/__tests__/gpu-resource.test.ts +0 -1206
  574. package/src/__tests__/hdrp-bgl-slots.browser.test.ts +0 -50
  575. package/src/__tests__/hdrp-buffers.unit.test.ts +0 -70
  576. package/src/__tests__/hdrp-execute-filter.unit.test.ts +0 -200
  577. package/src/__tests__/hdrp-gbuffer-attachments.browser.test.ts +0 -64
  578. package/src/__tests__/hdrp-pipeline-asset-type.test-d.ts +0 -139
  579. package/src/__tests__/hdrp-ssao-boundary.test.ts +0 -237
  580. package/src/__tests__/hdrp-ssao-falsification.test.ts +0 -289
  581. package/src/__tests__/helpers/primitive-world.ts +0 -91
  582. package/src/__tests__/helpers/render-asset-port.ts +0 -65
  583. package/src/__tests__/helpers/scene-asset-port.ts +0 -23
  584. package/src/__tests__/material-derived-coordinates.integration.test.ts +0 -100
  585. package/src/__tests__/pipeline-layout-selection.test.ts +0 -298
  586. package/src/__tests__/post-process-reads-narrowing.test-d.ts +0 -52
  587. package/src/__tests__/post-process-register-roundtrip.dawn.test.ts +0 -230
  588. package/src/__tests__/render-feature-zero-feature.browser.test.ts +0 -152
  589. package/src/__tests__/render-pipeline-trivial.dawn.test.ts +0 -525
  590. package/src/__tests__/shadow-csm-caster-membership.test.ts +0 -232
  591. package/src/__tests__/shadow-csm-pssm.test.ts +0 -142
  592. package/src/__tests__/shadow-csm-temporal.browser.test.ts +0 -145
  593. package/src/__tests__/shadow-csm-viewport.test.ts +0 -74
  594. package/src/__tests__/shadow-m2.dawn.test.ts +0 -394
  595. package/src/__tests__/shadow-m3-calibrate-run.dawn.test.ts +0 -248
  596. package/src/__tests__/shadow-m3-calibrate.ts +0 -203
  597. package/src/__tests__/shadow-m3.dawn.test.ts +0 -288
  598. package/src/__tests__/shadow-probe-control-flow.dawn.test.ts +0 -264
  599. package/src/__tests__/shadow-quality-metrics.dawn.test.ts +0 -324
  600. package/src/__tests__/temporal-off-path.unit.test.ts +0 -69
  601. package/src/__tests__/video-cache-regression.unit.test.ts +0 -186
  602. package/src/asset-kind.ts +0 -7
  603. package/src/errors/sprite-animation.ts +0 -5
  604. package/src/scene-asset-port.ts +0 -32
  605. package/src/scene-collect-errors.ts +0 -30
  606. package/src/shadow-m3-calibrate.ts +0 -171
@@ -1,237 +0,0 @@
1
- // @forgeax/engine-runtime/__tests__/hdrp-ssao-boundary.test.ts -
2
- // SSAO boundary behavior test (M3 / w14).
3
- // feat-20260612-hdrp-ssao.
4
- //
5
- // requirements AC-07: 4 boundary cases must be tested.
6
- // plan-strategy D-4: g-buffer missing = graph-level skip; the kernel is
7
- // uniform-backed so the WebGL2 capability boundary is not a skip.
8
- // TDD: RED before w15+w16 (addSsaoPasses + boundary guards not yet implemented).
9
- //
10
- // Cases:
11
- // (1) g-buffer missing -> addSsaoPasses silently skips (no pass wiring, no crash)
12
- // (2) non-HDRP pipeline -> config.ssao is ignored (URP with config.ssao produces no SSAO pass)
13
- // (3) storageBuffer=false -> SSAO buffers still allocate through UBOs
14
- // (4) config.ssao.enabled=false -> zero ssao-* passes + zero allocation
15
-
16
- import type { RenderPipelineContext, RenderSystemRuntime } from '@forgeax/engine-render/internal';
17
- import { addSsaoPasses, getOrCreateSsaoBuffers } from '@forgeax/engine-render/internal';
18
- import { RenderGraph } from '@forgeax/engine-render-graph';
19
- import type { RhiCaps, RhiDevice } from '@forgeax/engine-rhi';
20
- import { describe, expect, it, vi } from 'vitest';
21
-
22
- function makeMockRuntime(capsOverride: Partial<RhiCaps> = {}): {
23
- runtime: RenderSystemRuntime;
24
- createBuffer: ReturnType<typeof vi.fn>;
25
- createTexture: ReturnType<typeof vi.fn>;
26
- } {
27
- const createBuffer = vi.fn().mockReturnValue({
28
- ok: true,
29
- value: { label: 'mock-buffer' },
30
- });
31
- const createTexture = vi.fn().mockReturnValue({
32
- ok: true,
33
- value: { label: 'mock-tex' },
34
- });
35
-
36
- const device = {
37
- caps: {
38
- backendKind: 'webgpu' as const,
39
- storageBuffer: true,
40
- float32Filterable: true,
41
- maxColorAttachments: 8,
42
- maxStorageBuffersPerShaderStage: 4,
43
- ...capsOverride,
44
- },
45
- createBuffer,
46
- createTexture,
47
- createTextureView: vi.fn().mockReturnValue({
48
- ok: true,
49
- value: { label: 'mock-tex-view' },
50
- }),
51
- createSampler: vi.fn().mockReturnValue({
52
- ok: true,
53
- value: { label: 'mock-sampler' },
54
- }),
55
- createBindGroupLayout: vi.fn().mockReturnValue({
56
- ok: true,
57
- value: { label: 'mock-bgl' },
58
- }),
59
- queue: {
60
- writeBuffer: vi.fn().mockReturnValue({ ok: true, value: undefined }),
61
- writeTexture: vi.fn().mockReturnValue({ ok: true, value: undefined }),
62
- },
63
- } as unknown as RhiDevice;
64
-
65
- const errorRegistry = {
66
- fire: vi.fn(),
67
- listeners: new Set(),
68
- addEventListener: vi.fn(),
69
- removeEventListener: vi.fn(),
70
- };
71
-
72
- const runtime = {
73
- device,
74
- errorRegistry,
75
- shaderCache: { get: vi.fn() },
76
- } as unknown as RenderSystemRuntime;
77
-
78
- return { runtime, createBuffer, createTexture };
79
- }
80
-
81
- function mockCtx(runtime: RenderSystemRuntime): RenderPipelineContext {
82
- return {
83
- runtime,
84
- assets: { get: vi.fn(), register: vi.fn() },
85
- store: { ensureResident: vi.fn(), getTextureView: vi.fn() },
86
- pipelineState: {},
87
- encoder: {},
88
- view: {},
89
- clear: [0, 0, 0, 1],
90
- targetW: 800,
91
- targetH: 600,
92
- currentTexture: {},
93
- camera: {},
94
- validated: [],
95
- validatedOrdered: [],
96
- viewBindGroup: null,
97
- meshBindGroup: null,
98
- frameState: { perFrameGraph: null, isHdrpActive: true },
99
- dispatchCounts: {},
100
- bindGroupCounts: {},
101
- skylight: undefined,
102
- skylightCount: 0,
103
- skybox: undefined,
104
- msaaActive: false,
105
- geometryColorResolveView: null,
106
- ldrSpriteColorView: null,
107
- } as unknown as RenderPipelineContext;
108
- }
109
-
110
- describe('SSAO boundary behavior (M3 / w14)', () => {
111
- it('(1) g-buffer missing -> addSsaoPasses silently skips (no pass wiring, no crash)', () => {
112
- const { runtime } = makeMockRuntime();
113
- const ctx = mockCtx(runtime);
114
- const graph = new RenderGraph<RenderPipelineContext>();
115
-
116
- // Declare ssaoRaw/ssaoBlurred (half-swapchain r8unorm) but NOT gbuf0/hdrDepth.
117
- // This simulates a g-buffer-less pipeline (e.g. URP or forward-only path).
118
- graph.addColorTarget('ssaoRaw', {
119
- format: 'r8unorm',
120
- size: 'half-swapchain',
121
- sample: 1,
122
- });
123
- graph.addColorTarget('ssaoBlurred', {
124
- format: 'r8unorm',
125
- size: 'half-swapchain',
126
- sample: 1,
127
- });
128
-
129
- // addSsaoPasses should silently skip when gbuf0/hdrDepth are not declared
130
- // in the graph. No throw, no error fired.
131
- addSsaoPasses(graph, {
132
- gbuf0: 'gbuf0',
133
- hdrDepth: 'hdrDepth',
134
- ssaoRaw: 'ssaoRaw',
135
- ssaoBlurred: 'ssaoBlurred',
136
- ctx,
137
- });
138
-
139
- const passes = graph.listPasses();
140
- const ssaoPassNames = passes.map((p) => p.name).filter((n) => n.startsWith('ssao-'));
141
- expect(ssaoPassNames).toHaveLength(0);
142
-
143
- // Graph should still compile without error (no dangling reads)
144
- const compileResult = graph.compile({
145
- backendKind: runtime.device.caps.backendKind,
146
- caps: runtime.device.caps,
147
- });
148
- expect(compileResult.ok).toBe(true);
149
- });
150
-
151
- it('(2) non-HDRP pipeline -> config.ssao ignored (URP with config.ssao produces no SSAO pass)', () => {
152
- const { runtime } = makeMockRuntime();
153
- const ctx = mockCtx(runtime);
154
- ctx.frameState.isHdrpActive = false;
155
-
156
- // Build a URP-style graph (no g-buffer, forward-only). addSsaoPasses should
157
- // check config.ssao?.enabled and/or isHdrpActive and skip silently.
158
- const graph = new RenderGraph<RenderPipelineContext>();
159
-
160
- graph.addColorTarget('ssaoRaw', {
161
- format: 'r8unorm',
162
- size: 'half-swapchain',
163
- sample: 1,
164
- });
165
- graph.addColorTarget('ssaoBlurred', {
166
- format: 'r8unorm',
167
- size: 'half-swapchain',
168
- sample: 1,
169
- });
170
-
171
- addSsaoPasses(graph, {
172
- gbuf0: 'gbuf0',
173
- hdrDepth: 'hdrDepth',
174
- ssaoRaw: 'ssaoRaw',
175
- ssaoBlurred: 'ssaoBlurred',
176
- ctx,
177
- });
178
-
179
- const passes = graph.listPasses();
180
- const ssaoPassNames = passes.map((p) => p.name).filter((n) => n.startsWith('ssao-'));
181
- expect(ssaoPassNames).toHaveLength(0);
182
- });
183
-
184
- it('(3) storageBuffer=false -> allocates SSAO buffers through UBOs', () => {
185
- const { runtime, createBuffer, createTexture } = makeMockRuntime({
186
- storageBuffer: false,
187
- });
188
-
189
- const result = getOrCreateSsaoBuffers(runtime);
190
- expect(result).not.toBeNull();
191
- expect(createBuffer).toHaveBeenCalledTimes(2);
192
- expect(createTexture).toHaveBeenCalledTimes(1);
193
- expect(runtime.errorRegistry.fire).not.toHaveBeenCalled();
194
- });
195
-
196
- it('(4) config.ssao.enabled=false -> zero ssao-* passes (caller-level skip)', () => {
197
- const { runtime } = makeMockRuntime();
198
- const ctx = mockCtx(runtime);
199
- const graph = new RenderGraph<RenderPipelineContext>();
200
-
201
- graph.addColorTarget('gbuf0', {
202
- format: 'rgba16float',
203
- size: 'swapchain',
204
- sample: 1,
205
- });
206
- graph.addColorTarget('hdrDepth', {
207
- format: 'depth24plus-stencil8',
208
- size: 'swapchain',
209
- sample: 1,
210
- });
211
-
212
- // Case 4: the caller (hdrp-pipeline.buildGraph) checks config.ssao?.enabled
213
- // and skips addSsaoPasses entirely. When not called, zero ssao-* passes exist.
214
- // This is a caller-level assertion: no addSsaoPasses call = no ssao-* passes.
215
-
216
- // Build graph WITHOUT calling addSsaoPasses. Wire a valid pass so the
217
- // graph has something to compile.
218
- graph.addPass('some-other-pass', {
219
- reads: [],
220
- writes: [],
221
- });
222
-
223
- const passes = graph.listPasses();
224
- const ssaoPassNames = passes.map((p) => p.name).filter((n) => n.startsWith('ssao-'));
225
- expect(ssaoPassNames).toHaveLength(0);
226
-
227
- // Verify the graph compiles without errors (no SSAO resources needed).
228
- const compileResult = graph.compile({
229
- backendKind: runtime.device.caps.backendKind,
230
- caps: runtime.device.caps,
231
- });
232
- expect(compileResult.ok).toBe(true);
233
-
234
- // Suppress unused ctx warning
235
- void ctx;
236
- });
237
- });
@@ -1,289 +0,0 @@
1
- // @forgeax/engine-runtime/__tests__/hdrp-ssao-falsification.test.ts
2
- // SSAO falsification check (M5 / w23).
3
- // feat-20260612-hdrp-ssao.
4
- //
5
- // plan-strategy section 5.4: falsification must FAIL AC-10 visual expectation
6
- // when ssao-blur reads a wrong input (e.g. hdrColor) instead of ssaoRaw.
7
- //
8
- // This test constructs an isolated render graph with addSsaoPasses and asserts
9
- // the correct reads/writes topology. It then documents two falsification
10
- // variants that would break the SSAO pipeline:
11
- //
12
- // Variant-1 (blur reads hdrColor instead of ssaoRaw):
13
- // The blur pass would sample the HDR colour output instead of the raw
14
- // occlusion map. Result: no AO darkening at contact edges -- the blur
15
- // pass is a no-op that feeds flat HDR colour into the ambient term.
16
- // This would cause the smoke test (w22) to PASS structurally (passes
17
- // still present) but AC-10 visual inspection would FAIL (no corner
18
- // darkening).
19
- //
20
- // Variant-2 (calc reads hdrColor instead of gbuf0):
21
- // SSAO calculation that samples HDR colour instead of world-space
22
- // normal. The 64-sample hemisphere occlusion test against wrong data
23
- // produces garbage occlusion values. Result: random noise pattern
24
- // rather than contact-edge darkening. AC-10 FAIL.
25
- //
26
- // Both variants are documented here as the falsification proof; the test
27
- // itself asserts the correct topology to provide a machine-readable guard.
28
- //
29
- // Local-only test (not in CI). The smoke discriminability proof is that
30
- // w23 FAILS (this test fails) when reads are mutated.
31
-
32
- import type { RenderPipelineContext, RenderSystemRuntime } from '@forgeax/engine-render/internal';
33
- import { addSsaoPasses } from '@forgeax/engine-render/internal';
34
- import { RenderGraph } from '@forgeax/engine-render-graph';
35
- import type { RhiCaps, RhiDevice } from '@forgeax/engine-rhi';
36
- import { describe, expect, it, vi } from 'vitest';
37
-
38
- function mockRuntime(capsOverride: Partial<RhiCaps> = {}): RenderSystemRuntime {
39
- const errorRegistry = {
40
- fire: vi.fn(),
41
- listeners: new Set(),
42
- addEventListener: vi.fn(),
43
- removeEventListener: vi.fn(),
44
- };
45
-
46
- const device = {
47
- caps: {
48
- backendKind: 'webgpu' as const,
49
- storageBuffer: true,
50
- float32Filterable: true,
51
- maxColorAttachments: 8,
52
- maxStorageBuffersPerShaderStage: 4,
53
- ...capsOverride,
54
- },
55
- createBuffer: vi.fn().mockReturnValue({
56
- ok: true,
57
- value: { label: 'mock-buffer' },
58
- }),
59
- createTexture: vi.fn().mockReturnValue({
60
- ok: true,
61
- value: { label: 'mock-tex' },
62
- }),
63
- createTextureView: vi.fn().mockReturnValue({
64
- ok: true,
65
- value: { label: 'mock-tex-view' },
66
- }),
67
- createSampler: vi.fn().mockReturnValue({
68
- ok: true,
69
- value: { label: 'mock-sampler' },
70
- }),
71
- createBindGroupLayout: vi.fn().mockReturnValue({
72
- ok: true,
73
- value: { label: 'mock-bgl' },
74
- }),
75
- queue: {
76
- writeBuffer: vi.fn().mockReturnValue({ ok: true, value: undefined }),
77
- writeTexture: vi.fn().mockReturnValue({ ok: true, value: undefined }),
78
- },
79
- } as unknown as RhiDevice;
80
-
81
- return {
82
- device,
83
- errorRegistry,
84
- shaderCache: { get: vi.fn() },
85
- } as unknown as RenderSystemRuntime;
86
- }
87
-
88
- function mockCtx(runtime: RenderSystemRuntime): RenderPipelineContext {
89
- return {
90
- runtime,
91
- assets: { get: vi.fn(), register: vi.fn() },
92
- store: { ensureResident: vi.fn(), getTextureView: vi.fn() },
93
- pipelineState: {},
94
- encoder: {},
95
- view: {},
96
- clear: [0, 0, 0, 1],
97
- targetW: 800,
98
- targetH: 600,
99
- currentTexture: {},
100
- camera: {},
101
- validated: [],
102
- validatedOrdered: [],
103
- viewBindGroup: null,
104
- meshBindGroup: null,
105
- frameState: { perFrameGraph: null, isHdrpActive: true },
106
- dispatchCounts: {},
107
- bindGroupCounts: {},
108
- skylight: undefined,
109
- skylightCount: 0,
110
- skybox: undefined,
111
- msaaActive: false,
112
- geometryColorResolveView: null,
113
- ldrSpriteColorView: null,
114
- } as unknown as RenderPipelineContext;
115
- }
116
-
117
- function setupGraph(graph: RenderGraph<RenderPipelineContext>): void {
118
- graph.addColorTarget('gbuf0', {
119
- format: 'rgba16float',
120
- size: 'swapchain',
121
- sample: 1,
122
- });
123
- graph.addColorTarget('hdrDepth', {
124
- format: 'depth24plus-stencil8',
125
- size: 'swapchain',
126
- sample: 1,
127
- });
128
- graph.addColorTarget('hdrColor', {
129
- format: 'rgba16float',
130
- size: 'swapchain',
131
- sample: 1,
132
- });
133
- graph.addColorTarget('ssaoRaw', {
134
- format: 'r8unorm',
135
- size: 'half-swapchain',
136
- sample: 1,
137
- });
138
- graph.addColorTarget('ssaoBlurred', {
139
- format: 'r8unorm',
140
- size: 'half-swapchain',
141
- sample: 1,
142
- });
143
- }
144
-
145
- describe('hdrp-ssao-falsification (M5 / w23)', () => {
146
- it('ssao-calc reads gbuf0 (world-space normal) + hdrDepth — NOT hdrColor', () => {
147
- const runtime = mockRuntime();
148
- const ctx = mockCtx(runtime);
149
- const graph = new RenderGraph<RenderPipelineContext>();
150
- setupGraph(graph);
151
-
152
- addSsaoPasses(graph, {
153
- gbuf0: 'gbuf0',
154
- hdrDepth: 'hdrDepth',
155
- ssaoRaw: 'ssaoRaw',
156
- ssaoBlurred: 'ssaoBlurred',
157
- ctx,
158
- });
159
-
160
- const passes = graph.listPasses();
161
- const calcPass = passes.find((p) => p.name === 'ssao-calc');
162
- expect(calcPass).toBeDefined();
163
- if (!calcPass) return;
164
-
165
- // Calc MUST read gbuf0 (world-space normal for view-space transform).
166
- expect(calcPass.reads).toContain('gbuf0');
167
- // Calc MUST NOT read hdrColor (lighting output -- Variant-2 falsification).
168
- expect(calcPass.reads).not.toContain('hdrColor');
169
- // Calc MUST read hdrDepth (depth for view-space position reconstruction).
170
- expect(calcPass.reads).toContain('hdrDepth');
171
- });
172
-
173
- it('ssao-blur reads ssaoRaw — NOT hdrColor (Variant-1 falsification guard)', () => {
174
- const runtime = mockRuntime();
175
- const ctx = mockCtx(runtime);
176
- const graph = new RenderGraph<RenderPipelineContext>();
177
- setupGraph(graph);
178
-
179
- addSsaoPasses(graph, {
180
- gbuf0: 'gbuf0',
181
- hdrDepth: 'hdrDepth',
182
- ssaoRaw: 'ssaoRaw',
183
- ssaoBlurred: 'ssaoBlurred',
184
- ctx,
185
- });
186
-
187
- const passes = graph.listPasses();
188
- const blurPass = passes.find((p) => p.name === 'ssao-blur');
189
- expect(blurPass).toBeDefined();
190
- if (!blurPass) return;
191
-
192
- // Blur MUST read ssaoRaw (the raw occlusion R8 map from calc pass).
193
- expect(blurPass.reads).toContain('ssaoRaw');
194
- // Blur MUST NOT read hdrColor (Variant-1 falsification:
195
- // reading HDR colour would produce no AO darkening — AC-10 FAIL).
196
- expect(blurPass.reads).not.toContain('hdrColor');
197
- // M8 / w38: blur reads also include gbuf0 + hdrDepth as graph deps so
198
- // the shared 9-entry SSAO BGL has valid resources at every slot. The
199
- // shader does not statically reference them, but the BindGroup must
200
- // bind them or WebGPU rejects the draw — Variant-1's "no AO darkening"
201
- // failure mode is still preserved: if the blur sampled hdrColor instead
202
- // of ssaoRaw, AO would still wash out, and the read declaration above
203
- // continues to enforce the correct input.
204
- expect(blurPass.reads).toHaveLength(3);
205
- });
206
-
207
- it('Variant-1 proof: if blur read hdrColor, AO would not darken contact edges', () => {
208
- // This structural test documents the falsification contract.
209
- // When ssao-blur reads are changed from ['ssaoRaw'] to ['hdrColor']:
210
- //
211
- // graph.addPass('ssao-blur', {
212
- // reads: ['hdrColor'], // <-- falsified: wrong input
213
- // writes: ['ssaoBlurred'],
214
- // ...
215
- // });
216
- //
217
- // The blur pass would sample HDR lighting output instead of the raw
218
- // occlusion map. The fs_ssao_blur shader applies a 4x4 box blur which
219
- // averages HDR colour values to produce a uniform per-pixel value.
220
- // When fed into the deferred lighting ambient term:
221
- //
222
- // ambient *= mix(1.0, ssaoFactor * bakedAO, intensity)
223
- //
224
- // ... ssaoFactor comes from the blurred-HDR-colour texture, not the
225
- // occlusion texture. Result: uniform ambient modulation (all pixels
226
- // get similar ssaoFactor), no AO darkening at contact edges.
227
- //
228
- // The w22 smoke test would PASS (perFramePassNames still includes
229
- // ssao-calc + ssao-blur), but AC-10 visual inspection would FAIL --
230
- // the demo image would show no corner/contact darkening.
231
- //
232
- // This is the discriminability contract: the smoke is structural,
233
- // the visual gate is the falsification check.
234
- expect(true).toBe(true);
235
- });
236
-
237
- it('Variant-2 proof: if calc read hdrColor instead of gbuf0, occlusion is garbage', () => {
238
- // When ssao-calc reads are changed from ['gbuf0', 'hdrDepth'] to
239
- // ['hdrColor', 'hdrDepth']:
240
- //
241
- // graph.addPass('ssao-calc', {
242
- // reads: ['hdrColor', 'hdrDepth'], // <-- falsified
243
- // writes: ['ssaoRaw'],
244
- // ...
245
- // });
246
- //
247
- // The fs_ssao_calc shader unpacks the gbuf0 read as world-space
248
- // normal (*2-1), transforms to view-space, and builds a TBN matrix
249
- // for hemisphere sampling. If gbuf0 carries HDR colour values [0..1]
250
- // instead of packed normal components:
251
- //
252
- // - viewNormal = (hdrColor * 2.0 - 1.0) is incorrect
253
- // - TBN Gram-Schmidt produces a nonsensical tangent frame
254
- // - 64-sample hemisphere occlusion against wrong normal direction
255
- // produces random per-pixel occlusion values
256
- //
257
- // Result: random noise pattern in the AO buffer, not contact-edge
258
- // darkening. AC-10 visual inspection would FAIL (noise instead of
259
- // expected corner shadows).
260
- expect(true).toBe(true);
261
- });
262
-
263
- it('compile succeeds with correct reads topology', () => {
264
- const runtime = mockRuntime();
265
- const ctx = mockCtx(runtime);
266
- const graph = new RenderGraph<RenderPipelineContext>();
267
- setupGraph(graph);
268
-
269
- graph.addPass('g-buffer', {
270
- reads: [],
271
- writes: ['gbuf0', 'hdrDepth'],
272
- });
273
-
274
- addSsaoPasses(graph, {
275
- gbuf0: 'gbuf0',
276
- hdrDepth: 'hdrDepth',
277
- ssaoRaw: 'ssaoRaw',
278
- ssaoBlurred: 'ssaoBlurred',
279
- ctx,
280
- });
281
-
282
- const compileResult = graph.compile({
283
- backendKind: runtime.device.caps.backendKind,
284
- caps: runtime.device.caps,
285
- device: runtime.device,
286
- });
287
- expect(compileResult.ok).toBe(true);
288
- });
289
- });
@@ -1,91 +0,0 @@
1
- import type {
2
- Component,
3
- ComponentData,
4
- ComponentSchema,
5
- EcsError,
6
- EntityHandle,
7
- InputShapeOf,
8
- World,
9
- } from '@forgeax/engine-ecs';
10
- import { createPrimitiveMesh, type PrimitiveMeshKind } from '@forgeax/engine-geometry';
11
- import { type Handle, type Result, toShared } from '@forgeax/engine-types';
12
-
13
- export const TEST_CUBE_HANDLE: Handle<'MeshAsset', 'shared'> = toShared(1);
14
- export const TEST_TRIANGLE_HANDLE: Handle<'MeshAsset', 'shared'> = toShared(2);
15
-
16
- const primitiveHandles = new WeakMap<
17
- object,
18
- Map<PrimitiveMeshKind, Handle<'MeshAsset', 'shared'>>
19
- >();
20
- const legacyPrimitiveHandles = new WeakMap<
21
- object,
22
- ReadonlyMap<number, Handle<'MeshAsset', 'shared'>>
23
- >();
24
-
25
- export function internPrimitiveMesh(
26
- world: World,
27
- kind: PrimitiveMeshKind,
28
- ): Handle<'MeshAsset', 'shared'> {
29
- let handles = primitiveHandles.get(world);
30
- if (handles === undefined) {
31
- handles = new Map();
32
- primitiveHandles.set(world, handles);
33
- }
34
- const existing = handles.get(kind);
35
- if (existing !== undefined) return existing;
36
- const handle = world.internSharedRef('MeshAsset', createPrimitiveMesh(kind).unwrap());
37
- handles.set(kind, handle);
38
- return handle;
39
- }
40
-
41
- // biome-ignore lint/suspicious/noExplicitAny: TypeScript mixin constructors require any[] rest parameters.
42
- export function withPrimitiveMeshes<T extends new (...args: any[]) => World>(BaseWorld: T): T {
43
- return class PrimitiveWorld extends BaseWorld {
44
- // biome-ignore lint/suspicious/noExplicitAny: TypeScript mixin constructors require any[] rest parameters.
45
- constructor(...args: any[]) {
46
- super(...args);
47
- const cube = this.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
48
- const triangle = this.internSharedRef('MeshAsset', createPrimitiveMesh('triangle').unwrap());
49
- legacyPrimitiveHandles.set(
50
- this,
51
- new Map([
52
- [Number(TEST_CUBE_HANDLE), cube],
53
- [Number(TEST_TRIANGLE_HANDLE), triangle],
54
- ]),
55
- );
56
- }
57
-
58
- override spawn<const SArr extends readonly ComponentSchema[]>(
59
- ...componentDatas: {
60
- [K in keyof SArr]: {
61
- component: Component<string, SArr[K]>;
62
- data: Partial<InputShapeOf<SArr[K]>>;
63
- };
64
- }
65
- ): Result<EntityHandle, EcsError>;
66
- override spawn(...componentDatas: ComponentData[]): Result<EntityHandle, EcsError> {
67
- const handles = legacyPrimitiveHandles.get(this);
68
- if (handles === undefined) return super.spawn(...componentDatas);
69
-
70
- const rewritten = componentDatas.map((entry) => {
71
- const data = entry.data as Record<string, unknown>;
72
- const direction =
73
- entry.component.name === 'DirectionalLight' && data.direction === undefined
74
- ? [0, -1, 0]
75
- : undefined;
76
- const rawHandle = data.assetHandle;
77
- const replacement = typeof rawHandle === 'number' ? handles.get(rawHandle) : undefined;
78
- if (direction === undefined && replacement === undefined) return entry;
79
- return {
80
- ...entry,
81
- data: {
82
- ...data,
83
- ...(direction === undefined ? {} : { direction }),
84
- ...(replacement === undefined ? {} : { assetHandle: replacement }),
85
- },
86
- } as ComponentData;
87
- });
88
- return super.spawn(...rewritten);
89
- }
90
- } as T;
91
- }
@@ -1,65 +0,0 @@
1
- import type { RenderAssetPort } from '@forgeax/engine-render/internal';
2
- import type { Asset } from '@forgeax/engine-types';
3
- import { makeMockShaderRegistry } from './mock-shader-registry';
4
-
5
- export interface TestRenderAssetResolver {
6
- readonly epoch: number;
7
- lookup<T extends Asset>(guid: string): T | undefined;
8
- guidOf(asset: Asset): string | undefined;
9
- publish(guid: string, asset: Asset): void;
10
- }
11
-
12
- export interface TestRenderAssetStore {
13
- readonly port: RenderAssetPort;
14
- readonly resolver: TestRenderAssetResolver;
15
- }
16
-
17
- export function createTestRenderAssetOwner(
18
- shaderRegistry = makeMockShaderRegistry(),
19
- ): RenderAssetPort {
20
- return createTestRenderAssetStore(shaderRegistry).port;
21
- }
22
-
23
- export function createTestRenderAssetStore(
24
- shaderRegistry = makeMockShaderRegistry(),
25
- ): TestRenderAssetStore {
26
- const payloads = new Map<string, Asset>();
27
- let epoch = 0;
28
- const normalizeGuid = (guid: string): string => guid.toLowerCase().replaceAll('-', '');
29
- const resolver: TestRenderAssetResolver = {
30
- get epoch() {
31
- return epoch;
32
- },
33
- lookup<T extends Asset>(guid: string): T | undefined {
34
- return payloads.get(normalizeGuid(guid)) as T | undefined;
35
- },
36
- guidOf(asset: Asset): string | undefined {
37
- for (const [guid, payload] of payloads) {
38
- if (payload === asset) return guid;
39
- }
40
- return undefined;
41
- },
42
- publish(guid: string, asset: Asset): void {
43
- const key = normalizeGuid(guid);
44
- if (payloads.get(key) === asset) return;
45
- payloads.set(key, asset);
46
- epoch += 1;
47
- },
48
- };
49
- const port: RenderAssetPort = {
50
- get epoch() {
51
- return resolver.epoch;
52
- },
53
- shaderRegistry,
54
- lookup: resolver.lookup,
55
- guidOf: resolver.guidOf,
56
- materialShaderTextureFieldNames(shaderId: string): readonly string[] {
57
- const artifact = shaderRegistry.findMaterialArtifact(shaderId);
58
- if (!artifact.ok) return [];
59
- return artifact.value.paramSchema
60
- .filter((parameter) => parameter.type === 'texture2d')
61
- .map((parameter) => parameter.name);
62
- },
63
- };
64
- return { port, resolver };
65
- }