@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,6 +1,6 @@
1
1
  import { clear, drawParticle, drawParticlePlugin, paintBase, paintImage } from "../Utils/CanvasUtils.js";
2
2
  import { cloneStyle, getFullScreenStyle, safeMatchMedia, safeMutationObserver } from "../Utils/Utils.js";
3
- import { defaultTransformValue, generatedAttribute, minimumSize, zIndexFactorOffset } from "./Utils/Constants.js";
3
+ import { defaultCompositeValue, defaultTransformValue, defaultZoom, generatedAttribute, half, minimumSize, zIndexFactorOffset, } from "./Utils/Constants.js";
4
4
  import { getStyleFromHsl, getStyleFromRgb, rangeColorToHsl, rangeColorToRgb } from "../Utils/ColorUtils.js";
5
5
  const fColorIndex = 0, sColorIndex = 1;
6
6
  function setTransformValue(factor, newFactor, key) {
@@ -39,120 +39,37 @@ function setStyle(canvas, style, important = false) {
39
39
  }
40
40
  }
41
41
  export class Canvas {
42
+ container;
43
+ element;
44
+ size;
45
+ zoom = defaultZoom;
46
+ _canvasClearPlugins;
47
+ _canvasPaintPlugins;
48
+ _canvasSettings;
49
+ _clearDrawPlugins;
50
+ _colorPlugins;
51
+ _context;
52
+ _drawParticlePlugins;
53
+ _drawParticlesCleanupPlugins;
54
+ _drawParticlesSetupPlugins;
55
+ _drawPlugins;
56
+ _drawSettingsCleanupPlugins;
57
+ _drawSettingsSetupPlugins;
58
+ _engine;
59
+ _generated;
60
+ _mutationObserver;
61
+ _originalStyle;
62
+ _pointerEvents;
63
+ _postDrawUpdaters;
64
+ _preDrawUpdaters;
65
+ _resizePlugins;
66
+ _reusableColorStyles = {};
67
+ _reusablePluginColors = [undefined, undefined];
68
+ _reusableTransform = {};
69
+ _standardSize;
70
+ _zoomCenter;
42
71
  constructor(container, engine) {
43
72
  this.container = container;
44
- this._reusableColorStyles = {};
45
- this._reusablePluginColors = [undefined, undefined];
46
- this._reusableTransform = {};
47
- this._applyPostDrawUpdaters = particle => {
48
- for (const updater of this._postDrawUpdaters) {
49
- updater.afterDraw?.(particle);
50
- }
51
- };
52
- this._applyPreDrawUpdaters = (ctx, particle, radius, zOpacity, colorStyles, transform) => {
53
- for (const updater of this._preDrawUpdaters) {
54
- if (updater.getColorStyles) {
55
- const { fill, stroke } = updater.getColorStyles(particle, ctx, radius, zOpacity);
56
- if (fill) {
57
- colorStyles.fill = fill;
58
- }
59
- if (stroke) {
60
- colorStyles.stroke = stroke;
61
- }
62
- }
63
- if (updater.getTransformValues) {
64
- const updaterTransform = updater.getTransformValues(particle);
65
- for (const key in updaterTransform) {
66
- setTransformValue(transform, updaterTransform, key);
67
- }
68
- }
69
- updater.beforeDraw?.(particle);
70
- }
71
- };
72
- this._applyResizePlugins = () => {
73
- for (const plugin of this._resizePlugins) {
74
- plugin.resize?.();
75
- }
76
- };
77
- this._getPluginParticleColors = particle => {
78
- let fColor, sColor;
79
- for (const plugin of this._colorPlugins) {
80
- if (!fColor && plugin.particleFillColor) {
81
- fColor = rangeColorToHsl(this._engine, plugin.particleFillColor(particle));
82
- }
83
- if (!sColor && plugin.particleStrokeColor) {
84
- sColor = rangeColorToHsl(this._engine, plugin.particleStrokeColor(particle));
85
- }
86
- if (fColor && sColor) {
87
- break;
88
- }
89
- }
90
- this._reusablePluginColors[fColorIndex] = fColor;
91
- this._reusablePluginColors[sColorIndex] = sColor;
92
- return this._reusablePluginColors;
93
- };
94
- this._initStyle = () => {
95
- const element = this.element, options = this.container.actualOptions;
96
- if (!element) {
97
- return;
98
- }
99
- if (this._fullScreen) {
100
- this._setFullScreenStyle();
101
- }
102
- else {
103
- this._resetOriginalStyle();
104
- }
105
- for (const key in options.style) {
106
- if (!key || !Object.hasOwn(options.style, key)) {
107
- continue;
108
- }
109
- const value = options.style[key];
110
- if (!value) {
111
- continue;
112
- }
113
- element.style.setProperty(key, value, "important");
114
- }
115
- };
116
- this._repairStyle = () => {
117
- const element = this.element;
118
- if (!element) {
119
- return;
120
- }
121
- this._safeMutationObserver(observer => {
122
- observer.disconnect();
123
- });
124
- this._initStyle();
125
- this.initBackground();
126
- const pointerEvents = this._pointerEvents;
127
- element.style.pointerEvents = pointerEvents;
128
- element.setAttribute("pointer-events", pointerEvents);
129
- this._safeMutationObserver(observer => {
130
- if (!(element instanceof Node)) {
131
- return;
132
- }
133
- observer.observe(element, { attributes: true });
134
- });
135
- };
136
- this._resetOriginalStyle = () => {
137
- const element = this.element, originalStyle = this._originalStyle;
138
- if (!element || !originalStyle) {
139
- return;
140
- }
141
- setStyle(element, originalStyle, true);
142
- };
143
- this._safeMutationObserver = callback => {
144
- if (!this._mutationObserver) {
145
- return;
146
- }
147
- callback(this._mutationObserver);
148
- };
149
- this._setFullScreenStyle = () => {
150
- const element = this.element;
151
- if (!element) {
152
- return;
153
- }
154
- setStyle(element, getFullScreenStyle(this.container.actualOptions.fullScreen.zIndex), true);
155
- };
156
73
  this._engine = engine;
157
74
  this._standardSize = {
158
75
  height: 0,
@@ -169,8 +86,20 @@ export class Canvas {
169
86
  this._postDrawUpdaters = [];
170
87
  this._resizePlugins = [];
171
88
  this._colorPlugins = [];
89
+ this._canvasClearPlugins = [];
90
+ this._canvasPaintPlugins = [];
91
+ this._clearDrawPlugins = [];
92
+ this._drawParticlePlugins = [];
93
+ this._drawParticlesCleanupPlugins = [];
94
+ this._drawParticlesSetupPlugins = [];
95
+ this._drawPlugins = [];
96
+ this._drawSettingsSetupPlugins = [];
97
+ this._drawSettingsCleanupPlugins = [];
172
98
  this._pointerEvents = "none";
173
99
  }
100
+ get settings() {
101
+ return this._canvasSettings;
102
+ }
174
103
  get _fullScreen() {
175
104
  return this.container.actualOptions.fullScreen.enable;
176
105
  }
@@ -184,9 +113,10 @@ export class Canvas {
184
113
  }
185
114
  clear() {
186
115
  let pluginHandled = false;
187
- for (const plugin of this.container.plugins) {
188
- if (!pluginHandled && plugin.canvasClear) {
189
- pluginHandled = plugin.canvasClear();
116
+ for (const plugin of this._canvasClearPlugins) {
117
+ pluginHandled = plugin.canvasClear?.() ?? false;
118
+ if (pluginHandled) {
119
+ break;
190
120
  }
191
121
  }
192
122
  if (pluginHandled) {
@@ -208,6 +138,15 @@ export class Canvas {
208
138
  this._postDrawUpdaters = [];
209
139
  this._resizePlugins = [];
210
140
  this._colorPlugins = [];
141
+ this._canvasClearPlugins = [];
142
+ this._canvasPaintPlugins = [];
143
+ this._clearDrawPlugins = [];
144
+ this._drawParticlePlugins = [];
145
+ this._drawParticlesCleanupPlugins = [];
146
+ this._drawParticlesSetupPlugins = [];
147
+ this._drawPlugins = [];
148
+ this._drawSettingsSetupPlugins = [];
149
+ this._drawSettingsCleanupPlugins = [];
211
150
  }
212
151
  draw(cb) {
213
152
  const ctx = this._context;
@@ -224,22 +163,20 @@ export class Canvas {
224
163
  if (radius <= minimumSize) {
225
164
  return;
226
165
  }
227
- const pfColor = particle.getFillColor(), psColor = particle.getStrokeColor() ?? pfColor;
166
+ const pfColor = particle.getFillColor(), psColor = particle.getStrokeColor();
228
167
  let [fColor, sColor] = this._getPluginParticleColors(particle);
229
168
  fColor ??= pfColor;
230
169
  sColor ??= psColor;
231
170
  if (!fColor && !sColor) {
232
171
  return;
233
172
  }
234
- const container = this.container, zIndexOptions = particle.options.zIndex, zIndexFactor = zIndexFactorOffset - particle.zIndexFactor, { opacity, strokeOpacity } = particle.getOpacity(), transform = this._reusableTransform, colorStyles = this._reusableColorStyles, fill = fColor ? getStyleFromHsl(fColor, container.hdr, opacity) : undefined, stroke = sColor ? getStyleFromHsl(sColor, container.hdr, strokeOpacity) : fill;
173
+ const container = this.container, zIndexOptions = particle.options.zIndex, zIndexFactor = zIndexFactorOffset - particle.zIndexFactor, { fillOpacity, opacity, strokeOpacity } = particle.getOpacity(), transform = this._reusableTransform, colorStyles = this._reusableColorStyles, fill = fColor ? getStyleFromHsl(fColor, container.hdr, fillOpacity * opacity) : undefined, stroke = sColor ? getStyleFromHsl(sColor, container.hdr, strokeOpacity * opacity) : fill;
235
174
  transform.a = transform.b = transform.c = transform.d = undefined;
236
175
  colorStyles.fill = fill;
237
176
  colorStyles.stroke = stroke;
238
177
  this.draw((context) => {
239
- for (const plugin of container.plugins) {
240
- if (plugin.drawParticleSetup) {
241
- plugin.drawParticleSetup(context, particle, delta);
242
- }
178
+ for (const plugin of this._drawParticlesSetupPlugins) {
179
+ plugin.drawParticleSetup?.(context, particle, delta);
243
180
  }
244
181
  this._applyPreDrawUpdaters(context, particle, radius, opacity, colorStyles, transform);
245
182
  drawParticle({
@@ -253,38 +190,48 @@ export class Canvas {
253
190
  transform,
254
191
  });
255
192
  this._applyPostDrawUpdaters(particle);
256
- for (const plugin of container.plugins) {
257
- if (plugin.drawParticleCleanup) {
258
- plugin.drawParticleCleanup(context, particle, delta);
259
- }
193
+ for (const plugin of this._drawParticlesCleanupPlugins) {
194
+ plugin.drawParticleCleanup?.(context, particle, delta);
260
195
  }
261
196
  });
262
197
  }
263
- drawParticlePlugin(plugin, particle, delta) {
198
+ drawParticlePlugins(particle, delta) {
264
199
  this.draw(ctx => {
265
- drawParticlePlugin(ctx, plugin, particle, delta);
200
+ for (const plugin of this._drawParticlePlugins) {
201
+ drawParticlePlugin(ctx, plugin, particle, delta);
202
+ }
266
203
  });
267
204
  }
268
205
  drawParticles(delta) {
269
- const { particles, plugins } = this.container;
206
+ const { particles } = this.container;
270
207
  this.clear();
271
208
  particles.update(delta);
272
209
  this.draw(ctx => {
273
- for (const plugin of plugins) {
210
+ for (const plugin of this._drawSettingsSetupPlugins) {
274
211
  plugin.drawSettingsSetup?.(ctx, delta);
275
212
  }
276
- for (const plugin of plugins) {
213
+ for (const plugin of this._drawPlugins) {
277
214
  plugin.draw?.(ctx, delta);
278
215
  }
279
216
  particles.drawParticles(delta);
280
- for (const plugin of plugins) {
217
+ for (const plugin of this._clearDrawPlugins) {
281
218
  plugin.clearDraw?.(ctx, delta);
282
219
  }
283
- for (const plugin of plugins) {
220
+ for (const plugin of this._drawSettingsCleanupPlugins) {
284
221
  plugin.drawSettingsCleanup?.(ctx, delta);
285
222
  }
286
223
  });
287
224
  }
225
+ getZoomCenter() {
226
+ const pxRatio = this.container.retina.pixelRatio, { width, height } = this.size;
227
+ if (this._zoomCenter) {
228
+ return this._zoomCenter;
229
+ }
230
+ return {
231
+ x: (width * half) / pxRatio,
232
+ y: (height * half) / pxRatio,
233
+ };
234
+ }
288
235
  init() {
289
236
  this._safeMutationObserver(obs => {
290
237
  obs.disconnect();
@@ -328,6 +275,16 @@ export class Canvas {
328
275
  }
329
276
  initPlugins() {
330
277
  this._resizePlugins = [];
278
+ this._colorPlugins = [];
279
+ this._canvasClearPlugins = [];
280
+ this._canvasPaintPlugins = [];
281
+ this._clearDrawPlugins = [];
282
+ this._drawParticlePlugins = [];
283
+ this._drawParticlesSetupPlugins = [];
284
+ this._drawParticlesCleanupPlugins = [];
285
+ this._drawPlugins = [];
286
+ this._drawSettingsSetupPlugins = [];
287
+ this._drawSettingsCleanupPlugins = [];
331
288
  for (const plugin of this.container.plugins) {
332
289
  if (plugin.resize) {
333
290
  this._resizePlugins.push(plugin);
@@ -335,6 +292,33 @@ export class Canvas {
335
292
  if (plugin.particleFillColor ?? plugin.particleStrokeColor) {
336
293
  this._colorPlugins.push(plugin);
337
294
  }
295
+ if (plugin.canvasClear) {
296
+ this._canvasClearPlugins.push(plugin);
297
+ }
298
+ if (plugin.canvasPaint) {
299
+ this._canvasPaintPlugins.push(plugin);
300
+ }
301
+ if (plugin.drawParticle) {
302
+ this._drawParticlePlugins.push(plugin);
303
+ }
304
+ if (plugin.drawParticleSetup) {
305
+ this._drawParticlesSetupPlugins.push(plugin);
306
+ }
307
+ if (plugin.drawParticleCleanup) {
308
+ this._drawParticlesCleanupPlugins.push(plugin);
309
+ }
310
+ if (plugin.draw) {
311
+ this._drawPlugins.push(plugin);
312
+ }
313
+ if (plugin.drawSettingsSetup) {
314
+ this._drawSettingsSetupPlugins.push(plugin);
315
+ }
316
+ if (plugin.drawSettingsCleanup) {
317
+ this._drawSettingsCleanupPlugins.push(plugin);
318
+ }
319
+ if (plugin.clearDraw) {
320
+ this._clearDrawPlugins.push(plugin);
321
+ }
338
322
  }
339
323
  }
340
324
  initUpdaters() {
@@ -366,12 +350,16 @@ export class Canvas {
366
350
  canvas.height = retinaSize.height = standardSize.height * pxRatio;
367
351
  canvas.width = retinaSize.width = standardSize.width * pxRatio;
368
352
  const canSupportHdrQuery = safeMatchMedia("(color-gamut: p3)");
369
- this._context = this.element.getContext("2d", {
353
+ this._canvasSettings = {
370
354
  alpha: true,
371
355
  colorSpace: canSupportHdrQuery?.matches && container.hdr ? "display-p3" : "srgb",
372
356
  desynchronized: true,
373
357
  willReadFrequently: false,
374
- });
358
+ };
359
+ this._context = this.element.getContext("2d", this._canvasSettings);
360
+ if (this._context) {
361
+ this._context.globalCompositeOperation = defaultCompositeValue;
362
+ }
375
363
  this._safeMutationObserver(obs => {
376
364
  obs.disconnect();
377
365
  });
@@ -386,11 +374,11 @@ export class Canvas {
386
374
  }
387
375
  paint() {
388
376
  let handled = false;
389
- for (const plugin of this.container.plugins) {
377
+ for (const plugin of this._canvasPaintPlugins) {
378
+ handled = plugin.canvasPaint?.() ?? false;
390
379
  if (handled) {
391
380
  break;
392
381
  }
393
- handled = plugin.canvasPaint?.() ?? false;
394
382
  }
395
383
  if (handled) {
396
384
  return;
@@ -446,6 +434,10 @@ export class Canvas {
446
434
  this._pointerEvents = type;
447
435
  this._repairStyle();
448
436
  }
437
+ setZoom(zoomLevel, center) {
438
+ this.zoom = zoomLevel;
439
+ this._zoomCenter = center;
440
+ }
449
441
  stop() {
450
442
  this._safeMutationObserver(obs => {
451
443
  obs.disconnect();
@@ -466,4 +458,113 @@ export class Canvas {
466
458
  await container.refresh();
467
459
  }
468
460
  }
461
+ _applyPostDrawUpdaters = particle => {
462
+ for (const updater of this._postDrawUpdaters) {
463
+ updater.afterDraw?.(particle);
464
+ }
465
+ };
466
+ _applyPreDrawUpdaters = (ctx, particle, radius, zOpacity, colorStyles, transform) => {
467
+ for (const updater of this._preDrawUpdaters) {
468
+ if (updater.getColorStyles) {
469
+ const { fill, stroke } = updater.getColorStyles(particle, ctx, radius, zOpacity);
470
+ if (fill) {
471
+ colorStyles.fill = fill;
472
+ }
473
+ if (stroke) {
474
+ colorStyles.stroke = stroke;
475
+ }
476
+ }
477
+ if (updater.getTransformValues) {
478
+ const updaterTransform = updater.getTransformValues(particle);
479
+ for (const key in updaterTransform) {
480
+ setTransformValue(transform, updaterTransform, key);
481
+ }
482
+ }
483
+ updater.beforeDraw?.(particle);
484
+ }
485
+ };
486
+ _applyResizePlugins = () => {
487
+ for (const plugin of this._resizePlugins) {
488
+ plugin.resize?.();
489
+ }
490
+ };
491
+ _getPluginParticleColors = particle => {
492
+ let fColor, sColor;
493
+ for (const plugin of this._colorPlugins) {
494
+ if (!fColor && plugin.particleFillColor) {
495
+ fColor = rangeColorToHsl(this._engine, plugin.particleFillColor(particle));
496
+ }
497
+ if (!sColor && plugin.particleStrokeColor) {
498
+ sColor = rangeColorToHsl(this._engine, plugin.particleStrokeColor(particle));
499
+ }
500
+ if (fColor && sColor) {
501
+ break;
502
+ }
503
+ }
504
+ this._reusablePluginColors[fColorIndex] = fColor;
505
+ this._reusablePluginColors[sColorIndex] = sColor;
506
+ return this._reusablePluginColors;
507
+ };
508
+ _initStyle = () => {
509
+ const element = this.element, options = this.container.actualOptions;
510
+ if (!element) {
511
+ return;
512
+ }
513
+ if (this._fullScreen) {
514
+ this._setFullScreenStyle();
515
+ }
516
+ else {
517
+ this._resetOriginalStyle();
518
+ }
519
+ for (const key in options.style) {
520
+ if (!key || !(key in options.style)) {
521
+ continue;
522
+ }
523
+ const value = options.style[key];
524
+ if (!value) {
525
+ continue;
526
+ }
527
+ element.style.setProperty(key, value, "important");
528
+ }
529
+ };
530
+ _repairStyle = () => {
531
+ const element = this.element;
532
+ if (!element) {
533
+ return;
534
+ }
535
+ this._safeMutationObserver(observer => {
536
+ observer.disconnect();
537
+ });
538
+ this._initStyle();
539
+ this.initBackground();
540
+ const pointerEvents = this._pointerEvents;
541
+ element.style.pointerEvents = pointerEvents;
542
+ element.setAttribute("pointer-events", pointerEvents);
543
+ this._safeMutationObserver(observer => {
544
+ if (!(element instanceof Node)) {
545
+ return;
546
+ }
547
+ observer.observe(element, { attributes: true });
548
+ });
549
+ };
550
+ _resetOriginalStyle = () => {
551
+ const element = this.element, originalStyle = this._originalStyle;
552
+ if (!element || !originalStyle) {
553
+ return;
554
+ }
555
+ setStyle(element, originalStyle, true);
556
+ };
557
+ _safeMutationObserver = callback => {
558
+ if (!this._mutationObserver) {
559
+ return;
560
+ }
561
+ callback(this._mutationObserver);
562
+ };
563
+ _setFullScreenStyle = () => {
564
+ const element = this.element;
565
+ if (!element) {
566
+ return;
567
+ }
568
+ setStyle(element, getFullScreenStyle(this.container.actualOptions.fullScreen.zIndex), true);
569
+ };
469
570
  }