@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,272 +0,0 @@
1
- import type { ParticleEffectAsset } from '@forgeax/engine-types';
2
-
3
- // Browser evidence consumes this build-time cooked program; Node Dawn recooks
4
- // the same source in the real fixture so compiler drift remains observable.
5
- export const FOG_VFX_EFFECT: ParticleEffectAsset = {
6
- kind: 'particle-effect',
7
- schemaVersion: 2,
8
- programFingerprint: 'sha256:7aea3041966717f0072228d496da3a198af473f65e21096b084dad9c170a358d',
9
- emitters: [
10
- {
11
- id: 'fog-producer',
12
- capacity: 4,
13
- },
14
- ],
15
- program: {
16
- format: 'forgeax-vfx-program-2',
17
- fingerprint: 'sha256:7aea3041966717f0072228d496da3a198af473f65e21096b084dad9c170a358d',
18
- emitters: [
19
- {
20
- id: 'fog-producer',
21
- module: 'fog-producer.vfx.wgsl',
22
- capacity: 4,
23
- backend: {
24
- required: 'gpu',
25
- },
26
- space: 'local',
27
- schedule: {
28
- rate: 0,
29
- bursts: [
30
- {
31
- time: 0,
32
- count: 4,
33
- },
34
- ],
35
- },
36
- bounds: {
37
- kind: 'sphere',
38
- center: [0, 0, 0],
39
- radius: 2,
40
- },
41
- renderers: [
42
- {
43
- kind: 'billboard',
44
- material: '00000000-0000-7000-8000-00000000f001',
45
- capacity: 4,
46
- blend: 'alpha',
47
- },
48
- {
49
- kind: 'mesh',
50
- material: '00000000-0000-7000-8000-00000000f001',
51
- mesh: '00000000-0000-7000-8000-00000000f002',
52
- },
53
- {
54
- kind: 'ribbon',
55
- material: '00000000-0000-7000-8000-00000000f001',
56
- capacity: 4,
57
- stripKey: 'alive-index',
58
- },
59
- {
60
- kind: 'trail',
61
- material: '00000000-0000-7000-8000-00000000f001',
62
- capacity: 4,
63
- historyLength: 4,
64
- },
65
- {
66
- kind: 'beam',
67
- material: '00000000-0000-7000-8000-00000000f001',
68
- capacity: 4,
69
- endpointField: 'velocity',
70
- },
71
- ],
72
- channels: [],
73
- events: [],
74
- simulationWhenCulled: 'continue',
75
- wgsl: 'struct VfxParticleX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX {\n position: vec4<f32>,\n velocity: vec4<f32>,\n color: vec4<f32>,\n size_rotation: vec4<f32>,\n age: f32,\n lifetime: f32,\n alive: u32,\n id: u32,\n}\n\nstruct VfxSpawnContextX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX {\n delta: f32,\n tick: u32,\n seed: u32,\n playCycle: u32,\n particleId: u32,\n}\n\nstruct VfxUpdateContextX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX {\n delta: f32,\n tick: u32,\n seed: u32,\n playCycle: u32,\n particleId: u32,\n}\n\nstruct ForgeaxVfxRuntime {\n delta: f32,\n tick: u32,\n seed: u32,\n playCycle: u32,\n capacity: u32,\n spawnCount: u32,\n firstParticleId: u32,\n rendererCount: u32,\n viewProjection: mat4x4<f32>,\n cameraRight: vec4<f32>,\n cameraUp: vec4<f32>,\n baseColor: vec4<f32>,\n emissiveIntensity: vec4<f32>,\n surface: vec4<f32>,\n localToWorld: mat4x4<f32>,\n topology: vec4<u32>,\n billboard: vec4<f32>,\n textureSheet: vec4<f32>,\n}\n\nstruct ForgeaxVfxCounters {\n aliveCount: atomic<u32>,\n droppedCount: atomic<u32>,\n eventProduced: atomic<u32>,\n eventConsumed: atomic<u32>,\n eventDropped: atomic<u32>,\n eventOverflow: atomic<u32>,\n}\n\nstruct ForgeaxVfxIndirect {\n vertexOrIndexCount: u32,\n instanceCount: u32,\n firstVertexOrIndex: u32,\n baseVertex: i32,\n firstInstance: u32,\n}\n\nstruct ForgeaxVfxChannelInput {\n position: vec4<f32>,\n strength: f32,\n sequence: u32,\n channel: u32,\n reserved: u32,\n}\n\nstruct ForgeaxVfxEvent {\n position: vec4<f32>,\n strength: f32,\n sequence: u32,\n channel: u32,\n reserved: u32,\n}\n\n@group(0) @binding(0) \nvar<storage, read_write> forgeax_vfx_particles: array<VfxParticleX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX>;\n@group(0) @binding(1) \nvar<uniform> forgeax_vfx_runtime: ForgeaxVfxRuntime;\n@group(0) @binding(2) \nvar<storage, read_write> forgeax_vfx_alive_indices: array<u32>;\n@group(0) @binding(3) \nvar<storage, read_write> forgeax_vfx_counters: ForgeaxVfxCounters;\n@group(0) @binding(4) \nvar<storage, read_write> forgeax_vfx_indirect: array<ForgeaxVfxIndirect>;\n@group(0) @binding(5) \nvar<storage, read_write> forgeax_vfx_scratch: array<u32>;\n@group(0) @binding(6) \nvar<storage, read_write> forgeax_vfx_billboard_instances: array<f32>;\nvar<workgroup> forgeax_vfx_scan_scratch: array<u32, 256>;\n@group(0) @binding(8) \nvar<storage> forgeax_vfx_channel_inputs: array<ForgeaxVfxChannelInput>;\n@group(0) @binding(9) \nvar<storage, read_write> forgeax_vfx_events: array<ForgeaxVfxEvent>;\n\nfn vfx_integrateX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX(ctx: VfxUpdateContextX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX, particle_2: ptr<function, VfxParticleX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX>) {\n let _e3 = (*particle_2).position;\n let _e6 = (*particle_2).velocity;\n let position_2 = (_e3.xyz + (_e6.xyz * ctx.delta));\n let _e14 = (*particle_2).position.w;\n (*particle_2).position = vec4<f32>(position_2, _e14);\n return;\n}\n\nfn vfx_spawn(ctx_1: VfxSpawnContextX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX, particle_3: ptr<function, VfxParticleX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX>) {\n let lane = f32((ctx_1.particleId & 3u));\n (*particle_3).position = vec4<f32>(((lane - 1.5f) * 0.12f), 0f, 0f, 1f);\n (*particle_3).velocity = vec4<f32>(0.8f, 0f, 0f, 0f);\n (*particle_3).color = vec4<f32>(0.2f, 0.6f, 1f, 1f);\n (*particle_3).size_rotation = vec4<f32>(0.22f, 0.22f, 0f, 0f);\n (*particle_3).lifetime = 100f;\n return;\n}\n\nfn vfx_update(ctx_2: VfxUpdateContextX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX, particle_4: ptr<function, VfxParticleX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX>) {\n let _e3 = (*particle_4).velocity;\n (*particle_4).velocity = vec4<f32>(_e3.xyz, 0f);\n vfx_integrateX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX(ctx_2, particle_4);\n (*particle_4).color = vec4<f32>(0.2f, 0.6f, 1f, 1f);\n return;\n}\n\nfn forgeax_vfx_project(position: vec3<f32>) -> vec3<f32> {\n let _e2 = forgeax_vfx_runtime.viewProjection;\n let clip = (_e2 * vec4<f32>(position, 1f));\n let inverseW = select(1f, (1f / clip.w), (abs(clip.w) > 0.000001f));\n return (clip.xyz * inverseW);\n}\n\nfn forgeax_vfx_world_position(position_1: vec3<f32>) -> vec3<f32> {\n let _e2 = forgeax_vfx_runtime.localToWorld;\n return (_e2 * vec4<f32>(position_1, 1f)).xyz;\n}\n\n@compute @workgroup_size(256, 1, 1) \nfn forgeax_vfx_spawn_main(@builtin(global_invocation_id) invocation: vec3<u32>) {\n var particle: VfxParticleX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX;\n\n let index_1 = invocation.x;\n let _e4 = forgeax_vfx_runtime.capacity;\n if (index_1 >= _e4) {\n return;\n }\n let _e8 = forgeax_vfx_scratch[index_1];\n if (_e8 == 0u) {\n let _e14 = forgeax_vfx_runtime.capacity;\n let _e17 = forgeax_vfx_scratch[(_e14 + index_1)];\n let deadRank = (index_1 - _e17);\n let _e21 = forgeax_vfx_runtime.spawnCount;\n if (deadRank < _e21) {\n let _e39 = forgeax_vfx_runtime.firstParticleId;\n particle = VfxParticleX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX(vec4<f32>(0f, 0f, 0f, 1f), vec4(0f), vec4(1f), vec4<f32>(1f, 1f, 0f, 0f), 0f, 1f, 1u, (_e39 + deadRank));\n let _e48 = forgeax_vfx_runtime.delta;\n let _e51 = forgeax_vfx_runtime.tick;\n let _e54 = forgeax_vfx_runtime.seed;\n let _e57 = forgeax_vfx_runtime.playCycle;\n let _e59 = particle.id;\n let ctx_3 = VfxSpawnContextX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX(_e48, _e51, _e54, _e57, _e59);\n vfx_spawn(ctx_3, (&particle));\n let _e63 = particle;\n forgeax_vfx_particles[index_1] = _e63;\n forgeax_vfx_scratch[index_1] = 1u;\n }\n }\n if (index_1 == 0u) {\n let _e71 = forgeax_vfx_runtime.capacity;\n let _e74 = atomicLoad((&forgeax_vfx_counters.aliveCount));\n let freeCount = (_e71 - _e74);\n let _e80 = forgeax_vfx_runtime.spawnCount;\n let _e83 = forgeax_vfx_runtime.spawnCount;\n let _e86 = atomicAdd((&forgeax_vfx_counters.droppedCount), (_e80 - min(_e83, freeCount)));\n return;\n } else {\n return;\n }\n}\n\n@compute @workgroup_size(256, 1, 1) \nfn forgeax_vfx_update_main(@builtin(global_invocation_id) invocation_1: vec3<u32>) {\n var particle_1: VfxParticleX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX;\n\n let index_2 = invocation_1.x;\n let _e4 = forgeax_vfx_runtime.capacity;\n if (index_2 >= _e4) {\n return;\n }\n let _e8 = forgeax_vfx_particles[index_2];\n particle_1 = _e8;\n let _e12 = forgeax_vfx_scratch[index_2];\n if (_e12 == 0u) {\n return;\n }\n let _e17 = forgeax_vfx_runtime.delta;\n let _e20 = forgeax_vfx_runtime.tick;\n let _e23 = forgeax_vfx_runtime.seed;\n let _e26 = forgeax_vfx_runtime.playCycle;\n let _e28 = particle_1.id;\n let ctx_4 = VfxUpdateContextX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX(_e17, _e20, _e23, _e26, _e28);\n vfx_update(ctx_4, (&particle_1));\n let _e31 = particle_1.age;\n let _e34 = forgeax_vfx_runtime.delta;\n particle_1.age = (_e31 + _e34);\n let _e37 = particle_1.age;\n let _e39 = particle_1.lifetime;\n if (_e37 >= _e39) {\n particle_1.alive = 0u;\n }\n let _e46 = particle_1.alive;\n forgeax_vfx_scratch[index_2] = select(0u, 1u, (_e46 != 0u));\n let _e54 = particle_1;\n forgeax_vfx_particles[index_2] = _e54;\n return;\n}\n\n@compute @workgroup_size(256, 1, 1) \nfn forgeax_vfx_scan_blocks_main(@builtin(global_invocation_id) invocation_2: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>, @builtin(workgroup_id) group: vec3<u32>) {\n var flag: u32 = 0u;\n var offset: u32 = 1u;\n var addend: u32;\n\n let index_3 = invocation_2.x;\n let lane_1 = local.x;\n let _e8 = forgeax_vfx_runtime.capacity;\n if (index_3 < _e8) {\n let _e12 = forgeax_vfx_scratch[index_3];\n flag = _e12;\n }\n let _e16 = flag;\n forgeax_vfx_scan_scratch[lane_1] = _e16;\n workgroupBarrier();\n loop {\n let _e18 = offset;\n if (_e18 >= 256u) {\n break;\n }\n addend = 0u;\n let _e23 = offset;\n if (lane_1 >= _e23) {\n let _e26 = offset;\n let _e29 = forgeax_vfx_scan_scratch[(lane_1 - _e26)];\n addend = _e29;\n }\n workgroupBarrier();\n let _e32 = forgeax_vfx_scan_scratch[lane_1];\n let _e33 = addend;\n forgeax_vfx_scan_scratch[lane_1] = (_e32 + _e33);\n workgroupBarrier();\n let _e35 = offset;\n offset = (_e35 * 2u);\n }\n let _e40 = forgeax_vfx_runtime.capacity;\n if (index_3 < _e40) {\n let _e45 = forgeax_vfx_runtime.capacity;\n let _e50 = forgeax_vfx_scan_scratch[lane_1];\n let _e51 = flag;\n forgeax_vfx_scratch[(_e45 + index_3)] = (_e50 - _e51);\n }\n if (lane_1 == 255u) {\n let _e57 = forgeax_vfx_runtime.capacity;\n let _e67 = forgeax_vfx_scan_scratch[lane_1];\n forgeax_vfx_scratch[((_e57 * 2u) + group.x)] = _e67;\n return;\n } else {\n return;\n }\n}\n\n@compute @workgroup_size(1, 1, 1) \nfn forgeax_vfx_scan_block_offsets_main() {\n var sum: u32 = 0u;\n var block: u32 = 0u;\n\n let _e3 = forgeax_vfx_runtime.capacity;\n let blockCount = ((_e3 + 255u) / 256u);\n loop {\n let _e9 = block;\n if (_e9 >= blockCount) {\n break;\n }\n let _e13 = forgeax_vfx_runtime.capacity;\n let _e16 = block;\n let scratchIndex = ((_e13 * 2u) + _e16);\n let blockSum = forgeax_vfx_scratch[scratchIndex];\n let _e24 = sum;\n forgeax_vfx_scratch[scratchIndex] = _e24;\n let _e25 = sum;\n sum = (_e25 + blockSum);\n let _e27 = block;\n block = (_e27 + 1u);\n }\n return;\n}\n\n@compute @workgroup_size(256, 1, 1) \nfn forgeax_vfx_add_offsets_main(@builtin(global_invocation_id) invocation_3: vec3<u32>, @builtin(workgroup_id) group_1: vec3<u32>) {\n let _e4 = forgeax_vfx_runtime.capacity;\n if (invocation_3.x >= _e4) {\n return;\n }\n let _e9 = forgeax_vfx_runtime.capacity;\n let _e13 = forgeax_vfx_scratch[(_e9 + invocation_3.x)];\n let _e16 = forgeax_vfx_runtime.capacity;\n let _e24 = forgeax_vfx_scratch[((_e16 * 2u) + group_1.x)];\n forgeax_vfx_scratch[(_e9 + invocation_3.x)] = (_e13 + _e24);\n return;\n}\n\n@compute @workgroup_size(256, 1, 1) \nfn forgeax_vfx_compact_main(@builtin(global_invocation_id) invocation_4: vec3<u32>) {\n var local_1: bool;\n var renderer: u32 = 0u;\n\n let index_4 = invocation_4.x;\n let _e5 = forgeax_vfx_runtime.capacity;\n if (index_4 < _e5) {\n let _e9 = forgeax_vfx_scratch[index_4];\n local_1 = (_e9 != 0u);\n } else {\n local_1 = false;\n }\n let _e15 = local_1;\n if _e15 {\n let _e20 = forgeax_vfx_runtime.capacity;\n let _e23 = forgeax_vfx_scratch[(_e20 + index_4)];\n forgeax_vfx_alive_indices[_e23] = index_4;\n }\n if (index_4 == 0u) {\n let _e29 = forgeax_vfx_runtime.capacity;\n let last = (_e29 - 1u);\n let _e35 = forgeax_vfx_runtime.capacity;\n let _e38 = forgeax_vfx_scratch[(_e35 + last)];\n let _e41 = forgeax_vfx_scratch[last];\n let count = (_e38 + _e41);\n atomicStore((&forgeax_vfx_counters.aliveCount), count);\n loop {\n let _e46 = renderer;\n let _e49 = forgeax_vfx_runtime.rendererCount;\n if (_e46 >= _e49) {\n break;\n }\n let _e52 = renderer;\n forgeax_vfx_indirect[_e52].instanceCount = count;\n let _e55 = renderer;\n renderer = (_e55 + 1u);\n }\n return;\n } else {\n return;\n }\n}\n\n@compute @workgroup_size(1, 1, 1) \nfn forgeax_vfx_sort_main() {\n var index: u32 = 1u;\n var cursor: u32;\n\n let _e4 = forgeax_vfx_runtime.topology.w;\n if (_e4 != 2u) {\n return;\n }\n let aliveCount = atomicLoad((&forgeax_vfx_counters.aliveCount));\n loop {\n let _e11 = index;\n if (_e11 >= aliveCount) {\n break;\n }\n let _e14 = index;\n let candidate = forgeax_vfx_alive_indices[_e14];\n let _e20 = forgeax_vfx_particles[candidate].position;\n let _e22 = forgeax_vfx_world_position(_e20.xyz);\n let _e23 = forgeax_vfx_project(_e22);\n let candidateDepth = _e23.z;\n let _e25 = index;\n cursor = _e25;\n loop {\n let _e27 = cursor;\n if (_e27 == 0u) {\n break;\n }\n let _e30 = cursor;\n let previous = forgeax_vfx_alive_indices[(_e30 - 1u)];\n let _e39 = forgeax_vfx_particles[previous].position;\n let _e41 = forgeax_vfx_world_position(_e39.xyz);\n let _e42 = forgeax_vfx_project(_e41);\n let previousDepth = _e42.z;\n if (previousDepth >= candidateDepth) {\n break;\n }\n let _e46 = cursor;\n forgeax_vfx_alive_indices[_e46] = previous;\n let _e48 = cursor;\n cursor = (_e48 - 1u);\n }\n let _e52 = cursor;\n forgeax_vfx_alive_indices[_e52] = candidate;\n let _e54 = index;\n index = (_e54 + 1u);\n }\n return;\n}\n\n@compute @workgroup_size(256, 1, 1) \nfn forgeax_vfx_billboard_main(@builtin(global_invocation_id) invocation_5: vec3<u32>) {\n let rank = invocation_5.x;\n let aliveCount_1 = atomicLoad((&forgeax_vfx_counters.aliveCount));\n if (rank >= aliveCount_1) {\n return;\n }\n let _e9 = forgeax_vfx_alive_indices[rank];\n let particle_5 = forgeax_vfx_particles[_e9];\n let _e14 = forgeax_vfx_world_position(particle_5.position.xyz);\n let _e15 = forgeax_vfx_project(_e14);\n let cosine = cos(particle_5.size_rotation.z);\n let sine = sin(particle_5.size_rotation.z);\n let _e24 = forgeax_vfx_runtime.cameraRight;\n let _e29 = forgeax_vfx_runtime.cameraUp;\n let rightAxis = ((_e24.xyz * cosine) + (_e29.xyz * sine));\n let _e35 = forgeax_vfx_runtime.cameraUp;\n let _e40 = forgeax_vfx_runtime.cameraRight;\n let upAxis = ((_e35.xyz * cosine) - (_e40.xyz * sine));\n let _e48 = forgeax_vfx_project((_e14 + (rightAxis * particle_5.size_rotation.x)));\n let right = (_e48 - _e15);\n let _e54 = forgeax_vfx_project((_e14 + (upAxis * particle_5.size_rotation.y)));\n let up = (_e54 - _e15);\n let base = (rank * 31u);\n forgeax_vfx_billboard_instances[base] = _e15.x;\n forgeax_vfx_billboard_instances[(base + 1u)] = _e15.y;\n forgeax_vfx_billboard_instances[(base + 2u)] = _e15.z;\n forgeax_vfx_billboard_instances[(base + 3u)] = right.x;\n forgeax_vfx_billboard_instances[(base + 4u)] = right.y;\n forgeax_vfx_billboard_instances[(base + 5u)] = up.x;\n forgeax_vfx_billboard_instances[(base + 6u)] = up.y;\n forgeax_vfx_billboard_instances[(base + 7u)] = particle_5.color.x;\n forgeax_vfx_billboard_instances[(base + 8u)] = particle_5.color.y;\n forgeax_vfx_billboard_instances[(base + 9u)] = particle_5.color.z;\n forgeax_vfx_billboard_instances[(base + 10u)] = particle_5.color.w;\n let _e122 = forgeax_vfx_runtime.baseColor.x;\n forgeax_vfx_billboard_instances[(base + 11u)] = _e122;\n let _e130 = forgeax_vfx_runtime.baseColor.y;\n forgeax_vfx_billboard_instances[(base + 12u)] = _e130;\n let _e138 = forgeax_vfx_runtime.baseColor.z;\n forgeax_vfx_billboard_instances[(base + 13u)] = _e138;\n let _e146 = forgeax_vfx_runtime.baseColor.w;\n forgeax_vfx_billboard_instances[(base + 14u)] = _e146;\n let _e154 = forgeax_vfx_runtime.emissiveIntensity.x;\n forgeax_vfx_billboard_instances[(base + 15u)] = _e154;\n let _e162 = forgeax_vfx_runtime.emissiveIntensity.y;\n forgeax_vfx_billboard_instances[(base + 16u)] = _e162;\n let _e170 = forgeax_vfx_runtime.emissiveIntensity.z;\n forgeax_vfx_billboard_instances[(base + 17u)] = _e170;\n let _e178 = forgeax_vfx_runtime.emissiveIntensity.w;\n forgeax_vfx_billboard_instances[(base + 18u)] = _e178;\n let _e186 = forgeax_vfx_runtime.surface.x;\n forgeax_vfx_billboard_instances[(base + 19u)] = _e186;\n let _e194 = forgeax_vfx_runtime.surface.y;\n forgeax_vfx_billboard_instances[(base + 20u)] = _e194;\n let _e202 = forgeax_vfx_runtime.surface.z;\n forgeax_vfx_billboard_instances[(base + 21u)] = _e202;\n let _e210 = forgeax_vfx_runtime.surface.w;\n forgeax_vfx_billboard_instances[(base + 22u)] = _e210;\n let _e214 = forgeax_vfx_runtime.textureSheet.w;\n let frameCount = max(1f, _e214);\n let _e225 = forgeax_vfx_runtime.textureSheet.z;\n let frame = min((frameCount - 1f), floor((max(0f, particle_5.age) * _e225)));\n let _e236 = forgeax_vfx_runtime.billboard.x;\n forgeax_vfx_billboard_instances[(base + 23u)] = _e236;\n let _e244 = forgeax_vfx_runtime.billboard.y;\n forgeax_vfx_billboard_instances[(base + 24u)] = _e244;\n forgeax_vfx_billboard_instances[(base + 25u)] = frame;\n forgeax_vfx_billboard_instances[(base + 26u)] = frameCount;\n let _e260 = forgeax_vfx_runtime.textureSheet.x;\n forgeax_vfx_billboard_instances[(base + 27u)] = _e260;\n let _e268 = forgeax_vfx_runtime.textureSheet.y;\n forgeax_vfx_billboard_instances[(base + 28u)] = _e268;\n let _e276 = forgeax_vfx_runtime.billboard.z;\n forgeax_vfx_billboard_instances[(base + 29u)] = _e276;\n let _e284 = forgeax_vfx_runtime.topology.w;\n forgeax_vfx_billboard_instances[(base + 30u)] = f32(_e284);\n return;\n}\n\n@compute @workgroup_size(256, 1, 1) \nfn forgeax_vfx_mesh_main(@builtin(global_invocation_id) invocation_6: vec3<u32>) {\n let rank_1 = invocation_6.x;\n let aliveCount_2 = atomicLoad((&forgeax_vfx_counters.aliveCount));\n if (rank_1 >= aliveCount_2) {\n return;\n }\n let _e9 = forgeax_vfx_alive_indices[rank_1];\n let particle_6 = forgeax_vfx_particles[_e9];\n let _e14 = forgeax_vfx_world_position(particle_6.position.xyz);\n let _e15 = forgeax_vfx_project(_e14);\n let scale = particle_6.size_rotation.x;\n let cosine_1 = cos(particle_6.size_rotation.z);\n let sine_1 = sin(particle_6.size_rotation.z);\n let _e31 = forgeax_vfx_world_position((particle_6.position.xyz + vec3<f32>((cosine_1 * scale), (sine_1 * scale), 0f)));\n let _e32 = forgeax_vfx_project(_e31);\n let right_1 = (_e32 - _e15);\n let _e42 = forgeax_vfx_world_position((particle_6.position.xyz + vec3<f32>((-(sine_1) * scale), (cosine_1 * scale), 0f)));\n let _e43 = forgeax_vfx_project(_e42);\n let up_1 = (_e43 - _e15);\n let _e51 = forgeax_vfx_world_position((particle_6.position.xyz + vec3<f32>(0f, 0f, scale)));\n let _e52 = forgeax_vfx_project(_e51);\n let forward = (_e52 - _e15);\n let base_1 = (rank_1 * 28u);\n forgeax_vfx_billboard_instances[base_1] = _e15.x;\n forgeax_vfx_billboard_instances[(base_1 + 1u)] = _e15.y;\n forgeax_vfx_billboard_instances[(base_1 + 2u)] = _e15.z;\n forgeax_vfx_billboard_instances[(base_1 + 3u)] = right_1.x;\n forgeax_vfx_billboard_instances[(base_1 + 4u)] = right_1.y;\n forgeax_vfx_billboard_instances[(base_1 + 5u)] = right_1.z;\n forgeax_vfx_billboard_instances[(base_1 + 6u)] = up_1.x;\n forgeax_vfx_billboard_instances[(base_1 + 7u)] = up_1.y;\n forgeax_vfx_billboard_instances[(base_1 + 8u)] = up_1.z;\n forgeax_vfx_billboard_instances[(base_1 + 9u)] = forward.x;\n forgeax_vfx_billboard_instances[(base_1 + 10u)] = forward.y;\n forgeax_vfx_billboard_instances[(base_1 + 11u)] = forward.z;\n forgeax_vfx_billboard_instances[(base_1 + 12u)] = particle_6.color.x;\n forgeax_vfx_billboard_instances[(base_1 + 13u)] = particle_6.color.y;\n forgeax_vfx_billboard_instances[(base_1 + 14u)] = particle_6.color.z;\n forgeax_vfx_billboard_instances[(base_1 + 15u)] = particle_6.color.w;\n let _e145 = forgeax_vfx_runtime.baseColor.x;\n forgeax_vfx_billboard_instances[(base_1 + 16u)] = _e145;\n let _e153 = forgeax_vfx_runtime.baseColor.y;\n forgeax_vfx_billboard_instances[(base_1 + 17u)] = _e153;\n let _e161 = forgeax_vfx_runtime.baseColor.z;\n forgeax_vfx_billboard_instances[(base_1 + 18u)] = _e161;\n let _e169 = forgeax_vfx_runtime.baseColor.w;\n forgeax_vfx_billboard_instances[(base_1 + 19u)] = _e169;\n let _e177 = forgeax_vfx_runtime.emissiveIntensity.x;\n forgeax_vfx_billboard_instances[(base_1 + 20u)] = _e177;\n let _e185 = forgeax_vfx_runtime.emissiveIntensity.y;\n forgeax_vfx_billboard_instances[(base_1 + 21u)] = _e185;\n let _e193 = forgeax_vfx_runtime.emissiveIntensity.z;\n forgeax_vfx_billboard_instances[(base_1 + 22u)] = _e193;\n let _e201 = forgeax_vfx_runtime.emissiveIntensity.w;\n forgeax_vfx_billboard_instances[(base_1 + 23u)] = _e201;\n let _e209 = forgeax_vfx_runtime.surface.x;\n forgeax_vfx_billboard_instances[(base_1 + 24u)] = _e209;\n let _e217 = forgeax_vfx_runtime.surface.y;\n forgeax_vfx_billboard_instances[(base_1 + 25u)] = _e217;\n let _e225 = forgeax_vfx_runtime.surface.z;\n forgeax_vfx_billboard_instances[(base_1 + 26u)] = _e225;\n let _e233 = forgeax_vfx_runtime.surface.w;\n forgeax_vfx_billboard_instances[(base_1 + 27u)] = _e233;\n return;\n}\n\n@compute @workgroup_size(256, 1, 1) \nfn forgeax_vfx_ribbon_main(@builtin(global_invocation_id) invocation_7: vec3<u32>) {\n let rank_2 = invocation_7.x;\n let _e4 = atomicLoad((&forgeax_vfx_counters.aliveCount));\n let _e8 = forgeax_vfx_runtime.topology.z;\n let count_1 = min(_e4, _e8);\n if (rank_2 == 0u) {\n let _e16 = forgeax_vfx_runtime.topology.x;\n forgeax_vfx_indirect[_e16].instanceCount = select(0u, (count_1 - 1u), (count_1 > 1u));\n }\n if ((rank_2 + 1u) >= count_1) {\n return;\n }\n let _e31 = forgeax_vfx_alive_indices[rank_2];\n let particle_7 = forgeax_vfx_particles[_e31];\n let _e39 = forgeax_vfx_alive_indices[(rank_2 + 1u)];\n let next = forgeax_vfx_particles[_e39];\n let _e44 = forgeax_vfx_world_position(particle_7.position.xyz);\n let _e45 = forgeax_vfx_project(_e44);\n let _e48 = forgeax_vfx_world_position(next.position.xyz);\n let _e49 = forgeax_vfx_project(_e48);\n let base_2 = (rank_2 * 12u);\n forgeax_vfx_billboard_instances[base_2] = _e45.x;\n forgeax_vfx_billboard_instances[(base_2 + 1u)] = _e45.y;\n forgeax_vfx_billboard_instances[(base_2 + 2u)] = _e45.z;\n forgeax_vfx_billboard_instances[(base_2 + 3u)] = _e49.x;\n forgeax_vfx_billboard_instances[(base_2 + 4u)] = _e49.y;\n forgeax_vfx_billboard_instances[(base_2 + 5u)] = _e49.z;\n forgeax_vfx_billboard_instances[(base_2 + 6u)] = particle_7.color.x;\n forgeax_vfx_billboard_instances[(base_2 + 7u)] = particle_7.color.y;\n forgeax_vfx_billboard_instances[(base_2 + 8u)] = particle_7.color.z;\n forgeax_vfx_billboard_instances[(base_2 + 9u)] = particle_7.color.w;\n let _e111 = forgeax_vfx_runtime.billboard.x;\n forgeax_vfx_billboard_instances[(base_2 + 10u)] = _e111;\n forgeax_vfx_billboard_instances[(base_2 + 11u)] = 0f;\n return;\n}\n\n@compute @workgroup_size(256, 1, 1) \nfn forgeax_vfx_trail_history_main(@builtin(global_invocation_id) invocation_8: vec3<u32>) {\n let rank_3 = invocation_8.x;\n let _e4 = atomicLoad((&forgeax_vfx_counters.aliveCount));\n let _e8 = forgeax_vfx_runtime.topology.z;\n let count_2 = min(_e4, _e8);\n if (rank_3 >= count_2) {\n return;\n }\n let _e14 = forgeax_vfx_alive_indices[rank_3];\n let particle_8 = forgeax_vfx_particles[_e14];\n let _e21 = forgeax_vfx_runtime.topology.y;\n let historyLength = max(2u, _e21);\n let _e25 = forgeax_vfx_runtime.tick;\n let slot = (_e25 % historyLength);\n let historyTarget = (((rank_3 * historyLength) + slot) * 4u);\n let _e33 = forgeax_vfx_world_position(particle_8.position.xyz);\n forgeax_vfx_scratch[historyTarget] = bitcast<u32>(_e33.x);\n forgeax_vfx_scratch[(historyTarget + 1u)] = bitcast<u32>(_e33.y);\n forgeax_vfx_scratch[(historyTarget + 2u)] = bitcast<u32>(_e33.z);\n forgeax_vfx_scratch[(historyTarget + 3u)] = bitcast<u32>(1f);\n return;\n}\n\n@compute @workgroup_size(256, 1, 1) \nfn forgeax_vfx_trail_main(@builtin(global_invocation_id) invocation_9: vec3<u32>) {\n let _e4 = forgeax_vfx_runtime.topology.y;\n let historyLength_1 = max(2u, _e4);\n let segmentCount = (historyLength_1 - 1u);\n let _e10 = atomicLoad((&forgeax_vfx_counters.aliveCount));\n let _e14 = forgeax_vfx_runtime.topology.z;\n let count_3 = min(_e10, _e14);\n let outputCount = (count_3 * segmentCount);\n let outputRank = invocation_9.x;\n if (outputRank == 0u) {\n let _e25 = forgeax_vfx_runtime.topology.x;\n forgeax_vfx_indirect[_e25].instanceCount = outputCount;\n }\n if (outputRank >= outputCount) {\n return;\n }\n let particleRank = (outputRank / segmentCount);\n let segment = (outputRank % segmentCount);\n let _e33 = forgeax_vfx_runtime.tick;\n let newest = (_e33 % historyLength_1);\n let firstSlot = (((newest + historyLength_1) - segment) % historyLength_1);\n let secondSlot = ((((newest + historyLength_1) - segment) - 1u) % historyLength_1);\n let historyBase = ((particleRank * historyLength_1) * 4u);\n let firstBase = (historyBase + (firstSlot * 4u));\n let secondBase = (historyBase + (secondSlot * 4u));\n let _e54 = forgeax_vfx_scratch[firstBase];\n let _e60 = forgeax_vfx_scratch[(firstBase + 1u)];\n let _e66 = forgeax_vfx_scratch[(firstBase + 2u)];\n let _e72 = forgeax_vfx_scratch[(firstBase + 3u)];\n let first = vec4<f32>(bitcast<f32>(_e54), bitcast<f32>(_e60), bitcast<f32>(_e66), bitcast<f32>(_e72));\n let _e77 = forgeax_vfx_scratch[secondBase];\n let _e83 = forgeax_vfx_scratch[(secondBase + 1u)];\n let _e89 = forgeax_vfx_scratch[(secondBase + 2u)];\n let _e95 = forgeax_vfx_scratch[(secondBase + 3u)];\n let second = vec4<f32>(bitcast<f32>(_e77), bitcast<f32>(_e83), bitcast<f32>(_e89), bitcast<f32>(_e95));\n let _e101 = forgeax_vfx_alive_indices[particleRank];\n let particle_9 = forgeax_vfx_particles[_e101];\n let _e105 = forgeax_vfx_project(first.xyz);\n let _e107 = forgeax_vfx_project(second.xyz);\n let base_3 = (outputRank * 12u);\n forgeax_vfx_billboard_instances[base_3] = _e105.x;\n forgeax_vfx_billboard_instances[(base_3 + 1u)] = _e105.y;\n forgeax_vfx_billboard_instances[(base_3 + 2u)] = _e105.z;\n forgeax_vfx_billboard_instances[(base_3 + 3u)] = _e107.x;\n forgeax_vfx_billboard_instances[(base_3 + 4u)] = _e107.y;\n forgeax_vfx_billboard_instances[(base_3 + 5u)] = _e107.z;\n forgeax_vfx_billboard_instances[(base_3 + 6u)] = particle_9.color.x;\n forgeax_vfx_billboard_instances[(base_3 + 7u)] = particle_9.color.y;\n forgeax_vfx_billboard_instances[(base_3 + 8u)] = particle_9.color.z;\n forgeax_vfx_billboard_instances[(base_3 + 9u)] = particle_9.color.w;\n let _e169 = forgeax_vfx_runtime.billboard.x;\n forgeax_vfx_billboard_instances[(base_3 + 10u)] = _e169;\n forgeax_vfx_billboard_instances[(base_3 + 11u)] = (f32(segment) / f32(segmentCount));\n return;\n}\n\n@compute @workgroup_size(256, 1, 1) \nfn forgeax_vfx_beam_main(@builtin(global_invocation_id) invocation_10: vec3<u32>) {\n let rank_4 = invocation_10.x;\n let _e4 = atomicLoad((&forgeax_vfx_counters.aliveCount));\n let _e8 = forgeax_vfx_runtime.topology.z;\n let count_4 = min(_e4, _e8);\n if (rank_4 == 0u) {\n let _e16 = forgeax_vfx_runtime.topology.x;\n forgeax_vfx_indirect[_e16].instanceCount = count_4;\n }\n if (rank_4 >= count_4) {\n return;\n }\n let _e23 = forgeax_vfx_alive_indices[rank_4];\n let particle_10 = forgeax_vfx_particles[_e23];\n let base_4 = (rank_4 * 12u);\n let _e30 = forgeax_vfx_world_position(particle_10.position.xyz);\n let worldEndpoint = (_e30 + (particle_10.velocity.xyz * particle_10.lifetime));\n let _e36 = forgeax_vfx_project(_e30);\n let _e37 = forgeax_vfx_project(worldEndpoint);\n forgeax_vfx_billboard_instances[base_4] = _e36.x;\n forgeax_vfx_billboard_instances[(base_4 + 1u)] = _e36.y;\n forgeax_vfx_billboard_instances[(base_4 + 2u)] = _e36.z;\n forgeax_vfx_billboard_instances[(base_4 + 3u)] = _e37.x;\n forgeax_vfx_billboard_instances[(base_4 + 4u)] = _e37.y;\n forgeax_vfx_billboard_instances[(base_4 + 5u)] = _e37.z;\n forgeax_vfx_billboard_instances[(base_4 + 6u)] = particle_10.color.x;\n forgeax_vfx_billboard_instances[(base_4 + 7u)] = particle_10.color.y;\n forgeax_vfx_billboard_instances[(base_4 + 8u)] = particle_10.color.z;\n forgeax_vfx_billboard_instances[(base_4 + 9u)] = particle_10.color.w;\n let _e97 = forgeax_vfx_runtime.billboard.x;\n forgeax_vfx_billboard_instances[(base_4 + 10u)] = _e97;\n forgeax_vfx_billboard_instances[(base_4 + 11u)] = 0f;\n return;\n}\n\n@compute @workgroup_size(64, 1, 1) \nfn forgeax_vfx_event_main(@builtin(global_invocation_id) invocation_11: vec3<u32>) {\n var local_2: bool;\n var childIndex: u32 = 0u;\n var renderer_1: u32 = 0u;\n\n let inputIndex = invocation_11.x;\n if (inputIndex >= arrayLength((&forgeax_vfx_channel_inputs))) {\n return;\n }\n let input = forgeax_vfx_channel_inputs[inputIndex];\n if (input.sequence == 4294967295u) {\n return;\n }\n let fanOut = max(input.reserved, 1u);\n let _e17 = atomicAdd((&forgeax_vfx_counters.aliveCount), fanOut);\n let _e20 = atomicAdd((&forgeax_vfx_counters.eventProduced), fanOut);\n let _e24 = forgeax_vfx_runtime.capacity;\n if !(((_e17 + fanOut) > _e24)) {\n local_2 = ((_e20 + fanOut) > arrayLength((&forgeax_vfx_events)));\n } else {\n local_2 = true;\n }\n let _e34 = local_2;\n if _e34 {\n let _e38 = atomicAdd((&forgeax_vfx_counters.eventDropped), 1u);\n let _e42 = atomicAdd((&forgeax_vfx_counters.eventOverflow), 1u);\n return;\n }\n loop {\n let _e44 = childIndex;\n if (_e44 >= fanOut) {\n break;\n }\n let _e46 = childIndex;\n let childParticleIndex = (_e17 + _e46);\n let _e48 = childIndex;\n let childEventIndex = (_e20 + _e48);\n let _e77 = childIndex;\n let child = VfxParticleX_naga_oil_mod_XMZXXEZ3FMF4F65TGPA5DU4DSMVWHKZDFX(input.position, vec4<f32>(0f, (0.35f + input.strength), 0f, 0f), vec4<f32>(1f, 0.45f, 0.1f, 1f), vec4<f32>((0.1f + (input.strength * 0.15f)), (0.1f + (input.strength * 0.15f)), 0f, 0f), 0f, 0.35f, 1u, (input.sequence + _e77));\n forgeax_vfx_particles[childParticleIndex] = child;\n forgeax_vfx_alive_indices[childParticleIndex] = childParticleIndex;\n let _e92 = childIndex;\n forgeax_vfx_events[childEventIndex] = ForgeaxVfxEvent(input.position, input.strength, (input.sequence + _e92), input.channel, 0u);\n let _e97 = childIndex;\n childIndex = (_e97 + 1u);\n }\n let _e102 = atomicAdd((&forgeax_vfx_counters.eventConsumed), fanOut);\n loop {\n let _e104 = renderer_1;\n let _e107 = forgeax_vfx_runtime.rendererCount;\n if (_e104 >= _e107) {\n break;\n }\n let _e110 = renderer_1;\n forgeax_vfx_indirect[_e110].instanceCount = (_e17 + 1u);\n let _e115 = renderer_1;\n renderer_1 = (_e115 + 1u);\n }\n return;\n}\n',
76
- reflection: {
77
- hooks: ['vfx_spawn', 'vfx_update'],
78
- imports: [
79
- 'forgeax_vfx::data::camera',
80
- 'forgeax_vfx::data::channel',
81
- 'forgeax_vfx::data::noise',
82
- 'forgeax_vfx::data::scene_depth',
83
- 'forgeax_vfx::prelude',
84
- ],
85
- resources: [
86
- 'particles',
87
- 'runtime',
88
- 'aliveIndices',
89
- 'counters',
90
- 'indirect',
91
- 'scratch',
92
- 'billboardInstances',
93
- 'channelInputs',
94
- 'events',
95
- 'eventCounters',
96
- ],
97
- entryPoints: [
98
- 'forgeax_vfx_spawn_main',
99
- 'forgeax_vfx_update_main',
100
- 'forgeax_vfx_scan_blocks_main',
101
- 'forgeax_vfx_scan_block_offsets_main',
102
- 'forgeax_vfx_add_offsets_main',
103
- 'forgeax_vfx_compact_main',
104
- 'forgeax_vfx_sort_main',
105
- 'forgeax_vfx_event_main',
106
- 'forgeax_vfx_billboard_main',
107
- 'forgeax_vfx_mesh_main',
108
- 'forgeax_vfx_ribbon_main',
109
- 'forgeax_vfx_trail_history_main',
110
- 'forgeax_vfx_trail_main',
111
- 'forgeax_vfx_beam_main',
112
- ],
113
- bindings: [
114
- {
115
- label: '@group(0)',
116
- entries: [
117
- {
118
- binding: 0,
119
- visibility: 4,
120
- buffer: {
121
- type: 'storage',
122
- hasDynamicOffset: false,
123
- minBindingSize: 0,
124
- },
125
- },
126
- {
127
- binding: 1,
128
- visibility: 4,
129
- buffer: {
130
- type: 'uniform',
131
- hasDynamicOffset: false,
132
- minBindingSize: 0,
133
- },
134
- },
135
- {
136
- binding: 2,
137
- visibility: 4,
138
- buffer: {
139
- type: 'storage',
140
- hasDynamicOffset: false,
141
- minBindingSize: 0,
142
- },
143
- },
144
- {
145
- binding: 3,
146
- visibility: 4,
147
- buffer: {
148
- type: 'storage',
149
- hasDynamicOffset: false,
150
- minBindingSize: 0,
151
- },
152
- },
153
- {
154
- binding: 4,
155
- visibility: 4,
156
- buffer: {
157
- type: 'storage',
158
- hasDynamicOffset: false,
159
- minBindingSize: 0,
160
- },
161
- },
162
- {
163
- binding: 5,
164
- visibility: 4,
165
- buffer: {
166
- type: 'storage',
167
- hasDynamicOffset: false,
168
- minBindingSize: 0,
169
- },
170
- },
171
- {
172
- binding: 6,
173
- visibility: 4,
174
- buffer: {
175
- type: 'storage',
176
- hasDynamicOffset: false,
177
- minBindingSize: 0,
178
- },
179
- },
180
- {
181
- binding: 8,
182
- visibility: 4,
183
- buffer: {
184
- type: 'read-only-storage',
185
- hasDynamicOffset: false,
186
- minBindingSize: 0,
187
- },
188
- },
189
- {
190
- binding: 9,
191
- visibility: 4,
192
- buffer: {
193
- type: 'storage',
194
- hasDynamicOffset: false,
195
- minBindingSize: 0,
196
- },
197
- },
198
- ],
199
- },
200
- ],
201
- layout: {
202
- version: 1,
203
- parameters: {
204
- name: 'VfxParameters',
205
- fields: [],
206
- size: 0,
207
- alignment: 1,
208
- },
209
- custom: {
210
- name: 'VfxCustom',
211
- fields: [],
212
- size: 0,
213
- alignment: 1,
214
- },
215
- dataInterfaces: [],
216
- fingerprint: 'sha256:2b4be36cde7f92062b2637fb080e716f8fb06b3ad9ae93ada8dc0b7a1dac98c8',
217
- },
218
- dataInterfaces: [],
219
- eventChannels: [],
220
- events: [],
221
- eventEntryPoint: 'forgeax_vfx_event_main',
222
- stages: [],
223
- renderers: [
224
- {
225
- topology: 'billboard',
226
- resource: 'vfx-renderer-billboard-0',
227
- capacity: 4,
228
- overflow: 'drop-newest',
229
- enabled: true,
230
- shaderInputs: [],
231
- },
232
- {
233
- topology: 'mesh',
234
- resource: 'vfx-renderer-mesh-1',
235
- capacity: 1,
236
- overflow: 'drop-newest',
237
- enabled: true,
238
- shaderInputs: ['mesh'],
239
- },
240
- {
241
- topology: 'ribbon',
242
- resource: 'vfx-renderer-ribbon-2',
243
- capacity: 4,
244
- overflow: 'drop-newest',
245
- enabled: true,
246
- shaderInputs: ['stripKey'],
247
- stripKey: 'alive-index',
248
- },
249
- {
250
- topology: 'trail',
251
- resource: 'vfx-renderer-trail-3',
252
- capacity: 4,
253
- overflow: 'drop-newest',
254
- enabled: true,
255
- shaderInputs: ['history'],
256
- historyLength: 4,
257
- },
258
- {
259
- topology: 'beam',
260
- resource: 'vfx-renderer-beam-4',
261
- capacity: 4,
262
- overflow: 'drop-newest',
263
- enabled: true,
264
- shaderInputs: ['endpoint'],
265
- endpointField: 'velocity',
266
- },
267
- ],
268
- },
269
- },
270
- ],
271
- },
272
- };
@@ -1,123 +0,0 @@
1
- import { type EntityHandle, World } from '@forgeax/engine-ecs';
2
- import { Fog, SceneInstance } from '@forgeax/engine-render/internal';
3
- import * as SceneOwner from '@forgeax/engine-scene';
4
- import { ChildOf, Children, Transform } from '@forgeax/engine-scene';
5
- import type { SceneAsset } from '@forgeax/engine-types';
6
- import { describe, expect, it } from 'vitest';
7
- import { rootsToSceneAsset, serializeSceneAssetToPack } from '../collect-scene-asset';
8
- import { createSceneAssetPort, type SceneAssetPort } from '../scene-asset-port';
9
-
10
- function makeRegistry(): SceneAssetPort {
11
- return createSceneAssetPort(() => undefined);
12
- }
13
-
14
- function registerSceneComponents(world: World): void {
15
- for (const component of [SceneInstance, ChildOf, Children, Transform, Fog]) {
16
- world.components.register(component).unwrap();
17
- }
18
- }
19
-
20
- function unpackScene(pack: Record<string, unknown>): {
21
- payload: Record<string, unknown>;
22
- refs: string[];
23
- } {
24
- const assets = pack.assets as Array<Record<string, unknown>> | undefined;
25
- const asset = assets?.[0];
26
- if (asset === undefined) throw new Error('serialized pack has no scene asset');
27
- const payload = asset.payload;
28
- if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {
29
- throw new Error('serialized scene payload is not an object');
30
- }
31
- const refs = asset.refs;
32
- return {
33
- payload: payload as Record<string, unknown>,
34
- refs: Array.isArray(refs) ? (refs as string[]) : [],
35
- };
36
- }
37
-
38
- function findFogEntities(world: World, root: EntityHandle): EntityHandle[] {
39
- const entities: EntityHandle[] = [];
40
- for (const entity of world.iterDescendants(root)) {
41
- if (world.get(entity, Fog).ok) entities.push(entity);
42
- }
43
- return entities;
44
- }
45
-
46
- describe('Fog SceneAsset round-trip', () => {
47
- it('collects, serializes, reloads, and instantiates two isolated Fog entities', () => {
48
- const source = new World();
49
- registerSceneComponents(source);
50
- const first = source.spawn({
51
- component: Fog,
52
- data: { color: [0.2, 0.3, 0.4], density: 0.02, heightFalloff: 0.1, maxOpacity: 0.8 },
53
- });
54
- const second = source.spawn({
55
- component: Fog,
56
- data: { color: [1.5, 0.7, 0.2], density: 0.06, heightFalloff: 0.9, maxOpacity: 1 },
57
- });
58
- expect(first.ok).toBe(true);
59
- expect(second.ok).toBe(true);
60
- if (!first.ok || !second.ok) return;
61
-
62
- const registry = makeRegistry();
63
- const collected = rootsToSceneAsset(registry, source, [first.value, second.value]);
64
- expect(collected.ok).toBe(true);
65
- if (!collected.ok) return;
66
- expect(collected.value.entities).toHaveLength(2);
67
- const collectedFog = collected.value.entities.map((entity) => entity.components.Fog);
68
- expect(collectedFog).toHaveLength(2);
69
- expect(collectedFog[0]?.color).toEqual([0.2, 0.3, 0.4].map((value) => expect.closeTo(value)));
70
- expect(collectedFog[0]?.density).toBeCloseTo(0.02);
71
- expect(collectedFog[0]?.heightFalloff).toBeCloseTo(0.1);
72
- expect(collectedFog[0]?.maxOpacity).toBeCloseTo(0.8);
73
- expect(collectedFog[1]?.color).toEqual([1.5, 0.7, 0.2].map((value) => expect.closeTo(value)));
74
- expect(collectedFog[1]?.density).toBeCloseTo(0.06);
75
- expect(collectedFog[1]?.heightFalloff).toBeCloseTo(0.9);
76
- expect(collectedFog[1]?.maxOpacity).toBe(1);
77
-
78
- const serialized = serializeSceneAssetToPack(
79
- collected.value,
80
- new Map([['Fog', Fog]]),
81
- 'aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',
82
- );
83
- expect(serialized.ok).toBe(true);
84
- if (!serialized.ok) return;
85
- const unpacked = unpackScene(serialized.value);
86
-
87
- const loadedSceneAsset: SceneAsset = {
88
- kind: 'scene',
89
- entities: unpacked.payload.entities as SceneAsset['entities'],
90
- ...(unpacked.payload.mounts === undefined
91
- ? {}
92
- : { mounts: unpacked.payload.mounts as NonNullable<SceneAsset['mounts']> }),
93
- };
94
-
95
- const destination = new World();
96
- registerSceneComponents(destination);
97
- const handle = destination.allocSharedRef('SceneAsset', loadedSceneAsset);
98
- const instantiated = SceneOwner.worldInstantiateScene(destination, handle);
99
- expect(instantiated.ok).toBe(true);
100
- if (!instantiated.ok) return;
101
-
102
- const fogEntities = findFogEntities(destination, instantiated.value.root);
103
- expect(fogEntities).toHaveLength(2);
104
- const values = fogEntities.map((entity) => destination.get(entity, Fog));
105
- expect(values.every((result) => result.ok)).toBe(true);
106
- const firstValueResult = values[0];
107
- const secondValueResult = values[1];
108
- if (
109
- firstValueResult === undefined ||
110
- secondValueResult === undefined ||
111
- !firstValueResult.ok ||
112
- !secondValueResult.ok
113
- )
114
- return;
115
- const firstValue = firstValueResult.value;
116
- const secondValue = secondValueResult.value;
117
- expect(firstValue.color).toEqual(new Float32Array([0.2, 0.3, 0.4]));
118
- expect(secondValue.color).toEqual(new Float32Array([1.5, 0.7, 0.2]));
119
- expect(firstValue.color).not.toBe(secondValue.color);
120
- firstValue.color[0] = 8;
121
- expect(secondValue.color[0]).toBeCloseTo(1.5);
122
- });
123
- });
@@ -1,207 +0,0 @@
1
- // feat-20260630-equirect-kind-internalized-ibl-declarative-skyligh M2 / w10 —
2
- // GpuResourceStore cubemap projection status tri-state + no-retry + idempotent
3
- // unit tests (plan-strategy D-3 / D-4 / D-7, research F-2 / R-2 / R-5).
4
- //
5
- // Coverage matrix (plan-strategy §5.3 key test points (2) / (3)):
6
- // (a) CubemapGpuEntry.status tri-state ('pending' | 'ready' | 'failed') is
7
- // written into the store's cubemapGpuHandles map and reads back through
8
- // the private getter surface (status authority SSOT lives in the store,
9
- // D-3; not in the SkylightSnapshot).
10
- // (b) A projection that fails writes status:'failed' EXPLICITLY and a second
11
- // call with the same source handle does NOT re-run the upload (R-2 /
12
- // AC-09: failure must be recorded explicitly, never inferred from a
13
- // missing map key, otherwise the record arm retries every frame).
14
- // (c) The same equirect source handle resolves idempotently to a single
15
- // CubemapGpuEntry: a second _uploadCubemapFromEquirect call returns the
16
- // cached handle without minting a second GPU texture (research F-2).
17
- //
18
- // The store method is package-internal after w11 (`_`-prefixed + @internal,
19
- // F-9: not a user-facing call; the record arm in the same package drives it in
20
- // M3). The test reaches it through an `as any` cast.
21
-
22
- import type { World } from '@forgeax/engine-ecs';
23
- import { GpuResourceStore } from '@forgeax/engine-render/internal';
24
- import type { Result, RhiCaps } from '@forgeax/engine-rhi';
25
- import { ok } from '@forgeax/engine-rhi';
26
- import type { EquirectAsset, Handle } from '@forgeax/engine-types';
27
- import { toShared } from '@forgeax/engine-types';
28
- import { describe, expect, it } from 'vitest';
29
-
30
- // ── Hardware caps probe (rgba16float renderable => HDR cubemap path allowed) ──
31
-
32
- const capsRenderable: RhiCaps = {
33
- timestampQuery: false,
34
- timestampPeriodNanoseconds: null,
35
- indirectFirstInstance: false,
36
- firstInstanceIndirect: false,
37
- storageBuffer: true,
38
- storageTexture: false,
39
- rgba16floatRenderable: true,
40
- rg11b10ufloatRenderable: false,
41
- float32Filterable: false,
42
- maxColorAttachments: 8,
43
- } as unknown as RhiCaps;
44
-
45
- // ── Mock GPU device: createTexture / createTextureView / queue succeed so the
46
- // upload path runs all the way to a 'ready' entry. A counter tracks texture
47
- // creation so the idempotency assertion can prove a second call does not mint
48
- // a second physical texture. ──
49
-
50
- interface DeviceProbe {
51
- textures: number;
52
- views: number;
53
- }
54
-
55
- const okShim = <T>(v: T) => ({ ok: true as const, value: v });
56
-
57
- // biome-ignore lint/suspicious/noExplicitAny: opaque mock GPU device surface
58
- function makeReadyDevice(probe: DeviceProbe): any {
59
- return {
60
- createShaderModule: () => okShim({ __mock: 'shader' }),
61
- createSampler: () => okShim({ __mock: 'sampler' }),
62
- createBindGroupLayout: () => okShim({ __mock: 'bgl' }),
63
- createPipelineLayout: () => okShim({ __mock: 'layout' }),
64
- createRenderPipeline: () => okShim({ __mock: 'pipeline' }),
65
- createBindGroup: () => okShim({ __mock: 'bindGroup' }),
66
- createCommandEncoder: () => okShim({ __mock: 'encoder', beginRenderPass: () => ({}) }),
67
- createBuffer: (desc: { size?: number }) => okShim({ __mock: 'buffer', size: desc.size ?? 0 }),
68
- createTexture: () => {
69
- probe.textures += 1;
70
- return okShim({
71
- __mock: `texture-${probe.textures}`,
72
- createView: () => ({ __mock: 'view' }),
73
- });
74
- },
75
- createTextureView: () => {
76
- probe.views += 1;
77
- return okShim({ __mock: `view-${probe.views}` });
78
- },
79
- queue: {
80
- writeTexture: () => undefined,
81
- writeBuffer: () => undefined,
82
- submit: () => undefined,
83
- },
84
- };
85
- }
86
-
87
- // A device whose createTexture for the cube target returns undefined, forcing
88
- // the upload to fail-fast with a structured error (drives status:'failed').
89
- // biome-ignore lint/suspicious/noExplicitAny: opaque mock GPU device surface
90
- function makeFailingDevice(): any {
91
- return {
92
- createShaderModule: () => okShim({ __mock: 'shader' }),
93
- createTexture: () => ({ ok: false as const, error: undefined }),
94
- createTextureView: () => ({ ok: false as const, error: undefined }),
95
- queue: {
96
- writeTexture: () => undefined,
97
- writeBuffer: () => undefined,
98
- submit: () => undefined,
99
- },
100
- };
101
- }
102
-
103
- // EquirectAsset register relay: mints a fresh shared EquirectAsset handle. The
104
- // store keys cubemapGpuHandles by both the source and the minted handle (M2 w11
105
- // keeps the relay but mints EquirectAsset rather than the retired CubeTexture).
106
- function makeRegisterEquirect(): (
107
- world: World,
108
- pod: EquirectAsset,
109
- ) => Result<Handle<'EquirectAsset', 'shared'>, never> {
110
- let next = 7000;
111
- return () => ok(toShared<'EquirectAsset'>(next++));
112
- }
113
-
114
- // The store is wired WITHOUT an async shader-module factory so the optional IBL
115
- // precompute render-pass block is skipped: this unit test asserts the status /
116
- // idempotency / no-retry bookkeeping (written BEFORE the precompute block); the
117
- // IBL precompute pixel correctness is covered by the dawn readback test.
118
- function configuredStore(device: unknown, caps: RhiCaps = capsRenderable): GpuResourceStore {
119
- const store = new GpuResourceStore();
120
- store.configureGpuDevice(
121
- // biome-ignore lint/suspicious/noExplicitAny: mock device satisfies MipmapBlitDevice structurally
122
- device as any,
123
- undefined,
124
- makeRegisterEquirect() as never,
125
- caps,
126
- );
127
- return store;
128
- }
129
-
130
- function equirectPod(width = 4, height = 2): EquirectAsset {
131
- return {
132
- kind: 'equirect',
133
- width,
134
- height,
135
- format: 'rgba16float',
136
- data: new Uint8Array(width * height * 8),
137
- colorSpace: 'linear',
138
- };
139
- }
140
-
141
- // The world is only consumed by the register relay; a stub satisfies the call.
142
- const stubWorld = {} as unknown as World;
143
-
144
- describe('GpuResourceStore cubemap projection status (M2 / w10)', () => {
145
- it('status:ready — successful projection records a ready CubemapGpuEntry', async () => {
146
- const probe: DeviceProbe = { textures: 0, views: 0 };
147
- const store = configuredStore(makeReadyDevice(probe));
148
- const src = toShared<'EquirectAsset'>(100);
149
-
150
- // biome-ignore lint/suspicious/noExplicitAny: private method + private map access
151
- const s = store as any;
152
- const res = await s._uploadCubemapFromEquirect(stubWorld, src, equirectPod());
153
- expect(res.ok).toBe(true);
154
-
155
- const entry = s.cubemapGpuHandles.get(100);
156
- expect(entry).toBeDefined();
157
- expect(entry.status).toBe('ready');
158
- expect(entry.view).toBeDefined();
159
- expect(entry.faceViews.length).toBe(6);
160
- });
161
-
162
- it('status:failed — a failed projection writes status:failed explicitly and the second call does NOT re-run the upload (R-2 / AC-09)', async () => {
163
- const store = configuredStore(makeFailingDevice());
164
- const src = toShared<'EquirectAsset'>(200);
165
-
166
- // biome-ignore lint/suspicious/noExplicitAny: private method + private map access
167
- const s = store as any;
168
- const first = await s._uploadCubemapFromEquirect(stubWorld, src, equirectPod());
169
- expect(first.ok).toBe(false);
170
-
171
- // Failure must be recorded explicitly so the record arm can branch on it
172
- // (never inferred from a missing map key — that would retry every frame).
173
- const entry = s.cubemapGpuHandles.get(200);
174
- expect(entry).toBeDefined();
175
- expect(entry.status).toBe('failed');
176
-
177
- // Second frame: a re-query must NOT re-launch the projection. Swap the
178
- // device for one that would succeed; if the store retried it would flip to
179
- // ready. The status:failed record must short-circuit before any GPU work.
180
- const probe: DeviceProbe = { textures: 0, views: 0 };
181
- s.gpuDevice = makeReadyDevice(probe);
182
- const second = await s._uploadCubemapFromEquirect(stubWorld, src, equirectPod());
183
- expect(second.ok).toBe(false);
184
- expect(probe.textures).toBe(0);
185
- expect(s.cubemapGpuHandles.get(200).status).toBe('failed');
186
- });
187
-
188
- it('idempotent — same equirect source handle resolves to a single CubemapGpuEntry without minting a second texture (research F-2)', async () => {
189
- const probe: DeviceProbe = { textures: 0, views: 0 };
190
- const store = configuredStore(makeReadyDevice(probe));
191
- const src = toShared<'EquirectAsset'>(300);
192
-
193
- // biome-ignore lint/suspicious/noExplicitAny: private method + private map access
194
- const s = store as any;
195
- const first = await s._uploadCubemapFromEquirect(stubWorld, src, equirectPod());
196
- expect(first.ok).toBe(true);
197
- const texturesAfterFirst = probe.textures;
198
- expect(texturesAfterFirst).toBeGreaterThan(0);
199
-
200
- const second = await s._uploadCubemapFromEquirect(stubWorld, src, equirectPod());
201
- expect(second.ok).toBe(true);
202
- // The cached handle is returned verbatim; no second physical texture.
203
- expect(probe.textures).toBe(texturesAfterFirst);
204
- expect(first.value).toEqual(second.value);
205
- expect(s.cubemapGpuHandles.get(300).status).toBe('ready');
206
- });
207
- });