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