@tsparticles/engine 4.0.0-alpha.2 → 4.0.0-alpha.4

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 (283) hide show
  1. package/794.min.js +2 -0
  2. package/794.min.js.LICENSE.txt +1 -0
  3. package/README.md +2 -5
  4. package/browser/Core/Canvas.js +18 -22
  5. package/browser/Core/Container.js +44 -169
  6. package/browser/Core/Engine.js +40 -61
  7. package/browser/Core/Particle.js +99 -58
  8. package/browser/Core/Particles.js +36 -25
  9. package/browser/Core/Utils/Constants.js +2 -2
  10. package/browser/Core/Utils/EventListeners.js +5 -250
  11. package/browser/Options/Classes/Options.js +7 -75
  12. package/browser/Options/Classes/Particles/ParticlesOptions.js +5 -11
  13. package/{esm/Options/Classes/Interactivity/Events → browser/Options/Classes}/ResizeEvent.js +1 -1
  14. package/browser/Utils/CanvasUtils.js +26 -83
  15. package/browser/Utils/ColorUtils.js +17 -2
  16. package/browser/Utils/MathUtils.js +3 -2
  17. package/browser/Utils/Utils.js +26 -33
  18. package/browser/exports.js +1 -21
  19. package/cjs/Core/Canvas.js +18 -22
  20. package/cjs/Core/Container.js +44 -169
  21. package/cjs/Core/Engine.js +40 -61
  22. package/cjs/Core/Particle.js +99 -58
  23. package/cjs/Core/Particles.js +36 -25
  24. package/cjs/Core/Utils/Constants.js +2 -2
  25. package/cjs/Core/Utils/EventListeners.js +5 -250
  26. package/cjs/Options/Classes/Options.js +7 -75
  27. package/cjs/Options/Classes/Particles/ParticlesOptions.js +5 -11
  28. package/cjs/Options/Classes/{Interactivity/Events/ResizeEvent.js → ResizeEvent.js} +1 -1
  29. package/cjs/Utils/CanvasUtils.js +26 -83
  30. package/cjs/Utils/ColorUtils.js +17 -2
  31. package/cjs/Utils/MathUtils.js +3 -2
  32. package/cjs/Utils/Utils.js +26 -33
  33. package/cjs/exports.js +1 -21
  34. package/dist_browser_Core_Container_js.js +6 -16
  35. package/esm/Core/Canvas.js +18 -22
  36. package/esm/Core/Container.js +44 -169
  37. package/esm/Core/Engine.js +40 -61
  38. package/esm/Core/Particle.js +99 -58
  39. package/esm/Core/Particles.js +36 -25
  40. package/esm/Core/Utils/Constants.js +2 -2
  41. package/esm/Core/Utils/EventListeners.js +5 -250
  42. package/esm/Options/Classes/Options.js +7 -75
  43. package/esm/Options/Classes/Particles/ParticlesOptions.js +5 -11
  44. package/{browser/Options/Classes/Interactivity/Events → esm/Options/Classes}/ResizeEvent.js +1 -1
  45. package/esm/Utils/CanvasUtils.js +26 -83
  46. package/esm/Utils/ColorUtils.js +17 -2
  47. package/esm/Utils/MathUtils.js +3 -2
  48. package/esm/Utils/Utils.js +26 -33
  49. package/esm/exports.js +1 -21
  50. package/package.json +1 -1
  51. package/report.html +1 -1
  52. package/tsparticles.engine.js +16 -208
  53. package/tsparticles.engine.min.js +1 -1
  54. package/tsparticles.engine.min.js.LICENSE.txt +1 -1
  55. package/types/Core/Canvas.d.ts +3 -0
  56. package/types/Core/Container.d.ts +4 -15
  57. package/types/Core/Engine.d.ts +4 -19
  58. package/types/Core/Interfaces/IContainerPlugin.d.ts +8 -1
  59. package/types/Core/Interfaces/IDrawParticleParams.d.ts +1 -1
  60. package/types/Core/Interfaces/IParticleOpacityData.d.ts +4 -0
  61. package/types/Core/Interfaces/IParticleRotateData.d.ts +4 -0
  62. package/types/Core/Interfaces/IParticleTransformValues.d.ts +4 -4
  63. package/types/Core/Interfaces/IParticleUpdater.d.ts +1 -1
  64. package/types/Core/Interfaces/IPlugin.d.ts +5 -1
  65. package/types/Core/Particle.d.ts +12 -2
  66. package/types/Core/Particles.d.ts +1 -5
  67. package/types/Core/Utils/Constants.d.ts +2 -2
  68. package/types/Core/Utils/EventListeners.d.ts +0 -14
  69. package/types/Options/Classes/Options.d.ts +2 -11
  70. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +0 -2
  71. package/types/Options/Classes/ResizeEvent.d.ts +9 -0
  72. package/types/Options/Interfaces/IOptions.d.ts +2 -8
  73. package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +0 -3
  74. package/types/Types/CustomEventListener.d.ts +1 -1
  75. package/types/Types/EngineInitializers.d.ts +10 -0
  76. package/types/Utils/CanvasUtils.d.ts +6 -21
  77. package/types/Utils/EventDispatcher.d.ts +1 -1
  78. package/types/Utils/Utils.d.ts +4 -6
  79. package/types/export-types.d.ts +3 -19
  80. package/types/exports.d.ts +1 -21
  81. package/umd/Core/Canvas.js +17 -21
  82. package/umd/Core/Container.js +44 -169
  83. package/umd/Core/Engine.js +41 -62
  84. package/umd/Core/Particle.js +99 -58
  85. package/umd/Core/Particles.js +37 -26
  86. package/umd/Core/Utils/Constants.js +3 -3
  87. package/umd/Core/Utils/EventListeners.js +7 -252
  88. package/umd/Options/Classes/Options.js +7 -75
  89. package/umd/Options/Classes/Particles/ParticlesOptions.js +5 -11
  90. package/umd/Options/Classes/{Interactivity/Events/ResizeEvent.js → ResizeEvent.js} +2 -2
  91. package/umd/Utils/CanvasUtils.js +25 -82
  92. package/umd/Utils/ColorUtils.js +17 -2
  93. package/umd/Utils/MathUtils.js +3 -2
  94. package/umd/Utils/Utils.js +27 -36
  95. package/umd/exports.js +2 -22
  96. package/638.min.js +0 -2
  97. package/638.min.js.LICENSE.txt +0 -1
  98. package/browser/Core/Utils/ExternalInteractorBase.js +0 -7
  99. package/browser/Core/Utils/InteractionManager.js +0 -60
  100. package/browser/Core/Utils/ParticlesInteractorBase.js +0 -7
  101. package/browser/Enums/InteractivityDetect.js +0 -6
  102. package/browser/Enums/Modes/ResponsiveMode.js +0 -5
  103. package/browser/Enums/Modes/ThemeMode.js +0 -6
  104. package/browser/Enums/Types/DivType.js +0 -5
  105. package/browser/Enums/Types/InteractorType.js +0 -5
  106. package/browser/Options/Classes/Interactivity/Events/ClickEvent.js +0 -18
  107. package/browser/Options/Classes/Interactivity/Events/DivEvent.js +0 -27
  108. package/browser/Options/Classes/Interactivity/Events/Events.js +0 -30
  109. package/browser/Options/Classes/Interactivity/Events/HoverEvent.js +0 -21
  110. package/browser/Options/Classes/Interactivity/Events/Parallax.js +0 -22
  111. package/browser/Options/Classes/Interactivity/Interactivity.js +0 -22
  112. package/browser/Options/Classes/Interactivity/Modes/Modes.js +0 -25
  113. package/browser/Options/Classes/ManualParticle.js +0 -21
  114. package/browser/Options/Classes/Responsive.js +0 -29
  115. package/browser/Options/Classes/Theme/Theme.js +0 -21
  116. package/browser/Options/Classes/Theme/ThemeDefault.js +0 -23
  117. package/browser/Options/Interfaces/Interactivity/Events/IEvents.js +0 -1
  118. package/browser/Options/Interfaces/Interactivity/Events/IHoverEvent.js +0 -1
  119. package/browser/Options/Interfaces/Interactivity/Events/IParallax.js +0 -1
  120. package/browser/Options/Interfaces/Interactivity/IInteractivity.js +0 -1
  121. package/browser/Options/Interfaces/Interactivity/Modes/IModeDiv.js +0 -1
  122. package/browser/Options/Interfaces/Interactivity/Modes/IModes.js +0 -1
  123. package/browser/Options/Interfaces/Theme/ITheme.js +0 -1
  124. package/browser/Options/Interfaces/Theme/IThemeDefault.js +0 -1
  125. package/cjs/Core/Interfaces/IContainerInteractivity.js +0 -1
  126. package/cjs/Core/Interfaces/IExternalInteractor.js +0 -1
  127. package/cjs/Core/Interfaces/IInteractor.js +0 -1
  128. package/cjs/Core/Interfaces/IMouseData.js +0 -1
  129. package/cjs/Core/Interfaces/IParticlesInteractor.js +0 -1
  130. package/cjs/Core/Utils/ExternalInteractorBase.js +0 -7
  131. package/cjs/Core/Utils/InteractionManager.js +0 -60
  132. package/cjs/Core/Utils/ParticlesInteractorBase.js +0 -7
  133. package/cjs/Enums/InteractivityDetect.js +0 -6
  134. package/cjs/Enums/Modes/ResponsiveMode.js +0 -5
  135. package/cjs/Enums/Modes/ThemeMode.js +0 -6
  136. package/cjs/Enums/Types/DivType.js +0 -5
  137. package/cjs/Enums/Types/InteractorType.js +0 -5
  138. package/cjs/Options/Classes/Interactivity/Events/ClickEvent.js +0 -18
  139. package/cjs/Options/Classes/Interactivity/Events/DivEvent.js +0 -27
  140. package/cjs/Options/Classes/Interactivity/Events/Events.js +0 -30
  141. package/cjs/Options/Classes/Interactivity/Events/HoverEvent.js +0 -21
  142. package/cjs/Options/Classes/Interactivity/Events/Parallax.js +0 -22
  143. package/cjs/Options/Classes/Interactivity/Interactivity.js +0 -22
  144. package/cjs/Options/Classes/Interactivity/Modes/Modes.js +0 -25
  145. package/cjs/Options/Classes/ManualParticle.js +0 -21
  146. package/cjs/Options/Classes/Responsive.js +0 -29
  147. package/cjs/Options/Classes/Theme/Theme.js +0 -21
  148. package/cjs/Options/Classes/Theme/ThemeDefault.js +0 -23
  149. package/cjs/Options/Interfaces/IManualParticle.js +0 -1
  150. package/cjs/Options/Interfaces/IResponsive.js +0 -1
  151. package/cjs/Options/Interfaces/Interactivity/Events/IClickEvent.js +0 -1
  152. package/cjs/Options/Interfaces/Interactivity/Events/IDivEvent.js +0 -1
  153. package/cjs/Options/Interfaces/Interactivity/Events/IEvents.js +0 -1
  154. package/cjs/Options/Interfaces/Interactivity/Events/IHoverEvent.js +0 -1
  155. package/cjs/Options/Interfaces/Interactivity/Events/IParallax.js +0 -1
  156. package/cjs/Options/Interfaces/Interactivity/IInteractivity.js +0 -1
  157. package/cjs/Options/Interfaces/Interactivity/Modes/IModeDiv.js +0 -1
  158. package/cjs/Options/Interfaces/Interactivity/Modes/IModes.js +0 -1
  159. package/cjs/Options/Interfaces/Theme/ITheme.js +0 -1
  160. package/cjs/Options/Interfaces/Theme/IThemeDefault.js +0 -1
  161. package/esm/Core/Interfaces/IContainerInteractivity.js +0 -1
  162. package/esm/Core/Interfaces/IExternalInteractor.js +0 -1
  163. package/esm/Core/Interfaces/IInteractor.js +0 -1
  164. package/esm/Core/Interfaces/IMouseData.js +0 -1
  165. package/esm/Core/Interfaces/IParticlesInteractor.js +0 -1
  166. package/esm/Core/Utils/ExternalInteractorBase.js +0 -7
  167. package/esm/Core/Utils/InteractionManager.js +0 -60
  168. package/esm/Core/Utils/ParticlesInteractorBase.js +0 -7
  169. package/esm/Enums/InteractivityDetect.js +0 -6
  170. package/esm/Enums/Modes/ResponsiveMode.js +0 -5
  171. package/esm/Enums/Modes/ThemeMode.js +0 -6
  172. package/esm/Enums/Types/DivType.js +0 -5
  173. package/esm/Enums/Types/InteractorType.js +0 -5
  174. package/esm/Options/Classes/Interactivity/Events/ClickEvent.js +0 -18
  175. package/esm/Options/Classes/Interactivity/Events/DivEvent.js +0 -27
  176. package/esm/Options/Classes/Interactivity/Events/Events.js +0 -30
  177. package/esm/Options/Classes/Interactivity/Events/HoverEvent.js +0 -21
  178. package/esm/Options/Classes/Interactivity/Events/Parallax.js +0 -22
  179. package/esm/Options/Classes/Interactivity/Interactivity.js +0 -22
  180. package/esm/Options/Classes/Interactivity/Modes/Modes.js +0 -25
  181. package/esm/Options/Classes/ManualParticle.js +0 -21
  182. package/esm/Options/Classes/Responsive.js +0 -29
  183. package/esm/Options/Classes/Theme/Theme.js +0 -21
  184. package/esm/Options/Classes/Theme/ThemeDefault.js +0 -23
  185. package/esm/Options/Interfaces/IManualParticle.js +0 -1
  186. package/esm/Options/Interfaces/IResponsive.js +0 -1
  187. package/esm/Options/Interfaces/Interactivity/Events/IClickEvent.js +0 -1
  188. package/esm/Options/Interfaces/Interactivity/Events/IDivEvent.js +0 -1
  189. package/esm/Options/Interfaces/Interactivity/Events/IEvents.js +0 -1
  190. package/esm/Options/Interfaces/Interactivity/Events/IHoverEvent.js +0 -1
  191. package/esm/Options/Interfaces/Interactivity/Events/IParallax.js +0 -1
  192. package/esm/Options/Interfaces/Interactivity/IInteractivity.js +0 -1
  193. package/esm/Options/Interfaces/Interactivity/Modes/IModeDiv.js +0 -1
  194. package/esm/Options/Interfaces/Interactivity/Modes/IModes.js +0 -1
  195. package/esm/Options/Interfaces/Theme/ITheme.js +0 -1
  196. package/esm/Options/Interfaces/Theme/IThemeDefault.js +0 -1
  197. package/types/Core/Interfaces/IContainerInteractivity.d.ts +0 -6
  198. package/types/Core/Interfaces/IExternalInteractor.d.ts +0 -12
  199. package/types/Core/Interfaces/IInteractor.d.ts +0 -16
  200. package/types/Core/Interfaces/IMouseData.d.ts +0 -9
  201. package/types/Core/Interfaces/IParticlesInteractor.d.ts +0 -7
  202. package/types/Core/Utils/ExternalInteractorBase.d.ts +0 -15
  203. package/types/Core/Utils/InteractionManager.d.ts +0 -17
  204. package/types/Core/Utils/ParticlesInteractorBase.d.ts +0 -15
  205. package/types/Enums/InteractivityDetect.d.ts +0 -5
  206. package/types/Enums/Modes/ResponsiveMode.d.ts +0 -4
  207. package/types/Enums/Modes/ThemeMode.d.ts +0 -5
  208. package/types/Enums/Types/DivType.d.ts +0 -4
  209. package/types/Enums/Types/InteractorType.d.ts +0 -4
  210. package/types/Options/Classes/Interactivity/Events/ClickEvent.d.ts +0 -10
  211. package/types/Options/Classes/Interactivity/Events/DivEvent.d.ts +0 -13
  212. package/types/Options/Classes/Interactivity/Events/Events.d.ts +0 -16
  213. package/types/Options/Classes/Interactivity/Events/HoverEvent.d.ts +0 -12
  214. package/types/Options/Classes/Interactivity/Events/Parallax.d.ts +0 -10
  215. package/types/Options/Classes/Interactivity/Events/ResizeEvent.d.ts +0 -9
  216. package/types/Options/Classes/Interactivity/Interactivity.d.ts +0 -16
  217. package/types/Options/Classes/Interactivity/Modes/Modes.d.ts +0 -12
  218. package/types/Options/Classes/ManualParticle.d.ts +0 -10
  219. package/types/Options/Classes/Responsive.d.ts +0 -12
  220. package/types/Options/Classes/Theme/Theme.d.ts +0 -12
  221. package/types/Options/Classes/Theme/ThemeDefault.d.ts +0 -11
  222. package/types/Options/Interfaces/IManualParticle.d.ts +0 -7
  223. package/types/Options/Interfaces/IResponsive.d.ts +0 -7
  224. package/types/Options/Interfaces/Interactivity/Events/IClickEvent.d.ts +0 -5
  225. package/types/Options/Interfaces/Interactivity/Events/IDivEvent.d.ts +0 -8
  226. package/types/Options/Interfaces/Interactivity/Events/IEvents.d.ts +0 -11
  227. package/types/Options/Interfaces/Interactivity/Events/IHoverEvent.d.ts +0 -7
  228. package/types/Options/Interfaces/Interactivity/Events/IParallax.d.ts +0 -5
  229. package/types/Options/Interfaces/Interactivity/IInteractivity.d.ts +0 -9
  230. package/types/Options/Interfaces/Interactivity/Modes/IModeDiv.d.ts +0 -4
  231. package/types/Options/Interfaces/Interactivity/Modes/IModes.d.ts +0 -1
  232. package/types/Options/Interfaces/Theme/ITheme.d.ts +0 -7
  233. package/types/Options/Interfaces/Theme/IThemeDefault.d.ts +0 -6
  234. package/umd/Core/Interfaces/IMouseData.js +0 -12
  235. package/umd/Core/Interfaces/IParticlesInteractor.js +0 -12
  236. package/umd/Core/Utils/ExternalInteractorBase.js +0 -21
  237. package/umd/Core/Utils/InteractionManager.js +0 -74
  238. package/umd/Core/Utils/ParticlesInteractorBase.js +0 -21
  239. package/umd/Enums/InteractivityDetect.js +0 -19
  240. package/umd/Enums/Modes/ResponsiveMode.js +0 -18
  241. package/umd/Enums/Modes/ThemeMode.js +0 -19
  242. package/umd/Enums/Types/DivType.js +0 -18
  243. package/umd/Enums/Types/InteractorType.js +0 -18
  244. package/umd/Options/Classes/Interactivity/Events/ClickEvent.js +0 -32
  245. package/umd/Options/Classes/Interactivity/Events/DivEvent.js +0 -41
  246. package/umd/Options/Classes/Interactivity/Events/Events.js +0 -44
  247. package/umd/Options/Classes/Interactivity/Events/HoverEvent.js +0 -35
  248. package/umd/Options/Classes/Interactivity/Events/Parallax.js +0 -36
  249. package/umd/Options/Classes/Interactivity/Interactivity.js +0 -36
  250. package/umd/Options/Classes/Interactivity/Modes/Modes.js +0 -39
  251. package/umd/Options/Classes/ManualParticle.js +0 -35
  252. package/umd/Options/Classes/Responsive.js +0 -43
  253. package/umd/Options/Classes/Theme/Theme.js +0 -35
  254. package/umd/Options/Classes/Theme/ThemeDefault.js +0 -37
  255. package/umd/Options/Interfaces/IManualParticle.js +0 -12
  256. package/umd/Options/Interfaces/IResponsive.js +0 -12
  257. package/umd/Options/Interfaces/Interactivity/Events/IClickEvent.js +0 -12
  258. package/umd/Options/Interfaces/Interactivity/Events/IDivEvent.js +0 -12
  259. package/umd/Options/Interfaces/Interactivity/Events/IEvents.js +0 -12
  260. package/umd/Options/Interfaces/Interactivity/Events/IHoverEvent.js +0 -12
  261. package/umd/Options/Interfaces/Interactivity/Events/IParallax.js +0 -12
  262. package/umd/Options/Interfaces/Interactivity/IInteractivity.js +0 -12
  263. package/umd/Options/Interfaces/Interactivity/Modes/IModeDiv.js +0 -12
  264. package/umd/Options/Interfaces/Interactivity/Modes/IModes.js +0 -12
  265. package/umd/Options/Interfaces/Theme/ITheme.js +0 -12
  266. package/umd/Options/Interfaces/Theme/IThemeDefault.js +0 -12
  267. /package/browser/Core/Interfaces/{IContainerInteractivity.js → IParticleOpacityData.js} +0 -0
  268. /package/browser/Core/Interfaces/{IExternalInteractor.js → IParticleRotateData.js} +0 -0
  269. /package/browser/Options/Interfaces/{Interactivity/Events/IResizeEvent.js → IResizeEvent.js} +0 -0
  270. /package/browser/{Core/Interfaces/IInteractor.js → Types/EngineInitializers.js} +0 -0
  271. /package/{browser/Core/Interfaces/IMouseData.js → cjs/Core/Interfaces/IParticleOpacityData.js} +0 -0
  272. /package/{browser/Core/Interfaces/IParticlesInteractor.js → cjs/Core/Interfaces/IParticleRotateData.js} +0 -0
  273. /package/cjs/Options/Interfaces/{Interactivity/Events/IResizeEvent.js → IResizeEvent.js} +0 -0
  274. /package/{browser/Options/Interfaces/IManualParticle.js → cjs/Types/EngineInitializers.js} +0 -0
  275. /package/{browser/Options/Interfaces/IResponsive.js → esm/Core/Interfaces/IParticleOpacityData.js} +0 -0
  276. /package/{browser/Options/Interfaces/Interactivity/Events/IClickEvent.js → esm/Core/Interfaces/IParticleRotateData.js} +0 -0
  277. /package/esm/Options/Interfaces/{Interactivity/Events/IResizeEvent.js → IResizeEvent.js} +0 -0
  278. /package/{browser/Options/Interfaces/Interactivity/Events/IDivEvent.js → esm/Types/EngineInitializers.js} +0 -0
  279. /package/types/Options/Interfaces/{Interactivity/Events/IResizeEvent.d.ts → IResizeEvent.d.ts} +0 -0
  280. /package/umd/Core/Interfaces/{IContainerInteractivity.js → IParticleOpacityData.js} +0 -0
  281. /package/umd/Core/Interfaces/{IExternalInteractor.js → IParticleRotateData.js} +0 -0
  282. /package/umd/Options/Interfaces/{Interactivity/Events/IResizeEvent.js → IResizeEvent.js} +0 -0
  283. /package/umd/{Core/Interfaces/IInteractor.js → Types/EngineInitializers.js} +0 -0
@@ -1,9 +1,8 @@
1
1
  import { Vector, Vector3d } from "./Utils/Vectors.js";
2
2
  import { calcExactPositionOrRandomFromSize, clamp, degToRad, getParticleBaseVelocity, getParticleDirectionAngle, getRandom, getRangeValue, randomInRangeValue, setRangeValue, } from "../Utils/MathUtils.js";
3
- import { decayOffset, defaultAngle, defaultRetryCount, double, half, millisecondsToSeconds, minZ, none, randomColorValue, rollFactor, squareExp, tryCountIncrement, } from "./Utils/Constants.js";
3
+ import { decayOffset, defaultAngle, defaultOpacity, defaultRetryCount, defaultTransform, double, half, identity, millisecondsToSeconds, minZ, none, randomColorValue, rollFactor, squareExp, tryCountIncrement, zIndexFactorOffset, } from "./Utils/Constants.js";
4
4
  import { deepExtend, getPosition, initParticleNumericAnimationValue, isInArray, itemFromSingleOrMultiple, } from "../Utils/Utils.js";
5
5
  import { EventType } from "../Enums/Types/EventType.js";
6
- import { Interactivity } from "../Options/Classes/Interactivity/Interactivity.js";
7
6
  import { MoveDirection } from "../Enums/Directions/MoveDirection.js";
8
7
  import { OutMode } from "../Enums/Modes/OutMode.js";
9
8
  import { ParticleOutType } from "../Enums/Types/ParticleOutType.js";
@@ -39,51 +38,50 @@ function fixOutMode(data) {
39
38
  export class Particle {
40
39
  constructor(engine, container) {
41
40
  this.container = container;
42
- this._calcPosition = (container, position, zIndex, tryCount = defaultRetryCount) => {
43
- const plugins = container.plugins.values();
44
- for (const plugin of plugins) {
45
- const pluginPos = plugin.particlePosition?.(position, this);
46
- if (pluginPos) {
47
- return Vector3d.create(pluginPos.x, pluginPos.y, zIndex);
41
+ this._cachedOpacityData = {
42
+ opacity: defaultOpacity,
43
+ strokeOpacity: defaultOpacity,
44
+ };
45
+ this._cachedPosition = Vector3d.origin;
46
+ this._cachedRotateData = { sin: 0, cos: 0 };
47
+ this._cachedTransform = {
48
+ a: 1,
49
+ b: 0,
50
+ c: 0,
51
+ d: 1,
52
+ };
53
+ this._calcPosition = (position, zIndex) => {
54
+ let tryCount = defaultRetryCount, posVec = position ? Vector3d.create(position.x, position.y, zIndex) : undefined;
55
+ const container = this.container, plugins = Array.from(container.plugins), outModes = this.options.move.outModes, radius = this.getRadius(), canvasSize = container.canvas.size, abortController = new AbortController(), { signal } = abortController;
56
+ while (!signal.aborted) {
57
+ for (const plugin of plugins) {
58
+ const pluginPos = plugin.particlePosition?.(posVec, this);
59
+ if (pluginPos) {
60
+ return Vector3d.create(pluginPos.x, pluginPos.y, zIndex);
61
+ }
48
62
  }
49
- }
50
- const canvasSize = container.canvas.size, exactPosition = calcExactPositionOrRandomFromSize({
51
- size: canvasSize,
52
- position: position,
53
- }), pos = Vector3d.create(exactPosition.x, exactPosition.y, zIndex), radius = this.getRadius(), outModes = this.options.move.outModes, fixHorizontal = (outMode) => {
54
- fixOutMode({
55
- outMode,
56
- checkModes: [OutMode.bounce],
57
- coord: pos.x,
58
- maxCoord: container.canvas.size.width,
59
- setCb: (value) => (pos.x += value),
60
- radius,
61
- });
62
- }, fixVertical = (outMode) => {
63
- fixOutMode({
64
- outMode,
65
- checkModes: [OutMode.bounce],
66
- coord: pos.y,
67
- maxCoord: container.canvas.size.height,
68
- setCb: (value) => (pos.y += value),
69
- radius,
70
- });
71
- };
72
- fixHorizontal(outModes.left ?? outModes.default);
73
- fixHorizontal(outModes.right ?? outModes.default);
74
- fixVertical(outModes.top ?? outModes.default);
75
- fixVertical(outModes.bottom ?? outModes.default);
76
- let isValidPosition = true;
77
- for (const plugin of plugins) {
78
- isValidPosition = plugin.checkParticlePosition?.(this, pos, tryCount);
79
- if (isValidPosition === false) {
80
- break;
63
+ const exactPosition = calcExactPositionOrRandomFromSize({
64
+ size: canvasSize,
65
+ position: posVec,
66
+ }), pos = Vector3d.create(exactPosition.x, exactPosition.y, zIndex);
67
+ this._fixHorizontal(pos, radius, outModes.left ?? outModes.default);
68
+ this._fixHorizontal(pos, radius, outModes.right ?? outModes.default);
69
+ this._fixVertical(pos, radius, outModes.top ?? outModes.default);
70
+ this._fixVertical(pos, radius, outModes.bottom ?? outModes.default);
71
+ let isValidPosition = true;
72
+ for (const plugin of plugins) {
73
+ isValidPosition = plugin.checkParticlePosition?.(this, pos, tryCount) ?? true;
74
+ if (!isValidPosition) {
75
+ break;
76
+ }
81
77
  }
78
+ if (isValidPosition) {
79
+ return pos;
80
+ }
81
+ tryCount += tryCountIncrement;
82
+ posVec = undefined;
82
83
  }
83
- if (!isValidPosition) {
84
- return this._calcPosition(container, undefined, zIndex, tryCount + tryCountIncrement);
85
- }
86
- return pos;
84
+ return posVec;
87
85
  };
88
86
  this._calculateVelocity = () => {
89
87
  const baseVelocity = getParticleBaseVelocity(this.direction), res = baseVelocity.copy(), moveOptions = this.options.move;
@@ -102,6 +100,26 @@ export class Particle {
102
100
  }
103
101
  return res;
104
102
  };
103
+ this._fixHorizontal = (pos, radius, outMode) => {
104
+ fixOutMode({
105
+ outMode,
106
+ checkModes: [OutMode.bounce],
107
+ coord: pos.x,
108
+ maxCoord: this.container.canvas.size.width,
109
+ setCb: (value) => (pos.x += value),
110
+ radius,
111
+ });
112
+ };
113
+ this._fixVertical = (pos, radius, outMode) => {
114
+ fixOutMode({
115
+ outMode,
116
+ checkModes: [OutMode.bounce],
117
+ coord: pos.y,
118
+ maxCoord: this.container.canvas.size.height,
119
+ setCb: (value) => (pos.y += value),
120
+ radius,
121
+ });
122
+ };
105
123
  this._getRollColor = color => {
106
124
  if (!color || !this.roll || (!this.backColor && !this.roll.alter)) {
107
125
  return color;
@@ -120,7 +138,11 @@ export class Particle {
120
138
  };
121
139
  this._initPosition = position => {
122
140
  const container = this.container, zIndexValue = getRangeValue(this.options.zIndex.value);
123
- this.position = this._calcPosition(container, position, clamp(zIndexValue, minZ, container.zLayers));
141
+ const initialPosition = this._calcPosition(position, clamp(zIndexValue, minZ, container.zLayers));
142
+ if (!initialPosition) {
143
+ throw new Error("a valid position cannot be found for particle");
144
+ }
145
+ this.position = initialPosition;
124
146
  this.initialPosition = this.position.copy();
125
147
  const canvasSize = container.canvas.size;
126
148
  this.moveCenter = {
@@ -150,7 +172,7 @@ export class Particle {
150
172
  this.slow.inRange = false;
151
173
  const container = this.container, pathGenerator = this.pathGenerator, shapeDrawer = this.shape ? container.shapeDrawers.get(this.shape) : undefined;
152
174
  shapeDrawer?.particleDestroy?.(this);
153
- for (const plugin of container.plugins.values()) {
175
+ for (const plugin of container.plugins) {
154
176
  plugin.particleDestroyed?.(this, override);
155
177
  }
156
178
  for (const updater of container.particles.updaters) {
@@ -166,7 +188,7 @@ export class Particle {
166
188
  }
167
189
  draw(delta) {
168
190
  const container = this.container, canvas = container.canvas;
169
- for (const plugin of container.plugins.values()) {
191
+ for (const plugin of container.plugins) {
170
192
  canvas.drawParticlePlugin(plugin, this, delta);
171
193
  }
172
194
  canvas.drawParticle(this, delta);
@@ -180,21 +202,44 @@ export class Particle {
180
202
  getMass() {
181
203
  return this.getRadius() ** squareExp * Math.PI * half;
182
204
  }
205
+ getOpacity() {
206
+ const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, opacity = this.bubble.opacity ?? getRangeValue(this.opacity?.value ?? defaultOpacity), strokeOpacity = this.strokeOpacity ?? opacity;
207
+ this._cachedOpacityData.opacity = opacity * zOpacityFactor;
208
+ this._cachedOpacityData.strokeOpacity = strokeOpacity * zOpacityFactor;
209
+ return this._cachedOpacityData;
210
+ }
183
211
  getPosition() {
184
- return {
185
- x: this.position.x + this.offset.x,
186
- y: this.position.y + this.offset.y,
187
- z: this.position.z,
188
- };
212
+ this._cachedPosition.x = this.position.x + this.offset.x;
213
+ this._cachedPosition.y = this.position.y + this.offset.y;
214
+ this._cachedPosition.z = this.position.z;
215
+ return this._cachedPosition;
189
216
  }
190
217
  getRadius() {
191
218
  return this.bubble.radius ?? this.size.value;
192
219
  }
220
+ getRotateData() {
221
+ const angle = this.getAngle();
222
+ this._cachedRotateData.sin = Math.sin(angle);
223
+ this._cachedRotateData.cos = Math.cos(angle);
224
+ return this._cachedRotateData;
225
+ }
193
226
  getStrokeColor() {
194
227
  return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.strokeColor));
195
228
  }
229
+ getTransformData(externalTransform) {
230
+ const rotateData = this.getRotateData(), rotating = this.isRotating;
231
+ this._cachedTransform.a = rotateData.cos * (externalTransform.a ?? defaultTransform.a);
232
+ this._cachedTransform.b = rotating
233
+ ? rotateData.sin * (externalTransform.b ?? identity)
234
+ : (externalTransform.b ?? defaultTransform.b);
235
+ this._cachedTransform.c = rotating
236
+ ? -rotateData.sin * (externalTransform.c ?? identity)
237
+ : (externalTransform.c ?? defaultTransform.c);
238
+ this._cachedTransform.d = rotateData.cos * (externalTransform.d ?? defaultTransform.d);
239
+ return this._cachedTransform;
240
+ }
196
241
  init(id, position, overrideOptions, group) {
197
- const container = this.container, engine = this._engine;
242
+ const container = this.container;
198
243
  this.id = id;
199
244
  this.group = group;
200
245
  this.effectClose = true;
@@ -254,10 +299,6 @@ export class Particle {
254
299
  if (shapeData) {
255
300
  particlesOptions.load(shapeData.particles);
256
301
  }
257
- const interactivity = new Interactivity(engine, container);
258
- interactivity.load(container.actualOptions.interactivity);
259
- interactivity.load(particlesOptions.interactivity);
260
- this.interactivity = interactivity;
261
302
  this.effectFill = effectData?.fill ?? particlesOptions.effect.fill;
262
303
  this.effectClose = effectData?.close ?? particlesOptions.effect.close;
263
304
  this.shapeFill = shapeData?.fill ?? particlesOptions.shape.fill;
@@ -326,7 +367,7 @@ export class Particle {
326
367
  }
327
368
  effectDrawer?.particleInit?.(container, this);
328
369
  shapeDrawer?.particleInit?.(container, this);
329
- for (const plugin of container.plugins.values()) {
370
+ for (const plugin of container.plugins) {
330
371
  plugin.particleCreated?.(this);
331
372
  }
332
373
  }
@@ -1,13 +1,11 @@
1
1
  import { countOffset, defaultDensityFactor, defaultRemoveQuantity, deleteCount, lengthOffset, minCount, minIndex, minLimit, posOffset, qTreeCapacity, sizeFactor, squareExp, } from "./Utils/Constants.js";
2
2
  import { EventType } from "../Enums/Types/EventType.js";
3
- import { InteractionManager } from "./Utils/InteractionManager.js";
4
3
  import { LimitMode } from "../Enums/Modes/LimitMode.js";
5
4
  import { Particle } from "./Particle.js";
6
5
  import { Point } from "./Utils/Point.js";
7
6
  import { QuadTree } from "./Utils/QuadTree.js";
8
7
  import { Rectangle } from "./Utils/Ranges.js";
9
8
  import { getLogger } from "../Utils/LogUtils.js";
10
- import { getPosition } from "../Utils/Utils.js";
11
9
  import { loadParticlesOptions } from "../Utils/OptionsUtils.js";
12
10
  const qTreeRectangle = (canvasSize) => {
13
11
  const { height, width } = canvasSize;
@@ -18,7 +16,7 @@ export class Particles {
18
16
  this._addToPool = (...particles) => {
19
17
  this._pool.push(...particles);
20
18
  };
21
- this._applyDensity = (options, manualCount, group, groupOptions) => {
19
+ this._applyDensity = (options, pluginsCount, group, groupOptions) => {
22
20
  const numberOptions = options.number;
23
21
  if (!numberOptions.density.enable) {
24
22
  if (group === undefined) {
@@ -29,7 +27,7 @@ export class Particles {
29
27
  }
30
28
  return;
31
29
  }
32
- const densityFactor = this._initDensityFactor(numberOptions.density), optParticlesNumber = numberOptions.value, optParticlesLimit = numberOptions.limit.value > minLimit ? numberOptions.limit.value : optParticlesNumber, particlesNumber = Math.min(optParticlesNumber, optParticlesLimit) * densityFactor + manualCount, particlesCount = Math.min(this.count, this.filter(t => t.group === group).length);
30
+ const densityFactor = this._initDensityFactor(numberOptions.density), optParticlesNumber = numberOptions.value, optParticlesLimit = numberOptions.limit.value > minLimit ? numberOptions.limit.value : optParticlesNumber, particlesNumber = Math.min(optParticlesNumber, optParticlesLimit) * densityFactor + pluginsCount, particlesCount = Math.min(this.count, this.filter(t => t.group === group).length);
33
31
  if (group === undefined) {
34
32
  this._limit = numberOptions.limit.value * densityFactor;
35
33
  }
@@ -109,7 +107,6 @@ export class Particles {
109
107
  this._groupLimits = new Map();
110
108
  this._needsSort = false;
111
109
  this._lastZIndex = 0;
112
- this._interactionManager = new InteractionManager(engine, container);
113
110
  this._pluginsInitialized = false;
114
111
  const canvasSize = container.canvas.size;
115
112
  this.quadTree = new QuadTree(qTreeRectangle(canvasSize), qTreeCapacity);
@@ -119,10 +116,6 @@ export class Particles {
119
116
  get count() {
120
117
  return this._array.length;
121
118
  }
122
- addManualParticles() {
123
- const container = this._container, options = container.actualOptions;
124
- options.manualParticles.forEach(p => this.addParticle(p.position ? getPosition(p.position, container.canvas.size) : undefined, p.options));
125
- }
126
119
  addParticle(position, overrideOptions, group, initializer) {
127
120
  const limitMode = this._container.actualOptions.particles.number.limit.mode, limit = group === undefined ? this._limit : (this._groupLimits.get(group) ?? this._limit), currentCount = this.count;
128
121
  if (limit > minLimit) {
@@ -168,22 +161,23 @@ export class Particles {
168
161
  get(index) {
169
162
  return this._array[index];
170
163
  }
171
- handleClickMode(mode) {
172
- this._interactionManager.handleClickMode(mode);
173
- }
174
164
  async init() {
175
165
  const container = this._container, options = container.actualOptions;
176
166
  this._lastZIndex = 0;
177
167
  this._needsSort = false;
168
+ for (const plugin of container.plugins) {
169
+ if (plugin.redrawInit) {
170
+ await plugin.redrawInit();
171
+ }
172
+ }
178
173
  await this.initPlugins();
179
174
  let handled = false;
180
- for (const plugin of container.plugins.values()) {
175
+ for (const plugin of container.plugins) {
181
176
  handled = plugin.particlesInitialization?.() ?? handled;
182
177
  if (handled) {
183
178
  break;
184
179
  }
185
180
  }
186
- this.addManualParticles();
187
181
  if (!handled) {
188
182
  const particlesOptions = options.particles, groups = particlesOptions.groups;
189
183
  for (const group in groups) {
@@ -207,14 +201,13 @@ export class Particles {
207
201
  const container = this._container;
208
202
  this.movers = await this._engine.getMovers(container, true);
209
203
  this.updaters = await this._engine.getUpdaters(container, true);
210
- await this._interactionManager.init();
211
204
  for (const pathGenerator of container.pathGenerators.values()) {
212
205
  pathGenerator.init(container);
213
206
  }
214
207
  }
215
- push(nb, mouse, overrideOptions, group) {
208
+ push(nb, position, overrideOptions, group) {
216
209
  for (let i = 0; i < nb; i++) {
217
- this.addParticle(mouse?.position, overrideOptions, group);
210
+ this.addParticle(position, overrideOptions, group);
218
211
  }
219
212
  }
220
213
  async redraw() {
@@ -241,16 +234,22 @@ export class Particles {
241
234
  this.removeAt(minIndex, quantity, group);
242
235
  }
243
236
  setDensity() {
244
- const options = this._container.actualOptions, groups = options.particles.groups, manualCount = options.manualParticles.length;
237
+ const options = this._container.actualOptions, groups = options.particles.groups;
238
+ let pluginsCount = 0;
239
+ for (const plugin of this._container.plugins) {
240
+ if (plugin.particlesDensityCount) {
241
+ pluginsCount += plugin.particlesDensityCount();
242
+ }
243
+ }
245
244
  for (const group in groups) {
246
245
  const groupData = groups[group];
247
246
  if (!groupData) {
248
247
  continue;
249
248
  }
250
249
  const groupDataOptions = loadParticlesOptions(this._engine, this._container, groupData);
251
- this._applyDensity(groupDataOptions, manualCount, group);
250
+ this._applyDensity(groupDataOptions, pluginsCount, group);
252
251
  }
253
- this._applyDensity(options.particles, manualCount);
252
+ this._applyDensity(options.particles, pluginsCount);
254
253
  }
255
254
  setLastZIndex(zIndex) {
256
255
  this._lastZIndex = zIndex;
@@ -265,7 +264,7 @@ export class Particles {
265
264
  for (const pathGenerator of container.pathGenerators.values()) {
266
265
  pathGenerator.update();
267
266
  }
268
- for (const plugin of container.plugins.values()) {
267
+ for (const plugin of container.plugins) {
269
268
  plugin.update?.(delta);
270
269
  }
271
270
  const resizeFactor = this._resizeFactor;
@@ -277,8 +276,12 @@ export class Particles {
277
276
  particle.initialPosition.y *= resizeFactor.height;
278
277
  }
279
278
  particle.ignoresResizeRatio = false;
280
- this._interactionManager.reset(particle);
281
- for (const plugin of this._container.plugins.values()) {
279
+ for (const plugin of this._container.plugins) {
280
+ if (plugin.particleReset) {
281
+ plugin.particleReset(particle);
282
+ }
283
+ }
284
+ for (const plugin of this._container.plugins) {
282
285
  if (particle.destroyed) {
283
286
  break;
284
287
  }
@@ -309,13 +312,21 @@ export class Particles {
309
312
  }
310
313
  this._addToPool(...particlesToDelete);
311
314
  }
312
- this._interactionManager.externalInteract(delta);
315
+ for (const plugin of container.plugins) {
316
+ if (plugin.postUpdate) {
317
+ plugin.postUpdate(delta);
318
+ }
319
+ }
313
320
  for (const particle of this._array) {
314
321
  for (const updater of this.updaters) {
315
322
  updater.update(particle, delta);
316
323
  }
317
324
  if (!particle.destroyed && !particle.spawning) {
318
- this._interactionManager.particlesInteract(particle, delta);
325
+ for (const plugin of container.plugins) {
326
+ if (plugin.postParticleUpdate) {
327
+ plugin.postParticleUpdate(particle, delta);
328
+ }
329
+ }
319
330
  }
320
331
  }
321
332
  delete this._resizeFactor;
@@ -1,4 +1,4 @@
1
- export const generatedAttribute = "generated", mouseDownEvent = "pointerdown", mouseUpEvent = "pointerup", mouseLeaveEvent = "pointerleave", mouseOutEvent = "pointerout", mouseMoveEvent = "pointermove", touchStartEvent = "touchstart", touchEndEvent = "touchend", touchMoveEvent = "touchmove", touchCancelEvent = "touchcancel", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
1
+ export const generatedAttribute = "generated", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
2
2
  x: 0,
3
3
  y: 0,
4
4
  z: 0,
@@ -7,4 +7,4 @@ export const generatedAttribute = "generated", mouseDownEvent = "pointerdown", m
7
7
  b: 0,
8
8
  c: 0,
9
9
  d: 1,
10
- }, randomColorValue = "random", midColorValue = "mid", double = 2, doublePI = Math.PI * double, defaultFps = 60, defaultAlpha = 1, generatedTrue = "true", generatedFalse = "false", canvasTag = "canvas", defaultRetryCount = 0, squareExp = 2, qTreeCapacity = 4, defaultRemoveQuantity = 1, defaultRatio = 1, defaultReduceFactor = 1, subdivideCount = 4, inverseFactorNumerator = 1.0, rgbMax = 255, hMax = 360, sMax = 100, lMax = 100, hMin = 0, sMin = 0, hPhase = 60, empty = 0, quarter = 0.25, threeQuarter = half + quarter, minVelocity = 0, defaultTransformValue = 1, minimumSize = 0, minimumLength = 0, zIndexFactorOffset = 1, defaultOpacity = 1, clickRadius = 1, touchEndLengthOffset = 1, minCoordinate = 0, removeDeleteCount = 1, removeMinIndex = 0, defaultFpsLimit = 120, minFpsLimit = 0, canvasFirstIndex = 0, loadRandomFactor = 10000, loadMinIndex = 0, one = 1, none = 0, decayOffset = 1, tryCountIncrement = 1, minRetries = 0, rollFactor = 1, minZ = 0, defaultRadius = 0, posOffset = -quarter, sizeFactor = 1.5, minLimit = 0, countOffset = 1, minCount = 0, minIndex = 0, manualCount = 0, lengthOffset = 1, defaultDensityFactor = 1, deleteCount = 1, touchDelay = 500, manualDefaultPosition = 50, defaultAngle = 0, identity = 1, minStrokeWidth = 0, lFactor = 1, lMin = 0, triple = 3, sextuple = 6, sNormalizedOffset = 1, phaseNumerator = 1, defaultRgbMin = 0, defaultVelocity = 0, defaultLoops = 0, defaultTime = 0;
10
+ }, randomColorValue = "random", midColorValue = "mid", double = 2, doublePI = Math.PI * double, defaultFps = 60, defaultAlpha = 1, generatedTrue = "true", generatedFalse = "false", canvasTag = "canvas", defaultRetryCount = 0, squareExp = 2, qTreeCapacity = 4, defaultRemoveQuantity = 1, defaultRatio = 1, defaultReduceFactor = 1, subdivideCount = 4, inverseFactorNumerator = 1.0, rgbMax = 255, hMax = 360, sMax = 100, lMax = 100, hMin = 0, sMin = 0, hPhase = 60, empty = 0, quarter = 0.25, threeQuarter = half + quarter, minVelocity = 0, defaultTransformValue = 1, minimumSize = 0, minimumLength = 0, zIndexFactorOffset = 1, defaultOpacity = 1, clickRadius = 1, touchEndLengthOffset = 1, minCoordinate = 0, removeDeleteCount = 1, removeMinIndex = 0, defaultFpsLimit = 120, minFpsLimit = 0, canvasFirstIndex = 0, loadRandomFactor = 10000, loadMinIndex = 0, one = 1, none = 0, decayOffset = 1, tryCountIncrement = 1, minRetries = 0, rollFactor = 1, minZ = 0, defaultRadius = 0, posOffset = -quarter, sizeFactor = 1.5, minLimit = 0, countOffset = 1, minCount = 0, minIndex = 0, lengthOffset = 1, defaultDensityFactor = 1, deleteCount = 1, touchDelay = 500, manualDefaultPosition = 50, defaultAngle = 0, identity = 1, minStrokeWidth = 0, lFactor = 1, lMin = 0, triple = 3, sextuple = 6, sNormalizedOffset = 1, phaseNumerator = 1, defaultRgbMin = 0, defaultVelocity = 0, defaultLoops = 0, defaultTime = 0;