@tsparticles/preset-big-circles 4.4.0 → 4.5.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.
|
@@ -1,21 +1,35 @@
|
|
|
1
|
-
(function(g){g.__tsParticlesInternals=g.__tsParticlesInternals||{};g.__tsParticlesInternals.bundles=g.__tsParticlesInternals.bundles||{};g.__tsParticlesInternals.effects=g.__tsParticlesInternals.effects||{};g.__tsParticlesInternals.engine=g.__tsParticlesInternals.engine||{};g.__tsParticlesInternals.interactions=g.__tsParticlesInternals.interactions||{};g.__tsParticlesInternals.palettes=g.__tsParticlesInternals.palettes||{};g.__tsParticlesInternals.paths=g.__tsParticlesInternals.paths||{};g.__tsParticlesInternals.plugins=g.__tsParticlesInternals.plugins||{};g.__tsParticlesInternals.plugins=g.__tsParticlesInternals.plugins||{};g.__tsParticlesInternals.plugins.emittersShapes=g.__tsParticlesInternals.plugins.emittersShapes||{};g.__tsParticlesInternals.presets=g.__tsParticlesInternals.presets||{};g.__tsParticlesInternals.shapes=g.__tsParticlesInternals.shapes||{};g.__tsParticlesInternals.updaters=g.__tsParticlesInternals.updaters||{};g.__tsParticlesInternals.utils=g.__tsParticlesInternals.utils||{};g.__tsParticlesInternals.canvas=g.__tsParticlesInternals.canvas||{};g.__tsParticlesInternals.canvas=g.__tsParticlesInternals.canvas||{};g.__tsParticlesInternals.canvas.utils=g.__tsParticlesInternals.canvas.utils||{};g.__tsParticlesInternals.path=g.__tsParticlesInternals.path||{};g.__tsParticlesInternals.path=g.__tsParticlesInternals.path||{};g.__tsParticlesInternals.path.utils=g.__tsParticlesInternals.path.utils||{};var __tsProxyFactory=typeof Proxy!=="undefined"?function(obj){return new Proxy(obj,{get:function(target,key){if(!(key in target)){target[key]={};}return target[key];}});}:function(obj){return obj;};g.__tsParticlesInternals.bundles=__tsProxyFactory(g.__tsParticlesInternals.bundles);g.__tsParticlesInternals.effects=__tsProxyFactory(g.__tsParticlesInternals.effects);g.__tsParticlesInternals.interactions=__tsProxyFactory(g.__tsParticlesInternals.interactions);g.__tsParticlesInternals.palettes=__tsProxyFactory(g.__tsParticlesInternals.palettes);g.__tsParticlesInternals.paths=__tsProxyFactory(g.__tsParticlesInternals.paths);g.__tsParticlesInternals.plugins=__tsProxyFactory(g.__tsParticlesInternals.plugins);g.__tsParticlesInternals.plugins.emittersShapes=__tsProxyFactory(g.__tsParticlesInternals.plugins.emittersShapes);g.__tsParticlesInternals.presets=__tsProxyFactory(g.__tsParticlesInternals.presets);g.__tsParticlesInternals.shapes=__tsProxyFactory(g.__tsParticlesInternals.shapes);g.__tsParticlesInternals.updaters=__tsProxyFactory(g.__tsParticlesInternals.updaters);g.__tsParticlesInternals.utils=__tsProxyFactory(g.__tsParticlesInternals.utils);g.__tsParticlesInternals.canvas=__tsProxyFactory(g.__tsParticlesInternals.canvas);g.__tsParticlesInternals.path=__tsProxyFactory(g.__tsParticlesInternals.path);
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
(function(g){g.__tsParticlesInternals=g.__tsParticlesInternals||{};g.__tsParticlesInternals.bundles=g.__tsParticlesInternals.bundles||{};g.__tsParticlesInternals.effects=g.__tsParticlesInternals.effects||{};g.__tsParticlesInternals.engine=g.__tsParticlesInternals.engine||{};g.__tsParticlesInternals.interactions=g.__tsParticlesInternals.interactions||{};g.__tsParticlesInternals.palettes=g.__tsParticlesInternals.palettes||{};g.__tsParticlesInternals.paths=g.__tsParticlesInternals.paths||{};g.__tsParticlesInternals.plugins=g.__tsParticlesInternals.plugins||{};g.__tsParticlesInternals.plugins=g.__tsParticlesInternals.plugins||{};g.__tsParticlesInternals.plugins.emittersShapes=g.__tsParticlesInternals.plugins.emittersShapes||{};g.__tsParticlesInternals.presets=g.__tsParticlesInternals.presets||{};g.__tsParticlesInternals.shapes=g.__tsParticlesInternals.shapes||{};g.__tsParticlesInternals.updaters=g.__tsParticlesInternals.updaters||{};g.__tsParticlesInternals.utils=g.__tsParticlesInternals.utils||{};g.__tsParticlesInternals.canvas=g.__tsParticlesInternals.canvas||{};g.__tsParticlesInternals.canvas=g.__tsParticlesInternals.canvas||{};g.__tsParticlesInternals.canvas.utils=g.__tsParticlesInternals.canvas.utils||{};g.__tsParticlesInternals.path=g.__tsParticlesInternals.path||{};g.__tsParticlesInternals.path=g.__tsParticlesInternals.path||{};g.__tsParticlesInternals.path.utils=g.__tsParticlesInternals.path.utils||{};var __tsProxyFactory=typeof Proxy!=="undefined"?function(obj){return new Proxy(obj,{get:function(target,key){if(!(key in target)){target[key]={};}return target[key];}});}:function(obj){return obj;};g.__tsParticlesInternals.bundles=__tsProxyFactory(g.__tsParticlesInternals.bundles);g.__tsParticlesInternals.effects=__tsProxyFactory(g.__tsParticlesInternals.effects);g.__tsParticlesInternals.interactions=__tsProxyFactory(g.__tsParticlesInternals.interactions);g.__tsParticlesInternals.palettes=__tsProxyFactory(g.__tsParticlesInternals.palettes);g.__tsParticlesInternals.paths=__tsProxyFactory(g.__tsParticlesInternals.paths);g.__tsParticlesInternals.plugins=__tsProxyFactory(g.__tsParticlesInternals.plugins);g.__tsParticlesInternals.plugins.emittersShapes=__tsProxyFactory(g.__tsParticlesInternals.plugins.emittersShapes);g.__tsParticlesInternals.presets=__tsProxyFactory(g.__tsParticlesInternals.presets);g.__tsParticlesInternals.shapes=__tsProxyFactory(g.__tsParticlesInternals.shapes);g.__tsParticlesInternals.updaters=__tsProxyFactory(g.__tsParticlesInternals.updaters);g.__tsParticlesInternals.utils=__tsProxyFactory(g.__tsParticlesInternals.utils);g.__tsParticlesInternals.canvas=__tsProxyFactory(g.__tsParticlesInternals.canvas);g.__tsParticlesInternals.path=__tsProxyFactory(g.__tsParticlesInternals.path);})(typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:this);
|
|
2
|
+
(function (g) {
|
|
3
|
+
/* Preset v4.5.1 */
|
|
4
|
+
g.__tsParticlesInternals = g.__tsParticlesInternals || {};
|
|
5
|
+
g.__tsParticlesInternals.presets = g.__tsParticlesInternals.presets || {};
|
|
6
|
+
(function (exports) {
|
|
7
|
+
'use strict';
|
|
8
8
|
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
const errorPrefix = "tsParticles - Error", codedErrorPattern = /^\[tsParticles Error (TSP-\d+)\]\s*/, fullMatchIndex = 0, codeIndex = 1;
|
|
10
|
+
const wrap = (fn) => (...args) => {
|
|
11
|
+
fn(...args);
|
|
12
|
+
}, _logger = {
|
|
13
|
+
debug: wrap(console.debug),
|
|
14
|
+
error: (message, ...optionalParams) => {
|
|
15
|
+
if (typeof message === "string") {
|
|
16
|
+
const match = codedErrorPattern.exec(message);
|
|
17
|
+
if (match?.[codeIndex]) {
|
|
18
|
+
console.error(`tsParticles - ${match[codeIndex]} - ${message.slice(match[fullMatchIndex].length)}`, ...optionalParams);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
console.error(`${errorPrefix} - ${message}`, ...optionalParams);
|
|
23
|
+
},
|
|
24
|
+
info: wrap(console.info),
|
|
25
|
+
log: wrap(console.log),
|
|
26
|
+
trace: wrap(console.trace),
|
|
27
|
+
verbose: wrap(console.log),
|
|
28
|
+
warning: wrap(console.warn),
|
|
29
|
+
};
|
|
30
|
+
function getLogger() {
|
|
31
|
+
return _logger;
|
|
32
|
+
}
|
|
19
33
|
|
|
20
34
|
var MoveDirection;
|
|
21
35
|
(function (MoveDirection) {
|
|
@@ -32,6 +46,17 @@
|
|
|
32
46
|
MoveDirection["inside"] = "inside";
|
|
33
47
|
})(MoveDirection || (MoveDirection = {}));
|
|
34
48
|
|
|
49
|
+
const generatedAttribute = "generated", fullPercent = "100%", defaultCompositeValue = "source-over", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, originPoint = {
|
|
50
|
+
x: 0,
|
|
51
|
+
y: 0,
|
|
52
|
+
z: 0,
|
|
53
|
+
}, defaultTransform = {
|
|
54
|
+
a: 1,
|
|
55
|
+
b: 0,
|
|
56
|
+
c: 0,
|
|
57
|
+
d: 1,
|
|
58
|
+
}, randomColorValue = "random", double = 2, doublePI = Math.PI * double, defaultFps = 60, defaultAlpha = 1, generatedTrue = "true", generatedFalse = "false", canvasTag = "canvas", defaultRetryCount = 0, squareExp = 2, spatialHashGridCellSize = 100, defaultRemoveQuantity = 1, defaultRatio = 1, defaultReduceFactor = 1, inverseFactorNumerator = 1, rgbMax = 255, hMax = 360, sMax = 100, lMax = 100, hMin = 0, sMin = 0, hPhase = 60, empty = 0, quarter = 0.25, threeQuarter = half + quarter, minVelocity = 0, minDistance = 0, minRadius = 0, defaultTransformValue = 1, minimumSize = 0, zIndexFactorOffset = 1, defaultOpacity$1 = 1, removeDeleteCount = 1, removeMinIndex = 0, defaultFpsLimit = 120, minFpsLimit = 0, canvasFirstIndex = 0, loadRandomFactor = 10000, loadMinIndex = 0, one = 1, none = 0, decayOffset = 1, tryCountIncrement = 1, minZ = 0, minLimit = 0, countOffset = 1, minCount = 0, minIndex = 0, defaultDensityFactor = 1, deleteCount = 1, defaultAngle = 0, identity = 1, minStrokeWidth = 0, lFactor = 1, lMin = 0, maxNits = 400, triple = 3, sextuple = 6, sNormalizedOffset = 1, phaseNumerator = 1, defaultRgbMin = 0, defaultVelocity = 0, defaultLoops = 0, defaultTime = 0, defaultZoom = 1;
|
|
59
|
+
|
|
35
60
|
function getZ(source) {
|
|
36
61
|
return "z" in source ? source.z : originPoint.z;
|
|
37
62
|
}
|
|
@@ -147,6 +172,12 @@
|
|
|
147
172
|
function isNumber(arg) {
|
|
148
173
|
return typeof arg === "number";
|
|
149
174
|
}
|
|
175
|
+
function isEnumValue(enumObject, arg) {
|
|
176
|
+
return Object.values(enumObject).some(enumValue => enumValue === arg);
|
|
177
|
+
}
|
|
178
|
+
function toEnumValue(enumObject, arg, defaultValue) {
|
|
179
|
+
return isEnumValue(enumObject, arg) ? arg : defaultValue;
|
|
180
|
+
}
|
|
150
181
|
function isObject(arg) {
|
|
151
182
|
return typeof arg === "object" && arg !== null;
|
|
152
183
|
}
|
|
@@ -270,11 +301,61 @@
|
|
|
270
301
|
};
|
|
271
302
|
}
|
|
272
303
|
function parseAlpha(input) {
|
|
273
|
-
const defaultAlpha = 1;
|
|
274
304
|
if (!input) {
|
|
275
305
|
return defaultAlpha;
|
|
276
306
|
}
|
|
277
|
-
return input.endsWith("%") ? parseFloat(input) / percentDenominator : parseFloat(input);
|
|
307
|
+
return input.endsWith("%") ? Number.parseFloat(input) / percentDenominator : Number.parseFloat(input);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const ErrorCodes$1 = {
|
|
311
|
+
engineVersionMismatch: "TSP-1001",
|
|
312
|
+
particlePositionNotFound: "TSP-1002",
|
|
313
|
+
pluginRegisterAfterLoad: "TSP-1003",
|
|
314
|
+
offscreenCanvasUnsupported: "TSP-1101",
|
|
315
|
+
offscreenCanvasTransferFailed: "TSP-1102",
|
|
316
|
+
hdrEnableInvalid: "TSP-1201",
|
|
317
|
+
hdrModeInvalid: "TSP-1202",
|
|
318
|
+
hdrPeakNitsInvalid: "TSP-1203",
|
|
319
|
+
};
|
|
320
|
+
|
|
321
|
+
const messages = {
|
|
322
|
+
[ErrorCodes$1.engineVersionMismatch]: "The tsParticles version is different from the loaded plugins version. Engine version: {0}. Plugin version: {1}",
|
|
323
|
+
[ErrorCodes$1.particlePositionNotFound]: "a valid position cannot be found for particle",
|
|
324
|
+
[ErrorCodes$1.pluginRegisterAfterLoad]: "Register plugins can only be done before calling tsParticles.load()",
|
|
325
|
+
[ErrorCodes$1.offscreenCanvasUnsupported]: "OffscreenCanvas is required but not supported by this browser",
|
|
326
|
+
[ErrorCodes$1.offscreenCanvasTransferFailed]: "OffscreenCanvas transfer failed",
|
|
327
|
+
[ErrorCodes$1.hdrEnableInvalid]: 'Invalid HDR "enable" value: expected a boolean, got "{0}"',
|
|
328
|
+
[ErrorCodes$1.hdrModeInvalid]: 'Invalid HDR "mode" value: expected one of {0}, got "{1}"',
|
|
329
|
+
[ErrorCodes$1.hdrPeakNitsInvalid]: 'Invalid HDR "peakNits" value: expected a positive number, got "{0}"',
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
let registeredMessages;
|
|
333
|
+
const ensureRegisteredMessages = () => {
|
|
334
|
+
registeredMessages ??= new Map(Object.entries(messages));
|
|
335
|
+
return registeredMessages;
|
|
336
|
+
}, toStringValue$1 = (value) => String(value), format = (template, args) => {
|
|
337
|
+
return template.replace(/\{(\d+)\}/g, (match, index) => {
|
|
338
|
+
const arg = args[Number(index)];
|
|
339
|
+
return arg === undefined ? match : toStringValue$1(arg);
|
|
340
|
+
});
|
|
341
|
+
};
|
|
342
|
+
function addErrorMessages(extraMessages) {
|
|
343
|
+
if (typeof process !== "undefined" && process.env.NODE_ENV === "production") {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
const catalog = ensureRegisteredMessages();
|
|
347
|
+
for (const [code, message] of Object.entries(extraMessages)) {
|
|
348
|
+
if (message !== undefined) {
|
|
349
|
+
catalog.set(code, message);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
function getErrorMessage(code, ...args) {
|
|
354
|
+
if (typeof process !== "undefined" && process.env.NODE_ENV === "production") {
|
|
355
|
+
return `[tsParticles Error ${code}] https://particles.js.org/errors/#${code}`;
|
|
356
|
+
}
|
|
357
|
+
const template = ensureRegisteredMessages().get(code) ?? `Unknown error code ${code}`;
|
|
358
|
+
return format(template, args);
|
|
278
359
|
}
|
|
279
360
|
|
|
280
361
|
var OutModeDirection;
|
|
@@ -291,7 +372,6 @@
|
|
|
291
372
|
PixelMode["percent"] = "percent";
|
|
292
373
|
})(PixelMode || (PixelMode = {}));
|
|
293
374
|
|
|
294
|
-
const minRadius = 0;
|
|
295
375
|
function isForbiddenKey(key) {
|
|
296
376
|
return key === "__proto__" || key === "constructor" || key === "prototype";
|
|
297
377
|
}
|
|
@@ -487,22 +567,84 @@
|
|
|
487
567
|
element.removeEventListener(event, handler, removeOptions);
|
|
488
568
|
}
|
|
489
569
|
}
|
|
490
|
-
async function getItemsFromInitializer(container,
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
570
|
+
async function getItemsFromInitializer(container, initializers) {
|
|
571
|
+
return await Promise.all([...initializers.values()].map(t => t(container)));
|
|
572
|
+
}
|
|
573
|
+
async function getItemMapFromInitializer(container, initializers) {
|
|
574
|
+
const entries = await Promise.all([...initializers.entries()].map(([key, initializer]) => initializer(container).then(item => [key, item])));
|
|
575
|
+
return new Map(entries);
|
|
576
|
+
}
|
|
577
|
+
async function getDataFromUrl(data) {
|
|
578
|
+
const url = itemFromSingleOrMultiple(data.url, data.index);
|
|
579
|
+
if (!url) {
|
|
580
|
+
return data.fallback;
|
|
495
581
|
}
|
|
496
|
-
|
|
582
|
+
try {
|
|
583
|
+
const response = await fetch(url);
|
|
584
|
+
if (response.ok) {
|
|
585
|
+
const current = (await response.json());
|
|
586
|
+
if (isSourceOptionsValue(current)) {
|
|
587
|
+
return current;
|
|
588
|
+
}
|
|
589
|
+
getLogger().error("invalid configuration data while retrieving config file");
|
|
590
|
+
}
|
|
591
|
+
else {
|
|
592
|
+
getLogger().error(`${response.status.toString()} while retrieving config file`);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
catch (error) {
|
|
596
|
+
getLogger().error(`error while retrieving config file: ${error}`);
|
|
597
|
+
}
|
|
598
|
+
return data.fallback;
|
|
497
599
|
}
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
const entries = await Promise.all([...initializers.entries()].map(([key, initializer]) => initializer(container).then(item => [key, item])));
|
|
502
|
-
res = new Map(entries);
|
|
503
|
-
map.set(container, res);
|
|
600
|
+
function isSourceOptionsValue(value) {
|
|
601
|
+
if (isArray(value)) {
|
|
602
|
+
return value.every((entry) => isObject(entry) && !isArray(entry));
|
|
504
603
|
}
|
|
505
|
-
return
|
|
604
|
+
return isObject(value) && !isArray(value);
|
|
605
|
+
}
|
|
606
|
+
function getCanvasFromContainer(domContainer) {
|
|
607
|
+
let canvasEl;
|
|
608
|
+
const documentSafe = safeDocument(), isCanvas = domContainer instanceof HTMLCanvasElement || domContainer.tagName.toLowerCase() === canvasTag;
|
|
609
|
+
if (isCanvas) {
|
|
610
|
+
canvasEl = domContainer;
|
|
611
|
+
canvasEl.dataset[generatedAttribute] ??= generatedFalse;
|
|
612
|
+
if (canvasEl.dataset[generatedAttribute] === generatedTrue) {
|
|
613
|
+
canvasEl.style.width ||= fullPercent;
|
|
614
|
+
canvasEl.style.height ||= fullPercent;
|
|
615
|
+
canvasEl.style.pointerEvents = "none";
|
|
616
|
+
canvasEl.style.setProperty("pointer-events", "none");
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
else {
|
|
620
|
+
const existingCanvases = domContainer.getElementsByTagName(canvasTag), foundCanvas = existingCanvases.item(canvasFirstIndex);
|
|
621
|
+
if (foundCanvas) {
|
|
622
|
+
canvasEl = foundCanvas;
|
|
623
|
+
canvasEl.dataset[generatedAttribute] = generatedFalse;
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
canvasEl = documentSafe.createElement(canvasTag);
|
|
627
|
+
canvasEl.dataset[generatedAttribute] = generatedTrue;
|
|
628
|
+
domContainer.appendChild(canvasEl);
|
|
629
|
+
}
|
|
630
|
+
canvasEl.style.width ||= fullPercent;
|
|
631
|
+
canvasEl.style.height ||= fullPercent;
|
|
632
|
+
canvasEl.style.pointerEvents = "none";
|
|
633
|
+
canvasEl.style.setProperty("pointer-events", "none");
|
|
634
|
+
}
|
|
635
|
+
return canvasEl;
|
|
636
|
+
}
|
|
637
|
+
function getDomContainer(id, source) {
|
|
638
|
+
const documentSafe = safeDocument();
|
|
639
|
+
let domContainer = source ?? documentSafe.getElementById(id);
|
|
640
|
+
if (domContainer) {
|
|
641
|
+
return domContainer;
|
|
642
|
+
}
|
|
643
|
+
domContainer = documentSafe.createElement("canvas");
|
|
644
|
+
domContainer.id = id;
|
|
645
|
+
domContainer.dataset[generatedAttribute] = generatedTrue;
|
|
646
|
+
documentSafe.body.append(domContainer);
|
|
647
|
+
return domContainer;
|
|
506
648
|
}
|
|
507
649
|
|
|
508
650
|
class EventDispatcher {
|
|
@@ -512,12 +654,8 @@
|
|
|
512
654
|
}
|
|
513
655
|
addEventListener(type, listener) {
|
|
514
656
|
this.removeEventListener(type, listener);
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
arr = [];
|
|
518
|
-
this.#listeners.set(type, arr);
|
|
519
|
-
}
|
|
520
|
-
arr.push(listener);
|
|
657
|
+
const arr = this.#listeners.get(type);
|
|
658
|
+
this.#listeners.set(type, arr ? [...arr, listener] : [listener]);
|
|
521
659
|
}
|
|
522
660
|
dispatchEvent(type, args) {
|
|
523
661
|
const listeners = this.#listeners.get(type);
|
|
@@ -549,7 +687,7 @@
|
|
|
549
687
|
this.#listeners.delete(type);
|
|
550
688
|
}
|
|
551
689
|
else {
|
|
552
|
-
arr.
|
|
690
|
+
this.#listeners.set(type, [...arr.slice(minIndex, idx), ...arr.slice(idx + deleteCount)]);
|
|
553
691
|
}
|
|
554
692
|
}
|
|
555
693
|
}
|
|
@@ -573,7 +711,6 @@
|
|
|
573
711
|
class PluginManager {
|
|
574
712
|
colorManagers = new Map();
|
|
575
713
|
easingFunctions = new Map();
|
|
576
|
-
effectDrawers = new Map();
|
|
577
714
|
initializers = {
|
|
578
715
|
effects: new Map(),
|
|
579
716
|
shapes: new Map(),
|
|
@@ -582,8 +719,6 @@
|
|
|
582
719
|
palettes = new Map();
|
|
583
720
|
plugins = [];
|
|
584
721
|
presets = new Map();
|
|
585
|
-
shapeDrawers = new Map();
|
|
586
|
-
updaters = new Map();
|
|
587
722
|
#allLoadersSet = new Set();
|
|
588
723
|
#configs = new Map();
|
|
589
724
|
#engine;
|
|
@@ -601,57 +736,79 @@
|
|
|
601
736
|
}
|
|
602
737
|
return res;
|
|
603
738
|
}
|
|
739
|
+
get initialized() {
|
|
740
|
+
return this.#initialized;
|
|
741
|
+
}
|
|
604
742
|
addColorManager(name, manager) {
|
|
743
|
+
if (this.#initialized) {
|
|
744
|
+
return;
|
|
745
|
+
}
|
|
605
746
|
this.colorManagers.set(name, manager);
|
|
606
747
|
}
|
|
607
748
|
addConfig(config) {
|
|
749
|
+
if (this.#initialized) {
|
|
750
|
+
return;
|
|
751
|
+
}
|
|
608
752
|
const key = config.key ?? config.name ?? "default";
|
|
609
753
|
this.#configs.set(key, config);
|
|
610
754
|
this.#engine.dispatchEvent(EventType.configAdded, { data: { name: key, config } });
|
|
611
755
|
}
|
|
612
756
|
addEasing(name, easing) {
|
|
757
|
+
if (this.#initialized) {
|
|
758
|
+
return;
|
|
759
|
+
}
|
|
613
760
|
if (this.easingFunctions.get(name)) {
|
|
614
761
|
return;
|
|
615
762
|
}
|
|
616
763
|
this.easingFunctions.set(name, easing);
|
|
617
764
|
}
|
|
618
765
|
addEffect(effect, drawer) {
|
|
766
|
+
if (this.#initialized) {
|
|
767
|
+
return;
|
|
768
|
+
}
|
|
619
769
|
this.initializers.effects.set(effect, drawer);
|
|
620
770
|
}
|
|
621
771
|
addPalette(name, palette) {
|
|
772
|
+
if (this.#initialized) {
|
|
773
|
+
return;
|
|
774
|
+
}
|
|
622
775
|
this.palettes.set(name, palette);
|
|
623
776
|
}
|
|
624
777
|
addParticleUpdater(name, updaterInitializer) {
|
|
778
|
+
if (this.#initialized) {
|
|
779
|
+
return;
|
|
780
|
+
}
|
|
625
781
|
this.initializers.updaters.set(name, updaterInitializer);
|
|
626
782
|
}
|
|
627
783
|
addPlugin(plugin) {
|
|
784
|
+
if (this.#initialized) {
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
628
787
|
if (this.getPlugin(plugin.id)) {
|
|
629
788
|
return;
|
|
630
789
|
}
|
|
631
790
|
this.plugins.push(plugin);
|
|
632
791
|
}
|
|
633
792
|
addPreset(preset, options, override = false) {
|
|
793
|
+
if (this.#initialized) {
|
|
794
|
+
return;
|
|
795
|
+
}
|
|
634
796
|
if (!(override || !this.getPreset(preset))) {
|
|
635
797
|
return;
|
|
636
798
|
}
|
|
637
799
|
this.presets.set(preset, options);
|
|
638
800
|
}
|
|
639
801
|
addShape(shapes, drawer) {
|
|
802
|
+
if (this.#initialized) {
|
|
803
|
+
return;
|
|
804
|
+
}
|
|
640
805
|
for (const shape of shapes) {
|
|
641
806
|
this.initializers.shapes.set(shape, drawer);
|
|
642
807
|
}
|
|
643
808
|
}
|
|
644
|
-
clearPlugins(container) {
|
|
645
|
-
this.effectDrawers.delete(container);
|
|
646
|
-
this.shapeDrawers.delete(container);
|
|
647
|
-
this.updaters.delete(container);
|
|
648
|
-
}
|
|
649
809
|
getEasing(name) {
|
|
650
810
|
return this.easingFunctions.get(name) ?? ((value) => value);
|
|
651
811
|
}
|
|
652
|
-
getEffectDrawers(container, force = false) {
|
|
653
|
-
return getItemMapFromInitializer(container, this.effectDrawers, this.initializers.effects, force);
|
|
654
|
-
}
|
|
655
812
|
getPalette(name) {
|
|
656
813
|
return this.palettes.get(name);
|
|
657
814
|
}
|
|
@@ -661,12 +818,6 @@
|
|
|
661
818
|
getPreset(preset) {
|
|
662
819
|
return this.presets.get(preset);
|
|
663
820
|
}
|
|
664
|
-
async getShapeDrawers(container, force = false) {
|
|
665
|
-
return getItemMapFromInitializer(container, this.shapeDrawers, this.initializers.shapes, force);
|
|
666
|
-
}
|
|
667
|
-
async getUpdaters(container, force = false) {
|
|
668
|
-
return getItemsFromInitializer(container, this.updaters, this.initializers.updaters, force);
|
|
669
|
-
}
|
|
670
821
|
async init() {
|
|
671
822
|
if (this.#initialized || this.#isRunningLoaders) {
|
|
672
823
|
return;
|
|
@@ -685,16 +836,9 @@
|
|
|
685
836
|
this.#initialized = true;
|
|
686
837
|
}
|
|
687
838
|
}
|
|
688
|
-
loadParticlesOptions(container, options, ...sourceOptions) {
|
|
689
|
-
const updaters = this.updaters.get(container);
|
|
690
|
-
if (!updaters) {
|
|
691
|
-
return;
|
|
692
|
-
}
|
|
693
|
-
updaters.forEach(updater => updater.loadOptions?.(options, ...sourceOptions));
|
|
694
|
-
}
|
|
695
839
|
async register(...loaders) {
|
|
696
840
|
if (this.#initialized) {
|
|
697
|
-
throw new Error(
|
|
841
|
+
throw new Error(getErrorMessage(ErrorCodes$1.pluginRegisterAfterLoad));
|
|
698
842
|
}
|
|
699
843
|
for (const loader of loaders) {
|
|
700
844
|
if (this.#isRunningLoaders) {
|
|
@@ -706,88 +850,15 @@
|
|
|
706
850
|
}
|
|
707
851
|
}
|
|
708
852
|
async #runLoader(loader, executed, allLoaders) {
|
|
709
|
-
if (executed.has(loader))
|
|
853
|
+
if (executed.has(loader)) {
|
|
710
854
|
return;
|
|
855
|
+
}
|
|
711
856
|
executed.add(loader);
|
|
712
857
|
allLoaders.add(loader);
|
|
713
858
|
await loader(this.#engine);
|
|
714
859
|
}
|
|
715
860
|
}
|
|
716
861
|
|
|
717
|
-
const errorPrefix = "tsParticles - Error";
|
|
718
|
-
const wrap = (fn) => (...args) => {
|
|
719
|
-
fn(...args);
|
|
720
|
-
}, _logger = {
|
|
721
|
-
debug: wrap(console.debug),
|
|
722
|
-
error: (message, ...optionalParams) => {
|
|
723
|
-
console.error(`${errorPrefix} - ${message}`, ...optionalParams);
|
|
724
|
-
},
|
|
725
|
-
info: wrap(console.info),
|
|
726
|
-
log: wrap(console.log),
|
|
727
|
-
trace: wrap(console.trace),
|
|
728
|
-
verbose: wrap(console.log),
|
|
729
|
-
warning: wrap(console.warn),
|
|
730
|
-
};
|
|
731
|
-
function getLogger() {
|
|
732
|
-
return _logger;
|
|
733
|
-
}
|
|
734
|
-
|
|
735
|
-
const fullPercent = "100%";
|
|
736
|
-
async function getDataFromUrl(data) {
|
|
737
|
-
const url = itemFromSingleOrMultiple(data.url, data.index);
|
|
738
|
-
if (!url) {
|
|
739
|
-
return data.fallback;
|
|
740
|
-
}
|
|
741
|
-
const response = await fetch(url);
|
|
742
|
-
if (response.ok) {
|
|
743
|
-
return (await response.json());
|
|
744
|
-
}
|
|
745
|
-
getLogger().error(`${response.status.toString()} while retrieving config file`);
|
|
746
|
-
return data.fallback;
|
|
747
|
-
}
|
|
748
|
-
const getCanvasFromContainer = (domContainer) => {
|
|
749
|
-
const documentSafe = safeDocument();
|
|
750
|
-
let canvasEl;
|
|
751
|
-
const isCanvas = domContainer instanceof HTMLCanvasElement || domContainer.tagName.toLowerCase() === canvasTag;
|
|
752
|
-
if (isCanvas) {
|
|
753
|
-
canvasEl = domContainer;
|
|
754
|
-
canvasEl.dataset[generatedAttribute] ??= generatedFalse;
|
|
755
|
-
if (canvasEl.dataset[generatedAttribute] === generatedTrue) {
|
|
756
|
-
canvasEl.style.width ||= fullPercent;
|
|
757
|
-
canvasEl.style.height ||= fullPercent;
|
|
758
|
-
canvasEl.style.pointerEvents = "none";
|
|
759
|
-
canvasEl.style.setProperty("pointer-events", "none");
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
|
-
else {
|
|
763
|
-
const existingCanvases = domContainer.getElementsByTagName(canvasTag), foundCanvas = existingCanvases.item(canvasFirstIndex);
|
|
764
|
-
if (foundCanvas) {
|
|
765
|
-
canvasEl = foundCanvas;
|
|
766
|
-
canvasEl.dataset[generatedAttribute] = generatedFalse;
|
|
767
|
-
}
|
|
768
|
-
else {
|
|
769
|
-
canvasEl = documentSafe.createElement(canvasTag);
|
|
770
|
-
canvasEl.dataset[generatedAttribute] = generatedTrue;
|
|
771
|
-
domContainer.appendChild(canvasEl);
|
|
772
|
-
}
|
|
773
|
-
canvasEl.style.width ||= fullPercent;
|
|
774
|
-
canvasEl.style.height ||= fullPercent;
|
|
775
|
-
canvasEl.style.pointerEvents = "none";
|
|
776
|
-
canvasEl.style.setProperty("pointer-events", "none");
|
|
777
|
-
}
|
|
778
|
-
return canvasEl;
|
|
779
|
-
}, getDomContainer = (id, source) => {
|
|
780
|
-
const documentSafe = safeDocument();
|
|
781
|
-
let domContainer = source ?? documentSafe.getElementById(id);
|
|
782
|
-
if (domContainer) {
|
|
783
|
-
return domContainer;
|
|
784
|
-
}
|
|
785
|
-
domContainer = documentSafe.createElement("canvas");
|
|
786
|
-
domContainer.id = id;
|
|
787
|
-
domContainer.dataset[generatedAttribute] = generatedTrue;
|
|
788
|
-
documentSafe.body.append(domContainer);
|
|
789
|
-
return domContainer;
|
|
790
|
-
};
|
|
791
862
|
class Engine {
|
|
792
863
|
pluginManager = new PluginManager(this);
|
|
793
864
|
#domArray = [];
|
|
@@ -797,7 +868,7 @@
|
|
|
797
868
|
return this.#domArray;
|
|
798
869
|
}
|
|
799
870
|
get version() {
|
|
800
|
-
return "4.
|
|
871
|
+
return "4.5.1";
|
|
801
872
|
}
|
|
802
873
|
addEventListener(type, listener) {
|
|
803
874
|
this.#eventDispatcher.addEventListener(type, listener);
|
|
@@ -806,7 +877,7 @@
|
|
|
806
877
|
if (this.version === pluginVersion) {
|
|
807
878
|
return;
|
|
808
879
|
}
|
|
809
|
-
throw new Error(
|
|
880
|
+
throw new Error(getErrorMessage(ErrorCodes$1.engineVersionMismatch, this.version, pluginVersion));
|
|
810
881
|
}
|
|
811
882
|
dispatchEvent(type, args) {
|
|
812
883
|
this.#eventDispatcher.dispatchEvent(type, args);
|
|
@@ -1055,20 +1126,6 @@
|
|
|
1055
1126
|
DrawLayer[DrawLayer["Foreground"] = 7] = "Foreground";
|
|
1056
1127
|
})(DrawLayer || (DrawLayer = {}));
|
|
1057
1128
|
|
|
1058
|
-
class OptionLoader {
|
|
1059
|
-
load(data) {
|
|
1060
|
-
if (isNull(data)) {
|
|
1061
|
-
return;
|
|
1062
|
-
}
|
|
1063
|
-
this.doLoad(data);
|
|
1064
|
-
}
|
|
1065
|
-
}
|
|
1066
|
-
function loadOptions(options, ...sourceOptionsArr) {
|
|
1067
|
-
for (const sourceOptions of sourceOptionsArr) {
|
|
1068
|
-
options.load(sourceOptions);
|
|
1069
|
-
}
|
|
1070
|
-
}
|
|
1071
|
-
|
|
1072
1129
|
function loadProperty(obj, key, value) {
|
|
1073
1130
|
if (value !== undefined) {
|
|
1074
1131
|
obj[key] = value;
|
|
@@ -1100,6 +1157,20 @@
|
|
|
1100
1157
|
}
|
|
1101
1158
|
}
|
|
1102
1159
|
|
|
1160
|
+
class OptionLoader {
|
|
1161
|
+
load(data) {
|
|
1162
|
+
if (isNull(data)) {
|
|
1163
|
+
return;
|
|
1164
|
+
}
|
|
1165
|
+
this.doLoad(data);
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
function loadOptions(options, ...sourceOptionsArr) {
|
|
1169
|
+
for (const sourceOptions of sourceOptionsArr) {
|
|
1170
|
+
options.load(sourceOptions);
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1103
1174
|
class AnimationOptions extends OptionLoader {
|
|
1104
1175
|
count = 0;
|
|
1105
1176
|
decay = 0;
|
|
@@ -1250,15 +1321,14 @@
|
|
|
1250
1321
|
peakNits = defaultPeakNits;
|
|
1251
1322
|
doLoad(data) {
|
|
1252
1323
|
if (data.enable !== undefined && !isBoolean(data.enable)) {
|
|
1253
|
-
throw new Error(
|
|
1324
|
+
throw new Error(getErrorMessage(ErrorCodes$1.hdrEnableInvalid, String(data.enable)));
|
|
1254
1325
|
}
|
|
1255
|
-
if (data.mode !== undefined &&
|
|
1256
|
-
(
|
|
1257
|
-
throw new Error(`Invalid HDR "mode" value: expected one of ${Object.values(HdrMode).join(", ")}, got "${toStringValue(data.mode)}"`);
|
|
1326
|
+
if (data.mode !== undefined && !isEnumValue(HdrMode, data.mode)) {
|
|
1327
|
+
throw new Error(getErrorMessage(ErrorCodes$1.hdrModeInvalid, Object.values(HdrMode).join(", "), toStringValue(data.mode)));
|
|
1258
1328
|
}
|
|
1259
1329
|
if (data.peakNits !== undefined &&
|
|
1260
1330
|
(!isNumber(data.peakNits) || !Number.isFinite(data.peakNits) || data.peakNits <= minPeakNits)) {
|
|
1261
|
-
throw new Error(
|
|
1331
|
+
throw new Error(getErrorMessage(ErrorCodes$1.hdrPeakNitsInvalid, String(data.peakNits)));
|
|
1262
1332
|
}
|
|
1263
1333
|
loadProperty(this, "enable", data.enable);
|
|
1264
1334
|
loadProperty(this, "mode", data.mode);
|
|
@@ -1636,12 +1706,10 @@
|
|
|
1636
1706
|
plugin.loadParticlesOptions(this.#container, this, data);
|
|
1637
1707
|
}
|
|
1638
1708
|
}
|
|
1639
|
-
const updaters = this.#
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
updater.loadOptions(this, data);
|
|
1644
|
-
}
|
|
1709
|
+
const updaters = this.#container.particleUpdaters;
|
|
1710
|
+
for (const updater of updaters) {
|
|
1711
|
+
if (updater.loadOptions) {
|
|
1712
|
+
updater.loadOptions(this, data);
|
|
1645
1713
|
}
|
|
1646
1714
|
}
|
|
1647
1715
|
}
|
|
@@ -1974,9 +2042,9 @@
|
|
|
1974
2042
|
const grayscaleValue = Math.round(lNormalized * rgbMax);
|
|
1975
2043
|
return { r: grayscaleValue, g: grayscaleValue, b: grayscaleValue };
|
|
1976
2044
|
}
|
|
1977
|
-
const
|
|
2045
|
+
const temp2 = lNormalized < half
|
|
1978
2046
|
? lNormalized * (sNormalizedOffset + sNormalized)
|
|
1979
|
-
: lNormalized + sNormalized - lNormalized * sNormalized,
|
|
2047
|
+
: lNormalized + sNormalized - lNormalized * sNormalized, temp1 = double * lNormalized - temp2, phaseThird = phaseNumerator / triple, red = Math.min(rgbMax, rgbMax * hslChannel(temp1, temp2, hNormalized + phaseThird)), green = Math.min(rgbMax, rgbMax * hslChannel(temp1, temp2, hNormalized)), blue = Math.min(rgbMax, rgbMax * hslChannel(temp1, temp2, hNormalized - phaseThird));
|
|
1980
2048
|
return { r: Math.round(red), g: Math.round(green), b: Math.round(blue) };
|
|
1981
2049
|
}
|
|
1982
2050
|
function hslToRgbFloat(hsl) {
|
|
@@ -1985,9 +2053,9 @@
|
|
|
1985
2053
|
const grayscaleValue = lNormalized * rgbMax;
|
|
1986
2054
|
return { r: grayscaleValue, g: grayscaleValue, b: grayscaleValue };
|
|
1987
2055
|
}
|
|
1988
|
-
const
|
|
2056
|
+
const temp2 = lNormalized < half
|
|
1989
2057
|
? lNormalized * (sNormalizedOffset + sNormalized)
|
|
1990
|
-
: lNormalized + sNormalized - lNormalized * sNormalized,
|
|
2058
|
+
: lNormalized + sNormalized - lNormalized * sNormalized, temp1 = double * lNormalized - temp2, phaseThird = phaseNumerator / triple, red = Math.min(rgbMax, rgbMax * hslChannel(temp1, temp2, hNormalized + phaseThird)), green = Math.min(rgbMax, rgbMax * hslChannel(temp1, temp2, hNormalized)), blue = Math.min(rgbMax, rgbMax * hslChannel(temp1, temp2, hNormalized - phaseThird));
|
|
1991
2059
|
return { r: red, g: green, b: blue };
|
|
1992
2060
|
}
|
|
1993
2061
|
function hslaToRgba(hsla) {
|
|
@@ -2201,7 +2269,7 @@
|
|
|
2201
2269
|
}
|
|
2202
2270
|
|
|
2203
2271
|
async function loadBlendPlugin(engine) {
|
|
2204
|
-
engine.checkVersion("4.
|
|
2272
|
+
engine.checkVersion("4.5.1");
|
|
2205
2273
|
await engine.pluginManager.register(e => {
|
|
2206
2274
|
e.pluginManager.addPlugin(new BlendPlugin());
|
|
2207
2275
|
});
|
|
@@ -2238,7 +2306,7 @@
|
|
|
2238
2306
|
}
|
|
2239
2307
|
|
|
2240
2308
|
async function loadCircleShape(engine) {
|
|
2241
|
-
engine.checkVersion("4.
|
|
2309
|
+
engine.checkVersion("4.5.1");
|
|
2242
2310
|
await engine.pluginManager.register(e => {
|
|
2243
2311
|
e.pluginManager.addShape(["circle"], () => {
|
|
2244
2312
|
return Promise.resolve(new CircleDrawer());
|
|
@@ -2253,7 +2321,7 @@
|
|
|
2253
2321
|
RgbIndexes[RgbIndexes["b"] = 3] = "b";
|
|
2254
2322
|
RgbIndexes[RgbIndexes["a"] = 4] = "a";
|
|
2255
2323
|
})(RgbIndexes$1 || (RgbIndexes$1 = {}));
|
|
2256
|
-
const shorthandHexRegex = /^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i, hexRegex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i, hexRadix = 16,
|
|
2324
|
+
const shorthandHexRegex = /^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i, hexRegex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i, hexRadix = 16, alphaFactor = 0xff;
|
|
2257
2325
|
class HexColorManager {
|
|
2258
2326
|
accepts(input) {
|
|
2259
2327
|
return input.startsWith("#");
|
|
@@ -2286,7 +2354,7 @@
|
|
|
2286
2354
|
}
|
|
2287
2355
|
|
|
2288
2356
|
async function loadHexColorPlugin(engine) {
|
|
2289
|
-
engine.checkVersion("4.
|
|
2357
|
+
engine.checkVersion("4.5.1");
|
|
2290
2358
|
await engine.pluginManager.register(e => {
|
|
2291
2359
|
e.pluginManager.addColorManager("hex", new HexColorManager());
|
|
2292
2360
|
});
|
|
@@ -2326,7 +2394,7 @@
|
|
|
2326
2394
|
if (!this.accepts(input)) {
|
|
2327
2395
|
return;
|
|
2328
2396
|
}
|
|
2329
|
-
const result = hslRegex.exec(input), minLength = 4,
|
|
2397
|
+
const result = hslRegex.exec(input), minLength = 4, radix = 10;
|
|
2330
2398
|
return result
|
|
2331
2399
|
? hslaToRgba({
|
|
2332
2400
|
a: result.length > minLength ? parseAlpha(result[HslIndexes.a]) : defaultAlpha,
|
|
@@ -2339,12 +2407,20 @@
|
|
|
2339
2407
|
}
|
|
2340
2408
|
|
|
2341
2409
|
async function loadHslColorPlugin(engine) {
|
|
2342
|
-
engine.checkVersion("4.
|
|
2410
|
+
engine.checkVersion("4.5.1");
|
|
2343
2411
|
await engine.pluginManager.register(e => {
|
|
2344
2412
|
e.pluginManager.addColorManager("hsl", new HslColorManager());
|
|
2345
2413
|
});
|
|
2346
2414
|
}
|
|
2347
2415
|
|
|
2416
|
+
const ErrorCodes = {
|
|
2417
|
+
baseMoverNotLoaded: "TSP-3203",
|
|
2418
|
+
};
|
|
2419
|
+
|
|
2420
|
+
const ErrorMessages = {
|
|
2421
|
+
[ErrorCodes.baseMoverNotLoaded]: "tsParticles Base Mover is not loaded",
|
|
2422
|
+
};
|
|
2423
|
+
|
|
2348
2424
|
class MovePlugin {
|
|
2349
2425
|
id = "move";
|
|
2350
2426
|
#pluginManager;
|
|
@@ -2363,20 +2439,20 @@
|
|
|
2363
2439
|
}
|
|
2364
2440
|
|
|
2365
2441
|
async function loadMovePlugin(engine) {
|
|
2366
|
-
engine.checkVersion("4.
|
|
2442
|
+
engine.checkVersion("4.5.1");
|
|
2443
|
+
if (typeof process !== "undefined" && process.env.NODE_ENV !== "production") {
|
|
2444
|
+
addErrorMessages(ErrorMessages);
|
|
2445
|
+
}
|
|
2367
2446
|
await engine.pluginManager.register(e => {
|
|
2368
2447
|
const moveEngine = e, movePluginManager = moveEngine.pluginManager;
|
|
2369
2448
|
movePluginManager.initializers.pathGenerators ??= new Map();
|
|
2370
|
-
movePluginManager.pathGenerators ??= new Map();
|
|
2371
2449
|
movePluginManager.addPathGenerator = (name, generator) => {
|
|
2450
|
+
if (movePluginManager.initialized) {
|
|
2451
|
+
return;
|
|
2452
|
+
}
|
|
2372
2453
|
movePluginManager.initializers.pathGenerators ??= new Map();
|
|
2373
2454
|
movePluginManager.initializers.pathGenerators.set(name, generator);
|
|
2374
2455
|
};
|
|
2375
|
-
movePluginManager.getPathGenerators = async (container, force = false) => {
|
|
2376
|
-
movePluginManager.initializers.pathGenerators ??= new Map();
|
|
2377
|
-
movePluginManager.pathGenerators ??= new Map();
|
|
2378
|
-
return getItemMapFromInitializer(container, movePluginManager.pathGenerators, movePluginManager.initializers.pathGenerators, force);
|
|
2379
|
-
};
|
|
2380
2456
|
e.pluginManager.addPlugin(new MovePlugin(e.pluginManager));
|
|
2381
2457
|
});
|
|
2382
2458
|
}
|
|
@@ -2573,7 +2649,7 @@
|
|
|
2573
2649
|
}
|
|
2574
2650
|
|
|
2575
2651
|
async function loadOpacityUpdater(engine) {
|
|
2576
|
-
engine.checkVersion("4.
|
|
2652
|
+
engine.checkVersion("4.5.1");
|
|
2577
2653
|
await engine.pluginManager.register(e => {
|
|
2578
2654
|
e.pluginManager.addParticleUpdater("opacity", container => {
|
|
2579
2655
|
return Promise.resolve(new OpacityUpdater(container));
|
|
@@ -2582,70 +2658,60 @@
|
|
|
2582
2658
|
}
|
|
2583
2659
|
|
|
2584
2660
|
const boundsMin = 0;
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
}
|
|
2618
|
-
}
|
|
2619
|
-
function
|
|
2620
|
-
if ((data.outMode !== OutMode.bounce && data.outMode !== OutMode.split) ||
|
|
2621
|
-
(data.direction !== OutModeDirection.bottom && data.direction !== OutModeDirection.top)) {
|
|
2661
|
+
const bounceAxisConfigs = {
|
|
2662
|
+
[OutModeDirection.left]: {
|
|
2663
|
+
axis: "x",
|
|
2664
|
+
canvas: "width",
|
|
2665
|
+
bounce: "horizontal",
|
|
2666
|
+
negativeEdge: "right",
|
|
2667
|
+
positiveEdge: "left",
|
|
2668
|
+
negative: true,
|
|
2669
|
+
},
|
|
2670
|
+
[OutModeDirection.right]: {
|
|
2671
|
+
axis: "x",
|
|
2672
|
+
canvas: "width",
|
|
2673
|
+
bounce: "horizontal",
|
|
2674
|
+
negativeEdge: "right",
|
|
2675
|
+
positiveEdge: "left",
|
|
2676
|
+
negative: false,
|
|
2677
|
+
},
|
|
2678
|
+
[OutModeDirection.top]: {
|
|
2679
|
+
axis: "y",
|
|
2680
|
+
canvas: "height",
|
|
2681
|
+
bounce: "vertical",
|
|
2682
|
+
negativeEdge: "bottom",
|
|
2683
|
+
positiveEdge: "top",
|
|
2684
|
+
negative: true,
|
|
2685
|
+
},
|
|
2686
|
+
[OutModeDirection.bottom]: {
|
|
2687
|
+
axis: "y",
|
|
2688
|
+
canvas: "height",
|
|
2689
|
+
bounce: "vertical",
|
|
2690
|
+
negativeEdge: "bottom",
|
|
2691
|
+
positiveEdge: "top",
|
|
2692
|
+
negative: false,
|
|
2693
|
+
},
|
|
2694
|
+
};
|
|
2695
|
+
function bounce(data) {
|
|
2696
|
+
if ((data.outMode !== OutMode.bounce && data.outMode !== OutMode.split) || !(data.direction in bounceAxisConfigs)) {
|
|
2622
2697
|
return;
|
|
2623
2698
|
}
|
|
2624
|
-
|
|
2625
|
-
|
|
2699
|
+
const config = bounceAxisConfigs[data.direction], bounds = data.bounds, canvasDim = data.canvasSize[config.canvas], position = data.particle.position, velocity = data.particle.velocity[config.axis];
|
|
2700
|
+
if (config.negative && bounds[config.negativeEdge] < boundsMin) {
|
|
2701
|
+
position[config.axis] = data.size + data.offset[config.axis];
|
|
2626
2702
|
}
|
|
2627
|
-
else if (
|
|
2628
|
-
|
|
2703
|
+
else if (!config.negative && bounds[config.positiveEdge] > canvasDim) {
|
|
2704
|
+
position[config.axis] = canvasDim - data.size - data.offset[config.axis];
|
|
2629
2705
|
}
|
|
2630
|
-
const velocity = data.particle.velocity.y;
|
|
2631
|
-
let bounced = false;
|
|
2632
2706
|
if (data.outOfCanvas &&
|
|
2633
|
-
((
|
|
2634
|
-
|
|
2635
|
-
const newVelocity = getRangeValue(data.particle.options.bounce.vertical.value);
|
|
2636
|
-
data.particle.velocity.y *= -newVelocity;
|
|
2637
|
-
bounced = true;
|
|
2707
|
+
((config.negative && velocity < minVelocity) || (!config.negative && velocity > minVelocity))) {
|
|
2708
|
+
data.particle.velocity[config.axis] *= -getRangeValue(data.particle.options.bounce[config.bounce].value);
|
|
2638
2709
|
}
|
|
2639
|
-
|
|
2710
|
+
else {
|
|
2640
2711
|
return;
|
|
2641
2712
|
}
|
|
2642
|
-
const minPos = data.offset.
|
|
2643
|
-
|
|
2644
|
-
data.particle.position.y = data.canvasSize.height - minPos;
|
|
2645
|
-
}
|
|
2646
|
-
else if (data.outOfCanvas && data.direction === OutModeDirection.top) {
|
|
2647
|
-
data.particle.position.y = minPos;
|
|
2648
|
-
}
|
|
2713
|
+
const minPos = data.offset[config.axis] + data.size;
|
|
2714
|
+
position[config.axis] = config.negative ? minPos : canvasDim - minPos;
|
|
2649
2715
|
if (data.outMode === OutMode.split) {
|
|
2650
2716
|
data.particle.destroy();
|
|
2651
2717
|
}
|
|
@@ -2661,26 +2727,19 @@
|
|
|
2661
2727
|
OutMode.bounce,
|
|
2662
2728
|
OutMode.split,
|
|
2663
2729
|
];
|
|
2664
|
-
this.#particleBouncePlugins = container.plugins.filter(p => p.particleBounce
|
|
2730
|
+
this.#particleBouncePlugins = container.plugins.filter(p => !!p.particleBounce);
|
|
2665
2731
|
}
|
|
2666
2732
|
update(particle, direction, delta, outMode) {
|
|
2667
2733
|
if (!this.modes.includes(outMode)) {
|
|
2668
2734
|
return;
|
|
2669
2735
|
}
|
|
2670
|
-
const container = this.#container;
|
|
2671
|
-
let handled = false;
|
|
2672
2736
|
for (const plugin of this.#particleBouncePlugins) {
|
|
2673
|
-
|
|
2674
|
-
|
|
2675
|
-
break;
|
|
2737
|
+
if (plugin.particleBounce?.(particle, delta, direction)) {
|
|
2738
|
+
return;
|
|
2676
2739
|
}
|
|
2677
2740
|
}
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
}
|
|
2681
|
-
const pos = particle.getPosition(), offset = particle.offset, size = particle.getRadius(), bounds = calculateBounds(pos, size), canvasSize = container.canvas.size, outOfCanvas = !particle.isInsideCanvasForOutMode(outMode, direction);
|
|
2682
|
-
bounceHorizontal({ particle, outMode, direction, bounds, canvasSize, offset, outOfCanvas, size });
|
|
2683
|
-
bounceVertical({ particle, outMode, direction, bounds, canvasSize, offset, outOfCanvas, size });
|
|
2741
|
+
const pos = particle.getPosition(), offset = particle.offset, size = particle.getRadius(), bounds = calculateBounds(pos, size), canvasSize = this.#container.canvas.size, outOfCanvas = !particle.isInsideCanvasForOutMode(outMode, direction);
|
|
2742
|
+
bounce({ particle, outMode, direction, bounds, canvasSize, offset, outOfCanvas, size });
|
|
2684
2743
|
}
|
|
2685
2744
|
}
|
|
2686
2745
|
|
|
@@ -2769,108 +2828,109 @@
|
|
|
2769
2828
|
return;
|
|
2770
2829
|
}
|
|
2771
2830
|
const container = this.#container;
|
|
2772
|
-
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
|
|
2776
|
-
|
|
2777
|
-
|
|
2778
|
-
updateVector.addTo(particle.moveCenter);
|
|
2779
|
-
const { dx, dy } = getDistances(particle.position, updateVector);
|
|
2780
|
-
if ((vx <= minVelocity && dx >= minDistance) ||
|
|
2781
|
-
(vy <= minVelocity && dy >= minDistance) ||
|
|
2782
|
-
(vx >= minVelocity && dx <= minDistance) ||
|
|
2783
|
-
(vy >= minVelocity && dy <= minDistance)) {
|
|
2784
|
-
return;
|
|
2785
|
-
}
|
|
2786
|
-
particle.position.x = Math.floor(randomInRangeValue({
|
|
2787
|
-
min: 0,
|
|
2788
|
-
max: container.canvas.size.width,
|
|
2789
|
-
}));
|
|
2790
|
-
particle.position.y = Math.floor(randomInRangeValue({
|
|
2791
|
-
min: 0,
|
|
2792
|
-
max: container.canvas.size.height,
|
|
2793
|
-
}));
|
|
2794
|
-
const { dx: newDx, dy: newDy } = getDistances(particle.position, particle.moveCenter);
|
|
2795
|
-
particle.direction = Math.atan2(-newDy, -newDx);
|
|
2796
|
-
particle.velocity.angle = particle.direction;
|
|
2797
|
-
particle.justWarped = true;
|
|
2798
|
-
break;
|
|
2831
|
+
if (particle.outType === ParticleOutType.inside) {
|
|
2832
|
+
this.#applyOutModeInside(particle, container);
|
|
2833
|
+
}
|
|
2834
|
+
else {
|
|
2835
|
+
if (particle.isInsideCanvasForOutMode(outMode, direction)) {
|
|
2836
|
+
return;
|
|
2799
2837
|
}
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
|
|
2803
|
-
|
|
2804
|
-
|
|
2805
|
-
case ParticleOutType.outside: {
|
|
2806
|
-
particle.position.x =
|
|
2807
|
-
Math.floor(randomInRangeValue({
|
|
2808
|
-
min: -particle.moveCenter.radius,
|
|
2809
|
-
max: particle.moveCenter.radius,
|
|
2810
|
-
})) + particle.moveCenter.x;
|
|
2811
|
-
particle.position.y =
|
|
2812
|
-
Math.floor(randomInRangeValue({
|
|
2813
|
-
min: -particle.moveCenter.radius,
|
|
2814
|
-
max: particle.moveCenter.radius,
|
|
2815
|
-
})) + particle.moveCenter.y;
|
|
2816
|
-
const { dx, dy } = getDistances(particle.position, particle.moveCenter);
|
|
2817
|
-
if (particle.moveCenter.radius) {
|
|
2818
|
-
particle.direction = Math.atan2(dy, dx);
|
|
2819
|
-
particle.velocity.angle = particle.direction;
|
|
2820
|
-
}
|
|
2821
|
-
particle.justWarped = true;
|
|
2822
|
-
break;
|
|
2823
|
-
}
|
|
2824
|
-
case ParticleOutType.normal: {
|
|
2825
|
-
const warp = particle.options.move.warp, canvasSize = container.canvas.size, newPos = {
|
|
2826
|
-
bottom: canvasSize.height + particle.getRadius() + particle.offset.y,
|
|
2827
|
-
left: -particle.getRadius() - particle.offset.x,
|
|
2828
|
-
right: canvasSize.width + particle.getRadius() + particle.offset.x,
|
|
2829
|
-
top: -particle.getRadius() - particle.offset.y,
|
|
2830
|
-
}, sizeValue = particle.getRadius(), nextBounds = calculateBounds(particle.position, sizeValue);
|
|
2831
|
-
if (direction === OutModeDirection.right && nextBounds.left > canvasSize.width + particle.offset.x) {
|
|
2832
|
-
particle.position.x = newPos.left;
|
|
2833
|
-
particle.initialPosition.x = particle.position.x;
|
|
2834
|
-
if (!warp) {
|
|
2835
|
-
particle.position.y = getRandom() * canvasSize.height;
|
|
2836
|
-
particle.initialPosition.y = particle.position.y;
|
|
2837
|
-
}
|
|
2838
|
-
particle.justWarped = true;
|
|
2839
|
-
}
|
|
2840
|
-
else if (direction === OutModeDirection.left && nextBounds.right < -particle.offset.x) {
|
|
2841
|
-
particle.position.x = newPos.right;
|
|
2842
|
-
particle.initialPosition.x = particle.position.x;
|
|
2843
|
-
if (!warp) {
|
|
2844
|
-
particle.position.y = getRandom() * canvasSize.height;
|
|
2845
|
-
particle.initialPosition.y = particle.position.y;
|
|
2846
|
-
}
|
|
2847
|
-
particle.justWarped = true;
|
|
2848
|
-
}
|
|
2849
|
-
if (direction === OutModeDirection.bottom && nextBounds.top > canvasSize.height + particle.offset.y) {
|
|
2850
|
-
if (!warp) {
|
|
2851
|
-
particle.position.x = getRandom() * canvasSize.width;
|
|
2852
|
-
particle.initialPosition.x = particle.position.x;
|
|
2853
|
-
}
|
|
2854
|
-
particle.position.y = newPos.top;
|
|
2855
|
-
particle.initialPosition.y = particle.position.y;
|
|
2856
|
-
particle.justWarped = true;
|
|
2857
|
-
}
|
|
2858
|
-
else if (direction === OutModeDirection.top && nextBounds.bottom < -particle.offset.y) {
|
|
2859
|
-
if (!warp) {
|
|
2860
|
-
particle.position.x = getRandom() * canvasSize.width;
|
|
2861
|
-
particle.initialPosition.x = particle.position.x;
|
|
2862
|
-
}
|
|
2863
|
-
particle.position.y = newPos.bottom;
|
|
2864
|
-
particle.initialPosition.y = particle.position.y;
|
|
2865
|
-
particle.justWarped = true;
|
|
2866
|
-
}
|
|
2867
|
-
break;
|
|
2868
|
-
}
|
|
2869
|
-
}
|
|
2870
|
-
break;
|
|
2838
|
+
if (particle.outType === ParticleOutType.outside) {
|
|
2839
|
+
this.#applyParticleModeOutside(particle);
|
|
2840
|
+
}
|
|
2841
|
+
else {
|
|
2842
|
+
this.#applyOutModeNormal(particle, container, direction);
|
|
2871
2843
|
}
|
|
2872
2844
|
}
|
|
2873
2845
|
}
|
|
2846
|
+
#applyOutModeInside(particle, container) {
|
|
2847
|
+
const { x: vx, y: vy } = particle.velocity;
|
|
2848
|
+
updateVector.setTo(originPoint);
|
|
2849
|
+
updateVector.length = particle.moveCenter.radius;
|
|
2850
|
+
updateVector.angle = particle.velocity.angle + Math.PI;
|
|
2851
|
+
updateVector.addTo(particle.moveCenter);
|
|
2852
|
+
const { dx, dy } = getDistances(particle.position, updateVector);
|
|
2853
|
+
if ((vx <= minVelocity && dx >= minDistance) ||
|
|
2854
|
+
(vy <= minVelocity && dy >= minDistance) ||
|
|
2855
|
+
(vx >= minVelocity && dx <= minDistance) ||
|
|
2856
|
+
(vy >= minVelocity && dy <= minDistance)) {
|
|
2857
|
+
return;
|
|
2858
|
+
}
|
|
2859
|
+
particle.position.x = Math.floor(randomInRangeValue({
|
|
2860
|
+
min: 0,
|
|
2861
|
+
max: container.canvas.size.width,
|
|
2862
|
+
}));
|
|
2863
|
+
particle.position.y = Math.floor(randomInRangeValue({
|
|
2864
|
+
min: 0,
|
|
2865
|
+
max: container.canvas.size.height,
|
|
2866
|
+
}));
|
|
2867
|
+
const { dx: newDx, dy: newDy } = getDistances(particle.position, particle.moveCenter);
|
|
2868
|
+
particle.direction = Math.atan2(-newDy, -newDx);
|
|
2869
|
+
particle.velocity.angle = particle.direction;
|
|
2870
|
+
particle.justWarped = true;
|
|
2871
|
+
}
|
|
2872
|
+
#applyOutModeNormal(particle, container, direction) {
|
|
2873
|
+
const warp = particle.options.move.warp, canvasSize = container.canvas.size, sizeValue = particle.getRadius(), newPos = {
|
|
2874
|
+
bottom: canvasSize.height + sizeValue + particle.offset.y,
|
|
2875
|
+
left: -sizeValue - particle.offset.x,
|
|
2876
|
+
right: canvasSize.width + sizeValue + particle.offset.x,
|
|
2877
|
+
top: -sizeValue - particle.offset.y,
|
|
2878
|
+
}, nextBounds = calculateBounds(particle.position, sizeValue);
|
|
2879
|
+
if (direction === OutModeDirection.right && nextBounds.left > canvasSize.width + particle.offset.x) {
|
|
2880
|
+
particle.position.x = newPos.left;
|
|
2881
|
+
particle.initialPosition.x = particle.position.x;
|
|
2882
|
+
if (!warp) {
|
|
2883
|
+
particle.position.y = getRandom() * canvasSize.height;
|
|
2884
|
+
particle.initialPosition.y = particle.position.y;
|
|
2885
|
+
}
|
|
2886
|
+
particle.justWarped = true;
|
|
2887
|
+
}
|
|
2888
|
+
else if (direction === OutModeDirection.left && nextBounds.right < -particle.offset.x) {
|
|
2889
|
+
particle.position.x = newPos.right;
|
|
2890
|
+
particle.initialPosition.x = particle.position.x;
|
|
2891
|
+
if (!warp) {
|
|
2892
|
+
particle.position.y = getRandom() * canvasSize.height;
|
|
2893
|
+
particle.initialPosition.y = particle.position.y;
|
|
2894
|
+
}
|
|
2895
|
+
particle.justWarped = true;
|
|
2896
|
+
}
|
|
2897
|
+
if (direction === OutModeDirection.bottom && nextBounds.top > canvasSize.height + particle.offset.y) {
|
|
2898
|
+
if (!warp) {
|
|
2899
|
+
particle.position.x = getRandom() * canvasSize.width;
|
|
2900
|
+
particle.initialPosition.x = particle.position.x;
|
|
2901
|
+
}
|
|
2902
|
+
particle.position.y = newPos.top;
|
|
2903
|
+
particle.initialPosition.y = particle.position.y;
|
|
2904
|
+
particle.justWarped = true;
|
|
2905
|
+
}
|
|
2906
|
+
else if (direction === OutModeDirection.top && nextBounds.bottom < -particle.offset.y) {
|
|
2907
|
+
if (!warp) {
|
|
2908
|
+
particle.position.x = getRandom() * canvasSize.width;
|
|
2909
|
+
particle.initialPosition.x = particle.position.x;
|
|
2910
|
+
}
|
|
2911
|
+
particle.position.y = newPos.bottom;
|
|
2912
|
+
particle.initialPosition.y = particle.position.y;
|
|
2913
|
+
particle.justWarped = true;
|
|
2914
|
+
}
|
|
2915
|
+
}
|
|
2916
|
+
#applyParticleModeOutside(particle) {
|
|
2917
|
+
particle.position.x =
|
|
2918
|
+
Math.floor(randomInRangeValue({
|
|
2919
|
+
min: -particle.moveCenter.radius,
|
|
2920
|
+
max: particle.moveCenter.radius,
|
|
2921
|
+
})) + particle.moveCenter.x;
|
|
2922
|
+
particle.position.y =
|
|
2923
|
+
Math.floor(randomInRangeValue({
|
|
2924
|
+
min: -particle.moveCenter.radius,
|
|
2925
|
+
max: particle.moveCenter.radius,
|
|
2926
|
+
})) + particle.moveCenter.y;
|
|
2927
|
+
const { dx, dy } = getDistances(particle.position, particle.moveCenter);
|
|
2928
|
+
if (particle.moveCenter.radius) {
|
|
2929
|
+
particle.direction = Math.atan2(dy, dx);
|
|
2930
|
+
particle.velocity.angle = particle.direction;
|
|
2931
|
+
}
|
|
2932
|
+
particle.justWarped = true;
|
|
2933
|
+
}
|
|
2874
2934
|
}
|
|
2875
2935
|
|
|
2876
2936
|
const checkOutMode = (outModes, outMode) => {
|
|
@@ -2918,7 +2978,7 @@
|
|
|
2918
2978
|
}
|
|
2919
2979
|
|
|
2920
2980
|
async function loadOutModesUpdater(engine) {
|
|
2921
|
-
engine.checkVersion("4.
|
|
2981
|
+
engine.checkVersion("4.5.1");
|
|
2922
2982
|
await engine.pluginManager.register(e => {
|
|
2923
2983
|
e.pluginManager.addParticleUpdater("outModes", container => {
|
|
2924
2984
|
return Promise.resolve(new OutOfCanvasUpdater(container));
|
|
@@ -2935,39 +2995,9 @@
|
|
|
2935
2995
|
this.#pluginManager = pluginManager;
|
|
2936
2996
|
}
|
|
2937
2997
|
init(particle) {
|
|
2938
|
-
const container = this.#container, options = particle.options, paint = itemFromSingleOrMultiple(options.paint, particle.id, options.reduceDuplicates)
|
|
2939
|
-
|
|
2940
|
-
|
|
2941
|
-
particle.fillEnabled = fill.enable;
|
|
2942
|
-
particle.fillOpacity = getRangeValue(fill.opacity);
|
|
2943
|
-
particle.fillAnimation = fillColor.animation;
|
|
2944
|
-
const fillHslColor = rangeColorToHsl(this.#pluginManager, fillColor);
|
|
2945
|
-
if (fillHslColor) {
|
|
2946
|
-
particle.fillColor = getHslAnimationFromHsl(fillHslColor, particle.fillAnimation, container.retina.reduceFactor);
|
|
2947
|
-
}
|
|
2948
|
-
}
|
|
2949
|
-
else {
|
|
2950
|
-
particle.fillEnabled = false;
|
|
2951
|
-
particle.fillAnimation = undefined;
|
|
2952
|
-
particle.fillColor = undefined;
|
|
2953
|
-
particle.fillOpacity = defaultOpacity;
|
|
2954
|
-
}
|
|
2955
|
-
if (stroke) {
|
|
2956
|
-
const strokeColor = AnimatableColor.create(paintColor === undefined ? undefined : AnimatableColor.create(undefined, paintColor), stroke.color);
|
|
2957
|
-
particle.strokeWidth = getRangeValue(stroke.width) * container.retina.pixelRatio;
|
|
2958
|
-
particle.strokeOpacity = getRangeValue(stroke.opacity ?? defaultOpacity);
|
|
2959
|
-
particle.strokeAnimation = strokeColor.animation;
|
|
2960
|
-
const strokeHslColor = rangeColorToHsl(this.#pluginManager, strokeColor) ?? particle.getFillColor();
|
|
2961
|
-
if (strokeHslColor) {
|
|
2962
|
-
particle.strokeColor = getHslAnimationFromHsl(strokeHslColor, particle.strokeAnimation, container.retina.reduceFactor);
|
|
2963
|
-
}
|
|
2964
|
-
}
|
|
2965
|
-
else {
|
|
2966
|
-
particle.strokeAnimation = undefined;
|
|
2967
|
-
particle.strokeColor = undefined;
|
|
2968
|
-
particle.strokeOpacity = defaultOpacity;
|
|
2969
|
-
particle.strokeWidth = 0;
|
|
2970
|
-
}
|
|
2998
|
+
const container = this.#container, options = particle.options, paint = itemFromSingleOrMultiple(options.paint, particle.id, options.reduceDuplicates);
|
|
2999
|
+
this.#initFill(paint, particle, container);
|
|
3000
|
+
this.#initStroke(paint, particle, container);
|
|
2971
3001
|
}
|
|
2972
3002
|
isEnabled(particle) {
|
|
2973
3003
|
const { fillAnimation, fillColor, strokeAnimation, strokeColor } = particle, fillEnabled = !!fillAnimation &&
|
|
@@ -2986,10 +3016,48 @@
|
|
|
2986
3016
|
updateColor(particle.fillColor, delta, this.#container.hdr);
|
|
2987
3017
|
updateColor(particle.strokeColor, delta, this.#container.hdr);
|
|
2988
3018
|
}
|
|
3019
|
+
#initFill(paint, particle, container) {
|
|
3020
|
+
const fill = paint?.fill, color = paint?.color, paintColor = color ?? undefined;
|
|
3021
|
+
if (!fill) {
|
|
3022
|
+
particle.fillEnabled = false;
|
|
3023
|
+
particle.fillAnimation = undefined;
|
|
3024
|
+
particle.fillColor = undefined;
|
|
3025
|
+
particle.fillOpacity = defaultOpacity;
|
|
3026
|
+
return;
|
|
3027
|
+
}
|
|
3028
|
+
const fillColor = AnimatableColor.create(paintColor === undefined ? undefined : AnimatableColor.create(undefined, paintColor), fill.color);
|
|
3029
|
+
particle.fillEnabled = fill.enable;
|
|
3030
|
+
particle.fillOpacity = getRangeValue(fill.opacity);
|
|
3031
|
+
particle.fillAnimation = fillColor.animation;
|
|
3032
|
+
const fillHslColor = rangeColorToHsl(this.#pluginManager, fillColor);
|
|
3033
|
+
if (!fillHslColor) {
|
|
3034
|
+
return;
|
|
3035
|
+
}
|
|
3036
|
+
particle.fillColor = getHslAnimationFromHsl(fillHslColor, particle.fillAnimation, container.retina.reduceFactor);
|
|
3037
|
+
}
|
|
3038
|
+
#initStroke(paint, particle, container) {
|
|
3039
|
+
const stroke = paint?.stroke, color = paint?.color, paintColor = color ?? undefined;
|
|
3040
|
+
if (!stroke) {
|
|
3041
|
+
particle.strokeAnimation = undefined;
|
|
3042
|
+
particle.strokeColor = undefined;
|
|
3043
|
+
particle.strokeOpacity = defaultOpacity;
|
|
3044
|
+
particle.strokeWidth = 0;
|
|
3045
|
+
return;
|
|
3046
|
+
}
|
|
3047
|
+
const strokeColor = AnimatableColor.create(paintColor === undefined ? undefined : AnimatableColor.create(undefined, paintColor), stroke.color);
|
|
3048
|
+
particle.strokeWidth = getRangeValue(stroke.width) * container.retina.pixelRatio;
|
|
3049
|
+
particle.strokeOpacity = getRangeValue(stroke.opacity ?? defaultOpacity);
|
|
3050
|
+
particle.strokeAnimation = strokeColor.animation;
|
|
3051
|
+
const strokeHslColor = rangeColorToHsl(this.#pluginManager, strokeColor) ?? particle.getFillColor();
|
|
3052
|
+
if (!strokeHslColor) {
|
|
3053
|
+
return;
|
|
3054
|
+
}
|
|
3055
|
+
particle.strokeColor = getHslAnimationFromHsl(strokeHslColor, particle.strokeAnimation, container.retina.reduceFactor);
|
|
3056
|
+
}
|
|
2989
3057
|
}
|
|
2990
3058
|
|
|
2991
3059
|
async function loadPaintUpdater(engine) {
|
|
2992
|
-
engine.checkVersion("4.
|
|
3060
|
+
engine.checkVersion("4.5.1");
|
|
2993
3061
|
await engine.pluginManager.register(e => {
|
|
2994
3062
|
e.pluginManager.addParticleUpdater("paint", container => {
|
|
2995
3063
|
return Promise.resolve(new PaintUpdater(e.pluginManager, container));
|
|
@@ -3031,7 +3099,7 @@
|
|
|
3031
3099
|
if (!this.accepts(input)) {
|
|
3032
3100
|
return;
|
|
3033
3101
|
}
|
|
3034
|
-
const result = rgbRegex.exec(input), radix = 10, minLength = 4
|
|
3102
|
+
const result = rgbRegex.exec(input), radix = 10, minLength = 4;
|
|
3035
3103
|
return result
|
|
3036
3104
|
? {
|
|
3037
3105
|
a: result.length > minLength ? parseAlpha(result[RgbIndexes.a]) : defaultAlpha,
|
|
@@ -3044,7 +3112,7 @@
|
|
|
3044
3112
|
}
|
|
3045
3113
|
|
|
3046
3114
|
async function loadRgbColorPlugin(engine) {
|
|
3047
|
-
engine.checkVersion("4.
|
|
3115
|
+
engine.checkVersion("4.5.1");
|
|
3048
3116
|
await engine.pluginManager.register(e => {
|
|
3049
3117
|
e.pluginManager.addColorManager("rgb", new RgbColorManager());
|
|
3050
3118
|
});
|
|
@@ -3129,7 +3197,7 @@
|
|
|
3129
3197
|
}
|
|
3130
3198
|
|
|
3131
3199
|
async function loadSizeUpdater(engine) {
|
|
3132
|
-
engine.checkVersion("4.
|
|
3200
|
+
engine.checkVersion("4.5.1");
|
|
3133
3201
|
await engine.pluginManager.register(e => {
|
|
3134
3202
|
e.pluginManager.addParticleUpdater("size", container => {
|
|
3135
3203
|
return Promise.resolve(new SizeUpdater(container));
|
|
@@ -3138,7 +3206,7 @@
|
|
|
3138
3206
|
}
|
|
3139
3207
|
|
|
3140
3208
|
async function loadBasic(engine) {
|
|
3141
|
-
engine.checkVersion("4.
|
|
3209
|
+
engine.checkVersion("4.5.1");
|
|
3142
3210
|
await engine.pluginManager.register(async (e) => {
|
|
3143
3211
|
await Promise.all([
|
|
3144
3212
|
loadBlendPlugin(e),
|
|
@@ -3315,21 +3383,28 @@
|
|
|
3315
3383
|
});
|
|
3316
3384
|
}
|
|
3317
3385
|
clear() {
|
|
3386
|
+
const visited = new Set();
|
|
3318
3387
|
for (const plugin of this.#canvasClearPlugins) {
|
|
3388
|
+
visited.add(plugin);
|
|
3319
3389
|
if (plugin.canvasClear?.() ?? false) {
|
|
3320
|
-
return;
|
|
3390
|
+
return plugin;
|
|
3321
3391
|
}
|
|
3322
3392
|
}
|
|
3323
3393
|
for (const layer of Object.values(DrawLayer)) {
|
|
3324
3394
|
if (typeof layer === "number") {
|
|
3325
3395
|
for (const plugin of this.#getLayerPlugins(layer)) {
|
|
3396
|
+
if (visited.has(plugin)) {
|
|
3397
|
+
continue;
|
|
3398
|
+
}
|
|
3399
|
+
visited.add(plugin);
|
|
3326
3400
|
if (plugin.canvasClear?.() ?? false) {
|
|
3327
|
-
return;
|
|
3401
|
+
return plugin;
|
|
3328
3402
|
}
|
|
3329
3403
|
}
|
|
3330
3404
|
}
|
|
3331
3405
|
}
|
|
3332
3406
|
this.canvasClear();
|
|
3407
|
+
return undefined;
|
|
3333
3408
|
}
|
|
3334
3409
|
destroy() {
|
|
3335
3410
|
this.stop();
|
|
@@ -3407,8 +3482,7 @@
|
|
|
3407
3482
|
});
|
|
3408
3483
|
}
|
|
3409
3484
|
drawParticles(delta) {
|
|
3410
|
-
const { particles, actualOptions } = this.#container;
|
|
3411
|
-
this.clear();
|
|
3485
|
+
const { particles, actualOptions } = this.#container, clearedPlugin = this.clear();
|
|
3412
3486
|
particles.update(delta);
|
|
3413
3487
|
this.draw(ctx => {
|
|
3414
3488
|
const width = this.#canvasManager.size.width, height = this.#canvasManager.size.height;
|
|
@@ -3430,7 +3504,9 @@
|
|
|
3430
3504
|
}
|
|
3431
3505
|
}
|
|
3432
3506
|
for (const plugin of this.#getLayerPlugins(DrawLayer.BackgroundMask)) {
|
|
3433
|
-
plugin
|
|
3507
|
+
if (plugin !== clearedPlugin) {
|
|
3508
|
+
plugin.canvasPaint?.();
|
|
3509
|
+
}
|
|
3434
3510
|
}
|
|
3435
3511
|
for (const plugin of this.#getLayerPlugins(DrawLayer.CanvasSetup)) {
|
|
3436
3512
|
plugin.drawSettingsSetup?.(ctx, delta);
|
|
@@ -3462,35 +3538,7 @@
|
|
|
3462
3538
|
this.#layers[layer] = [];
|
|
3463
3539
|
}
|
|
3464
3540
|
}
|
|
3465
|
-
|
|
3466
|
-
if (plugin.particleFillColor ?? plugin.particleStrokeColor) {
|
|
3467
|
-
this.#colorPlugins.push(plugin);
|
|
3468
|
-
}
|
|
3469
|
-
if (plugin.drawParticle) {
|
|
3470
|
-
this.#drawParticlePlugins.push(plugin);
|
|
3471
|
-
}
|
|
3472
|
-
if (plugin.drawParticleSetup) {
|
|
3473
|
-
this.#drawParticlesSetupPlugins.push(plugin);
|
|
3474
|
-
}
|
|
3475
|
-
if (plugin.drawParticleCleanup) {
|
|
3476
|
-
this.#drawParticlesCleanupPlugins.push(plugin);
|
|
3477
|
-
}
|
|
3478
|
-
if (plugin.canvasClear) {
|
|
3479
|
-
this.#canvasClearPlugins.push(plugin);
|
|
3480
|
-
}
|
|
3481
|
-
if (plugin.canvasPaint) {
|
|
3482
|
-
this.#getLayerPlugins(DrawLayer.BackgroundMask).push(plugin);
|
|
3483
|
-
}
|
|
3484
|
-
if (plugin.drawSettingsSetup) {
|
|
3485
|
-
this.#getLayerPlugins(DrawLayer.CanvasSetup).push(plugin);
|
|
3486
|
-
}
|
|
3487
|
-
if (plugin.draw) {
|
|
3488
|
-
this.#getLayerPlugins(DrawLayer.PluginContent).push(plugin);
|
|
3489
|
-
}
|
|
3490
|
-
if (plugin.clearDraw ?? plugin.drawSettingsCleanup) {
|
|
3491
|
-
this.#getLayerPlugins(DrawLayer.CanvasCleanup).push(plugin);
|
|
3492
|
-
}
|
|
3493
|
-
}
|
|
3541
|
+
this.#initPluginsArray();
|
|
3494
3542
|
}
|
|
3495
3543
|
initUpdaters() {
|
|
3496
3544
|
this.#preDrawUpdaters = [];
|
|
@@ -3699,6 +3747,45 @@
|
|
|
3699
3747
|
this.#reusablePluginColors[sColorIndex] = sColor;
|
|
3700
3748
|
return this.#reusablePluginColors;
|
|
3701
3749
|
}
|
|
3750
|
+
#initLayerPlugin(plugin) {
|
|
3751
|
+
const layerMap = [
|
|
3752
|
+
[DrawLayer.BackgroundMask, !!plugin.canvasPaint],
|
|
3753
|
+
[DrawLayer.CanvasSetup, !!plugin.drawSettingsSetup],
|
|
3754
|
+
[DrawLayer.PluginContent, !!plugin.draw],
|
|
3755
|
+
[DrawLayer.CanvasCleanup, !!(plugin.clearDraw ?? plugin.drawSettingsCleanup)],
|
|
3756
|
+
];
|
|
3757
|
+
for (const [layer, active] of layerMap) {
|
|
3758
|
+
if (active) {
|
|
3759
|
+
this.#layers[layer].push(plugin);
|
|
3760
|
+
}
|
|
3761
|
+
}
|
|
3762
|
+
}
|
|
3763
|
+
#initPluginsArray() {
|
|
3764
|
+
for (const plugin of this.#container.plugins) {
|
|
3765
|
+
if (plugin.particleFillColor ?? plugin.particleStrokeColor) {
|
|
3766
|
+
this.#colorPlugins.push(plugin);
|
|
3767
|
+
}
|
|
3768
|
+
if (plugin.drawParticle) {
|
|
3769
|
+
this.#drawParticlePlugins.push(plugin);
|
|
3770
|
+
}
|
|
3771
|
+
if (plugin.drawParticleSetup) {
|
|
3772
|
+
this.#drawParticlesSetupPlugins.push(plugin);
|
|
3773
|
+
}
|
|
3774
|
+
if (plugin.drawParticleCleanup) {
|
|
3775
|
+
this.#drawParticlesCleanupPlugins.push(plugin);
|
|
3776
|
+
}
|
|
3777
|
+
if (plugin.canvasClear) {
|
|
3778
|
+
this.#canvasClearPlugins.push(plugin);
|
|
3779
|
+
}
|
|
3780
|
+
this.#initLayerPlugin(plugin);
|
|
3781
|
+
}
|
|
3782
|
+
}
|
|
3783
|
+
#isSupportedElement(element) {
|
|
3784
|
+
return ((typeof HTMLCanvasElement !== "undefined" && element instanceof HTMLCanvasElement) ||
|
|
3785
|
+
(typeof OffscreenCanvas !== "undefined" && element instanceof OffscreenCanvas) ||
|
|
3786
|
+
(typeof HTMLVideoElement !== "undefined" && element instanceof HTMLVideoElement) ||
|
|
3787
|
+
(typeof HTMLImageElement !== "undefined" && element instanceof HTMLImageElement));
|
|
3788
|
+
}
|
|
3702
3789
|
#resolveBackgroundElement() {
|
|
3703
3790
|
const background = this.#container.actualOptions.background;
|
|
3704
3791
|
this.#backgroundElement = null;
|
|
@@ -3708,9 +3795,7 @@
|
|
|
3708
3795
|
if (typeof background.element === "string") {
|
|
3709
3796
|
if (typeof document !== "undefined") {
|
|
3710
3797
|
const node = document.querySelector(background.element);
|
|
3711
|
-
if (
|
|
3712
|
-
(typeof HTMLVideoElement !== "undefined" && node instanceof HTMLVideoElement) ||
|
|
3713
|
-
(typeof HTMLImageElement !== "undefined" && node instanceof HTMLImageElement)) {
|
|
3798
|
+
if (node && this.#isSupportedElement(node)) {
|
|
3714
3799
|
this.#backgroundElement = node;
|
|
3715
3800
|
}
|
|
3716
3801
|
else if (node) {
|
|
@@ -3721,10 +3806,7 @@
|
|
|
3721
3806
|
}
|
|
3722
3807
|
}
|
|
3723
3808
|
}
|
|
3724
|
-
else if ((
|
|
3725
|
-
(typeof OffscreenCanvas !== "undefined" && background.element instanceof OffscreenCanvas) ||
|
|
3726
|
-
(typeof HTMLVideoElement !== "undefined" && background.element instanceof HTMLVideoElement) ||
|
|
3727
|
-
(typeof HTMLImageElement !== "undefined" && background.element instanceof HTMLImageElement)) {
|
|
3809
|
+
else if (this.#isSupportedElement(background.element)) {
|
|
3728
3810
|
this.#backgroundElement = background.element;
|
|
3729
3811
|
}
|
|
3730
3812
|
}
|
|
@@ -3742,7 +3824,7 @@
|
|
|
3742
3824
|
return transferredCanvas;
|
|
3743
3825
|
}
|
|
3744
3826
|
if (typeof canvas.transferControlToOffscreen !== "function") {
|
|
3745
|
-
throw new TypeError(
|
|
3827
|
+
throw new TypeError(getErrorMessage(ErrorCodes$1.offscreenCanvasUnsupported));
|
|
3746
3828
|
}
|
|
3747
3829
|
try {
|
|
3748
3830
|
const offscreenCanvas = canvas.transferControlToOffscreen();
|
|
@@ -3750,10 +3832,16 @@
|
|
|
3750
3832
|
return offscreenCanvas;
|
|
3751
3833
|
}
|
|
3752
3834
|
catch {
|
|
3753
|
-
throw new TypeError(
|
|
3835
|
+
throw new TypeError(getErrorMessage(ErrorCodes$1.offscreenCanvasTransferFailed));
|
|
3754
3836
|
}
|
|
3755
3837
|
}, isHtmlCanvasElement = (canvas) => {
|
|
3756
3838
|
return typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement;
|
|
3839
|
+
}, getEffectiveColorSpace = (context) => {
|
|
3840
|
+
if (!context) {
|
|
3841
|
+
return undefined;
|
|
3842
|
+
}
|
|
3843
|
+
const colorInfo = context;
|
|
3844
|
+
return colorInfo.getContextAttributes?.().colorSpace ?? undefined;
|
|
3757
3845
|
};
|
|
3758
3846
|
function setStyle(canvas, style, important = false) {
|
|
3759
3847
|
if (!style) {
|
|
@@ -3878,7 +3966,7 @@
|
|
|
3878
3966
|
const elementStyle = element.style, color = rangeColorToRgb(this.#pluginManager, background.color);
|
|
3879
3967
|
if (color) {
|
|
3880
3968
|
const hdrOptions = container.actualOptions.hdr;
|
|
3881
|
-
elementStyle.backgroundColor = getStyleFromRgb(color, container.hdr, background.opacity, hdrOptions.peakNits, hdrOptions.mode);
|
|
3969
|
+
elementStyle.backgroundColor = getStyleFromRgb(color, container.hdr, background.opacity, hdrOptions.peakNits, toEnumValue(HdrMode, hdrOptions.mode, HdrMode.standard));
|
|
3882
3970
|
}
|
|
3883
3971
|
else {
|
|
3884
3972
|
elementStyle.backgroundColor = "";
|
|
@@ -3998,11 +4086,11 @@
|
|
|
3998
4086
|
const container = this.#container, canSupportHdr = container.actualOptions.hdr.enable &&
|
|
3999
4087
|
safeMatchMedia("(color-gamut: p3)")?.matches &&
|
|
4000
4088
|
safeMatchMedia("(dynamic-range: high)")?.matches;
|
|
4001
|
-
container.
|
|
4002
|
-
container.hdrMode = container.actualOptions.hdr.mode;
|
|
4089
|
+
container.hdrMode = toEnumValue(HdrMode, container.actualOptions.hdr.mode, HdrMode.standard);
|
|
4003
4090
|
container.peakNits = container.actualOptions.hdr.peakNits;
|
|
4004
4091
|
const renderCanvas = this.renderCanvas;
|
|
4005
4092
|
if (!renderCanvas) {
|
|
4093
|
+
container.hdr = canSupportHdr ?? false;
|
|
4006
4094
|
return;
|
|
4007
4095
|
}
|
|
4008
4096
|
this.render.setContextSettings({
|
|
@@ -4021,7 +4109,6 @@
|
|
|
4021
4109
|
context = null;
|
|
4022
4110
|
}
|
|
4023
4111
|
if (canSupportHdr && !context) {
|
|
4024
|
-
container.hdr = false;
|
|
4025
4112
|
const sdrSettings = {
|
|
4026
4113
|
alpha: true,
|
|
4027
4114
|
desynchronized: true,
|
|
@@ -4037,11 +4124,16 @@
|
|
|
4037
4124
|
}
|
|
4038
4125
|
}
|
|
4039
4126
|
this.render.setContext(context);
|
|
4127
|
+
if (context) {
|
|
4128
|
+
const effectiveColorSpace = getEffectiveColorSpace(context);
|
|
4129
|
+
if (effectiveColorSpace !== undefined) {
|
|
4130
|
+
container.hdr = effectiveColorSpace === "display-p3";
|
|
4131
|
+
}
|
|
4132
|
+
}
|
|
4040
4133
|
}
|
|
4041
4134
|
#initHdrListeners() {
|
|
4042
4135
|
this.#removeHdrListeners();
|
|
4043
4136
|
const p3Query = safeMatchMedia("(color-gamut: p3)"), hdrQuery = safeMatchMedia("(dynamic-range: high)"), handleChange = () => {
|
|
4044
|
-
this.#recreateRenderCanvas();
|
|
4045
4137
|
this.#initContext();
|
|
4046
4138
|
this.initBackground();
|
|
4047
4139
|
}, listeners = [];
|
|
@@ -4077,16 +4169,6 @@
|
|
|
4077
4169
|
element.style.setProperty(key, value, "important");
|
|
4078
4170
|
}
|
|
4079
4171
|
}
|
|
4080
|
-
#recreateRenderCanvas() {
|
|
4081
|
-
const renderCanvas = this.renderCanvas;
|
|
4082
|
-
if (!renderCanvas) {
|
|
4083
|
-
return;
|
|
4084
|
-
}
|
|
4085
|
-
if (this.domElement) {
|
|
4086
|
-
return;
|
|
4087
|
-
}
|
|
4088
|
-
this.renderCanvas = new OffscreenCanvas(renderCanvas.width, renderCanvas.height);
|
|
4089
|
-
}
|
|
4090
4172
|
#removeHdrListeners() {
|
|
4091
4173
|
if (!this.#hdrMediaListeners) {
|
|
4092
4174
|
return;
|
|
@@ -4158,6 +4240,10 @@
|
|
|
4158
4240
|
this.#manageListeners(true);
|
|
4159
4241
|
}
|
|
4160
4242
|
removeListeners() {
|
|
4243
|
+
if (this.#resizeTimeout !== undefined) {
|
|
4244
|
+
clearTimeout(this.#resizeTimeout);
|
|
4245
|
+
this.#resizeTimeout = undefined;
|
|
4246
|
+
}
|
|
4161
4247
|
this.#manageListeners(false);
|
|
4162
4248
|
}
|
|
4163
4249
|
#handleVisibilityChange() {
|
|
@@ -4185,8 +4271,7 @@
|
|
|
4185
4271
|
this.#resizeTimeout = undefined;
|
|
4186
4272
|
}
|
|
4187
4273
|
const handleResize = async () => {
|
|
4188
|
-
|
|
4189
|
-
await canvas.windowResize();
|
|
4274
|
+
await this.#container.canvas.windowResize();
|
|
4190
4275
|
};
|
|
4191
4276
|
this.#resizeTimeout = setTimeout(() => void handleResize(), this.#container.actualOptions.resize.delay * millisecondsToSeconds);
|
|
4192
4277
|
}
|
|
@@ -4214,8 +4299,8 @@
|
|
|
4214
4299
|
}
|
|
4215
4300
|
else if (!this.#resizeObserver && add && canvasEl) {
|
|
4216
4301
|
this.#resizeObserver = new ResizeObserver((entries) => {
|
|
4217
|
-
const
|
|
4218
|
-
if (!
|
|
4302
|
+
const res = entries.some(e => e.target === canvasEl);
|
|
4303
|
+
if (!res) {
|
|
4219
4304
|
return;
|
|
4220
4305
|
}
|
|
4221
4306
|
this.#handleWindowResize();
|
|
@@ -4479,10 +4564,10 @@
|
|
|
4479
4564
|
return this.#modifiers.find(m => m.id === id);
|
|
4480
4565
|
}
|
|
4481
4566
|
getOpacity() {
|
|
4482
|
-
const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, baseOpacity = getRangeValue(this.opacity?.value ?? defaultOpacity$1), modifierOpacity = this.#applyModifiers(undefined, m => m.opacity), opacity = modifierOpacity ?? baseOpacity
|
|
4483
|
-
this.#cachedOpacityData.fillOpacity = fillOpacity;
|
|
4567
|
+
const zIndexOptions = this.options.zIndex, zIndexFactor = zIndexFactorOffset - this.zIndexFactor, zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, baseOpacity = getRangeValue(this.opacity?.value ?? defaultOpacity$1), modifierOpacity = this.#applyModifiers(undefined, m => m.opacity), opacity = modifierOpacity ?? baseOpacity;
|
|
4568
|
+
this.#cachedOpacityData.fillOpacity = this.fillOpacity ?? defaultOpacity$1;
|
|
4484
4569
|
this.#cachedOpacityData.opacity = opacity * zOpacityFactor;
|
|
4485
|
-
this.#cachedOpacityData.strokeOpacity = strokeOpacity;
|
|
4570
|
+
this.#cachedOpacityData.strokeOpacity = this.strokeOpacity ?? defaultOpacity$1;
|
|
4486
4571
|
return this.#cachedOpacityData;
|
|
4487
4572
|
}
|
|
4488
4573
|
getPosition() {
|
|
@@ -4729,7 +4814,7 @@
|
|
|
4729
4814
|
#initPosition(position) {
|
|
4730
4815
|
const container = this.#container, zIndexValue = Math.floor(getRangeValue(this.options.zIndex.value)), initialPosition = this.#calcPosition(position, clamp(zIndexValue, minZ, container.zLayers));
|
|
4731
4816
|
if (!initialPosition) {
|
|
4732
|
-
throw new Error(
|
|
4817
|
+
throw new Error(getErrorMessage(ErrorCodes$1.particlePositionNotFound));
|
|
4733
4818
|
}
|
|
4734
4819
|
this.position = initialPosition;
|
|
4735
4820
|
this.initialPosition = this.position.copy();
|
|
@@ -4778,6 +4863,12 @@
|
|
|
4778
4863
|
this.#circlePoolIdx = 0;
|
|
4779
4864
|
this.#rectanglePoolIdx = 0;
|
|
4780
4865
|
}
|
|
4866
|
+
get cellSize() {
|
|
4867
|
+
return this.#cellSize;
|
|
4868
|
+
}
|
|
4869
|
+
set cellSize(value) {
|
|
4870
|
+
this.#pendingCellSize = value;
|
|
4871
|
+
}
|
|
4781
4872
|
clear() {
|
|
4782
4873
|
this.#cells.clear();
|
|
4783
4874
|
const pendingCellSize = this.#pendingCellSize;
|
|
@@ -4801,40 +4892,46 @@
|
|
|
4801
4892
|
const minCellX = Math.floor(bounds.minX / this.#cellSize), maxCellX = Math.floor(bounds.maxX / this.#cellSize), minCellY = Math.floor(bounds.minY / this.#cellSize), maxCellY = Math.floor(bounds.maxY / this.#cellSize);
|
|
4802
4893
|
for (let cx = minCellX; cx <= maxCellX; cx++) {
|
|
4803
4894
|
for (let cy = minCellY; cy <= maxCellY; cy++) {
|
|
4804
|
-
|
|
4805
|
-
if (!cellParticles) {
|
|
4806
|
-
continue;
|
|
4807
|
-
}
|
|
4808
|
-
for (const p of cellParticles) {
|
|
4809
|
-
if (check && !check(p)) {
|
|
4810
|
-
continue;
|
|
4811
|
-
}
|
|
4812
|
-
if (range.contains(p.getPosition())) {
|
|
4813
|
-
out.push(p);
|
|
4814
|
-
}
|
|
4815
|
-
}
|
|
4895
|
+
this.#queryCell(cx, cy, range, check, out);
|
|
4816
4896
|
}
|
|
4817
4897
|
}
|
|
4818
4898
|
return out;
|
|
4819
4899
|
}
|
|
4820
4900
|
queryCircle(position, radius, check, out = []) {
|
|
4821
|
-
const circle = this.#acquireCircle(position.x, position.y, radius)
|
|
4822
|
-
|
|
4823
|
-
|
|
4901
|
+
const circle = this.#acquireCircle(position.x, position.y, radius);
|
|
4902
|
+
try {
|
|
4903
|
+
return this.query(circle, check, out);
|
|
4904
|
+
}
|
|
4905
|
+
finally {
|
|
4906
|
+
this.#circlePoolIdx--;
|
|
4907
|
+
}
|
|
4824
4908
|
}
|
|
4825
4909
|
queryRectangle(position, size, check, out = []) {
|
|
4826
|
-
const rect = this.#acquireRectangle(position.x, position.y, size.width, size.height)
|
|
4827
|
-
|
|
4828
|
-
|
|
4829
|
-
|
|
4830
|
-
|
|
4831
|
-
|
|
4910
|
+
const rect = this.#acquireRectangle(position.x, position.y, size.width, size.height);
|
|
4911
|
+
try {
|
|
4912
|
+
return this.query(rect, check, out);
|
|
4913
|
+
}
|
|
4914
|
+
finally {
|
|
4915
|
+
this.#rectanglePoolIdx--;
|
|
4916
|
+
}
|
|
4832
4917
|
}
|
|
4833
4918
|
#acquireCircle(x, y, r) {
|
|
4834
|
-
|
|
4919
|
+
const idx = this.#circlePoolIdx++;
|
|
4920
|
+
let circle = this.#circlePool[idx];
|
|
4921
|
+
if (!circle) {
|
|
4922
|
+
circle = new Circle(x, y, r);
|
|
4923
|
+
this.#circlePool[idx] = circle;
|
|
4924
|
+
}
|
|
4925
|
+
return circle.reset(x, y, r);
|
|
4835
4926
|
}
|
|
4836
4927
|
#acquireRectangle(x, y, w, h) {
|
|
4837
|
-
|
|
4928
|
+
const idx = this.#rectanglePoolIdx++;
|
|
4929
|
+
let rectangle = this.#rectanglePool[idx];
|
|
4930
|
+
if (!rectangle) {
|
|
4931
|
+
rectangle = new Rectangle(x, y, w, h);
|
|
4932
|
+
this.#rectanglePool[idx] = rectangle;
|
|
4933
|
+
}
|
|
4934
|
+
return rectangle.reset(x, y, w, h);
|
|
4838
4935
|
}
|
|
4839
4936
|
#cellKeyFromCoords(x, y) {
|
|
4840
4937
|
const cellX = Math.floor(x / this.#cellSize), cellY = Math.floor(y / this.#cellSize);
|
|
@@ -4861,17 +4958,27 @@
|
|
|
4861
4958
|
}
|
|
4862
4959
|
return null;
|
|
4863
4960
|
}
|
|
4864
|
-
#
|
|
4865
|
-
|
|
4866
|
-
|
|
4961
|
+
#queryCell(cx, cy, range, check, out) {
|
|
4962
|
+
const cellParticles = this.#cells.get(`${cx}_${cy}`);
|
|
4963
|
+
if (!cellParticles) {
|
|
4964
|
+
return;
|
|
4965
|
+
}
|
|
4966
|
+
for (const p of cellParticles) {
|
|
4967
|
+
if (check && !check(p)) {
|
|
4968
|
+
continue;
|
|
4969
|
+
}
|
|
4970
|
+
if (range.contains(p.getPosition())) {
|
|
4971
|
+
out.push(p);
|
|
4972
|
+
}
|
|
4973
|
+
}
|
|
4867
4974
|
}
|
|
4868
4975
|
}
|
|
4869
4976
|
|
|
4870
4977
|
class ParticlesManager {
|
|
4871
4978
|
checkParticlePositionPlugins;
|
|
4872
|
-
grid;
|
|
4873
4979
|
#array;
|
|
4874
4980
|
#container;
|
|
4981
|
+
#grid;
|
|
4875
4982
|
#groupLimits;
|
|
4876
4983
|
#limit;
|
|
4877
4984
|
#nextId;
|
|
@@ -4895,7 +5002,7 @@
|
|
|
4895
5002
|
this.#groupLimits = new Map();
|
|
4896
5003
|
this.#particleBuckets = new Map();
|
|
4897
5004
|
this.#zBuckets = this.#createBuckets(this.#container.zLayers);
|
|
4898
|
-
this
|
|
5005
|
+
this.#grid = new SpatialHashGrid(spatialHashGridCellSize);
|
|
4899
5006
|
this.checkParticlePositionPlugins = [];
|
|
4900
5007
|
this.#particleResetPlugins = [];
|
|
4901
5008
|
this.#particleUpdatePlugins = [];
|
|
@@ -4906,23 +5013,12 @@
|
|
|
4906
5013
|
get count() {
|
|
4907
5014
|
return this.#array.length;
|
|
4908
5015
|
}
|
|
5016
|
+
get grid() {
|
|
5017
|
+
return this.#grid;
|
|
5018
|
+
}
|
|
4909
5019
|
addParticle(position, overrideOptions, group, initializer) {
|
|
4910
|
-
|
|
4911
|
-
|
|
4912
|
-
switch (limitMode) {
|
|
4913
|
-
case LimitMode.delete: {
|
|
4914
|
-
const countToRemove = currentCount + countOffset - limit;
|
|
4915
|
-
if (countToRemove > minCount) {
|
|
4916
|
-
this.removeQuantity(countToRemove);
|
|
4917
|
-
}
|
|
4918
|
-
break;
|
|
4919
|
-
}
|
|
4920
|
-
case LimitMode.wait:
|
|
4921
|
-
if (currentCount >= limit) {
|
|
4922
|
-
return;
|
|
4923
|
-
}
|
|
4924
|
-
break;
|
|
4925
|
-
}
|
|
5020
|
+
if (this.#checkAndApplyLimits(group, this.count)) {
|
|
5021
|
+
return;
|
|
4926
5022
|
}
|
|
4927
5023
|
try {
|
|
4928
5024
|
const particle = this.#pool.pop() ?? new Particle(this.#pluginManager, this.#container);
|
|
@@ -4986,7 +5082,7 @@
|
|
|
4986
5082
|
return this.#array[index];
|
|
4987
5083
|
}
|
|
4988
5084
|
async init() {
|
|
4989
|
-
const container = this.#container
|
|
5085
|
+
const container = this.#container;
|
|
4990
5086
|
this.checkParticlePositionPlugins = [];
|
|
4991
5087
|
this.#updatePlugins = [];
|
|
4992
5088
|
this.#particleUpdatePlugins = [];
|
|
@@ -4995,59 +5091,16 @@
|
|
|
4995
5091
|
this.#postParticleUpdatePlugins = [];
|
|
4996
5092
|
this.#particleBuckets.clear();
|
|
4997
5093
|
this.#resetBuckets(container.zLayers);
|
|
4998
|
-
this
|
|
4999
|
-
|
|
5000
|
-
|
|
5001
|
-
|
|
5002
|
-
|
|
5003
|
-
if (
|
|
5004
|
-
this
|
|
5005
|
-
}
|
|
5006
|
-
if (plugin.update) {
|
|
5007
|
-
this.#updatePlugins.push(plugin);
|
|
5008
|
-
}
|
|
5009
|
-
if (plugin.particleUpdate) {
|
|
5010
|
-
this.#particleUpdatePlugins.push(plugin);
|
|
5011
|
-
}
|
|
5012
|
-
if (plugin.postUpdate) {
|
|
5013
|
-
this.#postUpdatePlugins.push(plugin);
|
|
5014
|
-
}
|
|
5015
|
-
if (plugin.particleReset) {
|
|
5016
|
-
this.#particleResetPlugins.push(plugin);
|
|
5017
|
-
}
|
|
5018
|
-
if (plugin.postParticleUpdate) {
|
|
5019
|
-
this.#postParticleUpdatePlugins.push(plugin);
|
|
5020
|
-
}
|
|
5021
|
-
}
|
|
5022
|
-
await this.#container.initDrawersAndUpdaters();
|
|
5023
|
-
for (const drawer of this.#container.effectDrawers.values()) {
|
|
5024
|
-
await drawer.init?.(container);
|
|
5025
|
-
}
|
|
5026
|
-
for (const drawer of this.#container.shapeDrawers.values()) {
|
|
5027
|
-
await drawer.init?.(container);
|
|
5028
|
-
}
|
|
5029
|
-
let handled = false;
|
|
5030
|
-
for (const plugin of container.plugins) {
|
|
5031
|
-
handled = plugin.particlesInitialization?.() ?? handled;
|
|
5032
|
-
if (handled) {
|
|
5033
|
-
break;
|
|
5034
|
-
}
|
|
5035
|
-
}
|
|
5036
|
-
if (!handled) {
|
|
5037
|
-
const particlesOptions = options.particles, groups = particlesOptions.groups;
|
|
5038
|
-
for (const group in groups) {
|
|
5039
|
-
const groupOptions = groups[group];
|
|
5040
|
-
if (!groupOptions) {
|
|
5041
|
-
continue;
|
|
5042
|
-
}
|
|
5043
|
-
for (let i = this.count, j = 0; j < groupOptions.number.value && i < particlesOptions.number.value; i++, j++) {
|
|
5044
|
-
this.addParticle(undefined, groupOptions, group);
|
|
5045
|
-
}
|
|
5046
|
-
}
|
|
5047
|
-
for (let i = this.count; i < particlesOptions.number.value; i++) {
|
|
5048
|
-
this.addParticle();
|
|
5094
|
+
this.#grid = new SpatialHashGrid(spatialHashGridCellSize * container.retina.pixelRatio);
|
|
5095
|
+
this.#applyLimits(container.actualOptions.particles);
|
|
5096
|
+
const particlesOptions = container.actualOptions.particles, groups = particlesOptions.groups;
|
|
5097
|
+
for (const group in groups) {
|
|
5098
|
+
const groupData = groups[group];
|
|
5099
|
+
if (groupData) {
|
|
5100
|
+
this.#applyLimits(loadParticlesOptions(this.#pluginManager, this.#container, groupData), group, groupData);
|
|
5049
5101
|
}
|
|
5050
5102
|
}
|
|
5103
|
+
await this.#initPlugins();
|
|
5051
5104
|
}
|
|
5052
5105
|
push(nb, position, overrideOptions, group) {
|
|
5053
5106
|
for (let i = 0; i < nb; i++) {
|
|
@@ -5062,13 +5115,13 @@
|
|
|
5062
5115
|
remove(particle, group, override) {
|
|
5063
5116
|
this.removeAt(this.#array.indexOf(particle), undefined, group, override);
|
|
5064
5117
|
}
|
|
5065
|
-
removeAt(index, quantity = defaultRemoveQuantity, group, override) {
|
|
5118
|
+
removeAt(index, quantity = defaultRemoveQuantity, group, override, matchGroup = true) {
|
|
5066
5119
|
if (index < minIndex || index > this.count) {
|
|
5067
5120
|
return;
|
|
5068
5121
|
}
|
|
5069
5122
|
let deleted = 0;
|
|
5070
5123
|
for (let i = index; deleted < quantity && i < this.count; i++) {
|
|
5071
|
-
if (this.#removeParticle(i, group, override)) {
|
|
5124
|
+
if (this.#removeParticle(i, group, override, matchGroup)) {
|
|
5072
5125
|
i--;
|
|
5073
5126
|
deleted++;
|
|
5074
5127
|
}
|
|
@@ -5099,7 +5152,7 @@
|
|
|
5099
5152
|
this.#resizeFactor = factor;
|
|
5100
5153
|
}
|
|
5101
5154
|
update(delta) {
|
|
5102
|
-
this
|
|
5155
|
+
this.#grid.clear();
|
|
5103
5156
|
for (const plugin of this.#updatePlugins) {
|
|
5104
5157
|
plugin.update?.(delta);
|
|
5105
5158
|
}
|
|
@@ -5110,7 +5163,7 @@
|
|
|
5110
5163
|
this.#updateParticlesPhase2(delta, particlesToDelete);
|
|
5111
5164
|
if (particlesToDelete.size) {
|
|
5112
5165
|
for (const particle of particlesToDelete) {
|
|
5113
|
-
this.remove(particle);
|
|
5166
|
+
this.remove(particle, particle.group);
|
|
5114
5167
|
}
|
|
5115
5168
|
}
|
|
5116
5169
|
this.#resizeFactor = undefined;
|
|
@@ -5121,12 +5174,7 @@
|
|
|
5121
5174
|
#applyDensity(options, pluginsCount, group, groupOptions) {
|
|
5122
5175
|
const numberOptions = options.number;
|
|
5123
5176
|
if (!numberOptions.density.enable) {
|
|
5124
|
-
|
|
5125
|
-
this.#limit = numberOptions.limit.value;
|
|
5126
|
-
}
|
|
5127
|
-
else if (groupOptions?.number.limit.value ?? numberOptions.limit.value) {
|
|
5128
|
-
this.#groupLimits.set(group, groupOptions?.number.limit.value ?? numberOptions.limit.value);
|
|
5129
|
-
}
|
|
5177
|
+
this.#applyLimits(options, group, groupOptions);
|
|
5130
5178
|
return;
|
|
5131
5179
|
}
|
|
5132
5180
|
const densityFactor = this.#initDensityFactor(numberOptions.density), optParticlesNumber = numberOptions.value, optParticlesLimit = numberOptions.limit.value > minLimit ? numberOptions.limit.value : optParticlesNumber, particlesNumber = Math.min(optParticlesNumber, optParticlesLimit) * densityFactor + pluginsCount, particlesCount = Math.min(this.count, this.filter(t => t.group === group).length);
|
|
@@ -5134,7 +5182,10 @@
|
|
|
5134
5182
|
this.#limit = numberOptions.limit.value * densityFactor;
|
|
5135
5183
|
}
|
|
5136
5184
|
else {
|
|
5137
|
-
this.#groupLimits.set(group,
|
|
5185
|
+
this.#groupLimits.set(group, {
|
|
5186
|
+
limit: numberOptions.limit.value * densityFactor,
|
|
5187
|
+
mode: toEnumValue(LimitMode, numberOptions.limit.mode, LimitMode.delete),
|
|
5188
|
+
});
|
|
5138
5189
|
}
|
|
5139
5190
|
if (particlesCount < particlesNumber) {
|
|
5140
5191
|
this.push(Math.abs(particlesNumber - particlesCount), undefined, options, group);
|
|
@@ -5143,6 +5194,55 @@
|
|
|
5143
5194
|
this.removeQuantity(particlesCount - particlesNumber, group);
|
|
5144
5195
|
}
|
|
5145
5196
|
}
|
|
5197
|
+
#applyLimits(options, group, groupOptions) {
|
|
5198
|
+
if (group === undefined) {
|
|
5199
|
+
this.#limit = options.number.limit.value;
|
|
5200
|
+
const groups = this.#container.actualOptions.particles.groups;
|
|
5201
|
+
for (const existingGroup of this.#groupLimits.keys()) {
|
|
5202
|
+
if (!(existingGroup in groups)) {
|
|
5203
|
+
this.#groupLimits.delete(existingGroup);
|
|
5204
|
+
}
|
|
5205
|
+
}
|
|
5206
|
+
}
|
|
5207
|
+
else {
|
|
5208
|
+
const limitValue = groupOptions?.number?.limit?.value ?? options.number.limit.value;
|
|
5209
|
+
if (limitValue > minLimit) {
|
|
5210
|
+
this.#groupLimits.set(group, {
|
|
5211
|
+
limit: limitValue,
|
|
5212
|
+
mode: toEnumValue(LimitMode, groupOptions?.number?.limit?.mode ?? options.number.limit.mode, LimitMode.delete),
|
|
5213
|
+
});
|
|
5214
|
+
}
|
|
5215
|
+
else {
|
|
5216
|
+
this.#groupLimits.delete(group);
|
|
5217
|
+
}
|
|
5218
|
+
}
|
|
5219
|
+
}
|
|
5220
|
+
#checkAndApplyLimits(group, currentCount) {
|
|
5221
|
+
const globalLimit = this.#limit, globalMode = this.#container.actualOptions.particles.number.limit.mode;
|
|
5222
|
+
if (globalLimit > minLimit && globalMode === LimitMode.wait && currentCount >= globalLimit) {
|
|
5223
|
+
return true;
|
|
5224
|
+
}
|
|
5225
|
+
const groupLimitEntry = group === undefined ? undefined : this.#groupLimits.get(group);
|
|
5226
|
+
if (groupLimitEntry && groupLimitEntry.limit > minLimit && groupLimitEntry.mode === LimitMode.wait) {
|
|
5227
|
+
const groupCount = this.filter(t => t.group === group).length;
|
|
5228
|
+
if (groupCount >= groupLimitEntry.limit) {
|
|
5229
|
+
return true;
|
|
5230
|
+
}
|
|
5231
|
+
}
|
|
5232
|
+
if (groupLimitEntry && groupLimitEntry.limit > minLimit && groupLimitEntry.mode === LimitMode.delete) {
|
|
5233
|
+
const groupCountToRemove = this.filter(t => t.group === group).length + countOffset - groupLimitEntry.limit;
|
|
5234
|
+
if (groupCountToRemove > minCount) {
|
|
5235
|
+
this.removeQuantity(groupCountToRemove, group);
|
|
5236
|
+
}
|
|
5237
|
+
}
|
|
5238
|
+
if (globalLimit > minLimit && globalMode === LimitMode.delete) {
|
|
5239
|
+
const globalCountToRemove = this.count + countOffset - globalLimit;
|
|
5240
|
+
if (globalCountToRemove > minCount) {
|
|
5241
|
+
this.#removeAny(globalCountToRemove);
|
|
5242
|
+
}
|
|
5243
|
+
}
|
|
5244
|
+
return false;
|
|
5245
|
+
}
|
|
5146
5246
|
#createBuckets(zLayers) {
|
|
5147
5247
|
const bucketCount = Math.max(Math.floor(zLayers), one);
|
|
5148
5248
|
return Array.from({ length: bucketCount }, () => []);
|
|
@@ -5165,6 +5265,70 @@
|
|
|
5165
5265
|
}
|
|
5166
5266
|
return ((canvasSize.width * canvasSize.height) / (densityOptions.height * densityOptions.width * pxRatio ** squareExp));
|
|
5167
5267
|
}
|
|
5268
|
+
async #initDrawersAndUpdaters() {
|
|
5269
|
+
const container = this.#container;
|
|
5270
|
+
await container.initDrawersAndUpdaters();
|
|
5271
|
+
for (const drawer of container.effectDrawers.values()) {
|
|
5272
|
+
await drawer.init?.(container);
|
|
5273
|
+
}
|
|
5274
|
+
for (const drawer of container.shapeDrawers.values()) {
|
|
5275
|
+
await drawer.init?.(container);
|
|
5276
|
+
}
|
|
5277
|
+
}
|
|
5278
|
+
async #initPlugins() {
|
|
5279
|
+
await this.#initPluginsArrays();
|
|
5280
|
+
await this.#initDrawersAndUpdaters();
|
|
5281
|
+
let handled = false;
|
|
5282
|
+
const container = this.#container;
|
|
5283
|
+
for (const plugin of container.plugins) {
|
|
5284
|
+
handled = plugin.particlesInitialization?.() ?? handled;
|
|
5285
|
+
if (handled) {
|
|
5286
|
+
break;
|
|
5287
|
+
}
|
|
5288
|
+
}
|
|
5289
|
+
if (handled) {
|
|
5290
|
+
return;
|
|
5291
|
+
}
|
|
5292
|
+
const particlesOptions = container.actualOptions.particles, groups = particlesOptions.groups;
|
|
5293
|
+
for (const group in groups) {
|
|
5294
|
+
const groupOptions = groups[group];
|
|
5295
|
+
if (!groupOptions) {
|
|
5296
|
+
continue;
|
|
5297
|
+
}
|
|
5298
|
+
for (let i = this.count, j = 0; j < groupOptions.number.value && i < particlesOptions.number.value; i++, j++) {
|
|
5299
|
+
this.addParticle(undefined, groupOptions, group);
|
|
5300
|
+
}
|
|
5301
|
+
}
|
|
5302
|
+
for (let i = this.count; i < particlesOptions.number.value; i++) {
|
|
5303
|
+
this.addParticle();
|
|
5304
|
+
}
|
|
5305
|
+
}
|
|
5306
|
+
async #initPluginsArrays() {
|
|
5307
|
+
const container = this.#container;
|
|
5308
|
+
for (const plugin of container.plugins) {
|
|
5309
|
+
if (plugin.redrawInit) {
|
|
5310
|
+
await plugin.redrawInit();
|
|
5311
|
+
}
|
|
5312
|
+
if (plugin.checkParticlePosition) {
|
|
5313
|
+
this.checkParticlePositionPlugins.push(plugin);
|
|
5314
|
+
}
|
|
5315
|
+
if (plugin.update) {
|
|
5316
|
+
this.#updatePlugins.push(plugin);
|
|
5317
|
+
}
|
|
5318
|
+
if (plugin.particleUpdate) {
|
|
5319
|
+
this.#particleUpdatePlugins.push(plugin);
|
|
5320
|
+
}
|
|
5321
|
+
if (plugin.postUpdate) {
|
|
5322
|
+
this.#postUpdatePlugins.push(plugin);
|
|
5323
|
+
}
|
|
5324
|
+
if (plugin.particleReset) {
|
|
5325
|
+
this.#particleResetPlugins.push(plugin);
|
|
5326
|
+
}
|
|
5327
|
+
if (plugin.postParticleUpdate) {
|
|
5328
|
+
this.#postParticleUpdatePlugins.push(plugin);
|
|
5329
|
+
}
|
|
5330
|
+
}
|
|
5331
|
+
}
|
|
5168
5332
|
#insertParticleIntoBucket(particle) {
|
|
5169
5333
|
const bucketIndex = this.#getBucketIndex(particle.position.z), bucket = this.#zBuckets[bucketIndex];
|
|
5170
5334
|
if (!bucket) {
|
|
@@ -5173,12 +5337,15 @@
|
|
|
5173
5337
|
bucket.push(particle);
|
|
5174
5338
|
this.#particleBuckets.set(particle.id, bucketIndex);
|
|
5175
5339
|
}
|
|
5176
|
-
#
|
|
5340
|
+
#removeAny(quantity) {
|
|
5341
|
+
this.removeAt(minIndex, quantity, undefined, undefined, false);
|
|
5342
|
+
}
|
|
5343
|
+
#removeParticle(index, group, override, matchGroup = true) {
|
|
5177
5344
|
const particle = this.#array[index];
|
|
5178
5345
|
if (!particle) {
|
|
5179
5346
|
return false;
|
|
5180
5347
|
}
|
|
5181
|
-
if (particle.group !== group) {
|
|
5348
|
+
if (matchGroup && particle.group !== group) {
|
|
5182
5349
|
return false;
|
|
5183
5350
|
}
|
|
5184
5351
|
this.#array.splice(index, deleteCount);
|
|
@@ -5265,7 +5432,7 @@
|
|
|
5265
5432
|
particlesToDelete.add(particle);
|
|
5266
5433
|
continue;
|
|
5267
5434
|
}
|
|
5268
|
-
this
|
|
5435
|
+
this.#grid.insert(particle);
|
|
5269
5436
|
}
|
|
5270
5437
|
return particlesToDelete;
|
|
5271
5438
|
}
|
|
@@ -5352,6 +5519,7 @@
|
|
|
5352
5519
|
started;
|
|
5353
5520
|
zLayers;
|
|
5354
5521
|
#delay;
|
|
5522
|
+
#delayResolve;
|
|
5355
5523
|
#delayTimeout;
|
|
5356
5524
|
#delta = { value: 0, factor: 0 };
|
|
5357
5525
|
#dispatchCallback;
|
|
@@ -5441,7 +5609,6 @@
|
|
|
5441
5609
|
this.shapeDrawers = new Map();
|
|
5442
5610
|
this.particleUpdaters = [];
|
|
5443
5611
|
this.plugins.length = 0;
|
|
5444
|
-
this.#pluginManager.clearPlugins(this);
|
|
5445
5612
|
this.destroyed = true;
|
|
5446
5613
|
this.#onDestroy(remove);
|
|
5447
5614
|
this.dispatchEvent(EventType.containerDestroyed);
|
|
@@ -5494,31 +5661,14 @@
|
|
|
5494
5661
|
await this.initDrawersAndUpdaters();
|
|
5495
5662
|
this.#options = loadContainerOptions(this.#pluginManager, this, this.#initialSourceOptions, this.sourceOptions);
|
|
5496
5663
|
this.actualOptions = loadContainerOptions(this.#pluginManager, this, this.#options);
|
|
5497
|
-
this
|
|
5498
|
-
this.particleDestroyedPlugins.length = 0;
|
|
5499
|
-
this.particleCreatedPlugins.length = 0;
|
|
5500
|
-
this.particlePositionPlugins.length = 0;
|
|
5501
|
-
for (const [plugin, containerPlugin] of allContainerPlugins) {
|
|
5502
|
-
if (plugin.needsPlugin(this.actualOptions)) {
|
|
5503
|
-
this.plugins.push(containerPlugin);
|
|
5504
|
-
if (containerPlugin.particleCreated) {
|
|
5505
|
-
this.particleCreatedPlugins.push(containerPlugin);
|
|
5506
|
-
}
|
|
5507
|
-
if (containerPlugin.particleDestroyed) {
|
|
5508
|
-
this.particleDestroyedPlugins.push(containerPlugin);
|
|
5509
|
-
}
|
|
5510
|
-
if (containerPlugin.particlePosition) {
|
|
5511
|
-
this.particlePositionPlugins.push(containerPlugin);
|
|
5512
|
-
}
|
|
5513
|
-
}
|
|
5514
|
-
}
|
|
5664
|
+
this.#initPlugins(allContainerPlugins);
|
|
5515
5665
|
this.retina.init();
|
|
5516
5666
|
this.canvas.init();
|
|
5517
5667
|
this.updateActualOptions();
|
|
5518
5668
|
this.canvas.initBackground();
|
|
5519
5669
|
this.canvas.resize();
|
|
5520
5670
|
const { delay, duration, fpsLimit, smooth, zLayers } = this.actualOptions, hdrOptions = this.actualOptions.hdr;
|
|
5521
|
-
this.hdrMode = hdrOptions.mode;
|
|
5671
|
+
this.hdrMode = toEnumValue(HdrMode, hdrOptions.mode, HdrMode.standard);
|
|
5522
5672
|
this.peakNits = hdrOptions.peakNits;
|
|
5523
5673
|
this.zLayers = zLayers;
|
|
5524
5674
|
this.#duration = getRangeValue(duration) * millisecondsToSeconds;
|
|
@@ -5539,9 +5689,9 @@
|
|
|
5539
5689
|
}
|
|
5540
5690
|
async initDrawersAndUpdaters() {
|
|
5541
5691
|
const pluginManager = this.#pluginManager;
|
|
5542
|
-
this.effectDrawers = await
|
|
5543
|
-
this.shapeDrawers = await
|
|
5544
|
-
this.particleUpdaters = await
|
|
5692
|
+
this.effectDrawers = await getItemMapFromInitializer(this, pluginManager.initializers.effects);
|
|
5693
|
+
this.shapeDrawers = await getItemMapFromInitializer(this, pluginManager.initializers.shapes);
|
|
5694
|
+
this.particleUpdaters = await getItemsFromInitializer(this, pluginManager.initializers.updaters);
|
|
5545
5695
|
}
|
|
5546
5696
|
pause() {
|
|
5547
5697
|
if (!guardCheck(this)) {
|
|
@@ -5608,7 +5758,10 @@
|
|
|
5608
5758
|
await this.init();
|
|
5609
5759
|
this.started = true;
|
|
5610
5760
|
await new Promise(resolve => {
|
|
5761
|
+
this.#delayResolve = resolve;
|
|
5611
5762
|
const start = async () => {
|
|
5763
|
+
this.#delayTimeout = undefined;
|
|
5764
|
+
this.#delayResolve = undefined;
|
|
5612
5765
|
this.#eventListeners.addListeners();
|
|
5613
5766
|
for (const plugin of this.plugins) {
|
|
5614
5767
|
await plugin.start?.();
|
|
@@ -5624,9 +5777,11 @@
|
|
|
5624
5777
|
if (!guardCheck(this) || !this.started) {
|
|
5625
5778
|
return;
|
|
5626
5779
|
}
|
|
5627
|
-
if (this.#delayTimeout) {
|
|
5780
|
+
if (this.#delayTimeout !== undefined) {
|
|
5628
5781
|
clearTimeout(this.#delayTimeout);
|
|
5629
5782
|
this.#delayTimeout = undefined;
|
|
5783
|
+
this.#delayResolve?.();
|
|
5784
|
+
this.#delayResolve = undefined;
|
|
5630
5785
|
}
|
|
5631
5786
|
this.#firstStart = true;
|
|
5632
5787
|
this.started = false;
|
|
@@ -5652,6 +5807,27 @@
|
|
|
5652
5807
|
}
|
|
5653
5808
|
return refresh;
|
|
5654
5809
|
}
|
|
5810
|
+
#initPlugins(allContainerPlugins) {
|
|
5811
|
+
this.plugins.length = 0;
|
|
5812
|
+
this.particleDestroyedPlugins.length = 0;
|
|
5813
|
+
this.particleCreatedPlugins.length = 0;
|
|
5814
|
+
this.particlePositionPlugins.length = 0;
|
|
5815
|
+
for (const [plugin, containerPlugin] of allContainerPlugins) {
|
|
5816
|
+
if (!plugin.needsPlugin(this.actualOptions)) {
|
|
5817
|
+
continue;
|
|
5818
|
+
}
|
|
5819
|
+
this.plugins.push(containerPlugin);
|
|
5820
|
+
if (containerPlugin.particleCreated) {
|
|
5821
|
+
this.particleCreatedPlugins.push(containerPlugin);
|
|
5822
|
+
}
|
|
5823
|
+
if (containerPlugin.particleDestroyed) {
|
|
5824
|
+
this.particleDestroyedPlugins.push(containerPlugin);
|
|
5825
|
+
}
|
|
5826
|
+
if (containerPlugin.particlePosition) {
|
|
5827
|
+
this.particlePositionPlugins.push(containerPlugin);
|
|
5828
|
+
}
|
|
5829
|
+
}
|
|
5830
|
+
}
|
|
5655
5831
|
#nextFrame(timestamp) {
|
|
5656
5832
|
try {
|
|
5657
5833
|
if (!this.#smooth &&
|
|
@@ -5928,11 +6104,11 @@
|
|
|
5928
6104
|
}
|
|
5929
6105
|
}
|
|
5930
6106
|
async #init() {
|
|
5931
|
-
const
|
|
5932
|
-
if (!
|
|
6107
|
+
const pluginManager = this.#pluginManager;
|
|
6108
|
+
if (!pluginManager.initializers.pathGenerators) {
|
|
5933
6109
|
return;
|
|
5934
6110
|
}
|
|
5935
|
-
this.availablePathGenerators =
|
|
6111
|
+
this.availablePathGenerators = await getItemMapFromInitializer(this.#container, pluginManager.initializers.pathGenerators);
|
|
5936
6112
|
this.pathGenerators = new Map();
|
|
5937
6113
|
for (const pathGenerator of this.pathGenerators.values()) {
|
|
5938
6114
|
pathGenerator.init();
|
|
@@ -5948,6 +6124,7 @@
|
|
|
5948
6124
|
exports.loadBigCirclesPreset = loadBigCirclesPreset;
|
|
5949
6125
|
exports.tsParticles = tsParticles;
|
|
5950
6126
|
|
|
5951
|
-
}));
|
|
6127
|
+
})(g.__tsParticlesInternals.presets.bigCircles = g.__tsParticlesInternals.presets.bigCircles || {});
|
|
6128
|
+
})(typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : self);
|
|
6129
|
+
|
|
5952
6130
|
Object.assign(globalThis.window || globalThis, { loadBigCirclesPreset: (globalThis.__tsParticlesInternals.presets.bigCircles || {}).loadBigCirclesPreset });
|
|
5953
|
-
delete (globalThis.window || globalThis).tsparticlesInternalExports;
|