@tsparticles/preset-ambient 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),
|
|
@@ -3332,21 +3400,28 @@
|
|
|
3332
3400
|
});
|
|
3333
3401
|
}
|
|
3334
3402
|
clear() {
|
|
3403
|
+
const visited = new Set();
|
|
3335
3404
|
for (const plugin of this.#canvasClearPlugins) {
|
|
3405
|
+
visited.add(plugin);
|
|
3336
3406
|
if (plugin.canvasClear?.() ?? false) {
|
|
3337
|
-
return;
|
|
3407
|
+
return plugin;
|
|
3338
3408
|
}
|
|
3339
3409
|
}
|
|
3340
3410
|
for (const layer of Object.values(DrawLayer)) {
|
|
3341
3411
|
if (typeof layer === "number") {
|
|
3342
3412
|
for (const plugin of this.#getLayerPlugins(layer)) {
|
|
3413
|
+
if (visited.has(plugin)) {
|
|
3414
|
+
continue;
|
|
3415
|
+
}
|
|
3416
|
+
visited.add(plugin);
|
|
3343
3417
|
if (plugin.canvasClear?.() ?? false) {
|
|
3344
|
-
return;
|
|
3418
|
+
return plugin;
|
|
3345
3419
|
}
|
|
3346
3420
|
}
|
|
3347
3421
|
}
|
|
3348
3422
|
}
|
|
3349
3423
|
this.canvasClear();
|
|
3424
|
+
return undefined;
|
|
3350
3425
|
}
|
|
3351
3426
|
destroy() {
|
|
3352
3427
|
this.stop();
|
|
@@ -3424,8 +3499,7 @@
|
|
|
3424
3499
|
});
|
|
3425
3500
|
}
|
|
3426
3501
|
drawParticles(delta) {
|
|
3427
|
-
const { particles, actualOptions } = this.#container;
|
|
3428
|
-
this.clear();
|
|
3502
|
+
const { particles, actualOptions } = this.#container, clearedPlugin = this.clear();
|
|
3429
3503
|
particles.update(delta);
|
|
3430
3504
|
this.draw(ctx => {
|
|
3431
3505
|
const width = this.#canvasManager.size.width, height = this.#canvasManager.size.height;
|
|
@@ -3447,7 +3521,9 @@
|
|
|
3447
3521
|
}
|
|
3448
3522
|
}
|
|
3449
3523
|
for (const plugin of this.#getLayerPlugins(DrawLayer.BackgroundMask)) {
|
|
3450
|
-
plugin
|
|
3524
|
+
if (plugin !== clearedPlugin) {
|
|
3525
|
+
plugin.canvasPaint?.();
|
|
3526
|
+
}
|
|
3451
3527
|
}
|
|
3452
3528
|
for (const plugin of this.#getLayerPlugins(DrawLayer.CanvasSetup)) {
|
|
3453
3529
|
plugin.drawSettingsSetup?.(ctx, delta);
|
|
@@ -3479,35 +3555,7 @@
|
|
|
3479
3555
|
this.#layers[layer] = [];
|
|
3480
3556
|
}
|
|
3481
3557
|
}
|
|
3482
|
-
|
|
3483
|
-
if (plugin.particleFillColor ?? plugin.particleStrokeColor) {
|
|
3484
|
-
this.#colorPlugins.push(plugin);
|
|
3485
|
-
}
|
|
3486
|
-
if (plugin.drawParticle) {
|
|
3487
|
-
this.#drawParticlePlugins.push(plugin);
|
|
3488
|
-
}
|
|
3489
|
-
if (plugin.drawParticleSetup) {
|
|
3490
|
-
this.#drawParticlesSetupPlugins.push(plugin);
|
|
3491
|
-
}
|
|
3492
|
-
if (plugin.drawParticleCleanup) {
|
|
3493
|
-
this.#drawParticlesCleanupPlugins.push(plugin);
|
|
3494
|
-
}
|
|
3495
|
-
if (plugin.canvasClear) {
|
|
3496
|
-
this.#canvasClearPlugins.push(plugin);
|
|
3497
|
-
}
|
|
3498
|
-
if (plugin.canvasPaint) {
|
|
3499
|
-
this.#getLayerPlugins(DrawLayer.BackgroundMask).push(plugin);
|
|
3500
|
-
}
|
|
3501
|
-
if (plugin.drawSettingsSetup) {
|
|
3502
|
-
this.#getLayerPlugins(DrawLayer.CanvasSetup).push(plugin);
|
|
3503
|
-
}
|
|
3504
|
-
if (plugin.draw) {
|
|
3505
|
-
this.#getLayerPlugins(DrawLayer.PluginContent).push(plugin);
|
|
3506
|
-
}
|
|
3507
|
-
if (plugin.clearDraw ?? plugin.drawSettingsCleanup) {
|
|
3508
|
-
this.#getLayerPlugins(DrawLayer.CanvasCleanup).push(plugin);
|
|
3509
|
-
}
|
|
3510
|
-
}
|
|
3558
|
+
this.#initPluginsArray();
|
|
3511
3559
|
}
|
|
3512
3560
|
initUpdaters() {
|
|
3513
3561
|
this.#preDrawUpdaters = [];
|
|
@@ -3716,6 +3764,45 @@
|
|
|
3716
3764
|
this.#reusablePluginColors[sColorIndex] = sColor;
|
|
3717
3765
|
return this.#reusablePluginColors;
|
|
3718
3766
|
}
|
|
3767
|
+
#initLayerPlugin(plugin) {
|
|
3768
|
+
const layerMap = [
|
|
3769
|
+
[DrawLayer.BackgroundMask, !!plugin.canvasPaint],
|
|
3770
|
+
[DrawLayer.CanvasSetup, !!plugin.drawSettingsSetup],
|
|
3771
|
+
[DrawLayer.PluginContent, !!plugin.draw],
|
|
3772
|
+
[DrawLayer.CanvasCleanup, !!(plugin.clearDraw ?? plugin.drawSettingsCleanup)],
|
|
3773
|
+
];
|
|
3774
|
+
for (const [layer, active] of layerMap) {
|
|
3775
|
+
if (active) {
|
|
3776
|
+
this.#layers[layer].push(plugin);
|
|
3777
|
+
}
|
|
3778
|
+
}
|
|
3779
|
+
}
|
|
3780
|
+
#initPluginsArray() {
|
|
3781
|
+
for (const plugin of this.#container.plugins) {
|
|
3782
|
+
if (plugin.particleFillColor ?? plugin.particleStrokeColor) {
|
|
3783
|
+
this.#colorPlugins.push(plugin);
|
|
3784
|
+
}
|
|
3785
|
+
if (plugin.drawParticle) {
|
|
3786
|
+
this.#drawParticlePlugins.push(plugin);
|
|
3787
|
+
}
|
|
3788
|
+
if (plugin.drawParticleSetup) {
|
|
3789
|
+
this.#drawParticlesSetupPlugins.push(plugin);
|
|
3790
|
+
}
|
|
3791
|
+
if (plugin.drawParticleCleanup) {
|
|
3792
|
+
this.#drawParticlesCleanupPlugins.push(plugin);
|
|
3793
|
+
}
|
|
3794
|
+
if (plugin.canvasClear) {
|
|
3795
|
+
this.#canvasClearPlugins.push(plugin);
|
|
3796
|
+
}
|
|
3797
|
+
this.#initLayerPlugin(plugin);
|
|
3798
|
+
}
|
|
3799
|
+
}
|
|
3800
|
+
#isSupportedElement(element) {
|
|
3801
|
+
return ((typeof HTMLCanvasElement !== "undefined" && element instanceof HTMLCanvasElement) ||
|
|
3802
|
+
(typeof OffscreenCanvas !== "undefined" && element instanceof OffscreenCanvas) ||
|
|
3803
|
+
(typeof HTMLVideoElement !== "undefined" && element instanceof HTMLVideoElement) ||
|
|
3804
|
+
(typeof HTMLImageElement !== "undefined" && element instanceof HTMLImageElement));
|
|
3805
|
+
}
|
|
3719
3806
|
#resolveBackgroundElement() {
|
|
3720
3807
|
const background = this.#container.actualOptions.background;
|
|
3721
3808
|
this.#backgroundElement = null;
|
|
@@ -3725,9 +3812,7 @@
|
|
|
3725
3812
|
if (typeof background.element === "string") {
|
|
3726
3813
|
if (typeof document !== "undefined") {
|
|
3727
3814
|
const node = document.querySelector(background.element);
|
|
3728
|
-
if (
|
|
3729
|
-
(typeof HTMLVideoElement !== "undefined" && node instanceof HTMLVideoElement) ||
|
|
3730
|
-
(typeof HTMLImageElement !== "undefined" && node instanceof HTMLImageElement)) {
|
|
3815
|
+
if (node && this.#isSupportedElement(node)) {
|
|
3731
3816
|
this.#backgroundElement = node;
|
|
3732
3817
|
}
|
|
3733
3818
|
else if (node) {
|
|
@@ -3738,10 +3823,7 @@
|
|
|
3738
3823
|
}
|
|
3739
3824
|
}
|
|
3740
3825
|
}
|
|
3741
|
-
else if ((
|
|
3742
|
-
(typeof OffscreenCanvas !== "undefined" && background.element instanceof OffscreenCanvas) ||
|
|
3743
|
-
(typeof HTMLVideoElement !== "undefined" && background.element instanceof HTMLVideoElement) ||
|
|
3744
|
-
(typeof HTMLImageElement !== "undefined" && background.element instanceof HTMLImageElement)) {
|
|
3826
|
+
else if (this.#isSupportedElement(background.element)) {
|
|
3745
3827
|
this.#backgroundElement = background.element;
|
|
3746
3828
|
}
|
|
3747
3829
|
}
|
|
@@ -3759,7 +3841,7 @@
|
|
|
3759
3841
|
return transferredCanvas;
|
|
3760
3842
|
}
|
|
3761
3843
|
if (typeof canvas.transferControlToOffscreen !== "function") {
|
|
3762
|
-
throw new TypeError(
|
|
3844
|
+
throw new TypeError(getErrorMessage(ErrorCodes$1.offscreenCanvasUnsupported));
|
|
3763
3845
|
}
|
|
3764
3846
|
try {
|
|
3765
3847
|
const offscreenCanvas = canvas.transferControlToOffscreen();
|
|
@@ -3767,10 +3849,16 @@
|
|
|
3767
3849
|
return offscreenCanvas;
|
|
3768
3850
|
}
|
|
3769
3851
|
catch {
|
|
3770
|
-
throw new TypeError(
|
|
3852
|
+
throw new TypeError(getErrorMessage(ErrorCodes$1.offscreenCanvasTransferFailed));
|
|
3771
3853
|
}
|
|
3772
3854
|
}, isHtmlCanvasElement = (canvas) => {
|
|
3773
3855
|
return typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement;
|
|
3856
|
+
}, getEffectiveColorSpace = (context) => {
|
|
3857
|
+
if (!context) {
|
|
3858
|
+
return undefined;
|
|
3859
|
+
}
|
|
3860
|
+
const colorInfo = context;
|
|
3861
|
+
return colorInfo.getContextAttributes?.().colorSpace ?? undefined;
|
|
3774
3862
|
};
|
|
3775
3863
|
function setStyle(canvas, style, important = false) {
|
|
3776
3864
|
if (!style) {
|
|
@@ -3895,7 +3983,7 @@
|
|
|
3895
3983
|
const elementStyle = element.style, color = rangeColorToRgb(this.#pluginManager, background.color);
|
|
3896
3984
|
if (color) {
|
|
3897
3985
|
const hdrOptions = container.actualOptions.hdr;
|
|
3898
|
-
elementStyle.backgroundColor = getStyleFromRgb(color, container.hdr, background.opacity, hdrOptions.peakNits, hdrOptions.mode);
|
|
3986
|
+
elementStyle.backgroundColor = getStyleFromRgb(color, container.hdr, background.opacity, hdrOptions.peakNits, toEnumValue(HdrMode, hdrOptions.mode, HdrMode.standard));
|
|
3899
3987
|
}
|
|
3900
3988
|
else {
|
|
3901
3989
|
elementStyle.backgroundColor = "";
|
|
@@ -4015,11 +4103,11 @@
|
|
|
4015
4103
|
const container = this.#container, canSupportHdr = container.actualOptions.hdr.enable &&
|
|
4016
4104
|
safeMatchMedia("(color-gamut: p3)")?.matches &&
|
|
4017
4105
|
safeMatchMedia("(dynamic-range: high)")?.matches;
|
|
4018
|
-
container.
|
|
4019
|
-
container.hdrMode = container.actualOptions.hdr.mode;
|
|
4106
|
+
container.hdrMode = toEnumValue(HdrMode, container.actualOptions.hdr.mode, HdrMode.standard);
|
|
4020
4107
|
container.peakNits = container.actualOptions.hdr.peakNits;
|
|
4021
4108
|
const renderCanvas = this.renderCanvas;
|
|
4022
4109
|
if (!renderCanvas) {
|
|
4110
|
+
container.hdr = canSupportHdr ?? false;
|
|
4023
4111
|
return;
|
|
4024
4112
|
}
|
|
4025
4113
|
this.render.setContextSettings({
|
|
@@ -4038,7 +4126,6 @@
|
|
|
4038
4126
|
context = null;
|
|
4039
4127
|
}
|
|
4040
4128
|
if (canSupportHdr && !context) {
|
|
4041
|
-
container.hdr = false;
|
|
4042
4129
|
const sdrSettings = {
|
|
4043
4130
|
alpha: true,
|
|
4044
4131
|
desynchronized: true,
|
|
@@ -4054,11 +4141,16 @@
|
|
|
4054
4141
|
}
|
|
4055
4142
|
}
|
|
4056
4143
|
this.render.setContext(context);
|
|
4144
|
+
if (context) {
|
|
4145
|
+
const effectiveColorSpace = getEffectiveColorSpace(context);
|
|
4146
|
+
if (effectiveColorSpace !== undefined) {
|
|
4147
|
+
container.hdr = effectiveColorSpace === "display-p3";
|
|
4148
|
+
}
|
|
4149
|
+
}
|
|
4057
4150
|
}
|
|
4058
4151
|
#initHdrListeners() {
|
|
4059
4152
|
this.#removeHdrListeners();
|
|
4060
4153
|
const p3Query = safeMatchMedia("(color-gamut: p3)"), hdrQuery = safeMatchMedia("(dynamic-range: high)"), handleChange = () => {
|
|
4061
|
-
this.#recreateRenderCanvas();
|
|
4062
4154
|
this.#initContext();
|
|
4063
4155
|
this.initBackground();
|
|
4064
4156
|
}, listeners = [];
|
|
@@ -4094,16 +4186,6 @@
|
|
|
4094
4186
|
element.style.setProperty(key, value, "important");
|
|
4095
4187
|
}
|
|
4096
4188
|
}
|
|
4097
|
-
#recreateRenderCanvas() {
|
|
4098
|
-
const renderCanvas = this.renderCanvas;
|
|
4099
|
-
if (!renderCanvas) {
|
|
4100
|
-
return;
|
|
4101
|
-
}
|
|
4102
|
-
if (this.domElement) {
|
|
4103
|
-
return;
|
|
4104
|
-
}
|
|
4105
|
-
this.renderCanvas = new OffscreenCanvas(renderCanvas.width, renderCanvas.height);
|
|
4106
|
-
}
|
|
4107
4189
|
#removeHdrListeners() {
|
|
4108
4190
|
if (!this.#hdrMediaListeners) {
|
|
4109
4191
|
return;
|
|
@@ -4175,6 +4257,10 @@
|
|
|
4175
4257
|
this.#manageListeners(true);
|
|
4176
4258
|
}
|
|
4177
4259
|
removeListeners() {
|
|
4260
|
+
if (this.#resizeTimeout !== undefined) {
|
|
4261
|
+
clearTimeout(this.#resizeTimeout);
|
|
4262
|
+
this.#resizeTimeout = undefined;
|
|
4263
|
+
}
|
|
4178
4264
|
this.#manageListeners(false);
|
|
4179
4265
|
}
|
|
4180
4266
|
#handleVisibilityChange() {
|
|
@@ -4202,8 +4288,7 @@
|
|
|
4202
4288
|
this.#resizeTimeout = undefined;
|
|
4203
4289
|
}
|
|
4204
4290
|
const handleResize = async () => {
|
|
4205
|
-
|
|
4206
|
-
await canvas.windowResize();
|
|
4291
|
+
await this.#container.canvas.windowResize();
|
|
4207
4292
|
};
|
|
4208
4293
|
this.#resizeTimeout = setTimeout(() => void handleResize(), this.#container.actualOptions.resize.delay * millisecondsToSeconds);
|
|
4209
4294
|
}
|
|
@@ -4231,8 +4316,8 @@
|
|
|
4231
4316
|
}
|
|
4232
4317
|
else if (!this.#resizeObserver && add && canvasEl) {
|
|
4233
4318
|
this.#resizeObserver = new ResizeObserver((entries) => {
|
|
4234
|
-
const
|
|
4235
|
-
if (!
|
|
4319
|
+
const res = entries.some(e => e.target === canvasEl);
|
|
4320
|
+
if (!res) {
|
|
4236
4321
|
return;
|
|
4237
4322
|
}
|
|
4238
4323
|
this.#handleWindowResize();
|
|
@@ -4496,10 +4581,10 @@
|
|
|
4496
4581
|
return this.#modifiers.find(m => m.id === id);
|
|
4497
4582
|
}
|
|
4498
4583
|
getOpacity() {
|
|
4499
|
-
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
|
|
4500
|
-
this.#cachedOpacityData.fillOpacity = fillOpacity;
|
|
4584
|
+
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;
|
|
4585
|
+
this.#cachedOpacityData.fillOpacity = this.fillOpacity ?? defaultOpacity$1;
|
|
4501
4586
|
this.#cachedOpacityData.opacity = opacity * zOpacityFactor;
|
|
4502
|
-
this.#cachedOpacityData.strokeOpacity = strokeOpacity;
|
|
4587
|
+
this.#cachedOpacityData.strokeOpacity = this.strokeOpacity ?? defaultOpacity$1;
|
|
4503
4588
|
return this.#cachedOpacityData;
|
|
4504
4589
|
}
|
|
4505
4590
|
getPosition() {
|
|
@@ -4746,7 +4831,7 @@
|
|
|
4746
4831
|
#initPosition(position) {
|
|
4747
4832
|
const container = this.#container, zIndexValue = Math.floor(getRangeValue(this.options.zIndex.value)), initialPosition = this.#calcPosition(position, clamp(zIndexValue, minZ, container.zLayers));
|
|
4748
4833
|
if (!initialPosition) {
|
|
4749
|
-
throw new Error(
|
|
4834
|
+
throw new Error(getErrorMessage(ErrorCodes$1.particlePositionNotFound));
|
|
4750
4835
|
}
|
|
4751
4836
|
this.position = initialPosition;
|
|
4752
4837
|
this.initialPosition = this.position.copy();
|
|
@@ -4795,6 +4880,12 @@
|
|
|
4795
4880
|
this.#circlePoolIdx = 0;
|
|
4796
4881
|
this.#rectanglePoolIdx = 0;
|
|
4797
4882
|
}
|
|
4883
|
+
get cellSize() {
|
|
4884
|
+
return this.#cellSize;
|
|
4885
|
+
}
|
|
4886
|
+
set cellSize(value) {
|
|
4887
|
+
this.#pendingCellSize = value;
|
|
4888
|
+
}
|
|
4798
4889
|
clear() {
|
|
4799
4890
|
this.#cells.clear();
|
|
4800
4891
|
const pendingCellSize = this.#pendingCellSize;
|
|
@@ -4818,40 +4909,46 @@
|
|
|
4818
4909
|
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);
|
|
4819
4910
|
for (let cx = minCellX; cx <= maxCellX; cx++) {
|
|
4820
4911
|
for (let cy = minCellY; cy <= maxCellY; cy++) {
|
|
4821
|
-
|
|
4822
|
-
if (!cellParticles) {
|
|
4823
|
-
continue;
|
|
4824
|
-
}
|
|
4825
|
-
for (const p of cellParticles) {
|
|
4826
|
-
if (check && !check(p)) {
|
|
4827
|
-
continue;
|
|
4828
|
-
}
|
|
4829
|
-
if (range.contains(p.getPosition())) {
|
|
4830
|
-
out.push(p);
|
|
4831
|
-
}
|
|
4832
|
-
}
|
|
4912
|
+
this.#queryCell(cx, cy, range, check, out);
|
|
4833
4913
|
}
|
|
4834
4914
|
}
|
|
4835
4915
|
return out;
|
|
4836
4916
|
}
|
|
4837
4917
|
queryCircle(position, radius, check, out = []) {
|
|
4838
|
-
const circle = this.#acquireCircle(position.x, position.y, radius)
|
|
4839
|
-
|
|
4840
|
-
|
|
4918
|
+
const circle = this.#acquireCircle(position.x, position.y, radius);
|
|
4919
|
+
try {
|
|
4920
|
+
return this.query(circle, check, out);
|
|
4921
|
+
}
|
|
4922
|
+
finally {
|
|
4923
|
+
this.#circlePoolIdx--;
|
|
4924
|
+
}
|
|
4841
4925
|
}
|
|
4842
4926
|
queryRectangle(position, size, check, out = []) {
|
|
4843
|
-
const rect = this.#acquireRectangle(position.x, position.y, size.width, size.height)
|
|
4844
|
-
|
|
4845
|
-
|
|
4846
|
-
|
|
4847
|
-
|
|
4848
|
-
|
|
4927
|
+
const rect = this.#acquireRectangle(position.x, position.y, size.width, size.height);
|
|
4928
|
+
try {
|
|
4929
|
+
return this.query(rect, check, out);
|
|
4930
|
+
}
|
|
4931
|
+
finally {
|
|
4932
|
+
this.#rectanglePoolIdx--;
|
|
4933
|
+
}
|
|
4849
4934
|
}
|
|
4850
4935
|
#acquireCircle(x, y, r) {
|
|
4851
|
-
|
|
4936
|
+
const idx = this.#circlePoolIdx++;
|
|
4937
|
+
let circle = this.#circlePool[idx];
|
|
4938
|
+
if (!circle) {
|
|
4939
|
+
circle = new Circle(x, y, r);
|
|
4940
|
+
this.#circlePool[idx] = circle;
|
|
4941
|
+
}
|
|
4942
|
+
return circle.reset(x, y, r);
|
|
4852
4943
|
}
|
|
4853
4944
|
#acquireRectangle(x, y, w, h) {
|
|
4854
|
-
|
|
4945
|
+
const idx = this.#rectanglePoolIdx++;
|
|
4946
|
+
let rectangle = this.#rectanglePool[idx];
|
|
4947
|
+
if (!rectangle) {
|
|
4948
|
+
rectangle = new Rectangle(x, y, w, h);
|
|
4949
|
+
this.#rectanglePool[idx] = rectangle;
|
|
4950
|
+
}
|
|
4951
|
+
return rectangle.reset(x, y, w, h);
|
|
4855
4952
|
}
|
|
4856
4953
|
#cellKeyFromCoords(x, y) {
|
|
4857
4954
|
const cellX = Math.floor(x / this.#cellSize), cellY = Math.floor(y / this.#cellSize);
|
|
@@ -4878,17 +4975,27 @@
|
|
|
4878
4975
|
}
|
|
4879
4976
|
return null;
|
|
4880
4977
|
}
|
|
4881
|
-
#
|
|
4882
|
-
|
|
4883
|
-
|
|
4978
|
+
#queryCell(cx, cy, range, check, out) {
|
|
4979
|
+
const cellParticles = this.#cells.get(`${cx}_${cy}`);
|
|
4980
|
+
if (!cellParticles) {
|
|
4981
|
+
return;
|
|
4982
|
+
}
|
|
4983
|
+
for (const p of cellParticles) {
|
|
4984
|
+
if (check && !check(p)) {
|
|
4985
|
+
continue;
|
|
4986
|
+
}
|
|
4987
|
+
if (range.contains(p.getPosition())) {
|
|
4988
|
+
out.push(p);
|
|
4989
|
+
}
|
|
4990
|
+
}
|
|
4884
4991
|
}
|
|
4885
4992
|
}
|
|
4886
4993
|
|
|
4887
4994
|
class ParticlesManager {
|
|
4888
4995
|
checkParticlePositionPlugins;
|
|
4889
|
-
grid;
|
|
4890
4996
|
#array;
|
|
4891
4997
|
#container;
|
|
4998
|
+
#grid;
|
|
4892
4999
|
#groupLimits;
|
|
4893
5000
|
#limit;
|
|
4894
5001
|
#nextId;
|
|
@@ -4912,7 +5019,7 @@
|
|
|
4912
5019
|
this.#groupLimits = new Map();
|
|
4913
5020
|
this.#particleBuckets = new Map();
|
|
4914
5021
|
this.#zBuckets = this.#createBuckets(this.#container.zLayers);
|
|
4915
|
-
this
|
|
5022
|
+
this.#grid = new SpatialHashGrid(spatialHashGridCellSize);
|
|
4916
5023
|
this.checkParticlePositionPlugins = [];
|
|
4917
5024
|
this.#particleResetPlugins = [];
|
|
4918
5025
|
this.#particleUpdatePlugins = [];
|
|
@@ -4923,23 +5030,12 @@
|
|
|
4923
5030
|
get count() {
|
|
4924
5031
|
return this.#array.length;
|
|
4925
5032
|
}
|
|
5033
|
+
get grid() {
|
|
5034
|
+
return this.#grid;
|
|
5035
|
+
}
|
|
4926
5036
|
addParticle(position, overrideOptions, group, initializer) {
|
|
4927
|
-
|
|
4928
|
-
|
|
4929
|
-
switch (limitMode) {
|
|
4930
|
-
case LimitMode.delete: {
|
|
4931
|
-
const countToRemove = currentCount + countOffset - limit;
|
|
4932
|
-
if (countToRemove > minCount) {
|
|
4933
|
-
this.removeQuantity(countToRemove);
|
|
4934
|
-
}
|
|
4935
|
-
break;
|
|
4936
|
-
}
|
|
4937
|
-
case LimitMode.wait:
|
|
4938
|
-
if (currentCount >= limit) {
|
|
4939
|
-
return;
|
|
4940
|
-
}
|
|
4941
|
-
break;
|
|
4942
|
-
}
|
|
5037
|
+
if (this.#checkAndApplyLimits(group, this.count)) {
|
|
5038
|
+
return;
|
|
4943
5039
|
}
|
|
4944
5040
|
try {
|
|
4945
5041
|
const particle = this.#pool.pop() ?? new Particle(this.#pluginManager, this.#container);
|
|
@@ -5003,7 +5099,7 @@
|
|
|
5003
5099
|
return this.#array[index];
|
|
5004
5100
|
}
|
|
5005
5101
|
async init() {
|
|
5006
|
-
const container = this.#container
|
|
5102
|
+
const container = this.#container;
|
|
5007
5103
|
this.checkParticlePositionPlugins = [];
|
|
5008
5104
|
this.#updatePlugins = [];
|
|
5009
5105
|
this.#particleUpdatePlugins = [];
|
|
@@ -5012,59 +5108,16 @@
|
|
|
5012
5108
|
this.#postParticleUpdatePlugins = [];
|
|
5013
5109
|
this.#particleBuckets.clear();
|
|
5014
5110
|
this.#resetBuckets(container.zLayers);
|
|
5015
|
-
this
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5020
|
-
if (
|
|
5021
|
-
this
|
|
5022
|
-
}
|
|
5023
|
-
if (plugin.update) {
|
|
5024
|
-
this.#updatePlugins.push(plugin);
|
|
5025
|
-
}
|
|
5026
|
-
if (plugin.particleUpdate) {
|
|
5027
|
-
this.#particleUpdatePlugins.push(plugin);
|
|
5028
|
-
}
|
|
5029
|
-
if (plugin.postUpdate) {
|
|
5030
|
-
this.#postUpdatePlugins.push(plugin);
|
|
5031
|
-
}
|
|
5032
|
-
if (plugin.particleReset) {
|
|
5033
|
-
this.#particleResetPlugins.push(plugin);
|
|
5034
|
-
}
|
|
5035
|
-
if (plugin.postParticleUpdate) {
|
|
5036
|
-
this.#postParticleUpdatePlugins.push(plugin);
|
|
5037
|
-
}
|
|
5038
|
-
}
|
|
5039
|
-
await this.#container.initDrawersAndUpdaters();
|
|
5040
|
-
for (const drawer of this.#container.effectDrawers.values()) {
|
|
5041
|
-
await drawer.init?.(container);
|
|
5042
|
-
}
|
|
5043
|
-
for (const drawer of this.#container.shapeDrawers.values()) {
|
|
5044
|
-
await drawer.init?.(container);
|
|
5045
|
-
}
|
|
5046
|
-
let handled = false;
|
|
5047
|
-
for (const plugin of container.plugins) {
|
|
5048
|
-
handled = plugin.particlesInitialization?.() ?? handled;
|
|
5049
|
-
if (handled) {
|
|
5050
|
-
break;
|
|
5051
|
-
}
|
|
5052
|
-
}
|
|
5053
|
-
if (!handled) {
|
|
5054
|
-
const particlesOptions = options.particles, groups = particlesOptions.groups;
|
|
5055
|
-
for (const group in groups) {
|
|
5056
|
-
const groupOptions = groups[group];
|
|
5057
|
-
if (!groupOptions) {
|
|
5058
|
-
continue;
|
|
5059
|
-
}
|
|
5060
|
-
for (let i = this.count, j = 0; j < groupOptions.number.value && i < particlesOptions.number.value; i++, j++) {
|
|
5061
|
-
this.addParticle(undefined, groupOptions, group);
|
|
5062
|
-
}
|
|
5063
|
-
}
|
|
5064
|
-
for (let i = this.count; i < particlesOptions.number.value; i++) {
|
|
5065
|
-
this.addParticle();
|
|
5111
|
+
this.#grid = new SpatialHashGrid(spatialHashGridCellSize * container.retina.pixelRatio);
|
|
5112
|
+
this.#applyLimits(container.actualOptions.particles);
|
|
5113
|
+
const particlesOptions = container.actualOptions.particles, groups = particlesOptions.groups;
|
|
5114
|
+
for (const group in groups) {
|
|
5115
|
+
const groupData = groups[group];
|
|
5116
|
+
if (groupData) {
|
|
5117
|
+
this.#applyLimits(loadParticlesOptions(this.#pluginManager, this.#container, groupData), group, groupData);
|
|
5066
5118
|
}
|
|
5067
5119
|
}
|
|
5120
|
+
await this.#initPlugins();
|
|
5068
5121
|
}
|
|
5069
5122
|
push(nb, position, overrideOptions, group) {
|
|
5070
5123
|
for (let i = 0; i < nb; i++) {
|
|
@@ -5079,13 +5132,13 @@
|
|
|
5079
5132
|
remove(particle, group, override) {
|
|
5080
5133
|
this.removeAt(this.#array.indexOf(particle), undefined, group, override);
|
|
5081
5134
|
}
|
|
5082
|
-
removeAt(index, quantity = defaultRemoveQuantity, group, override) {
|
|
5135
|
+
removeAt(index, quantity = defaultRemoveQuantity, group, override, matchGroup = true) {
|
|
5083
5136
|
if (index < minIndex || index > this.count) {
|
|
5084
5137
|
return;
|
|
5085
5138
|
}
|
|
5086
5139
|
let deleted = 0;
|
|
5087
5140
|
for (let i = index; deleted < quantity && i < this.count; i++) {
|
|
5088
|
-
if (this.#removeParticle(i, group, override)) {
|
|
5141
|
+
if (this.#removeParticle(i, group, override, matchGroup)) {
|
|
5089
5142
|
i--;
|
|
5090
5143
|
deleted++;
|
|
5091
5144
|
}
|
|
@@ -5116,7 +5169,7 @@
|
|
|
5116
5169
|
this.#resizeFactor = factor;
|
|
5117
5170
|
}
|
|
5118
5171
|
update(delta) {
|
|
5119
|
-
this
|
|
5172
|
+
this.#grid.clear();
|
|
5120
5173
|
for (const plugin of this.#updatePlugins) {
|
|
5121
5174
|
plugin.update?.(delta);
|
|
5122
5175
|
}
|
|
@@ -5127,7 +5180,7 @@
|
|
|
5127
5180
|
this.#updateParticlesPhase2(delta, particlesToDelete);
|
|
5128
5181
|
if (particlesToDelete.size) {
|
|
5129
5182
|
for (const particle of particlesToDelete) {
|
|
5130
|
-
this.remove(particle);
|
|
5183
|
+
this.remove(particle, particle.group);
|
|
5131
5184
|
}
|
|
5132
5185
|
}
|
|
5133
5186
|
this.#resizeFactor = undefined;
|
|
@@ -5138,12 +5191,7 @@
|
|
|
5138
5191
|
#applyDensity(options, pluginsCount, group, groupOptions) {
|
|
5139
5192
|
const numberOptions = options.number;
|
|
5140
5193
|
if (!numberOptions.density.enable) {
|
|
5141
|
-
|
|
5142
|
-
this.#limit = numberOptions.limit.value;
|
|
5143
|
-
}
|
|
5144
|
-
else if (groupOptions?.number.limit.value ?? numberOptions.limit.value) {
|
|
5145
|
-
this.#groupLimits.set(group, groupOptions?.number.limit.value ?? numberOptions.limit.value);
|
|
5146
|
-
}
|
|
5194
|
+
this.#applyLimits(options, group, groupOptions);
|
|
5147
5195
|
return;
|
|
5148
5196
|
}
|
|
5149
5197
|
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);
|
|
@@ -5151,7 +5199,10 @@
|
|
|
5151
5199
|
this.#limit = numberOptions.limit.value * densityFactor;
|
|
5152
5200
|
}
|
|
5153
5201
|
else {
|
|
5154
|
-
this.#groupLimits.set(group,
|
|
5202
|
+
this.#groupLimits.set(group, {
|
|
5203
|
+
limit: numberOptions.limit.value * densityFactor,
|
|
5204
|
+
mode: toEnumValue(LimitMode, numberOptions.limit.mode, LimitMode.delete),
|
|
5205
|
+
});
|
|
5155
5206
|
}
|
|
5156
5207
|
if (particlesCount < particlesNumber) {
|
|
5157
5208
|
this.push(Math.abs(particlesNumber - particlesCount), undefined, options, group);
|
|
@@ -5160,6 +5211,55 @@
|
|
|
5160
5211
|
this.removeQuantity(particlesCount - particlesNumber, group);
|
|
5161
5212
|
}
|
|
5162
5213
|
}
|
|
5214
|
+
#applyLimits(options, group, groupOptions) {
|
|
5215
|
+
if (group === undefined) {
|
|
5216
|
+
this.#limit = options.number.limit.value;
|
|
5217
|
+
const groups = this.#container.actualOptions.particles.groups;
|
|
5218
|
+
for (const existingGroup of this.#groupLimits.keys()) {
|
|
5219
|
+
if (!(existingGroup in groups)) {
|
|
5220
|
+
this.#groupLimits.delete(existingGroup);
|
|
5221
|
+
}
|
|
5222
|
+
}
|
|
5223
|
+
}
|
|
5224
|
+
else {
|
|
5225
|
+
const limitValue = groupOptions?.number?.limit?.value ?? options.number.limit.value;
|
|
5226
|
+
if (limitValue > minLimit) {
|
|
5227
|
+
this.#groupLimits.set(group, {
|
|
5228
|
+
limit: limitValue,
|
|
5229
|
+
mode: toEnumValue(LimitMode, groupOptions?.number?.limit?.mode ?? options.number.limit.mode, LimitMode.delete),
|
|
5230
|
+
});
|
|
5231
|
+
}
|
|
5232
|
+
else {
|
|
5233
|
+
this.#groupLimits.delete(group);
|
|
5234
|
+
}
|
|
5235
|
+
}
|
|
5236
|
+
}
|
|
5237
|
+
#checkAndApplyLimits(group, currentCount) {
|
|
5238
|
+
const globalLimit = this.#limit, globalMode = this.#container.actualOptions.particles.number.limit.mode;
|
|
5239
|
+
if (globalLimit > minLimit && globalMode === LimitMode.wait && currentCount >= globalLimit) {
|
|
5240
|
+
return true;
|
|
5241
|
+
}
|
|
5242
|
+
const groupLimitEntry = group === undefined ? undefined : this.#groupLimits.get(group);
|
|
5243
|
+
if (groupLimitEntry && groupLimitEntry.limit > minLimit && groupLimitEntry.mode === LimitMode.wait) {
|
|
5244
|
+
const groupCount = this.filter(t => t.group === group).length;
|
|
5245
|
+
if (groupCount >= groupLimitEntry.limit) {
|
|
5246
|
+
return true;
|
|
5247
|
+
}
|
|
5248
|
+
}
|
|
5249
|
+
if (groupLimitEntry && groupLimitEntry.limit > minLimit && groupLimitEntry.mode === LimitMode.delete) {
|
|
5250
|
+
const groupCountToRemove = this.filter(t => t.group === group).length + countOffset - groupLimitEntry.limit;
|
|
5251
|
+
if (groupCountToRemove > minCount) {
|
|
5252
|
+
this.removeQuantity(groupCountToRemove, group);
|
|
5253
|
+
}
|
|
5254
|
+
}
|
|
5255
|
+
if (globalLimit > minLimit && globalMode === LimitMode.delete) {
|
|
5256
|
+
const globalCountToRemove = this.count + countOffset - globalLimit;
|
|
5257
|
+
if (globalCountToRemove > minCount) {
|
|
5258
|
+
this.#removeAny(globalCountToRemove);
|
|
5259
|
+
}
|
|
5260
|
+
}
|
|
5261
|
+
return false;
|
|
5262
|
+
}
|
|
5163
5263
|
#createBuckets(zLayers) {
|
|
5164
5264
|
const bucketCount = Math.max(Math.floor(zLayers), one);
|
|
5165
5265
|
return Array.from({ length: bucketCount }, () => []);
|
|
@@ -5182,6 +5282,70 @@
|
|
|
5182
5282
|
}
|
|
5183
5283
|
return ((canvasSize.width * canvasSize.height) / (densityOptions.height * densityOptions.width * pxRatio ** squareExp));
|
|
5184
5284
|
}
|
|
5285
|
+
async #initDrawersAndUpdaters() {
|
|
5286
|
+
const container = this.#container;
|
|
5287
|
+
await container.initDrawersAndUpdaters();
|
|
5288
|
+
for (const drawer of container.effectDrawers.values()) {
|
|
5289
|
+
await drawer.init?.(container);
|
|
5290
|
+
}
|
|
5291
|
+
for (const drawer of container.shapeDrawers.values()) {
|
|
5292
|
+
await drawer.init?.(container);
|
|
5293
|
+
}
|
|
5294
|
+
}
|
|
5295
|
+
async #initPlugins() {
|
|
5296
|
+
await this.#initPluginsArrays();
|
|
5297
|
+
await this.#initDrawersAndUpdaters();
|
|
5298
|
+
let handled = false;
|
|
5299
|
+
const container = this.#container;
|
|
5300
|
+
for (const plugin of container.plugins) {
|
|
5301
|
+
handled = plugin.particlesInitialization?.() ?? handled;
|
|
5302
|
+
if (handled) {
|
|
5303
|
+
break;
|
|
5304
|
+
}
|
|
5305
|
+
}
|
|
5306
|
+
if (handled) {
|
|
5307
|
+
return;
|
|
5308
|
+
}
|
|
5309
|
+
const particlesOptions = container.actualOptions.particles, groups = particlesOptions.groups;
|
|
5310
|
+
for (const group in groups) {
|
|
5311
|
+
const groupOptions = groups[group];
|
|
5312
|
+
if (!groupOptions) {
|
|
5313
|
+
continue;
|
|
5314
|
+
}
|
|
5315
|
+
for (let i = this.count, j = 0; j < groupOptions.number.value && i < particlesOptions.number.value; i++, j++) {
|
|
5316
|
+
this.addParticle(undefined, groupOptions, group);
|
|
5317
|
+
}
|
|
5318
|
+
}
|
|
5319
|
+
for (let i = this.count; i < particlesOptions.number.value; i++) {
|
|
5320
|
+
this.addParticle();
|
|
5321
|
+
}
|
|
5322
|
+
}
|
|
5323
|
+
async #initPluginsArrays() {
|
|
5324
|
+
const container = this.#container;
|
|
5325
|
+
for (const plugin of container.plugins) {
|
|
5326
|
+
if (plugin.redrawInit) {
|
|
5327
|
+
await plugin.redrawInit();
|
|
5328
|
+
}
|
|
5329
|
+
if (plugin.checkParticlePosition) {
|
|
5330
|
+
this.checkParticlePositionPlugins.push(plugin);
|
|
5331
|
+
}
|
|
5332
|
+
if (plugin.update) {
|
|
5333
|
+
this.#updatePlugins.push(plugin);
|
|
5334
|
+
}
|
|
5335
|
+
if (plugin.particleUpdate) {
|
|
5336
|
+
this.#particleUpdatePlugins.push(plugin);
|
|
5337
|
+
}
|
|
5338
|
+
if (plugin.postUpdate) {
|
|
5339
|
+
this.#postUpdatePlugins.push(plugin);
|
|
5340
|
+
}
|
|
5341
|
+
if (plugin.particleReset) {
|
|
5342
|
+
this.#particleResetPlugins.push(plugin);
|
|
5343
|
+
}
|
|
5344
|
+
if (plugin.postParticleUpdate) {
|
|
5345
|
+
this.#postParticleUpdatePlugins.push(plugin);
|
|
5346
|
+
}
|
|
5347
|
+
}
|
|
5348
|
+
}
|
|
5185
5349
|
#insertParticleIntoBucket(particle) {
|
|
5186
5350
|
const bucketIndex = this.#getBucketIndex(particle.position.z), bucket = this.#zBuckets[bucketIndex];
|
|
5187
5351
|
if (!bucket) {
|
|
@@ -5190,12 +5354,15 @@
|
|
|
5190
5354
|
bucket.push(particle);
|
|
5191
5355
|
this.#particleBuckets.set(particle.id, bucketIndex);
|
|
5192
5356
|
}
|
|
5193
|
-
#
|
|
5357
|
+
#removeAny(quantity) {
|
|
5358
|
+
this.removeAt(minIndex, quantity, undefined, undefined, false);
|
|
5359
|
+
}
|
|
5360
|
+
#removeParticle(index, group, override, matchGroup = true) {
|
|
5194
5361
|
const particle = this.#array[index];
|
|
5195
5362
|
if (!particle) {
|
|
5196
5363
|
return false;
|
|
5197
5364
|
}
|
|
5198
|
-
if (particle.group !== group) {
|
|
5365
|
+
if (matchGroup && particle.group !== group) {
|
|
5199
5366
|
return false;
|
|
5200
5367
|
}
|
|
5201
5368
|
this.#array.splice(index, deleteCount);
|
|
@@ -5282,7 +5449,7 @@
|
|
|
5282
5449
|
particlesToDelete.add(particle);
|
|
5283
5450
|
continue;
|
|
5284
5451
|
}
|
|
5285
|
-
this
|
|
5452
|
+
this.#grid.insert(particle);
|
|
5286
5453
|
}
|
|
5287
5454
|
return particlesToDelete;
|
|
5288
5455
|
}
|
|
@@ -5369,6 +5536,7 @@
|
|
|
5369
5536
|
started;
|
|
5370
5537
|
zLayers;
|
|
5371
5538
|
#delay;
|
|
5539
|
+
#delayResolve;
|
|
5372
5540
|
#delayTimeout;
|
|
5373
5541
|
#delta = { value: 0, factor: 0 };
|
|
5374
5542
|
#dispatchCallback;
|
|
@@ -5458,7 +5626,6 @@
|
|
|
5458
5626
|
this.shapeDrawers = new Map();
|
|
5459
5627
|
this.particleUpdaters = [];
|
|
5460
5628
|
this.plugins.length = 0;
|
|
5461
|
-
this.#pluginManager.clearPlugins(this);
|
|
5462
5629
|
this.destroyed = true;
|
|
5463
5630
|
this.#onDestroy(remove);
|
|
5464
5631
|
this.dispatchEvent(EventType.containerDestroyed);
|
|
@@ -5511,31 +5678,14 @@
|
|
|
5511
5678
|
await this.initDrawersAndUpdaters();
|
|
5512
5679
|
this.#options = loadContainerOptions(this.#pluginManager, this, this.#initialSourceOptions, this.sourceOptions);
|
|
5513
5680
|
this.actualOptions = loadContainerOptions(this.#pluginManager, this, this.#options);
|
|
5514
|
-
this
|
|
5515
|
-
this.particleDestroyedPlugins.length = 0;
|
|
5516
|
-
this.particleCreatedPlugins.length = 0;
|
|
5517
|
-
this.particlePositionPlugins.length = 0;
|
|
5518
|
-
for (const [plugin, containerPlugin] of allContainerPlugins) {
|
|
5519
|
-
if (plugin.needsPlugin(this.actualOptions)) {
|
|
5520
|
-
this.plugins.push(containerPlugin);
|
|
5521
|
-
if (containerPlugin.particleCreated) {
|
|
5522
|
-
this.particleCreatedPlugins.push(containerPlugin);
|
|
5523
|
-
}
|
|
5524
|
-
if (containerPlugin.particleDestroyed) {
|
|
5525
|
-
this.particleDestroyedPlugins.push(containerPlugin);
|
|
5526
|
-
}
|
|
5527
|
-
if (containerPlugin.particlePosition) {
|
|
5528
|
-
this.particlePositionPlugins.push(containerPlugin);
|
|
5529
|
-
}
|
|
5530
|
-
}
|
|
5531
|
-
}
|
|
5681
|
+
this.#initPlugins(allContainerPlugins);
|
|
5532
5682
|
this.retina.init();
|
|
5533
5683
|
this.canvas.init();
|
|
5534
5684
|
this.updateActualOptions();
|
|
5535
5685
|
this.canvas.initBackground();
|
|
5536
5686
|
this.canvas.resize();
|
|
5537
5687
|
const { delay, duration, fpsLimit, smooth, zLayers } = this.actualOptions, hdrOptions = this.actualOptions.hdr;
|
|
5538
|
-
this.hdrMode = hdrOptions.mode;
|
|
5688
|
+
this.hdrMode = toEnumValue(HdrMode, hdrOptions.mode, HdrMode.standard);
|
|
5539
5689
|
this.peakNits = hdrOptions.peakNits;
|
|
5540
5690
|
this.zLayers = zLayers;
|
|
5541
5691
|
this.#duration = getRangeValue(duration) * millisecondsToSeconds;
|
|
@@ -5556,9 +5706,9 @@
|
|
|
5556
5706
|
}
|
|
5557
5707
|
async initDrawersAndUpdaters() {
|
|
5558
5708
|
const pluginManager = this.#pluginManager;
|
|
5559
|
-
this.effectDrawers = await
|
|
5560
|
-
this.shapeDrawers = await
|
|
5561
|
-
this.particleUpdaters = await
|
|
5709
|
+
this.effectDrawers = await getItemMapFromInitializer(this, pluginManager.initializers.effects);
|
|
5710
|
+
this.shapeDrawers = await getItemMapFromInitializer(this, pluginManager.initializers.shapes);
|
|
5711
|
+
this.particleUpdaters = await getItemsFromInitializer(this, pluginManager.initializers.updaters);
|
|
5562
5712
|
}
|
|
5563
5713
|
pause() {
|
|
5564
5714
|
if (!guardCheck(this)) {
|
|
@@ -5625,7 +5775,10 @@
|
|
|
5625
5775
|
await this.init();
|
|
5626
5776
|
this.started = true;
|
|
5627
5777
|
await new Promise(resolve => {
|
|
5778
|
+
this.#delayResolve = resolve;
|
|
5628
5779
|
const start = async () => {
|
|
5780
|
+
this.#delayTimeout = undefined;
|
|
5781
|
+
this.#delayResolve = undefined;
|
|
5629
5782
|
this.#eventListeners.addListeners();
|
|
5630
5783
|
for (const plugin of this.plugins) {
|
|
5631
5784
|
await plugin.start?.();
|
|
@@ -5641,9 +5794,11 @@
|
|
|
5641
5794
|
if (!guardCheck(this) || !this.started) {
|
|
5642
5795
|
return;
|
|
5643
5796
|
}
|
|
5644
|
-
if (this.#delayTimeout) {
|
|
5797
|
+
if (this.#delayTimeout !== undefined) {
|
|
5645
5798
|
clearTimeout(this.#delayTimeout);
|
|
5646
5799
|
this.#delayTimeout = undefined;
|
|
5800
|
+
this.#delayResolve?.();
|
|
5801
|
+
this.#delayResolve = undefined;
|
|
5647
5802
|
}
|
|
5648
5803
|
this.#firstStart = true;
|
|
5649
5804
|
this.started = false;
|
|
@@ -5669,6 +5824,27 @@
|
|
|
5669
5824
|
}
|
|
5670
5825
|
return refresh;
|
|
5671
5826
|
}
|
|
5827
|
+
#initPlugins(allContainerPlugins) {
|
|
5828
|
+
this.plugins.length = 0;
|
|
5829
|
+
this.particleDestroyedPlugins.length = 0;
|
|
5830
|
+
this.particleCreatedPlugins.length = 0;
|
|
5831
|
+
this.particlePositionPlugins.length = 0;
|
|
5832
|
+
for (const [plugin, containerPlugin] of allContainerPlugins) {
|
|
5833
|
+
if (!plugin.needsPlugin(this.actualOptions)) {
|
|
5834
|
+
continue;
|
|
5835
|
+
}
|
|
5836
|
+
this.plugins.push(containerPlugin);
|
|
5837
|
+
if (containerPlugin.particleCreated) {
|
|
5838
|
+
this.particleCreatedPlugins.push(containerPlugin);
|
|
5839
|
+
}
|
|
5840
|
+
if (containerPlugin.particleDestroyed) {
|
|
5841
|
+
this.particleDestroyedPlugins.push(containerPlugin);
|
|
5842
|
+
}
|
|
5843
|
+
if (containerPlugin.particlePosition) {
|
|
5844
|
+
this.particlePositionPlugins.push(containerPlugin);
|
|
5845
|
+
}
|
|
5846
|
+
}
|
|
5847
|
+
}
|
|
5672
5848
|
#nextFrame(timestamp) {
|
|
5673
5849
|
try {
|
|
5674
5850
|
if (!this.#smooth &&
|
|
@@ -5945,11 +6121,11 @@
|
|
|
5945
6121
|
}
|
|
5946
6122
|
}
|
|
5947
6123
|
async #init() {
|
|
5948
|
-
const
|
|
5949
|
-
if (!
|
|
6124
|
+
const pluginManager = this.#pluginManager;
|
|
6125
|
+
if (!pluginManager.initializers.pathGenerators) {
|
|
5950
6126
|
return;
|
|
5951
6127
|
}
|
|
5952
|
-
this.availablePathGenerators =
|
|
6128
|
+
this.availablePathGenerators = await getItemMapFromInitializer(this.#container, pluginManager.initializers.pathGenerators);
|
|
5953
6129
|
this.pathGenerators = new Map();
|
|
5954
6130
|
for (const pathGenerator of this.pathGenerators.values()) {
|
|
5955
6131
|
pathGenerator.init();
|
|
@@ -5965,6 +6141,7 @@
|
|
|
5965
6141
|
exports.loadAmbientPreset = loadAmbientPreset;
|
|
5966
6142
|
exports.tsParticles = tsParticles;
|
|
5967
6143
|
|
|
5968
|
-
}));
|
|
6144
|
+
})(g.__tsParticlesInternals.presets.ambient = g.__tsParticlesInternals.presets.ambient || {});
|
|
6145
|
+
})(typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : self);
|
|
6146
|
+
|
|
5969
6147
|
Object.assign(globalThis.window || globalThis, { loadAmbientPreset: (globalThis.__tsParticlesInternals.presets.ambient || {}).loadAmbientPreset });
|
|
5970
|
-
delete (globalThis.window || globalThis).tsparticlesInternalExports;
|