@thunderclap-engine/engine 0.0.0-stage → 1.1.0

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 (566) hide show
  1. package/CHANGELOG.md +390 -0
  2. package/LICENSE +21 -0
  3. package/README.md +333 -2
  4. package/dist/analytics/analytics.d.ts +80 -0
  5. package/dist/analytics/analytics.js +129 -0
  6. package/dist/analytics/index.d.ts +1 -0
  7. package/dist/analytics/index.js +1 -0
  8. package/dist/anim/aim.d.ts +43 -0
  9. package/dist/anim/aim.js +157 -0
  10. package/dist/anim/clip.d.ts +98 -0
  11. package/dist/anim/clip.js +282 -0
  12. package/dist/anim/compress.d.ts +65 -0
  13. package/dist/anim/compress.js +339 -0
  14. package/dist/anim/foot-ik.d.ts +74 -0
  15. package/dist/anim/foot-ik.js +241 -0
  16. package/dist/anim/graph.d.ts +153 -0
  17. package/dist/anim/graph.js +532 -0
  18. package/dist/anim/ik.d.ts +105 -0
  19. package/dist/anim/ik.js +435 -0
  20. package/dist/anim/index.d.ts +36 -0
  21. package/dist/anim/index.js +21 -0
  22. package/dist/anim/match.d.ts +66 -0
  23. package/dist/anim/match.js +153 -0
  24. package/dist/anim/mixer.d.ts +113 -0
  25. package/dist/anim/mixer.js +314 -0
  26. package/dist/anim/morph.d.ts +41 -0
  27. package/dist/anim/morph.js +94 -0
  28. package/dist/anim/pose.d.ts +74 -0
  29. package/dist/anim/pose.js +254 -0
  30. package/dist/anim/quat.d.ts +44 -0
  31. package/dist/anim/quat.js +187 -0
  32. package/dist/anim/retarget.d.ts +97 -0
  33. package/dist/anim/retarget.js +366 -0
  34. package/dist/anim/root-motion.d.ts +44 -0
  35. package/dist/anim/root-motion.js +224 -0
  36. package/dist/anim/skin-pose.d.ts +39 -0
  37. package/dist/anim/skin-pose.js +53 -0
  38. package/dist/anim/socket.d.ts +47 -0
  39. package/dist/anim/socket.js +84 -0
  40. package/dist/anim/spring-chain.d.ts +73 -0
  41. package/dist/anim/spring-chain.js +294 -0
  42. package/dist/assets/atlas.d.ts +90 -0
  43. package/dist/assets/atlas.js +212 -0
  44. package/dist/assets/baked.d.ts +33 -0
  45. package/dist/assets/baked.js +38 -0
  46. package/dist/assets/bundle.d.ts +88 -0
  47. package/dist/assets/bundle.js +464 -0
  48. package/dist/assets/cache.d.ts +56 -0
  49. package/dist/assets/cache.js +123 -0
  50. package/dist/assets/gltf-load.d.ts +252 -0
  51. package/dist/assets/gltf-load.js +661 -0
  52. package/dist/assets/gltf-skin.d.ts +36 -0
  53. package/dist/assets/gltf-skin.js +109 -0
  54. package/dist/assets/gltf.d.ts +706 -0
  55. package/dist/assets/gltf.js +1376 -0
  56. package/dist/assets/index.d.ts +20 -0
  57. package/dist/assets/index.js +10 -0
  58. package/dist/assets/ktx2.d.ts +71 -0
  59. package/dist/assets/ktx2.js +213 -0
  60. package/dist/assets/manifest.d.ts +79 -0
  61. package/dist/assets/manifest.js +7 -0
  62. package/dist/assets/meshopt.d.ts +23 -0
  63. package/dist/assets/meshopt.js +403 -0
  64. package/dist/audio/audio.d.ts +733 -0
  65. package/dist/audio/audio.js +2013 -0
  66. package/dist/audio/dsp.d.ts +61 -0
  67. package/dist/audio/dsp.js +159 -0
  68. package/dist/audio/duck.d.ts +44 -0
  69. package/dist/audio/duck.js +101 -0
  70. package/dist/audio/envelope.d.ts +53 -0
  71. package/dist/audio/envelope.js +106 -0
  72. package/dist/audio/index.d.ts +13 -0
  73. package/dist/audio/index.js +14 -0
  74. package/dist/audio/music.d.ts +113 -0
  75. package/dist/audio/music.js +548 -0
  76. package/dist/audio/occlusion.d.ts +55 -0
  77. package/dist/audio/occlusion.js +61 -0
  78. package/dist/audio/persist.d.ts +23 -0
  79. package/dist/audio/persist.js +27 -0
  80. package/dist/audio/recipes.d.ts +55 -0
  81. package/dist/audio/recipes.js +227 -0
  82. package/dist/audio/send.d.ts +41 -0
  83. package/dist/audio/send.js +118 -0
  84. package/dist/audio/sprites.d.ts +59 -0
  85. package/dist/audio/sprites.js +43 -0
  86. package/dist/audio/synth.d.ts +103 -0
  87. package/dist/audio/synth.js +197 -0
  88. package/dist/audio/variations.d.ts +25 -0
  89. package/dist/audio/variations.js +55 -0
  90. package/dist/audio/zones.d.ts +100 -0
  91. package/dist/audio/zones.js +167 -0
  92. package/dist/core/detached-surface.d.ts +44 -0
  93. package/dist/core/detached-surface.js +104 -0
  94. package/dist/core/events.d.ts +24 -0
  95. package/dist/core/events.js +43 -0
  96. package/dist/core/game.d.ts +409 -0
  97. package/dist/core/game.js +530 -0
  98. package/dist/core/hash.d.ts +24 -0
  99. package/dist/core/hash.js +49 -0
  100. package/dist/core/index.d.ts +17 -0
  101. package/dist/core/index.js +9 -0
  102. package/dist/core/loop.d.ts +113 -0
  103. package/dist/core/loop.js +185 -0
  104. package/dist/core/math.d.ts +58 -0
  105. package/dist/core/math.js +210 -0
  106. package/dist/core/noise.d.ts +40 -0
  107. package/dist/core/noise.js +247 -0
  108. package/dist/core/pool.d.ts +42 -0
  109. package/dist/core/pool.js +85 -0
  110. package/dist/core/random.d.ts +61 -0
  111. package/dist/core/random.js +199 -0
  112. package/dist/core/scene.d.ts +79 -0
  113. package/dist/core/scene.js +195 -0
  114. package/dist/core/timer.d.ts +66 -0
  115. package/dist/core/timer.js +286 -0
  116. package/dist/fx/billboard-wgsl.d.ts +29 -0
  117. package/dist/fx/billboard-wgsl.js +158 -0
  118. package/dist/fx/billboard.d.ts +249 -0
  119. package/dist/fx/billboard.js +702 -0
  120. package/dist/fx/debug-draw.d.ts +127 -0
  121. package/dist/fx/debug-draw.js +523 -0
  122. package/dist/fx/debug-wgsl.d.ts +7 -0
  123. package/dist/fx/debug-wgsl.js +32 -0
  124. package/dist/fx/decals-wgsl.d.ts +15 -0
  125. package/dist/fx/decals-wgsl.js +173 -0
  126. package/dist/fx/decals.d.ts +216 -0
  127. package/dist/fx/decals.js +607 -0
  128. package/dist/fx/effect.d.ts +129 -0
  129. package/dist/fx/effect.js +349 -0
  130. package/dist/fx/effects/hit-spark.json +48 -0
  131. package/dist/fx/effects/index.d.ts +8 -0
  132. package/dist/fx/effects/index.js +9 -0
  133. package/dist/fx/effects/magic-aura.json +47 -0
  134. package/dist/fx/effects/smoke-puff.json +34 -0
  135. package/dist/fx/emit-surface.d.ts +40 -0
  136. package/dist/fx/emit-surface.js +124 -0
  137. package/dist/fx/flicker.d.ts +30 -0
  138. package/dist/fx/flicker.js +42 -0
  139. package/dist/fx/index.d.ts +31 -0
  140. package/dist/fx/index.js +20 -0
  141. package/dist/fx/particles-wgsl.d.ts +57 -0
  142. package/dist/fx/particles-wgsl.js +828 -0
  143. package/dist/fx/particles.d.ts +566 -0
  144. package/dist/fx/particles.js +1533 -0
  145. package/dist/fx/random.d.ts +15 -0
  146. package/dist/fx/random.js +20 -0
  147. package/dist/fx/sky-wgsl.d.ts +23 -0
  148. package/dist/fx/sky-wgsl.js +127 -0
  149. package/dist/fx/sky.d.ts +96 -0
  150. package/dist/fx/sky.js +175 -0
  151. package/dist/fx/text-atlas.d.ts +143 -0
  152. package/dist/fx/text-atlas.js +327 -0
  153. package/dist/fx/trail-wgsl.d.ts +11 -0
  154. package/dist/fx/trail-wgsl.js +42 -0
  155. package/dist/fx/trail.d.ts +194 -0
  156. package/dist/fx/trail.js +555 -0
  157. package/dist/fx/water-wgsl.d.ts +34 -0
  158. package/dist/fx/water-wgsl.js +197 -0
  159. package/dist/fx/water.d.ts +176 -0
  160. package/dist/fx/water.js +371 -0
  161. package/dist/geom/collide/bvh.d.ts +151 -0
  162. package/dist/geom/collide/bvh.js +493 -0
  163. package/dist/geom/collide/debug.d.ts +14 -0
  164. package/dist/geom/collide/debug.js +74 -0
  165. package/dist/geom/collide/grid.d.ts +26 -0
  166. package/dist/geom/collide/grid.js +91 -0
  167. package/dist/geom/collide/index.d.ts +8 -0
  168. package/dist/geom/collide/index.js +8 -0
  169. package/dist/geom/collide/queries.d.ts +70 -0
  170. package/dist/geom/collide/queries.js +583 -0
  171. package/dist/geom/collide/serialize.d.ts +14 -0
  172. package/dist/geom/collide/serialize.js +145 -0
  173. package/dist/geom/collide/shapes.d.ts +161 -0
  174. package/dist/geom/collide/shapes.js +686 -0
  175. package/dist/geom/collide/slide.d.ts +66 -0
  176. package/dist/geom/collide/slide.js +375 -0
  177. package/dist/geom/collide/tile-slide.d.ts +88 -0
  178. package/dist/geom/collide/tile-slide.js +255 -0
  179. package/dist/geom/geometry.d.ts +95 -0
  180. package/dist/geom/geometry.js +322 -0
  181. package/dist/geom/heightfield.d.ts +72 -0
  182. package/dist/geom/heightfield.js +295 -0
  183. package/dist/geom/hull.d.ts +27 -0
  184. package/dist/geom/hull.js +279 -0
  185. package/dist/geom/index.d.ts +35 -0
  186. package/dist/geom/index.js +23 -0
  187. package/dist/geom/iso.d.ts +74 -0
  188. package/dist/geom/iso.js +89 -0
  189. package/dist/geom/lod.d.ts +29 -0
  190. package/dist/geom/lod.js +27 -0
  191. package/dist/geom/ops.d.ts +47 -0
  192. package/dist/geom/ops.js +285 -0
  193. package/dist/geom/primitives.d.ts +97 -0
  194. package/dist/geom/primitives.js +359 -0
  195. package/dist/geom/shapes.d.ts +43 -0
  196. package/dist/geom/shapes.js +88 -0
  197. package/dist/geom/simplify.d.ts +38 -0
  198. package/dist/geom/simplify.js +519 -0
  199. package/dist/geom/split.d.ts +37 -0
  200. package/dist/geom/split.js +413 -0
  201. package/dist/geom/sweep.d.ts +83 -0
  202. package/dist/geom/sweep.js +534 -0
  203. package/dist/geom/tangents.d.ts +16 -0
  204. package/dist/geom/tangents.js +124 -0
  205. package/dist/geom/triangulate.d.ts +19 -0
  206. package/dist/geom/triangulate.js +147 -0
  207. package/dist/host/default.d.ts +10 -0
  208. package/dist/host/default.js +10 -0
  209. package/dist/host/index.d.ts +4 -0
  210. package/dist/host/index.js +3 -0
  211. package/dist/host/types.d.ts +144 -0
  212. package/dist/host/types.js +1 -0
  213. package/dist/host/web-links.d.ts +38 -0
  214. package/dist/host/web-links.js +110 -0
  215. package/dist/host/web.d.ts +30 -0
  216. package/dist/host/web.js +216 -0
  217. package/dist/host/xr.d.ts +24 -0
  218. package/dist/host/xr.js +59 -0
  219. package/dist/i18n/i18n.d.ts +59 -0
  220. package/dist/i18n/i18n.js +241 -0
  221. package/dist/i18n/index.d.ts +3 -0
  222. package/dist/i18n/index.js +3 -0
  223. package/dist/i18n/message.d.ts +72 -0
  224. package/dist/i18n/message.js +369 -0
  225. package/dist/i18n/negotiate.d.ts +17 -0
  226. package/dist/i18n/negotiate.js +58 -0
  227. package/dist/index.d.ts +7 -0
  228. package/dist/index.js +1 -0
  229. package/dist/input/bindings.d.ts +31 -0
  230. package/dist/input/bindings.js +141 -0
  231. package/dist/input/clock.d.ts +44 -0
  232. package/dist/input/clock.js +49 -0
  233. package/dist/input/follow.d.ts +133 -0
  234. package/dist/input/follow.js +218 -0
  235. package/dist/input/gestures.d.ts +281 -0
  236. package/dist/input/gestures.js +662 -0
  237. package/dist/input/glyphs.d.ts +35 -0
  238. package/dist/input/glyphs.js +216 -0
  239. package/dist/input/gyro.d.ts +85 -0
  240. package/dist/input/gyro.js +140 -0
  241. package/dist/input/index.d.ts +19 -0
  242. package/dist/input/index.js +16 -0
  243. package/dist/input/input.d.ts +543 -0
  244. package/dist/input/input.js +1492 -0
  245. package/dist/input/look.d.ts +327 -0
  246. package/dist/input/look.js +681 -0
  247. package/dist/input/magnify.d.ts +177 -0
  248. package/dist/input/magnify.js +131 -0
  249. package/dist/input/pointer-dispatch.d.ts +138 -0
  250. package/dist/input/pointer-dispatch.js +180 -0
  251. package/dist/input/pointer-router.d.ts +204 -0
  252. package/dist/input/pointer-router.js +533 -0
  253. package/dist/input/pointer-sources.d.ts +164 -0
  254. package/dist/input/pointer-sources.js +306 -0
  255. package/dist/input/rays.d.ts +138 -0
  256. package/dist/input/rays.js +615 -0
  257. package/dist/input/record.d.ts +209 -0
  258. package/dist/input/record.js +601 -0
  259. package/dist/input/touch-zones.d.ts +147 -0
  260. package/dist/input/touch-zones.js +300 -0
  261. package/dist/input/types.d.ts +158 -0
  262. package/dist/input/types.js +1 -0
  263. package/dist/input/xr-source.d.ts +53 -0
  264. package/dist/input/xr-source.js +164 -0
  265. package/dist/nav/astar.d.ts +45 -0
  266. package/dist/nav/astar.js +182 -0
  267. package/dist/nav/corridor.d.ts +40 -0
  268. package/dist/nav/corridor.js +95 -0
  269. package/dist/nav/crowd.d.ts +94 -0
  270. package/dist/nav/crowd.js +624 -0
  271. package/dist/nav/flow.d.ts +61 -0
  272. package/dist/nav/flow.js +193 -0
  273. package/dist/nav/grid.d.ts +108 -0
  274. package/dist/nav/grid.js +210 -0
  275. package/dist/nav/heap.d.ts +22 -0
  276. package/dist/nav/heap.js +92 -0
  277. package/dist/nav/index.d.ts +37 -0
  278. package/dist/nav/index.js +19 -0
  279. package/dist/nav/mesh/areas.d.ts +44 -0
  280. package/dist/nav/mesh/areas.js +98 -0
  281. package/dist/nav/mesh/bake-options.d.ts +33 -0
  282. package/dist/nav/mesh/bake-options.js +76 -0
  283. package/dist/nav/mesh/contour.d.ts +22 -0
  284. package/dist/nav/mesh/contour.js +323 -0
  285. package/dist/nav/mesh/flow3.d.ts +35 -0
  286. package/dist/nav/mesh/flow3.js +229 -0
  287. package/dist/nav/mesh/links.d.ts +38 -0
  288. package/dist/nav/mesh/links.js +72 -0
  289. package/dist/nav/mesh/mesh-path.d.ts +152 -0
  290. package/dist/nav/mesh/mesh-path.js +643 -0
  291. package/dist/nav/mesh/mesh-reach.d.ts +78 -0
  292. package/dist/nav/mesh/mesh-reach.js +450 -0
  293. package/dist/nav/mesh/navmesh.d.ts +117 -0
  294. package/dist/nav/mesh/navmesh.js +647 -0
  295. package/dist/nav/mesh/polymesh.d.ts +24 -0
  296. package/dist/nav/mesh/polymesh.js +384 -0
  297. package/dist/nav/mesh/regions.d.ts +12 -0
  298. package/dist/nav/mesh/regions.js +367 -0
  299. package/dist/nav/mesh/serialize.d.ts +13 -0
  300. package/dist/nav/mesh/serialize.js +197 -0
  301. package/dist/nav/mesh/voxelize.d.ts +111 -0
  302. package/dist/nav/mesh/voxelize.js +552 -0
  303. package/dist/nav/obstacles.d.ts +75 -0
  304. package/dist/nav/obstacles.js +294 -0
  305. package/dist/nav/path.d.ts +59 -0
  306. package/dist/nav/path.js +177 -0
  307. package/dist/nav/query-queue.d.ts +46 -0
  308. package/dist/nav/query-queue.js +308 -0
  309. package/dist/nav/reach.d.ts +53 -0
  310. package/dist/nav/reach.js +148 -0
  311. package/dist/nav/steer.d.ts +36 -0
  312. package/dist/nav/steer.js +78 -0
  313. package/dist/platform/boot.d.ts +28 -0
  314. package/dist/platform/boot.js +43 -0
  315. package/dist/platform/device-mode.d.ts +40 -0
  316. package/dist/platform/device-mode.js +104 -0
  317. package/dist/platform/device.d.ts +31 -0
  318. package/dist/platform/device.js +91 -0
  319. package/dist/platform/environment.d.ts +42 -0
  320. package/dist/platform/environment.js +82 -0
  321. package/dist/platform/gpu.d.ts +40 -0
  322. package/dist/platform/gpu.js +57 -0
  323. package/dist/platform/index.d.ts +18 -0
  324. package/dist/platform/index.js +10 -0
  325. package/dist/platform/letterbox.d.ts +43 -0
  326. package/dist/platform/letterbox.js +57 -0
  327. package/dist/platform/links.d.ts +20 -0
  328. package/dist/platform/links.js +43 -0
  329. package/dist/platform/screens.d.ts +36 -0
  330. package/dist/platform/screens.js +138 -0
  331. package/dist/platform/surface.d.ts +72 -0
  332. package/dist/platform/surface.js +157 -0
  333. package/dist/platform/xr-fake.d.ts +168 -0
  334. package/dist/platform/xr-fake.js +434 -0
  335. package/dist/platform/xr-surface.d.ts +120 -0
  336. package/dist/platform/xr-surface.js +214 -0
  337. package/dist/platform/xr-types.d.ts +262 -0
  338. package/dist/post/ao.d.ts +12 -0
  339. package/dist/post/ao.js +136 -0
  340. package/dist/post/blend.d.ts +27 -0
  341. package/dist/post/blend.js +129 -0
  342. package/dist/post/depth-pass.d.ts +43 -0
  343. package/dist/post/depth-pass.js +118 -0
  344. package/dist/post/dof.d.ts +1 -0
  345. package/dist/post/dof.js +66 -0
  346. package/dist/post/exposure.d.ts +80 -0
  347. package/dist/post/exposure.js +322 -0
  348. package/dist/post/index.d.ts +12 -0
  349. package/dist/post/index.js +11 -0
  350. package/dist/post/lens-dirt.d.ts +13 -0
  351. package/dist/post/lens-dirt.js +91 -0
  352. package/dist/post/lut.d.ts +19 -0
  353. package/dist/post/lut.js +50 -0
  354. package/dist/post/motion-blur.d.ts +9 -0
  355. package/dist/post/motion-blur.js +78 -0
  356. package/dist/post/post-stack.d.ts +302 -0
  357. package/dist/post/post-stack.js +1137 -0
  358. package/dist/post/settings.d.ts +485 -0
  359. package/dist/post/settings.js +416 -0
  360. package/dist/post/shaders.d.ts +25 -0
  361. package/dist/post/shaders.js +410 -0
  362. package/dist/post/ssr.d.ts +16 -0
  363. package/dist/post/ssr.js +155 -0
  364. package/dist/post/taa.d.ts +74 -0
  365. package/dist/post/taa.js +235 -0
  366. package/dist/post/white-balance.d.ts +25 -0
  367. package/dist/post/white-balance.js +98 -0
  368. package/dist/render/bindings.d.ts +98 -0
  369. package/dist/render/bindings.js +281 -0
  370. package/dist/render/blend.d.ts +13 -0
  371. package/dist/render/blend.js +26 -0
  372. package/dist/render/camera-2d.d.ts +72 -0
  373. package/dist/render/camera-2d.js +92 -0
  374. package/dist/render/camera.d.ts +302 -0
  375. package/dist/render/camera.js +671 -0
  376. package/dist/render/color.d.ts +16 -0
  377. package/dist/render/color.js +41 -0
  378. package/dist/render/compressed.d.ts +104 -0
  379. package/dist/render/compressed.js +248 -0
  380. package/dist/render/diagnostics.d.ts +15 -0
  381. package/dist/render/diagnostics.js +43 -0
  382. package/dist/render/dynamic-resolution.d.ts +70 -0
  383. package/dist/render/dynamic-resolution.js +126 -0
  384. package/dist/render/fake-gpu.d.ts +204 -0
  385. package/dist/render/fake-gpu.js +426 -0
  386. package/dist/render/flipbook.d.ts +56 -0
  387. package/dist/render/flipbook.js +87 -0
  388. package/dist/render/frame.d.ts +278 -0
  389. package/dist/render/frame.js +174 -0
  390. package/dist/render/fullscreen.d.ts +54 -0
  391. package/dist/render/fullscreen.js +91 -0
  392. package/dist/render/gpu-timer.d.ts +73 -0
  393. package/dist/render/gpu-timer.js +186 -0
  394. package/dist/render/index.d.ts +53 -0
  395. package/dist/render/index.js +29 -0
  396. package/dist/render/instance-list.d.ts +185 -0
  397. package/dist/render/instance-list.js +547 -0
  398. package/dist/render/lights.d.ts +181 -0
  399. package/dist/render/lights.js +233 -0
  400. package/dist/render/lod.d.ts +54 -0
  401. package/dist/render/lod.js +52 -0
  402. package/dist/render/material.d.ts +165 -0
  403. package/dist/render/material.js +292 -0
  404. package/dist/render/mesh.d.ts +284 -0
  405. package/dist/render/mesh.js +472 -0
  406. package/dist/render/mipmap.d.ts +16 -0
  407. package/dist/render/mipmap.js +121 -0
  408. package/dist/render/parallax.d.ts +50 -0
  409. package/dist/render/parallax.js +47 -0
  410. package/dist/render/pbr-wgsl.d.ts +31 -0
  411. package/dist/render/pbr-wgsl.js +119 -0
  412. package/dist/render/ping-pong.d.ts +42 -0
  413. package/dist/render/ping-pong.js +74 -0
  414. package/dist/render/renderer.d.ts +741 -0
  415. package/dist/render/renderer.js +2486 -0
  416. package/dist/render/scene-pipelines.d.ts +44 -0
  417. package/dist/render/scene-pipelines.js +92 -0
  418. package/dist/render/scene-target.d.ts +170 -0
  419. package/dist/render/scene-target.js +450 -0
  420. package/dist/render/shadow.d.ts +74 -0
  421. package/dist/render/shadow.js +208 -0
  422. package/dist/render/skin.d.ts +112 -0
  423. package/dist/render/skin.js +240 -0
  424. package/dist/render/snapshot.d.ts +36 -0
  425. package/dist/render/snapshot.js +34 -0
  426. package/dist/render/standard.d.ts +162 -0
  427. package/dist/render/standard.js +263 -0
  428. package/dist/render/texture.d.ts +142 -0
  429. package/dist/render/texture.js +228 -0
  430. package/dist/render/tile-layer.d.ts +110 -0
  431. package/dist/render/tile-layer.js +304 -0
  432. package/dist/render/transform.d.ts +115 -0
  433. package/dist/render/transform.js +318 -0
  434. package/dist/render/wgsl.d.ts +131 -0
  435. package/dist/render/wgsl.js +528 -0
  436. package/dist/save/codec.d.ts +49 -0
  437. package/dist/save/codec.js +169 -0
  438. package/dist/save/index.d.ts +8 -0
  439. package/dist/save/index.js +8 -0
  440. package/dist/save/journal.d.ts +24 -0
  441. package/dist/save/journal.js +102 -0
  442. package/dist/save/migrate.d.ts +15 -0
  443. package/dist/save/migrate.js +37 -0
  444. package/dist/save/schema.d.ts +72 -0
  445. package/dist/save/schema.js +154 -0
  446. package/dist/save/settings.d.ts +28 -0
  447. package/dist/save/settings.js +59 -0
  448. package/dist/save/slots.d.ts +56 -0
  449. package/dist/save/slots.js +200 -0
  450. package/dist/save/storage.d.ts +35 -0
  451. package/dist/save/storage.js +62 -0
  452. package/dist/save/store.d.ts +114 -0
  453. package/dist/save/store.js +269 -0
  454. package/dist/testing/fake-host.d.ts +103 -0
  455. package/dist/testing/fake-host.js +163 -0
  456. package/dist/testing/fixed-clock.d.ts +25 -0
  457. package/dist/testing/fixed-clock.js +30 -0
  458. package/dist/testing/index.d.ts +4 -0
  459. package/dist/testing/index.js +5 -0
  460. package/dist/testing/test-game.d.ts +76 -0
  461. package/dist/testing/test-game.js +92 -0
  462. package/dist/tween/ease.d.ts +77 -0
  463. package/dist/tween/ease.js +192 -0
  464. package/dist/tween/index.d.ts +8 -0
  465. package/dist/tween/index.js +7 -0
  466. package/dist/tween/timeline.d.ts +78 -0
  467. package/dist/tween/timeline.js +269 -0
  468. package/dist/tween/tween.d.ts +168 -0
  469. package/dist/tween/tween.js +320 -0
  470. package/dist/ui/anchor.d.ts +206 -0
  471. package/dist/ui/anchor.js +307 -0
  472. package/dist/ui/caption.d.ts +122 -0
  473. package/dist/ui/caption.js +286 -0
  474. package/dist/ui/cursor.d.ts +105 -0
  475. package/dist/ui/cursor.js +261 -0
  476. package/dist/ui/dom.d.ts +30 -0
  477. package/dist/ui/dom.js +92 -0
  478. package/dist/ui/floats.d.ts +86 -0
  479. package/dist/ui/floats.js +260 -0
  480. package/dist/ui/hud.d.ts +198 -0
  481. package/dist/ui/hud.js +431 -0
  482. package/dist/ui/index.d.ts +37 -0
  483. package/dist/ui/index.js +34 -0
  484. package/dist/ui/inventory-card.d.ts +52 -0
  485. package/dist/ui/inventory-card.js +173 -0
  486. package/dist/ui/inventory-context.d.ts +29 -0
  487. package/dist/ui/inventory-context.js +125 -0
  488. package/dist/ui/inventory-drag.d.ts +63 -0
  489. package/dist/ui/inventory-drag.js +394 -0
  490. package/dist/ui/inventory-grid.d.ts +66 -0
  491. package/dist/ui/inventory-grid.js +625 -0
  492. package/dist/ui/inventory-radial.d.ts +39 -0
  493. package/dist/ui/inventory-radial.js +168 -0
  494. package/dist/ui/inventory.d.ts +128 -0
  495. package/dist/ui/inventory.js +154 -0
  496. package/dist/ui/layout.d.ts +356 -0
  497. package/dist/ui/layout.js +856 -0
  498. package/dist/ui/link.d.ts +64 -0
  499. package/dist/ui/link.js +155 -0
  500. package/dist/ui/loading.d.ts +40 -0
  501. package/dist/ui/loading.js +157 -0
  502. package/dist/ui/loupe.d.ts +74 -0
  503. package/dist/ui/loupe.js +164 -0
  504. package/dist/ui/menu-nav.d.ts +33 -0
  505. package/dist/ui/menu-nav.js +28 -0
  506. package/dist/ui/minimap-canvas.d.ts +145 -0
  507. package/dist/ui/minimap-canvas.js +460 -0
  508. package/dist/ui/notify.d.ts +40 -0
  509. package/dist/ui/notify.js +141 -0
  510. package/dist/ui/orb.d.ts +53 -0
  511. package/dist/ui/orb.js +304 -0
  512. package/dist/ui/overlay.d.ts +213 -0
  513. package/dist/ui/overlay.js +394 -0
  514. package/dist/ui/padnav.d.ts +53 -0
  515. package/dist/ui/padnav.js +146 -0
  516. package/dist/ui/perf.d.ts +130 -0
  517. package/dist/ui/perf.js +329 -0
  518. package/dist/ui/rotate-card.d.ts +54 -0
  519. package/dist/ui/rotate-card.js +97 -0
  520. package/dist/ui/stack.d.ts +128 -0
  521. package/dist/ui/stack.js +312 -0
  522. package/dist/ui/styles.d.ts +13 -0
  523. package/dist/ui/styles.js +200 -0
  524. package/dist/ui/text-scale.d.ts +67 -0
  525. package/dist/ui/text-scale.js +102 -0
  526. package/dist/ui/theme.d.ts +70 -0
  527. package/dist/ui/theme.js +98 -0
  528. package/dist/ui/toast.d.ts +23 -0
  529. package/dist/ui/toast.js +46 -0
  530. package/dist/ui/tooltip.d.ts +89 -0
  531. package/dist/ui/tooltip.js +333 -0
  532. package/dist/ui/widgets-2.d.ts +134 -0
  533. package/dist/ui/widgets-2.js +399 -0
  534. package/dist/ui/widgets-3.d.ts +91 -0
  535. package/dist/ui/widgets-3.js +212 -0
  536. package/dist/ui/widgets.d.ts +34 -0
  537. package/dist/ui/widgets.js +50 -0
  538. package/dist/ui/world-panel/index.d.ts +5 -0
  539. package/dist/ui/world-panel/index.js +5 -0
  540. package/dist/ui/world-panel/layout.d.ts +38 -0
  541. package/dist/ui/world-panel/layout.js +68 -0
  542. package/dist/ui/world-panel/paint.d.ts +96 -0
  543. package/dist/ui/world-panel/paint.js +136 -0
  544. package/dist/ui/world-panel/panel.d.ts +235 -0
  545. package/dist/ui/world-panel/panel.js +762 -0
  546. package/dist/ui/world-panel/wgsl.d.ts +10 -0
  547. package/dist/ui/world-panel/wgsl.js +52 -0
  548. package/dist/ui/world-panel/widgets.d.ts +207 -0
  549. package/dist/ui/world-panel/widgets.js +569 -0
  550. package/dist/voxel/chunks.d.ts +77 -0
  551. package/dist/voxel/chunks.js +149 -0
  552. package/dist/voxel/grid.d.ts +84 -0
  553. package/dist/voxel/grid.js +223 -0
  554. package/dist/voxel/index.d.ts +22 -0
  555. package/dist/voxel/index.js +7 -0
  556. package/dist/voxel/mesher-worker.d.ts +14 -0
  557. package/dist/voxel/mesher-worker.js +47 -0
  558. package/dist/voxel/mesher.d.ts +73 -0
  559. package/dist/voxel/mesher.js +306 -0
  560. package/dist/voxel/ray.d.ts +32 -0
  561. package/dist/voxel/ray.js +73 -0
  562. package/dist/voxel/wgsl.d.ts +16 -0
  563. package/dist/voxel/wgsl.js +28 -0
  564. package/dist/voxel/worker-client.d.ts +79 -0
  565. package/dist/voxel/worker-client.js +122 -0
  566. package/package.json +177 -3
@@ -0,0 +1,566 @@
1
+ import type { Random } from '../core/random.js';
2
+ import type { Drawable, Frame, ViewInfo } from '../render/frame.js';
3
+ import type { Renderer } from '../render/renderer.js';
4
+ import type { SceneTarget } from '../render/scene-target.js';
5
+ import type { TextureLike } from '../render/texture.js';
6
+ /** Most stops a `sizeCurve`/`colorCurve` may have. */
7
+ export declare const MAX_CURVE_STOPS = 8;
8
+ /** A `[min, max]` pair. */
9
+ export type Range = readonly [number, number];
10
+ export type EmitShape = {
11
+ kind: 'point';
12
+ }
13
+ /** Disc of `radius` in the XY plane. */
14
+ | {
15
+ kind: 'circle';
16
+ radius: number;
17
+ }
18
+ /** Rectangle centred on (x, y) in the XY plane. */
19
+ | {
20
+ kind: 'rect';
21
+ width: number;
22
+ height: number;
23
+ }
24
+ /** Segment from (x, y, z) to (x + dx, y + dy, z + dz). `dz` is world space only. */
25
+ | {
26
+ kind: 'line';
27
+ dx: number;
28
+ dy: number;
29
+ dz?: number;
30
+ }
31
+ /** Box centred on (x, y, z). In 2D it is a `rect` of `width × height`. */
32
+ | {
33
+ kind: 'box';
34
+ width: number;
35
+ height: number;
36
+ depth: number;
37
+ }
38
+ /** Ball of `radius` around (x, y, z). In 2D it is a `circle`. */
39
+ | {
40
+ kind: 'sphere';
41
+ radius: number;
42
+ }
43
+ /**
44
+ * The surface of a triangle mesh (area-weighted), offset by (x, y, z); extended kernel only.
45
+ * `alongNormal` launches along the surface normal. Pass a `buildEmitSurface` result to skip
46
+ * the table build; raw arrays are built (and cached by object identity) on first use.
47
+ */
48
+ | {
49
+ kind: 'mesh';
50
+ positions: ArrayLike<number>;
51
+ normals?: ArrayLike<number>;
52
+ indices?: ArrayLike<number>;
53
+ alongNormal?: boolean;
54
+ };
55
+ /**
56
+ * How new particles are born. Colours are linear RGBA (HDR ok). Units: logical px and seconds
57
+ * in 2D; world units and seconds in world space (defaults differ, see each field).
58
+ *
59
+ * The fields from `tile` on need the extended kernel (world space, or a 2D system with
60
+ * `extended`, `texture`, `forces` or `collide`); a plain 2D system ignores them with a warning.
61
+ */
62
+ export interface EmitParams {
63
+ x: number;
64
+ y: number;
65
+ /** World space only. Default 0. */
66
+ z?: number;
67
+ shape?: EmitShape;
68
+ /**
69
+ * Launch direction in radians, in the XY plane. 2D: 0 = right, -π/2 = up (y down); default
70
+ * -π/2. World space (y up): π/2 = up, -π/2 = down; default π/2.
71
+ */
72
+ angle?: number;
73
+ /**
74
+ * Full cone width in radians around `angle`. Default 2π: all directions (a circle in 2D, a
75
+ * sphere in world space).
76
+ */
77
+ spread?: number;
78
+ /** [min, max] speed. Default [80, 300] px/s in 2D, [0.5, 2] units/s in world space. */
79
+ speed?: Range;
80
+ /** World space only: added to every launch velocity's z (units/s). Default 0. */
81
+ vz?: number;
82
+ /** [min, max] seconds. Default [0.5, 1.2]. */
83
+ life?: Range;
84
+ /** Size at [birth, death]. Default [6, 1] px in 2D, [0.1, 0.02] units in world space. */
85
+ size?: Range;
86
+ colorStart: ArrayLike<number>;
87
+ /** Default: `colorStart` with alpha 0. */
88
+ colorEnd?: ArrayLike<number>;
89
+ /**
90
+ * Acceleration. 2D: [x, y] px/s², default [0, 400] (falls). World space: [x, y, z] units/s²
91
+ * (a pair has z 0), default [0, -9.8, 0].
92
+ */
93
+ gravity?: readonly [number, number] | readonly [number, number, number];
94
+ /**
95
+ * World space only: the air's velocity [x, y, z] (units/s), which `drag` pulls particles
96
+ * toward. Default [0, 0, 0] (drag slows them to rest, as in 2D).
97
+ */
98
+ wind?: readonly [number, number, number];
99
+ /** Linear drag per second. Default 1. */
100
+ drag?: number;
101
+ /** How much the particle also feeds bloom (0..). Default 1. */
102
+ emissive?: number;
103
+ /**
104
+ * Sprite-sheet tile (row-major index into the system's `atlas`): one tile, or `[from, to]`
105
+ * played over the particle's life (or at `tileRate`). Default 0.
106
+ */
107
+ tile?: number | Range;
108
+ /** Tile frames per second for a `[from, to]` range, looping. Default 0: once over life. */
109
+ tileRate?: number;
110
+ /** Initial rotation [min, max] radians about the view axis. Default [0, 0]. */
111
+ rotation?: Range;
112
+ /** Angular velocity [min, max] rad/s. Default [0, 0]. */
113
+ spin?: Range;
114
+ /**
115
+ * Point the quad along the velocity (with `stretch`). Default true, the original streaks;
116
+ * false keeps the quad upright (plus `rotation`), for sprites.
117
+ */
118
+ alignToVelocity?: boolean;
119
+ /**
120
+ * Size over life as 2..8 evenly spaced stops (replaces `size`; the per-particle size jitter
121
+ * still applies). Cached by array identity: mutate the array, not its reference, to animate.
122
+ */
123
+ sizeCurve?: readonly number[];
124
+ /** Colour over life as 2..8 evenly spaced RGBA stops (replaces `colorStart`/`colorEnd`). */
125
+ colorCurve?: readonly ArrayLike<number>[];
126
+ /** Emit `count` particles of `params` where this particle dies (one level deep). */
127
+ onDeath?: {
128
+ params: EmitParams;
129
+ count: number;
130
+ };
131
+ /** Emit `params` at `rate` per second along this particle's path (one level deep). */
132
+ onLife?: {
133
+ params: EmitParams;
134
+ rate: number;
135
+ };
136
+ /** Fraction of the parent's velocity its children inherit. Default 0. */
137
+ inherit?: number;
138
+ }
139
+ /** How an `attract` force scales with distance (see `ParticleForce`). */
140
+ export type AttractFalloff = 'constant' | 'linear' | 'inverse-square';
141
+ /** A force applied to every particle each frame (`ParticleSystem.forces`). */
142
+ export type ParticleForce =
143
+ /**
144
+ * Pull toward (x, y, z), fading linearly to 0 at `radius` (0 = everywhere). `falloff` shapes it
145
+ * by the distance r: `'constant'` (default) pulls at `strength` units/s² everywhere, so with
146
+ * light drag particles fly through the point and orbit it; `'linear'` pulls at `strength × r`
147
+ * (a spring: with drag they settle on the point); `'inverse-square'` at `strength / r²`
148
+ * (gravity-like). Nothing pulls inside `deadZone` (0) units, which also keeps
149
+ * `'inverse-square'` finite.
150
+ */
151
+ {
152
+ kind: 'attract';
153
+ x: number;
154
+ y: number;
155
+ z?: number;
156
+ strength: number;
157
+ radius?: number;
158
+ falloff?: AttractFalloff;
159
+ deadZone?: number;
160
+ }
161
+ /** Swirl about the `axis` through (x, y, z) at `strength` units/s², fading to 0 at `radius`. */
162
+ | {
163
+ kind: 'vortex';
164
+ axis: readonly [number, number, number];
165
+ x: number;
166
+ y: number;
167
+ z?: number;
168
+ strength: number;
169
+ radius?: number;
170
+ }
171
+ /** Curl of value noise at `frequency` (1/units) scaled by `strength` units/s²: divergence-free gusts. */
172
+ | {
173
+ kind: 'turbulence';
174
+ frequency: number;
175
+ strength: number;
176
+ seed?: number;
177
+ }
178
+ /** Extra linear drag per second on top of each particle's own. */
179
+ | {
180
+ kind: 'drag';
181
+ amount: number;
182
+ };
183
+ export interface ParticleSystemOptions {
184
+ /**
185
+ * `'2d'` (default): logical px in the XY plane, the original behaviour, pixel for pixel.
186
+ * `'world'`: particles in 3D world space, drawn as quads facing the camera (`size` in world
187
+ * units), with distance and soft-depth fades and optional lighting.
188
+ */
189
+ space?: '2d' | 'world';
190
+ /**
191
+ * 2D only: use the extended kernel (sprite sheets, spin, curves, forces, sub-emission, mesh
192
+ * emission) instead of the pixel-pinned original. Implied by `texture`, `forces` and
193
+ * `collide`; world space always has it. Default false.
194
+ */
195
+ extended?: boolean;
196
+ /** Max live particles (ring buffer). Default 65536. */
197
+ capacity?: number;
198
+ /** Max emit() calls between frames (also the sub-emission request budget per frame). Default 256. */
199
+ maxSpawnsPerFrame?: number;
200
+ /**
201
+ * A bouncy floor. 2D: the logical y below which particles bounce (y down). World: the plane
202
+ * y = `floorY` (y up). Default none.
203
+ */
204
+ floorY?: number;
205
+ /** Floor restitution 0..1. Default 0.35. */
206
+ bounce?: number;
207
+ /** Seconds of velocity added to the quad length (motion streaks). Default 0.02. */
208
+ stretch?: number;
209
+ /**
210
+ * `'additive'` (default): colour adds, for sparks, embers and rain. `'alpha'`: premultiplied
211
+ * alpha over the scene, for smoke and dust that should cover what is behind.
212
+ */
213
+ blend?: 'additive' | 'alpha';
214
+ /**
215
+ * World space only: shade each particle as a small sphere through the lighting block
216
+ * (`engine_lambert`, so `frame.lights` ambient, sun and point lights apply). Default false.
217
+ */
218
+ lit?: boolean;
219
+ /**
220
+ * World space only: fade out with distance to the camera: whole nearer than `near`, gone
221
+ * beyond `far` (world units). Default none.
222
+ */
223
+ fade?: {
224
+ near: number;
225
+ far: number;
226
+ };
227
+ /**
228
+ * World space only: soft particles. Within this view-space distance (world units) of the
229
+ * scene's depth a particle fades out, so quads do not cut hard lines into geometry. Needs a
230
+ * depth camera; 0 turns it off. Default 0.25.
231
+ */
232
+ softness?: number;
233
+ /** World space only: the scene target whose depth soft particles read. Default `renderer.target`. */
234
+ depthTarget?: SceneTarget;
235
+ /**
236
+ * World space only: take this frame's opaque depth from the renderer's depth hook
237
+ * (`Drawable.readsDepth`, ws/render-hooks) instead of copying the previous frame's in
238
+ * `prepare`. Only a view with `depthTest` splits for it; elsewhere the fade is then off (no
239
+ * copy of the system's own). Default false.
240
+ */
241
+ readsDepth?: boolean;
242
+ /**
243
+ * Count live particles on the GPU and read the count back into `alive` (a few frames late).
244
+ * Costs one small dispatch per frame and an 8-byte readback every other frame. Default false.
245
+ */
246
+ countAlive?: boolean;
247
+ /** With `countAlive`: also count live particles whose y is below this into `below`. */
248
+ countBelowY?: number;
249
+ /**
250
+ * Sprite sheet (extended kernel): each particle draws a tile of this texture instead of the
251
+ * radial falloff; its alpha and colour multiply the particle's. Both blend modes sample it.
252
+ */
253
+ texture?: TextureLike;
254
+ /** The sprite sheet's grid, row-major from the top left. Default 1 × 1. */
255
+ atlas?: {
256
+ columns: number;
257
+ rows: number;
258
+ };
259
+ /** Initial `forces` (extended kernel; the array is live afterwards). */
260
+ forces?: ParticleForce[];
261
+ /**
262
+ * World space with `readsDepth`: collide with this frame's opaque depth. Particles found
263
+ * behind the scene (within `thickness` units along the view ray, default 1, or deeper when
264
+ * they were in front of it one step back) are pushed back onto the surface and bounce:
265
+ * `bounce` scales the normal velocity, `friction` (0..1) damps the tangential.
266
+ */
267
+ collide?: {
268
+ bounce: number;
269
+ friction: number;
270
+ thickness?: number;
271
+ };
272
+ /** Distinct `onDeath`/`onLife` descriptors the system can hold at once. Default 16. */
273
+ maxSubEmitters?: number;
274
+ /** Distinct `sizeCurve` plus `colorCurve` arrays the system can hold at once. Default 32 each. */
275
+ maxCurves?: number;
276
+ /**
277
+ * The stream every emit draws its spawn seed from (ws/fx-4). Default: a fork of the fx
278
+ * module default (`FX_DEFAULT_SEED`), named by creation order.
279
+ */
280
+ random?: Random;
281
+ /**
282
+ * Allow `debugReadback()` (ws/fx-6): the particle buffer gains `COPY_SRC` and a mapped
283
+ * staging buffer of the same size is made. Off (default): no staging buffer, no cost.
284
+ */
285
+ debug?: boolean;
286
+ }
287
+ /**
288
+ * What `ParticleSystem.debugReadback()` resolves to: the live particles (age < lifetime) at
289
+ * the copy, in slot order. Fresh arrays each call; a debugging aid, not a frame path.
290
+ */
291
+ export interface ParticleReadback {
292
+ /** Live particles in the copy. */
293
+ alive: number;
294
+ /** xyz per live particle (`alive × 3`); 2D systems: logical px, z 0 on the original kernel. */
295
+ positions: Float32Array;
296
+ /** Velocity xyz per live particle (`alive × 3`), units per second. */
297
+ velocities: Float32Array;
298
+ /**
299
+ * The ring-buffer slot of each live particle. A slot keeps its particle until the ring wraps
300
+ * (`capacity` emits later), so two readbacks can be matched slot by slot.
301
+ */
302
+ slots: Uint32Array;
303
+ /** The system's simulated time (s, the sum of the clamped steps) when the copy was made. */
304
+ time: number;
305
+ }
306
+ /**
307
+ * What `ParticleSystem.readbackFields()` resolves to (ws/fx-7): every field of the live
308
+ * particles (age < lifetime) at the copy, one named typed array each, in slot order, so a reader
309
+ * needs no knowledge of the GPU packing. Vector fields are interleaved (`alive × n`); the rest
310
+ * hold one number per live particle. Fields the original 2D kernel does not carry are 0 there
311
+ * (`curveSlots` -1). Fresh arrays each call; a debugging aid, not a frame path.
312
+ */
313
+ export interface ParticleFields {
314
+ /** Live particles in the copy; every array below is sized for it. */
315
+ alive: number;
316
+ /** The ring-buffer slot of each live particle (as `ParticleReadback.slots`). */
317
+ slots: Uint32Array;
318
+ /** The system's simulated time (s) when the copy was made. */
319
+ time: number;
320
+ /** xyz (`alive × 3`); z 0 on the original 2D kernel. */
321
+ position: Float32Array;
322
+ /** Velocity xyz (`alive × 3`), units per second; z 0 on the original 2D kernel. */
323
+ velocity: Float32Array;
324
+ /** Seconds since birth. */
325
+ age: Float32Array;
326
+ /** Lifetime in seconds (the particle dies when `age` reaches it). */
327
+ life: Float32Array;
328
+ /**
329
+ * Half the drawn size at this age: the size curve (by the system's current curve table) or the
330
+ * start-to-end lerp, clamped at 0, as the render shader computes it.
331
+ */
332
+ radius: Float32Array;
333
+ /** Size at birth (with a size curve: the curve's scale). */
334
+ sizeStart: Float32Array;
335
+ /** Size at death (unused with a size curve). */
336
+ sizeEnd: Float32Array;
337
+ /** Colour at birth, RGBA (`alive × 4`). */
338
+ color0: Float32Array;
339
+ /** Colour at death, RGBA (`alive × 4`). */
340
+ color1: Float32Array;
341
+ /** Gravity xyz (`alive × 3`); z 0 on the original 2D kernel. */
342
+ gravity: Float32Array;
343
+ drag: Float32Array;
344
+ emissive: Float32Array;
345
+ /** Rotation (rad). */
346
+ rotation: Float32Array;
347
+ /** Spin (rad/s). */
348
+ spin: Float32Array;
349
+ /** Wind xyz (`alive × 3`). */
350
+ wind: Float32Array;
351
+ /** Tile from, tile to, tile rate (fps, 0 = over life), flags (1 align to velocity) (`alive × 4`). */
352
+ tile: Float32Array;
353
+ /** Curve table slots: size, colour, death, life (`alive × 4`; -1 none). */
354
+ curveSlots: Int32Array;
355
+ /** Sub-emission: death count, life rate, life carry (`alive × 3`). */
356
+ sub: Float32Array;
357
+ }
358
+ /**
359
+ * GPU particles: spawn + integrate in compute, rendered as additive (or alpha) quads into both
360
+ * scene targets (colour + emissive → bloom). Draw with `frame.drawable(system)`.
361
+ *
362
+ * In 2D (`space: '2d'`, the default) quads are velocity-stretched in the XY plane. In world
363
+ * space they face the camera, stretch along the velocity's projection on the view plane,
364
+ * test depth, fade by distance and near scene geometry, and may be lit.
365
+ *
366
+ * The extended kernel (world space, or 2D with `extended`) adds sprite sheets, spin, curves,
367
+ * `forces`, depth collision, sub-emission and mesh emission; the plain 2D kernel stays what it
368
+ * was, pixel for pixel.
369
+ *
370
+ * Particles live in a ring buffer: when full, the oldest are overwritten.
371
+ */
372
+ export declare class ParticleSystem implements Drawable {
373
+ readonly capacity: number;
374
+ readonly space: '2d' | 'world';
375
+ /** Whether this system runs the extended kernel. */
376
+ readonly extended: boolean;
377
+ /** Multiplier on every emit count (set < 1 for prefers-reduced-motion). */
378
+ spawnScale: number;
379
+ floorY: number;
380
+ bounce: number;
381
+ stretch: number;
382
+ /** World space only: see `ParticleSystemOptions.lit`. */
383
+ lit: boolean;
384
+ /** World space only: see `ParticleSystemOptions.fade` (null = no distance fade). */
385
+ fade: {
386
+ near: number;
387
+ far: number;
388
+ } | null;
389
+ /** World space only: see `ParticleSystemOptions.softness`. */
390
+ softness: number;
391
+ /** World space only: the target soft particles read depth from (null = `renderer.target`). */
392
+ depthTarget: SceneTarget | null;
393
+ /** See `ParticleSystemOptions.readsDepth`. Live. */
394
+ readsDepth: boolean;
395
+ /** Live particles at the last readback (`countAlive` only; -1 before the first). */
396
+ alive: number;
397
+ /** Live particles below `countBelowY` at the last readback (`countAlive` only; -1 before the first). */
398
+ below: number;
399
+ /** Live: the forces applied each frame (extended kernel; the first `MAX_FORCES` count). */
400
+ readonly forces: ParticleForce[];
401
+ /** Live: depth collision parameters (world, `readsDepth`; null = off). */
402
+ collide: {
403
+ bounce: number;
404
+ friction: number;
405
+ thickness?: number;
406
+ } | null;
407
+ /** Live: the stream `emit` draws spawn seeds from (see `ParticleSystemOptions.random`). */
408
+ random: Random;
409
+ private readonly renderer;
410
+ private readonly device;
411
+ private readonly particleBuffer;
412
+ private readonly spawnBuffer;
413
+ private readonly simBuffer;
414
+ private readonly spawnData;
415
+ private readonly simData;
416
+ private readonly spawnFloats;
417
+ private readonly maxSpawns;
418
+ private readonly spawnPipeline;
419
+ private readonly updatePipeline;
420
+ /**
421
+ * Render pipelines per depth format (null: none; a depth one tests without writing) × the
422
+ * view target's aux key, made on first use from `renderer.sceneTargets` (ws/render-10).
423
+ */
424
+ private readonly pipelines;
425
+ private readonly renderDesc;
426
+ private readonly blend;
427
+ /** World space: the velocity builds of the render shader by fragment location (ws/render-11). */
428
+ private readonly motionModules;
429
+ private computeGroup;
430
+ private readonly renderGroup;
431
+ private readonly soft;
432
+ private readonly counter;
433
+ private readonly fx;
434
+ private readonly collider;
435
+ /** `debug`: the staging buffer `debugReadback` copies the particles into. */
436
+ private readonly debugRead;
437
+ /** The copy in flight, shared by `debugReadback` and `readbackFields` calls made meanwhile. */
438
+ private debugJob;
439
+ /** Whether this frame's `prepare` copied scene depth (world space). */
440
+ private softActive;
441
+ /** The renderer's `depthCopy` view `hookGroup` was made for (`readsDepth`). */
442
+ private hookView;
443
+ private hookGroup;
444
+ /** The group `draw` binds: own copy, the renderer's copy, or the stand-in. */
445
+ private depthGroup;
446
+ private spawnCount;
447
+ private maxSpawnInCmd;
448
+ private head;
449
+ private pendingDt;
450
+ private time;
451
+ private warnedOverflow;
452
+ private warnedExtended;
453
+ private clearPending;
454
+ constructor(renderer: Renderer, opts?: ParticleSystemOptions);
455
+ /** A render bind group: the particles and sim, the depth view (world), the fx table/sheet. */
456
+ private makeRenderGroup;
457
+ private makeFx;
458
+ private makeComputeGroup;
459
+ private makeSoftDepth;
460
+ private makeCollider;
461
+ private makeCounter;
462
+ /**
463
+ * Queue `count` new particles. Cheap: one small record, spawned on the GPU next frame. The
464
+ * record's seed (every per-particle random on the GPU derives from it) is drawn from `random`,
465
+ * default the system's own stream.
466
+ */
467
+ emit(p: EmitParams, count: number, random?: Random): void;
468
+ private writeSpawn;
469
+ /**
470
+ * An extended spawn record at `at` of `d`: `n` particles from `start` (relative to the
471
+ * frame's ring head). `depth` 1 writes a sub-emitter record (no sub-emitters of its own).
472
+ */
473
+ private writeFxSpawn;
474
+ /** The curve table slot of `stops` (by identity; rewritten on every emit, so edits are live). */
475
+ private internCurve;
476
+ /** The sub-emitter record slot of `key` (by identity; rewritten on every parent emit). */
477
+ private internSub;
478
+ /** The surface table range of a mesh shape (built and appended on first sight). */
479
+ private internSurface;
480
+ /** Advance simulation time. Call from fixed update; integration happens on the GPU. */
481
+ update(dt: number): void;
482
+ prepare(encoder: GPUCommandEncoder, frame?: Frame): void;
483
+ /** Pack `forces` (the first `MAX_FORCES`) into the sim block; returns how many. */
484
+ private writeForces;
485
+ /** Upload the dirty curve, sub-emitter and surface tables (the surface buffer may grow). */
486
+ private uploadTables;
487
+ /**
488
+ * Map last frame's count (its commands were submitted by now). This frame records nothing
489
+ * into the readback buffer, so mapping it while this frame is encoded is valid.
490
+ */
491
+ private readAlive;
492
+ /**
493
+ * World space: copy the scene's depth into this system's own depth32float texture, which the
494
+ * fragment shader samples for the soft fade. It runs before this frame's scene pass, so it
495
+ * holds what the target's depth held then: the previous frame's, or that of an earlier
496
+ * `render` call this frame (draw the particles on their own layer in a second view of the
497
+ * same camera for a same-frame fade). Returns false (soft fade off) without depth.
498
+ */
499
+ private copyDepth;
500
+ /**
501
+ * Draw inside the scene pass. With a depth camera (`frame.depthFormat` set) the pipeline
502
+ * tests against depth without writing it, like any blended material.
503
+ */
504
+ draw(pass: GPURenderPassEncoder, frame?: Frame): void;
505
+ /**
506
+ * The renderer's depth hook (`readsDepth`, world space): with `softness` > 0 bind this
507
+ * frame's opaque depth copy and flip the shader's soft flag on (a 4-byte write that lands
508
+ * before the frame's commands run); with `collide` run the collision kernel against the same
509
+ * depth. New bind groups only when the copy texture changed.
510
+ */
511
+ afterOpaque(encoder: GPUCommandEncoder, view: ViewInfo): void;
512
+ private pipelineFor;
513
+ private motionModule;
514
+ /**
515
+ * Kill every particle (e.g. on scene change), including emits queued earlier this frame.
516
+ * The buffer is zeroed on the GPU at the start of the next `prepare` (no CPU allocation);
517
+ * particles emitted after `clear()` survive.
518
+ */
519
+ clear(): void;
520
+ /**
521
+ * Copy the particle buffer into the staging buffer, map it and return the live particles
522
+ * (`debug: true` only; rejects otherwise). Never runs on its own. The copy is submitted at
523
+ * once, so call it outside a frame (after `endFrame`): it then holds every frame submitted so
524
+ * far. A call while one is in flight returns that one's promise.
525
+ */
526
+ debugReadback(): Promise<ParticleReadback>;
527
+ /**
528
+ * As `debugReadback`, but resolves to every field of the live particles by name
529
+ * (`ParticleFields`), unpacked from the kernel's layout (ws/fx-7). `debug: true` only. Calls
530
+ * made while a copy is in flight share it with each other and with `debugReadback`, so both
531
+ * forms called back to back describe the same copy.
532
+ */
533
+ readbackFields(): Promise<ParticleFields>;
534
+ /** The copy in flight, or a new one submitted now; null without `debug`. */
535
+ private debugCopy;
536
+ /** `parseFields` with this system's layout and curve table. */
537
+ private parseFields;
538
+ destroy(): void;
539
+ }
540
+ /**
541
+ * The CPU reference of the kernel's curve lookup: piecewise-linear over `stops` (2..8) spread
542
+ * evenly on 0..1, each stop `stride` numbers (1 for a size curve, 4 for RGBA), written to `out`.
543
+ */
544
+ export declare function evaluateCurve(stops: ArrayLike<number>, stride: number, t: number, out: Float32Array): Float32Array;
545
+ /**
546
+ * The CPU reference of the kernel's force step: accelerate `vel` (xyz) by `forces` at `pos`
547
+ * over `dt` and apply the extra drag (the particle's own gravity, drag and wind are not
548
+ * included). For tests and shadow simulations; the GPU does the real work.
549
+ */
550
+ export declare function applyForces(forces: readonly ParticleForce[], pos: ArrayLike<number>, vel: Float32Array | number[], dt: number): void;
551
+ /**
552
+ * Continuous emission at `rate` particles/second, plus bursts. Mutate `params` freely. With
553
+ * `random` the emitter's spawn seeds come from that stream instead of the system's (ws/fx-4).
554
+ */
555
+ export declare class ParticleEmitter {
556
+ readonly system: ParticleSystem;
557
+ params: EmitParams;
558
+ rate: number;
559
+ active: boolean;
560
+ /** Live: the stream this emitter's emits draw from; null uses the system's `random`. */
561
+ random: Random | null;
562
+ private carry;
563
+ constructor(system: ParticleSystem, params: EmitParams, rate?: number, random?: Random);
564
+ update(dt: number): void;
565
+ burst(count: number, overrides?: Partial<EmitParams>): void;
566
+ }