@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.
- package/155.min.js +1 -0
- package/README.md +0 -21
- package/browser/Core/CanvasManager.js +303 -0
- package/browser/Core/Container.js +61 -34
- package/browser/Core/Engine.js +26 -138
- package/browser/Core/Particle.js +29 -28
- package/{cjs/Core/Particles.js → browser/Core/ParticlesManager.js} +27 -57
- package/browser/Core/RenderManager.js +303 -0
- package/browser/Core/Retina.js +3 -8
- package/browser/Core/Utils/PluginManager.js +145 -0
- package/browser/Options/Classes/Options.js +7 -7
- package/browser/Options/Classes/Particles/ParticlesOptions.js +5 -5
- package/browser/Types/CanvasContextType.js +1 -0
- package/browser/Utils/CanvasUtils.js +1 -1
- package/browser/Utils/ColorUtils.js +21 -21
- package/browser/Utils/LogUtils.js +1 -0
- package/browser/Utils/OptionsUtils.js +2 -2
- package/cjs/Core/CanvasManager.js +303 -0
- package/cjs/Core/Container.js +61 -34
- package/cjs/Core/Engine.js +26 -138
- package/cjs/Core/Particle.js +29 -28
- package/{esm/Core/Particles.js → cjs/Core/ParticlesManager.js} +27 -57
- package/cjs/Core/RenderManager.js +303 -0
- package/cjs/Core/Retina.js +3 -8
- package/cjs/Core/Utils/PluginManager.js +145 -0
- package/cjs/Options/Classes/Options.js +7 -7
- package/cjs/Options/Classes/Particles/ParticlesOptions.js +5 -5
- package/cjs/Types/CanvasContextType.js +1 -0
- package/cjs/Utils/CanvasUtils.js +1 -1
- package/cjs/Utils/ColorUtils.js +21 -21
- package/cjs/Utils/LogUtils.js +1 -0
- package/cjs/Utils/OptionsUtils.js +2 -2
- package/dist_browser_Core_Container_js.js +24 -14
- package/esm/Core/CanvasManager.js +303 -0
- package/esm/Core/Container.js +61 -34
- package/esm/Core/Engine.js +26 -138
- package/esm/Core/Particle.js +29 -28
- package/{browser/Core/Particles.js → esm/Core/ParticlesManager.js} +27 -57
- package/esm/Core/RenderManager.js +303 -0
- package/esm/Core/Retina.js +3 -8
- package/esm/Core/Utils/PluginManager.js +145 -0
- package/esm/Options/Classes/Options.js +7 -7
- package/esm/Options/Classes/Particles/ParticlesOptions.js +5 -5
- package/esm/Types/CanvasContextType.js +1 -0
- package/esm/Utils/CanvasUtils.js +1 -1
- package/esm/Utils/ColorUtils.js +21 -21
- package/esm/Utils/LogUtils.js +1 -0
- package/esm/Utils/OptionsUtils.js +2 -2
- package/package.json +1 -1
- package/report.html +84 -29
- package/tsparticles.engine.js +18 -8
- package/tsparticles.engine.min.js +2 -2
- package/types/Core/CanvasManager.d.ts +39 -0
- package/types/Core/Container.d.ts +26 -7
- package/types/Core/Engine.d.ts +2 -54
- package/types/Core/Interfaces/IContainerPlugin.d.ts +8 -7
- package/types/Core/Interfaces/IDrawParticleParams.d.ts +2 -1
- package/types/Core/Interfaces/IParticleRetinaProps.d.ts +4 -4
- package/types/Core/Interfaces/IParticleUpdater.d.ts +2 -1
- package/types/Core/Interfaces/IShapeDrawData.d.ts +2 -1
- package/types/Core/Particle.d.ts +4 -4
- package/types/Core/{Particles.d.ts → ParticlesManager.d.ts} +4 -11
- package/types/Core/{Canvas.d.ts → RenderManager.d.ts} +12 -33
- package/types/Core/Retina.d.ts +0 -2
- package/types/Core/Utils/PluginManager.d.ts +62 -0
- package/types/Options/Classes/Options.d.ts +3 -3
- package/types/Options/Classes/Particles/ParticlesOptions.d.ts +3 -3
- package/types/Types/CanvasContextType.d.ts +1 -0
- package/types/Utils/CanvasUtils.d.ts +8 -5
- package/types/Utils/ColorUtils.d.ts +8 -8
- package/types/Utils/LogUtils.d.ts +1 -0
- package/types/Utils/OptionsUtils.d.ts +2 -2
- package/types/export-types.d.ts +4 -2
- package/umd/Core/CanvasManager.js +317 -0
- package/umd/Core/Container.js +61 -34
- package/umd/Core/Engine.js +25 -137
- package/umd/Core/Particle.js +29 -28
- package/umd/Core/{Particles.js → ParticlesManager.js} +29 -59
- package/umd/Core/RenderManager.js +317 -0
- package/umd/Core/Retina.js +3 -8
- package/umd/Core/Utils/PluginManager.js +159 -0
- package/umd/Options/Classes/Options.js +7 -7
- package/umd/Options/Classes/Particles/ParticlesOptions.js +5 -5
- package/umd/Types/CanvasContextType.js +12 -0
- package/umd/Utils/CanvasUtils.js +1 -1
- package/umd/Utils/ColorUtils.js +21 -21
- package/umd/Utils/LogUtils.js +1 -0
- package/umd/Utils/OptionsUtils.js +2 -2
- package/164.min.js +0 -1
- package/browser/Core/Canvas.js +0 -570
- package/cjs/Core/Canvas.js +0 -570
- package/esm/Core/Canvas.js +0 -570
- package/umd/Core/Canvas.js +0 -584
|
@@ -4,8 +4,8 @@ export function loadOptions(options, ...sourceOptionsArr) {
|
|
|
4
4
|
options.load(sourceOptions);
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
|
-
export function loadParticlesOptions(
|
|
8
|
-
const options = new ParticlesOptions(
|
|
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
|
+
}
|
package/cjs/Core/Container.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { animate, cancelAnimation, getRangeValue } from "../Utils/MathUtils.js";
|
|
2
|
-
import { defaultFps, defaultFpsLimit, millisecondsToSeconds, minFpsLimit
|
|
3
|
-
import {
|
|
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 {
|
|
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(
|
|
19
|
-
const options = new Options(
|
|
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(
|
|
55
|
-
|
|
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
|
|
74
|
-
this.particles = new
|
|
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.
|
|
80
|
-
this.actualOptions = loadContainerOptions(this.
|
|
90
|
+
this._options = loadContainerOptions(this._pluginManager, this);
|
|
91
|
+
this.actualOptions = loadContainerOptions(this._pluginManager, this);
|
|
81
92
|
this._eventListeners = new EventListeners(this);
|
|
82
|
-
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.
|
|
130
|
+
this._pluginManager.clearPlugins(this);
|
|
111
131
|
this.destroyed = true;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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.
|
|
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.
|
|
160
|
-
this._options = loadContainerOptions(this.
|
|
161
|
-
this.actualOptions = loadContainerOptions(this.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
259
|
-
this.actualOptions = loadContainerOptions(this.
|
|
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.
|
|
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.
|
|
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;
|