@tsparticles/fireworks 3.0.0-beta.3 → 3.0.0-beta.4
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/package.json +10 -10
- package/report.html +4 -22
- package/tsparticles.fireworks.bundle.js +595 -473
- package/tsparticles.fireworks.bundle.min.js +1 -1
- package/tsparticles.fireworks.bundle.min.js.LICENSE.txt +1 -1
- package/tsparticles.fireworks.js +17 -222
- package/tsparticles.fireworks.min.js +1 -1
- package/tsparticles.fireworks.min.js.LICENSE.txt +1 -1
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Demo / Generator : https://particles.js.org/
|
|
5
5
|
* GitHub : https://www.github.com/matteobruni/tsparticles
|
|
6
6
|
* How to use? : Check the GitHub README
|
|
7
|
-
* v3.0.0-beta.
|
|
7
|
+
* v3.0.0-beta.4
|
|
8
8
|
*/
|
|
9
9
|
(function webpackUniversalModuleDefinition(root, factory) {
|
|
10
10
|
if(typeof exports === 'object' && typeof module === 'object')
|
|
@@ -97,6 +97,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
97
97
|
ParticlesDensity: () => (/* reexport */ ParticlesDensity),
|
|
98
98
|
ParticlesInteractorBase: () => (/* reexport */ ParticlesInteractorBase),
|
|
99
99
|
ParticlesNumber: () => (/* reexport */ ParticlesNumber),
|
|
100
|
+
ParticlesNumberLimit: () => (/* reexport */ ParticlesNumberLimit),
|
|
100
101
|
ParticlesOptions: () => (/* reexport */ ParticlesOptions),
|
|
101
102
|
Point: () => (/* reexport */ Point),
|
|
102
103
|
Range: () => (/* reexport */ Range),
|
|
@@ -140,13 +141,13 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
140
141
|
deepExtend: () => (/* reexport */ deepExtend),
|
|
141
142
|
divMode: () => (/* reexport */ divMode),
|
|
142
143
|
divModeExecute: () => (/* reexport */ divModeExecute),
|
|
144
|
+
drawEffect: () => (/* reexport */ drawEffect),
|
|
143
145
|
drawLine: () => (/* reexport */ drawLine),
|
|
144
146
|
drawParticle: () => (/* reexport */ drawParticle),
|
|
145
147
|
drawParticlePlugin: () => (/* reexport */ drawParticlePlugin),
|
|
146
148
|
drawPlugin: () => (/* reexport */ drawPlugin),
|
|
147
149
|
drawShape: () => (/* reexport */ drawShape),
|
|
148
|
-
|
|
149
|
-
drawTriangle: () => (/* reexport */ drawTriangle),
|
|
150
|
+
drawShapeAfterDraw: () => (/* reexport */ drawShapeAfterDraw),
|
|
150
151
|
errorPrefix: () => (/* reexport */ errorPrefix),
|
|
151
152
|
executeOnSingleOrMultiple: () => (/* reexport */ executeOnSingleOrMultiple),
|
|
152
153
|
findItemFromSingleOrMultiple: () => (/* reexport */ findItemFromSingleOrMultiple),
|
|
@@ -171,7 +172,6 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
171
172
|
getSize: () => (/* reexport */ getSize),
|
|
172
173
|
getStyleFromHsl: () => (/* reexport */ getStyleFromHsl),
|
|
173
174
|
getStyleFromRgb: () => (/* reexport */ getStyleFromRgb),
|
|
174
|
-
getValue: () => (/* reexport */ getValue),
|
|
175
175
|
hasMatchMedia: () => (/* reexport */ hasMatchMedia),
|
|
176
176
|
hslToRgb: () => (/* reexport */ hslToRgb),
|
|
177
177
|
hslaToRgba: () => (/* reexport */ hslaToRgba),
|
|
@@ -410,17 +410,6 @@ function setRangeValue(source, value) {
|
|
|
410
410
|
max: Math.max(max, value)
|
|
411
411
|
} : setRangeValue(min, max);
|
|
412
412
|
}
|
|
413
|
-
function getValue(options) {
|
|
414
|
-
const random = options.random,
|
|
415
|
-
{
|
|
416
|
-
enable,
|
|
417
|
-
minimumValue
|
|
418
|
-
} = isBoolean(random) ? {
|
|
419
|
-
enable: random,
|
|
420
|
-
minimumValue: 0
|
|
421
|
-
} : random;
|
|
422
|
-
return enable ? getRangeValue(setRangeValue(options.value, minimumValue)) : getRangeValue(options.value);
|
|
423
|
-
}
|
|
424
413
|
function getDistances(pointA, pointB) {
|
|
425
414
|
const dx = pointA.x - pointB.x,
|
|
426
415
|
dy = pointA.y - pointB.y;
|
|
@@ -439,21 +428,21 @@ function getParticleDirectionAngle(direction, position, center) {
|
|
|
439
428
|
}
|
|
440
429
|
switch (direction) {
|
|
441
430
|
case "top":
|
|
442
|
-
return -Math.PI
|
|
431
|
+
return -Math.PI * 0.5;
|
|
443
432
|
case "top-right":
|
|
444
|
-
return -Math.PI
|
|
433
|
+
return -Math.PI * 0.25;
|
|
445
434
|
case "right":
|
|
446
435
|
return 0;
|
|
447
436
|
case "bottom-right":
|
|
448
|
-
return Math.PI
|
|
437
|
+
return Math.PI * 0.25;
|
|
449
438
|
case "bottom":
|
|
450
|
-
return Math.PI
|
|
439
|
+
return Math.PI * 0.5;
|
|
451
440
|
case "bottom-left":
|
|
452
|
-
return
|
|
441
|
+
return Math.PI * 0.75;
|
|
453
442
|
case "left":
|
|
454
443
|
return Math.PI;
|
|
455
444
|
case "top-left":
|
|
456
|
-
return -
|
|
445
|
+
return -Math.PI * 0.75;
|
|
457
446
|
case "inside":
|
|
458
447
|
return Math.atan2(center.y - position.y, center.x - position.x);
|
|
459
448
|
case "outside":
|
|
@@ -549,7 +538,7 @@ function rectSideBounce(data) {
|
|
|
549
538
|
if (pOtherSide.min < rectOtherSide.min || pOtherSide.min > rectOtherSide.max || pOtherSide.max < rectOtherSide.min || pOtherSide.max > rectOtherSide.max) {
|
|
550
539
|
return res;
|
|
551
540
|
}
|
|
552
|
-
if (pSide.max >= rectSide.min && pSide.max <= (rectSide.max + rectSide.min)
|
|
541
|
+
if (pSide.max >= rectSide.min && pSide.max <= (rectSide.max + rectSide.min) * 0.5 && velocity > 0 || pSide.min <= rectSide.max && pSide.min > (rectSide.max + rectSide.min) * 0.5 && velocity < 0) {
|
|
553
542
|
res.velocity = velocity * -factor;
|
|
554
543
|
res.bounced = true;
|
|
555
544
|
}
|
|
@@ -685,7 +674,7 @@ function circleBounceDataFromParticle(p) {
|
|
|
685
674
|
radius: p.getRadius(),
|
|
686
675
|
mass: p.getMass(),
|
|
687
676
|
velocity: p.velocity,
|
|
688
|
-
factor: Vector.create(
|
|
677
|
+
factor: Vector.create(getRangeValue(p.options.bounce.horizontal.value), getRangeValue(p.options.bounce.vertical.value))
|
|
689
678
|
};
|
|
690
679
|
}
|
|
691
680
|
function circleBounce(p1, p2) {
|
|
@@ -719,6 +708,7 @@ function rectBounce(particle, divBounds) {
|
|
|
719
708
|
const pPos = particle.getPosition(),
|
|
720
709
|
size = particle.getRadius(),
|
|
721
710
|
bounds = calculateBounds(pPos, size),
|
|
711
|
+
bounceOptions = particle.options.bounce,
|
|
722
712
|
resH = rectSideBounce({
|
|
723
713
|
pSide: {
|
|
724
714
|
min: bounds.left,
|
|
@@ -737,7 +727,7 @@ function rectBounce(particle, divBounds) {
|
|
|
737
727
|
max: divBounds.bottom
|
|
738
728
|
},
|
|
739
729
|
velocity: particle.velocity.x,
|
|
740
|
-
factor:
|
|
730
|
+
factor: getRangeValue(bounceOptions.horizontal.value)
|
|
741
731
|
});
|
|
742
732
|
if (resH.bounced) {
|
|
743
733
|
if (resH.velocity !== undefined) {
|
|
@@ -765,7 +755,7 @@ function rectBounce(particle, divBounds) {
|
|
|
765
755
|
max: divBounds.right
|
|
766
756
|
},
|
|
767
757
|
velocity: particle.velocity.y,
|
|
768
|
-
factor:
|
|
758
|
+
factor: getRangeValue(bounceOptions.vertical.value)
|
|
769
759
|
});
|
|
770
760
|
if (resV.bounced) {
|
|
771
761
|
if (resV.velocity !== undefined) {
|
|
@@ -892,24 +882,6 @@ const randomColorValue = "random",
|
|
|
892
882
|
function addColorManager(manager) {
|
|
893
883
|
colorManagers.set(manager.key, manager);
|
|
894
884
|
}
|
|
895
|
-
function hue2rgb(p, q, t) {
|
|
896
|
-
if (t < 0) {
|
|
897
|
-
t += 1;
|
|
898
|
-
}
|
|
899
|
-
if (t > 1) {
|
|
900
|
-
t -= 1;
|
|
901
|
-
}
|
|
902
|
-
if (t < 1 / 6) {
|
|
903
|
-
return p + (q - p) * 6 * t;
|
|
904
|
-
}
|
|
905
|
-
if (t < 1 / 2) {
|
|
906
|
-
return q;
|
|
907
|
-
}
|
|
908
|
-
if (t < 2 / 3) {
|
|
909
|
-
return p + (q - p) * (2 / 3 - t) * 6;
|
|
910
|
-
}
|
|
911
|
-
return p;
|
|
912
|
-
}
|
|
913
885
|
function stringToRgba(input) {
|
|
914
886
|
for (const [, manager] of colorManagers) {
|
|
915
887
|
if (input.startsWith(manager.stringPrefix)) {
|
|
@@ -989,7 +961,7 @@ function rgbToHsl(color) {
|
|
|
989
961
|
min = Math.min(r1, g1, b1),
|
|
990
962
|
res = {
|
|
991
963
|
h: 0,
|
|
992
|
-
l: (max + min)
|
|
964
|
+
l: (max + min) * 0.5,
|
|
993
965
|
s: 0
|
|
994
966
|
};
|
|
995
967
|
if (max !== min) {
|
|
@@ -1014,29 +986,48 @@ function stringToRgb(input) {
|
|
|
1014
986
|
return stringToRgba(input);
|
|
1015
987
|
}
|
|
1016
988
|
function hslToRgb(hsl) {
|
|
1017
|
-
const
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
989
|
+
const h = (hsl.h % 360 + 360) % 360,
|
|
990
|
+
s = Math.max(0, Math.min(100, hsl.s)),
|
|
991
|
+
l = Math.max(0, Math.min(100, hsl.l)),
|
|
992
|
+
hNormalized = h / 360,
|
|
993
|
+
sNormalized = s / 100,
|
|
994
|
+
lNormalized = l / 100;
|
|
995
|
+
if (s === 0) {
|
|
996
|
+
const grayscaleValue = Math.round(lNormalized * 255);
|
|
997
|
+
return {
|
|
998
|
+
r: grayscaleValue,
|
|
999
|
+
g: grayscaleValue,
|
|
1000
|
+
b: grayscaleValue
|
|
1026
1001
|
};
|
|
1027
|
-
if (!hslPercent.s) {
|
|
1028
|
-
result.r = result.g = result.b = hslPercent.l;
|
|
1029
|
-
} else {
|
|
1030
|
-
const q = hslPercent.l < 0.5 ? hslPercent.l * (1 + hslPercent.s) : hslPercent.l + hslPercent.s - hslPercent.l * hslPercent.s,
|
|
1031
|
-
p = 2 * hslPercent.l - q;
|
|
1032
|
-
result.r = hue2rgb(p, q, hslPercent.h + 1 / 3);
|
|
1033
|
-
result.g = hue2rgb(p, q, hslPercent.h);
|
|
1034
|
-
result.b = hue2rgb(p, q, hslPercent.h - 1 / 3);
|
|
1035
1002
|
}
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1003
|
+
const channel = (temp1, temp2, temp3) => {
|
|
1004
|
+
if (temp3 < 0) {
|
|
1005
|
+
temp3 += 1;
|
|
1006
|
+
}
|
|
1007
|
+
if (temp3 > 1) {
|
|
1008
|
+
temp3 -= 1;
|
|
1009
|
+
}
|
|
1010
|
+
if (temp3 * 6 < 1) {
|
|
1011
|
+
return temp1 + (temp2 - temp1) * 6 * temp3;
|
|
1012
|
+
}
|
|
1013
|
+
if (temp3 * 2 < 1) {
|
|
1014
|
+
return temp2;
|
|
1015
|
+
}
|
|
1016
|
+
if (temp3 * 3 < 2) {
|
|
1017
|
+
return temp1 + (temp2 - temp1) * (2 / 3 - temp3) * 6;
|
|
1018
|
+
}
|
|
1019
|
+
return temp1;
|
|
1020
|
+
},
|
|
1021
|
+
temp1 = lNormalized < 0.5 ? lNormalized * (1 + sNormalized) : lNormalized + sNormalized - lNormalized * sNormalized,
|
|
1022
|
+
temp2 = 2 * lNormalized - temp1,
|
|
1023
|
+
red = Math.min(255, 255 * channel(temp2, temp1, hNormalized + 1 / 3)),
|
|
1024
|
+
green = Math.min(255, 255 * channel(temp2, temp1, hNormalized)),
|
|
1025
|
+
blue = Math.min(255, 255 * channel(temp2, temp1, hNormalized - 1 / 3));
|
|
1026
|
+
return {
|
|
1027
|
+
r: Math.round(red),
|
|
1028
|
+
g: Math.round(green),
|
|
1029
|
+
b: Math.round(blue)
|
|
1030
|
+
};
|
|
1040
1031
|
}
|
|
1041
1032
|
function hslaToRgba(hsla) {
|
|
1042
1033
|
const rgbResult = hslToRgb(hsla);
|
|
@@ -1170,13 +1161,6 @@ function drawLine(context, begin, end) {
|
|
|
1170
1161
|
context.lineTo(end.x, end.y);
|
|
1171
1162
|
context.closePath();
|
|
1172
1163
|
}
|
|
1173
|
-
function drawTriangle(context, p1, p2, p3) {
|
|
1174
|
-
context.beginPath();
|
|
1175
|
-
context.moveTo(p1.x, p1.y);
|
|
1176
|
-
context.lineTo(p2.x, p2.y);
|
|
1177
|
-
context.lineTo(p3.x, p3.y);
|
|
1178
|
-
context.closePath();
|
|
1179
|
-
}
|
|
1180
1164
|
function paintBase(context, dimension, baseColor) {
|
|
1181
1165
|
context.fillStyle = baseColor ?? "rgba(0,0,0,0)";
|
|
1182
1166
|
context.fillRect(0, 0, dimension.width, dimension.height);
|
|
@@ -1219,7 +1203,6 @@ function drawParticle(data) {
|
|
|
1219
1203
|
d: rotateData.cos * (transform.d ?? 1)
|
|
1220
1204
|
};
|
|
1221
1205
|
context.setTransform(transformData.a, transformData.b, transformData.c, transformData.d, pos.x, pos.y);
|
|
1222
|
-
context.beginPath();
|
|
1223
1206
|
if (backgroundMask) {
|
|
1224
1207
|
context.globalCompositeOperation = composite;
|
|
1225
1208
|
}
|
|
@@ -1246,20 +1229,47 @@ function drawParticle(data) {
|
|
|
1246
1229
|
opacity,
|
|
1247
1230
|
delta
|
|
1248
1231
|
};
|
|
1232
|
+
context.beginPath();
|
|
1249
1233
|
drawShape(drawData);
|
|
1234
|
+
if (particle.shapeClose) {
|
|
1235
|
+
context.closePath();
|
|
1236
|
+
}
|
|
1250
1237
|
if (strokeWidth > 0) {
|
|
1251
1238
|
context.stroke();
|
|
1252
1239
|
}
|
|
1253
|
-
if (particle.
|
|
1254
|
-
context.closePath();
|
|
1255
|
-
}
|
|
1256
|
-
if (particle.fill) {
|
|
1240
|
+
if (particle.shapeFill) {
|
|
1257
1241
|
context.fill();
|
|
1258
1242
|
}
|
|
1259
|
-
|
|
1243
|
+
drawShapeAfterDraw(drawData);
|
|
1244
|
+
drawEffect(drawData);
|
|
1260
1245
|
context.globalCompositeOperation = "source-over";
|
|
1261
1246
|
context.setTransform(1, 0, 0, 1, 0, 0);
|
|
1262
1247
|
}
|
|
1248
|
+
function drawEffect(data) {
|
|
1249
|
+
const {
|
|
1250
|
+
container,
|
|
1251
|
+
context,
|
|
1252
|
+
particle,
|
|
1253
|
+
radius,
|
|
1254
|
+
opacity,
|
|
1255
|
+
delta
|
|
1256
|
+
} = data;
|
|
1257
|
+
if (!particle.effect) {
|
|
1258
|
+
return;
|
|
1259
|
+
}
|
|
1260
|
+
const drawer = container.effectDrawers.get(particle.effect);
|
|
1261
|
+
if (!drawer) {
|
|
1262
|
+
return;
|
|
1263
|
+
}
|
|
1264
|
+
drawer.draw({
|
|
1265
|
+
context,
|
|
1266
|
+
particle,
|
|
1267
|
+
radius,
|
|
1268
|
+
opacity,
|
|
1269
|
+
delta,
|
|
1270
|
+
pixelRatio: container.retina.pixelRatio
|
|
1271
|
+
});
|
|
1272
|
+
}
|
|
1263
1273
|
function drawShape(data) {
|
|
1264
1274
|
const {
|
|
1265
1275
|
container,
|
|
@@ -1272,7 +1282,7 @@ function drawShape(data) {
|
|
|
1272
1282
|
if (!particle.shape) {
|
|
1273
1283
|
return;
|
|
1274
1284
|
}
|
|
1275
|
-
const drawer = container.
|
|
1285
|
+
const drawer = container.shapeDrawers.get(particle.shape);
|
|
1276
1286
|
if (!drawer) {
|
|
1277
1287
|
return;
|
|
1278
1288
|
}
|
|
@@ -1285,7 +1295,7 @@ function drawShape(data) {
|
|
|
1285
1295
|
pixelRatio: container.retina.pixelRatio
|
|
1286
1296
|
});
|
|
1287
1297
|
}
|
|
1288
|
-
function
|
|
1298
|
+
function drawShapeAfterDraw(data) {
|
|
1289
1299
|
const {
|
|
1290
1300
|
container,
|
|
1291
1301
|
context,
|
|
@@ -1297,11 +1307,11 @@ function drawShapeAfterEffect(data) {
|
|
|
1297
1307
|
if (!particle.shape) {
|
|
1298
1308
|
return;
|
|
1299
1309
|
}
|
|
1300
|
-
const drawer = container.
|
|
1301
|
-
if (!drawer || !drawer.
|
|
1310
|
+
const drawer = container.shapeDrawers.get(particle.shape);
|
|
1311
|
+
if (!drawer || !drawer.afterDraw) {
|
|
1302
1312
|
return;
|
|
1303
1313
|
}
|
|
1304
|
-
drawer.
|
|
1314
|
+
drawer.afterDraw({
|
|
1305
1315
|
context,
|
|
1306
1316
|
particle,
|
|
1307
1317
|
radius,
|
|
@@ -1755,10 +1765,10 @@ class Canvas {
|
|
|
1755
1765
|
this.element.width = size.width = this.element.offsetWidth * pxRatio;
|
|
1756
1766
|
this.element.height = size.height = this.element.offsetHeight * pxRatio;
|
|
1757
1767
|
if (this.container.started) {
|
|
1758
|
-
|
|
1768
|
+
container.particles.setResizeFactor({
|
|
1759
1769
|
width: size.width / oldSize.width,
|
|
1760
1770
|
height: size.height / oldSize.height
|
|
1761
|
-
};
|
|
1771
|
+
});
|
|
1762
1772
|
}
|
|
1763
1773
|
return true;
|
|
1764
1774
|
}
|
|
@@ -2228,10 +2238,10 @@ class BackgroundMask {
|
|
|
2228
2238
|
this.composite = data.composite;
|
|
2229
2239
|
}
|
|
2230
2240
|
if (data.cover !== undefined) {
|
|
2231
|
-
const cover = data.cover
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2241
|
+
const cover = data.cover,
|
|
2242
|
+
color = isString(data.cover) ? {
|
|
2243
|
+
color: data.cover
|
|
2244
|
+
} : data.cover;
|
|
2235
2245
|
this.cover.load(cover.color !== undefined ? cover : {
|
|
2236
2246
|
color: color
|
|
2237
2247
|
});
|
|
@@ -2533,17 +2543,16 @@ class Theme {
|
|
|
2533
2543
|
}
|
|
2534
2544
|
}
|
|
2535
2545
|
}
|
|
2536
|
-
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/
|
|
2546
|
+
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/AnimationOptions.js
|
|
2537
2547
|
|
|
2538
|
-
class
|
|
2548
|
+
class AnimationOptions {
|
|
2539
2549
|
constructor() {
|
|
2540
2550
|
this.count = 0;
|
|
2541
2551
|
this.enable = false;
|
|
2542
|
-
this.offset = 0;
|
|
2543
2552
|
this.speed = 1;
|
|
2544
|
-
this.delay = 0;
|
|
2545
2553
|
this.decay = 0;
|
|
2546
|
-
this.
|
|
2554
|
+
this.delay = 0;
|
|
2555
|
+
this.sync = false;
|
|
2547
2556
|
}
|
|
2548
2557
|
load(data) {
|
|
2549
2558
|
if (!data) {
|
|
@@ -2555,9 +2564,6 @@ class ColorAnimation {
|
|
|
2555
2564
|
if (data.enable !== undefined) {
|
|
2556
2565
|
this.enable = data.enable;
|
|
2557
2566
|
}
|
|
2558
|
-
if (data.offset !== undefined) {
|
|
2559
|
-
this.offset = setRangeValue(data.offset);
|
|
2560
|
-
}
|
|
2561
2567
|
if (data.speed !== undefined) {
|
|
2562
2568
|
this.speed = setRangeValue(data.speed);
|
|
2563
2569
|
}
|
|
@@ -2572,6 +2578,44 @@ class ColorAnimation {
|
|
|
2572
2578
|
}
|
|
2573
2579
|
}
|
|
2574
2580
|
}
|
|
2581
|
+
class RangedAnimationOptions extends AnimationOptions {
|
|
2582
|
+
constructor() {
|
|
2583
|
+
super();
|
|
2584
|
+
this.mode = "auto";
|
|
2585
|
+
this.startValue = "random";
|
|
2586
|
+
}
|
|
2587
|
+
load(data) {
|
|
2588
|
+
super.load(data);
|
|
2589
|
+
if (!data) {
|
|
2590
|
+
return;
|
|
2591
|
+
}
|
|
2592
|
+
if (data.mode !== undefined) {
|
|
2593
|
+
this.mode = data.mode;
|
|
2594
|
+
}
|
|
2595
|
+
if (data.startValue !== undefined) {
|
|
2596
|
+
this.startValue = data.startValue;
|
|
2597
|
+
}
|
|
2598
|
+
}
|
|
2599
|
+
}
|
|
2600
|
+
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/ColorAnimation.js
|
|
2601
|
+
|
|
2602
|
+
|
|
2603
|
+
class ColorAnimation extends AnimationOptions {
|
|
2604
|
+
constructor() {
|
|
2605
|
+
super();
|
|
2606
|
+
this.offset = 0;
|
|
2607
|
+
this.sync = true;
|
|
2608
|
+
}
|
|
2609
|
+
load(data) {
|
|
2610
|
+
super.load(data);
|
|
2611
|
+
if (!data) {
|
|
2612
|
+
return;
|
|
2613
|
+
}
|
|
2614
|
+
if (data.offset !== undefined) {
|
|
2615
|
+
this.offset = setRangeValue(data.offset);
|
|
2616
|
+
}
|
|
2617
|
+
}
|
|
2618
|
+
}
|
|
2575
2619
|
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/HslAnimation.js
|
|
2576
2620
|
|
|
2577
2621
|
class HslAnimation {
|
|
@@ -2659,99 +2703,19 @@ class CollisionsOverlap {
|
|
|
2659
2703
|
}
|
|
2660
2704
|
}
|
|
2661
2705
|
}
|
|
2662
|
-
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/AnimationOptions.js
|
|
2663
|
-
|
|
2664
|
-
class AnimationOptions {
|
|
2665
|
-
constructor() {
|
|
2666
|
-
this.count = 0;
|
|
2667
|
-
this.enable = false;
|
|
2668
|
-
this.speed = 1;
|
|
2669
|
-
this.decay = 0;
|
|
2670
|
-
this.delay = 0;
|
|
2671
|
-
this.sync = false;
|
|
2672
|
-
}
|
|
2673
|
-
load(data) {
|
|
2674
|
-
if (!data) {
|
|
2675
|
-
return;
|
|
2676
|
-
}
|
|
2677
|
-
if (data.count !== undefined) {
|
|
2678
|
-
this.count = setRangeValue(data.count);
|
|
2679
|
-
}
|
|
2680
|
-
if (data.enable !== undefined) {
|
|
2681
|
-
this.enable = data.enable;
|
|
2682
|
-
}
|
|
2683
|
-
if (data.speed !== undefined) {
|
|
2684
|
-
this.speed = setRangeValue(data.speed);
|
|
2685
|
-
}
|
|
2686
|
-
if (data.decay !== undefined) {
|
|
2687
|
-
this.decay = setRangeValue(data.decay);
|
|
2688
|
-
}
|
|
2689
|
-
if (data.delay !== undefined) {
|
|
2690
|
-
this.delay = setRangeValue(data.delay);
|
|
2691
|
-
}
|
|
2692
|
-
if (data.sync !== undefined) {
|
|
2693
|
-
this.sync = data.sync;
|
|
2694
|
-
}
|
|
2695
|
-
}
|
|
2696
|
-
}
|
|
2697
|
-
class RangedAnimationOptions extends AnimationOptions {
|
|
2698
|
-
constructor() {
|
|
2699
|
-
super();
|
|
2700
|
-
this.mode = "auto";
|
|
2701
|
-
this.startValue = "random";
|
|
2702
|
-
}
|
|
2703
|
-
load(data) {
|
|
2704
|
-
super.load(data);
|
|
2705
|
-
if (!data) {
|
|
2706
|
-
return;
|
|
2707
|
-
}
|
|
2708
|
-
if (data.mode !== undefined) {
|
|
2709
|
-
this.mode = data.mode;
|
|
2710
|
-
}
|
|
2711
|
-
if (data.startValue !== undefined) {
|
|
2712
|
-
this.startValue = data.startValue;
|
|
2713
|
-
}
|
|
2714
|
-
}
|
|
2715
|
-
}
|
|
2716
|
-
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/Random.js
|
|
2717
|
-
class Random {
|
|
2718
|
-
constructor() {
|
|
2719
|
-
this.enable = false;
|
|
2720
|
-
this.minimumValue = 0;
|
|
2721
|
-
}
|
|
2722
|
-
load(data) {
|
|
2723
|
-
if (!data) {
|
|
2724
|
-
return;
|
|
2725
|
-
}
|
|
2726
|
-
if (data.enable !== undefined) {
|
|
2727
|
-
this.enable = data.enable;
|
|
2728
|
-
}
|
|
2729
|
-
if (data.minimumValue !== undefined) {
|
|
2730
|
-
this.minimumValue = data.minimumValue;
|
|
2731
|
-
}
|
|
2732
|
-
}
|
|
2733
|
-
}
|
|
2734
2706
|
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/ValueWithRandom.js
|
|
2735
2707
|
|
|
2736
2708
|
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
2709
|
class ValueWithRandom {
|
|
2740
2710
|
constructor() {
|
|
2741
|
-
this.random = new Random();
|
|
2742
2711
|
this.value = 0;
|
|
2743
2712
|
}
|
|
2744
2713
|
load(data) {
|
|
2745
2714
|
if (!data) {
|
|
2746
2715
|
return;
|
|
2747
2716
|
}
|
|
2748
|
-
if (isBoolean(data.random)) {
|
|
2749
|
-
this.random.enable = data.random;
|
|
2750
|
-
} else {
|
|
2751
|
-
this.random.load(data.random);
|
|
2752
|
-
}
|
|
2753
2717
|
if (data.value !== undefined) {
|
|
2754
|
-
this.value = setRangeValue(data.value
|
|
2718
|
+
this.value = setRangeValue(data.value);
|
|
2755
2719
|
}
|
|
2756
2720
|
}
|
|
2757
2721
|
}
|
|
@@ -2785,7 +2749,6 @@ class RangedAnimationValueWithRandom extends AnimationValueWithRandom {
|
|
|
2785
2749
|
class ParticlesBounceFactor extends ValueWithRandom {
|
|
2786
2750
|
constructor() {
|
|
2787
2751
|
super();
|
|
2788
|
-
this.random.minimumValue = 0.1;
|
|
2789
2752
|
this.value = 1;
|
|
2790
2753
|
}
|
|
2791
2754
|
}
|
|
@@ -2836,6 +2799,39 @@ class Collisions {
|
|
|
2836
2799
|
this.overlap.load(data.overlap);
|
|
2837
2800
|
}
|
|
2838
2801
|
}
|
|
2802
|
+
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/Particles/Effect/Effect.js
|
|
2803
|
+
|
|
2804
|
+
class Effect {
|
|
2805
|
+
constructor() {
|
|
2806
|
+
this.close = true;
|
|
2807
|
+
this.fill = true;
|
|
2808
|
+
this.options = {};
|
|
2809
|
+
this.type = [];
|
|
2810
|
+
}
|
|
2811
|
+
load(data) {
|
|
2812
|
+
if (!data) {
|
|
2813
|
+
return;
|
|
2814
|
+
}
|
|
2815
|
+
const options = data.options;
|
|
2816
|
+
if (options !== undefined) {
|
|
2817
|
+
for (const effect in options) {
|
|
2818
|
+
const item = options[effect];
|
|
2819
|
+
if (item) {
|
|
2820
|
+
this.options[effect] = deepExtend(this.options[effect] ?? {}, item);
|
|
2821
|
+
}
|
|
2822
|
+
}
|
|
2823
|
+
}
|
|
2824
|
+
if (data.close !== undefined) {
|
|
2825
|
+
this.close = data.close;
|
|
2826
|
+
}
|
|
2827
|
+
if (data.fill !== undefined) {
|
|
2828
|
+
this.fill = data.fill;
|
|
2829
|
+
}
|
|
2830
|
+
if (data.type !== undefined) {
|
|
2831
|
+
this.type = data.type;
|
|
2832
|
+
}
|
|
2833
|
+
}
|
|
2834
|
+
}
|
|
2839
2835
|
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/Particles/Move/MoveAngle.js
|
|
2840
2836
|
|
|
2841
2837
|
class MoveAngle {
|
|
@@ -3164,11 +3160,10 @@ class OpacityAnimation extends RangedAnimationOptions {
|
|
|
3164
3160
|
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/Particles/Opacity/Opacity.js
|
|
3165
3161
|
|
|
3166
3162
|
|
|
3167
|
-
class Opacity extends
|
|
3163
|
+
class Opacity extends RangedAnimationValueWithRandom {
|
|
3168
3164
|
constructor() {
|
|
3169
3165
|
super();
|
|
3170
3166
|
this.animation = new OpacityAnimation();
|
|
3171
|
-
this.random.minimumValue = 0.1;
|
|
3172
3167
|
this.value = 1;
|
|
3173
3168
|
}
|
|
3174
3169
|
load(data) {
|
|
@@ -3206,12 +3201,31 @@ class ParticlesDensity {
|
|
|
3206
3201
|
}
|
|
3207
3202
|
}
|
|
3208
3203
|
}
|
|
3204
|
+
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/Particles/Number/ParticlesNumberLimit.js
|
|
3205
|
+
class ParticlesNumberLimit {
|
|
3206
|
+
constructor() {
|
|
3207
|
+
this.mode = "delete";
|
|
3208
|
+
this.value = 0;
|
|
3209
|
+
}
|
|
3210
|
+
load(data) {
|
|
3211
|
+
if (!data) {
|
|
3212
|
+
return;
|
|
3213
|
+
}
|
|
3214
|
+
if (data.mode !== undefined) {
|
|
3215
|
+
this.mode = data.mode;
|
|
3216
|
+
}
|
|
3217
|
+
if (data.value !== undefined) {
|
|
3218
|
+
this.value = data.value;
|
|
3219
|
+
}
|
|
3220
|
+
}
|
|
3221
|
+
}
|
|
3209
3222
|
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/Particles/Number/ParticlesNumber.js
|
|
3210
3223
|
|
|
3224
|
+
|
|
3211
3225
|
class ParticlesNumber {
|
|
3212
3226
|
constructor() {
|
|
3213
3227
|
this.density = new ParticlesDensity();
|
|
3214
|
-
this.limit =
|
|
3228
|
+
this.limit = new ParticlesNumberLimit();
|
|
3215
3229
|
this.value = 0;
|
|
3216
3230
|
}
|
|
3217
3231
|
load(data) {
|
|
@@ -3219,10 +3233,7 @@ class ParticlesNumber {
|
|
|
3219
3233
|
return;
|
|
3220
3234
|
}
|
|
3221
3235
|
this.density.load(data.density);
|
|
3222
|
-
|
|
3223
|
-
if (limit !== undefined) {
|
|
3224
|
-
this.limit = limit;
|
|
3225
|
-
}
|
|
3236
|
+
this.limit.load(data.limit);
|
|
3226
3237
|
if (data.value !== undefined) {
|
|
3227
3238
|
this.value = data.value;
|
|
3228
3239
|
}
|
|
@@ -3317,11 +3328,10 @@ class SizeAnimation extends RangedAnimationOptions {
|
|
|
3317
3328
|
;// CONCATENATED MODULE: ../../engine/dist/browser/Options/Classes/Particles/Size/Size.js
|
|
3318
3329
|
|
|
3319
3330
|
|
|
3320
|
-
class Size extends
|
|
3331
|
+
class Size extends RangedAnimationValueWithRandom {
|
|
3321
3332
|
constructor() {
|
|
3322
3333
|
super();
|
|
3323
3334
|
this.animation = new SizeAnimation();
|
|
3324
|
-
this.random.minimumValue = 1;
|
|
3325
3335
|
this.value = 3;
|
|
3326
3336
|
}
|
|
3327
3337
|
load(data) {
|
|
@@ -3395,6 +3405,7 @@ class ZIndex extends ValueWithRandom {
|
|
|
3395
3405
|
|
|
3396
3406
|
|
|
3397
3407
|
|
|
3408
|
+
|
|
3398
3409
|
class ParticlesOptions {
|
|
3399
3410
|
constructor(engine, container) {
|
|
3400
3411
|
this._engine = engine;
|
|
@@ -3403,6 +3414,7 @@ class ParticlesOptions {
|
|
|
3403
3414
|
this.collisions = new Collisions();
|
|
3404
3415
|
this.color = new AnimatableColor();
|
|
3405
3416
|
this.color.value = "#fff";
|
|
3417
|
+
this.effect = new Effect();
|
|
3406
3418
|
this.groups = {};
|
|
3407
3419
|
this.move = new Move();
|
|
3408
3420
|
this.number = new ParticlesNumber();
|
|
@@ -3420,6 +3432,7 @@ class ParticlesOptions {
|
|
|
3420
3432
|
}
|
|
3421
3433
|
this.bounce.load(data.bounce);
|
|
3422
3434
|
this.color.load(AnimatableColor.create(this.color, data.color));
|
|
3435
|
+
this.effect.load(data.effect);
|
|
3423
3436
|
if (data.groups !== undefined) {
|
|
3424
3437
|
for (const group in data.groups) {
|
|
3425
3438
|
const item = data.groups[group];
|
|
@@ -3692,6 +3705,16 @@ class InteractionManager {
|
|
|
3692
3705
|
|
|
3693
3706
|
|
|
3694
3707
|
|
|
3708
|
+
function loadEffectData(effect, effectOptions, id, reduceDuplicates) {
|
|
3709
|
+
const effectData = effectOptions.options[effect];
|
|
3710
|
+
if (!effectData) {
|
|
3711
|
+
return;
|
|
3712
|
+
}
|
|
3713
|
+
return deepExtend({
|
|
3714
|
+
close: effectOptions.close,
|
|
3715
|
+
fill: effectOptions.fill
|
|
3716
|
+
}, itemFromSingleOrMultiple(effectData, id, reduceDuplicates));
|
|
3717
|
+
}
|
|
3695
3718
|
function loadShapeData(shape, shapeOptions, id, reduceDuplicates) {
|
|
3696
3719
|
const shapeData = shapeOptions.options[shape];
|
|
3697
3720
|
if (!shapeData) {
|
|
@@ -3770,8 +3793,8 @@ class Particle {
|
|
|
3770
3793
|
const rad = Math.PI / 180 * getRangeValue(moveOptions.angle.value),
|
|
3771
3794
|
radOffset = Math.PI / 180 * getRangeValue(moveOptions.angle.offset),
|
|
3772
3795
|
range = {
|
|
3773
|
-
left: radOffset - rad
|
|
3774
|
-
right: radOffset + rad
|
|
3796
|
+
left: radOffset - rad * 0.5,
|
|
3797
|
+
right: radOffset + rad * 0.5
|
|
3775
3798
|
};
|
|
3776
3799
|
if (!moveOptions.straight) {
|
|
3777
3800
|
res.angle += randomInRange(setRangeValue(range.left, range.right));
|
|
@@ -3802,7 +3825,7 @@ class Particle {
|
|
|
3802
3825
|
return color;
|
|
3803
3826
|
}
|
|
3804
3827
|
const backFactor = this.roll.horizontal && this.roll.vertical ? 2 : 1,
|
|
3805
|
-
backSum = this.roll.horizontal ? Math.PI
|
|
3828
|
+
backSum = this.roll.horizontal ? Math.PI * 0.5 : 0,
|
|
3806
3829
|
rolled = Math.floor(((this.roll.angle ?? 0) + backSum) / (Math.PI / backFactor)) % 2;
|
|
3807
3830
|
if (!rolled) {
|
|
3808
3831
|
return color;
|
|
@@ -3850,18 +3873,12 @@ class Particle {
|
|
|
3850
3873
|
const container = this.container,
|
|
3851
3874
|
pathGenerator = this.pathGenerator;
|
|
3852
3875
|
for (const [, plugin] of container.plugins) {
|
|
3853
|
-
|
|
3854
|
-
plugin.particleDestroyed(this, override);
|
|
3855
|
-
}
|
|
3876
|
+
plugin.particleDestroyed && plugin.particleDestroyed(this, override);
|
|
3856
3877
|
}
|
|
3857
3878
|
for (const updater of container.particles.updaters) {
|
|
3858
|
-
|
|
3859
|
-
updater.particleDestroyed(this, override);
|
|
3860
|
-
}
|
|
3861
|
-
}
|
|
3862
|
-
if (pathGenerator) {
|
|
3863
|
-
pathGenerator.reset(this);
|
|
3879
|
+
updater.particleDestroyed && updater.particleDestroyed(this, override);
|
|
3864
3880
|
}
|
|
3881
|
+
pathGenerator && pathGenerator.reset(this);
|
|
3865
3882
|
}
|
|
3866
3883
|
draw(delta) {
|
|
3867
3884
|
const container = this.container,
|
|
@@ -3875,7 +3892,7 @@ class Particle {
|
|
|
3875
3892
|
return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.color));
|
|
3876
3893
|
}
|
|
3877
3894
|
getMass() {
|
|
3878
|
-
return this.getRadius() ** 2 * Math.PI
|
|
3895
|
+
return this.getRadius() ** 2 * Math.PI * 0.5;
|
|
3879
3896
|
}
|
|
3880
3897
|
getPosition() {
|
|
3881
3898
|
return {
|
|
@@ -3895,9 +3912,11 @@ class Particle {
|
|
|
3895
3912
|
engine = this._engine;
|
|
3896
3913
|
this.id = id;
|
|
3897
3914
|
this.group = group;
|
|
3898
|
-
this.
|
|
3915
|
+
this.effectClose = true;
|
|
3916
|
+
this.effectFill = true;
|
|
3917
|
+
this.shapeClose = true;
|
|
3918
|
+
this.shapeFill = true;
|
|
3899
3919
|
this.pathRotation = false;
|
|
3900
|
-
this.close = true;
|
|
3901
3920
|
this.lastPathTime = 0;
|
|
3902
3921
|
this.destroyed = false;
|
|
3903
3922
|
this.unbreakable = false;
|
|
@@ -3911,22 +3930,40 @@ class Particle {
|
|
|
3911
3930
|
const pxRatio = container.retina.pixelRatio,
|
|
3912
3931
|
mainOptions = container.actualOptions,
|
|
3913
3932
|
particlesOptions = loadParticlesOptions(this._engine, container, mainOptions.particles),
|
|
3933
|
+
effectType = particlesOptions.effect.type,
|
|
3914
3934
|
shapeType = particlesOptions.shape.type,
|
|
3915
3935
|
{
|
|
3916
3936
|
reduceDuplicates
|
|
3917
3937
|
} = particlesOptions;
|
|
3938
|
+
this.effect = itemFromSingleOrMultiple(effectType, this.id, reduceDuplicates);
|
|
3918
3939
|
this.shape = itemFromSingleOrMultiple(shapeType, this.id, reduceDuplicates);
|
|
3919
|
-
const
|
|
3920
|
-
|
|
3921
|
-
|
|
3922
|
-
|
|
3923
|
-
|
|
3924
|
-
|
|
3925
|
-
|
|
3940
|
+
const effectOptions = particlesOptions.effect,
|
|
3941
|
+
shapeOptions = particlesOptions.shape;
|
|
3942
|
+
if (overrideOptions) {
|
|
3943
|
+
if (overrideOptions.effect && overrideOptions.effect.type) {
|
|
3944
|
+
const overrideEffectType = overrideOptions.effect.type,
|
|
3945
|
+
effect = itemFromSingleOrMultiple(overrideEffectType, this.id, reduceDuplicates);
|
|
3946
|
+
if (effect) {
|
|
3947
|
+
this.effect = effect;
|
|
3948
|
+
effectOptions.load(overrideOptions.effect);
|
|
3949
|
+
}
|
|
3950
|
+
}
|
|
3951
|
+
if (overrideOptions.shape && overrideOptions.shape.type) {
|
|
3952
|
+
const overrideShapeType = overrideOptions.shape.type,
|
|
3953
|
+
shape = itemFromSingleOrMultiple(overrideShapeType, this.id, reduceDuplicates);
|
|
3954
|
+
if (shape) {
|
|
3955
|
+
this.shape = shape;
|
|
3956
|
+
shapeOptions.load(overrideOptions.shape);
|
|
3957
|
+
}
|
|
3926
3958
|
}
|
|
3927
3959
|
}
|
|
3960
|
+
this.effectData = loadEffectData(this.effect, effectOptions, this.id, reduceDuplicates);
|
|
3928
3961
|
this.shapeData = loadShapeData(this.shape, shapeOptions, this.id, reduceDuplicates);
|
|
3929
3962
|
particlesOptions.load(overrideOptions);
|
|
3963
|
+
const effectData = this.effectData;
|
|
3964
|
+
if (effectData) {
|
|
3965
|
+
particlesOptions.load(effectData.particles);
|
|
3966
|
+
}
|
|
3930
3967
|
const shapeData = this.shapeData;
|
|
3931
3968
|
if (shapeData) {
|
|
3932
3969
|
particlesOptions.load(shapeData.particles);
|
|
@@ -3935,11 +3972,13 @@ class Particle {
|
|
|
3935
3972
|
interactivity.load(container.actualOptions.interactivity);
|
|
3936
3973
|
interactivity.load(particlesOptions.interactivity);
|
|
3937
3974
|
this.interactivity = interactivity;
|
|
3938
|
-
this.
|
|
3939
|
-
this.
|
|
3975
|
+
this.effectFill = effectData?.fill ?? particlesOptions.effect.fill;
|
|
3976
|
+
this.effectClose = effectData?.close ?? particlesOptions.effect.close;
|
|
3977
|
+
this.shapeFill = shapeData?.fill ?? particlesOptions.shape.fill;
|
|
3978
|
+
this.shapeClose = shapeData?.close ?? particlesOptions.shape.close;
|
|
3940
3979
|
this.options = particlesOptions;
|
|
3941
3980
|
const pathOptions = this.options.move.path;
|
|
3942
|
-
this.pathDelay =
|
|
3981
|
+
this.pathDelay = getRangeValue(pathOptions.delay.value) * 1000;
|
|
3943
3982
|
if (pathOptions.generator) {
|
|
3944
3983
|
this.pathGenerator = this._engine.getPathGenerator(pathOptions.generator);
|
|
3945
3984
|
if (this.pathGenerator && container.addPath(pathOptions.generator, this.pathGenerator)) {
|
|
@@ -3960,34 +3999,46 @@ class Particle {
|
|
|
3960
3999
|
this.velocity = this.initialVelocity.copy();
|
|
3961
4000
|
this.moveDecay = 1 - getRangeValue(this.options.move.decay);
|
|
3962
4001
|
const particles = container.particles;
|
|
3963
|
-
particles.
|
|
3964
|
-
particles.lastZIndex = this.position.z;
|
|
4002
|
+
particles.setLastZIndex(this.position.z);
|
|
3965
4003
|
this.zIndexFactor = this.position.z / container.zLayers;
|
|
3966
4004
|
this.sides = 24;
|
|
3967
|
-
let
|
|
3968
|
-
if (!
|
|
3969
|
-
|
|
3970
|
-
if (
|
|
3971
|
-
container.
|
|
4005
|
+
let effectDrawer = container.effectDrawers.get(this.effect);
|
|
4006
|
+
if (!effectDrawer) {
|
|
4007
|
+
effectDrawer = this._engine.getEffectDrawer(this.effect);
|
|
4008
|
+
if (effectDrawer) {
|
|
4009
|
+
container.effectDrawers.set(this.effect, effectDrawer);
|
|
4010
|
+
}
|
|
4011
|
+
}
|
|
4012
|
+
if (effectDrawer && effectDrawer.loadEffect) {
|
|
4013
|
+
effectDrawer.loadEffect(this);
|
|
4014
|
+
}
|
|
4015
|
+
let shapeDrawer = container.shapeDrawers.get(this.shape);
|
|
4016
|
+
if (!shapeDrawer) {
|
|
4017
|
+
shapeDrawer = this._engine.getShapeDrawer(this.shape);
|
|
4018
|
+
if (shapeDrawer) {
|
|
4019
|
+
container.shapeDrawers.set(this.shape, shapeDrawer);
|
|
3972
4020
|
}
|
|
3973
4021
|
}
|
|
3974
|
-
if (
|
|
3975
|
-
|
|
4022
|
+
if (shapeDrawer && shapeDrawer.loadShape) {
|
|
4023
|
+
shapeDrawer.loadShape(this);
|
|
3976
4024
|
}
|
|
3977
|
-
const sideCountFunc =
|
|
4025
|
+
const sideCountFunc = shapeDrawer?.getSidesCount;
|
|
3978
4026
|
if (sideCountFunc) {
|
|
3979
4027
|
this.sides = sideCountFunc(this);
|
|
3980
4028
|
}
|
|
3981
4029
|
this.spawning = false;
|
|
3982
4030
|
this.shadowColor = rangeColorToRgb(this.options.shadow.color);
|
|
3983
|
-
for (const updater of
|
|
4031
|
+
for (const updater of particles.updaters) {
|
|
3984
4032
|
updater.init(this);
|
|
3985
4033
|
}
|
|
3986
|
-
for (const mover of
|
|
4034
|
+
for (const mover of particles.movers) {
|
|
3987
4035
|
mover.init && mover.init(this);
|
|
3988
4036
|
}
|
|
3989
|
-
if (
|
|
3990
|
-
|
|
4037
|
+
if (effectDrawer && effectDrawer.particleInit) {
|
|
4038
|
+
effectDrawer.particleInit(container, this);
|
|
4039
|
+
}
|
|
4040
|
+
if (shapeDrawer && shapeDrawer.particleInit) {
|
|
4041
|
+
shapeDrawer.particleInit(container, this);
|
|
3991
4042
|
}
|
|
3992
4043
|
for (const [, plugin] of container.plugins) {
|
|
3993
4044
|
plugin.particleCreated && plugin.particleCreated(this);
|
|
@@ -4114,7 +4165,7 @@ class QuadTree {
|
|
|
4114
4165
|
capacity
|
|
4115
4166
|
} = this;
|
|
4116
4167
|
for (let i = 0; i < 4; i++) {
|
|
4117
|
-
this._subs.push(new QuadTree(new Rectangle(x + width
|
|
4168
|
+
this._subs.push(new QuadTree(new Rectangle(x + width * 0.5 * (i % 2), y + height * 0.5 * (Math.round(i * 0.5) - i % 2), width * 0.5, height * 0.5), capacity));
|
|
4118
4169
|
}
|
|
4119
4170
|
this._divided = true;
|
|
4120
4171
|
};
|
|
@@ -4170,21 +4221,36 @@ class QuadTree {
|
|
|
4170
4221
|
|
|
4171
4222
|
const qTreeCapacity = 4;
|
|
4172
4223
|
const qTreeRectangle = canvasSize => {
|
|
4173
|
-
|
|
4224
|
+
const {
|
|
4225
|
+
height,
|
|
4226
|
+
width
|
|
4227
|
+
} = canvasSize,
|
|
4228
|
+
posOffset = -0.25,
|
|
4229
|
+
sizeFactor = 1.5;
|
|
4230
|
+
return new Rectangle(posOffset * width, posOffset * height, sizeFactor * width, sizeFactor * height);
|
|
4174
4231
|
};
|
|
4175
4232
|
class Particles {
|
|
4176
4233
|
constructor(engine, container) {
|
|
4177
4234
|
this._applyDensity = (options, manualCount, group) => {
|
|
4235
|
+
const numberOptions = options.number;
|
|
4178
4236
|
if (!options.number.density?.enable) {
|
|
4237
|
+
if (group === undefined) {
|
|
4238
|
+
this._limit = numberOptions.limit.value;
|
|
4239
|
+
} else {
|
|
4240
|
+
this._groupLimits.set(group, numberOptions.limit.value);
|
|
4241
|
+
}
|
|
4179
4242
|
return;
|
|
4180
4243
|
}
|
|
4181
|
-
const
|
|
4182
|
-
densityFactor = this._initDensityFactor(numberOptions.density),
|
|
4244
|
+
const densityFactor = this._initDensityFactor(numberOptions.density),
|
|
4183
4245
|
optParticlesNumber = numberOptions.value,
|
|
4184
|
-
optParticlesLimit = numberOptions.limit > 0 ? numberOptions.limit : optParticlesNumber,
|
|
4246
|
+
optParticlesLimit = numberOptions.limit.value > 0 ? numberOptions.limit.value : optParticlesNumber,
|
|
4185
4247
|
particlesNumber = Math.min(optParticlesNumber, optParticlesLimit) * densityFactor + manualCount,
|
|
4186
4248
|
particlesCount = Math.min(this.count, this.filter(t => t.group === group).length);
|
|
4187
|
-
|
|
4249
|
+
if (group === undefined) {
|
|
4250
|
+
this._limit = numberOptions.limit.value * densityFactor;
|
|
4251
|
+
} else {
|
|
4252
|
+
this._groupLimits.set(group, numberOptions.limit.value * densityFactor);
|
|
4253
|
+
}
|
|
4188
4254
|
if (particlesCount < particlesNumber) {
|
|
4189
4255
|
this.push(Math.abs(particlesNumber - particlesCount), undefined, options, group);
|
|
4190
4256
|
} else if (particlesCount > particlesNumber) {
|
|
@@ -4202,7 +4268,7 @@ class Particles {
|
|
|
4202
4268
|
};
|
|
4203
4269
|
this._pushParticle = (position, overrideOptions, group, initializer) => {
|
|
4204
4270
|
try {
|
|
4205
|
-
let particle = this.
|
|
4271
|
+
let particle = this._pool.pop();
|
|
4206
4272
|
if (particle) {
|
|
4207
4273
|
particle.init(this._nextId, position, overrideOptions, group);
|
|
4208
4274
|
} else {
|
|
@@ -4239,7 +4305,7 @@ class Particles {
|
|
|
4239
4305
|
const zIdx = this._zArray.indexOf(particle);
|
|
4240
4306
|
this._array.splice(index, 1);
|
|
4241
4307
|
this._zArray.splice(zIdx, 1);
|
|
4242
|
-
this.
|
|
4308
|
+
this._pool.push(particle);
|
|
4243
4309
|
this._engine.dispatchEvent("particleRemoved", {
|
|
4244
4310
|
container: this._container,
|
|
4245
4311
|
data: {
|
|
@@ -4253,10 +4319,11 @@ class Particles {
|
|
|
4253
4319
|
this._nextId = 0;
|
|
4254
4320
|
this._array = [];
|
|
4255
4321
|
this._zArray = [];
|
|
4256
|
-
this.
|
|
4257
|
-
this.
|
|
4258
|
-
this.
|
|
4259
|
-
this.
|
|
4322
|
+
this._pool = [];
|
|
4323
|
+
this._limit = 0;
|
|
4324
|
+
this._groupLimits = new Map();
|
|
4325
|
+
this._needsSort = false;
|
|
4326
|
+
this._lastZIndex = 0;
|
|
4260
4327
|
this._interactionManager = new InteractionManager(engine, container);
|
|
4261
4328
|
const canvasSize = container.canvas.size;
|
|
4262
4329
|
this.quadTree = new QuadTree(qTreeRectangle(canvasSize), qTreeCapacity);
|
|
@@ -4274,19 +4341,22 @@ class Particles {
|
|
|
4274
4341
|
}
|
|
4275
4342
|
}
|
|
4276
4343
|
addParticle(position, overrideOptions, group, initializer) {
|
|
4277
|
-
|
|
4278
|
-
|
|
4279
|
-
|
|
4280
|
-
limit = options.particles.number.limit;
|
|
4344
|
+
const limitOptions = this._container.actualOptions.particles.number.limit,
|
|
4345
|
+
limit = group === undefined ? this._limit : this._groupLimits.get(group) ?? this._limit,
|
|
4346
|
+
currentCount = this.count;
|
|
4281
4347
|
if (limit > 0) {
|
|
4282
|
-
|
|
4283
|
-
|
|
4284
|
-
|
|
4348
|
+
if (limitOptions.mode === "delete") {
|
|
4349
|
+
const countToRemove = currentCount + 1 - limit;
|
|
4350
|
+
if (countToRemove > 0) {
|
|
4351
|
+
this.removeQuantity(countToRemove);
|
|
4352
|
+
}
|
|
4353
|
+
} else if (limitOptions.mode === "wait") {
|
|
4354
|
+
if (currentCount >= limit) {
|
|
4355
|
+
return;
|
|
4356
|
+
}
|
|
4285
4357
|
}
|
|
4286
4358
|
}
|
|
4287
|
-
|
|
4288
|
-
this.pushing = false;
|
|
4289
|
-
return res;
|
|
4359
|
+
return this._pushParticle(position, overrideOptions, group, initializer);
|
|
4290
4360
|
}
|
|
4291
4361
|
clear() {
|
|
4292
4362
|
this._array = [];
|
|
@@ -4325,8 +4395,8 @@ class Particles {
|
|
|
4325
4395
|
init() {
|
|
4326
4396
|
const container = this._container,
|
|
4327
4397
|
options = container.actualOptions;
|
|
4328
|
-
this.
|
|
4329
|
-
this.
|
|
4398
|
+
this._lastZIndex = 0;
|
|
4399
|
+
this._needsSort = false;
|
|
4330
4400
|
let handled = false;
|
|
4331
4401
|
this.updaters = this._engine.getUpdaters(container, true);
|
|
4332
4402
|
this._interactionManager.init();
|
|
@@ -4393,6 +4463,13 @@ class Particles {
|
|
|
4393
4463
|
}
|
|
4394
4464
|
this._applyDensity(options.particles, options.manualParticles.length);
|
|
4395
4465
|
}
|
|
4466
|
+
setLastZIndex(zIndex) {
|
|
4467
|
+
this._lastZIndex = zIndex;
|
|
4468
|
+
this._needsSort = this._needsSort || this._lastZIndex < zIndex;
|
|
4469
|
+
}
|
|
4470
|
+
setResizeFactor(factor) {
|
|
4471
|
+
this._resizeFactor = factor;
|
|
4472
|
+
}
|
|
4396
4473
|
async update(delta) {
|
|
4397
4474
|
const container = this._container,
|
|
4398
4475
|
particlesToDelete = new Set();
|
|
@@ -4401,10 +4478,10 @@ class Particles {
|
|
|
4401
4478
|
pathGenerator.update();
|
|
4402
4479
|
}
|
|
4403
4480
|
for (const [, plugin] of container.plugins) {
|
|
4404
|
-
plugin.update && plugin.update(delta);
|
|
4481
|
+
plugin.update && (await plugin.update(delta));
|
|
4405
4482
|
}
|
|
4483
|
+
const resizeFactor = this._resizeFactor;
|
|
4406
4484
|
for (const particle of this._array) {
|
|
4407
|
-
const resizeFactor = container.canvas.resizeFactor;
|
|
4408
4485
|
if (resizeFactor && !particle.ignoresResizeRatio) {
|
|
4409
4486
|
particle.position.x *= resizeFactor.width;
|
|
4410
4487
|
particle.position.y *= resizeFactor.height;
|
|
@@ -4432,7 +4509,7 @@ class Particles {
|
|
|
4432
4509
|
const checkDelete = p => !particlesToDelete.has(p);
|
|
4433
4510
|
this._array = this.filter(checkDelete);
|
|
4434
4511
|
this._zArray = this._zArray.filter(checkDelete);
|
|
4435
|
-
this.
|
|
4512
|
+
this._pool.push(...particlesToDelete);
|
|
4436
4513
|
}
|
|
4437
4514
|
await this._interactionManager.externalInteract(delta);
|
|
4438
4515
|
for (const particle of this._array) {
|
|
@@ -4443,12 +4520,12 @@ class Particles {
|
|
|
4443
4520
|
await this._interactionManager.particlesInteract(particle, delta);
|
|
4444
4521
|
}
|
|
4445
4522
|
}
|
|
4446
|
-
delete
|
|
4447
|
-
if (this.
|
|
4523
|
+
delete this._resizeFactor;
|
|
4524
|
+
if (this._needsSort) {
|
|
4448
4525
|
const zArray = this._zArray;
|
|
4449
4526
|
zArray.sort((a, b) => b.position.z - a.position.z || a.id - b.id);
|
|
4450
|
-
this.
|
|
4451
|
-
this.
|
|
4527
|
+
this._lastZIndex = zArray[zArray.length - 1].position.z;
|
|
4528
|
+
this._needsSort = false;
|
|
4452
4529
|
}
|
|
4453
4530
|
}
|
|
4454
4531
|
}
|
|
@@ -4475,7 +4552,6 @@ class Retina {
|
|
|
4475
4552
|
}
|
|
4476
4553
|
const particles = options.particles,
|
|
4477
4554
|
moveOptions = particles.move;
|
|
4478
|
-
this.attractDistance = getRangeValue(moveOptions.attract.distance) * ratio;
|
|
4479
4555
|
this.maxSpeed = getRangeValue(moveOptions.gravity.maxSpeed) * ratio;
|
|
4480
4556
|
this.sizeAnimationSpeed = getRangeValue(particles.size.animation.speed) * ratio;
|
|
4481
4557
|
}
|
|
@@ -4485,7 +4561,6 @@ class Retina {
|
|
|
4485
4561
|
moveOptions = options.move,
|
|
4486
4562
|
moveDistance = moveOptions.distance,
|
|
4487
4563
|
props = particle.retina;
|
|
4488
|
-
props.attractDistance = getRangeValue(moveOptions.attract.distance) * ratio;
|
|
4489
4564
|
props.moveDrift = getRangeValue(moveOptions.drift) * ratio;
|
|
4490
4565
|
props.moveSpeed = getRangeValue(moveOptions.speed) * ratio;
|
|
4491
4566
|
props.sizeAnimationSpeed = getRangeValue(options.size.animation.speed) * ratio;
|
|
@@ -4534,14 +4609,14 @@ class Container {
|
|
|
4534
4609
|
};
|
|
4535
4610
|
this._nextFrame = async timestamp => {
|
|
4536
4611
|
try {
|
|
4537
|
-
if (!this.
|
|
4612
|
+
if (!this._smooth && this._lastFrameTime !== undefined && timestamp < this._lastFrameTime + 1000 / this.fpsLimit) {
|
|
4538
4613
|
this.draw(false);
|
|
4539
4614
|
return;
|
|
4540
4615
|
}
|
|
4541
|
-
this.
|
|
4542
|
-
const delta = initDelta(timestamp - this.
|
|
4616
|
+
this._lastFrameTime ??= timestamp;
|
|
4617
|
+
const delta = initDelta(timestamp - this._lastFrameTime, this.fpsLimit, this._smooth);
|
|
4543
4618
|
this.addLifeTime(delta.value);
|
|
4544
|
-
this.
|
|
4619
|
+
this._lastFrameTime = timestamp;
|
|
4545
4620
|
if (delta.value > 1000) {
|
|
4546
4621
|
this.draw(false);
|
|
4547
4622
|
return;
|
|
@@ -4561,7 +4636,7 @@ class Container {
|
|
|
4561
4636
|
this._engine = engine;
|
|
4562
4637
|
this.id = Symbol(id);
|
|
4563
4638
|
this.fpsLimit = 120;
|
|
4564
|
-
this.
|
|
4639
|
+
this._smooth = false;
|
|
4565
4640
|
this._delay = 0;
|
|
4566
4641
|
this._duration = 0;
|
|
4567
4642
|
this._lifeTime = 0;
|
|
@@ -4569,7 +4644,7 @@ class Container {
|
|
|
4569
4644
|
this.started = false;
|
|
4570
4645
|
this.destroyed = false;
|
|
4571
4646
|
this._paused = true;
|
|
4572
|
-
this.
|
|
4647
|
+
this._lastFrameTime = 0;
|
|
4573
4648
|
this.zLayers = 100;
|
|
4574
4649
|
this.pageHidden = false;
|
|
4575
4650
|
this._sourceOptions = sourceOptions;
|
|
@@ -4585,7 +4660,8 @@ class Container {
|
|
|
4585
4660
|
}
|
|
4586
4661
|
};
|
|
4587
4662
|
this.plugins = new Map();
|
|
4588
|
-
this.
|
|
4663
|
+
this.effectDrawers = new Map();
|
|
4664
|
+
this.shapeDrawers = new Map();
|
|
4589
4665
|
this._options = loadContainerOptions(this._engine, this);
|
|
4590
4666
|
this.actualOptions = loadContainerOptions(this._engine, this);
|
|
4591
4667
|
this._eventListeners = new EventListeners(this);
|
|
@@ -4703,11 +4779,17 @@ class Container {
|
|
|
4703
4779
|
this.stop();
|
|
4704
4780
|
this.particles.destroy();
|
|
4705
4781
|
this.canvas.destroy();
|
|
4706
|
-
for (const [,
|
|
4707
|
-
|
|
4782
|
+
for (const [, effectDrawer] of this.effectDrawers) {
|
|
4783
|
+
effectDrawer.destroy && effectDrawer.destroy(this);
|
|
4708
4784
|
}
|
|
4709
|
-
for (const
|
|
4710
|
-
|
|
4785
|
+
for (const [, shapeDrawer] of this.shapeDrawers) {
|
|
4786
|
+
shapeDrawer.destroy && shapeDrawer.destroy(this);
|
|
4787
|
+
}
|
|
4788
|
+
for (const key of this.effectDrawers.keys()) {
|
|
4789
|
+
this.effectDrawers.delete(key);
|
|
4790
|
+
}
|
|
4791
|
+
for (const key of this.shapeDrawers.keys()) {
|
|
4792
|
+
this.shapeDrawers.delete(key);
|
|
4711
4793
|
}
|
|
4712
4794
|
this._engine.clearPlugins(this);
|
|
4713
4795
|
this.destroyed = true;
|
|
@@ -4727,7 +4809,7 @@ class Container {
|
|
|
4727
4809
|
let refreshTime = force;
|
|
4728
4810
|
this._drawAnimationFrame = requestAnimationFrame(async timestamp => {
|
|
4729
4811
|
if (refreshTime) {
|
|
4730
|
-
this.
|
|
4812
|
+
this._lastFrameTime = undefined;
|
|
4731
4813
|
refreshTime = false;
|
|
4732
4814
|
}
|
|
4733
4815
|
await this._nextFrame(timestamp);
|
|
@@ -4762,11 +4844,18 @@ class Container {
|
|
|
4762
4844
|
if (!guardCheck(this)) {
|
|
4763
4845
|
return;
|
|
4764
4846
|
}
|
|
4847
|
+
const effects = this._engine.getSupportedEffects();
|
|
4848
|
+
for (const type of effects) {
|
|
4849
|
+
const drawer = this._engine.getEffectDrawer(type);
|
|
4850
|
+
if (drawer) {
|
|
4851
|
+
this.effectDrawers.set(type, drawer);
|
|
4852
|
+
}
|
|
4853
|
+
}
|
|
4765
4854
|
const shapes = this._engine.getSupportedShapes();
|
|
4766
4855
|
for (const type of shapes) {
|
|
4767
4856
|
const drawer = this._engine.getShapeDrawer(type);
|
|
4768
4857
|
if (drawer) {
|
|
4769
|
-
this.
|
|
4858
|
+
this.shapeDrawers.set(type, drawer);
|
|
4770
4859
|
}
|
|
4771
4860
|
}
|
|
4772
4861
|
this._options = loadContainerOptions(this._engine, this, this._initialSourceOptions, this.sourceOptions);
|
|
@@ -4785,8 +4874,11 @@ class Container {
|
|
|
4785
4874
|
this._delay = getRangeValue(this.actualOptions.delay) * 1000;
|
|
4786
4875
|
this._lifeTime = 0;
|
|
4787
4876
|
this.fpsLimit = this.actualOptions.fpsLimit > 0 ? this.actualOptions.fpsLimit : 120;
|
|
4788
|
-
this.
|
|
4789
|
-
for (const [, drawer] of this.
|
|
4877
|
+
this._smooth = this.actualOptions.smooth;
|
|
4878
|
+
for (const [, drawer] of this.effectDrawers) {
|
|
4879
|
+
drawer.init && (await drawer.init(this));
|
|
4880
|
+
}
|
|
4881
|
+
for (const [, drawer] of this.shapeDrawers) {
|
|
4790
4882
|
drawer.init && (await drawer.init(this));
|
|
4791
4883
|
}
|
|
4792
4884
|
for (const [, plugin] of this.plugins) {
|
|
@@ -4927,10 +5019,10 @@ class Container {
|
|
|
4927
5019
|
this.actualOptions.responsive = [];
|
|
4928
5020
|
const newMaxWidth = this.actualOptions.setResponsive(this.canvas.size.width, this.retina.pixelRatio, this._options);
|
|
4929
5021
|
this.actualOptions.setTheme(this._currentTheme);
|
|
4930
|
-
if (this.
|
|
5022
|
+
if (this._responsiveMaxWidth === newMaxWidth) {
|
|
4931
5023
|
return false;
|
|
4932
5024
|
}
|
|
4933
|
-
this.
|
|
5025
|
+
this._responsiveMaxWidth = newMaxWidth;
|
|
4934
5026
|
return true;
|
|
4935
5027
|
}
|
|
4936
5028
|
}
|
|
@@ -5021,7 +5113,8 @@ class Engine {
|
|
|
5021
5113
|
this.movers = new Map();
|
|
5022
5114
|
this.updaters = new Map();
|
|
5023
5115
|
this.presets = new Map();
|
|
5024
|
-
this.
|
|
5116
|
+
this.effectDrawers = new Map();
|
|
5117
|
+
this.shapeDrawers = new Map();
|
|
5025
5118
|
this.pathGenerators = new Map();
|
|
5026
5119
|
}
|
|
5027
5120
|
get configs() {
|
|
@@ -5032,7 +5125,7 @@ class Engine {
|
|
|
5032
5125
|
return res;
|
|
5033
5126
|
}
|
|
5034
5127
|
get version() {
|
|
5035
|
-
return "3.0.0-beta.
|
|
5128
|
+
return "3.0.0-beta.4";
|
|
5036
5129
|
}
|
|
5037
5130
|
addConfig(config) {
|
|
5038
5131
|
const name = config.name ?? "default";
|
|
@@ -5044,6 +5137,12 @@ class Engine {
|
|
|
5044
5137
|
}
|
|
5045
5138
|
});
|
|
5046
5139
|
}
|
|
5140
|
+
async addEffect(effect, drawer, refresh = true) {
|
|
5141
|
+
executeOnSingleOrMultiple(effect, type => {
|
|
5142
|
+
!this.getEffectDrawer(type) && this.effectDrawers.set(type, drawer);
|
|
5143
|
+
});
|
|
5144
|
+
await this.refresh(refresh);
|
|
5145
|
+
}
|
|
5047
5146
|
addEventListener(type, listener) {
|
|
5048
5147
|
this._eventDispatcher.addEventListener(type, listener);
|
|
5049
5148
|
}
|
|
@@ -5073,7 +5172,7 @@ class Engine {
|
|
|
5073
5172
|
}
|
|
5074
5173
|
async addShape(shape, drawer, refresh = true) {
|
|
5075
5174
|
executeOnSingleOrMultiple(shape, type => {
|
|
5076
|
-
!this.getShapeDrawer(type) && this.
|
|
5175
|
+
!this.getShapeDrawer(type) && this.shapeDrawers.set(type, drawer);
|
|
5077
5176
|
});
|
|
5078
5177
|
await this.refresh(refresh);
|
|
5079
5178
|
}
|
|
@@ -5104,6 +5203,9 @@ class Engine {
|
|
|
5104
5203
|
}
|
|
5105
5204
|
return res;
|
|
5106
5205
|
}
|
|
5206
|
+
getEffectDrawer(type) {
|
|
5207
|
+
return this.effectDrawers.get(type);
|
|
5208
|
+
}
|
|
5107
5209
|
getInteractors(container, force = false) {
|
|
5108
5210
|
return getItemsFromInitializer(container, this.interactors, this._initializers.interactors, force);
|
|
5109
5211
|
}
|
|
@@ -5120,10 +5222,13 @@ class Engine {
|
|
|
5120
5222
|
return this.presets.get(preset);
|
|
5121
5223
|
}
|
|
5122
5224
|
getShapeDrawer(type) {
|
|
5123
|
-
return this.
|
|
5225
|
+
return this.shapeDrawers.get(type);
|
|
5226
|
+
}
|
|
5227
|
+
getSupportedEffects() {
|
|
5228
|
+
return this.effectDrawers.keys();
|
|
5124
5229
|
}
|
|
5125
5230
|
getSupportedShapes() {
|
|
5126
|
-
return this.
|
|
5231
|
+
return this.shapeDrawers.keys();
|
|
5127
5232
|
}
|
|
5128
5233
|
getUpdaters(container, force = false) {
|
|
5129
5234
|
return getItemsFromInitializer(container, this.updaters, this._initializers.updaters, force);
|
|
@@ -5419,7 +5524,6 @@ class ParticlesInteractorBase {
|
|
|
5419
5524
|
|
|
5420
5525
|
|
|
5421
5526
|
|
|
5422
|
-
|
|
5423
5527
|
|
|
5424
5528
|
|
|
5425
5529
|
;// CONCATENATED MODULE: ../../engine/dist/browser/index.js
|
|
@@ -5519,10 +5623,10 @@ function applyDistance(particle) {
|
|
|
5519
5623
|
if ((hDistance && dxFixed >= hDistance || vDistance && dyFixed >= vDistance) && !particle.misplaced) {
|
|
5520
5624
|
particle.misplaced = !!hDistance && dxFixed > hDistance || !!vDistance && dyFixed > vDistance;
|
|
5521
5625
|
if (hDistance) {
|
|
5522
|
-
particle.velocity.x = particle.velocity.y
|
|
5626
|
+
particle.velocity.x = particle.velocity.y * 0.5 - particle.velocity.x;
|
|
5523
5627
|
}
|
|
5524
5628
|
if (vDistance) {
|
|
5525
|
-
particle.velocity.y = particle.velocity.x
|
|
5629
|
+
particle.velocity.y = particle.velocity.x * 0.5 - particle.velocity.y;
|
|
5526
5630
|
}
|
|
5527
5631
|
} else if ((!hDistance || dxFixed < hDistance) && (!vDistance || dyFixed < vDistance) && particle.misplaced) {
|
|
5528
5632
|
particle.misplaced = false;
|
|
@@ -5580,15 +5684,16 @@ function spin(particle, moveSpeed) {
|
|
|
5580
5684
|
particle.position.x = particle.spin.center.x + particle.spin.radius * updateFunc.x(particle.spin.angle);
|
|
5581
5685
|
particle.position.y = particle.spin.center.y + particle.spin.radius * updateFunc.y(particle.spin.angle);
|
|
5582
5686
|
particle.spin.radius += particle.spin.acceleration;
|
|
5583
|
-
const maxCanvasSize = Math.max(container.canvas.size.width, container.canvas.size.height)
|
|
5584
|
-
|
|
5585
|
-
|
|
5687
|
+
const maxCanvasSize = Math.max(container.canvas.size.width, container.canvas.size.height),
|
|
5688
|
+
halfMaxSize = maxCanvasSize * 0.5;
|
|
5689
|
+
if (particle.spin.radius > halfMaxSize) {
|
|
5690
|
+
particle.spin.radius = halfMaxSize;
|
|
5586
5691
|
particle.spin.acceleration *= -1;
|
|
5587
5692
|
} else if (particle.spin.radius < 0) {
|
|
5588
5693
|
particle.spin.radius = 0;
|
|
5589
5694
|
particle.spin.acceleration *= -1;
|
|
5590
5695
|
}
|
|
5591
|
-
particle.spin.angle += moveSpeed
|
|
5696
|
+
particle.spin.angle += moveSpeed * 0.01 * (1 - particle.spin.radius / maxCanvasSize);
|
|
5592
5697
|
}
|
|
5593
5698
|
function applyPath(particle, delta) {
|
|
5594
5699
|
const particlesOptions = particle.options,
|
|
@@ -5632,8 +5737,8 @@ class BaseMover {
|
|
|
5632
5737
|
y: 50
|
|
5633
5738
|
},
|
|
5634
5739
|
spinCenter = {
|
|
5635
|
-
x: spinPos.x
|
|
5636
|
-
y: spinPos.y
|
|
5740
|
+
x: spinPos.x * 0.01 * container.canvas.size.width,
|
|
5741
|
+
y: spinPos.y * 0.01 * container.canvas.size.height
|
|
5637
5742
|
},
|
|
5638
5743
|
pos = particle.getPosition(),
|
|
5639
5744
|
distance = getDistance(pos, spinCenter),
|
|
@@ -5956,7 +6061,7 @@ function bounceHorizontal(data) {
|
|
|
5956
6061
|
const velocity = data.particle.velocity.x;
|
|
5957
6062
|
let bounced = false;
|
|
5958
6063
|
if (data.direction === "right" && data.bounds.right >= data.canvasSize.width && velocity > 0 || data.direction === "left" && data.bounds.left <= 0 && velocity < 0) {
|
|
5959
|
-
const newVelocity =
|
|
6064
|
+
const newVelocity = getRangeValue(data.particle.options.bounce.horizontal.value);
|
|
5960
6065
|
data.particle.velocity.x *= -newVelocity;
|
|
5961
6066
|
bounced = true;
|
|
5962
6067
|
}
|
|
@@ -5985,7 +6090,7 @@ function bounceVertical(data) {
|
|
|
5985
6090
|
const velocity = data.particle.velocity.y;
|
|
5986
6091
|
let bounced = false;
|
|
5987
6092
|
if (data.direction === "bottom" && data.bounds.bottom >= data.canvasSize.height && velocity > 0 || data.direction === "top" && data.bounds.top <= 0 && velocity < 0) {
|
|
5988
|
-
const newVelocity =
|
|
6093
|
+
const newVelocity = getRangeValue(data.particle.options.bounce.vertical.value);
|
|
5989
6094
|
data.particle.velocity.y *= -newVelocity;
|
|
5990
6095
|
bounced = true;
|
|
5991
6096
|
}
|
|
@@ -6505,7 +6610,7 @@ function addSplitParticle(engine, container, parent, splitParticlesOptions) {
|
|
|
6505
6610
|
}
|
|
6506
6611
|
const splitOptions = destroyOptions.split,
|
|
6507
6612
|
options = loadParticlesOptions(engine, container, parent.options),
|
|
6508
|
-
factor =
|
|
6613
|
+
factor = getRangeValue(splitOptions.factor.value),
|
|
6509
6614
|
parentColor = parent.getFillColor();
|
|
6510
6615
|
if (splitOptions.color) {
|
|
6511
6616
|
options.color.load(splitOptions.color);
|
|
@@ -6567,7 +6672,7 @@ function split(engine, container, particle) {
|
|
|
6567
6672
|
if (splitOptions.count >= 0 && (particle.splitCount === undefined || particle.splitCount++ > splitOptions.count)) {
|
|
6568
6673
|
return;
|
|
6569
6674
|
}
|
|
6570
|
-
const rate =
|
|
6675
|
+
const rate = getRangeValue(splitOptions.rate.value),
|
|
6571
6676
|
particlesSplitOptions = itemFromSingleOrMultiple(splitOptions.particles);
|
|
6572
6677
|
for (let i = 0; i < rate; i++) {
|
|
6573
6678
|
addSplitParticle(engine, container, particle, particlesSplitOptions);
|
|
@@ -6656,35 +6761,6 @@ class DestroyUpdater {
|
|
|
6656
6761
|
async function loadDestroyUpdater(engine, refresh = true) {
|
|
6657
6762
|
await engine.addParticleUpdater("destroy", container => new DestroyUpdater(engine, container), refresh);
|
|
6658
6763
|
}
|
|
6659
|
-
;// CONCATENATED MODULE: ../../plugins/emitters/dist/browser/Shapes/Circle/CircleShape.js
|
|
6660
|
-
|
|
6661
|
-
class CircleShape {
|
|
6662
|
-
randomPosition(position, size, fill) {
|
|
6663
|
-
const generateTheta = (x, y) => {
|
|
6664
|
-
const u = getRandom() / 4.0,
|
|
6665
|
-
theta = Math.atan(y / x * Math.tan(2 * Math.PI * u)),
|
|
6666
|
-
v = getRandom();
|
|
6667
|
-
if (v < 0.25) {
|
|
6668
|
-
return theta;
|
|
6669
|
-
} else if (v < 0.5) {
|
|
6670
|
-
return Math.PI - theta;
|
|
6671
|
-
} else if (v < 0.75) {
|
|
6672
|
-
return Math.PI + theta;
|
|
6673
|
-
} else {
|
|
6674
|
-
return -theta;
|
|
6675
|
-
}
|
|
6676
|
-
},
|
|
6677
|
-
radius = (x, y, theta) => x * y / Math.sqrt((y * Math.cos(theta)) ** 2 + (x * Math.sin(theta)) ** 2),
|
|
6678
|
-
[a, b] = [size.width / 2, size.height / 2],
|
|
6679
|
-
randomTheta = generateTheta(a, b),
|
|
6680
|
-
maxRadius = radius(a, b, randomTheta),
|
|
6681
|
-
randomRadius = fill ? maxRadius * Math.sqrt(getRandom()) : maxRadius;
|
|
6682
|
-
return {
|
|
6683
|
-
x: position.x + randomRadius * Math.cos(randomTheta),
|
|
6684
|
-
y: position.y + randomRadius * Math.sin(randomTheta)
|
|
6685
|
-
};
|
|
6686
|
-
}
|
|
6687
|
-
}
|
|
6688
6764
|
;// CONCATENATED MODULE: ../../plugins/emitters/dist/browser/Options/Classes/EmitterLife.js
|
|
6689
6765
|
|
|
6690
6766
|
class EmitterLife {
|
|
@@ -6728,6 +6804,46 @@ class EmitterRate {
|
|
|
6728
6804
|
}
|
|
6729
6805
|
}
|
|
6730
6806
|
}
|
|
6807
|
+
;// CONCATENATED MODULE: ../../plugins/emitters/dist/browser/Options/Classes/EmitterShapeReplace.js
|
|
6808
|
+
class EmitterShapeReplace {
|
|
6809
|
+
constructor() {
|
|
6810
|
+
this.color = false;
|
|
6811
|
+
this.opacity = false;
|
|
6812
|
+
}
|
|
6813
|
+
load(data) {
|
|
6814
|
+
if (!data) {
|
|
6815
|
+
return;
|
|
6816
|
+
}
|
|
6817
|
+
if (data.color !== undefined) {
|
|
6818
|
+
this.color = data.color;
|
|
6819
|
+
}
|
|
6820
|
+
if (data.opacity !== undefined) {
|
|
6821
|
+
this.opacity = data.opacity;
|
|
6822
|
+
}
|
|
6823
|
+
}
|
|
6824
|
+
}
|
|
6825
|
+
;// CONCATENATED MODULE: ../../plugins/emitters/dist/browser/Options/Classes/EmitterShape.js
|
|
6826
|
+
|
|
6827
|
+
|
|
6828
|
+
class EmitterShape {
|
|
6829
|
+
constructor() {
|
|
6830
|
+
this.options = {};
|
|
6831
|
+
this.replace = new EmitterShapeReplace();
|
|
6832
|
+
this.type = "square";
|
|
6833
|
+
}
|
|
6834
|
+
load(data) {
|
|
6835
|
+
if (!data) {
|
|
6836
|
+
return;
|
|
6837
|
+
}
|
|
6838
|
+
if (data.options !== undefined) {
|
|
6839
|
+
this.options = deepExtend({}, data.options ?? {});
|
|
6840
|
+
}
|
|
6841
|
+
this.replace.load(data.replace);
|
|
6842
|
+
if (data.type !== undefined) {
|
|
6843
|
+
this.type = data.type;
|
|
6844
|
+
}
|
|
6845
|
+
}
|
|
6846
|
+
}
|
|
6731
6847
|
;// CONCATENATED MODULE: ../../plugins/emitters/dist/browser/Options/Classes/EmitterSize.js
|
|
6732
6848
|
class EmitterSize {
|
|
6733
6849
|
constructor() {
|
|
@@ -6755,13 +6871,14 @@ class EmitterSize {
|
|
|
6755
6871
|
|
|
6756
6872
|
|
|
6757
6873
|
|
|
6874
|
+
|
|
6758
6875
|
class Emitter {
|
|
6759
6876
|
constructor() {
|
|
6760
6877
|
this.autoPlay = true;
|
|
6761
6878
|
this.fill = true;
|
|
6762
6879
|
this.life = new EmitterLife();
|
|
6763
6880
|
this.rate = new EmitterRate();
|
|
6764
|
-
this.shape =
|
|
6881
|
+
this.shape = new EmitterShape();
|
|
6765
6882
|
this.startCount = 0;
|
|
6766
6883
|
}
|
|
6767
6884
|
load(data) {
|
|
@@ -6790,9 +6907,7 @@ class Emitter {
|
|
|
6790
6907
|
return deepExtend({}, particles);
|
|
6791
6908
|
});
|
|
6792
6909
|
this.rate.load(data.rate);
|
|
6793
|
-
|
|
6794
|
-
this.shape = data.shape;
|
|
6795
|
-
}
|
|
6910
|
+
this.shape.load(data.shape);
|
|
6796
6911
|
if (data.position !== undefined) {
|
|
6797
6912
|
this.position = {};
|
|
6798
6913
|
if (data.position.x !== undefined) {
|
|
@@ -6817,17 +6932,24 @@ class Emitter {
|
|
|
6817
6932
|
|
|
6818
6933
|
|
|
6819
6934
|
|
|
6935
|
+
function setParticlesOptionsColor(particlesOptions, color) {
|
|
6936
|
+
if (particlesOptions.color) {
|
|
6937
|
+
particlesOptions.color.value = color;
|
|
6938
|
+
} else {
|
|
6939
|
+
particlesOptions.color = {
|
|
6940
|
+
value: color
|
|
6941
|
+
};
|
|
6942
|
+
}
|
|
6943
|
+
}
|
|
6820
6944
|
class EmitterInstance {
|
|
6821
6945
|
constructor(engine, emitters, container, options, position) {
|
|
6822
6946
|
this.emitters = emitters;
|
|
6823
6947
|
this.container = container;
|
|
6824
|
-
this._calcPosition = () => {
|
|
6825
|
-
return calcPositionOrRandomFromSizeRanged({
|
|
6826
|
-
size: this.container.canvas.size,
|
|
6827
|
-
position: this.options.position
|
|
6828
|
-
});
|
|
6829
|
-
};
|
|
6830
6948
|
this._destroy = () => {
|
|
6949
|
+
this._mutationObserver?.disconnect();
|
|
6950
|
+
this._mutationObserver = undefined;
|
|
6951
|
+
this._resizeObserver?.disconnect();
|
|
6952
|
+
this._resizeObserver = undefined;
|
|
6831
6953
|
this.emitters.removeEmitter(this);
|
|
6832
6954
|
this._engine.dispatchEvent("emitterDestroyed", {
|
|
6833
6955
|
container: this.container,
|
|
@@ -6836,41 +6958,6 @@ class EmitterInstance {
|
|
|
6836
6958
|
}
|
|
6837
6959
|
});
|
|
6838
6960
|
};
|
|
6839
|
-
this._emit = () => {
|
|
6840
|
-
if (this._paused) {
|
|
6841
|
-
return;
|
|
6842
|
-
}
|
|
6843
|
-
const quantity = getRangeValue(this.options.rate.quantity);
|
|
6844
|
-
this._emitParticles(quantity);
|
|
6845
|
-
};
|
|
6846
|
-
this._emitParticles = quantity => {
|
|
6847
|
-
const position = this.getPosition(),
|
|
6848
|
-
size = this.getSize(),
|
|
6849
|
-
singleParticlesOptions = itemFromSingleOrMultiple(this._particlesOptions);
|
|
6850
|
-
for (let i = 0; i < quantity; i++) {
|
|
6851
|
-
const particlesOptions = deepExtend({}, singleParticlesOptions);
|
|
6852
|
-
if (this.spawnColor) {
|
|
6853
|
-
const hslAnimation = this.options.spawnColor?.animation;
|
|
6854
|
-
if (hslAnimation) {
|
|
6855
|
-
this.spawnColor.h = this._setColorAnimation(hslAnimation.h, this.spawnColor.h, 360);
|
|
6856
|
-
this.spawnColor.s = this._setColorAnimation(hslAnimation.s, this.spawnColor.s, 100);
|
|
6857
|
-
this.spawnColor.l = this._setColorAnimation(hslAnimation.l, this.spawnColor.l, 100);
|
|
6858
|
-
}
|
|
6859
|
-
if (!particlesOptions.color) {
|
|
6860
|
-
particlesOptions.color = {
|
|
6861
|
-
value: this.spawnColor
|
|
6862
|
-
};
|
|
6863
|
-
} else {
|
|
6864
|
-
particlesOptions.color.value = this.spawnColor;
|
|
6865
|
-
}
|
|
6866
|
-
}
|
|
6867
|
-
if (!position) {
|
|
6868
|
-
return;
|
|
6869
|
-
}
|
|
6870
|
-
const pPosition = this._shape?.randomPosition(position, size, this.fill) ?? position;
|
|
6871
|
-
this.container.particles.addParticle(pPosition, particlesOptions);
|
|
6872
|
-
}
|
|
6873
|
-
};
|
|
6874
6961
|
this._prepareToDie = () => {
|
|
6875
6962
|
if (this._paused) {
|
|
6876
6963
|
return;
|
|
@@ -6905,7 +6992,6 @@ class EmitterInstance {
|
|
|
6905
6992
|
this._spawnDelay = getRangeValue(this.options.life.delay ?? 0) * 1000 / this.container.retina.reduceFactor;
|
|
6906
6993
|
this.position = this._initialPosition ?? this._calcPosition();
|
|
6907
6994
|
this.name = this.options.name;
|
|
6908
|
-
this._shape = this._engine.emitterShapeManager?.getShape(this.options.shape);
|
|
6909
6995
|
this.fill = this.options.fill;
|
|
6910
6996
|
this._firstSpawn = !this.options.life.wait;
|
|
6911
6997
|
this._startParticlesAdded = false;
|
|
@@ -6918,17 +7004,31 @@ class EmitterInstance {
|
|
|
6918
7004
|
}
|
|
6919
7005
|
this._paused = !this.options.autoPlay;
|
|
6920
7006
|
this._particlesOptions = particlesOptions;
|
|
6921
|
-
this.
|
|
6922
|
-
|
|
6923
|
-
size.load({
|
|
6924
|
-
height: 0,
|
|
6925
|
-
mode: "percent",
|
|
6926
|
-
width: 0
|
|
6927
|
-
});
|
|
6928
|
-
return size;
|
|
6929
|
-
})();
|
|
7007
|
+
this._size = this._calcSize();
|
|
7008
|
+
this.size = getSize(this._size, this.container.canvas.size);
|
|
6930
7009
|
this._lifeCount = this.options.life.count ?? -1;
|
|
6931
7010
|
this._immortal = this._lifeCount <= 0;
|
|
7011
|
+
if (this.options.domId) {
|
|
7012
|
+
const element = document.getElementById(this.options.domId);
|
|
7013
|
+
if (element) {
|
|
7014
|
+
this._mutationObserver = new MutationObserver(() => {
|
|
7015
|
+
this.resize();
|
|
7016
|
+
});
|
|
7017
|
+
this._resizeObserver = new ResizeObserver(() => {
|
|
7018
|
+
this.resize();
|
|
7019
|
+
});
|
|
7020
|
+
this._mutationObserver.observe(element, {
|
|
7021
|
+
attributes: true,
|
|
7022
|
+
attributeFilter: ["style", "width", "height"]
|
|
7023
|
+
});
|
|
7024
|
+
this._resizeObserver.observe(element);
|
|
7025
|
+
}
|
|
7026
|
+
}
|
|
7027
|
+
const shapeOptions = this.options.shape,
|
|
7028
|
+
shapeGenerator = this._engine.emitterShapeManager?.getShapeGenerator(shapeOptions.type);
|
|
7029
|
+
if (shapeGenerator) {
|
|
7030
|
+
this._shape = shapeGenerator.generate(this.position, this.size, this.fill, shapeOptions.options);
|
|
7031
|
+
}
|
|
6932
7032
|
this._engine.dispatchEvent("emitterCreated", {
|
|
6933
7033
|
container,
|
|
6934
7034
|
data: {
|
|
@@ -6945,33 +7045,8 @@ class EmitterInstance {
|
|
|
6945
7045
|
this._paused = false;
|
|
6946
7046
|
this.play();
|
|
6947
7047
|
}
|
|
6948
|
-
|
|
6949
|
-
|
|
6950
|
-
const container = this.container,
|
|
6951
|
-
element = document.getElementById(this.options.domId);
|
|
6952
|
-
if (element) {
|
|
6953
|
-
const elRect = element.getBoundingClientRect();
|
|
6954
|
-
return {
|
|
6955
|
-
x: (elRect.x + elRect.width / 2) * container.retina.pixelRatio,
|
|
6956
|
-
y: (elRect.y + elRect.height / 2) * container.retina.pixelRatio
|
|
6957
|
-
};
|
|
6958
|
-
}
|
|
6959
|
-
}
|
|
6960
|
-
return this.position;
|
|
6961
|
-
}
|
|
6962
|
-
getSize() {
|
|
6963
|
-
const container = this.container;
|
|
6964
|
-
if (this.options.domId) {
|
|
6965
|
-
const element = document.getElementById(this.options.domId);
|
|
6966
|
-
if (element) {
|
|
6967
|
-
const elRect = element.getBoundingClientRect();
|
|
6968
|
-
return {
|
|
6969
|
-
width: elRect.width * container.retina.pixelRatio,
|
|
6970
|
-
height: elRect.height * container.retina.pixelRatio
|
|
6971
|
-
};
|
|
6972
|
-
}
|
|
6973
|
-
}
|
|
6974
|
-
return getSize(this.size, container.canvas.size);
|
|
7048
|
+
async init() {
|
|
7049
|
+
await this._shape?.init();
|
|
6975
7050
|
}
|
|
6976
7051
|
pause() {
|
|
6977
7052
|
if (this._paused) {
|
|
@@ -6997,8 +7072,11 @@ class EmitterInstance {
|
|
|
6997
7072
|
resize() {
|
|
6998
7073
|
const initialPosition = this._initialPosition;
|
|
6999
7074
|
this.position = initialPosition && isPointInside(initialPosition, this.container.canvas.size, Vector.origin) ? initialPosition : this._calcPosition();
|
|
7075
|
+
this._size = this._calcSize();
|
|
7076
|
+
this.size = getSize(this._size, this.container.canvas.size);
|
|
7077
|
+
this._shape?.resize(this.position, this.size);
|
|
7000
7078
|
}
|
|
7001
|
-
update(delta) {
|
|
7079
|
+
async update(delta) {
|
|
7002
7080
|
if (this._paused) {
|
|
7003
7081
|
return;
|
|
7004
7082
|
}
|
|
@@ -7009,7 +7087,7 @@ class EmitterInstance {
|
|
|
7009
7087
|
}
|
|
7010
7088
|
if (!this._startParticlesAdded) {
|
|
7011
7089
|
this._startParticlesAdded = true;
|
|
7012
|
-
this._emitParticles(this.options.startCount);
|
|
7090
|
+
await this._emitParticles(this.options.startCount);
|
|
7013
7091
|
}
|
|
7014
7092
|
if (this._duration !== undefined) {
|
|
7015
7093
|
this._currentDuration += delta.value;
|
|
@@ -7050,6 +7128,94 @@ class EmitterInstance {
|
|
|
7050
7128
|
}
|
|
7051
7129
|
}
|
|
7052
7130
|
}
|
|
7131
|
+
_calcPosition() {
|
|
7132
|
+
if (this.options.domId) {
|
|
7133
|
+
const container = this.container,
|
|
7134
|
+
element = document.getElementById(this.options.domId);
|
|
7135
|
+
if (element) {
|
|
7136
|
+
const elRect = element.getBoundingClientRect();
|
|
7137
|
+
return {
|
|
7138
|
+
x: (elRect.x + elRect.width / 2) * container.retina.pixelRatio,
|
|
7139
|
+
y: (elRect.y + elRect.height / 2) * container.retina.pixelRatio
|
|
7140
|
+
};
|
|
7141
|
+
}
|
|
7142
|
+
}
|
|
7143
|
+
return calcPositionOrRandomFromSizeRanged({
|
|
7144
|
+
size: this.container.canvas.size,
|
|
7145
|
+
position: this.options.position
|
|
7146
|
+
});
|
|
7147
|
+
}
|
|
7148
|
+
_calcSize() {
|
|
7149
|
+
const container = this.container;
|
|
7150
|
+
if (this.options.domId) {
|
|
7151
|
+
const element = document.getElementById(this.options.domId);
|
|
7152
|
+
if (element) {
|
|
7153
|
+
const elRect = element.getBoundingClientRect();
|
|
7154
|
+
return {
|
|
7155
|
+
width: elRect.width * container.retina.pixelRatio,
|
|
7156
|
+
height: elRect.height * container.retina.pixelRatio,
|
|
7157
|
+
mode: "precise"
|
|
7158
|
+
};
|
|
7159
|
+
}
|
|
7160
|
+
}
|
|
7161
|
+
return this.options.size ?? (() => {
|
|
7162
|
+
const size = new EmitterSize();
|
|
7163
|
+
size.load({
|
|
7164
|
+
height: 0,
|
|
7165
|
+
mode: "percent",
|
|
7166
|
+
width: 0
|
|
7167
|
+
});
|
|
7168
|
+
return size;
|
|
7169
|
+
})();
|
|
7170
|
+
}
|
|
7171
|
+
async _emit() {
|
|
7172
|
+
if (this._paused) {
|
|
7173
|
+
return;
|
|
7174
|
+
}
|
|
7175
|
+
const quantity = getRangeValue(this.options.rate.quantity);
|
|
7176
|
+
await this._emitParticles(quantity);
|
|
7177
|
+
}
|
|
7178
|
+
async _emitParticles(quantity) {
|
|
7179
|
+
const singleParticlesOptions = itemFromSingleOrMultiple(this._particlesOptions);
|
|
7180
|
+
for (let i = 0; i < quantity; i++) {
|
|
7181
|
+
const particlesOptions = deepExtend({}, singleParticlesOptions);
|
|
7182
|
+
if (this.spawnColor) {
|
|
7183
|
+
const hslAnimation = this.options.spawnColor?.animation;
|
|
7184
|
+
if (hslAnimation) {
|
|
7185
|
+
this.spawnColor.h = this._setColorAnimation(hslAnimation.h, this.spawnColor.h, 360);
|
|
7186
|
+
this.spawnColor.s = this._setColorAnimation(hslAnimation.s, this.spawnColor.s, 100);
|
|
7187
|
+
this.spawnColor.l = this._setColorAnimation(hslAnimation.l, this.spawnColor.l, 100);
|
|
7188
|
+
}
|
|
7189
|
+
setParticlesOptionsColor(particlesOptions, this.spawnColor);
|
|
7190
|
+
}
|
|
7191
|
+
const shapeOptions = this.options.shape;
|
|
7192
|
+
let position = this.position;
|
|
7193
|
+
if (this._shape) {
|
|
7194
|
+
const shapePosData = await this._shape.randomPosition();
|
|
7195
|
+
if (shapePosData) {
|
|
7196
|
+
position = shapePosData.position;
|
|
7197
|
+
const replaceData = shapeOptions.replace;
|
|
7198
|
+
if (replaceData.color && shapePosData.color) {
|
|
7199
|
+
setParticlesOptionsColor(particlesOptions, shapePosData.color);
|
|
7200
|
+
}
|
|
7201
|
+
if (replaceData.opacity) {
|
|
7202
|
+
if (particlesOptions.opacity) {
|
|
7203
|
+
particlesOptions.opacity.value = shapePosData.opacity;
|
|
7204
|
+
} else {
|
|
7205
|
+
particlesOptions.opacity = {
|
|
7206
|
+
value: shapePosData.opacity
|
|
7207
|
+
};
|
|
7208
|
+
}
|
|
7209
|
+
}
|
|
7210
|
+
} else {
|
|
7211
|
+
position = null;
|
|
7212
|
+
}
|
|
7213
|
+
}
|
|
7214
|
+
if (position) {
|
|
7215
|
+
this.container.particles.addParticle(position, particlesOptions);
|
|
7216
|
+
}
|
|
7217
|
+
}
|
|
7218
|
+
}
|
|
7053
7219
|
}
|
|
7054
7220
|
;// CONCATENATED MODULE: ../../plugins/emitters/dist/browser/Emitters.js
|
|
7055
7221
|
|
|
@@ -7069,7 +7235,7 @@ class Emitters {
|
|
|
7069
7235
|
value: []
|
|
7070
7236
|
};
|
|
7071
7237
|
container.getEmitter = idxOrName => idxOrName === undefined || isNumber(idxOrName) ? this.array[idxOrName || 0] : this.array.find(t => t.name === idxOrName);
|
|
7072
|
-
container.addEmitter = (options, position) => this.addEmitter(options, position);
|
|
7238
|
+
container.addEmitter = async (options, position) => this.addEmitter(options, position);
|
|
7073
7239
|
container.removeEmitter = idxOrName => {
|
|
7074
7240
|
const emitter = container.getEmitter(idxOrName);
|
|
7075
7241
|
if (emitter) {
|
|
@@ -7089,10 +7255,11 @@ class Emitters {
|
|
|
7089
7255
|
}
|
|
7090
7256
|
};
|
|
7091
7257
|
}
|
|
7092
|
-
addEmitter(options, position) {
|
|
7258
|
+
async addEmitter(options, position) {
|
|
7093
7259
|
const emitterOptions = new Emitter();
|
|
7094
7260
|
emitterOptions.load(options);
|
|
7095
7261
|
const emitter = new EmitterInstance(this._engine, this, this.container, emitterOptions, position);
|
|
7262
|
+
await emitter.init();
|
|
7096
7263
|
this.array.push(emitter);
|
|
7097
7264
|
return emitter;
|
|
7098
7265
|
}
|
|
@@ -7136,10 +7303,10 @@ class Emitters {
|
|
|
7136
7303
|
}
|
|
7137
7304
|
if (isArray(this.emitters)) {
|
|
7138
7305
|
for (const emitterOptions of this.emitters) {
|
|
7139
|
-
this.addEmitter(emitterOptions);
|
|
7306
|
+
await this.addEmitter(emitterOptions);
|
|
7140
7307
|
}
|
|
7141
7308
|
} else {
|
|
7142
|
-
this.addEmitter(this.emitters);
|
|
7309
|
+
await this.addEmitter(this.emitters);
|
|
7143
7310
|
}
|
|
7144
7311
|
}
|
|
7145
7312
|
pause() {
|
|
@@ -7166,71 +7333,28 @@ class Emitters {
|
|
|
7166
7333
|
stop() {
|
|
7167
7334
|
this.array = [];
|
|
7168
7335
|
}
|
|
7169
|
-
update(delta) {
|
|
7336
|
+
async update(delta) {
|
|
7170
7337
|
for (const emitter of this.array) {
|
|
7171
|
-
emitter.update(delta);
|
|
7338
|
+
await emitter.update(delta);
|
|
7172
7339
|
}
|
|
7173
7340
|
}
|
|
7174
7341
|
}
|
|
7175
7342
|
;// CONCATENATED MODULE: ../../plugins/emitters/dist/browser/ShapeManager.js
|
|
7176
|
-
const
|
|
7343
|
+
const shapeGeneratorss = new Map();
|
|
7177
7344
|
class ShapeManager {
|
|
7178
7345
|
constructor(engine) {
|
|
7179
7346
|
this._engine = engine;
|
|
7180
7347
|
}
|
|
7181
|
-
|
|
7182
|
-
if (!this.
|
|
7183
|
-
|
|
7348
|
+
addShapeGenerator(name, generator) {
|
|
7349
|
+
if (!this.getShapeGenerator(name)) {
|
|
7350
|
+
shapeGeneratorss.set(name, generator);
|
|
7184
7351
|
}
|
|
7185
7352
|
}
|
|
7186
|
-
|
|
7187
|
-
return
|
|
7353
|
+
getShapeGenerator(name) {
|
|
7354
|
+
return shapeGeneratorss.get(name);
|
|
7188
7355
|
}
|
|
7189
|
-
|
|
7190
|
-
return
|
|
7191
|
-
}
|
|
7192
|
-
}
|
|
7193
|
-
;// CONCATENATED MODULE: ../../plugins/emitters/dist/browser/Shapes/Square/SquareShape.js
|
|
7194
|
-
|
|
7195
|
-
function randomSquareCoordinate(position, offset) {
|
|
7196
|
-
return position + offset * (getRandom() - 0.5);
|
|
7197
|
-
}
|
|
7198
|
-
class SquareShape {
|
|
7199
|
-
randomPosition(position, size, fill) {
|
|
7200
|
-
if (fill) {
|
|
7201
|
-
return {
|
|
7202
|
-
x: randomSquareCoordinate(position.x, size.width),
|
|
7203
|
-
y: randomSquareCoordinate(position.y, size.height)
|
|
7204
|
-
};
|
|
7205
|
-
} else {
|
|
7206
|
-
const halfW = size.width / 2,
|
|
7207
|
-
halfH = size.height / 2,
|
|
7208
|
-
side = Math.floor(getRandom() * 4),
|
|
7209
|
-
v = (getRandom() - 0.5) * 2;
|
|
7210
|
-
switch (side) {
|
|
7211
|
-
case 0:
|
|
7212
|
-
return {
|
|
7213
|
-
x: position.x + v * halfW,
|
|
7214
|
-
y: position.y - halfH
|
|
7215
|
-
};
|
|
7216
|
-
case 1:
|
|
7217
|
-
return {
|
|
7218
|
-
x: position.x - halfW,
|
|
7219
|
-
y: position.y + v * halfH
|
|
7220
|
-
};
|
|
7221
|
-
case 2:
|
|
7222
|
-
return {
|
|
7223
|
-
x: position.x + v * halfW,
|
|
7224
|
-
y: position.y + halfH
|
|
7225
|
-
};
|
|
7226
|
-
case 3:
|
|
7227
|
-
default:
|
|
7228
|
-
return {
|
|
7229
|
-
x: position.x + halfW,
|
|
7230
|
-
y: position.y + v * halfH
|
|
7231
|
-
};
|
|
7232
|
-
}
|
|
7233
|
-
}
|
|
7356
|
+
getSupportedShapeGenerators() {
|
|
7357
|
+
return shapeGeneratorss.keys();
|
|
7234
7358
|
}
|
|
7235
7359
|
}
|
|
7236
7360
|
;// CONCATENATED MODULE: ../../plugins/emitters/dist/browser/index.js
|
|
@@ -7238,8 +7362,6 @@ class SquareShape {
|
|
|
7238
7362
|
|
|
7239
7363
|
|
|
7240
7364
|
|
|
7241
|
-
|
|
7242
|
-
|
|
7243
7365
|
class EmittersPlugin {
|
|
7244
7366
|
constructor(engine) {
|
|
7245
7367
|
this._engine = engine;
|
|
@@ -7324,20 +7446,21 @@ async function loadEmittersPlugin(engine, refresh = true) {
|
|
|
7324
7446
|
if (!engine.emitterShapeManager) {
|
|
7325
7447
|
engine.emitterShapeManager = new ShapeManager(engine);
|
|
7326
7448
|
}
|
|
7327
|
-
if (!engine.
|
|
7328
|
-
engine.
|
|
7329
|
-
engine.emitterShapeManager?.
|
|
7449
|
+
if (!engine.addEmitterShapeGenerator) {
|
|
7450
|
+
engine.addEmitterShapeGenerator = (name, generator) => {
|
|
7451
|
+
engine.emitterShapeManager?.addShapeGenerator(name, generator);
|
|
7330
7452
|
};
|
|
7331
7453
|
}
|
|
7332
7454
|
const plugin = new EmittersPlugin(engine);
|
|
7333
7455
|
await engine.addPlugin(plugin, refresh);
|
|
7334
|
-
engine.addEmitterShape("circle", new CircleShape());
|
|
7335
|
-
engine.addEmitterShape("square", new SquareShape());
|
|
7336
7456
|
}
|
|
7337
7457
|
|
|
7338
7458
|
|
|
7339
7459
|
|
|
7340
7460
|
|
|
7461
|
+
|
|
7462
|
+
|
|
7463
|
+
|
|
7341
7464
|
;// CONCATENATED MODULE: ../../updaters/life/dist/browser/Options/Classes/LifeDelay.js
|
|
7342
7465
|
|
|
7343
7466
|
class LifeDelay extends ValueWithRandom {
|
|
@@ -7360,7 +7483,6 @@ class LifeDelay extends ValueWithRandom {
|
|
|
7360
7483
|
class LifeDuration extends ValueWithRandom {
|
|
7361
7484
|
constructor() {
|
|
7362
7485
|
super();
|
|
7363
|
-
this.random.minimumValue = 0.0001;
|
|
7364
7486
|
this.sync = false;
|
|
7365
7487
|
}
|
|
7366
7488
|
load(data) {
|