@tsparticles/engine 4.0.0-beta.0 → 4.0.0-beta.1

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 (93) hide show
  1. package/155.min.js +1 -0
  2. package/README.md +0 -21
  3. package/browser/Core/CanvasManager.js +303 -0
  4. package/browser/Core/Container.js +61 -34
  5. package/browser/Core/Engine.js +26 -138
  6. package/browser/Core/Particle.js +29 -28
  7. package/{cjs/Core/Particles.js → browser/Core/ParticlesManager.js} +27 -57
  8. package/browser/Core/RenderManager.js +303 -0
  9. package/browser/Core/Retina.js +3 -8
  10. package/browser/Core/Utils/PluginManager.js +145 -0
  11. package/browser/Options/Classes/Options.js +7 -7
  12. package/browser/Options/Classes/Particles/ParticlesOptions.js +5 -5
  13. package/browser/Types/CanvasContextType.js +1 -0
  14. package/browser/Utils/CanvasUtils.js +1 -1
  15. package/browser/Utils/ColorUtils.js +21 -21
  16. package/browser/Utils/LogUtils.js +1 -0
  17. package/browser/Utils/OptionsUtils.js +2 -2
  18. package/cjs/Core/CanvasManager.js +303 -0
  19. package/cjs/Core/Container.js +61 -34
  20. package/cjs/Core/Engine.js +26 -138
  21. package/cjs/Core/Particle.js +29 -28
  22. package/{esm/Core/Particles.js → cjs/Core/ParticlesManager.js} +27 -57
  23. package/cjs/Core/RenderManager.js +303 -0
  24. package/cjs/Core/Retina.js +3 -8
  25. package/cjs/Core/Utils/PluginManager.js +145 -0
  26. package/cjs/Options/Classes/Options.js +7 -7
  27. package/cjs/Options/Classes/Particles/ParticlesOptions.js +5 -5
  28. package/cjs/Types/CanvasContextType.js +1 -0
  29. package/cjs/Utils/CanvasUtils.js +1 -1
  30. package/cjs/Utils/ColorUtils.js +21 -21
  31. package/cjs/Utils/LogUtils.js +1 -0
  32. package/cjs/Utils/OptionsUtils.js +2 -2
  33. package/dist_browser_Core_Container_js.js +24 -14
  34. package/esm/Core/CanvasManager.js +303 -0
  35. package/esm/Core/Container.js +61 -34
  36. package/esm/Core/Engine.js +26 -138
  37. package/esm/Core/Particle.js +29 -28
  38. package/{browser/Core/Particles.js → esm/Core/ParticlesManager.js} +27 -57
  39. package/esm/Core/RenderManager.js +303 -0
  40. package/esm/Core/Retina.js +3 -8
  41. package/esm/Core/Utils/PluginManager.js +145 -0
  42. package/esm/Options/Classes/Options.js +7 -7
  43. package/esm/Options/Classes/Particles/ParticlesOptions.js +5 -5
  44. package/esm/Types/CanvasContextType.js +1 -0
  45. package/esm/Utils/CanvasUtils.js +1 -1
  46. package/esm/Utils/ColorUtils.js +21 -21
  47. package/esm/Utils/LogUtils.js +1 -0
  48. package/esm/Utils/OptionsUtils.js +2 -2
  49. package/package.json +1 -1
  50. package/report.html +84 -29
  51. package/tsparticles.engine.js +18 -8
  52. package/tsparticles.engine.min.js +2 -2
  53. package/types/Core/CanvasManager.d.ts +39 -0
  54. package/types/Core/Container.d.ts +26 -7
  55. package/types/Core/Engine.d.ts +2 -54
  56. package/types/Core/Interfaces/IContainerPlugin.d.ts +8 -7
  57. package/types/Core/Interfaces/IDrawParticleParams.d.ts +2 -1
  58. package/types/Core/Interfaces/IParticleRetinaProps.d.ts +4 -4
  59. package/types/Core/Interfaces/IParticleUpdater.d.ts +2 -1
  60. package/types/Core/Interfaces/IShapeDrawData.d.ts +2 -1
  61. package/types/Core/Particle.d.ts +4 -4
  62. package/types/Core/{Particles.d.ts → ParticlesManager.d.ts} +4 -11
  63. package/types/Core/{Canvas.d.ts → RenderManager.d.ts} +12 -33
  64. package/types/Core/Retina.d.ts +0 -2
  65. package/types/Core/Utils/PluginManager.d.ts +62 -0
  66. package/types/Options/Classes/Options.d.ts +3 -3
  67. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +3 -3
  68. package/types/Types/CanvasContextType.d.ts +1 -0
  69. package/types/Utils/CanvasUtils.d.ts +8 -5
  70. package/types/Utils/ColorUtils.d.ts +8 -8
  71. package/types/Utils/LogUtils.d.ts +1 -0
  72. package/types/Utils/OptionsUtils.d.ts +2 -2
  73. package/types/export-types.d.ts +4 -2
  74. package/umd/Core/CanvasManager.js +317 -0
  75. package/umd/Core/Container.js +61 -34
  76. package/umd/Core/Engine.js +25 -137
  77. package/umd/Core/Particle.js +29 -28
  78. package/umd/Core/{Particles.js → ParticlesManager.js} +29 -59
  79. package/umd/Core/RenderManager.js +317 -0
  80. package/umd/Core/Retina.js +3 -8
  81. package/umd/Core/Utils/PluginManager.js +159 -0
  82. package/umd/Options/Classes/Options.js +7 -7
  83. package/umd/Options/Classes/Particles/ParticlesOptions.js +5 -5
  84. package/umd/Types/CanvasContextType.js +12 -0
  85. package/umd/Utils/CanvasUtils.js +1 -1
  86. package/umd/Utils/ColorUtils.js +21 -21
  87. package/umd/Utils/LogUtils.js +1 -0
  88. package/umd/Utils/OptionsUtils.js +2 -2
  89. package/164.min.js +0 -1
  90. package/browser/Core/Canvas.js +0 -570
  91. package/cjs/Core/Canvas.js +0 -570
  92. package/esm/Core/Canvas.js +0 -570
  93. package/umd/Core/Canvas.js +0 -584
@@ -6,6 +6,7 @@ const _logger = {
6
6
  },
7
7
  info: console.info,
8
8
  log: console.log,
9
+ trace: console.trace,
9
10
  verbose: console.log,
10
11
  warning: console.warn,
11
12
  };
@@ -4,8 +4,8 @@ export function loadOptions(options, ...sourceOptionsArr) {
4
4
  options.load(sourceOptions);
5
5
  }
6
6
  }
7
- export function loadParticlesOptions(engine, container, ...sourceOptionsArr) {
8
- const options = new ParticlesOptions(engine, container);
7
+ export function loadParticlesOptions(pluginManager, container, ...sourceOptionsArr) {
8
+ const options = new ParticlesOptions(pluginManager, container);
9
9
  loadOptions(options, ...sourceOptionsArr);
10
10
  return options;
11
11
  }
@@ -0,0 +1,303 @@
1
+ import { cloneStyle, getFullScreenStyle, safeMatchMedia, safeMutationObserver } from "../Utils/Utils.js";
2
+ import { defaultZoom, generatedAttribute, half } from "./Utils/Constants.js";
3
+ import { getStyleFromRgb, rangeColorToRgb } from "../Utils/ColorUtils.js";
4
+ import { RenderManager } from "./RenderManager.js";
5
+ function setStyle(canvas, style, important = false) {
6
+ if (!style) {
7
+ return;
8
+ }
9
+ const element = canvas, elementStyle = element.style, keys = new Set();
10
+ for (let i = 0; i < elementStyle.length; i++) {
11
+ const key = elementStyle.item(i);
12
+ if (!key) {
13
+ continue;
14
+ }
15
+ keys.add(key);
16
+ }
17
+ for (let i = 0; i < style.length; i++) {
18
+ const key = style.item(i);
19
+ if (!key) {
20
+ continue;
21
+ }
22
+ keys.add(key);
23
+ }
24
+ for (const key of keys) {
25
+ const value = style.getPropertyValue(key);
26
+ if (value) {
27
+ elementStyle.setProperty(key, value, important ? "important" : "");
28
+ }
29
+ else {
30
+ elementStyle.removeProperty(key);
31
+ }
32
+ }
33
+ }
34
+ export class CanvasManager {
35
+ element;
36
+ render;
37
+ size;
38
+ zoom = defaultZoom;
39
+ _container;
40
+ _generated;
41
+ _mutationObserver;
42
+ _originalStyle;
43
+ _pluginManager;
44
+ _pointerEvents;
45
+ _resizePlugins;
46
+ _standardSize;
47
+ _zoomCenter;
48
+ constructor(pluginManager, container) {
49
+ this._pluginManager = pluginManager;
50
+ this._container = container;
51
+ this.render = new RenderManager(pluginManager, container, this);
52
+ this._standardSize = {
53
+ height: 0,
54
+ width: 0,
55
+ };
56
+ const pxRatio = container.retina.pixelRatio, stdSize = this._standardSize;
57
+ this.size = {
58
+ height: stdSize.height * pxRatio,
59
+ width: stdSize.width * pxRatio,
60
+ };
61
+ this._generated = false;
62
+ this._resizePlugins = [];
63
+ this._pointerEvents = "none";
64
+ }
65
+ get _fullScreen() {
66
+ return this._container.actualOptions.fullScreen.enable;
67
+ }
68
+ destroy() {
69
+ this.stop();
70
+ if (this._generated) {
71
+ const element = this.element;
72
+ element?.remove();
73
+ this.element = undefined;
74
+ }
75
+ else {
76
+ this._resetOriginalStyle();
77
+ }
78
+ this.render.destroy();
79
+ this._resizePlugins = [];
80
+ }
81
+ getZoomCenter() {
82
+ const pxRatio = this._container.retina.pixelRatio, { width, height } = this.size;
83
+ if (this._zoomCenter) {
84
+ return this._zoomCenter;
85
+ }
86
+ return {
87
+ x: (width * half) / pxRatio,
88
+ y: (height * half) / pxRatio,
89
+ };
90
+ }
91
+ init() {
92
+ this._safeMutationObserver(obs => {
93
+ obs.disconnect();
94
+ });
95
+ this._mutationObserver = safeMutationObserver(records => {
96
+ for (const record of records) {
97
+ if (record.type === "attributes" && record.attributeName === "style") {
98
+ this._repairStyle();
99
+ }
100
+ }
101
+ });
102
+ this.resize();
103
+ this._initStyle();
104
+ this.initBackground();
105
+ this._safeMutationObserver(obs => {
106
+ if (!this.element || !(this.element instanceof Node)) {
107
+ return;
108
+ }
109
+ obs.observe(this.element, { attributes: true });
110
+ });
111
+ this.initPlugins();
112
+ this.render.init();
113
+ }
114
+ initBackground() {
115
+ const { _container } = this, options = _container.actualOptions, background = options.background, element = this.element;
116
+ if (!element) {
117
+ return;
118
+ }
119
+ const elementStyle = element.style, color = rangeColorToRgb(this._pluginManager, background.color);
120
+ if (color) {
121
+ elementStyle.backgroundColor = getStyleFromRgb(color, _container.hdr, background.opacity);
122
+ }
123
+ else {
124
+ elementStyle.backgroundColor = "";
125
+ }
126
+ elementStyle.backgroundImage = background.image || "";
127
+ elementStyle.backgroundPosition = background.position || "";
128
+ elementStyle.backgroundRepeat = background.repeat || "";
129
+ elementStyle.backgroundSize = background.size || "";
130
+ }
131
+ initPlugins() {
132
+ this._resizePlugins = [];
133
+ for (const plugin of this._container.plugins) {
134
+ if (plugin.resize) {
135
+ this._resizePlugins.push(plugin);
136
+ }
137
+ }
138
+ }
139
+ loadCanvas(canvas) {
140
+ if (this._generated && this.element) {
141
+ this.element.remove();
142
+ }
143
+ const container = this._container;
144
+ this._generated =
145
+ generatedAttribute in canvas.dataset ? canvas.dataset[generatedAttribute] === "true" : this._generated;
146
+ this.element = canvas;
147
+ this.element.ariaHidden = "true";
148
+ this._originalStyle = cloneStyle(this.element.style);
149
+ const standardSize = this._standardSize;
150
+ standardSize.height = canvas.offsetHeight;
151
+ standardSize.width = canvas.offsetWidth;
152
+ const pxRatio = this._container.retina.pixelRatio, retinaSize = this.size;
153
+ canvas.height = retinaSize.height = standardSize.height * pxRatio;
154
+ canvas.width = retinaSize.width = standardSize.width * pxRatio;
155
+ const canSupportHdrQuery = safeMatchMedia("(color-gamut: p3)");
156
+ this.render.setContextSettings({
157
+ alpha: true,
158
+ colorSpace: canSupportHdrQuery?.matches && container.hdr ? "display-p3" : "srgb",
159
+ desynchronized: true,
160
+ willReadFrequently: false,
161
+ });
162
+ this.render.setContext(this.element.getContext("2d", this.render.settings));
163
+ this._safeMutationObserver(obs => {
164
+ obs.disconnect();
165
+ });
166
+ container.retina.init();
167
+ this.initBackground();
168
+ this._safeMutationObserver(obs => {
169
+ if (!this.element || !(this.element instanceof Node)) {
170
+ return;
171
+ }
172
+ obs.observe(this.element, { attributes: true });
173
+ });
174
+ }
175
+ resize() {
176
+ if (!this.element) {
177
+ return false;
178
+ }
179
+ const container = this._container, currentSize = container.canvas._standardSize, newSize = {
180
+ width: this.element.offsetWidth,
181
+ height: this.element.offsetHeight,
182
+ }, pxRatio = container.retina.pixelRatio, retinaSize = {
183
+ width: newSize.width * pxRatio,
184
+ height: newSize.height * pxRatio,
185
+ };
186
+ if (newSize.height === currentSize.height &&
187
+ newSize.width === currentSize.width &&
188
+ retinaSize.height === this.element.height &&
189
+ retinaSize.width === this.element.width) {
190
+ return false;
191
+ }
192
+ const oldSize = { ...currentSize };
193
+ currentSize.height = newSize.height;
194
+ currentSize.width = newSize.width;
195
+ const canvasSize = this.size;
196
+ this.element.width = canvasSize.width = retinaSize.width;
197
+ this.element.height = canvasSize.height = retinaSize.height;
198
+ if (this._container.started) {
199
+ container.particles.setResizeFactor({
200
+ width: currentSize.width / oldSize.width,
201
+ height: currentSize.height / oldSize.height,
202
+ });
203
+ }
204
+ return true;
205
+ }
206
+ setPointerEvents(type) {
207
+ const element = this.element;
208
+ if (!element) {
209
+ return;
210
+ }
211
+ this._pointerEvents = type;
212
+ this._repairStyle();
213
+ }
214
+ setZoom(zoomLevel, center) {
215
+ this.zoom = zoomLevel;
216
+ this._zoomCenter = center;
217
+ }
218
+ stop() {
219
+ this._safeMutationObserver(obs => {
220
+ obs.disconnect();
221
+ });
222
+ this._mutationObserver = undefined;
223
+ this.render.stop();
224
+ }
225
+ async windowResize() {
226
+ if (!this.element || !this.resize()) {
227
+ return;
228
+ }
229
+ const container = this._container, needsRefresh = container.updateActualOptions();
230
+ container.particles.setDensity();
231
+ this._applyResizePlugins();
232
+ if (needsRefresh) {
233
+ await container.refresh();
234
+ }
235
+ }
236
+ _applyResizePlugins = () => {
237
+ for (const plugin of this._resizePlugins) {
238
+ plugin.resize?.();
239
+ }
240
+ };
241
+ _initStyle = () => {
242
+ const element = this.element, options = this._container.actualOptions;
243
+ if (!element) {
244
+ return;
245
+ }
246
+ if (this._fullScreen) {
247
+ this._setFullScreenStyle();
248
+ }
249
+ else {
250
+ this._resetOriginalStyle();
251
+ }
252
+ for (const key in options.style) {
253
+ if (!key || !(key in options.style)) {
254
+ continue;
255
+ }
256
+ const value = options.style[key];
257
+ if (!value) {
258
+ continue;
259
+ }
260
+ element.style.setProperty(key, value, "important");
261
+ }
262
+ };
263
+ _repairStyle = () => {
264
+ const element = this.element;
265
+ if (!element) {
266
+ return;
267
+ }
268
+ this._safeMutationObserver(observer => {
269
+ observer.disconnect();
270
+ });
271
+ this._initStyle();
272
+ this.initBackground();
273
+ const pointerEvents = this._pointerEvents;
274
+ element.style.pointerEvents = pointerEvents;
275
+ element.setAttribute("pointer-events", pointerEvents);
276
+ this._safeMutationObserver(observer => {
277
+ if (!(element instanceof Node)) {
278
+ return;
279
+ }
280
+ observer.observe(element, { attributes: true });
281
+ });
282
+ };
283
+ _resetOriginalStyle = () => {
284
+ const element = this.element, originalStyle = this._originalStyle;
285
+ if (!element || !originalStyle) {
286
+ return;
287
+ }
288
+ setStyle(element, originalStyle, true);
289
+ };
290
+ _safeMutationObserver = callback => {
291
+ if (!this._mutationObserver) {
292
+ return;
293
+ }
294
+ callback(this._mutationObserver);
295
+ };
296
+ _setFullScreenStyle = () => {
297
+ const element = this.element;
298
+ if (!element) {
299
+ return;
300
+ }
301
+ setStyle(element, getFullScreenStyle(this._container.actualOptions.fullScreen.zIndex), true);
302
+ };
303
+ }
@@ -1,10 +1,10 @@
1
1
  import { animate, cancelAnimation, getRangeValue } from "../Utils/MathUtils.js";
2
- import { defaultFps, defaultFpsLimit, millisecondsToSeconds, minFpsLimit, removeDeleteCount, removeMinIndex, } from "./Utils/Constants.js";
3
- import { Canvas } from "./Canvas.js";
2
+ import { defaultFps, defaultFpsLimit, millisecondsToSeconds, minFpsLimit } from "./Utils/Constants.js";
3
+ import { CanvasManager } from "./CanvasManager.js";
4
4
  import { EventListeners } from "./Utils/EventListeners.js";
5
5
  import { EventType } from "../Enums/Types/EventType.js";
6
6
  import { Options } from "../Options/Classes/Options.js";
7
- import { Particles } from "./Particles.js";
7
+ import { ParticlesManager } from "./ParticlesManager.js";
8
8
  import { Retina } from "./Retina.js";
9
9
  import { getLogger } from "../Utils/LogUtils.js";
10
10
  import { loadOptions } from "../Utils/OptionsUtils.js";
@@ -15,8 +15,8 @@ function updateDelta(delta, value, fpsLimit = defaultFps, smooth = false) {
15
15
  delta.value = value;
16
16
  delta.factor = smooth ? defaultFps / fpsLimit : (defaultFps * value) / millisecondsToSeconds;
17
17
  }
18
- function loadContainerOptions(engine, container, ...sourceOptionsArr) {
19
- const options = new Options(engine, container);
18
+ function loadContainerOptions(pluginManager, container, ...sourceOptionsArr) {
19
+ const options = new Options(pluginManager, container);
20
20
  loadOptions(options, ...sourceOptionsArr);
21
21
  return options;
22
22
  }
@@ -24,6 +24,7 @@ export class Container {
24
24
  actualOptions;
25
25
  canvas;
26
26
  destroyed;
27
+ effectDrawers;
27
28
  fpsLimit;
28
29
  hdr;
29
30
  id;
@@ -31,28 +32,35 @@ export class Container {
31
32
  particleCreatedPlugins;
32
33
  particleDestroyedPlugins;
33
34
  particlePositionPlugins;
35
+ particleUpdaters;
34
36
  particles;
35
37
  plugins;
36
38
  retina;
39
+ shapeDrawers;
37
40
  started;
38
41
  zLayers;
39
42
  _delay;
40
43
  _delayTimeout;
41
44
  _delta = { value: 0, factor: 0 };
45
+ _dispatchCallback;
42
46
  _drawAnimationFrame;
43
47
  _duration;
44
- _engine;
45
48
  _eventListeners;
46
49
  _firstStart;
47
50
  _initialSourceOptions;
48
51
  _lastFrameTime;
49
52
  _lifeTime;
53
+ _onDestroy;
50
54
  _options;
51
55
  _paused;
56
+ _pluginManager;
52
57
  _smooth;
53
58
  _sourceOptions;
54
- constructor(engine, id, sourceOptions) {
55
- this._engine = engine;
59
+ constructor(params) {
60
+ const { dispatchCallback, pluginManager, id, onDestroy, sourceOptions } = params;
61
+ this._pluginManager = pluginManager;
62
+ this._dispatchCallback = dispatchCallback;
63
+ this._onDestroy = onDestroy;
56
64
  this.id = Symbol(id);
57
65
  this.fpsLimit = 120;
58
66
  this.hdr = false;
@@ -69,17 +77,20 @@ export class Container {
69
77
  this.pageHidden = false;
70
78
  this._sourceOptions = sourceOptions;
71
79
  this._initialSourceOptions = sourceOptions;
80
+ this.effectDrawers = new Map();
81
+ this.shapeDrawers = new Map();
82
+ this.particleUpdaters = [];
72
83
  this.retina = new Retina(this);
73
- this.canvas = new Canvas(this, this._engine);
74
- this.particles = new Particles(this._engine, this);
84
+ this.canvas = new CanvasManager(this._pluginManager, this);
85
+ this.particles = new ParticlesManager(this._pluginManager, this);
75
86
  this.plugins = [];
76
87
  this.particleDestroyedPlugins = [];
77
88
  this.particleCreatedPlugins = [];
78
89
  this.particlePositionPlugins = [];
79
- this._options = loadContainerOptions(this._engine, this);
80
- this.actualOptions = loadContainerOptions(this._engine, this);
90
+ this._options = loadContainerOptions(this._pluginManager, this);
91
+ this.actualOptions = loadContainerOptions(this._pluginManager, this);
81
92
  this._eventListeners = new EventListeners(this);
82
- this._engine.dispatchEvent(EventType.containerBuilt, { container: this });
93
+ this.dispatchEvent(EventType.containerBuilt);
83
94
  }
84
95
  get animationStatus() {
85
96
  return !this._paused && !this.pageHidden && guardCheck(this);
@@ -103,19 +114,29 @@ export class Container {
103
114
  this.stop();
104
115
  this.particles.destroy();
105
116
  this.canvas.destroy();
117
+ for (const [, effectDrawer] of this.effectDrawers) {
118
+ effectDrawer.destroy?.(this);
119
+ }
120
+ for (const [, shapeDrawer] of this.shapeDrawers) {
121
+ shapeDrawer.destroy?.(this);
122
+ }
106
123
  for (const plugin of this.plugins) {
107
124
  plugin.destroy?.();
108
125
  }
126
+ this.effectDrawers = new Map();
127
+ this.shapeDrawers = new Map();
128
+ this.particleUpdaters = [];
109
129
  this.plugins.length = 0;
110
- this._engine.clearPlugins(this);
130
+ this._pluginManager.clearPlugins(this);
111
131
  this.destroyed = true;
112
- if (remove) {
113
- const mainArr = this._engine.items, idx = mainArr.indexOf(this);
114
- if (idx >= removeMinIndex) {
115
- mainArr.splice(idx, removeDeleteCount);
116
- }
117
- }
118
- this._engine.dispatchEvent(EventType.containerDestroyed, { container: this });
132
+ this._onDestroy(remove);
133
+ this.dispatchEvent(EventType.containerDestroyed);
134
+ }
135
+ dispatchEvent(type, data) {
136
+ this._dispatchCallback(type, {
137
+ container: this,
138
+ data,
139
+ });
119
140
  }
120
141
  draw(force) {
121
142
  if (!guardCheck(this)) {
@@ -149,16 +170,16 @@ export class Container {
149
170
  return;
150
171
  }
151
172
  const allContainerPlugins = new Map();
152
- for (const plugin of this._engine.plugins) {
173
+ for (const plugin of this._pluginManager.plugins) {
153
174
  const containerPlugin = await plugin.getPlugin(this);
154
175
  if (containerPlugin.preInit) {
155
176
  await containerPlugin.preInit();
156
177
  }
157
178
  allContainerPlugins.set(plugin, containerPlugin);
158
179
  }
159
- await this.particles.initPlugins();
160
- this._options = loadContainerOptions(this._engine, this, this._initialSourceOptions, this.sourceOptions);
161
- this.actualOptions = loadContainerOptions(this._engine, this, this._options);
180
+ await this.initDrawersAndUpdaters();
181
+ this._options = loadContainerOptions(this._pluginManager, this, this._initialSourceOptions, this.sourceOptions);
182
+ this.actualOptions = loadContainerOptions(this._pluginManager, this, this._options);
162
183
  this.plugins.length = 0;
163
184
  this.particleDestroyedPlugins.length = 0;
164
185
  this.particleCreatedPlugins.length = 0;
@@ -194,12 +215,18 @@ export class Container {
194
215
  await plugin.init?.();
195
216
  }
196
217
  await this.particles.init();
197
- this._engine.dispatchEvent(EventType.containerInit, { container: this });
218
+ this.dispatchEvent(EventType.containerInit);
198
219
  this.particles.setDensity();
199
220
  for (const plugin of this.plugins) {
200
221
  plugin.particlesSetup?.();
201
222
  }
202
- this._engine.dispatchEvent(EventType.particlesSetup, { container: this });
223
+ this.dispatchEvent(EventType.particlesSetup);
224
+ }
225
+ async initDrawersAndUpdaters() {
226
+ const pluginManager = this._pluginManager;
227
+ this.effectDrawers = await pluginManager.getEffectDrawers(this, true);
228
+ this.shapeDrawers = await pluginManager.getShapeDrawers(this, true);
229
+ this.particleUpdaters = await pluginManager.getUpdaters(this, true);
203
230
  }
204
231
  pause() {
205
232
  if (!guardCheck(this)) {
@@ -218,7 +245,7 @@ export class Container {
218
245
  if (!this.pageHidden) {
219
246
  this._paused = true;
220
247
  }
221
- this._engine.dispatchEvent(EventType.containerPaused, { container: this });
248
+ this.dispatchEvent(EventType.containerPaused);
222
249
  }
223
250
  play(force) {
224
251
  if (!guardCheck(this)) {
@@ -239,7 +266,7 @@ export class Container {
239
266
  }
240
267
  }
241
268
  }
242
- this._engine.dispatchEvent(EventType.containerPlay, { container: this });
269
+ this.dispatchEvent(EventType.containerPlay);
243
270
  this.draw(needsUpdate ?? false);
244
271
  }
245
272
  async refresh() {
@@ -255,8 +282,8 @@ export class Container {
255
282
  }
256
283
  this._initialSourceOptions = sourceOptions;
257
284
  this._sourceOptions = sourceOptions;
258
- this._options = loadContainerOptions(this._engine, this, this._initialSourceOptions, this.sourceOptions);
259
- this.actualOptions = loadContainerOptions(this._engine, this, this._options);
285
+ this._options = loadContainerOptions(this._pluginManager, this, this._initialSourceOptions, this.sourceOptions);
286
+ this.actualOptions = loadContainerOptions(this._pluginManager, this, this._options);
260
287
  return this.refresh();
261
288
  }
262
289
  async start() {
@@ -271,7 +298,7 @@ export class Container {
271
298
  for (const plugin of this.plugins) {
272
299
  await plugin.start?.();
273
300
  }
274
- this._engine.dispatchEvent(EventType.containerStarted, { container: this });
301
+ this.dispatchEvent(EventType.containerStarted);
275
302
  this.play();
276
303
  resolve();
277
304
  };
@@ -299,7 +326,7 @@ export class Container {
299
326
  this.particleDestroyedPlugins.length = 0;
300
327
  this.particlePositionPlugins.length = 0;
301
328
  this._sourceOptions = this._options;
302
- this._engine.dispatchEvent(EventType.containerStopped, { container: this });
329
+ this.dispatchEvent(EventType.containerStopped);
303
330
  }
304
331
  updateActualOptions() {
305
332
  let refresh = false;
@@ -326,7 +353,7 @@ export class Container {
326
353
  this.draw(false);
327
354
  return;
328
355
  }
329
- this.canvas.drawParticles(this._delta);
356
+ this.canvas.render.drawParticles(this._delta);
330
357
  if (!this.alive()) {
331
358
  this.destroy();
332
359
  return;