@tsparticles/engine 3.7.0 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/Core/Canvas.js +51 -36
- package/browser/Core/Container.js +10 -13
- package/browser/Core/Engine.js +15 -11
- package/browser/Core/Particle.js +8 -11
- package/browser/Core/Particles.js +10 -14
- package/browser/Core/Retina.js +1 -1
- package/browser/Core/Utils/Constants.js +10 -16
- package/browser/Core/Utils/EventListeners.js +5 -8
- package/browser/Core/Utils/QuadTree.js +1 -1
- package/browser/Core/Utils/Ranges.js +1 -1
- package/browser/Core/Utils/Vectors.js +10 -15
- package/browser/Options/Classes/ManualParticle.js +3 -3
- package/browser/Utils/CanvasUtils.js +8 -14
- package/browser/Utils/ColorUtils.js +12 -17
- package/browser/Utils/EventDispatcher.js +2 -2
- package/browser/Utils/NumberUtils.js +2 -4
- package/browser/Utils/Utils.js +58 -9
- package/cjs/Core/Canvas.js +52 -37
- package/cjs/Core/Container.js +14 -17
- package/cjs/Core/Engine.js +21 -17
- package/cjs/Core/Particle.js +18 -21
- package/cjs/Core/Particles.js +22 -26
- package/cjs/Core/Retina.js +5 -5
- package/cjs/Core/Utils/Constants.js +12 -17
- package/cjs/Core/Utils/EventListeners.js +8 -11
- package/cjs/Core/Utils/QuadTree.js +4 -4
- package/cjs/Core/Utils/Ranges.js +4 -4
- package/cjs/Core/Utils/Vectors.js +11 -16
- package/cjs/Options/Classes/ManualParticle.js +3 -3
- package/cjs/Utils/CanvasUtils.js +14 -20
- package/cjs/Utils/ColorUtils.js +47 -52
- package/cjs/Utils/EventDispatcher.js +5 -5
- package/cjs/Utils/NumberUtils.js +11 -13
- package/cjs/Utils/Utils.js +60 -10
- package/esm/Core/Canvas.js +51 -36
- package/esm/Core/Container.js +10 -13
- package/esm/Core/Engine.js +15 -11
- package/esm/Core/Particle.js +8 -11
- package/esm/Core/Particles.js +10 -14
- package/esm/Core/Retina.js +1 -1
- package/esm/Core/Utils/Constants.js +10 -16
- package/esm/Core/Utils/EventListeners.js +5 -8
- package/esm/Core/Utils/QuadTree.js +1 -1
- package/esm/Core/Utils/Ranges.js +1 -1
- package/esm/Core/Utils/Vectors.js +10 -15
- package/esm/Options/Classes/ManualParticle.js +3 -3
- package/esm/Utils/CanvasUtils.js +8 -14
- package/esm/Utils/ColorUtils.js +12 -17
- package/esm/Utils/EventDispatcher.js +2 -2
- package/esm/Utils/NumberUtils.js +2 -4
- package/esm/Utils/Utils.js +58 -9
- package/package.json +1 -1
- package/report.html +1 -1
- package/tsparticles.engine.js +20 -20
- package/tsparticles.engine.min.js +1 -1
- package/tsparticles.engine.min.js.LICENSE.txt +1 -1
- package/types/Core/Canvas.d.ts +1 -1
- package/types/Core/Engine.d.ts +5 -4
- package/types/Core/Utils/Constants.d.ts +7 -16
- package/types/Utils/ColorUtils.d.ts +1 -1
- package/types/Utils/Utils.d.ts +2 -2
- package/umd/Core/Canvas.js +53 -38
- package/umd/Core/Container.js +14 -17
- package/umd/Core/Engine.js +21 -17
- package/umd/Core/Particle.js +19 -22
- package/umd/Core/Particles.js +23 -27
- package/umd/Core/Retina.js +6 -6
- package/umd/Core/Utils/Constants.js +11 -17
- package/umd/Core/Utils/EventListeners.js +9 -12
- package/umd/Core/Utils/QuadTree.js +5 -5
- package/umd/Core/Utils/Ranges.js +5 -5
- package/umd/Core/Utils/Vectors.js +11 -16
- package/umd/Options/Classes/ManualParticle.js +4 -4
- package/umd/Utils/CanvasUtils.js +15 -21
- package/umd/Utils/ColorUtils.js +48 -53
- package/umd/Utils/EventDispatcher.js +6 -6
- package/umd/Utils/NumberUtils.js +12 -14
- package/umd/Utils/Utils.js +60 -10
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import { errorPrefix } from "./Constants.js";
|
|
1
|
+
import { errorPrefix, inverseFactorNumerator, none, originPoint, squareExp } from "./Constants.js";
|
|
2
2
|
import { isNumber } from "../../Utils/TypeUtils.js";
|
|
3
|
-
const origin = {
|
|
4
|
-
x: 0,
|
|
5
|
-
y: 0,
|
|
6
|
-
z: 0,
|
|
7
|
-
}, squareExp = 2, inverseFactorNumerator = 1.0;
|
|
8
3
|
export class Vector3d {
|
|
9
4
|
constructor(xOrCoords, y, z) {
|
|
10
5
|
this._updateFromAngle = (angle, length) => {
|
|
@@ -15,19 +10,19 @@ export class Vector3d {
|
|
|
15
10
|
this.x = xOrCoords.x;
|
|
16
11
|
this.y = xOrCoords.y;
|
|
17
12
|
const coords3d = xOrCoords;
|
|
18
|
-
this.z = coords3d.z ? coords3d.z :
|
|
13
|
+
this.z = coords3d.z ? coords3d.z : originPoint.z;
|
|
19
14
|
}
|
|
20
15
|
else if (xOrCoords !== undefined && y !== undefined) {
|
|
21
16
|
this.x = xOrCoords;
|
|
22
17
|
this.y = y;
|
|
23
|
-
this.z = z ??
|
|
18
|
+
this.z = z ?? originPoint.z;
|
|
24
19
|
}
|
|
25
20
|
else {
|
|
26
21
|
throw new Error(`${errorPrefix} Vector3d not initialized correctly`);
|
|
27
22
|
}
|
|
28
23
|
}
|
|
29
24
|
static get origin() {
|
|
30
|
-
return Vector3d.create(
|
|
25
|
+
return Vector3d.create(originPoint.x, originPoint.y, originPoint.z);
|
|
31
26
|
}
|
|
32
27
|
get angle() {
|
|
33
28
|
return Math.atan2(this.y, this.x);
|
|
@@ -84,19 +79,19 @@ export class Vector3d {
|
|
|
84
79
|
this.z *= n;
|
|
85
80
|
}
|
|
86
81
|
normalize() {
|
|
87
|
-
const length = this.length
|
|
88
|
-
if (length !=
|
|
82
|
+
const length = this.length;
|
|
83
|
+
if (length != none) {
|
|
89
84
|
this.multTo(inverseFactorNumerator / length);
|
|
90
85
|
}
|
|
91
86
|
}
|
|
92
87
|
rotate(angle) {
|
|
93
|
-
return Vector3d.create(this.x * Math.cos(angle) - this.y * Math.sin(angle), this.x * Math.sin(angle) + this.y * Math.cos(angle),
|
|
88
|
+
return Vector3d.create(this.x * Math.cos(angle) - this.y * Math.sin(angle), this.x * Math.sin(angle) + this.y * Math.cos(angle), originPoint.z);
|
|
94
89
|
}
|
|
95
90
|
setTo(c) {
|
|
96
91
|
this.x = c.x;
|
|
97
92
|
this.y = c.y;
|
|
98
93
|
const v3d = c;
|
|
99
|
-
this.z = v3d.z ? v3d.z :
|
|
94
|
+
this.z = v3d.z ? v3d.z : originPoint.z;
|
|
100
95
|
}
|
|
101
96
|
sub(v) {
|
|
102
97
|
return Vector3d.create(this.x - v.x, this.y - v.y, this.z - v.z);
|
|
@@ -109,10 +104,10 @@ export class Vector3d {
|
|
|
109
104
|
}
|
|
110
105
|
export class Vector extends Vector3d {
|
|
111
106
|
constructor(xOrCoords, y) {
|
|
112
|
-
super(xOrCoords, y,
|
|
107
|
+
super(xOrCoords, y, originPoint.z);
|
|
113
108
|
}
|
|
114
109
|
static get origin() {
|
|
115
|
-
return Vector.create(
|
|
110
|
+
return Vector.create(originPoint.x, originPoint.y);
|
|
116
111
|
}
|
|
117
112
|
static clone(source) {
|
|
118
113
|
return Vector.create(source.x, source.y);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PixelMode } from "../../Enums/Modes/PixelMode.js";
|
|
2
2
|
import { deepExtend } from "../../Utils/Utils.js";
|
|
3
3
|
import { isNull } from "../../Utils/TypeUtils.js";
|
|
4
|
-
|
|
4
|
+
import { manualDefaultPosition } from "../../Core/Utils/Constants.js";
|
|
5
5
|
export class ManualParticle {
|
|
6
6
|
load(data) {
|
|
7
7
|
if (isNull(data)) {
|
|
@@ -9,8 +9,8 @@ export class ManualParticle {
|
|
|
9
9
|
}
|
|
10
10
|
if (data.position) {
|
|
11
11
|
this.position = {
|
|
12
|
-
x: data.position.x ??
|
|
13
|
-
y: data.position.y ??
|
|
12
|
+
x: data.position.x ?? manualDefaultPosition,
|
|
13
|
+
y: data.position.y ?? manualDefaultPosition,
|
|
14
14
|
mode: data.position.mode ?? PixelMode.percent,
|
|
15
15
|
};
|
|
16
16
|
}
|
package/esm/Utils/CanvasUtils.js
CHANGED
|
@@ -1,11 +1,6 @@
|
|
|
1
|
+
import { defaultAngle, defaultTransform, identity, lFactor, minStrokeWidth, originPoint, } from "../Core/Utils/Constants.js";
|
|
1
2
|
import { AlterType } from "../Enums/Types/AlterType.js";
|
|
2
3
|
import { getStyleFromRgb } from "./ColorUtils.js";
|
|
3
|
-
const origin = { x: 0, y: 0 }, defaultTransform = {
|
|
4
|
-
a: 1,
|
|
5
|
-
b: 0,
|
|
6
|
-
c: 0,
|
|
7
|
-
d: 1,
|
|
8
|
-
};
|
|
9
4
|
export function drawLine(context, begin, end) {
|
|
10
5
|
context.beginPath();
|
|
11
6
|
context.moveTo(begin.x, begin.y);
|
|
@@ -14,24 +9,24 @@ export function drawLine(context, begin, end) {
|
|
|
14
9
|
}
|
|
15
10
|
export function paintBase(context, dimension, baseColor) {
|
|
16
11
|
context.fillStyle = baseColor ?? "rgba(0,0,0,0)";
|
|
17
|
-
context.fillRect(
|
|
12
|
+
context.fillRect(originPoint.x, originPoint.y, dimension.width, dimension.height);
|
|
18
13
|
}
|
|
19
14
|
export function paintImage(context, dimension, image, opacity) {
|
|
20
15
|
if (!image) {
|
|
21
16
|
return;
|
|
22
17
|
}
|
|
23
18
|
context.globalAlpha = opacity;
|
|
24
|
-
context.drawImage(image,
|
|
19
|
+
context.drawImage(image, originPoint.x, originPoint.y, dimension.width, dimension.height);
|
|
25
20
|
context.globalAlpha = 1;
|
|
26
21
|
}
|
|
27
22
|
export function clear(context, dimension) {
|
|
28
|
-
context.clearRect(
|
|
23
|
+
context.clearRect(originPoint.x, originPoint.y, dimension.width, dimension.height);
|
|
29
24
|
}
|
|
30
25
|
export function drawParticle(data) {
|
|
31
|
-
const { container, context, particle, delta, colorStyles, backgroundMask, composite, radius, opacity, shadow, transform, } = data, pos = particle.getPosition(),
|
|
26
|
+
const { container, context, particle, delta, colorStyles, backgroundMask, composite, radius, opacity, shadow, transform, } = data, pos = particle.getPosition(), angle = particle.rotation + (particle.pathRotation ? particle.velocity.angle : defaultAngle), rotateData = {
|
|
32
27
|
sin: Math.sin(angle),
|
|
33
28
|
cos: Math.cos(angle),
|
|
34
|
-
}, rotating = !!angle,
|
|
29
|
+
}, rotating = !!angle, transformData = {
|
|
35
30
|
a: rotateData.cos * (transform.a ?? defaultTransform.a),
|
|
36
31
|
b: rotating ? rotateData.sin * (transform.b ?? identity) : (transform.b ?? defaultTransform.b),
|
|
37
32
|
c: rotating ? -rotateData.sin * (transform.c ?? identity) : (transform.c ?? defaultTransform.c),
|
|
@@ -51,7 +46,7 @@ export function drawParticle(data) {
|
|
|
51
46
|
if (colorStyles.fill) {
|
|
52
47
|
context.fillStyle = colorStyles.fill;
|
|
53
48
|
}
|
|
54
|
-
const
|
|
49
|
+
const strokeWidth = particle.strokeWidth ?? minStrokeWidth;
|
|
55
50
|
context.lineWidth = strokeWidth;
|
|
56
51
|
if (colorStyles.stroke) {
|
|
57
52
|
context.strokeStyle = colorStyles.stroke;
|
|
@@ -92,7 +87,7 @@ export function drawEffect(data) {
|
|
|
92
87
|
});
|
|
93
88
|
}
|
|
94
89
|
export function drawShape(data) {
|
|
95
|
-
const { container, context, particle, radius, opacity, delta, strokeWidth, transformData } = data
|
|
90
|
+
const { container, context, particle, radius, opacity, delta, strokeWidth, transformData } = data;
|
|
96
91
|
if (!particle.shape) {
|
|
97
92
|
return;
|
|
98
93
|
}
|
|
@@ -152,7 +147,6 @@ export function drawParticlePlugin(context, plugin, particle, delta) {
|
|
|
152
147
|
plugin.drawParticle(context, particle, delta);
|
|
153
148
|
}
|
|
154
149
|
export function alterHsl(color, type, value) {
|
|
155
|
-
const lFactor = 1;
|
|
156
150
|
return {
|
|
157
151
|
h: color.h,
|
|
158
152
|
s: color.s,
|
package/esm/Utils/ColorUtils.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { clamp, getRandom, getRangeMax, getRangeMin, getRangeValue, mix, randomInRange, setRangeValue, } from "./NumberUtils.js";
|
|
2
|
+
import { decayOffset, defaultLoops, defaultOpacity, defaultRgbMin, defaultTime, defaultVelocity, double, hMax, hMin, hPhase, half, identity, lMax, lMin, midColorValue, millisecondsToSeconds, percentDenominator, phaseNumerator, randomColorValue, rgbFactor, rgbMax, sMax, sMin, sNormalizedOffset, sextuple, triple, } from "../Core/Utils/Constants.js";
|
|
2
3
|
import { isArray, isString } from "./TypeUtils.js";
|
|
3
|
-
import { millisecondsToSeconds, percentDenominator } from "../Core/Utils/Constants.js";
|
|
4
4
|
import { AnimationStatus } from "../Enums/AnimationStatus.js";
|
|
5
5
|
import { itemFromArray } from "./Utils.js";
|
|
6
|
-
const randomColorValue = "random", midColorValue = "mid";
|
|
7
6
|
function stringToRgba(engine, input) {
|
|
8
7
|
if (!input) {
|
|
9
8
|
return;
|
|
@@ -63,7 +62,7 @@ export function rangeColorToHsl(engine, color, index, useIndex = true) {
|
|
|
63
62
|
return rgb ? rgbToHsl(rgb) : undefined;
|
|
64
63
|
}
|
|
65
64
|
export function rgbToHsl(color) {
|
|
66
|
-
const
|
|
65
|
+
const r1 = color.r / rgbMax, g1 = color.g / rgbMax, b1 = color.b / rgbMax, max = Math.max(r1, g1, b1), min = Math.min(r1, g1, b1), res = {
|
|
67
66
|
h: hMin,
|
|
68
67
|
l: (max + min) * half,
|
|
69
68
|
s: sMin,
|
|
@@ -93,13 +92,13 @@ export function stringToRgb(engine, input) {
|
|
|
93
92
|
return stringToRgba(engine, input);
|
|
94
93
|
}
|
|
95
94
|
export function hslToRgb(hsl) {
|
|
96
|
-
const
|
|
95
|
+
const h = ((hsl.h % hMax) + hMax) % hMax, s = Math.max(sMin, Math.min(sMax, hsl.s)), l = Math.max(lMin, Math.min(lMax, hsl.l)), hNormalized = h / hMax, sNormalized = s / sMax, lNormalized = l / lMax;
|
|
97
96
|
if (s === sMin) {
|
|
98
97
|
const grayscaleValue = Math.round(lNormalized * rgbFactor);
|
|
99
98
|
return { r: grayscaleValue, g: grayscaleValue, b: grayscaleValue };
|
|
100
99
|
}
|
|
101
|
-
const
|
|
102
|
-
const temp3Min = 0, temp3Max = 1
|
|
100
|
+
const channel = (temp1, temp2, temp3) => {
|
|
101
|
+
const temp3Min = 0, temp3Max = 1;
|
|
103
102
|
if (temp3 < temp3Min) {
|
|
104
103
|
temp3++;
|
|
105
104
|
}
|
|
@@ -117,9 +116,9 @@ export function hslToRgb(hsl) {
|
|
|
117
116
|
return temp1 + (temp2 - temp1) * (temp3Offset - temp3) * sextuple;
|
|
118
117
|
}
|
|
119
118
|
return temp1;
|
|
120
|
-
},
|
|
119
|
+
}, temp1 = lNormalized < half
|
|
121
120
|
? lNormalized * (sNormalizedOffset + sNormalized)
|
|
122
|
-
: lNormalized + sNormalized - lNormalized * sNormalized, temp2 = double * lNormalized - temp1,
|
|
121
|
+
: lNormalized + sNormalized - lNormalized * sNormalized, temp2 = double * lNormalized - temp1, phaseThird = phaseNumerator / triple, red = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized + phaseThird)), green = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized)), blue = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized - phaseThird));
|
|
123
122
|
return { r: Math.round(red), g: Math.round(green), b: Math.round(blue) };
|
|
124
123
|
}
|
|
125
124
|
export function hslaToRgba(hsla) {
|
|
@@ -132,19 +131,17 @@ export function hslaToRgba(hsla) {
|
|
|
132
131
|
};
|
|
133
132
|
}
|
|
134
133
|
export function getRandomRgbColor(min) {
|
|
135
|
-
const
|
|
134
|
+
const fixedMin = min ?? defaultRgbMin, fixedMax = rgbMax + identity;
|
|
136
135
|
return {
|
|
137
|
-
b: Math.floor(randomInRange(setRangeValue(fixedMin,
|
|
138
|
-
g: Math.floor(randomInRange(setRangeValue(fixedMin,
|
|
139
|
-
r: Math.floor(randomInRange(setRangeValue(fixedMin,
|
|
136
|
+
b: Math.floor(randomInRange(setRangeValue(fixedMin, fixedMax))),
|
|
137
|
+
g: Math.floor(randomInRange(setRangeValue(fixedMin, fixedMax))),
|
|
138
|
+
r: Math.floor(randomInRange(setRangeValue(fixedMin, fixedMax))),
|
|
140
139
|
};
|
|
141
140
|
}
|
|
142
141
|
export function getStyleFromRgb(color, opacity) {
|
|
143
|
-
const defaultOpacity = 1;
|
|
144
142
|
return `rgba(${color.r}, ${color.g}, ${color.b}, ${opacity ?? defaultOpacity})`;
|
|
145
143
|
}
|
|
146
144
|
export function getStyleFromHsl(color, opacity) {
|
|
147
|
-
const defaultOpacity = 1;
|
|
148
145
|
return `hsla(${color.h}, ${color.s}%, ${color.l}%, ${opacity ?? defaultOpacity})`;
|
|
149
146
|
}
|
|
150
147
|
export function colorMix(color1, color2, size1, size2) {
|
|
@@ -236,7 +233,6 @@ export function getHslAnimationFromHsl(hsl, animationOptions, reduceFactor) {
|
|
|
236
233
|
}
|
|
237
234
|
function setColorAnimation(colorValue, colorAnimation, reduceFactor) {
|
|
238
235
|
colorValue.enable = colorAnimation.enable;
|
|
239
|
-
const defaultVelocity = 0, decayOffset = 1, defaultLoops = 0, defaultTime = 0;
|
|
240
236
|
if (colorValue.enable) {
|
|
241
237
|
colorValue.velocity = (getRangeValue(colorAnimation.speed) / percentDenominator) * reduceFactor;
|
|
242
238
|
colorValue.decay = decayOffset - getRangeValue(colorAnimation.decay);
|
|
@@ -308,8 +304,7 @@ export function updateColor(color, delta) {
|
|
|
308
304
|
if (!color) {
|
|
309
305
|
return;
|
|
310
306
|
}
|
|
311
|
-
const { h, s, l } = color
|
|
312
|
-
const ranges = {
|
|
307
|
+
const { h, s, l } = color, ranges = {
|
|
313
308
|
h: { min: 0, max: 360 },
|
|
314
309
|
s: { min: 0, max: 100 },
|
|
315
310
|
l: { min: 0, max: 100 },
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { deleteCount, minIndex } from "../Core/Utils/Constants.js";
|
|
1
2
|
export class EventDispatcher {
|
|
2
3
|
constructor() {
|
|
3
4
|
this._listeners = new Map();
|
|
@@ -31,11 +32,10 @@ export class EventDispatcher {
|
|
|
31
32
|
if (!arr) {
|
|
32
33
|
return;
|
|
33
34
|
}
|
|
34
|
-
const length = arr.length, idx = arr.indexOf(listener)
|
|
35
|
+
const length = arr.length, idx = arr.indexOf(listener);
|
|
35
36
|
if (idx < minIndex) {
|
|
36
37
|
return;
|
|
37
38
|
}
|
|
38
|
-
const deleteCount = 1;
|
|
39
39
|
if (length === deleteCount) {
|
|
40
40
|
this._listeners.delete(type);
|
|
41
41
|
}
|
package/esm/Utils/NumberUtils.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { MoveDirection } from "../Enums/Directions/MoveDirection.js";
|
|
2
|
+
import { double, doublePI, empty, half, percentDenominator, quarter, threeQuarter } from "../Core/Utils/Constants.js";
|
|
2
3
|
import { Vector } from "../Core/Utils/Vectors.js";
|
|
3
4
|
import { isNumber } from "./TypeUtils.js";
|
|
4
|
-
import { percentDenominator } from "../Core/Utils/Constants.js";
|
|
5
5
|
let _random = Math.random;
|
|
6
6
|
const _animationLoop = {
|
|
7
7
|
nextFrame: (cb) => requestAnimationFrame(cb),
|
|
8
8
|
cancel: (idx) => cancelAnimationFrame(idx),
|
|
9
|
-
}
|
|
9
|
+
};
|
|
10
10
|
export function setRandom(rnd = Math.random) {
|
|
11
11
|
_random = rnd;
|
|
12
12
|
}
|
|
@@ -74,7 +74,6 @@ export function getParticleDirectionAngle(direction, position, center) {
|
|
|
74
74
|
if (isNumber(direction)) {
|
|
75
75
|
return degToRad(direction);
|
|
76
76
|
}
|
|
77
|
-
const empty = 0, half = 0.5, quarter = 0.25, threeQuarter = half + quarter;
|
|
78
77
|
switch (direction) {
|
|
79
78
|
case MoveDirection.top:
|
|
80
79
|
return -Math.PI * half;
|
|
@@ -107,7 +106,6 @@ export function getParticleBaseVelocity(direction) {
|
|
|
107
106
|
return baseVelocity;
|
|
108
107
|
}
|
|
109
108
|
export function collisionVelocity(v1, v2, m1, m2) {
|
|
110
|
-
const double = 2;
|
|
111
109
|
return Vector.create((v1.x * (m1 - m2)) / (m1 + m2) + (v2.x * double * m2) / (m1 + m2), v1.y);
|
|
112
110
|
}
|
|
113
111
|
export function calcPositionFromSize(data) {
|
package/esm/Utils/Utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { clamp, collisionVelocity, getDistances, getRandom, getRangeMax, getRangeMin, getRangeValue, randomInRange, } from "./NumberUtils.js";
|
|
2
|
-
import {
|
|
3
|
-
import { isArray, isObject } from "./TypeUtils.js";
|
|
2
|
+
import { half, millisecondsToSeconds, minVelocity, percentDenominator } from "../Core/Utils/Constants.js";
|
|
3
|
+
import { isArray, isNull, isObject } from "./TypeUtils.js";
|
|
4
4
|
import { AnimationMode } from "../Enums/Modes/AnimationMode.js";
|
|
5
5
|
import { AnimationStatus } from "../Enums/AnimationStatus.js";
|
|
6
6
|
import { DestroyType } from "../Enums/Types/DestroyType.js";
|
|
@@ -27,8 +27,20 @@ export function setLogger(logger) {
|
|
|
27
27
|
export function getLogger() {
|
|
28
28
|
return _logger;
|
|
29
29
|
}
|
|
30
|
+
function memoize(fn) {
|
|
31
|
+
const cache = new Map();
|
|
32
|
+
return (...args) => {
|
|
33
|
+
const key = JSON.stringify(args);
|
|
34
|
+
if (cache.has(key)) {
|
|
35
|
+
return cache.get(key);
|
|
36
|
+
}
|
|
37
|
+
const result = fn(...args);
|
|
38
|
+
cache.set(key, result);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
30
42
|
function rectSideBounce(data) {
|
|
31
|
-
const res = { bounced: false }, { pSide, pOtherSide, rectSide, rectOtherSide, velocity, factor } = data
|
|
43
|
+
const res = { bounced: false }, { pSide, pOtherSide, rectSide, rectOtherSide, velocity, factor } = data;
|
|
32
44
|
if (pOtherSide.min < rectOtherSide.min ||
|
|
33
45
|
pOtherSide.min > rectOtherSide.max ||
|
|
34
46
|
pOtherSide.max < rectOtherSide.min ||
|
|
@@ -284,7 +296,7 @@ export function initParticleNumericAnimationValue(options, pxRatio) {
|
|
|
284
296
|
res.status = AnimationStatus.decreasing;
|
|
285
297
|
break;
|
|
286
298
|
case AnimationMode.random:
|
|
287
|
-
res.status = getRandom() >=
|
|
299
|
+
res.status = getRandom() >= half ? AnimationStatus.increasing : AnimationStatus.decreasing;
|
|
288
300
|
break;
|
|
289
301
|
}
|
|
290
302
|
const autoStatus = animationOptions.mode === AnimationMode.auto;
|
|
@@ -305,7 +317,7 @@ export function initParticleNumericAnimationValue(options, pxRatio) {
|
|
|
305
317
|
default:
|
|
306
318
|
res.value = randomInRange(res);
|
|
307
319
|
if (autoStatus) {
|
|
308
|
-
res.status = getRandom() >=
|
|
320
|
+
res.status = getRandom() >= half ? AnimationStatus.increasing : AnimationStatus.decreasing;
|
|
309
321
|
}
|
|
310
322
|
break;
|
|
311
323
|
}
|
|
@@ -414,9 +426,46 @@ export function updateAnimation(particle, data, changeDirection, destroyType, de
|
|
|
414
426
|
data.value = clamp(data.value, minValue, maxValue);
|
|
415
427
|
}
|
|
416
428
|
}
|
|
417
|
-
export function
|
|
418
|
-
|
|
419
|
-
|
|
429
|
+
export function cloneStyle(style) {
|
|
430
|
+
const clonedStyle = document.createElement("div").style;
|
|
431
|
+
if (!style) {
|
|
432
|
+
return clonedStyle;
|
|
433
|
+
}
|
|
434
|
+
for (const key in style) {
|
|
435
|
+
const styleKey = style[key];
|
|
436
|
+
if (!Object.prototype.hasOwnProperty.call(style, key) || isNull(styleKey)) {
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
const styleValue = style.getPropertyValue?.(styleKey);
|
|
440
|
+
if (!styleValue) {
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
const stylePriority = style.getPropertyPriority?.(styleKey);
|
|
444
|
+
if (!stylePriority) {
|
|
445
|
+
clonedStyle.setProperty?.(styleKey, styleValue);
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
clonedStyle.setProperty?.(styleKey, styleValue, stylePriority);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
return clonedStyle;
|
|
452
|
+
}
|
|
453
|
+
function computeFullScreenStyle(zIndex) {
|
|
454
|
+
const fullScreenStyle = document.createElement("div").style, radix = 10, style = {
|
|
455
|
+
width: "100%",
|
|
456
|
+
height: "100%",
|
|
457
|
+
margin: "0",
|
|
458
|
+
padding: "0",
|
|
459
|
+
borderWidth: "0",
|
|
460
|
+
position: "fixed",
|
|
461
|
+
zIndex: zIndex.toString(radix),
|
|
462
|
+
top: "0",
|
|
463
|
+
left: "0",
|
|
464
|
+
};
|
|
465
|
+
for (const key in style) {
|
|
466
|
+
const value = style[key];
|
|
467
|
+
fullScreenStyle.setProperty(key, value);
|
|
420
468
|
}
|
|
421
|
-
|
|
469
|
+
return fullScreenStyle;
|
|
422
470
|
}
|
|
471
|
+
export const getFullScreenStyle = memoize(computeFullScreenStyle);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsparticles/engine",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.8.0",
|
|
4
4
|
"description": "Easily create highly customizable particle, confetti and fireworks animations and use them as animated backgrounds for your website. Ready to use components available also for React, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Riot.js, Inferno.",
|
|
5
5
|
"homepage": "https://particles.js.org",
|
|
6
6
|
"scripts": {
|
package/report.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8"/>
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
6
|
-
<title>@tsparticles/engine [
|
|
6
|
+
<title>@tsparticles/engine [23 Jan 2025 at 08:54]</title>
|
|
7
7
|
<link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABrVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+O1foceMD///+J0/qK1Pr7/v8Xdr/9///W8P4UdL7L7P0Scr2r4Pyj3vwad8D5/f/2/f+55f3E6f34+/2H0/ojfMKpzOd0rNgQcb3F3O/j9f7c8v6g3Pz0/P/w+v/q+P7n9v6T1/uQ1vuE0vqLut/y+v+Z2fvt+f+15Pzv9fuc2/vR7v2V2Pvd6/bg9P7I6/285/2y4/yp3/zp8vk8i8kqgMT7/P31+fyv4vxGkcz6/P6/6P3j7vfS5PNnpNUxhcbO7f7F6v3O4vHK3/DA2u631Ouy0eqXweKJud5wqthfoNMMbLvY8f73+v2dxeR8sNtTmdDx9/zX6PSjyeaCtd1YnNGX2PuQveCGt95Nls42h8dLlM3F4vBtAAAAM3RSTlMAAyOx0/sKBvik8opWGBMOAe3l1snDm2E9LSb06eHcu5JpHbarfHZCN9CBb08zzkdNS0kYaptYAAAFV0lEQVRYw92X51/aYBDHHS2O2qqttVbrqNq9m+TJIAYIShBkWwqIiCgoWvfeq7Z2/s29hyQNyUcR7LveGwVyXy6XH8/9rqxglLfUPLxVduUor3h0rfp2TYvpivk37929TkG037hffoX0+peVtZQc1589rigVUdXS/ABSAyEmGIO/1XfvldSK8vs3OqB6u3m0nxmIrvgB0dj7rr7Y9IbuF68hnfFaiHA/sxqm0wciIG43P60qKv9WXWc1RXGh/mFESFABTSBi0sNAKzqet17eCtOb3kZIDwxEEU0oAIJGYxNBDhBND29e0rtXXbcpuPmED9IhEAAQ/AXEaF8EPmnrrKsv0LvWR3fg5sWDNAFZOgAgaKvZDogHNU9MFwnnYROkc56RD5CjAbQX9Ow4g7upCsvYu55aSI/Nj0H1akgKQEUM94dwK65hYRmFU9MIcH/fqJYOZYcnuJSU/waKDgTOEVaVKhwrTRP5XzgSpAITYzom7UvkhFX5VutmxeNnWDjjswTKTyfgluNDGbUpWissXhF3s7mlSml+czWkg3D0l1nNjGNjz3myOQOa1KM/jOS6ebdbAVTCi4gljHSFrviza7tOgRWcS0MOUX9zdNgag5w7rRqA44Lzw0hr1WqES36dFliSJFlh2rXIae3FFcDDgKdxrUIDePr8jGcSClV1u7A9xeN0ModY/pHMxmR1EzRh8TJiwqsHmKW0l4FCEZI+jHio+JdPPE9qwQtTRxku2D8sIeRL2LnxWSllANCQGOIiqVHAz2ye2JR0DcH+HoxDkaADLjgxjKQ+AwCX/g0+DNgdG0ukYCONAe+dbc2IAc6fwt1ARoDSezNHxV2Cmzwv3O6lDMV55edBGwGK9n1+x2F8EDfAGCxug8MhpsMEcTEAWf3rx2vZhe/LAmtIn/6apE6PN0ULKgywD9mmdxbmFl3OvD5AS5fW5zLbv/YHmcsBTjf/afDz3MaZTVCfAP9z6/Bw6ycv8EUBWJIn9zYcoAWWlW9+OzO3vkTy8H+RANLmdrpOuYWdZYEXpo+TlCJrW5EARb7fF+bWdqf3hhyZI1nWJQHgznErZhbjoEsWqi8dQNoE294aldzFurwSABL2XXMf9+H1VQGke9exw5P/AnA5Pv5ngMul7LOvO922iwACu8WkCwLCafvM4CeWPxfA8lNHcWZSoi8EwMAIciKX2Z4SWCMAa3snCZ/G4EA8D6CMLNFsGQhkkz/gQNEBbPCbWsxGUpYVu3z8IyNAknwJkfPMEhLyrdi5RTyUVACkw4GSFRNWJNEW+fgPGwHD8/JxnRuLabN4CGNRkAE23na2+VmEAUmrYymSGjMAYqH84YUIyzgzs3XC7gNgH36Vcc4zKY9o9fgPBXUAiHHwVboBHGLiX6Zcjp1f2wu4tvzZKo0ecPnDtQYDQvJXaBeNzce45Fp28ZQLrEZVuFqgBwOalArKXnW1UzlnSusQKJqKYNuz4tOnI6sZG4zanpemv+7ySU2jbA9h6uhcgpfy6G2PahirDZ6zvq6zDduMVFTKvzw8wgyEdelwY9in3XkEPs3osJuwRQ4qTkfzifndg9Gfc4pdsu82+tTnHZTBa2EAMrqr2t43pguc8tNm7JQVQ2S0ukj2d22dhXYP0/veWtwKrCkNoNimAN5+Xr/oLrxswKbVJjteWrX7eR63o4j9q0GxnaBdWgGA5VStpanIjQmEhV0/nVt5VOFUvix6awJhPcAaTEShgrG+iGyvb5a0Ndb1YGHFPEwoqAinoaykaID1o1pdPNu7XsnCKQ3R+hwWIIhGvORcJUBYXe3Xa3vq/mF/N9V13ugufMkfXn+KHsRD0B8AAAAASUVORK5CYII=" type="image/x-icon" />
|
|
8
8
|
|
|
9
9
|
<script>
|