@tsparticles/engine 4.0.0-alpha.5 → 4.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/164.min.js +1 -0
  2. package/README.md +41 -7
  3. package/browser/Core/Canvas.js +250 -143
  4. package/browser/Core/Container.js +80 -74
  5. package/browser/Core/Engine.js +44 -67
  6. package/browser/Core/Particle.js +202 -173
  7. package/browser/Core/Particles.js +187 -138
  8. package/browser/Core/Retina.js +5 -0
  9. package/browser/Core/Utils/Constants.js +2 -2
  10. package/browser/Core/Utils/EventListeners.js +67 -63
  11. package/browser/Core/Utils/Ranges.js +29 -10
  12. package/browser/Core/Utils/SpatialHashGrid.js +102 -0
  13. package/browser/Core/Utils/Vectors.js +17 -18
  14. package/browser/Enums/Types/EasingType.js +18 -3
  15. package/browser/Options/Classes/AnimatableColor.js +1 -0
  16. package/browser/Options/Classes/AnimationOptions.js +8 -0
  17. package/browser/Options/Classes/Background/Background.js +6 -0
  18. package/browser/Options/Classes/ColorAnimation.js +12 -1
  19. package/browser/Options/Classes/FullScreen/FullScreen.js +2 -0
  20. package/browser/Options/Classes/HslAnimation.js +4 -5
  21. package/browser/Options/Classes/Options.js +63 -4
  22. package/browser/Options/Classes/OptionsColor.js +1 -0
  23. package/browser/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  24. package/browser/Options/Classes/Particles/Effect/Effect.js +3 -4
  25. package/browser/Options/Classes/Particles/Fill.js +28 -0
  26. package/browser/Options/Classes/Particles/Move/Move.js +17 -3
  27. package/browser/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  28. package/browser/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  29. package/browser/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  30. package/browser/Options/Classes/Particles/Move/OutModes.js +5 -0
  31. package/browser/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  32. package/browser/Options/Classes/Particles/Move/Spin.js +3 -0
  33. package/browser/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  34. package/browser/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  35. package/browser/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  36. package/browser/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  37. package/browser/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  38. package/browser/Options/Classes/Particles/ParticlesOptions.js +25 -5
  39. package/browser/Options/Classes/Particles/Shape/Shape.js +3 -4
  40. package/browser/Options/Classes/Particles/Size/Size.js +1 -0
  41. package/browser/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  42. package/browser/Options/Classes/Particles/Stroke.js +3 -0
  43. package/browser/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  44. package/browser/Options/Classes/ResizeEvent.js +2 -0
  45. package/browser/Options/Classes/ValueWithRandom.js +3 -4
  46. package/browser/Utils/CanvasUtils.js +43 -62
  47. package/browser/Utils/ColorUtils.js +30 -19
  48. package/browser/Utils/EventDispatcher.js +1 -0
  49. package/browser/Utils/MathUtils.js +12 -7
  50. package/browser/Utils/Utils.js +109 -31
  51. package/browser/exports.js +1 -2
  52. package/cjs/Core/Canvas.js +250 -143
  53. package/cjs/Core/Container.js +80 -74
  54. package/cjs/Core/Engine.js +44 -67
  55. package/cjs/Core/Particle.js +202 -173
  56. package/cjs/Core/Particles.js +187 -138
  57. package/cjs/Core/Retina.js +5 -0
  58. package/cjs/Core/Utils/Constants.js +2 -2
  59. package/cjs/Core/Utils/EventListeners.js +67 -63
  60. package/cjs/Core/Utils/Ranges.js +29 -10
  61. package/cjs/Core/Utils/SpatialHashGrid.js +102 -0
  62. package/cjs/Core/Utils/Vectors.js +17 -18
  63. package/cjs/Enums/Types/EasingType.js +18 -3
  64. package/cjs/Options/Classes/AnimatableColor.js +1 -0
  65. package/cjs/Options/Classes/AnimationOptions.js +8 -0
  66. package/cjs/Options/Classes/Background/Background.js +6 -0
  67. package/cjs/Options/Classes/ColorAnimation.js +12 -1
  68. package/cjs/Options/Classes/FullScreen/FullScreen.js +2 -0
  69. package/cjs/Options/Classes/HslAnimation.js +4 -5
  70. package/cjs/Options/Classes/Options.js +63 -4
  71. package/cjs/Options/Classes/OptionsColor.js +1 -0
  72. package/cjs/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  73. package/cjs/Options/Classes/Particles/Effect/Effect.js +3 -4
  74. package/cjs/Options/Classes/Particles/Fill.js +28 -0
  75. package/cjs/Options/Classes/Particles/Move/Move.js +17 -3
  76. package/cjs/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  77. package/cjs/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  78. package/cjs/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  79. package/cjs/Options/Classes/Particles/Move/OutModes.js +5 -0
  80. package/cjs/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  81. package/cjs/Options/Classes/Particles/Move/Spin.js +3 -0
  82. package/cjs/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  83. package/cjs/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  84. package/cjs/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  85. package/cjs/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  86. package/cjs/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  87. package/cjs/Options/Classes/Particles/ParticlesOptions.js +25 -5
  88. package/cjs/Options/Classes/Particles/Shape/Shape.js +3 -4
  89. package/cjs/Options/Classes/Particles/Size/Size.js +1 -0
  90. package/cjs/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  91. package/cjs/Options/Classes/Particles/Stroke.js +3 -0
  92. package/cjs/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  93. package/cjs/Options/Classes/ResizeEvent.js +2 -0
  94. package/cjs/Options/Classes/ValueWithRandom.js +3 -4
  95. package/cjs/Utils/CanvasUtils.js +43 -62
  96. package/cjs/Utils/ColorUtils.js +30 -19
  97. package/cjs/Utils/EventDispatcher.js +1 -0
  98. package/cjs/Utils/MathUtils.js +12 -7
  99. package/cjs/Utils/Utils.js +109 -31
  100. package/cjs/exports.js +1 -2
  101. package/dist_browser_Core_Container_js.js +12 -12
  102. package/esm/Core/Canvas.js +250 -143
  103. package/esm/Core/Container.js +80 -74
  104. package/esm/Core/Engine.js +44 -67
  105. package/esm/Core/Particle.js +202 -173
  106. package/esm/Core/Particles.js +187 -138
  107. package/esm/Core/Retina.js +5 -0
  108. package/esm/Core/Utils/Constants.js +2 -2
  109. package/esm/Core/Utils/EventListeners.js +67 -63
  110. package/esm/Core/Utils/Ranges.js +29 -10
  111. package/esm/Core/Utils/SpatialHashGrid.js +102 -0
  112. package/esm/Core/Utils/Vectors.js +17 -18
  113. package/esm/Enums/Types/EasingType.js +18 -3
  114. package/esm/Options/Classes/AnimatableColor.js +1 -0
  115. package/esm/Options/Classes/AnimationOptions.js +8 -0
  116. package/esm/Options/Classes/Background/Background.js +6 -0
  117. package/esm/Options/Classes/ColorAnimation.js +12 -1
  118. package/esm/Options/Classes/FullScreen/FullScreen.js +2 -0
  119. package/esm/Options/Classes/HslAnimation.js +4 -5
  120. package/esm/Options/Classes/Options.js +63 -4
  121. package/esm/Options/Classes/OptionsColor.js +1 -0
  122. package/esm/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  123. package/esm/Options/Classes/Particles/Effect/Effect.js +3 -4
  124. package/esm/Options/Classes/Particles/Fill.js +28 -0
  125. package/esm/Options/Classes/Particles/Move/Move.js +17 -3
  126. package/esm/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  127. package/esm/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  128. package/esm/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  129. package/esm/Options/Classes/Particles/Move/OutModes.js +5 -0
  130. package/esm/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  131. package/esm/Options/Classes/Particles/Move/Spin.js +3 -0
  132. package/esm/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  133. package/esm/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  134. package/esm/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  135. package/esm/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  136. package/esm/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  137. package/esm/Options/Classes/Particles/ParticlesOptions.js +25 -5
  138. package/esm/Options/Classes/Particles/Shape/Shape.js +3 -4
  139. package/esm/Options/Classes/Particles/Size/Size.js +1 -0
  140. package/esm/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  141. package/esm/Options/Classes/Particles/Stroke.js +3 -0
  142. package/esm/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  143. package/esm/Options/Classes/ResizeEvent.js +2 -0
  144. package/esm/Options/Classes/ValueWithRandom.js +3 -4
  145. package/esm/Utils/CanvasUtils.js +43 -62
  146. package/esm/Utils/ColorUtils.js +30 -19
  147. package/esm/Utils/EventDispatcher.js +1 -0
  148. package/esm/Utils/MathUtils.js +12 -7
  149. package/esm/Utils/Utils.js +109 -31
  150. package/esm/exports.js +1 -2
  151. package/package.json +1 -1
  152. package/report.html +3 -3
  153. package/scripts/install.js +4 -20
  154. package/tsparticles.engine.js +93 -91
  155. package/tsparticles.engine.min.js +2 -2
  156. package/types/Core/Canvas.d.ts +17 -4
  157. package/types/Core/Container.d.ts +3 -7
  158. package/types/Core/Engine.d.ts +13 -20
  159. package/types/Core/Interfaces/IColorManager.d.ts +0 -1
  160. package/types/Core/Interfaces/IContainerPlugin.d.ts +6 -1
  161. package/types/Core/Interfaces/IPalette.d.ts +7 -0
  162. package/types/Core/Interfaces/IParticleOpacityData.d.ts +1 -0
  163. package/types/Core/Interfaces/IParticleValueAnimation.d.ts +3 -3
  164. package/types/Core/Interfaces/IShapeDrawData.d.ts +8 -0
  165. package/types/Core/Interfaces/IShapeDrawer.d.ts +0 -1
  166. package/types/Core/Interfaces/IShapeValues.d.ts +0 -1
  167. package/types/Core/Particle.d.ts +4 -7
  168. package/types/Core/Particles.d.ts +15 -7
  169. package/types/Core/Utils/Constants.d.ts +2 -2
  170. package/types/Core/Utils/Ranges.d.ts +4 -1
  171. package/types/Core/Utils/SpatialHashGrid.d.ts +25 -0
  172. package/types/Core/Utils/Vectors.d.ts +8 -10
  173. package/types/Enums/Types/EasingType.d.ts +20 -5
  174. package/types/Options/Classes/ColorAnimation.d.ts +3 -1
  175. package/types/Options/Classes/HslAnimation.d.ts +3 -4
  176. package/types/Options/Classes/Options.d.ts +2 -0
  177. package/types/Options/Classes/Particles/Effect/Effect.d.ts +0 -1
  178. package/types/Options/Classes/Particles/Fill.d.ts +12 -0
  179. package/types/Options/Classes/Particles/Move/Move.d.ts +0 -2
  180. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +2 -2
  181. package/types/Options/Classes/Particles/Shape/Shape.d.ts +0 -1
  182. package/types/Options/Classes/ValueWithRandom.d.ts +0 -1
  183. package/types/Options/Interfaces/IColorAnimation.d.ts +2 -0
  184. package/types/Options/Interfaces/IOptions.d.ts +1 -0
  185. package/types/Options/Interfaces/Particles/Effect/IEffect.d.ts +0 -1
  186. package/types/Options/Interfaces/Particles/IFill.d.ts +9 -0
  187. package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +2 -2
  188. package/types/Options/Interfaces/Particles/IStroke.d.ts +2 -2
  189. package/types/Options/Interfaces/Particles/Move/IMove.d.ts +0 -2
  190. package/types/Options/Interfaces/Particles/Shape/IShape.d.ts +0 -1
  191. package/types/Types/EngineInitializers.d.ts +6 -3
  192. package/types/Utils/CanvasUtils.d.ts +6 -14
  193. package/types/Utils/ColorUtils.d.ts +3 -2
  194. package/types/Utils/MathUtils.d.ts +2 -0
  195. package/types/Utils/Utils.d.ts +8 -1
  196. package/types/export-types.d.ts +3 -5
  197. package/types/exports.d.ts +1 -2
  198. package/umd/Core/Canvas.js +248 -141
  199. package/umd/Core/Container.js +80 -74
  200. package/umd/Core/Engine.js +43 -66
  201. package/umd/Core/Particle.js +203 -174
  202. package/umd/Core/Particles.js +187 -138
  203. package/umd/Core/Retina.js +5 -0
  204. package/umd/Core/Utils/Constants.js +3 -3
  205. package/umd/Core/Utils/EventListeners.js +67 -63
  206. package/umd/Core/Utils/Ranges.js +28 -9
  207. package/umd/Core/Utils/SpatialHashGrid.js +116 -0
  208. package/umd/Core/Utils/Vectors.js +17 -18
  209. package/umd/Enums/Types/EasingType.js +18 -3
  210. package/umd/Options/Classes/AnimatableColor.js +1 -0
  211. package/umd/Options/Classes/AnimationOptions.js +8 -0
  212. package/umd/Options/Classes/Background/Background.js +6 -0
  213. package/umd/Options/Classes/ColorAnimation.js +12 -1
  214. package/umd/Options/Classes/FullScreen/FullScreen.js +2 -0
  215. package/umd/Options/Classes/HslAnimation.js +5 -6
  216. package/umd/Options/Classes/Options.js +63 -4
  217. package/umd/Options/Classes/OptionsColor.js +1 -0
  218. package/umd/Options/Classes/Particles/Bounce/ParticlesBounce.js +2 -0
  219. package/umd/Options/Classes/Particles/Effect/Effect.js +3 -4
  220. package/umd/Options/Classes/Particles/Fill.js +42 -0
  221. package/umd/Options/Classes/Particles/Move/Move.js +18 -4
  222. package/umd/Options/Classes/Particles/Move/MoveAngle.js +2 -0
  223. package/umd/Options/Classes/Particles/Move/MoveCenter.js +4 -0
  224. package/umd/Options/Classes/Particles/Move/MoveGravity.js +4 -0
  225. package/umd/Options/Classes/Particles/Move/OutModes.js +5 -0
  226. package/umd/Options/Classes/Particles/Move/Path/MovePath.js +5 -0
  227. package/umd/Options/Classes/Particles/Move/Spin.js +3 -0
  228. package/umd/Options/Classes/Particles/Number/ParticlesDensity.js +3 -0
  229. package/umd/Options/Classes/Particles/Number/ParticlesNumber.js +3 -0
  230. package/umd/Options/Classes/Particles/Number/ParticlesNumberLimit.js +2 -0
  231. package/umd/Options/Classes/Particles/Opacity/Opacity.js +1 -0
  232. package/umd/Options/Classes/Particles/Opacity/OpacityAnimation.js +1 -0
  233. package/umd/Options/Classes/Particles/ParticlesOptions.js +26 -6
  234. package/umd/Options/Classes/Particles/Shape/Shape.js +3 -4
  235. package/umd/Options/Classes/Particles/Size/Size.js +1 -0
  236. package/umd/Options/Classes/Particles/Size/SizeAnimation.js +1 -0
  237. package/umd/Options/Classes/Particles/Stroke.js +3 -0
  238. package/umd/Options/Classes/Particles/ZIndex/ZIndex.js +3 -0
  239. package/umd/Options/Classes/ResizeEvent.js +2 -0
  240. package/umd/Options/Classes/ValueWithRandom.js +3 -4
  241. package/umd/Utils/CanvasUtils.js +43 -66
  242. package/umd/Utils/ColorUtils.js +30 -18
  243. package/umd/Utils/EventDispatcher.js +1 -0
  244. package/umd/Utils/MathUtils.js +14 -7
  245. package/umd/Utils/Utils.js +111 -32
  246. package/umd/exports.js +2 -3
  247. package/794.min.js +0 -2
  248. package/794.min.js.LICENSE.txt +0 -1
  249. package/browser/Core/Utils/Point.js +0 -6
  250. package/browser/Core/Utils/QuadTree.js +0 -59
  251. package/browser/Options/Classes/Particles/Move/MoveAttract.js +0 -33
  252. package/cjs/Core/Utils/Point.js +0 -6
  253. package/cjs/Core/Utils/QuadTree.js +0 -59
  254. package/cjs/Options/Classes/Particles/Move/MoveAttract.js +0 -33
  255. package/esm/Core/Interfaces/IMovePathGenerator.js +0 -1
  256. package/esm/Core/Interfaces/IParticleMover.js +0 -1
  257. package/esm/Core/Utils/Point.js +0 -6
  258. package/esm/Core/Utils/QuadTree.js +0 -59
  259. package/esm/Options/Classes/Particles/Move/MoveAttract.js +0 -33
  260. package/esm/Options/Interfaces/Particles/Move/IMoveAttract.js +0 -1
  261. package/tsparticles.engine.min.js.LICENSE.txt +0 -1
  262. package/types/Core/Interfaces/IMovePathGenerator.d.ts +0 -10
  263. package/types/Core/Interfaces/IParticleMover.d.ts +0 -7
  264. package/types/Core/Utils/Point.d.ts +0 -7
  265. package/types/Core/Utils/QuadTree.d.ts +0 -18
  266. package/types/Options/Classes/Particles/Move/MoveAttract.d.ts +0 -12
  267. package/types/Options/Interfaces/Particles/Move/IMoveAttract.d.ts +0 -7
  268. package/umd/Core/Utils/Point.js +0 -20
  269. package/umd/Core/Utils/QuadTree.js +0 -73
  270. package/umd/Options/Classes/Particles/Move/MoveAttract.js +0 -47
  271. package/umd/Options/Interfaces/Particles/Move/IMoveAttract.js +0 -12
  272. /package/browser/Core/Interfaces/{IMovePathGenerator.js → IPalette.js} +0 -0
  273. /package/browser/{Core/Interfaces/IParticleMover.js → Options/Interfaces/Particles/IFill.js} +0 -0
  274. /package/{browser/Options/Interfaces/Particles/Move/IMoveAttract.js → cjs/Core/Interfaces/IPalette.js} +0 -0
  275. /package/cjs/{Core/Interfaces/IMovePathGenerator.js → Options/Interfaces/Particles/IFill.js} +0 -0
  276. /package/{cjs/Core/Interfaces/IParticleMover.js → esm/Core/Interfaces/IPalette.js} +0 -0
  277. /package/{cjs/Options/Interfaces/Particles/Move/IMoveAttract.js → esm/Options/Interfaces/Particles/IFill.js} +0 -0
  278. /package/umd/Core/Interfaces/{IMovePathGenerator.js → IPalette.js} +0 -0
  279. /package/umd/{Core/Interfaces/IParticleMover.js → Options/Interfaces/Particles/IFill.js} +0 -0
@@ -21,37 +21,37 @@ function loadContainerOptions(engine, container, ...sourceOptionsArr) {
21
21
  return options;
22
22
  }
23
23
  export class Container {
24
+ actualOptions;
25
+ canvas;
26
+ destroyed;
27
+ fpsLimit;
28
+ hdr;
29
+ id;
30
+ pageHidden;
31
+ particleCreatedPlugins;
32
+ particleDestroyedPlugins;
33
+ particlePositionPlugins;
34
+ particles;
35
+ plugins;
36
+ retina;
37
+ started;
38
+ zLayers;
39
+ _delay;
40
+ _delayTimeout;
41
+ _delta = { value: 0, factor: 0 };
42
+ _drawAnimationFrame;
43
+ _duration;
44
+ _engine;
45
+ _eventListeners;
46
+ _firstStart;
47
+ _initialSourceOptions;
48
+ _lastFrameTime;
49
+ _lifeTime;
50
+ _options;
51
+ _paused;
52
+ _smooth;
53
+ _sourceOptions;
24
54
  constructor(engine, id, sourceOptions) {
25
- this._delta = { value: 0, factor: 0 };
26
- this._nextFrame = (timestamp) => {
27
- try {
28
- if (!this._smooth &&
29
- this._lastFrameTime !== undefined &&
30
- timestamp < this._lastFrameTime + millisecondsToSeconds / this.fpsLimit) {
31
- this.draw(false);
32
- return;
33
- }
34
- this._lastFrameTime ??= timestamp;
35
- updateDelta(this._delta, timestamp - this._lastFrameTime, this.fpsLimit, this._smooth);
36
- this.addLifeTime(this._delta.value);
37
- this._lastFrameTime = timestamp;
38
- if (this._delta.value > millisecondsToSeconds) {
39
- this.draw(false);
40
- return;
41
- }
42
- this.canvas.drawParticles(this._delta);
43
- if (!this.alive()) {
44
- this.destroy();
45
- return;
46
- }
47
- if (this.animationStatus) {
48
- this.draw(false);
49
- }
50
- }
51
- catch (e) {
52
- getLogger().error("error in animation loop", e);
53
- }
54
- };
55
55
  this._engine = engine;
56
56
  this.id = Symbol(id);
57
57
  this.fpsLimit = 120;
@@ -72,10 +72,10 @@ export class Container {
72
72
  this.retina = new Retina(this);
73
73
  this.canvas = new Canvas(this, this._engine);
74
74
  this.particles = new Particles(this._engine, this);
75
- this.pathGenerators = new Map();
76
75
  this.plugins = [];
77
- this.effectDrawers = new Map();
78
- this.shapeDrawers = new Map();
76
+ this.particleDestroyedPlugins = [];
77
+ this.particleCreatedPlugins = [];
78
+ this.particlePositionPlugins = [];
79
79
  this._options = loadContainerOptions(this._engine, this);
80
80
  this.actualOptions = loadContainerOptions(this._engine, this);
81
81
  this._eventListeners = new EventListeners(this);
@@ -93,13 +93,6 @@ export class Container {
93
93
  addLifeTime(value) {
94
94
  this._lifeTime += value;
95
95
  }
96
- addPath(key, generator, override = false) {
97
- if (!guardCheck(this) || (!override && this.pathGenerators.has(key))) {
98
- return false;
99
- }
100
- this.pathGenerators.set(key, generator);
101
- return true;
102
- }
103
96
  alive() {
104
97
  return !this._duration || this._lifeTime <= this._duration;
105
98
  }
@@ -110,14 +103,6 @@ export class Container {
110
103
  this.stop();
111
104
  this.particles.destroy();
112
105
  this.canvas.destroy();
113
- for (const effectDrawer of this.effectDrawers.values()) {
114
- effectDrawer.destroy?.(this);
115
- }
116
- this.effectDrawers.clear();
117
- for (const shapeDrawer of this.shapeDrawers.values()) {
118
- shapeDrawer.destroy?.(this);
119
- }
120
- this.shapeDrawers.clear();
121
106
  for (const plugin of this.plugins) {
122
107
  plugin.destroy?.();
123
108
  }
@@ -137,15 +122,12 @@ export class Container {
137
122
  return;
138
123
  }
139
124
  let refreshTime = force;
140
- const frame = (timestamp) => {
125
+ this._drawAnimationFrame = animate((timestamp) => {
141
126
  if (refreshTime) {
142
127
  this._lastFrameTime = undefined;
143
128
  refreshTime = false;
144
129
  }
145
130
  this._nextFrame(timestamp);
146
- };
147
- this._drawAnimationFrame = animate(timestamp => {
148
- frame(timestamp);
149
131
  });
150
132
  }
151
133
  async export(type, options = {}) {
@@ -166,20 +148,6 @@ export class Container {
166
148
  if (!guardCheck(this)) {
167
149
  return;
168
150
  }
169
- const effects = this._engine.getSupportedEffects();
170
- for (const type of effects) {
171
- const drawer = this._engine.getEffectDrawer(type);
172
- if (drawer) {
173
- this.effectDrawers.set(type, drawer);
174
- }
175
- }
176
- const shapes = this._engine.getSupportedShapes();
177
- for (const type of shapes) {
178
- const drawer = this._engine.getShapeDrawer(type);
179
- if (drawer) {
180
- this.shapeDrawers.set(type, drawer);
181
- }
182
- }
183
151
  const allContainerPlugins = new Map();
184
152
  for (const plugin of this._engine.plugins) {
185
153
  const containerPlugin = await plugin.getPlugin(this);
@@ -191,9 +159,22 @@ export class Container {
191
159
  await this.particles.initPlugins();
192
160
  this._options = loadContainerOptions(this._engine, this, this._initialSourceOptions, this.sourceOptions);
193
161
  this.actualOptions = loadContainerOptions(this._engine, this, this._options);
162
+ this.plugins.length = 0;
163
+ this.particleDestroyedPlugins.length = 0;
164
+ this.particleCreatedPlugins.length = 0;
165
+ this.particlePositionPlugins.length = 0;
194
166
  for (const [plugin, containerPlugin] of allContainerPlugins) {
195
167
  if (plugin.needsPlugin(this.actualOptions)) {
196
168
  this.plugins.push(containerPlugin);
169
+ if (containerPlugin.particleCreated) {
170
+ this.particleCreatedPlugins.push(containerPlugin);
171
+ }
172
+ if (containerPlugin.particleDestroyed) {
173
+ this.particleDestroyedPlugins.push(containerPlugin);
174
+ }
175
+ if (containerPlugin.particlePosition) {
176
+ this.particlePositionPlugins.push(containerPlugin);
177
+ }
197
178
  }
198
179
  }
199
180
  this.retina.init();
@@ -212,14 +193,8 @@ export class Container {
212
193
  for (const plugin of this.plugins) {
213
194
  await plugin.init?.();
214
195
  }
215
- for (const drawer of this.effectDrawers.values()) {
216
- await drawer.init?.(this);
217
- }
218
- for (const drawer of this.shapeDrawers.values()) {
219
- await drawer.init?.(this);
220
- }
221
- this._engine.dispatchEvent(EventType.containerInit, { container: this });
222
196
  await this.particles.init();
197
+ this._engine.dispatchEvent(EventType.containerInit, { container: this });
223
198
  this.particles.setDensity();
224
199
  for (const plugin of this.plugins) {
225
200
  plugin.particlesSetup?.();
@@ -320,7 +295,9 @@ export class Container {
320
295
  for (const plugin of this.plugins) {
321
296
  plugin.stop?.();
322
297
  }
323
- this.plugins.length = 0;
298
+ this.particleCreatedPlugins.length = 0;
299
+ this.particleDestroyedPlugins.length = 0;
300
+ this.particlePositionPlugins.length = 0;
324
301
  this._sourceOptions = this._options;
325
302
  this._engine.dispatchEvent(EventType.containerStopped, { container: this });
326
303
  }
@@ -333,4 +310,33 @@ export class Container {
333
310
  }
334
311
  return refresh;
335
312
  }
313
+ _nextFrame = (timestamp) => {
314
+ try {
315
+ if (!this._smooth &&
316
+ this._lastFrameTime !== undefined &&
317
+ timestamp < this._lastFrameTime + millisecondsToSeconds / this.fpsLimit) {
318
+ this.draw(false);
319
+ return;
320
+ }
321
+ this._lastFrameTime ??= timestamp;
322
+ updateDelta(this._delta, timestamp - this._lastFrameTime, this.fpsLimit, this._smooth);
323
+ this.addLifeTime(this._delta.value);
324
+ this._lastFrameTime = timestamp;
325
+ if (this._delta.value > millisecondsToSeconds) {
326
+ this.draw(false);
327
+ return;
328
+ }
329
+ this.canvas.drawParticles(this._delta);
330
+ if (!this.alive()) {
331
+ this.destroy();
332
+ return;
333
+ }
334
+ if (this.animationStatus) {
335
+ this.draw(false);
336
+ }
337
+ }
338
+ catch (e) {
339
+ getLogger().error("error in animation loop", e);
340
+ }
341
+ };
336
342
  }
@@ -1,5 +1,5 @@
1
1
  import { canvasFirstIndex, canvasTag, generatedAttribute, generatedFalse, generatedTrue, loadMinIndex, loadRandomFactor, none, one, removeDeleteCount, } from "./Utils/Constants.js";
2
- import { getItemsFromInitializer, itemFromSingleOrMultiple, safeDocument } from "../Utils/Utils.js";
2
+ import { getItemMapFromInitializer, getItemsFromInitializer, itemFromSingleOrMultiple, safeDocument, } from "../Utils/Utils.js";
3
3
  import { EventDispatcher } from "../Utils/EventDispatcher.js";
4
4
  import { EventType } from "../Enums/Types/EventType.js";
5
5
  import { getLogger } from "../Utils/LogUtils.js";
@@ -52,29 +52,27 @@ const getCanvasFromContainer = (domContainer) => {
52
52
  return domContainer;
53
53
  };
54
54
  export class Engine {
55
- constructor() {
56
- this._configs = new Map();
57
- this._domArray = [];
58
- this._eventDispatcher = new EventDispatcher();
59
- this._initialized = false;
60
- this._isRunningLoaders = false;
61
- this._loadPromises = new Set();
62
- this._allLoadersSet = new Set();
63
- this._executedSet = new Set();
64
- this.plugins = [];
65
- this.colorManagers = new Map();
66
- this.easingFunctions = new Map();
67
- this._initializers = {
68
- movers: new Map(),
69
- updaters: new Map(),
70
- };
71
- this.movers = new Map();
72
- this.updaters = new Map();
73
- this.presets = new Map();
74
- this.effectDrawers = new Map();
75
- this.shapeDrawers = new Map();
76
- this.pathGenerators = new Map();
77
- }
55
+ colorManagers = new Map();
56
+ easingFunctions = new Map();
57
+ effectDrawers = new Map();
58
+ initializers = {
59
+ effects: new Map(),
60
+ shapes: new Map(),
61
+ updaters: new Map(),
62
+ };
63
+ palettes = new Map();
64
+ plugins = [];
65
+ presets = new Map();
66
+ shapeDrawers = new Map();
67
+ updaters = new Map();
68
+ _allLoadersSet = new Set();
69
+ _configs = new Map();
70
+ _domArray = [];
71
+ _eventDispatcher = new EventDispatcher();
72
+ _executedSet = new Set();
73
+ _initialized = false;
74
+ _isRunningLoaders = false;
75
+ _loadPromises = new Set();
78
76
  get configs() {
79
77
  const res = {};
80
78
  for (const [name, config] of this._configs) {
@@ -86,10 +84,10 @@ export class Engine {
86
84
  return this._domArray;
87
85
  }
88
86
  get version() {
89
- return "4.0.0-alpha.5";
87
+ return "4.0.0-beta.0";
90
88
  }
91
- addColorManager(manager) {
92
- this.colorManagers.set(manager.key, manager);
89
+ addColorManager(name, manager) {
90
+ this.colorManagers.set(name, manager);
93
91
  }
94
92
  addConfig(config) {
95
93
  const key = config.key ?? config.name ?? "default";
@@ -103,25 +101,16 @@ export class Engine {
103
101
  this.easingFunctions.set(name, easing);
104
102
  }
105
103
  addEffect(effect, drawer) {
106
- if (this.getEffectDrawer(effect)) {
107
- return;
108
- }
109
- this.effectDrawers.set(effect, drawer);
104
+ this.initializers.effects.set(effect, drawer);
110
105
  }
111
106
  addEventListener(type, listener) {
112
107
  this._eventDispatcher.addEventListener(type, listener);
113
108
  }
114
- addMover(name, moverInitializer) {
115
- this._initializers.movers.set(name, moverInitializer);
109
+ addPalette(name, palette) {
110
+ this.palettes.set(name, palette);
116
111
  }
117
112
  addParticleUpdater(name, updaterInitializer) {
118
- this._initializers.updaters.set(name, updaterInitializer);
119
- }
120
- addPathGenerator(name, generator) {
121
- if (this.getPathGenerator(name)) {
122
- return;
123
- }
124
- this.pathGenerators.set(name, generator);
113
+ this.initializers.updaters.set(name, updaterInitializer);
125
114
  }
126
115
  addPlugin(plugin) {
127
116
  if (this.getPlugin(plugin.id)) {
@@ -135,12 +124,9 @@ export class Engine {
135
124
  }
136
125
  this.presets.set(preset, options);
137
126
  }
138
- addShape(drawer) {
139
- for (const validType of drawer.validTypes) {
140
- if (this.getShapeDrawer(validType)) {
141
- continue;
142
- }
143
- this.shapeDrawers.set(validType, drawer);
127
+ addShape(shapes, drawer) {
128
+ for (const shape of shapes) {
129
+ this.initializers.shapes.set(shape, drawer);
144
130
  }
145
131
  }
146
132
  checkVersion(pluginVersion) {
@@ -150,8 +136,9 @@ export class Engine {
150
136
  throw new Error(`The tsParticles version is different from the loaded plugins version. Engine version: ${this.version}. Plugin version: ${pluginVersion}`);
151
137
  }
152
138
  clearPlugins(container) {
139
+ this.effectDrawers.delete(container);
140
+ this.shapeDrawers.delete(container);
153
141
  this.updaters.delete(container);
154
- this.movers.delete(container);
155
142
  }
156
143
  dispatchEvent(type, args) {
157
144
  this._eventDispatcher.dispatchEvent(type, args);
@@ -159,14 +146,11 @@ export class Engine {
159
146
  getEasing(name) {
160
147
  return this.easingFunctions.get(name) ?? ((value) => value);
161
148
  }
162
- getEffectDrawer(type) {
163
- return this.effectDrawers.get(type);
164
- }
165
- async getMovers(container, force = false) {
166
- return getItemsFromInitializer(container, this.movers, this._initializers.movers, force);
149
+ getEffectDrawers(container, force = false) {
150
+ return getItemMapFromInitializer(container, this.effectDrawers, this.initializers.effects, force);
167
151
  }
168
- getPathGenerator(type) {
169
- return this.pathGenerators.get(type);
152
+ getPalette(name) {
153
+ return this.palettes.get(name);
170
154
  }
171
155
  getPlugin(plugin) {
172
156
  return this.plugins.find(t => t.id === plugin);
@@ -174,21 +158,16 @@ export class Engine {
174
158
  getPreset(preset) {
175
159
  return this.presets.get(preset);
176
160
  }
177
- getShapeDrawer(type) {
178
- return this.shapeDrawers.get(type);
179
- }
180
- getSupportedEffects() {
181
- return this.effectDrawers.keys();
182
- }
183
- getSupportedShapes() {
184
- return this.shapeDrawers.keys();
161
+ async getShapeDrawers(container, force = false) {
162
+ return getItemMapFromInitializer(container, this.shapeDrawers, this.initializers.shapes, force);
185
163
  }
186
164
  async getUpdaters(container, force = false) {
187
- return getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
165
+ return getItemsFromInitializer(container, this.updaters, this.initializers.updaters, force);
188
166
  }
189
167
  async init() {
190
- if (this._initialized || this._isRunningLoaders)
168
+ if (this._initialized || this._isRunningLoaders) {
191
169
  return;
170
+ }
192
171
  this._isRunningLoaders = true;
193
172
  this._executedSet = new Set();
194
173
  this._allLoadersSet = new Set(this._loadPromises);
@@ -213,9 +192,7 @@ export class Engine {
213
192
  }
214
193
  async load(params) {
215
194
  await this.init();
216
- const { Container } = await import("./Container.js"), id = params.id ??
217
- params.element?.id ??
218
- `tsparticles${Math.floor(getRandom() * loadRandomFactor).toString()}`, { index, url } = params, options = url ? await getDataFromUrl({ fallback: params.options, url, index }) : params.options, currentOptions = itemFromSingleOrMultiple(options, index), { items } = this, oldIndex = items.findIndex(v => v.id.description === id), newItem = new Container(this, id, currentOptions);
195
+ const { Container } = await import("./Container.js"), id = params.id ?? params.element?.id ?? `tsparticles${Math.floor(getRandom() * loadRandomFactor).toString()}`, { index, url } = params, options = url ? await getDataFromUrl({ fallback: params.options, url, index }) : params.options, currentOptions = itemFromSingleOrMultiple(options, index), { items } = this, oldIndex = items.findIndex(v => v.id.description === id), newItem = new Container(this, id, currentOptions);
219
196
  if (oldIndex >= loadMinIndex) {
220
197
  const old = this.item(oldIndex), deleteCount = old ? one : none;
221
198
  if (old && !old.destroyed) {