@codexo/exojs 0.7.13 → 0.8.2

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 (544) hide show
  1. package/CHANGELOG.md +637 -124
  2. package/README.md +19 -19
  3. package/dist/esm/animation/Easing.js +13 -21
  4. package/dist/esm/animation/Easing.js.map +1 -1
  5. package/dist/esm/animation/Tween.d.ts +3 -3
  6. package/dist/esm/animation/Tween.js +7 -5
  7. package/dist/esm/animation/Tween.js.map +1 -1
  8. package/dist/esm/animation/TweenManager.js +1 -1
  9. package/dist/esm/animation/TweenManager.js.map +1 -1
  10. package/dist/esm/animation/types.js.map +1 -1
  11. package/dist/esm/audio/AbstractMedia.d.ts +1 -1
  12. package/dist/esm/audio/AbstractMedia.js +1 -1
  13. package/dist/esm/audio/AbstractMedia.js.map +1 -1
  14. package/dist/esm/audio/AudioAnalyser.d.ts +1 -1
  15. package/dist/esm/audio/AudioAnalyser.js +2 -2
  16. package/dist/esm/audio/AudioAnalyser.js.map +1 -1
  17. package/dist/esm/audio/AudioBus.d.ts +1 -1
  18. package/dist/esm/audio/AudioBus.js.map +1 -1
  19. package/dist/esm/audio/AudioFilter.js +3 -1
  20. package/dist/esm/audio/AudioFilter.js.map +1 -1
  21. package/dist/esm/audio/AudioListener.d.ts +1 -1
  22. package/dist/esm/audio/AudioListener.js +5 -3
  23. package/dist/esm/audio/AudioListener.js.map +1 -1
  24. package/dist/esm/audio/AudioManager.js.map +1 -1
  25. package/dist/esm/audio/BeatDetector.d.ts +4 -4
  26. package/dist/esm/audio/BeatDetector.js +68 -44
  27. package/dist/esm/audio/BeatDetector.js.map +1 -1
  28. package/dist/esm/audio/Envelope.d.ts +1 -1
  29. package/dist/esm/audio/Envelope.js +2 -2
  30. package/dist/esm/audio/Envelope.js.map +1 -1
  31. package/dist/esm/audio/Music.d.ts +1 -1
  32. package/dist/esm/audio/Music.js +1 -1
  33. package/dist/esm/audio/Music.js.map +1 -1
  34. package/dist/esm/audio/OscillatorSound.d.ts +2 -2
  35. package/dist/esm/audio/OscillatorSound.js.map +1 -1
  36. package/dist/esm/audio/Sound.d.ts +40 -2
  37. package/dist/esm/audio/Sound.js +69 -9
  38. package/dist/esm/audio/Sound.js.map +1 -1
  39. package/dist/esm/audio/audio-context.js +1 -1
  40. package/dist/esm/audio/audio-context.js.map +1 -1
  41. package/dist/esm/audio/crossFade.js +1 -1
  42. package/dist/esm/audio/crossFade.js.map +1 -1
  43. package/dist/esm/audio/dsp/mel.d.ts +2 -2
  44. package/dist/esm/audio/dsp/tempogram.d.ts +2 -2
  45. package/dist/esm/audio/filters/ChorusFilter.js +12 -4
  46. package/dist/esm/audio/filters/ChorusFilter.js.map +1 -1
  47. package/dist/esm/audio/filters/CompressorFilter.d.ts +9 -0
  48. package/dist/esm/audio/filters/CompressorFilter.js +11 -0
  49. package/dist/esm/audio/filters/CompressorFilter.js.map +1 -1
  50. package/dist/esm/audio/filters/DelayFilter.js.map +1 -1
  51. package/dist/esm/audio/filters/DuckingFilter.d.ts +1 -1
  52. package/dist/esm/audio/filters/DuckingFilter.js +13 -5
  53. package/dist/esm/audio/filters/DuckingFilter.js.map +1 -1
  54. package/dist/esm/audio/filters/EqualizerFilter.js.map +1 -1
  55. package/dist/esm/audio/filters/GranularFilter.js +30 -14
  56. package/dist/esm/audio/filters/GranularFilter.js.map +1 -1
  57. package/dist/esm/audio/filters/HighpassFilter.js.map +1 -1
  58. package/dist/esm/audio/filters/LowpassFilter.js.map +1 -1
  59. package/dist/esm/audio/filters/PitchShiftFilter.js +14 -10
  60. package/dist/esm/audio/filters/PitchShiftFilter.js.map +1 -1
  61. package/dist/esm/audio/filters/ReverbFilter.js.map +1 -1
  62. package/dist/esm/audio/filters/VocoderFilter.d.ts +2 -2
  63. package/dist/esm/audio/filters/VocoderFilter.js +20 -12
  64. package/dist/esm/audio/filters/VocoderFilter.js.map +1 -1
  65. package/dist/esm/audio/filters/WorkletFilter.js +5 -6
  66. package/dist/esm/audio/filters/WorkletFilter.js.map +1 -1
  67. package/dist/esm/audio/filters/index.d.ts +7 -7
  68. package/dist/esm/audio/index.d.ts +9 -9
  69. package/dist/esm/audio/worklet/registerWorklet.js +7 -3
  70. package/dist/esm/audio/worklet/registerWorklet.js.map +1 -1
  71. package/dist/esm/core/Application.d.ts +13 -13
  72. package/dist/esm/core/Application.js +24 -16
  73. package/dist/esm/core/Application.js.map +1 -1
  74. package/dist/esm/core/Bounds.d.ts +1 -1
  75. package/dist/esm/core/Bounds.js +1 -3
  76. package/dist/esm/core/Bounds.js.map +1 -1
  77. package/dist/esm/core/Clock.js +1 -1
  78. package/dist/esm/core/Clock.js.map +1 -1
  79. package/dist/esm/core/Color.js +2 -5
  80. package/dist/esm/core/Color.js.map +1 -1
  81. package/dist/esm/core/Scene.d.ts +10 -10
  82. package/dist/esm/core/Scene.js +1 -1
  83. package/dist/esm/core/Scene.js.map +1 -1
  84. package/dist/esm/core/SceneManager.d.ts +4 -4
  85. package/dist/esm/core/SceneManager.js +39 -33
  86. package/dist/esm/core/SceneManager.js.map +1 -1
  87. package/dist/esm/core/SceneNode.d.ts +8 -8
  88. package/dist/esm/core/SceneNode.js +39 -29
  89. package/dist/esm/core/SceneNode.js.map +1 -1
  90. package/dist/esm/core/Signal.d.ts +3 -3
  91. package/dist/esm/core/Signal.js +3 -3
  92. package/dist/esm/core/Signal.js.map +1 -1
  93. package/dist/esm/core/Time.js +6 -6
  94. package/dist/esm/core/Time.js.map +1 -1
  95. package/dist/esm/core/Timer.d.ts +1 -1
  96. package/dist/esm/core/Timer.js +1 -1
  97. package/dist/esm/core/Timer.js.map +1 -1
  98. package/dist/esm/core/capabilities.js +2 -4
  99. package/dist/esm/core/capabilities.js.map +1 -1
  100. package/dist/esm/core/index.d.ts +2 -2
  101. package/dist/esm/core/utils.d.ts +4 -4
  102. package/dist/esm/core/utils.js +10 -10
  103. package/dist/esm/core/utils.js.map +1 -1
  104. package/dist/esm/debug/BoundingBoxesLayer.d.ts +3 -3
  105. package/dist/esm/debug/BoundingBoxesLayer.js +6 -13
  106. package/dist/esm/debug/BoundingBoxesLayer.js.map +1 -1
  107. package/dist/esm/debug/DebugLayer.d.ts +1 -1
  108. package/dist/esm/debug/DebugLayer.js.map +1 -1
  109. package/dist/esm/debug/DebugOverlay.d.ts +2 -2
  110. package/dist/esm/debug/DebugOverlay.js +2 -2
  111. package/dist/esm/debug/DebugOverlay.js.map +1 -1
  112. package/dist/esm/debug/HitTestLayer.d.ts +3 -3
  113. package/dist/esm/debug/HitTestLayer.js +3 -10
  114. package/dist/esm/debug/HitTestLayer.js.map +1 -1
  115. package/dist/esm/debug/PerformanceLayer.d.ts +2 -2
  116. package/dist/esm/debug/PerformanceLayer.js +6 -6
  117. package/dist/esm/debug/PerformanceLayer.js.map +1 -1
  118. package/dist/esm/debug/PointerStackLayer.d.ts +3 -3
  119. package/dist/esm/debug/PointerStackLayer.js +3 -3
  120. package/dist/esm/debug/PointerStackLayer.js.map +1 -1
  121. package/dist/esm/debug/index.d.ts +3 -3
  122. package/dist/esm/debug/index.js +3 -3
  123. package/dist/esm/index.d.ts +1 -1
  124. package/dist/esm/index.js +106 -84
  125. package/dist/esm/index.js.map +1 -1
  126. package/dist/esm/input/ArcadeStickGamepadMapping.js.map +1 -1
  127. package/dist/esm/input/GameCubeGamepadMapping.d.ts +1 -1
  128. package/dist/esm/input/GameCubeGamepadMapping.js +1 -1
  129. package/dist/esm/input/GameCubeGamepadMapping.js.map +1 -1
  130. package/dist/esm/input/Gamepad.d.ts +7 -7
  131. package/dist/esm/input/Gamepad.js +10 -6
  132. package/dist/esm/input/Gamepad.js.map +1 -1
  133. package/dist/esm/input/GamepadAxis.js +1 -1
  134. package/dist/esm/input/GamepadAxis.js.map +1 -1
  135. package/dist/esm/input/GamepadButton.js +1 -1
  136. package/dist/esm/input/GamepadButton.js.map +1 -1
  137. package/dist/esm/input/GamepadDefinitions.d.ts +4 -4
  138. package/dist/esm/input/GamepadDefinitions.js +12 -14
  139. package/dist/esm/input/GamepadDefinitions.js.map +1 -1
  140. package/dist/esm/input/GamepadMapping.d.ts +5 -5
  141. package/dist/esm/input/GamepadMapping.js.map +1 -1
  142. package/dist/esm/input/GamepadPromptLayouts.d.ts +2 -2
  143. package/dist/esm/input/GamepadPromptLayouts.js +8 -8
  144. package/dist/esm/input/GamepadPromptLayouts.js.map +1 -1
  145. package/dist/esm/input/GenericDualAnalogGamepadMapping.js.map +1 -1
  146. package/dist/esm/input/GestureRecognizer.d.ts +1 -1
  147. package/dist/esm/input/GestureRecognizer.js.map +1 -1
  148. package/dist/esm/input/InputBinding.d.ts +3 -3
  149. package/dist/esm/input/InputBinding.js.map +1 -1
  150. package/dist/esm/input/InputManager.d.ts +9 -9
  151. package/dist/esm/input/InputManager.js +25 -16
  152. package/dist/esm/input/InputManager.js.map +1 -1
  153. package/dist/esm/input/InteractionEvent.d.ts +1 -1
  154. package/dist/esm/input/InteractionEvent.js.map +1 -1
  155. package/dist/esm/input/InteractionManager.d.ts +2 -2
  156. package/dist/esm/input/InteractionManager.js +25 -16
  157. package/dist/esm/input/InteractionManager.js.map +1 -1
  158. package/dist/esm/input/JoyConLeftGamepadMapping.js.map +1 -1
  159. package/dist/esm/input/JoyConRightGamepadMapping.js.map +1 -1
  160. package/dist/esm/input/PlayStationGamepadMapping.d.ts +1 -1
  161. package/dist/esm/input/PlayStationGamepadMapping.js +1 -1
  162. package/dist/esm/input/PlayStationGamepadMapping.js.map +1 -1
  163. package/dist/esm/input/Pointer.d.ts +2 -2
  164. package/dist/esm/input/Pointer.js +6 -6
  165. package/dist/esm/input/Pointer.js.map +1 -1
  166. package/dist/esm/input/SteamControllerGamepadMapping.d.ts +1 -1
  167. package/dist/esm/input/SteamControllerGamepadMapping.js +1 -1
  168. package/dist/esm/input/SteamControllerGamepadMapping.js.map +1 -1
  169. package/dist/esm/input/SteamDeckGamepadMapping.js.map +1 -1
  170. package/dist/esm/input/SwitchProGamepadMapping.d.ts +1 -1
  171. package/dist/esm/input/SwitchProGamepadMapping.js +1 -1
  172. package/dist/esm/input/SwitchProGamepadMapping.js.map +1 -1
  173. package/dist/esm/input/XboxGamepadMapping.d.ts +1 -1
  174. package/dist/esm/input/XboxGamepadMapping.js +1 -1
  175. package/dist/esm/input/XboxGamepadMapping.js.map +1 -1
  176. package/dist/esm/input/index.d.ts +16 -16
  177. package/dist/esm/input/interaction-hooks.js.map +1 -1
  178. package/dist/esm/input/types.js.map +1 -1
  179. package/dist/esm/math/AbstractVector.js +8 -9
  180. package/dist/esm/math/AbstractVector.js.map +1 -1
  181. package/dist/esm/math/Circle.d.ts +5 -5
  182. package/dist/esm/math/Circle.js +33 -21
  183. package/dist/esm/math/Circle.js.map +1 -1
  184. package/dist/esm/math/Collision.d.ts +2 -2
  185. package/dist/esm/math/Collision.js.map +1 -1
  186. package/dist/esm/math/Ellipse.d.ts +5 -5
  187. package/dist/esm/math/Ellipse.js +28 -19
  188. package/dist/esm/math/Ellipse.js.map +1 -1
  189. package/dist/esm/math/Flags.d.ts +4 -4
  190. package/dist/esm/math/Flags.js.map +1 -1
  191. package/dist/esm/math/Interval.js.map +1 -1
  192. package/dist/esm/math/Line.d.ts +5 -5
  193. package/dist/esm/math/Line.js +23 -15
  194. package/dist/esm/math/Line.js.map +1 -1
  195. package/dist/esm/math/Matrix.js +14 -16
  196. package/dist/esm/math/Matrix.js.map +1 -1
  197. package/dist/esm/math/ObservableSize.js.map +1 -1
  198. package/dist/esm/math/ObservableVector.d.ts +1 -1
  199. package/dist/esm/math/ObservableVector.js.map +1 -1
  200. package/dist/esm/math/PolarVector.js.map +1 -1
  201. package/dist/esm/math/Polygon.d.ts +11 -11
  202. package/dist/esm/math/Polygon.js +37 -26
  203. package/dist/esm/math/Polygon.js.map +1 -1
  204. package/dist/esm/math/PolygonLike.d.ts +1 -1
  205. package/dist/esm/math/Quadtree.js +2 -8
  206. package/dist/esm/math/Quadtree.js.map +1 -1
  207. package/dist/esm/math/Random.js +5 -5
  208. package/dist/esm/math/Random.js.map +1 -1
  209. package/dist/esm/math/Rectangle.d.ts +4 -4
  210. package/dist/esm/math/Rectangle.js +59 -41
  211. package/dist/esm/math/Rectangle.js.map +1 -1
  212. package/dist/esm/math/Segment.d.ts +1 -1
  213. package/dist/esm/math/Segment.js +4 -4
  214. package/dist/esm/math/Segment.js.map +1 -1
  215. package/dist/esm/math/ShapeLike.d.ts +1 -1
  216. package/dist/esm/math/Size.js +1 -2
  217. package/dist/esm/math/Size.js.map +1 -1
  218. package/dist/esm/math/Vector.d.ts +4 -4
  219. package/dist/esm/math/Vector.js +19 -13
  220. package/dist/esm/math/Vector.js.map +1 -1
  221. package/dist/esm/math/collision-detection.d.ts +3 -3
  222. package/dist/esm/math/collision-detection.js +49 -49
  223. package/dist/esm/math/collision-detection.js.map +1 -1
  224. package/dist/esm/math/collision-primitives.d.ts +8 -8
  225. package/dist/esm/math/collision-primitives.js +27 -33
  226. package/dist/esm/math/collision-primitives.js.map +1 -1
  227. package/dist/esm/math/geometry.d.ts +3 -3
  228. package/dist/esm/math/geometry.js +55 -48
  229. package/dist/esm/math/geometry.js.map +1 -1
  230. package/dist/esm/math/index.d.ts +16 -16
  231. package/dist/esm/math/swept-collision.d.ts +3 -3
  232. package/dist/esm/math/swept-collision.js +5 -8
  233. package/dist/esm/math/swept-collision.js.map +1 -1
  234. package/dist/esm/math/triangulate.js +34 -24
  235. package/dist/esm/math/triangulate.js.map +1 -1
  236. package/dist/esm/math/utils.d.ts +2 -2
  237. package/dist/esm/math/utils.js +7 -7
  238. package/dist/esm/math/utils.js.map +1 -1
  239. package/dist/esm/particles/ParticleSystem.d.ts +181 -84
  240. package/dist/esm/particles/ParticleSystem.js +460 -147
  241. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  242. package/dist/esm/particles/distributions/BoxArea.d.ts +17 -0
  243. package/dist/esm/particles/distributions/BoxArea.js +48 -0
  244. package/dist/esm/particles/distributions/BoxArea.js.map +1 -0
  245. package/dist/esm/particles/distributions/CircleArea.d.ts +19 -0
  246. package/dist/esm/particles/distributions/CircleArea.js +33 -0
  247. package/dist/esm/particles/distributions/CircleArea.js.map +1 -0
  248. package/dist/esm/particles/distributions/ConeDirection.d.ts +28 -0
  249. package/dist/esm/particles/distributions/ConeDirection.js +44 -0
  250. package/dist/esm/particles/distributions/ConeDirection.js.map +1 -0
  251. package/dist/esm/particles/distributions/Constant.d.ts +17 -0
  252. package/dist/esm/particles/distributions/Constant.js +35 -0
  253. package/dist/esm/particles/distributions/Constant.js.map +1 -0
  254. package/dist/esm/particles/distributions/Curve.d.ts +30 -0
  255. package/dist/esm/particles/distributions/Curve.js +53 -0
  256. package/dist/esm/particles/distributions/Curve.js.map +1 -0
  257. package/dist/esm/particles/distributions/Distribution.d.ts +45 -0
  258. package/dist/esm/particles/distributions/Gradient.d.ts +40 -0
  259. package/dist/esm/particles/distributions/Gradient.js +72 -0
  260. package/dist/esm/particles/distributions/Gradient.js.map +1 -0
  261. package/dist/esm/particles/distributions/LineSegment.d.ts +15 -0
  262. package/dist/esm/particles/distributions/LineSegment.js +27 -0
  263. package/dist/esm/particles/distributions/LineSegment.js.map +1 -0
  264. package/dist/esm/particles/distributions/Range.d.ts +12 -0
  265. package/dist/esm/particles/distributions/Range.js +19 -0
  266. package/dist/esm/particles/distributions/Range.js.map +1 -0
  267. package/dist/esm/particles/distributions/VectorRange.d.ts +20 -0
  268. package/dist/esm/particles/distributions/VectorRange.js +31 -0
  269. package/dist/esm/particles/distributions/VectorRange.js.map +1 -0
  270. package/dist/esm/particles/distributions/index.d.ts +12 -0
  271. package/dist/esm/particles/gpu/ParticleGpuState.d.ts +57 -0
  272. package/dist/esm/particles/gpu/ParticleGpuState.js +535 -0
  273. package/dist/esm/particles/gpu/ParticleGpuState.js.map +1 -0
  274. package/dist/esm/particles/index.d.ts +2 -10
  275. package/dist/esm/particles/modules/AlphaFadeOverLifetime.d.ts +24 -0
  276. package/dist/esm/particles/modules/AlphaFadeOverLifetime.js +60 -0
  277. package/dist/esm/particles/modules/AlphaFadeOverLifetime.js.map +1 -0
  278. package/dist/esm/particles/modules/ApplyForce.d.ts +20 -0
  279. package/dist/esm/particles/modules/ApplyForce.js +48 -0
  280. package/dist/esm/particles/modules/ApplyForce.js.map +1 -0
  281. package/dist/esm/particles/modules/AttractToPoint.d.ts +27 -0
  282. package/dist/esm/particles/modules/AttractToPoint.js +73 -0
  283. package/dist/esm/particles/modules/AttractToPoint.js.map +1 -0
  284. package/dist/esm/particles/modules/BurstSpawn.d.ts +53 -0
  285. package/dist/esm/particles/modules/BurstSpawn.js +94 -0
  286. package/dist/esm/particles/modules/BurstSpawn.js.map +1 -0
  287. package/dist/esm/particles/modules/ColorOverLifetime.d.ts +22 -0
  288. package/dist/esm/particles/modules/ColorOverLifetime.js +65 -0
  289. package/dist/esm/particles/modules/ColorOverLifetime.js.map +1 -0
  290. package/dist/esm/particles/modules/ColorOverSpeed.d.ts +27 -0
  291. package/dist/esm/particles/modules/ColorOverSpeed.js +86 -0
  292. package/dist/esm/particles/modules/ColorOverSpeed.js.map +1 -0
  293. package/dist/esm/particles/modules/DeathModule.d.ts +24 -0
  294. package/dist/esm/particles/modules/DeathModule.js +25 -0
  295. package/dist/esm/particles/modules/DeathModule.js.map +1 -0
  296. package/dist/esm/particles/modules/Drag.d.ts +20 -0
  297. package/dist/esm/particles/modules/Drag.js +43 -0
  298. package/dist/esm/particles/modules/Drag.js.map +1 -0
  299. package/dist/esm/particles/modules/OrbitalForce.d.ts +28 -0
  300. package/dist/esm/particles/modules/OrbitalForce.js +65 -0
  301. package/dist/esm/particles/modules/OrbitalForce.js.map +1 -0
  302. package/dist/esm/particles/modules/RateSpawn.d.ts +41 -0
  303. package/dist/esm/particles/modules/RateSpawn.js +76 -0
  304. package/dist/esm/particles/modules/RateSpawn.js.map +1 -0
  305. package/dist/esm/particles/modules/RepelFromPoint.d.ts +24 -0
  306. package/dist/esm/particles/modules/RepelFromPoint.js +76 -0
  307. package/dist/esm/particles/modules/RepelFromPoint.js.map +1 -0
  308. package/dist/esm/particles/modules/RotateOverLifetime.d.ts +20 -0
  309. package/dist/esm/particles/modules/RotateOverLifetime.js +41 -0
  310. package/dist/esm/particles/modules/RotateOverLifetime.js.map +1 -0
  311. package/dist/esm/particles/modules/ScaleOverLifetime.d.ts +26 -0
  312. package/dist/esm/particles/modules/ScaleOverLifetime.js +59 -0
  313. package/dist/esm/particles/modules/ScaleOverLifetime.js.map +1 -0
  314. package/dist/esm/particles/modules/SpawnModule.d.ts +30 -0
  315. package/dist/esm/particles/modules/SpawnModule.js +31 -0
  316. package/dist/esm/particles/modules/SpawnModule.js.map +1 -0
  317. package/dist/esm/particles/modules/SpawnOnDeath.d.ts +24 -0
  318. package/dist/esm/particles/modules/SpawnOnDeath.js +47 -0
  319. package/dist/esm/particles/modules/SpawnOnDeath.js.map +1 -0
  320. package/dist/esm/particles/modules/Turbulence.d.ts +30 -0
  321. package/dist/esm/particles/modules/Turbulence.js +122 -0
  322. package/dist/esm/particles/modules/Turbulence.js.map +1 -0
  323. package/dist/esm/particles/modules/UpdateModule.d.ts +95 -0
  324. package/dist/esm/particles/modules/UpdateModule.js +66 -0
  325. package/dist/esm/particles/modules/UpdateModule.js.map +1 -0
  326. package/dist/esm/particles/modules/VelocityOverLifetime.d.ts +30 -0
  327. package/dist/esm/particles/modules/VelocityOverLifetime.js +84 -0
  328. package/dist/esm/particles/modules/VelocityOverLifetime.js.map +1 -0
  329. package/dist/esm/particles/modules/WgslContribution.d.ts +81 -0
  330. package/dist/esm/particles/modules/WgslContribution.js +34 -0
  331. package/dist/esm/particles/modules/WgslContribution.js.map +1 -0
  332. package/dist/esm/particles/modules/index.d.ts +22 -0
  333. package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
  334. package/dist/esm/rendering/Container.d.ts +2 -2
  335. package/dist/esm/rendering/Container.js +10 -11
  336. package/dist/esm/rendering/Container.js.map +1 -1
  337. package/dist/esm/rendering/Drawable.js.map +1 -1
  338. package/dist/esm/rendering/RenderBackend.d.ts +6 -6
  339. package/dist/esm/rendering/RenderBackendType.js.map +1 -1
  340. package/dist/esm/rendering/RenderNode.d.ts +10 -10
  341. package/dist/esm/rendering/RenderNode.js +31 -31
  342. package/dist/esm/rendering/RenderNode.js.map +1 -1
  343. package/dist/esm/rendering/RenderStats.js.map +1 -1
  344. package/dist/esm/rendering/RenderTarget.d.ts +2 -2
  345. package/dist/esm/rendering/RenderTarget.js +5 -5
  346. package/dist/esm/rendering/RenderTarget.js.map +1 -1
  347. package/dist/esm/rendering/RenderTargetPass.d.ts +3 -3
  348. package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
  349. package/dist/esm/rendering/Renderer.d.ts +2 -2
  350. package/dist/esm/rendering/RendererRegistry.d.ts +3 -3
  351. package/dist/esm/rendering/RendererRegistry.js +2 -3
  352. package/dist/esm/rendering/RendererRegistry.js.map +1 -1
  353. package/dist/esm/rendering/View.d.ts +3 -3
  354. package/dist/esm/rendering/View.js +17 -20
  355. package/dist/esm/rendering/View.js.map +1 -1
  356. package/dist/esm/rendering/filters/BlurFilter.d.ts +1 -1
  357. package/dist/esm/rendering/filters/BlurFilter.js +4 -9
  358. package/dist/esm/rendering/filters/BlurFilter.js.map +1 -1
  359. package/dist/esm/rendering/filters/ColorFilter.d.ts +1 -1
  360. package/dist/esm/rendering/filters/ColorFilter.js +3 -9
  361. package/dist/esm/rendering/filters/ColorFilter.js.map +1 -1
  362. package/dist/esm/rendering/filters/Filter.d.ts +1 -1
  363. package/dist/esm/rendering/filters/Filter.js.map +1 -1
  364. package/dist/esm/rendering/filters/LutFilter.d.ts +87 -0
  365. package/dist/esm/rendering/filters/LutFilter.js +261 -0
  366. package/dist/esm/rendering/filters/LutFilter.js.map +1 -0
  367. package/dist/esm/rendering/filters/WebGl2ShaderFilter.d.ts +2 -2
  368. package/dist/esm/rendering/filters/WebGl2ShaderFilter.js +7 -14
  369. package/dist/esm/rendering/filters/WebGl2ShaderFilter.js.map +1 -1
  370. package/dist/esm/rendering/filters/WebGpuShaderFilter.d.ts +1 -1
  371. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +11 -10
  372. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
  373. package/dist/esm/rendering/index.d.ts +28 -27
  374. package/dist/esm/rendering/mesh/Mesh.d.ts +49 -1
  375. package/dist/esm/rendering/mesh/Mesh.js +3 -1
  376. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  377. package/dist/esm/rendering/primitives/Graphics.d.ts +3 -3
  378. package/dist/esm/rendering/primitives/Graphics.js +12 -12
  379. package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
  380. package/dist/esm/rendering/shader/Shader.js.map +1 -1
  381. package/dist/esm/rendering/shader/ShaderAttribute.js.map +1 -1
  382. package/dist/esm/rendering/shader/ShaderUniform.js.map +1 -1
  383. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js +6 -8
  384. package/dist/esm/rendering/shader/upgradeFragmentShaderToGl300.js.map +1 -1
  385. package/dist/esm/rendering/sprite/AnimatedSprite.d.ts +3 -3
  386. package/dist/esm/rendering/sprite/AnimatedSprite.js.map +1 -1
  387. package/dist/esm/rendering/sprite/Sprite.d.ts +4 -4
  388. package/dist/esm/rendering/sprite/Sprite.js +51 -35
  389. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  390. package/dist/esm/rendering/sprite/Spritesheet.d.ts +5 -9
  391. package/dist/esm/rendering/sprite/Spritesheet.js +1 -1
  392. package/dist/esm/rendering/sprite/Spritesheet.js.map +1 -1
  393. package/dist/esm/rendering/text/DynamicGlyphAtlas.js +3 -9
  394. package/dist/esm/rendering/text/DynamicGlyphAtlas.js.map +1 -1
  395. package/dist/esm/rendering/text/Text.js +9 -9
  396. package/dist/esm/rendering/text/Text.js.map +1 -1
  397. package/dist/esm/rendering/text/TextLayout.d.ts +2 -2
  398. package/dist/esm/rendering/text/TextLayout.js.map +1 -1
  399. package/dist/esm/rendering/text/TextStyle.js.map +1 -1
  400. package/dist/esm/rendering/text/atlas-singleton.js.map +1 -1
  401. package/dist/esm/rendering/texture/RenderTexture.d.ts +1 -1
  402. package/dist/esm/rendering/texture/RenderTexture.js +4 -1
  403. package/dist/esm/rendering/texture/RenderTexture.js.map +1 -1
  404. package/dist/esm/rendering/texture/Sampler.js.map +1 -1
  405. package/dist/esm/rendering/texture/Texture.d.ts +2 -2
  406. package/dist/esm/rendering/texture/Texture.js +8 -5
  407. package/dist/esm/rendering/texture/Texture.js.map +1 -1
  408. package/dist/esm/rendering/types.js.map +1 -1
  409. package/dist/esm/rendering/utils.js.map +1 -1
  410. package/dist/esm/rendering/video/Video.d.ts +3 -3
  411. package/dist/esm/rendering/video/Video.js +7 -6
  412. package/dist/esm/rendering/video/Video.js.map +1 -1
  413. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts +6 -6
  414. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +7 -10
  415. package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
  416. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.d.ts +1 -1
  417. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js +1 -2
  418. package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js.map +1 -1
  419. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +11 -11
  420. package/dist/esm/rendering/webgl2/WebGl2Backend.js +19 -21
  421. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  422. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.d.ts +2 -2
  423. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js +6 -8
  424. package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js.map +1 -1
  425. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +7 -4
  426. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +110 -43
  427. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  428. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +10 -15
  429. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +100 -79
  430. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -1
  431. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.d.ts +1 -1
  432. package/dist/esm/rendering/webgl2/WebGl2RenderBuffer.js.map +1 -1
  433. package/dist/esm/rendering/webgl2/WebGl2ShaderBlock.js.map +1 -1
  434. package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js.map +1 -1
  435. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js +54 -22
  436. package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js.map +1 -1
  437. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +1 -1
  438. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +11 -14
  439. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  440. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.d.ts +1 -1
  441. package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js.map +1 -1
  442. package/dist/esm/rendering/webgl2/glsl/particle.vert.js +1 -1
  443. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.d.ts +1 -1
  444. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js +1 -2
  445. package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js.map +1 -1
  446. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +7 -7
  447. package/dist/esm/rendering/webgpu/WebGpuBackend.js +44 -30
  448. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  449. package/dist/esm/rendering/webgpu/WebGpuBlendState.js.map +1 -1
  450. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.d.ts +2 -2
  451. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +1 -3
  452. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
  453. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +2 -2
  454. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +25 -23
  455. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  456. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +10 -1
  457. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +204 -76
  458. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
  459. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +2 -2
  460. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +45 -45
  461. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  462. package/dist/esm/rendering/webgpu/compute/WebGpuComputePipeline.d.ts +52 -0
  463. package/dist/esm/rendering/webgpu/compute/WebGpuStorageBuffer.d.ts +29 -0
  464. package/dist/esm/rendering/webgpu/compute/index.d.ts +3 -0
  465. package/dist/esm/resources/AbstractAssetFactory.d.ts +1 -1
  466. package/dist/esm/resources/AbstractAssetFactory.js.map +1 -1
  467. package/dist/esm/resources/AssetManifest.d.ts +1 -1
  468. package/dist/esm/resources/AssetManifest.js +2 -2
  469. package/dist/esm/resources/AssetManifest.js.map +1 -1
  470. package/dist/esm/resources/CacheFirstStrategy.d.ts +2 -2
  471. package/dist/esm/resources/CacheFirstStrategy.js.map +1 -1
  472. package/dist/esm/resources/CacheStrategy.d.ts +1 -1
  473. package/dist/esm/resources/FactoryRegistry.d.ts +1 -1
  474. package/dist/esm/resources/FactoryRegistry.js +2 -3
  475. package/dist/esm/resources/FactoryRegistry.js.map +1 -1
  476. package/dist/esm/resources/IndexedDbDatabase.d.ts +1 -1
  477. package/dist/esm/resources/IndexedDbDatabase.js +11 -14
  478. package/dist/esm/resources/IndexedDbDatabase.js.map +1 -1
  479. package/dist/esm/resources/IndexedDbStore.d.ts +1 -1
  480. package/dist/esm/resources/IndexedDbStore.js +2 -7
  481. package/dist/esm/resources/IndexedDbStore.js.map +1 -1
  482. package/dist/esm/resources/Loader.d.ts +9 -9
  483. package/dist/esm/resources/Loader.js +48 -35
  484. package/dist/esm/resources/Loader.js.map +1 -1
  485. package/dist/esm/resources/NetworkOnlyStrategy.d.ts +2 -2
  486. package/dist/esm/resources/NetworkOnlyStrategy.js.map +1 -1
  487. package/dist/esm/resources/factories/BinaryFactory.js.map +1 -1
  488. package/dist/esm/resources/factories/FontFactory.js +1 -1
  489. package/dist/esm/resources/factories/FontFactory.js.map +1 -1
  490. package/dist/esm/resources/factories/ImageFactory.js +4 -4
  491. package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
  492. package/dist/esm/resources/factories/JsonFactory.d.ts +1 -1
  493. package/dist/esm/resources/factories/JsonFactory.js +1 -1
  494. package/dist/esm/resources/factories/JsonFactory.js.map +1 -1
  495. package/dist/esm/resources/factories/MusicFactory.d.ts +1 -1
  496. package/dist/esm/resources/factories/MusicFactory.js +4 -4
  497. package/dist/esm/resources/factories/MusicFactory.js.map +1 -1
  498. package/dist/esm/resources/factories/SoundFactory.d.ts +1 -1
  499. package/dist/esm/resources/factories/SoundFactory.js +3 -3
  500. package/dist/esm/resources/factories/SoundFactory.js.map +1 -1
  501. package/dist/esm/resources/factories/SvgFactory.js +3 -3
  502. package/dist/esm/resources/factories/SvgFactory.js.map +1 -1
  503. package/dist/esm/resources/factories/TextFactory.js +1 -1
  504. package/dist/esm/resources/factories/TextFactory.js.map +1 -1
  505. package/dist/esm/resources/factories/TextureFactory.d.ts +1 -1
  506. package/dist/esm/resources/factories/TextureFactory.js +3 -3
  507. package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
  508. package/dist/esm/resources/factories/VideoFactory.d.ts +2 -2
  509. package/dist/esm/resources/factories/VideoFactory.js +5 -5
  510. package/dist/esm/resources/factories/VideoFactory.js.map +1 -1
  511. package/dist/esm/resources/factories/VttFactory.d.ts +2 -2
  512. package/dist/esm/resources/factories/VttFactory.js +6 -6
  513. package/dist/esm/resources/factories/VttFactory.js.map +1 -1
  514. package/dist/esm/resources/factories/WasmFactory.js.map +1 -1
  515. package/dist/esm/resources/index.d.ts +11 -11
  516. package/dist/esm/resources/utils.js +30 -25
  517. package/dist/esm/resources/utils.js.map +1 -1
  518. package/dist/exo.esm.js +26438 -23869
  519. package/dist/exo.esm.js.map +1 -1
  520. package/package.json +15 -4
  521. package/dist/esm/particles/Particle.d.ts +0 -77
  522. package/dist/esm/particles/Particle.js +0 -143
  523. package/dist/esm/particles/Particle.js.map +0 -1
  524. package/dist/esm/particles/ParticleProperties.d.ts +0 -29
  525. package/dist/esm/particles/affectors/ColorAffector.d.ts +0 -30
  526. package/dist/esm/particles/affectors/ColorAffector.js +0 -55
  527. package/dist/esm/particles/affectors/ColorAffector.js.map +0 -1
  528. package/dist/esm/particles/affectors/ForceAffector.d.ts +0 -24
  529. package/dist/esm/particles/affectors/ForceAffector.js +0 -39
  530. package/dist/esm/particles/affectors/ForceAffector.js.map +0 -1
  531. package/dist/esm/particles/affectors/ParticleAffector.d.ts +0 -19
  532. package/dist/esm/particles/affectors/ScaleAffector.d.ts +0 -23
  533. package/dist/esm/particles/affectors/ScaleAffector.js +0 -38
  534. package/dist/esm/particles/affectors/ScaleAffector.js.map +0 -1
  535. package/dist/esm/particles/affectors/TorqueAffector.d.ts +0 -23
  536. package/dist/esm/particles/affectors/TorqueAffector.js +0 -37
  537. package/dist/esm/particles/affectors/TorqueAffector.js.map +0 -1
  538. package/dist/esm/particles/emitters/ParticleEmitter.d.ts +0 -19
  539. package/dist/esm/particles/emitters/ParticleOptions.d.ts +0 -62
  540. package/dist/esm/particles/emitters/ParticleOptions.js +0 -120
  541. package/dist/esm/particles/emitters/ParticleOptions.js.map +0 -1
  542. package/dist/esm/particles/emitters/UniversalEmitter.d.ts +0 -40
  543. package/dist/esm/particles/emitters/UniversalEmitter.js +0 -68
  544. package/dist/esm/particles/emitters/UniversalEmitter.js.map +0 -1
@@ -0,0 +1,86 @@
1
+ import { Color } from '../../core/Color.js';
2
+ import { UpdateModule } from './UpdateModule.js';
3
+
4
+ /// <reference types="@webgpu/types" />
5
+ const lookupSize = 256;
6
+ /**
7
+ * Per-frame, per-particle color sampler driven by velocity magnitude rather
8
+ * than lifetime ratio. Each live particle's tint is set to the gradient
9
+ * evaluated at `clamp((|velocity| - minSpeed) / (maxSpeed - minSpeed), 0, 1)`.
10
+ *
11
+ * Use cases: heat-mapping (slow=blue, fast=red), velocity-tinted trails,
12
+ * speed-gated highlights.
13
+ *
14
+ * GPU-eligible: gradient uploaded as a 256-tap 1D RGBA8 texture, sampled
15
+ * with linear filtering. Replaces the full color word — pair with a
16
+ * separate {@link AlphaFadeOverLifetime} after this module if you want to
17
+ * keep alpha controlled by lifetime.
18
+ */
19
+ class ColorOverSpeed extends UpdateModule {
20
+ gradient;
21
+ minSpeed;
22
+ maxSpeed;
23
+ constructor(gradient, minSpeed, maxSpeed) {
24
+ super();
25
+ this.gradient = gradient;
26
+ this.minSpeed = minSpeed;
27
+ this.maxSpeed = maxSpeed;
28
+ }
29
+ apply(system, _dt) {
30
+ const { velX, velY, color, liveCount } = system;
31
+ const gradient = this.gradient;
32
+ const min = this.minSpeed;
33
+ const span = Math.max(1e-5, this.maxSpeed - this.minSpeed);
34
+ for (let i = 0; i < liveCount; i++) {
35
+ const speed = Math.sqrt(velX[i] * velX[i] + velY[i] * velY[i]);
36
+ const t = Math.max(0, Math.min(1, (speed - min) / span));
37
+ color[i] = gradient.evaluateRgba(t);
38
+ }
39
+ }
40
+ wgsl() {
41
+ return {
42
+ key: 'ColorOverSpeed',
43
+ uniforms: [
44
+ { name: 'minSpeed', type: 'f32' },
45
+ { name: 'invSpan', type: 'f32' },
46
+ ],
47
+ textures: [{ name: 'gradient', format: 'rgba8unorm' }],
48
+ body: `
49
+ let speedMag = length(velocities[idx]);
50
+ let speedT = clamp((speedMag - modules.u_ColorOverSpeed.minSpeed) * modules.u_ColorOverSpeed.invSpan, 0.0, 1.0);
51
+ let speedSample = textureSampleLevel(u_ColorOverSpeed_gradient, u_ColorOverSpeed_gradient_sampler, speedT, 0.0);
52
+ let speedR = u32(speedSample.r * 255.0) & 255u;
53
+ let speedG = u32(speedSample.g * 255.0) & 255u;
54
+ let speedB = u32(speedSample.b * 255.0) & 255u;
55
+ let speedA = u32(speedSample.a * 255.0) & 255u;
56
+ color[idx] = (speedA << 24u) | (speedB << 16u) | (speedG << 8u) | speedR;
57
+ `,
58
+ };
59
+ }
60
+ writeUniforms(view, offset) {
61
+ const span = Math.max(1e-5, this.maxSpeed - this.minSpeed);
62
+ view.setFloat32(offset + 0, this.minSpeed, true);
63
+ view.setFloat32(offset + 4, 1 / span, true);
64
+ }
65
+ uploadTextures(device, textures) {
66
+ const texture = textures.get('gradient');
67
+ if (texture === undefined) {
68
+ return;
69
+ }
70
+ const data = new Uint8Array(lookupSize * 4);
71
+ const scratch = new Color();
72
+ for (let i = 0; i < lookupSize; i++) {
73
+ const t = i / (lookupSize - 1);
74
+ this.gradient.evaluate(t, scratch);
75
+ const o = i * 4;
76
+ data[o + 0] = scratch.r & 255;
77
+ data[o + 1] = scratch.g & 255;
78
+ data[o + 2] = scratch.b & 255;
79
+ data[o + 3] = ((scratch.a * 255) | 0) & 255;
80
+ }
81
+ device.queue.writeTexture({ texture }, data.buffer, { offset: 0, bytesPerRow: lookupSize * 4, rowsPerImage: 1 }, { width: lookupSize, height: 1, depthOrArrayLayers: 1 });
82
+ }
83
+ }
84
+
85
+ export { ColorOverSpeed };
86
+ //# sourceMappingURL=ColorOverSpeed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColorOverSpeed.js","sources":["../../../../../src/particles/modules/ColorOverSpeed.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ParticleSystem } from '@/particles/ParticleSystem';
2
+ /**
3
+ * Per-particle hook invoked exactly once when a particle expires, before
4
+ * its slot is recycled by the compaction pass. The dying particle's data
5
+ * is still readable at `system.posX[slot]` etc.
6
+ *
7
+ * Use for sub-emitters (spawn child particles where this one died), event
8
+ * dispatch (trigger an audio cue, score event), or trail termination.
9
+ *
10
+ * Implementation pattern:
11
+ *
12
+ * ```ts
13
+ * onDeath(system, slot) {
14
+ * const x = system.posX[slot];
15
+ * const y = system.posY[slot];
16
+ * this._childSystem.spawnBurstAt(x, y, 8);
17
+ * }
18
+ * ```
19
+ */
20
+ export declare abstract class DeathModule {
21
+ abstract onDeath(system: ParticleSystem, slot: number): void;
22
+ /** Optional cleanup hook called from `ParticleSystem.destroy`. */
23
+ destroy(): void;
24
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Per-particle hook invoked exactly once when a particle expires, before
3
+ * its slot is recycled by the compaction pass. The dying particle's data
4
+ * is still readable at `system.posX[slot]` etc.
5
+ *
6
+ * Use for sub-emitters (spawn child particles where this one died), event
7
+ * dispatch (trigger an audio cue, score event), or trail termination.
8
+ *
9
+ * Implementation pattern:
10
+ *
11
+ * ```ts
12
+ * onDeath(system, slot) {
13
+ * const x = system.posX[slot];
14
+ * const y = system.posY[slot];
15
+ * this._childSystem.spawnBurstAt(x, y, 8);
16
+ * }
17
+ * ```
18
+ */
19
+ class DeathModule {
20
+ /** Optional cleanup hook called from `ParticleSystem.destroy`. */
21
+ destroy() { }
22
+ }
23
+
24
+ export { DeathModule };
25
+ //# sourceMappingURL=DeathModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeathModule.js","sources":["../../../../../src/particles/modules/DeathModule.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;AAiBG;MACmB,WAAW,CAAA;;AAGxB,IAAA,OAAO,KAAU;AACzB;;;;"}
@@ -0,0 +1,20 @@
1
+ import type { ParticleSystem } from '@/particles/ParticleSystem';
2
+ import { UpdateModule } from './UpdateModule';
3
+ import type { WgslContribution } from './WgslContribution';
4
+ /**
5
+ * Exponential velocity damping. Each frame multiplies every live particle's
6
+ * velocity by `(1 - drag * dt)`, simulating linear air resistance.
7
+ *
8
+ * `drag = 0` is no damping; `drag = 1` halves velocity in ~1 second; higher
9
+ * values slow particles faster. Negative values accelerate (don't do that
10
+ * unless you mean it).
11
+ *
12
+ * GPU-eligible.
13
+ */
14
+ export declare class Drag extends UpdateModule {
15
+ drag: number;
16
+ constructor(drag: number);
17
+ apply(system: ParticleSystem, dt: number): void;
18
+ wgsl(): WgslContribution;
19
+ writeUniforms(view: DataView, offset: number): void;
20
+ }
@@ -0,0 +1,43 @@
1
+ import { UpdateModule } from './UpdateModule.js';
2
+
3
+ /**
4
+ * Exponential velocity damping. Each frame multiplies every live particle's
5
+ * velocity by `(1 - drag * dt)`, simulating linear air resistance.
6
+ *
7
+ * `drag = 0` is no damping; `drag = 1` halves velocity in ~1 second; higher
8
+ * values slow particles faster. Negative values accelerate (don't do that
9
+ * unless you mean it).
10
+ *
11
+ * GPU-eligible.
12
+ */
13
+ class Drag extends UpdateModule {
14
+ drag;
15
+ constructor(drag) {
16
+ super();
17
+ this.drag = drag;
18
+ }
19
+ apply(system, dt) {
20
+ const { velX, velY, liveCount } = system;
21
+ const factor = 1 - this.drag * dt;
22
+ for (let i = 0; i < liveCount; i++) {
23
+ velX[i] *= factor;
24
+ velY[i] *= factor;
25
+ }
26
+ }
27
+ wgsl() {
28
+ return {
29
+ key: 'Drag',
30
+ uniforms: [{ name: 'drag', type: 'f32' }],
31
+ body: `
32
+ let dragFactor = 1.0 - modules.u_Drag.drag * dt;
33
+ velocities[idx] = velocities[idx] * dragFactor;
34
+ `,
35
+ };
36
+ }
37
+ writeUniforms(view, offset) {
38
+ view.setFloat32(offset + 0, this.drag, true);
39
+ }
40
+ }
41
+
42
+ export { Drag };
43
+ //# sourceMappingURL=Drag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Drag.js","sources":["../../../../../src/particles/modules/Drag.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA;;;;;;;;;AASG;AACG,MAAO,IAAK,SAAQ,YAAY,CAAA;AAC7B,IAAA,IAAI;AAEX,IAAA,WAAA,CAAmB,IAAY,EAAA;AAC7B,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;IAClB;IAEgB,KAAK,CAAC,MAAsB,EAAE,EAAU,EAAA;QACtD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM;QACxC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;AAEjC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;AAClC,YAAA,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM;AACjB,YAAA,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM;QACnB;IACF;IAEgB,IAAI,GAAA;QAClB,OAAO;AACL,YAAA,GAAG,EAAE,MAAM;YACX,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzC,YAAA,IAAI,EAAE;;;AAGC,YAAA,CAAA;SACR;IACH;IAEgB,aAAa,CAAC,IAAc,EAAE,MAAc,EAAA;AAC1D,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;IAC9C;AACD;;;;"}
@@ -0,0 +1,28 @@
1
+ import type { ParticleSystem } from '@/particles/ParticleSystem';
2
+ import { UpdateModule } from './UpdateModule';
3
+ import type { WgslContribution } from './WgslContribution';
4
+ /**
5
+ * Applies a tangential acceleration around a center point — perpendicular
6
+ * to the radial vector `(particle − center)`. Combined with an attract /
7
+ * repel module that controls the radial distance, this produces orbital,
8
+ * spiral, or vortex motion.
9
+ *
10
+ * `angularSpeed` is the target angular velocity in radians/second. The
11
+ * effective tangential acceleration scales with `radius * angularSpeed`,
12
+ * so distant particles get pushed harder (matching uniform circular
13
+ * motion). Positive values orbit counter-clockwise, negative clockwise.
14
+ *
15
+ * Use cases: galactic spirals, smoke vortices around an attractor, wind
16
+ * eddies. Layer with {@link AttractToPoint} for stable orbits.
17
+ *
18
+ * GPU-eligible.
19
+ */
20
+ export declare class OrbitalForce extends UpdateModule {
21
+ x: number;
22
+ y: number;
23
+ angularSpeed: number;
24
+ constructor(x: number, y: number, angularSpeed: number);
25
+ apply(system: ParticleSystem, dt: number): void;
26
+ wgsl(): WgslContribution;
27
+ writeUniforms(view: DataView, offset: number): void;
28
+ }
@@ -0,0 +1,65 @@
1
+ import { UpdateModule } from './UpdateModule.js';
2
+
3
+ /**
4
+ * Applies a tangential acceleration around a center point — perpendicular
5
+ * to the radial vector `(particle − center)`. Combined with an attract /
6
+ * repel module that controls the radial distance, this produces orbital,
7
+ * spiral, or vortex motion.
8
+ *
9
+ * `angularSpeed` is the target angular velocity in radians/second. The
10
+ * effective tangential acceleration scales with `radius * angularSpeed`,
11
+ * so distant particles get pushed harder (matching uniform circular
12
+ * motion). Positive values orbit counter-clockwise, negative clockwise.
13
+ *
14
+ * Use cases: galactic spirals, smoke vortices around an attractor, wind
15
+ * eddies. Layer with {@link AttractToPoint} for stable orbits.
16
+ *
17
+ * GPU-eligible.
18
+ */
19
+ class OrbitalForce extends UpdateModule {
20
+ x;
21
+ y;
22
+ angularSpeed;
23
+ constructor(x, y, angularSpeed) {
24
+ super();
25
+ this.x = x;
26
+ this.y = y;
27
+ this.angularSpeed = angularSpeed;
28
+ }
29
+ apply(system, dt) {
30
+ const { posX, posY, velX, velY, liveCount } = system;
31
+ const { x, y, angularSpeed } = this;
32
+ const omega = angularSpeed * dt;
33
+ for (let i = 0; i < liveCount; i++) {
34
+ const dx = posX[i] - x;
35
+ const dy = posY[i] - y;
36
+ // Perpendicular vector: (-dy, dx) for counter-clockwise.
37
+ velX[i] += -dy * omega;
38
+ velY[i] += dx * omega;
39
+ }
40
+ }
41
+ wgsl() {
42
+ return {
43
+ key: 'OrbitalForce',
44
+ uniforms: [
45
+ { name: 'center', type: 'vec2<f32>' },
46
+ { name: 'angularSpeed', type: 'f32' },
47
+ { name: '_pad0', type: 'f32' },
48
+ ],
49
+ body: `
50
+ let orbitDelta = positions[idx] - modules.u_OrbitalForce.center;
51
+ let orbitOmega = modules.u_OrbitalForce.angularSpeed * dt;
52
+ velocities[idx] = velocities[idx] + vec2<f32>(-orbitDelta.y, orbitDelta.x) * orbitOmega;
53
+ `,
54
+ };
55
+ }
56
+ writeUniforms(view, offset) {
57
+ view.setFloat32(offset + 0, this.x, true);
58
+ view.setFloat32(offset + 4, this.y, true);
59
+ view.setFloat32(offset + 8, this.angularSpeed, true);
60
+ view.setFloat32(offset + 12, 0, true);
61
+ }
62
+ }
63
+
64
+ export { OrbitalForce };
65
+ //# sourceMappingURL=OrbitalForce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrbitalForce.js","sources":["../../../../../src/particles/modules/OrbitalForce.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA;;;;;;;;;;;;;;;AAeG;AACG,MAAO,YAAa,SAAQ,YAAY,CAAA;AACrC,IAAA,CAAC;AACD,IAAA,CAAC;AACD,IAAA,YAAY;AAEnB,IAAA,WAAA,CAAmB,CAAS,EAAE,CAAS,EAAE,YAAoB,EAAA;AAC3D,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,CAAC,GAAG,CAAC;AACV,QAAA,IAAI,CAAC,CAAC,GAAG,CAAC;AACV,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;IAClC;IAEgB,KAAK,CAAC,MAAsB,EAAE,EAAU,EAAA;AACtD,QAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM;QACpD,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI;AACnC,QAAA,MAAM,KAAK,GAAG,YAAY,GAAG,EAAE;AAE/B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;YAClC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACtB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;;YAEtB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK;AACtB,YAAA,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK;QACvB;IACF;IAEgB,IAAI,GAAA;QAClB,OAAO;AACL,YAAA,GAAG,EAAE,cAAc;AACnB,YAAA,QAAQ,EAAE;AACR,gBAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;AACrC,gBAAA,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE;AACrC,gBAAA,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;AAC/B,aAAA;AACD,YAAA,IAAI,EAAE;;;;AAIC,YAAA,CAAA;SACR;IACH;IAEgB,aAAa,CAAC,IAAc,EAAE,MAAc,EAAA;AAC1D,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AACzC,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AACzC,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;IACvC;AACD;;;;"}
@@ -0,0 +1,41 @@
1
+ import { Color } from '@/core/Color';
2
+ import { Vector } from '@/math/Vector';
3
+ import type { Distribution } from '@/particles/distributions/Distribution';
4
+ import type { ParticleSystem } from '@/particles/ParticleSystem';
5
+ import { SpawnModule } from './SpawnModule';
6
+ /**
7
+ * Per-property spawn configuration. Every entry is a {@link Distribution}
8
+ * sampled once per spawned particle. Omitting an entry leaves the slot's
9
+ * field at its zero/default value (zero position/velocity/rotation, unit
10
+ * scale, opaque white, lifetime 1 s).
11
+ */
12
+ export interface RateSpawnConfig {
13
+ /** Particles emitted per second. Sampled each frame. */
14
+ rate: Distribution<number>;
15
+ /** Total lifetime in seconds. Required — drives expiry. Default 1. */
16
+ lifetime?: Distribution<number>;
17
+ position?: Distribution<Vector>;
18
+ velocity?: Distribution<Vector>;
19
+ scale?: Distribution<Vector>;
20
+ rotation?: Distribution<number>;
21
+ rotationSpeed?: Distribution<number>;
22
+ /** Initial tint at spawn. For per-frame fade use a `ColorOverLifetime` update module. */
23
+ tint?: Distribution<Color>;
24
+ textureIndex?: Distribution<number>;
25
+ }
26
+ /**
27
+ * Continuous, rate-based spawner. Emits a {@link RateSpawnConfig.rate}
28
+ * sample per second; sub-frame fractions accumulate so low rates (e.g.
29
+ * 0.5 particles/s) remain accurate over time.
30
+ *
31
+ * Each property is independently randomised via its {@link Distribution}.
32
+ * Every spawned particle gets a fresh sample for every configured field.
33
+ */
34
+ export declare class RateSpawn extends SpawnModule {
35
+ config: RateSpawnConfig;
36
+ private _accumulator;
37
+ private readonly _vec;
38
+ private readonly _color;
39
+ constructor(config: RateSpawnConfig);
40
+ apply(system: ParticleSystem, dt: number): void;
41
+ }
@@ -0,0 +1,76 @@
1
+ import { Color } from '../../core/Color.js';
2
+ import { Vector } from '../../math/Vector.js';
3
+ import { SpawnModule } from './SpawnModule.js';
4
+
5
+ /**
6
+ * Continuous, rate-based spawner. Emits a {@link RateSpawnConfig.rate}
7
+ * sample per second; sub-frame fractions accumulate so low rates (e.g.
8
+ * 0.5 particles/s) remain accurate over time.
9
+ *
10
+ * Each property is independently randomised via its {@link Distribution}.
11
+ * Every spawned particle gets a fresh sample for every configured field.
12
+ */
13
+ class RateSpawn extends SpawnModule {
14
+ config;
15
+ _accumulator = 0;
16
+ _vec = new Vector();
17
+ _color = new Color();
18
+ constructor(config) {
19
+ super();
20
+ this.config = config;
21
+ }
22
+ apply(system, dt) {
23
+ const cfg = this.config;
24
+ const rate = cfg.rate.sample();
25
+ this._accumulator += rate * dt;
26
+ const count = this._accumulator | 0;
27
+ if (count <= 0) {
28
+ return;
29
+ }
30
+ this._accumulator -= count;
31
+ const v = this._vec;
32
+ const c = this._color;
33
+ for (let i = 0; i < count; i++) {
34
+ const slot = system.spawn();
35
+ if (slot < 0) {
36
+ this._accumulator = 0;
37
+ return;
38
+ }
39
+ system.lifetime[slot] = cfg.lifetime ? cfg.lifetime.sample() : 1;
40
+ if (cfg.position) {
41
+ cfg.position.sample(v);
42
+ system.posX[slot] = v.x;
43
+ system.posY[slot] = v.y;
44
+ }
45
+ else {
46
+ system.posX[slot] = 0;
47
+ system.posY[slot] = 0;
48
+ }
49
+ if (cfg.velocity) {
50
+ cfg.velocity.sample(v);
51
+ system.velX[slot] = v.x;
52
+ system.velY[slot] = v.y;
53
+ }
54
+ else {
55
+ system.velX[slot] = 0;
56
+ system.velY[slot] = 0;
57
+ }
58
+ if (cfg.scale) {
59
+ cfg.scale.sample(v);
60
+ system.scaleX[slot] = v.x;
61
+ system.scaleY[slot] = v.y;
62
+ }
63
+ else {
64
+ system.scaleX[slot] = 1;
65
+ system.scaleY[slot] = 1;
66
+ }
67
+ system.rotations[slot] = cfg.rotation ? cfg.rotation.sample() : 0;
68
+ system.rotationSpeeds[slot] = cfg.rotationSpeed ? cfg.rotationSpeed.sample() : 0;
69
+ system.color[slot] = cfg.tint ? cfg.tint.sample(c).toRgba() : 0xffffffff;
70
+ system.textureIndex[slot] = cfg.textureIndex ? cfg.textureIndex.sample() | 0 : 0;
71
+ }
72
+ }
73
+ }
74
+
75
+ export { RateSpawn };
76
+ //# sourceMappingURL=RateSpawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateSpawn.js","sources":["../../../../../src/particles/modules/RateSpawn.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ParticleSystem } from '@/particles/ParticleSystem';
2
+ import { UpdateModule } from './UpdateModule';
3
+ import type { WgslContribution } from './WgslContribution';
4
+ /**
5
+ * Pushes every live particle away from a fixed point in the system's local
6
+ * coordinate space. Acceleration magnitude is `strength` (units / s²)
7
+ * along the direction `(particle − point)`. The optional `radius` controls
8
+ * the influence range — particles farther than `radius` are unaffected.
9
+ * Setting `radius = 0` (default) means infinite range with no falloff.
10
+ *
11
+ * Use cases: shockwaves, explosion blast, mouse-cursor repel field.
12
+ *
13
+ * GPU-eligible.
14
+ */
15
+ export declare class RepelFromPoint extends UpdateModule {
16
+ x: number;
17
+ y: number;
18
+ strength: number;
19
+ radius: number;
20
+ constructor(x: number, y: number, strength: number, radius?: number);
21
+ apply(system: ParticleSystem, dt: number): void;
22
+ wgsl(): WgslContribution;
23
+ writeUniforms(view: DataView, offset: number): void;
24
+ }
@@ -0,0 +1,76 @@
1
+ import { UpdateModule } from './UpdateModule.js';
2
+
3
+ /**
4
+ * Pushes every live particle away from a fixed point in the system's local
5
+ * coordinate space. Acceleration magnitude is `strength` (units / s²)
6
+ * along the direction `(particle − point)`. The optional `radius` controls
7
+ * the influence range — particles farther than `radius` are unaffected.
8
+ * Setting `radius = 0` (default) means infinite range with no falloff.
9
+ *
10
+ * Use cases: shockwaves, explosion blast, mouse-cursor repel field.
11
+ *
12
+ * GPU-eligible.
13
+ */
14
+ class RepelFromPoint extends UpdateModule {
15
+ x;
16
+ y;
17
+ strength;
18
+ radius;
19
+ constructor(x, y, strength, radius = 0) {
20
+ super();
21
+ this.x = x;
22
+ this.y = y;
23
+ this.strength = strength;
24
+ this.radius = radius;
25
+ }
26
+ apply(system, dt) {
27
+ const { posX, posY, velX, velY, liveCount } = system;
28
+ const { x, y, strength, radius } = this;
29
+ const radiusSq = radius * radius;
30
+ for (let i = 0; i < liveCount; i++) {
31
+ const dx = posX[i] - x;
32
+ const dy = posY[i] - y;
33
+ const distSq = dx * dx + dy * dy;
34
+ if (distSq < 1e-10)
35
+ continue;
36
+ if (radius > 0 && distSq > radiusSq)
37
+ continue;
38
+ const dist = Math.sqrt(distSq);
39
+ const falloff = radius > 0 ? 1 - dist / radius : 1;
40
+ const a = (strength * falloff * dt) / dist;
41
+ velX[i] += dx * a;
42
+ velY[i] += dy * a;
43
+ }
44
+ }
45
+ wgsl() {
46
+ return {
47
+ key: 'RepelFromPoint',
48
+ uniforms: [
49
+ { name: 'point', type: 'vec2<f32>' },
50
+ { name: 'strength', type: 'f32' },
51
+ { name: 'radius', type: 'f32' },
52
+ ],
53
+ body: `
54
+ let repelDelta = positions[idx] - modules.u_RepelFromPoint.point;
55
+ let repelDistSq = dot(repelDelta, repelDelta);
56
+ let repelRadius = modules.u_RepelFromPoint.radius;
57
+ let repelInRange = (repelRadius <= 0.0) || (repelDistSq <= repelRadius * repelRadius);
58
+ if (repelDistSq > 0.0000001 && repelInRange) {
59
+ let repelDist = sqrt(repelDistSq);
60
+ let repelFalloff = select(1.0, 1.0 - repelDist / max(repelRadius, 0.000001), repelRadius > 0.0);
61
+ let repelAccel = (modules.u_RepelFromPoint.strength * repelFalloff * dt) / repelDist;
62
+ velocities[idx] = velocities[idx] + repelDelta * repelAccel;
63
+ }
64
+ `,
65
+ };
66
+ }
67
+ writeUniforms(view, offset) {
68
+ view.setFloat32(offset + 0, this.x, true);
69
+ view.setFloat32(offset + 4, this.y, true);
70
+ view.setFloat32(offset + 8, this.strength, true);
71
+ view.setFloat32(offset + 12, this.radius, true);
72
+ }
73
+ }
74
+
75
+ export { RepelFromPoint };
76
+ //# sourceMappingURL=RepelFromPoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RepelFromPoint.js","sources":["../../../../../src/particles/modules/RepelFromPoint.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA;;;;;;;;;;AAUG;AACG,MAAO,cAAe,SAAQ,YAAY,CAAA;AACvC,IAAA,CAAC;AACD,IAAA,CAAC;AACD,IAAA,QAAQ;AACR,IAAA,MAAM;IAEb,WAAA,CAAmB,CAAS,EAAE,CAAS,EAAE,QAAgB,EAAE,MAAM,GAAG,CAAC,EAAA;AACnE,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,CAAC,GAAG,CAAC;AACV,QAAA,IAAI,CAAC,CAAC,GAAG,CAAC;AACV,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;IACtB;IAEgB,KAAK,CAAC,MAAsB,EAAE,EAAU,EAAA;AACtD,QAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM;QACpD,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;AACvC,QAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM;AAEhC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;YAClC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACtB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACtB,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;YAEhC,IAAI,MAAM,GAAG,KAAK;gBAAE;AACpB,YAAA,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,QAAQ;gBAAE;YAErC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,YAAA,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,CAAC;YAClD,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,OAAO,GAAG,EAAE,IAAI,IAAI;AAE1C,YAAA,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;AACjB,YAAA,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC;QACnB;IACF;IAEgB,IAAI,GAAA;QAClB,OAAO;AACL,YAAA,GAAG,EAAE,gBAAgB;AACrB,YAAA,QAAQ,EAAE;AACR,gBAAA,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;AACpC,gBAAA,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;AACjC,gBAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;AAChC,aAAA;AACD,YAAA,IAAI,EAAE;;;;;;;;;;;AAWC,YAAA,CAAA;SACR;IACH;IAEgB,aAAa,CAAC,IAAc,EAAE,MAAc,EAAA;AAC1D,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AACzC,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AACzC,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;AAChD,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;IACjD;AACD;;;;"}
@@ -0,0 +1,20 @@
1
+ import type { ParticleSystem } from '@/particles/ParticleSystem';
2
+ import { UpdateModule } from './UpdateModule';
3
+ import type { WgslContribution } from './WgslContribution';
4
+ /**
5
+ * Adds a constant angular acceleration to every live particle each frame
6
+ * (analogous to the legacy `TorqueAffector`). The system's integrate pass
7
+ * advances `rotation` from `rotationSpeed`; this module increments
8
+ * `rotationSpeed` itself.
9
+ *
10
+ * Units: degrees per second². Negative values decelerate spin.
11
+ *
12
+ * GPU-eligible.
13
+ */
14
+ export declare class RotateOverLifetime extends UpdateModule {
15
+ angularAcceleration: number;
16
+ constructor(angularAcceleration: number);
17
+ apply(system: ParticleSystem, dt: number): void;
18
+ wgsl(): WgslContribution;
19
+ writeUniforms(view: DataView, offset: number): void;
20
+ }
@@ -0,0 +1,41 @@
1
+ import { UpdateModule } from './UpdateModule.js';
2
+
3
+ /**
4
+ * Adds a constant angular acceleration to every live particle each frame
5
+ * (analogous to the legacy `TorqueAffector`). The system's integrate pass
6
+ * advances `rotation` from `rotationSpeed`; this module increments
7
+ * `rotationSpeed` itself.
8
+ *
9
+ * Units: degrees per second². Negative values decelerate spin.
10
+ *
11
+ * GPU-eligible.
12
+ */
13
+ class RotateOverLifetime extends UpdateModule {
14
+ angularAcceleration;
15
+ constructor(angularAcceleration) {
16
+ super();
17
+ this.angularAcceleration = angularAcceleration;
18
+ }
19
+ apply(system, dt) {
20
+ const { rotationSpeeds, liveCount } = system;
21
+ const delta = this.angularAcceleration * dt;
22
+ for (let i = 0; i < liveCount; i++) {
23
+ rotationSpeeds[i] += delta;
24
+ }
25
+ }
26
+ wgsl() {
27
+ return {
28
+ key: 'RotateOverLifetime',
29
+ uniforms: [{ name: 'angularAcceleration', type: 'f32' }],
30
+ body: `
31
+ rotInfo[idx].y = rotInfo[idx].y + modules.u_RotateOverLifetime.angularAcceleration * dt;
32
+ `,
33
+ };
34
+ }
35
+ writeUniforms(view, offset) {
36
+ view.setFloat32(offset + 0, this.angularAcceleration, true);
37
+ }
38
+ }
39
+
40
+ export { RotateOverLifetime };
41
+ //# sourceMappingURL=RotateOverLifetime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RotateOverLifetime.js","sources":["../../../../../src/particles/modules/RotateOverLifetime.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA;;;;;;;;;AASG;AACG,MAAO,kBAAmB,SAAQ,YAAY,CAAA;AAC3C,IAAA,mBAAmB;AAE1B,IAAA,WAAA,CAAmB,mBAA2B,EAAA;AAC5C,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,mBAAmB,GAAG,mBAAmB;IAChD;IAEgB,KAAK,CAAC,MAAsB,EAAE,EAAU,EAAA;AACtD,QAAA,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,MAAM;AAC5C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,GAAG,EAAE;AAE3C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;AAClC,YAAA,cAAc,CAAC,CAAC,CAAC,IAAI,KAAK;QAC5B;IACF;IAEgB,IAAI,GAAA;QAClB,OAAO;AACL,YAAA,GAAG,EAAE,oBAAoB;YACzB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxD,YAAA,IAAI,EAAE;;AAEC,YAAA,CAAA;SACR;IACH;IAEgB,aAAa,CAAC,IAAc,EAAE,MAAc,EAAA;AAC1D,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC;IAC7D;AACD;;;;"}
@@ -0,0 +1,26 @@
1
+ import type { Curve } from '@/particles/distributions/Curve';
2
+ import type { ParticleSystem } from '@/particles/ParticleSystem';
3
+ import { UpdateModule } from './UpdateModule';
4
+ import type { WgslContribution } from './WgslContribution';
5
+ /**
6
+ * Sets every live particle's scale to a curve sampled at the particle's
7
+ * current lifetime ratio. Both axes share one curve — for non-uniform
8
+ * scaling layer two ScaleOverLifetime modules with separate `axis` filters
9
+ * (or extend with a per-axis variant).
10
+ *
11
+ * Common patterns: shrink-to-zero (start at 1, end at 0), pulse (sine-like
12
+ * curve up to peak then down), slow-grow (linear ramp).
13
+ *
14
+ * GPU-eligible: the curve is uploaded once as a 256-tap 1D R32F texture and
15
+ * sampled with linear filtering on the GPU — no curve evaluation cost in
16
+ * the inner loop.
17
+ */
18
+ export declare class ScaleOverLifetime extends UpdateModule {
19
+ curve: Curve;
20
+ constructor(curve: Curve);
21
+ apply(system: ParticleSystem, _dt: number): void;
22
+ wgsl(): WgslContribution;
23
+ uploadTextures(device: GPUDevice, textures: ReadonlyMap<string, GPUTexture>): void;
24
+ }
25
+ /** Texture width for the curve lookup table. Exposed for ParticleGpuState. */
26
+ export declare const scaleLookupSize = 256;