@tsparticles/preset-stars 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),
|
|
@@ -3269,21 +3337,28 @@
|
|
|
3269
3337
|
});
|
|
3270
3338
|
}
|
|
3271
3339
|
clear() {
|
|
3340
|
+
const visited = new Set();
|
|
3272
3341
|
for (const plugin of this.#canvasClearPlugins) {
|
|
3342
|
+
visited.add(plugin);
|
|
3273
3343
|
if (plugin.canvasClear?.() ?? false) {
|
|
3274
|
-
return;
|
|
3344
|
+
return plugin;
|
|
3275
3345
|
}
|
|
3276
3346
|
}
|
|
3277
3347
|
for (const layer of Object.values(DrawLayer)) {
|
|
3278
3348
|
if (typeof layer === "number") {
|
|
3279
3349
|
for (const plugin of this.#getLayerPlugins(layer)) {
|
|
3350
|
+
if (visited.has(plugin)) {
|
|
3351
|
+
continue;
|
|
3352
|
+
}
|
|
3353
|
+
visited.add(plugin);
|
|
3280
3354
|
if (plugin.canvasClear?.() ?? false) {
|
|
3281
|
-
return;
|
|
3355
|
+
return plugin;
|
|
3282
3356
|
}
|
|
3283
3357
|
}
|
|
3284
3358
|
}
|
|
3285
3359
|
}
|
|
3286
3360
|
this.canvasClear();
|
|
3361
|
+
return undefined;
|
|
3287
3362
|
}
|
|
3288
3363
|
destroy() {
|
|
3289
3364
|
this.stop();
|
|
@@ -3361,8 +3436,7 @@
|
|
|
3361
3436
|
});
|
|
3362
3437
|
}
|
|
3363
3438
|
drawParticles(delta) {
|
|
3364
|
-
const { particles, actualOptions } = this.#container;
|
|
3365
|
-
this.clear();
|
|
3439
|
+
const { particles, actualOptions } = this.#container, clearedPlugin = this.clear();
|
|
3366
3440
|
particles.update(delta);
|
|
3367
3441
|
this.draw(ctx => {
|
|
3368
3442
|
const width = this.#canvasManager.size.width, height = this.#canvasManager.size.height;
|
|
@@ -3384,7 +3458,9 @@
|
|
|
3384
3458
|
}
|
|
3385
3459
|
}
|
|
3386
3460
|
for (const plugin of this.#getLayerPlugins(DrawLayer.BackgroundMask)) {
|
|
3387
|
-
plugin
|
|
3461
|
+
if (plugin !== clearedPlugin) {
|
|
3462
|
+
plugin.canvasPaint?.();
|
|
3463
|
+
}
|
|
3388
3464
|
}
|
|
3389
3465
|
for (const plugin of this.#getLayerPlugins(DrawLayer.CanvasSetup)) {
|
|
3390
3466
|
plugin.drawSettingsSetup?.(ctx, delta);
|
|
@@ -3416,35 +3492,7 @@
|
|
|
3416
3492
|
this.#layers[layer] = [];
|
|
3417
3493
|
}
|
|
3418
3494
|
}
|
|
3419
|
-
|
|
3420
|
-
if (plugin.particleFillColor ?? plugin.particleStrokeColor) {
|
|
3421
|
-
this.#colorPlugins.push(plugin);
|
|
3422
|
-
}
|
|
3423
|
-
if (plugin.drawParticle) {
|
|
3424
|
-
this.#drawParticlePlugins.push(plugin);
|
|
3425
|
-
}
|
|
3426
|
-
if (plugin.drawParticleSetup) {
|
|
3427
|
-
this.#drawParticlesSetupPlugins.push(plugin);
|
|
3428
|
-
}
|
|
3429
|
-
if (plugin.drawParticleCleanup) {
|
|
3430
|
-
this.#drawParticlesCleanupPlugins.push(plugin);
|
|
3431
|
-
}
|
|
3432
|
-
if (plugin.canvasClear) {
|
|
3433
|
-
this.#canvasClearPlugins.push(plugin);
|
|
3434
|
-
}
|
|
3435
|
-
if (plugin.canvasPaint) {
|
|
3436
|
-
this.#getLayerPlugins(DrawLayer.BackgroundMask).push(plugin);
|
|
3437
|
-
}
|
|
3438
|
-
if (plugin.drawSettingsSetup) {
|
|
3439
|
-
this.#getLayerPlugins(DrawLayer.CanvasSetup).push(plugin);
|
|
3440
|
-
}
|
|
3441
|
-
if (plugin.draw) {
|
|
3442
|
-
this.#getLayerPlugins(DrawLayer.PluginContent).push(plugin);
|
|
3443
|
-
}
|
|
3444
|
-
if (plugin.clearDraw ?? plugin.drawSettingsCleanup) {
|
|
3445
|
-
this.#getLayerPlugins(DrawLayer.CanvasCleanup).push(plugin);
|
|
3446
|
-
}
|
|
3447
|
-
}
|
|
3495
|
+
this.#initPluginsArray();
|
|
3448
3496
|
}
|
|
3449
3497
|
initUpdaters() {
|
|
3450
3498
|
this.#preDrawUpdaters = [];
|
|
@@ -3653,6 +3701,45 @@
|
|
|
3653
3701
|
this.#reusablePluginColors[sColorIndex] = sColor;
|
|
3654
3702
|
return this.#reusablePluginColors;
|
|
3655
3703
|
}
|
|
3704
|
+
#initLayerPlugin(plugin) {
|
|
3705
|
+
const layerMap = [
|
|
3706
|
+
[DrawLayer.BackgroundMask, !!plugin.canvasPaint],
|
|
3707
|
+
[DrawLayer.CanvasSetup, !!plugin.drawSettingsSetup],
|
|
3708
|
+
[DrawLayer.PluginContent, !!plugin.draw],
|
|
3709
|
+
[DrawLayer.CanvasCleanup, !!(plugin.clearDraw ?? plugin.drawSettingsCleanup)],
|
|
3710
|
+
];
|
|
3711
|
+
for (const [layer, active] of layerMap) {
|
|
3712
|
+
if (active) {
|
|
3713
|
+
this.#layers[layer].push(plugin);
|
|
3714
|
+
}
|
|
3715
|
+
}
|
|
3716
|
+
}
|
|
3717
|
+
#initPluginsArray() {
|
|
3718
|
+
for (const plugin of this.#container.plugins) {
|
|
3719
|
+
if (plugin.particleFillColor ?? plugin.particleStrokeColor) {
|
|
3720
|
+
this.#colorPlugins.push(plugin);
|
|
3721
|
+
}
|
|
3722
|
+
if (plugin.drawParticle) {
|
|
3723
|
+
this.#drawParticlePlugins.push(plugin);
|
|
3724
|
+
}
|
|
3725
|
+
if (plugin.drawParticleSetup) {
|
|
3726
|
+
this.#drawParticlesSetupPlugins.push(plugin);
|
|
3727
|
+
}
|
|
3728
|
+
if (plugin.drawParticleCleanup) {
|
|
3729
|
+
this.#drawParticlesCleanupPlugins.push(plugin);
|
|
3730
|
+
}
|
|
3731
|
+
if (plugin.canvasClear) {
|
|
3732
|
+
this.#canvasClearPlugins.push(plugin);
|
|
3733
|
+
}
|
|
3734
|
+
this.#initLayerPlugin(plugin);
|
|
3735
|
+
}
|
|
3736
|
+
}
|
|
3737
|
+
#isSupportedElement(element) {
|
|
3738
|
+
return ((typeof HTMLCanvasElement !== "undefined" && element instanceof HTMLCanvasElement) ||
|
|
3739
|
+
(typeof OffscreenCanvas !== "undefined" && element instanceof OffscreenCanvas) ||
|
|
3740
|
+
(typeof HTMLVideoElement !== "undefined" && element instanceof HTMLVideoElement) ||
|
|
3741
|
+
(typeof HTMLImageElement !== "undefined" && element instanceof HTMLImageElement));
|
|
3742
|
+
}
|
|
3656
3743
|
#resolveBackgroundElement() {
|
|
3657
3744
|
const background = this.#container.actualOptions.background;
|
|
3658
3745
|
this.#backgroundElement = null;
|
|
@@ -3662,9 +3749,7 @@
|
|
|
3662
3749
|
if (typeof background.element === "string") {
|
|
3663
3750
|
if (typeof document !== "undefined") {
|
|
3664
3751
|
const node = document.querySelector(background.element);
|
|
3665
|
-
if (
|
|
3666
|
-
(typeof HTMLVideoElement !== "undefined" && node instanceof HTMLVideoElement) ||
|
|
3667
|
-
(typeof HTMLImageElement !== "undefined" && node instanceof HTMLImageElement)) {
|
|
3752
|
+
if (node && this.#isSupportedElement(node)) {
|
|
3668
3753
|
this.#backgroundElement = node;
|
|
3669
3754
|
}
|
|
3670
3755
|
else if (node) {
|
|
@@ -3675,10 +3760,7 @@
|
|
|
3675
3760
|
}
|
|
3676
3761
|
}
|
|
3677
3762
|
}
|
|
3678
|
-
else if ((
|
|
3679
|
-
(typeof OffscreenCanvas !== "undefined" && background.element instanceof OffscreenCanvas) ||
|
|
3680
|
-
(typeof HTMLVideoElement !== "undefined" && background.element instanceof HTMLVideoElement) ||
|
|
3681
|
-
(typeof HTMLImageElement !== "undefined" && background.element instanceof HTMLImageElement)) {
|
|
3763
|
+
else if (this.#isSupportedElement(background.element)) {
|
|
3682
3764
|
this.#backgroundElement = background.element;
|
|
3683
3765
|
}
|
|
3684
3766
|
}
|
|
@@ -3696,7 +3778,7 @@
|
|
|
3696
3778
|
return transferredCanvas;
|
|
3697
3779
|
}
|
|
3698
3780
|
if (typeof canvas.transferControlToOffscreen !== "function") {
|
|
3699
|
-
throw new TypeError(
|
|
3781
|
+
throw new TypeError(getErrorMessage(ErrorCodes$1.offscreenCanvasUnsupported));
|
|
3700
3782
|
}
|
|
3701
3783
|
try {
|
|
3702
3784
|
const offscreenCanvas = canvas.transferControlToOffscreen();
|
|
@@ -3704,10 +3786,16 @@
|
|
|
3704
3786
|
return offscreenCanvas;
|
|
3705
3787
|
}
|
|
3706
3788
|
catch {
|
|
3707
|
-
throw new TypeError(
|
|
3789
|
+
throw new TypeError(getErrorMessage(ErrorCodes$1.offscreenCanvasTransferFailed));
|
|
3708
3790
|
}
|
|
3709
3791
|
}, isHtmlCanvasElement = (canvas) => {
|
|
3710
3792
|
return typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement;
|
|
3793
|
+
}, getEffectiveColorSpace = (context) => {
|
|
3794
|
+
if (!context) {
|
|
3795
|
+
return undefined;
|
|
3796
|
+
}
|
|
3797
|
+
const colorInfo = context;
|
|
3798
|
+
return colorInfo.getContextAttributes?.().colorSpace ?? undefined;
|
|
3711
3799
|
};
|
|
3712
3800
|
function setStyle(canvas, style, important = false) {
|
|
3713
3801
|
if (!style) {
|
|
@@ -3832,7 +3920,7 @@
|
|
|
3832
3920
|
const elementStyle = element.style, color = rangeColorToRgb(this.#pluginManager, background.color);
|
|
3833
3921
|
if (color) {
|
|
3834
3922
|
const hdrOptions = container.actualOptions.hdr;
|
|
3835
|
-
elementStyle.backgroundColor = getStyleFromRgb(color, container.hdr, background.opacity, hdrOptions.peakNits, hdrOptions.mode);
|
|
3923
|
+
elementStyle.backgroundColor = getStyleFromRgb(color, container.hdr, background.opacity, hdrOptions.peakNits, toEnumValue(HdrMode, hdrOptions.mode, HdrMode.standard));
|
|
3836
3924
|
}
|
|
3837
3925
|
else {
|
|
3838
3926
|
elementStyle.backgroundColor = "";
|
|
@@ -3952,11 +4040,11 @@
|
|
|
3952
4040
|
const container = this.#container, canSupportHdr = container.actualOptions.hdr.enable &&
|
|
3953
4041
|
safeMatchMedia("(color-gamut: p3)")?.matches &&
|
|
3954
4042
|
safeMatchMedia("(dynamic-range: high)")?.matches;
|
|
3955
|
-
container.
|
|
3956
|
-
container.hdrMode = container.actualOptions.hdr.mode;
|
|
4043
|
+
container.hdrMode = toEnumValue(HdrMode, container.actualOptions.hdr.mode, HdrMode.standard);
|
|
3957
4044
|
container.peakNits = container.actualOptions.hdr.peakNits;
|
|
3958
4045
|
const renderCanvas = this.renderCanvas;
|
|
3959
4046
|
if (!renderCanvas) {
|
|
4047
|
+
container.hdr = canSupportHdr ?? false;
|
|
3960
4048
|
return;
|
|
3961
4049
|
}
|
|
3962
4050
|
this.render.setContextSettings({
|
|
@@ -3975,7 +4063,6 @@
|
|
|
3975
4063
|
context = null;
|
|
3976
4064
|
}
|
|
3977
4065
|
if (canSupportHdr && !context) {
|
|
3978
|
-
container.hdr = false;
|
|
3979
4066
|
const sdrSettings = {
|
|
3980
4067
|
alpha: true,
|
|
3981
4068
|
desynchronized: true,
|
|
@@ -3991,11 +4078,16 @@
|
|
|
3991
4078
|
}
|
|
3992
4079
|
}
|
|
3993
4080
|
this.render.setContext(context);
|
|
4081
|
+
if (context) {
|
|
4082
|
+
const effectiveColorSpace = getEffectiveColorSpace(context);
|
|
4083
|
+
if (effectiveColorSpace !== undefined) {
|
|
4084
|
+
container.hdr = effectiveColorSpace === "display-p3";
|
|
4085
|
+
}
|
|
4086
|
+
}
|
|
3994
4087
|
}
|
|
3995
4088
|
#initHdrListeners() {
|
|
3996
4089
|
this.#removeHdrListeners();
|
|
3997
4090
|
const p3Query = safeMatchMedia("(color-gamut: p3)"), hdrQuery = safeMatchMedia("(dynamic-range: high)"), handleChange = () => {
|
|
3998
|
-
this.#recreateRenderCanvas();
|
|
3999
4091
|
this.#initContext();
|
|
4000
4092
|
this.initBackground();
|
|
4001
4093
|
}, listeners = [];
|
|
@@ -4031,16 +4123,6 @@
|
|
|
4031
4123
|
element.style.setProperty(key, value, "important");
|
|
4032
4124
|
}
|
|
4033
4125
|
}
|
|
4034
|
-
#recreateRenderCanvas() {
|
|
4035
|
-
const renderCanvas = this.renderCanvas;
|
|
4036
|
-
if (!renderCanvas) {
|
|
4037
|
-
return;
|
|
4038
|
-
}
|
|
4039
|
-
if (this.domElement) {
|
|
4040
|
-
return;
|
|
4041
|
-
}
|
|
4042
|
-
this.renderCanvas = new OffscreenCanvas(renderCanvas.width, renderCanvas.height);
|
|
4043
|
-
}
|
|
4044
4126
|
#removeHdrListeners() {
|
|
4045
4127
|
if (!this.#hdrMediaListeners) {
|
|
4046
4128
|
return;
|
|
@@ -4112,6 +4194,10 @@
|
|
|
4112
4194
|
this.#manageListeners(true);
|
|
4113
4195
|
}
|
|
4114
4196
|
removeListeners() {
|
|
4197
|
+
if (this.#resizeTimeout !== undefined) {
|
|
4198
|
+
clearTimeout(this.#resizeTimeout);
|
|
4199
|
+
this.#resizeTimeout = undefined;
|
|
4200
|
+
}
|
|
4115
4201
|
this.#manageListeners(false);
|
|
4116
4202
|
}
|
|
4117
4203
|
#handleVisibilityChange() {
|
|
@@ -4139,8 +4225,7 @@
|
|
|
4139
4225
|
this.#resizeTimeout = undefined;
|
|
4140
4226
|
}
|
|
4141
4227
|
const handleResize = async () => {
|
|
4142
|
-
|
|
4143
|
-
await canvas.windowResize();
|
|
4228
|
+
await this.#container.canvas.windowResize();
|
|
4144
4229
|
};
|
|
4145
4230
|
this.#resizeTimeout = setTimeout(() => void handleResize(), this.#container.actualOptions.resize.delay * millisecondsToSeconds);
|
|
4146
4231
|
}
|
|
@@ -4168,8 +4253,8 @@
|
|
|
4168
4253
|
}
|
|
4169
4254
|
else if (!this.#resizeObserver && add && canvasEl) {
|
|
4170
4255
|
this.#resizeObserver = new ResizeObserver((entries) => {
|
|
4171
|
-
const
|
|
4172
|
-
if (!
|
|
4256
|
+
const res = entries.some(e => e.target === canvasEl);
|
|
4257
|
+
if (!res) {
|
|
4173
4258
|
return;
|
|
4174
4259
|
}
|
|
4175
4260
|
this.#handleWindowResize();
|
|
@@ -4433,10 +4518,10 @@
|
|
|
4433
4518
|
return this.#modifiers.find(m => m.id === id);
|
|
4434
4519
|
}
|
|
4435
4520
|
getOpacity() {
|
|
4436
|
-
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
|
|
4437
|
-
this.#cachedOpacityData.fillOpacity = fillOpacity;
|
|
4521
|
+
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;
|
|
4522
|
+
this.#cachedOpacityData.fillOpacity = this.fillOpacity ?? defaultOpacity$1;
|
|
4438
4523
|
this.#cachedOpacityData.opacity = opacity * zOpacityFactor;
|
|
4439
|
-
this.#cachedOpacityData.strokeOpacity = strokeOpacity;
|
|
4524
|
+
this.#cachedOpacityData.strokeOpacity = this.strokeOpacity ?? defaultOpacity$1;
|
|
4440
4525
|
return this.#cachedOpacityData;
|
|
4441
4526
|
}
|
|
4442
4527
|
getPosition() {
|
|
@@ -4683,7 +4768,7 @@
|
|
|
4683
4768
|
#initPosition(position) {
|
|
4684
4769
|
const container = this.#container, zIndexValue = Math.floor(getRangeValue(this.options.zIndex.value)), initialPosition = this.#calcPosition(position, clamp(zIndexValue, minZ, container.zLayers));
|
|
4685
4770
|
if (!initialPosition) {
|
|
4686
|
-
throw new Error(
|
|
4771
|
+
throw new Error(getErrorMessage(ErrorCodes$1.particlePositionNotFound));
|
|
4687
4772
|
}
|
|
4688
4773
|
this.position = initialPosition;
|
|
4689
4774
|
this.initialPosition = this.position.copy();
|
|
@@ -4732,6 +4817,12 @@
|
|
|
4732
4817
|
this.#circlePoolIdx = 0;
|
|
4733
4818
|
this.#rectanglePoolIdx = 0;
|
|
4734
4819
|
}
|
|
4820
|
+
get cellSize() {
|
|
4821
|
+
return this.#cellSize;
|
|
4822
|
+
}
|
|
4823
|
+
set cellSize(value) {
|
|
4824
|
+
this.#pendingCellSize = value;
|
|
4825
|
+
}
|
|
4735
4826
|
clear() {
|
|
4736
4827
|
this.#cells.clear();
|
|
4737
4828
|
const pendingCellSize = this.#pendingCellSize;
|
|
@@ -4755,40 +4846,46 @@
|
|
|
4755
4846
|
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);
|
|
4756
4847
|
for (let cx = minCellX; cx <= maxCellX; cx++) {
|
|
4757
4848
|
for (let cy = minCellY; cy <= maxCellY; cy++) {
|
|
4758
|
-
|
|
4759
|
-
if (!cellParticles) {
|
|
4760
|
-
continue;
|
|
4761
|
-
}
|
|
4762
|
-
for (const p of cellParticles) {
|
|
4763
|
-
if (check && !check(p)) {
|
|
4764
|
-
continue;
|
|
4765
|
-
}
|
|
4766
|
-
if (range.contains(p.getPosition())) {
|
|
4767
|
-
out.push(p);
|
|
4768
|
-
}
|
|
4769
|
-
}
|
|
4849
|
+
this.#queryCell(cx, cy, range, check, out);
|
|
4770
4850
|
}
|
|
4771
4851
|
}
|
|
4772
4852
|
return out;
|
|
4773
4853
|
}
|
|
4774
4854
|
queryCircle(position, radius, check, out = []) {
|
|
4775
|
-
const circle = this.#acquireCircle(position.x, position.y, radius)
|
|
4776
|
-
|
|
4777
|
-
|
|
4855
|
+
const circle = this.#acquireCircle(position.x, position.y, radius);
|
|
4856
|
+
try {
|
|
4857
|
+
return this.query(circle, check, out);
|
|
4858
|
+
}
|
|
4859
|
+
finally {
|
|
4860
|
+
this.#circlePoolIdx--;
|
|
4861
|
+
}
|
|
4778
4862
|
}
|
|
4779
4863
|
queryRectangle(position, size, check, out = []) {
|
|
4780
|
-
const rect = this.#acquireRectangle(position.x, position.y, size.width, size.height)
|
|
4781
|
-
|
|
4782
|
-
|
|
4783
|
-
|
|
4784
|
-
|
|
4785
|
-
|
|
4864
|
+
const rect = this.#acquireRectangle(position.x, position.y, size.width, size.height);
|
|
4865
|
+
try {
|
|
4866
|
+
return this.query(rect, check, out);
|
|
4867
|
+
}
|
|
4868
|
+
finally {
|
|
4869
|
+
this.#rectanglePoolIdx--;
|
|
4870
|
+
}
|
|
4786
4871
|
}
|
|
4787
4872
|
#acquireCircle(x, y, r) {
|
|
4788
|
-
|
|
4873
|
+
const idx = this.#circlePoolIdx++;
|
|
4874
|
+
let circle = this.#circlePool[idx];
|
|
4875
|
+
if (!circle) {
|
|
4876
|
+
circle = new Circle(x, y, r);
|
|
4877
|
+
this.#circlePool[idx] = circle;
|
|
4878
|
+
}
|
|
4879
|
+
return circle.reset(x, y, r);
|
|
4789
4880
|
}
|
|
4790
4881
|
#acquireRectangle(x, y, w, h) {
|
|
4791
|
-
|
|
4882
|
+
const idx = this.#rectanglePoolIdx++;
|
|
4883
|
+
let rectangle = this.#rectanglePool[idx];
|
|
4884
|
+
if (!rectangle) {
|
|
4885
|
+
rectangle = new Rectangle(x, y, w, h);
|
|
4886
|
+
this.#rectanglePool[idx] = rectangle;
|
|
4887
|
+
}
|
|
4888
|
+
return rectangle.reset(x, y, w, h);
|
|
4792
4889
|
}
|
|
4793
4890
|
#cellKeyFromCoords(x, y) {
|
|
4794
4891
|
const cellX = Math.floor(x / this.#cellSize), cellY = Math.floor(y / this.#cellSize);
|
|
@@ -4815,17 +4912,27 @@
|
|
|
4815
4912
|
}
|
|
4816
4913
|
return null;
|
|
4817
4914
|
}
|
|
4818
|
-
#
|
|
4819
|
-
|
|
4820
|
-
|
|
4915
|
+
#queryCell(cx, cy, range, check, out) {
|
|
4916
|
+
const cellParticles = this.#cells.get(`${cx}_${cy}`);
|
|
4917
|
+
if (!cellParticles) {
|
|
4918
|
+
return;
|
|
4919
|
+
}
|
|
4920
|
+
for (const p of cellParticles) {
|
|
4921
|
+
if (check && !check(p)) {
|
|
4922
|
+
continue;
|
|
4923
|
+
}
|
|
4924
|
+
if (range.contains(p.getPosition())) {
|
|
4925
|
+
out.push(p);
|
|
4926
|
+
}
|
|
4927
|
+
}
|
|
4821
4928
|
}
|
|
4822
4929
|
}
|
|
4823
4930
|
|
|
4824
4931
|
class ParticlesManager {
|
|
4825
4932
|
checkParticlePositionPlugins;
|
|
4826
|
-
grid;
|
|
4827
4933
|
#array;
|
|
4828
4934
|
#container;
|
|
4935
|
+
#grid;
|
|
4829
4936
|
#groupLimits;
|
|
4830
4937
|
#limit;
|
|
4831
4938
|
#nextId;
|
|
@@ -4849,7 +4956,7 @@
|
|
|
4849
4956
|
this.#groupLimits = new Map();
|
|
4850
4957
|
this.#particleBuckets = new Map();
|
|
4851
4958
|
this.#zBuckets = this.#createBuckets(this.#container.zLayers);
|
|
4852
|
-
this
|
|
4959
|
+
this.#grid = new SpatialHashGrid(spatialHashGridCellSize);
|
|
4853
4960
|
this.checkParticlePositionPlugins = [];
|
|
4854
4961
|
this.#particleResetPlugins = [];
|
|
4855
4962
|
this.#particleUpdatePlugins = [];
|
|
@@ -4860,23 +4967,12 @@
|
|
|
4860
4967
|
get count() {
|
|
4861
4968
|
return this.#array.length;
|
|
4862
4969
|
}
|
|
4970
|
+
get grid() {
|
|
4971
|
+
return this.#grid;
|
|
4972
|
+
}
|
|
4863
4973
|
addParticle(position, overrideOptions, group, initializer) {
|
|
4864
|
-
|
|
4865
|
-
|
|
4866
|
-
switch (limitMode) {
|
|
4867
|
-
case LimitMode.delete: {
|
|
4868
|
-
const countToRemove = currentCount + countOffset - limit;
|
|
4869
|
-
if (countToRemove > minCount) {
|
|
4870
|
-
this.removeQuantity(countToRemove);
|
|
4871
|
-
}
|
|
4872
|
-
break;
|
|
4873
|
-
}
|
|
4874
|
-
case LimitMode.wait:
|
|
4875
|
-
if (currentCount >= limit) {
|
|
4876
|
-
return;
|
|
4877
|
-
}
|
|
4878
|
-
break;
|
|
4879
|
-
}
|
|
4974
|
+
if (this.#checkAndApplyLimits(group, this.count)) {
|
|
4975
|
+
return;
|
|
4880
4976
|
}
|
|
4881
4977
|
try {
|
|
4882
4978
|
const particle = this.#pool.pop() ?? new Particle(this.#pluginManager, this.#container);
|
|
@@ -4940,7 +5036,7 @@
|
|
|
4940
5036
|
return this.#array[index];
|
|
4941
5037
|
}
|
|
4942
5038
|
async init() {
|
|
4943
|
-
const container = this.#container
|
|
5039
|
+
const container = this.#container;
|
|
4944
5040
|
this.checkParticlePositionPlugins = [];
|
|
4945
5041
|
this.#updatePlugins = [];
|
|
4946
5042
|
this.#particleUpdatePlugins = [];
|
|
@@ -4949,59 +5045,16 @@
|
|
|
4949
5045
|
this.#postParticleUpdatePlugins = [];
|
|
4950
5046
|
this.#particleBuckets.clear();
|
|
4951
5047
|
this.#resetBuckets(container.zLayers);
|
|
4952
|
-
this
|
|
4953
|
-
|
|
4954
|
-
|
|
4955
|
-
|
|
4956
|
-
|
|
4957
|
-
if (
|
|
4958
|
-
this
|
|
4959
|
-
}
|
|
4960
|
-
if (plugin.update) {
|
|
4961
|
-
this.#updatePlugins.push(plugin);
|
|
4962
|
-
}
|
|
4963
|
-
if (plugin.particleUpdate) {
|
|
4964
|
-
this.#particleUpdatePlugins.push(plugin);
|
|
4965
|
-
}
|
|
4966
|
-
if (plugin.postUpdate) {
|
|
4967
|
-
this.#postUpdatePlugins.push(plugin);
|
|
4968
|
-
}
|
|
4969
|
-
if (plugin.particleReset) {
|
|
4970
|
-
this.#particleResetPlugins.push(plugin);
|
|
4971
|
-
}
|
|
4972
|
-
if (plugin.postParticleUpdate) {
|
|
4973
|
-
this.#postParticleUpdatePlugins.push(plugin);
|
|
4974
|
-
}
|
|
4975
|
-
}
|
|
4976
|
-
await this.#container.initDrawersAndUpdaters();
|
|
4977
|
-
for (const drawer of this.#container.effectDrawers.values()) {
|
|
4978
|
-
await drawer.init?.(container);
|
|
4979
|
-
}
|
|
4980
|
-
for (const drawer of this.#container.shapeDrawers.values()) {
|
|
4981
|
-
await drawer.init?.(container);
|
|
4982
|
-
}
|
|
4983
|
-
let handled = false;
|
|
4984
|
-
for (const plugin of container.plugins) {
|
|
4985
|
-
handled = plugin.particlesInitialization?.() ?? handled;
|
|
4986
|
-
if (handled) {
|
|
4987
|
-
break;
|
|
4988
|
-
}
|
|
4989
|
-
}
|
|
4990
|
-
if (!handled) {
|
|
4991
|
-
const particlesOptions = options.particles, groups = particlesOptions.groups;
|
|
4992
|
-
for (const group in groups) {
|
|
4993
|
-
const groupOptions = groups[group];
|
|
4994
|
-
if (!groupOptions) {
|
|
4995
|
-
continue;
|
|
4996
|
-
}
|
|
4997
|
-
for (let i = this.count, j = 0; j < groupOptions.number.value && i < particlesOptions.number.value; i++, j++) {
|
|
4998
|
-
this.addParticle(undefined, groupOptions, group);
|
|
4999
|
-
}
|
|
5000
|
-
}
|
|
5001
|
-
for (let i = this.count; i < particlesOptions.number.value; i++) {
|
|
5002
|
-
this.addParticle();
|
|
5048
|
+
this.#grid = new SpatialHashGrid(spatialHashGridCellSize * container.retina.pixelRatio);
|
|
5049
|
+
this.#applyLimits(container.actualOptions.particles);
|
|
5050
|
+
const particlesOptions = container.actualOptions.particles, groups = particlesOptions.groups;
|
|
5051
|
+
for (const group in groups) {
|
|
5052
|
+
const groupData = groups[group];
|
|
5053
|
+
if (groupData) {
|
|
5054
|
+
this.#applyLimits(loadParticlesOptions(this.#pluginManager, this.#container, groupData), group, groupData);
|
|
5003
5055
|
}
|
|
5004
5056
|
}
|
|
5057
|
+
await this.#initPlugins();
|
|
5005
5058
|
}
|
|
5006
5059
|
push(nb, position, overrideOptions, group) {
|
|
5007
5060
|
for (let i = 0; i < nb; i++) {
|
|
@@ -5016,13 +5069,13 @@
|
|
|
5016
5069
|
remove(particle, group, override) {
|
|
5017
5070
|
this.removeAt(this.#array.indexOf(particle), undefined, group, override);
|
|
5018
5071
|
}
|
|
5019
|
-
removeAt(index, quantity = defaultRemoveQuantity, group, override) {
|
|
5072
|
+
removeAt(index, quantity = defaultRemoveQuantity, group, override, matchGroup = true) {
|
|
5020
5073
|
if (index < minIndex || index > this.count) {
|
|
5021
5074
|
return;
|
|
5022
5075
|
}
|
|
5023
5076
|
let deleted = 0;
|
|
5024
5077
|
for (let i = index; deleted < quantity && i < this.count; i++) {
|
|
5025
|
-
if (this.#removeParticle(i, group, override)) {
|
|
5078
|
+
if (this.#removeParticle(i, group, override, matchGroup)) {
|
|
5026
5079
|
i--;
|
|
5027
5080
|
deleted++;
|
|
5028
5081
|
}
|
|
@@ -5053,7 +5106,7 @@
|
|
|
5053
5106
|
this.#resizeFactor = factor;
|
|
5054
5107
|
}
|
|
5055
5108
|
update(delta) {
|
|
5056
|
-
this
|
|
5109
|
+
this.#grid.clear();
|
|
5057
5110
|
for (const plugin of this.#updatePlugins) {
|
|
5058
5111
|
plugin.update?.(delta);
|
|
5059
5112
|
}
|
|
@@ -5064,7 +5117,7 @@
|
|
|
5064
5117
|
this.#updateParticlesPhase2(delta, particlesToDelete);
|
|
5065
5118
|
if (particlesToDelete.size) {
|
|
5066
5119
|
for (const particle of particlesToDelete) {
|
|
5067
|
-
this.remove(particle);
|
|
5120
|
+
this.remove(particle, particle.group);
|
|
5068
5121
|
}
|
|
5069
5122
|
}
|
|
5070
5123
|
this.#resizeFactor = undefined;
|
|
@@ -5075,12 +5128,7 @@
|
|
|
5075
5128
|
#applyDensity(options, pluginsCount, group, groupOptions) {
|
|
5076
5129
|
const numberOptions = options.number;
|
|
5077
5130
|
if (!numberOptions.density.enable) {
|
|
5078
|
-
|
|
5079
|
-
this.#limit = numberOptions.limit.value;
|
|
5080
|
-
}
|
|
5081
|
-
else if (groupOptions?.number.limit.value ?? numberOptions.limit.value) {
|
|
5082
|
-
this.#groupLimits.set(group, groupOptions?.number.limit.value ?? numberOptions.limit.value);
|
|
5083
|
-
}
|
|
5131
|
+
this.#applyLimits(options, group, groupOptions);
|
|
5084
5132
|
return;
|
|
5085
5133
|
}
|
|
5086
5134
|
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);
|
|
@@ -5088,7 +5136,10 @@
|
|
|
5088
5136
|
this.#limit = numberOptions.limit.value * densityFactor;
|
|
5089
5137
|
}
|
|
5090
5138
|
else {
|
|
5091
|
-
this.#groupLimits.set(group,
|
|
5139
|
+
this.#groupLimits.set(group, {
|
|
5140
|
+
limit: numberOptions.limit.value * densityFactor,
|
|
5141
|
+
mode: toEnumValue(LimitMode, numberOptions.limit.mode, LimitMode.delete),
|
|
5142
|
+
});
|
|
5092
5143
|
}
|
|
5093
5144
|
if (particlesCount < particlesNumber) {
|
|
5094
5145
|
this.push(Math.abs(particlesNumber - particlesCount), undefined, options, group);
|
|
@@ -5097,6 +5148,55 @@
|
|
|
5097
5148
|
this.removeQuantity(particlesCount - particlesNumber, group);
|
|
5098
5149
|
}
|
|
5099
5150
|
}
|
|
5151
|
+
#applyLimits(options, group, groupOptions) {
|
|
5152
|
+
if (group === undefined) {
|
|
5153
|
+
this.#limit = options.number.limit.value;
|
|
5154
|
+
const groups = this.#container.actualOptions.particles.groups;
|
|
5155
|
+
for (const existingGroup of this.#groupLimits.keys()) {
|
|
5156
|
+
if (!(existingGroup in groups)) {
|
|
5157
|
+
this.#groupLimits.delete(existingGroup);
|
|
5158
|
+
}
|
|
5159
|
+
}
|
|
5160
|
+
}
|
|
5161
|
+
else {
|
|
5162
|
+
const limitValue = groupOptions?.number?.limit?.value ?? options.number.limit.value;
|
|
5163
|
+
if (limitValue > minLimit) {
|
|
5164
|
+
this.#groupLimits.set(group, {
|
|
5165
|
+
limit: limitValue,
|
|
5166
|
+
mode: toEnumValue(LimitMode, groupOptions?.number?.limit?.mode ?? options.number.limit.mode, LimitMode.delete),
|
|
5167
|
+
});
|
|
5168
|
+
}
|
|
5169
|
+
else {
|
|
5170
|
+
this.#groupLimits.delete(group);
|
|
5171
|
+
}
|
|
5172
|
+
}
|
|
5173
|
+
}
|
|
5174
|
+
#checkAndApplyLimits(group, currentCount) {
|
|
5175
|
+
const globalLimit = this.#limit, globalMode = this.#container.actualOptions.particles.number.limit.mode;
|
|
5176
|
+
if (globalLimit > minLimit && globalMode === LimitMode.wait && currentCount >= globalLimit) {
|
|
5177
|
+
return true;
|
|
5178
|
+
}
|
|
5179
|
+
const groupLimitEntry = group === undefined ? undefined : this.#groupLimits.get(group);
|
|
5180
|
+
if (groupLimitEntry && groupLimitEntry.limit > minLimit && groupLimitEntry.mode === LimitMode.wait) {
|
|
5181
|
+
const groupCount = this.filter(t => t.group === group).length;
|
|
5182
|
+
if (groupCount >= groupLimitEntry.limit) {
|
|
5183
|
+
return true;
|
|
5184
|
+
}
|
|
5185
|
+
}
|
|
5186
|
+
if (groupLimitEntry && groupLimitEntry.limit > minLimit && groupLimitEntry.mode === LimitMode.delete) {
|
|
5187
|
+
const groupCountToRemove = this.filter(t => t.group === group).length + countOffset - groupLimitEntry.limit;
|
|
5188
|
+
if (groupCountToRemove > minCount) {
|
|
5189
|
+
this.removeQuantity(groupCountToRemove, group);
|
|
5190
|
+
}
|
|
5191
|
+
}
|
|
5192
|
+
if (globalLimit > minLimit && globalMode === LimitMode.delete) {
|
|
5193
|
+
const globalCountToRemove = this.count + countOffset - globalLimit;
|
|
5194
|
+
if (globalCountToRemove > minCount) {
|
|
5195
|
+
this.#removeAny(globalCountToRemove);
|
|
5196
|
+
}
|
|
5197
|
+
}
|
|
5198
|
+
return false;
|
|
5199
|
+
}
|
|
5100
5200
|
#createBuckets(zLayers) {
|
|
5101
5201
|
const bucketCount = Math.max(Math.floor(zLayers), one);
|
|
5102
5202
|
return Array.from({ length: bucketCount }, () => []);
|
|
@@ -5119,6 +5219,70 @@
|
|
|
5119
5219
|
}
|
|
5120
5220
|
return ((canvasSize.width * canvasSize.height) / (densityOptions.height * densityOptions.width * pxRatio ** squareExp));
|
|
5121
5221
|
}
|
|
5222
|
+
async #initDrawersAndUpdaters() {
|
|
5223
|
+
const container = this.#container;
|
|
5224
|
+
await container.initDrawersAndUpdaters();
|
|
5225
|
+
for (const drawer of container.effectDrawers.values()) {
|
|
5226
|
+
await drawer.init?.(container);
|
|
5227
|
+
}
|
|
5228
|
+
for (const drawer of container.shapeDrawers.values()) {
|
|
5229
|
+
await drawer.init?.(container);
|
|
5230
|
+
}
|
|
5231
|
+
}
|
|
5232
|
+
async #initPlugins() {
|
|
5233
|
+
await this.#initPluginsArrays();
|
|
5234
|
+
await this.#initDrawersAndUpdaters();
|
|
5235
|
+
let handled = false;
|
|
5236
|
+
const container = this.#container;
|
|
5237
|
+
for (const plugin of container.plugins) {
|
|
5238
|
+
handled = plugin.particlesInitialization?.() ?? handled;
|
|
5239
|
+
if (handled) {
|
|
5240
|
+
break;
|
|
5241
|
+
}
|
|
5242
|
+
}
|
|
5243
|
+
if (handled) {
|
|
5244
|
+
return;
|
|
5245
|
+
}
|
|
5246
|
+
const particlesOptions = container.actualOptions.particles, groups = particlesOptions.groups;
|
|
5247
|
+
for (const group in groups) {
|
|
5248
|
+
const groupOptions = groups[group];
|
|
5249
|
+
if (!groupOptions) {
|
|
5250
|
+
continue;
|
|
5251
|
+
}
|
|
5252
|
+
for (let i = this.count, j = 0; j < groupOptions.number.value && i < particlesOptions.number.value; i++, j++) {
|
|
5253
|
+
this.addParticle(undefined, groupOptions, group);
|
|
5254
|
+
}
|
|
5255
|
+
}
|
|
5256
|
+
for (let i = this.count; i < particlesOptions.number.value; i++) {
|
|
5257
|
+
this.addParticle();
|
|
5258
|
+
}
|
|
5259
|
+
}
|
|
5260
|
+
async #initPluginsArrays() {
|
|
5261
|
+
const container = this.#container;
|
|
5262
|
+
for (const plugin of container.plugins) {
|
|
5263
|
+
if (plugin.redrawInit) {
|
|
5264
|
+
await plugin.redrawInit();
|
|
5265
|
+
}
|
|
5266
|
+
if (plugin.checkParticlePosition) {
|
|
5267
|
+
this.checkParticlePositionPlugins.push(plugin);
|
|
5268
|
+
}
|
|
5269
|
+
if (plugin.update) {
|
|
5270
|
+
this.#updatePlugins.push(plugin);
|
|
5271
|
+
}
|
|
5272
|
+
if (plugin.particleUpdate) {
|
|
5273
|
+
this.#particleUpdatePlugins.push(plugin);
|
|
5274
|
+
}
|
|
5275
|
+
if (plugin.postUpdate) {
|
|
5276
|
+
this.#postUpdatePlugins.push(plugin);
|
|
5277
|
+
}
|
|
5278
|
+
if (plugin.particleReset) {
|
|
5279
|
+
this.#particleResetPlugins.push(plugin);
|
|
5280
|
+
}
|
|
5281
|
+
if (plugin.postParticleUpdate) {
|
|
5282
|
+
this.#postParticleUpdatePlugins.push(plugin);
|
|
5283
|
+
}
|
|
5284
|
+
}
|
|
5285
|
+
}
|
|
5122
5286
|
#insertParticleIntoBucket(particle) {
|
|
5123
5287
|
const bucketIndex = this.#getBucketIndex(particle.position.z), bucket = this.#zBuckets[bucketIndex];
|
|
5124
5288
|
if (!bucket) {
|
|
@@ -5127,12 +5291,15 @@
|
|
|
5127
5291
|
bucket.push(particle);
|
|
5128
5292
|
this.#particleBuckets.set(particle.id, bucketIndex);
|
|
5129
5293
|
}
|
|
5130
|
-
#
|
|
5294
|
+
#removeAny(quantity) {
|
|
5295
|
+
this.removeAt(minIndex, quantity, undefined, undefined, false);
|
|
5296
|
+
}
|
|
5297
|
+
#removeParticle(index, group, override, matchGroup = true) {
|
|
5131
5298
|
const particle = this.#array[index];
|
|
5132
5299
|
if (!particle) {
|
|
5133
5300
|
return false;
|
|
5134
5301
|
}
|
|
5135
|
-
if (particle.group !== group) {
|
|
5302
|
+
if (matchGroup && particle.group !== group) {
|
|
5136
5303
|
return false;
|
|
5137
5304
|
}
|
|
5138
5305
|
this.#array.splice(index, deleteCount);
|
|
@@ -5219,7 +5386,7 @@
|
|
|
5219
5386
|
particlesToDelete.add(particle);
|
|
5220
5387
|
continue;
|
|
5221
5388
|
}
|
|
5222
|
-
this
|
|
5389
|
+
this.#grid.insert(particle);
|
|
5223
5390
|
}
|
|
5224
5391
|
return particlesToDelete;
|
|
5225
5392
|
}
|
|
@@ -5306,6 +5473,7 @@
|
|
|
5306
5473
|
started;
|
|
5307
5474
|
zLayers;
|
|
5308
5475
|
#delay;
|
|
5476
|
+
#delayResolve;
|
|
5309
5477
|
#delayTimeout;
|
|
5310
5478
|
#delta = { value: 0, factor: 0 };
|
|
5311
5479
|
#dispatchCallback;
|
|
@@ -5395,7 +5563,6 @@
|
|
|
5395
5563
|
this.shapeDrawers = new Map();
|
|
5396
5564
|
this.particleUpdaters = [];
|
|
5397
5565
|
this.plugins.length = 0;
|
|
5398
|
-
this.#pluginManager.clearPlugins(this);
|
|
5399
5566
|
this.destroyed = true;
|
|
5400
5567
|
this.#onDestroy(remove);
|
|
5401
5568
|
this.dispatchEvent(EventType.containerDestroyed);
|
|
@@ -5448,31 +5615,14 @@
|
|
|
5448
5615
|
await this.initDrawersAndUpdaters();
|
|
5449
5616
|
this.#options = loadContainerOptions(this.#pluginManager, this, this.#initialSourceOptions, this.sourceOptions);
|
|
5450
5617
|
this.actualOptions = loadContainerOptions(this.#pluginManager, this, this.#options);
|
|
5451
|
-
this
|
|
5452
|
-
this.particleDestroyedPlugins.length = 0;
|
|
5453
|
-
this.particleCreatedPlugins.length = 0;
|
|
5454
|
-
this.particlePositionPlugins.length = 0;
|
|
5455
|
-
for (const [plugin, containerPlugin] of allContainerPlugins) {
|
|
5456
|
-
if (plugin.needsPlugin(this.actualOptions)) {
|
|
5457
|
-
this.plugins.push(containerPlugin);
|
|
5458
|
-
if (containerPlugin.particleCreated) {
|
|
5459
|
-
this.particleCreatedPlugins.push(containerPlugin);
|
|
5460
|
-
}
|
|
5461
|
-
if (containerPlugin.particleDestroyed) {
|
|
5462
|
-
this.particleDestroyedPlugins.push(containerPlugin);
|
|
5463
|
-
}
|
|
5464
|
-
if (containerPlugin.particlePosition) {
|
|
5465
|
-
this.particlePositionPlugins.push(containerPlugin);
|
|
5466
|
-
}
|
|
5467
|
-
}
|
|
5468
|
-
}
|
|
5618
|
+
this.#initPlugins(allContainerPlugins);
|
|
5469
5619
|
this.retina.init();
|
|
5470
5620
|
this.canvas.init();
|
|
5471
5621
|
this.updateActualOptions();
|
|
5472
5622
|
this.canvas.initBackground();
|
|
5473
5623
|
this.canvas.resize();
|
|
5474
5624
|
const { delay, duration, fpsLimit, smooth, zLayers } = this.actualOptions, hdrOptions = this.actualOptions.hdr;
|
|
5475
|
-
this.hdrMode = hdrOptions.mode;
|
|
5625
|
+
this.hdrMode = toEnumValue(HdrMode, hdrOptions.mode, HdrMode.standard);
|
|
5476
5626
|
this.peakNits = hdrOptions.peakNits;
|
|
5477
5627
|
this.zLayers = zLayers;
|
|
5478
5628
|
this.#duration = getRangeValue(duration) * millisecondsToSeconds;
|
|
@@ -5493,9 +5643,9 @@
|
|
|
5493
5643
|
}
|
|
5494
5644
|
async initDrawersAndUpdaters() {
|
|
5495
5645
|
const pluginManager = this.#pluginManager;
|
|
5496
|
-
this.effectDrawers = await
|
|
5497
|
-
this.shapeDrawers = await
|
|
5498
|
-
this.particleUpdaters = await
|
|
5646
|
+
this.effectDrawers = await getItemMapFromInitializer(this, pluginManager.initializers.effects);
|
|
5647
|
+
this.shapeDrawers = await getItemMapFromInitializer(this, pluginManager.initializers.shapes);
|
|
5648
|
+
this.particleUpdaters = await getItemsFromInitializer(this, pluginManager.initializers.updaters);
|
|
5499
5649
|
}
|
|
5500
5650
|
pause() {
|
|
5501
5651
|
if (!guardCheck(this)) {
|
|
@@ -5562,7 +5712,10 @@
|
|
|
5562
5712
|
await this.init();
|
|
5563
5713
|
this.started = true;
|
|
5564
5714
|
await new Promise(resolve => {
|
|
5715
|
+
this.#delayResolve = resolve;
|
|
5565
5716
|
const start = async () => {
|
|
5717
|
+
this.#delayTimeout = undefined;
|
|
5718
|
+
this.#delayResolve = undefined;
|
|
5566
5719
|
this.#eventListeners.addListeners();
|
|
5567
5720
|
for (const plugin of this.plugins) {
|
|
5568
5721
|
await plugin.start?.();
|
|
@@ -5578,9 +5731,11 @@
|
|
|
5578
5731
|
if (!guardCheck(this) || !this.started) {
|
|
5579
5732
|
return;
|
|
5580
5733
|
}
|
|
5581
|
-
if (this.#delayTimeout) {
|
|
5734
|
+
if (this.#delayTimeout !== undefined) {
|
|
5582
5735
|
clearTimeout(this.#delayTimeout);
|
|
5583
5736
|
this.#delayTimeout = undefined;
|
|
5737
|
+
this.#delayResolve?.();
|
|
5738
|
+
this.#delayResolve = undefined;
|
|
5584
5739
|
}
|
|
5585
5740
|
this.#firstStart = true;
|
|
5586
5741
|
this.started = false;
|
|
@@ -5606,6 +5761,27 @@
|
|
|
5606
5761
|
}
|
|
5607
5762
|
return refresh;
|
|
5608
5763
|
}
|
|
5764
|
+
#initPlugins(allContainerPlugins) {
|
|
5765
|
+
this.plugins.length = 0;
|
|
5766
|
+
this.particleDestroyedPlugins.length = 0;
|
|
5767
|
+
this.particleCreatedPlugins.length = 0;
|
|
5768
|
+
this.particlePositionPlugins.length = 0;
|
|
5769
|
+
for (const [plugin, containerPlugin] of allContainerPlugins) {
|
|
5770
|
+
if (!plugin.needsPlugin(this.actualOptions)) {
|
|
5771
|
+
continue;
|
|
5772
|
+
}
|
|
5773
|
+
this.plugins.push(containerPlugin);
|
|
5774
|
+
if (containerPlugin.particleCreated) {
|
|
5775
|
+
this.particleCreatedPlugins.push(containerPlugin);
|
|
5776
|
+
}
|
|
5777
|
+
if (containerPlugin.particleDestroyed) {
|
|
5778
|
+
this.particleDestroyedPlugins.push(containerPlugin);
|
|
5779
|
+
}
|
|
5780
|
+
if (containerPlugin.particlePosition) {
|
|
5781
|
+
this.particlePositionPlugins.push(containerPlugin);
|
|
5782
|
+
}
|
|
5783
|
+
}
|
|
5784
|
+
}
|
|
5609
5785
|
#nextFrame(timestamp) {
|
|
5610
5786
|
try {
|
|
5611
5787
|
if (!this.#smooth &&
|
|
@@ -5882,11 +6058,11 @@
|
|
|
5882
6058
|
}
|
|
5883
6059
|
}
|
|
5884
6060
|
async #init() {
|
|
5885
|
-
const
|
|
5886
|
-
if (!
|
|
6061
|
+
const pluginManager = this.#pluginManager;
|
|
6062
|
+
if (!pluginManager.initializers.pathGenerators) {
|
|
5887
6063
|
return;
|
|
5888
6064
|
}
|
|
5889
|
-
this.availablePathGenerators =
|
|
6065
|
+
this.availablePathGenerators = await getItemMapFromInitializer(this.#container, pluginManager.initializers.pathGenerators);
|
|
5890
6066
|
this.pathGenerators = new Map();
|
|
5891
6067
|
for (const pathGenerator of this.pathGenerators.values()) {
|
|
5892
6068
|
pathGenerator.init();
|
|
@@ -5902,6 +6078,7 @@
|
|
|
5902
6078
|
exports.loadStarsPreset = loadStarsPreset;
|
|
5903
6079
|
exports.tsParticles = tsParticles;
|
|
5904
6080
|
|
|
5905
|
-
}));
|
|
6081
|
+
})(g.__tsParticlesInternals.presets.stars = g.__tsParticlesInternals.presets.stars || {});
|
|
6082
|
+
})(typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : self);
|
|
6083
|
+
|
|
5906
6084
|
Object.assign(globalThis.window || globalThis, { loadStarsPreset: (globalThis.__tsParticlesInternals.presets.stars || {}).loadStarsPreset });
|
|
5907
|
-
delete (globalThis.window || globalThis).tsparticlesInternalExports;
|