@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
@@ -1,26 +1,23 @@
1
1
  import { Vector, Vector3d } from "./Utils/Vectors.js";
2
+ import { alterHsl, getHslFromAnimation } from "../Utils/ColorUtils.js";
2
3
  import { calcExactPositionOrRandomFromSize, clamp, degToRad, getParticleBaseVelocity, getParticleDirectionAngle, getRandom, getRangeValue, randomInRangeValue, setRangeValue, } from "../Utils/MathUtils.js";
3
- import { decayOffset, defaultAngle, defaultOpacity, defaultRetryCount, defaultTransform, double, doublePI, half, identity, millisecondsToSeconds, minZ, randomColorValue, squareExp, triple, tryCountIncrement, zIndexFactorOffset, } from "./Utils/Constants.js";
4
4
  import { deepExtend, getPosition, initParticleNumericAnimationValue, isInArray, itemFromSingleOrMultiple, } from "../Utils/Utils.js";
5
+ import { defaultAngle, defaultOpacity, defaultRetryCount, defaultTransform, double, doublePI, half, identity, minZ, randomColorValue, squareExp, triple, tryCountIncrement, zIndexFactorOffset, } from "./Utils/Constants.js";
5
6
  import { EventType } from "../Enums/Types/EventType.js";
6
7
  import { MoveDirection } from "../Enums/Directions/MoveDirection.js";
7
8
  import { OutMode } from "../Enums/Modes/OutMode.js";
8
9
  import { ParticleOutType } from "../Enums/Types/ParticleOutType.js";
9
- import { alterHsl } from "../Utils/CanvasUtils.js";
10
- import { getHslFromAnimation } from "../Utils/ColorUtils.js";
11
10
  import { loadParticlesOptions } from "../Utils/OptionsUtils.js";
12
11
  function loadEffectData(effect, effectOptions, id, reduceDuplicates) {
13
12
  const effectData = effectOptions.options[effect];
14
13
  return deepExtend({
15
14
  close: effectOptions.close,
16
- fill: effectOptions.fill,
17
15
  }, itemFromSingleOrMultiple(effectData, id, reduceDuplicates));
18
16
  }
19
17
  function loadShapeData(shape, shapeOptions, id, reduceDuplicates) {
20
18
  const shapeData = shapeOptions.options[shape];
21
19
  return deepExtend({
22
20
  close: shapeOptions.close,
23
- fill: shapeOptions.fill,
24
21
  }, itemFromSingleOrMultiple(shapeData, id, reduceDuplicates));
25
22
  }
26
23
  function fixOutMode(data) {
@@ -36,130 +33,65 @@ function fixOutMode(data) {
36
33
  }
37
34
  }
38
35
  export class Particle {
36
+ container;
37
+ backColor;
38
+ bubble;
39
+ destroyed;
40
+ direction;
41
+ effect;
42
+ effectClose;
43
+ effectData;
44
+ fillColor;
45
+ fillEnabled;
46
+ fillOpacity;
47
+ group;
48
+ id;
49
+ ignoresResizeRatio;
50
+ initialPosition;
51
+ initialVelocity;
52
+ isRotating;
53
+ lastPathTime;
54
+ misplaced;
55
+ moveCenter;
56
+ offset;
57
+ opacity;
58
+ options;
59
+ outType;
60
+ pathRotation;
61
+ position;
62
+ randomIndexData;
63
+ retina;
64
+ roll;
65
+ rotation;
66
+ shape;
67
+ shapeClose;
68
+ shapeData;
69
+ sides;
70
+ size;
71
+ slow;
72
+ spawning;
73
+ strokeColor;
74
+ strokeOpacity;
75
+ strokeWidth;
76
+ unbreakable;
77
+ velocity;
78
+ zIndexFactor;
79
+ _cachedOpacityData = {
80
+ fillOpacity: defaultOpacity,
81
+ opacity: defaultOpacity,
82
+ strokeOpacity: defaultOpacity,
83
+ };
84
+ _cachedPosition = Vector3d.origin;
85
+ _cachedRotateData = { sin: 0, cos: 0 };
86
+ _cachedTransform = {
87
+ a: 1,
88
+ b: 0,
89
+ c: 0,
90
+ d: 1,
91
+ };
92
+ _engine;
39
93
  constructor(engine, container) {
40
94
  this.container = container;
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
- }
62
- }
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
- }
77
- }
78
- if (isValidPosition) {
79
- return pos;
80
- }
81
- tryCount += tryCountIncrement;
82
- posVec = undefined;
83
- }
84
- return posVec;
85
- };
86
- this._calculateVelocity = () => {
87
- const baseVelocity = getParticleBaseVelocity(this.direction), res = baseVelocity.copy(), moveOptions = this.options.move;
88
- if (moveOptions.direction === MoveDirection.inside || moveOptions.direction === MoveDirection.outside) {
89
- return res;
90
- }
91
- const rad = degToRad(getRangeValue(moveOptions.angle.value)), radOffset = degToRad(getRangeValue(moveOptions.angle.offset)), range = {
92
- left: radOffset - rad * half,
93
- right: radOffset + rad * half,
94
- };
95
- if (!moveOptions.straight) {
96
- res.angle += randomInRangeValue(setRangeValue(range.left, range.right));
97
- }
98
- if (moveOptions.random && typeof moveOptions.speed === "number") {
99
- res.length *= getRandom();
100
- }
101
- return res;
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
- };
123
- this._getRollColor = color => {
124
- if (!color || !this.roll || (!this.backColor && !this.roll.alter)) {
125
- return color;
126
- }
127
- if (!this.isShowingBack()) {
128
- return color;
129
- }
130
- if (this.backColor) {
131
- return this.backColor;
132
- }
133
- if (this.roll.alter) {
134
- return alterHsl(color, this.roll.alter.type, this.roll.alter.value);
135
- }
136
- return color;
137
- };
138
- this._initPosition = position => {
139
- const container = this.container, zIndexValue = getRangeValue(this.options.zIndex.value);
140
- const initialPosition = this._calcPosition(position, clamp(zIndexValue, minZ, container.zLayers));
141
- if (!initialPosition) {
142
- throw new Error("a valid position cannot be found for particle");
143
- }
144
- this.position = initialPosition;
145
- this.initialPosition = this.position.copy();
146
- const canvasSize = container.canvas.size;
147
- this.moveCenter = {
148
- ...getPosition(this.options.move.center, canvasSize),
149
- radius: this.options.move.center.radius,
150
- mode: this.options.move.center.mode,
151
- };
152
- this.direction = getParticleDirectionAngle(this.options.move.direction, this.position, this.moveCenter);
153
- switch (this.options.move.direction) {
154
- case MoveDirection.inside:
155
- this.outType = ParticleOutType.inside;
156
- break;
157
- case MoveDirection.outside:
158
- this.outType = ParticleOutType.outside;
159
- break;
160
- }
161
- this.offset = Vector.origin;
162
- };
163
95
  this._engine = engine;
164
96
  }
165
97
  destroy(override) {
@@ -169,15 +101,14 @@ export class Particle {
169
101
  this.destroyed = true;
170
102
  this.bubble.inRange = false;
171
103
  this.slow.inRange = false;
172
- const container = this.container, pathGenerator = this.pathGenerator, shapeDrawer = this.shape ? container.shapeDrawers.get(this.shape) : undefined;
104
+ const container = this.container, shapeDrawer = this.shape ? container.particles.shapeDrawers.get(this.shape) : undefined;
173
105
  shapeDrawer?.particleDestroy?.(this);
174
- for (const plugin of container.plugins) {
106
+ for (const plugin of container.particleDestroyedPlugins) {
175
107
  plugin.particleDestroyed?.(this, override);
176
108
  }
177
109
  for (const updater of container.particles.updaters) {
178
110
  updater.particleDestroyed?.(this, override);
179
111
  }
180
- pathGenerator?.reset(this);
181
112
  this._engine.dispatchEvent(EventType.particleDestroyed, {
182
113
  container: this.container,
183
114
  data: {
@@ -187,24 +118,23 @@ export class Particle {
187
118
  }
188
119
  draw(delta) {
189
120
  const container = this.container, canvas = container.canvas;
190
- for (const plugin of container.plugins) {
191
- canvas.drawParticlePlugin(plugin, this, delta);
192
- }
121
+ canvas.drawParticlePlugins(this, delta);
193
122
  canvas.drawParticle(this, delta);
194
123
  }
195
124
  getAngle() {
196
125
  return this.rotation + (this.pathRotation ? this.velocity.angle : defaultAngle);
197
126
  }
198
127
  getFillColor() {
199
- return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.color));
128
+ return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.fillColor));
200
129
  }
201
130
  getMass() {
202
131
  return this.getRadius() ** squareExp * Math.PI * half;
203
132
  }
204
133
  getOpacity() {
205
- 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;
134
+ const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, opacity = this.bubble.opacity ?? getRangeValue(this.opacity?.value ?? defaultOpacity), fillOpacity = this.fillOpacity ?? defaultOpacity, strokeOpacity = this.strokeOpacity ?? defaultOpacity;
135
+ this._cachedOpacityData.fillOpacity = opacity * fillOpacity * zOpacityFactor;
206
136
  this._cachedOpacityData.opacity = opacity * zOpacityFactor;
207
- this._cachedOpacityData.strokeOpacity = strokeOpacity * zOpacityFactor;
137
+ this._cachedOpacityData.strokeOpacity = opacity * strokeOpacity * zOpacityFactor;
208
138
  return this._cachedOpacityData;
209
139
  }
210
140
  getPosition() {
@@ -242,9 +172,7 @@ export class Particle {
242
172
  this.id = id;
243
173
  this.group = group;
244
174
  this.effectClose = true;
245
- this.effectFill = true;
246
175
  this.shapeClose = true;
247
- this.shapeFill = true;
248
176
  this.pathRotation = false;
249
177
  this.lastPathTime = 0;
250
178
  this.destroyed = false;
@@ -278,11 +206,11 @@ export class Particle {
278
206
  }
279
207
  }
280
208
  if (this.effect === randomColorValue) {
281
- const availableEffects = [...this.container.effectDrawers.keys()];
209
+ const availableEffects = [...this.container.particles.effectDrawers.keys()];
282
210
  this.effect = availableEffects[Math.floor(getRandom() * availableEffects.length)];
283
211
  }
284
212
  if (this.shape === randomColorValue) {
285
- const availableShapes = [...this.container.shapeDrawers.keys()];
213
+ const availableShapes = [...this.container.particles.shapeDrawers.keys()];
286
214
  this.shape = availableShapes[Math.floor(getRandom() * availableShapes.length)];
287
215
  }
288
216
  this.effectData = this.effect ? loadEffectData(this.effect, effectOptions, this.id, reduceDuplicates) : undefined;
@@ -296,19 +224,9 @@ export class Particle {
296
224
  if (shapeData) {
297
225
  particlesOptions.load(shapeData.particles);
298
226
  }
299
- this.effectFill = effectData?.fill ?? particlesOptions.effect.fill;
300
227
  this.effectClose = effectData?.close ?? particlesOptions.effect.close;
301
- this.shapeFill = shapeData?.fill ?? particlesOptions.shape.fill;
302
228
  this.shapeClose = shapeData?.close ?? particlesOptions.shape.close;
303
229
  this.options = particlesOptions;
304
- const pathOptions = this.options.move.path;
305
- this.pathDelay = getRangeValue(pathOptions.delay.value) * millisecondsToSeconds;
306
- if (pathOptions.generator) {
307
- this.pathGenerator = this._engine.getPathGenerator(pathOptions.generator);
308
- if (this.pathGenerator && container.addPath(pathOptions.generator, this.pathGenerator)) {
309
- this.pathGenerator.init(container);
310
- }
311
- }
312
230
  container.retina.initParticle(this);
313
231
  this.size = initParticleNumericAnimationValue(this.options.size, pxRatio);
314
232
  this.bubble = {
@@ -321,32 +239,19 @@ export class Particle {
321
239
  this._initPosition(position);
322
240
  this.initialVelocity = this._calculateVelocity();
323
241
  this.velocity = this.initialVelocity.copy();
324
- this.moveDecay = decayOffset - getRangeValue(this.options.move.decay);
325
242
  const particles = container.particles;
326
243
  particles.setLastZIndex(this.position.z);
327
244
  this.zIndexFactor = this.position.z / container.zLayers;
328
245
  this.sides = 24;
329
246
  let effectDrawer, shapeDrawer;
330
247
  if (this.effect) {
331
- effectDrawer = container.effectDrawers.get(this.effect);
332
- if (!effectDrawer) {
333
- effectDrawer = this._engine.getEffectDrawer(this.effect);
334
- if (effectDrawer) {
335
- container.effectDrawers.set(this.effect, effectDrawer);
336
- }
337
- }
248
+ effectDrawer = container.particles.effectDrawers.get(this.effect);
338
249
  }
339
250
  if (effectDrawer?.loadEffect) {
340
251
  effectDrawer.loadEffect(this);
341
252
  }
342
253
  if (this.shape) {
343
- shapeDrawer = container.shapeDrawers.get(this.shape);
344
- if (!shapeDrawer) {
345
- shapeDrawer = this._engine.getShapeDrawer(this.shape);
346
- if (shapeDrawer) {
347
- container.shapeDrawers.set(this.shape, shapeDrawer);
348
- }
349
- }
254
+ shapeDrawer = container.particles.shapeDrawers.get(this.shape);
350
255
  }
351
256
  if (shapeDrawer?.loadShape) {
352
257
  shapeDrawer.loadShape(this);
@@ -359,12 +264,9 @@ export class Particle {
359
264
  for (const updater of particles.updaters) {
360
265
  updater.init(this);
361
266
  }
362
- for (const mover of particles.movers) {
363
- mover.init(this);
364
- }
365
267
  effectDrawer?.particleInit?.(container, this);
366
268
  shapeDrawer?.particleInit?.(container, this);
367
- for (const plugin of container.plugins) {
269
+ for (const plugin of container.particleCreatedPlugins) {
368
270
  plugin.particleCreated?.(this);
369
271
  }
370
272
  }
@@ -402,4 +304,115 @@ export class Particle {
402
304
  updater.reset?.(this);
403
305
  }
404
306
  }
307
+ _calcPosition = (position, zIndex) => {
308
+ let tryCount = defaultRetryCount, posVec = position ? Vector3d.create(position.x, position.y, zIndex) : undefined;
309
+ const container = this.container, plugins = container.particlePositionPlugins, outModes = this.options.move.outModes, radius = this.getRadius(), canvasSize = container.canvas.size, abortController = new AbortController(), { signal } = abortController;
310
+ while (!signal.aborted) {
311
+ for (const plugin of plugins) {
312
+ const pluginPos = plugin.particlePosition?.(posVec, this);
313
+ if (pluginPos) {
314
+ return Vector3d.create(pluginPos.x, pluginPos.y, zIndex);
315
+ }
316
+ }
317
+ const exactPosition = calcExactPositionOrRandomFromSize({
318
+ size: canvasSize,
319
+ position: posVec,
320
+ }), pos = Vector3d.create(exactPosition.x, exactPosition.y, zIndex);
321
+ this._fixHorizontal(pos, radius, outModes.left ?? outModes.default);
322
+ this._fixHorizontal(pos, radius, outModes.right ?? outModes.default);
323
+ this._fixVertical(pos, radius, outModes.top ?? outModes.default);
324
+ this._fixVertical(pos, radius, outModes.bottom ?? outModes.default);
325
+ let isValidPosition = true;
326
+ for (const plugin of container.particles.checkParticlePositionPlugins) {
327
+ isValidPosition = plugin.checkParticlePosition?.(this, pos, tryCount) ?? true;
328
+ if (!isValidPosition) {
329
+ break;
330
+ }
331
+ }
332
+ if (isValidPosition) {
333
+ return pos;
334
+ }
335
+ tryCount += tryCountIncrement;
336
+ posVec = undefined;
337
+ }
338
+ return posVec;
339
+ };
340
+ _calculateVelocity = () => {
341
+ const baseVelocity = getParticleBaseVelocity(this.direction), res = baseVelocity.copy(), moveOptions = this.options.move;
342
+ if (moveOptions.direction === MoveDirection.inside || moveOptions.direction === MoveDirection.outside) {
343
+ return res;
344
+ }
345
+ const rad = degToRad(getRangeValue(moveOptions.angle.value)), radOffset = degToRad(getRangeValue(moveOptions.angle.offset)), range = {
346
+ left: radOffset - rad * half,
347
+ right: radOffset + rad * half,
348
+ };
349
+ if (!moveOptions.straight) {
350
+ res.angle += randomInRangeValue(setRangeValue(range.left, range.right));
351
+ }
352
+ if (moveOptions.random && typeof moveOptions.speed === "number") {
353
+ res.length *= getRandom();
354
+ }
355
+ return res;
356
+ };
357
+ _fixHorizontal = (pos, radius, outMode) => {
358
+ fixOutMode({
359
+ outMode,
360
+ checkModes: [OutMode.bounce],
361
+ coord: pos.x,
362
+ maxCoord: this.container.canvas.size.width,
363
+ setCb: (value) => (pos.x += value),
364
+ radius,
365
+ });
366
+ };
367
+ _fixVertical = (pos, radius, outMode) => {
368
+ fixOutMode({
369
+ outMode,
370
+ checkModes: [OutMode.bounce],
371
+ coord: pos.y,
372
+ maxCoord: this.container.canvas.size.height,
373
+ setCb: (value) => (pos.y += value),
374
+ radius,
375
+ });
376
+ };
377
+ _getRollColor = color => {
378
+ if (!color || !this.roll || (!this.backColor && !this.roll.alter)) {
379
+ return color;
380
+ }
381
+ if (!this.isShowingBack()) {
382
+ return color;
383
+ }
384
+ if (this.backColor) {
385
+ return this.backColor;
386
+ }
387
+ if (this.roll.alter) {
388
+ return alterHsl(color, this.roll.alter.type, this.roll.alter.value);
389
+ }
390
+ return color;
391
+ };
392
+ _initPosition = position => {
393
+ const container = this.container, zIndexValue = getRangeValue(this.options.zIndex.value), initialPosition = this._calcPosition(position, clamp(zIndexValue, minZ, container.zLayers));
394
+ if (!initialPosition) {
395
+ throw new Error("a valid position cannot be found for particle");
396
+ }
397
+ this.position = initialPosition;
398
+ this.initialPosition = this.position.copy();
399
+ const canvasSize = container.canvas.size;
400
+ this.moveCenter = {
401
+ ...getPosition(this.options.move.center, canvasSize),
402
+ radius: this.options.move.center.radius,
403
+ mode: this.options.move.center.mode,
404
+ };
405
+ this.direction = getParticleDirectionAngle(this.options.move.direction, this.position, this.moveCenter);
406
+ switch (this.options.move.direction) {
407
+ case MoveDirection.inside:
408
+ this.outType = ParticleOutType.inside;
409
+ break;
410
+ case MoveDirection.outside:
411
+ this.outType = ParticleOutType.outside;
412
+ break;
413
+ default:
414
+ break;
415
+ }
416
+ this.offset = Vector.origin;
417
+ };
405
418
  }