@tsparticles/engine 3.0.2 → 3.1.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.
Files changed (124) hide show
  1. package/README.md +283 -163
  2. package/browser/Core/Canvas.js +19 -19
  3. package/browser/Core/Container.js +45 -34
  4. package/browser/Core/Engine.js +36 -20
  5. package/browser/Core/Particle.js +35 -36
  6. package/browser/Core/Particles.js +30 -24
  7. package/browser/Core/Retina.js +5 -4
  8. package/browser/Core/Utils/Circle.js +4 -3
  9. package/browser/Core/Utils/Constants.js +3 -0
  10. package/browser/Core/Utils/EventListeners.js +18 -15
  11. package/browser/Core/Utils/ExternalInteractorBase.js +1 -1
  12. package/browser/Core/Utils/InteractionManager.js +14 -6
  13. package/browser/Core/Utils/ParticlesInteractorBase.js +1 -1
  14. package/browser/Core/Utils/QuadTree.js +5 -3
  15. package/browser/Core/Utils/Vector.js +7 -2
  16. package/browser/Core/Utils/Vector3d.js +14 -9
  17. package/browser/Options/Classes/ManualParticle.js +3 -2
  18. package/browser/Options/Classes/Options.js +3 -0
  19. package/browser/Utils/CanvasUtils.js +36 -26
  20. package/browser/Utils/ColorUtils.js +124 -45
  21. package/browser/Utils/EventDispatcher.js +6 -5
  22. package/browser/Utils/HslColorManager.js +5 -5
  23. package/browser/Utils/NumberUtils.js +35 -23
  24. package/browser/Utils/RgbColorManager.js +5 -5
  25. package/browser/Utils/Utils.js +102 -19
  26. package/cjs/Core/Canvas.js +19 -19
  27. package/cjs/Core/Container.js +45 -34
  28. package/cjs/Core/Engine.js +36 -20
  29. package/cjs/Core/Particle.js +34 -35
  30. package/cjs/Core/Particles.js +30 -24
  31. package/cjs/Core/Retina.js +5 -4
  32. package/cjs/Core/Utils/Circle.js +4 -3
  33. package/cjs/Core/Utils/Constants.js +4 -1
  34. package/cjs/Core/Utils/EventListeners.js +17 -14
  35. package/cjs/Core/Utils/ExternalInteractorBase.js +1 -1
  36. package/cjs/Core/Utils/InteractionManager.js +14 -6
  37. package/cjs/Core/Utils/ParticlesInteractorBase.js +1 -1
  38. package/cjs/Core/Utils/QuadTree.js +5 -3
  39. package/cjs/Core/Utils/Vector.js +7 -2
  40. package/cjs/Core/Utils/Vector3d.js +14 -9
  41. package/cjs/Options/Classes/ManualParticle.js +3 -2
  42. package/cjs/Options/Classes/Options.js +3 -0
  43. package/cjs/Utils/CanvasUtils.js +36 -26
  44. package/cjs/Utils/ColorUtils.js +126 -45
  45. package/cjs/Utils/EventDispatcher.js +6 -5
  46. package/cjs/Utils/HslColorManager.js +5 -5
  47. package/cjs/Utils/NumberUtils.js +37 -24
  48. package/cjs/Utils/RgbColorManager.js +5 -5
  49. package/cjs/Utils/Utils.js +103 -19
  50. package/esm/Core/Canvas.js +19 -19
  51. package/esm/Core/Container.js +45 -34
  52. package/esm/Core/Engine.js +36 -20
  53. package/esm/Core/Particle.js +35 -36
  54. package/esm/Core/Particles.js +30 -24
  55. package/esm/Core/Retina.js +5 -4
  56. package/esm/Core/Utils/Circle.js +4 -3
  57. package/esm/Core/Utils/Constants.js +3 -0
  58. package/esm/Core/Utils/EventListeners.js +18 -15
  59. package/esm/Core/Utils/ExternalInteractorBase.js +1 -1
  60. package/esm/Core/Utils/InteractionManager.js +14 -6
  61. package/esm/Core/Utils/ParticlesInteractorBase.js +1 -1
  62. package/esm/Core/Utils/QuadTree.js +5 -3
  63. package/esm/Core/Utils/Vector.js +7 -2
  64. package/esm/Core/Utils/Vector3d.js +14 -9
  65. package/esm/Options/Classes/ManualParticle.js +3 -2
  66. package/esm/Options/Classes/Options.js +3 -0
  67. package/esm/Utils/CanvasUtils.js +36 -26
  68. package/esm/Utils/ColorUtils.js +124 -45
  69. package/esm/Utils/EventDispatcher.js +6 -5
  70. package/esm/Utils/HslColorManager.js +5 -5
  71. package/esm/Utils/NumberUtils.js +35 -23
  72. package/esm/Utils/RgbColorManager.js +5 -5
  73. package/esm/Utils/Utils.js +102 -19
  74. package/package.json +1 -1
  75. package/report.html +2 -2
  76. package/tsparticles.engine.js +693 -334
  77. package/tsparticles.engine.min.js +1 -1
  78. package/tsparticles.engine.min.js.LICENSE.txt +1 -1
  79. package/types/Core/Interfaces/IParticleHslAnimation.d.ts +4 -4
  80. package/types/Core/Interfaces/IParticleValueAnimation.d.ts +4 -0
  81. package/types/Core/Interfaces/IShapeDrawData.d.ts +2 -2
  82. package/types/Core/Utils/Constants.d.ts +3 -0
  83. package/types/Core/Utils/ExternalInteractorBase.d.ts +1 -1
  84. package/types/Core/Utils/InteractionManager.d.ts +1 -1
  85. package/types/Core/Utils/ParticlesInteractorBase.d.ts +1 -1
  86. package/types/Core/Utils/Point.d.ts +1 -1
  87. package/types/Options/Classes/Options.d.ts +1 -0
  88. package/types/Options/Classes/Particles/Move/Move.d.ts +1 -2
  89. package/types/Options/Classes/Particles/Move/OutModes.d.ts +1 -2
  90. package/types/Options/Interfaces/IOptions.d.ts +1 -0
  91. package/types/Options/Interfaces/Interactivity/Modes/IModes.d.ts +1 -3
  92. package/types/Types/CustomEventArgs.d.ts +2 -2
  93. package/types/Types/ExportResult.d.ts +2 -2
  94. package/types/Types/ParticlesGroups.d.ts +1 -3
  95. package/types/Types/PathOptions.d.ts +1 -3
  96. package/types/Types/ShapeData.d.ts +1 -3
  97. package/types/Utils/CanvasUtils.d.ts +3 -2
  98. package/types/Utils/ColorUtils.d.ts +5 -0
  99. package/types/Utils/NumberUtils.d.ts +2 -2
  100. package/types/Utils/Utils.d.ts +9 -6
  101. package/umd/Core/Canvas.js +19 -19
  102. package/umd/Core/Container.js +46 -35
  103. package/umd/Core/Engine.js +36 -20
  104. package/umd/Core/Particle.js +35 -36
  105. package/umd/Core/Particles.js +30 -24
  106. package/umd/Core/Retina.js +5 -4
  107. package/umd/Core/Utils/Circle.js +4 -3
  108. package/umd/Core/Utils/Constants.js +4 -1
  109. package/umd/Core/Utils/EventListeners.js +17 -14
  110. package/umd/Core/Utils/ExternalInteractorBase.js +1 -1
  111. package/umd/Core/Utils/InteractionManager.js +14 -6
  112. package/umd/Core/Utils/ParticlesInteractorBase.js +1 -1
  113. package/umd/Core/Utils/QuadTree.js +5 -3
  114. package/umd/Core/Utils/Vector.js +7 -2
  115. package/umd/Core/Utils/Vector3d.js +14 -9
  116. package/umd/Options/Classes/ManualParticle.js +3 -2
  117. package/umd/Options/Classes/Options.js +3 -0
  118. package/umd/Utils/CanvasUtils.js +36 -26
  119. package/umd/Utils/ColorUtils.js +127 -46
  120. package/umd/Utils/EventDispatcher.js +6 -5
  121. package/umd/Utils/HslColorManager.js +5 -5
  122. package/umd/Utils/NumberUtils.js +38 -25
  123. package/umd/Utils/RgbColorManager.js +5 -5
  124. package/umd/Utils/Utils.js +104 -20
@@ -4,16 +4,17 @@
4
4
  if (v !== undefined) module.exports = v;
5
5
  }
6
6
  else if (typeof define === "function" && define.amd) {
7
- define(["require", "exports", "../Core/Utils/Vector.js", "./Utils.js"], factory);
7
+ define(["require", "exports", "../Core/Utils/Vector.js", "./Utils.js", "../Core/Utils/Constants.js"], factory);
8
8
  }
9
9
  })(function (require, exports) {
10
10
  "use strict";
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.parseAlpha = exports.calcExactPositionOrRandomFromSizeRanged = exports.calcExactPositionOrRandomFromSize = exports.calcPositionOrRandomFromSizeRanged = exports.calcPositionOrRandomFromSize = exports.calcPositionFromSize = exports.collisionVelocity = exports.getParticleBaseVelocity = exports.getParticleDirectionAngle = exports.getDistance = exports.getDistances = exports.setRangeValue = exports.getRangeMax = exports.getRangeMin = exports.getRangeValue = exports.randomInRange = exports.mix = exports.clamp = exports.getRandom = exports.setRandom = exports.getEasing = exports.addEasing = void 0;
12
+ exports.parseAlpha = exports.calcExactPositionOrRandomFromSizeRanged = exports.calcExactPositionOrRandomFromSize = exports.calcPositionOrRandomFromSizeRanged = exports.calcPositionOrRandomFromSize = exports.calcPositionFromSize = exports.collisionVelocity = exports.getParticleBaseVelocity = exports.getParticleDirectionAngle = exports.degToRad = exports.getDistance = exports.getDistances = exports.setRangeValue = exports.getRangeMax = exports.getRangeMin = exports.getRangeValue = exports.randomInRange = exports.mix = exports.clamp = exports.getRandom = exports.setRandom = exports.getEasing = exports.addEasing = void 0;
13
13
  const Vector_js_1 = require("../Core/Utils/Vector.js");
14
14
  const Utils_js_1 = require("./Utils.js");
15
+ const Constants_js_1 = require("../Core/Utils/Constants.js");
15
16
  let _random = Math.random;
16
- const easings = new Map();
17
+ const easings = new Map(), double = 2, doublePI = Math.PI * double;
17
18
  function addEasing(name, easing) {
18
19
  if (easings.get(name)) {
19
20
  return;
@@ -22,7 +23,7 @@
22
23
  }
23
24
  exports.addEasing = addEasing;
24
25
  function getEasing(name) {
25
- return easings.get(name) || ((value) => value);
26
+ return easings.get(name) ?? ((value) => value);
26
27
  }
27
28
  exports.getEasing = getEasing;
28
29
  function setRandom(rnd = Math.random) {
@@ -30,7 +31,8 @@
30
31
  }
31
32
  exports.setRandom = setRandom;
32
33
  function getRandom() {
33
- return clamp(_random(), 0, 1 - 1e-16);
34
+ const min = 0, max = 1;
35
+ return clamp(_random(), min, max - Number.EPSILON);
34
36
  }
35
37
  exports.getRandom = getRandom;
36
38
  function clamp(num, min, max) {
@@ -42,10 +44,10 @@
42
44
  }
43
45
  exports.mix = mix;
44
46
  function randomInRange(r) {
45
- const max = getRangeMax(r);
47
+ const max = getRangeMax(r), minOffset = 0;
46
48
  let min = getRangeMin(r);
47
49
  if (max === min) {
48
- min = 0;
50
+ min = minOffset;
49
51
  }
50
52
  return getRandom() * (max - min) + min;
51
53
  }
@@ -76,41 +78,47 @@
76
78
  }
77
79
  exports.setRangeValue = setRangeValue;
78
80
  function getDistances(pointA, pointB) {
79
- const dx = pointA.x - pointB.x, dy = pointA.y - pointB.y;
80
- return { dx: dx, dy: dy, distance: Math.sqrt(dx ** 2 + dy ** 2) };
81
+ const dx = pointA.x - pointB.x, dy = pointA.y - pointB.y, squareExp = 2;
82
+ return { dx: dx, dy: dy, distance: Math.sqrt(dx ** squareExp + dy ** squareExp) };
81
83
  }
82
84
  exports.getDistances = getDistances;
83
85
  function getDistance(pointA, pointB) {
84
86
  return getDistances(pointA, pointB).distance;
85
87
  }
86
88
  exports.getDistance = getDistance;
89
+ function degToRad(degrees) {
90
+ const PIDeg = 180;
91
+ return (degrees * Math.PI) / PIDeg;
92
+ }
93
+ exports.degToRad = degToRad;
87
94
  function getParticleDirectionAngle(direction, position, center) {
88
95
  if ((0, Utils_js_1.isNumber)(direction)) {
89
- return (direction * Math.PI) / 180;
96
+ return degToRad(direction);
90
97
  }
98
+ const empty = 0, half = 0.5, quarter = 0.25, threeQuarter = half + quarter;
91
99
  switch (direction) {
92
100
  case "top":
93
- return -Math.PI * 0.5;
101
+ return -Math.PI * half;
94
102
  case "top-right":
95
- return -Math.PI * 0.25;
103
+ return -Math.PI * quarter;
96
104
  case "right":
97
- return 0;
105
+ return empty;
98
106
  case "bottom-right":
99
- return Math.PI * 0.25;
107
+ return Math.PI * quarter;
100
108
  case "bottom":
101
- return Math.PI * 0.5;
109
+ return Math.PI * half;
102
110
  case "bottom-left":
103
- return Math.PI * 0.75;
111
+ return Math.PI * threeQuarter;
104
112
  case "left":
105
113
  return Math.PI;
106
114
  case "top-left":
107
- return -Math.PI * 0.75;
115
+ return -Math.PI * threeQuarter;
108
116
  case "inside":
109
117
  return Math.atan2(center.y - position.y, center.x - position.x);
110
118
  case "outside":
111
119
  return Math.atan2(position.y - center.y, position.x - center.x);
112
120
  default:
113
- return getRandom() * Math.PI * 2;
121
+ return getRandom() * doublePI;
114
122
  }
115
123
  }
116
124
  exports.getParticleDirectionAngle = getParticleDirectionAngle;
@@ -122,22 +130,23 @@
122
130
  }
123
131
  exports.getParticleBaseVelocity = getParticleBaseVelocity;
124
132
  function collisionVelocity(v1, v2, m1, m2) {
125
- return Vector_js_1.Vector.create((v1.x * (m1 - m2)) / (m1 + m2) + (v2.x * 2 * m2) / (m1 + m2), v1.y);
133
+ const double = 2;
134
+ return Vector_js_1.Vector.create((v1.x * (m1 - m2)) / (m1 + m2) + (v2.x * double * m2) / (m1 + m2), v1.y);
126
135
  }
127
136
  exports.collisionVelocity = collisionVelocity;
128
137
  function calcPositionFromSize(data) {
129
- return data.position && data.position.x !== undefined && data.position.y !== undefined
138
+ return data.position?.x !== undefined && data.position.y !== undefined
130
139
  ? {
131
- x: (data.position.x * data.size.width) / 100,
132
- y: (data.position.y * data.size.height) / 100,
140
+ x: (data.position.x * data.size.width) / Constants_js_1.percentDenominator,
141
+ y: (data.position.y * data.size.height) / Constants_js_1.percentDenominator,
133
142
  }
134
143
  : undefined;
135
144
  }
136
145
  exports.calcPositionFromSize = calcPositionFromSize;
137
146
  function calcPositionOrRandomFromSize(data) {
138
147
  return {
139
- x: ((data.position?.x ?? getRandom() * 100) * data.size.width) / 100,
140
- y: ((data.position?.y ?? getRandom() * 100) * data.size.height) / 100,
148
+ x: ((data.position?.x ?? getRandom() * Constants_js_1.percentDenominator) * data.size.width) / Constants_js_1.percentDenominator,
149
+ y: ((data.position?.y ?? getRandom() * Constants_js_1.percentDenominator) * data.size.height) / Constants_js_1.percentDenominator,
141
150
  };
142
151
  }
143
152
  exports.calcPositionOrRandomFromSize = calcPositionOrRandomFromSize;
@@ -165,7 +174,11 @@
165
174
  }
166
175
  exports.calcExactPositionOrRandomFromSizeRanged = calcExactPositionOrRandomFromSizeRanged;
167
176
  function parseAlpha(input) {
168
- return input ? (input.endsWith("%") ? parseFloat(input) / 100 : parseFloat(input)) : 1;
177
+ const defaultAlpha = 1;
178
+ if (!input) {
179
+ return defaultAlpha;
180
+ }
181
+ return input.endsWith("%") ? parseFloat(input) / Constants_js_1.percentDenominator : parseFloat(input);
169
182
  }
170
183
  exports.parseAlpha = parseAlpha;
171
184
  });
@@ -36,13 +36,13 @@
36
36
  if (!input.startsWith(this.stringPrefix)) {
37
37
  return;
38
38
  }
39
- const regex = /rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([\d.%]+)\s*)?\)/i, result = regex.exec(input);
39
+ const regex = /rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([\d.%]+)\s*)?\)/i, result = regex.exec(input), radix = 10, minLength = 4, defaultAlpha = 1;
40
40
  return result
41
41
  ? {
42
- a: result.length > 4 ? (0, NumberUtils_js_1.parseAlpha)(result[5]) : 1,
43
- b: parseInt(result[3], 10),
44
- g: parseInt(result[2], 10),
45
- r: parseInt(result[1], 10),
42
+ a: result.length > minLength ? (0, NumberUtils_js_1.parseAlpha)(result[5]) : defaultAlpha,
43
+ b: parseInt(result[3], radix),
44
+ g: parseInt(result[2], radix),
45
+ r: parseInt(result[1], radix),
46
46
  }
47
47
  : undefined;
48
48
  }
@@ -4,13 +4,14 @@
4
4
  if (v !== undefined) module.exports = v;
5
5
  }
6
6
  else if (typeof define === "function" && define.amd) {
7
- define(["require", "exports", "./NumberUtils.js", "../Core/Utils/Vector.js"], factory);
7
+ define(["require", "exports", "./NumberUtils.js", "../Core/Utils/Constants.js", "../Core/Utils/Vector.js"], factory);
8
8
  }
9
9
  })(function (require, exports) {
10
10
  "use strict";
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.isArray = exports.isObject = exports.isFunction = exports.isNumber = exports.isString = exports.isBoolean = exports.getSize = exports.getPosition = exports.initParticleNumericAnimationValue = exports.findItemFromSingleOrMultiple = exports.itemFromSingleOrMultiple = exports.executeOnSingleOrMultiple = exports.rectBounce = exports.circleBounce = exports.circleBounceDataFromParticle = exports.divMode = exports.singleDivModeExecute = exports.divModeExecute = exports.isDivModeEnabled = exports.deepExtend = exports.calculateBounds = exports.areBoundsInside = exports.isPointInside = exports.itemFromArray = exports.arrayRandomIndex = exports.loadFont = exports.isInArray = exports.safeMutationObserver = exports.safeIntersectionObserver = exports.safeMatchMedia = exports.hasMatchMedia = exports.isSsr = exports.getLogger = exports.setLogger = void 0;
12
+ exports.updateAnimation = exports.isArray = exports.isObject = exports.isFunction = exports.isNumber = exports.isString = exports.isBoolean = exports.getSize = exports.getPosition = exports.initParticleNumericAnimationValue = exports.findItemFromSingleOrMultiple = exports.itemFromSingleOrMultiple = exports.executeOnSingleOrMultiple = exports.rectBounce = exports.circleBounce = exports.circleBounceDataFromParticle = exports.divMode = exports.singleDivModeExecute = exports.divModeExecute = exports.isDivModeEnabled = exports.deepExtend = exports.calculateBounds = exports.areBoundsInside = exports.isPointInside = exports.itemFromArray = exports.arrayRandomIndex = exports.loadFont = exports.isInArray = exports.safeMutationObserver = exports.safeIntersectionObserver = exports.safeMatchMedia = exports.hasMatchMedia = exports.isSsr = exports.getLogger = exports.setLogger = void 0;
13
13
  const NumberUtils_js_1 = require("./NumberUtils.js");
14
+ const Constants_js_1 = require("../Core/Utils/Constants.js");
14
15
  const Vector_js_1 = require("../Core/Utils/Vector.js");
15
16
  const _logger = {
16
17
  debug: console.debug,
@@ -34,15 +35,15 @@
34
35
  }
35
36
  exports.getLogger = getLogger;
36
37
  function rectSideBounce(data) {
37
- const res = { bounced: false }, { pSide, pOtherSide, rectSide, rectOtherSide, velocity, factor } = data;
38
+ const res = { bounced: false }, { pSide, pOtherSide, rectSide, rectOtherSide, velocity, factor } = data, half = 0.5, minVelocity = 0;
38
39
  if (pOtherSide.min < rectOtherSide.min ||
39
40
  pOtherSide.min > rectOtherSide.max ||
40
41
  pOtherSide.max < rectOtherSide.min ||
41
42
  pOtherSide.max > rectOtherSide.max) {
42
43
  return res;
43
44
  }
44
- if ((pSide.max >= rectSide.min && pSide.max <= (rectSide.max + rectSide.min) * 0.5 && velocity > 0) ||
45
- (pSide.min <= rectSide.max && pSide.min > (rectSide.max + rectSide.min) * 0.5 && velocity < 0)) {
45
+ if ((pSide.max >= rectSide.min && pSide.max <= (rectSide.max + rectSide.min) * half && velocity > minVelocity) ||
46
+ (pSide.min <= rectSide.max && pSide.min > (rectSide.max + rectSide.min) * half && velocity < minVelocity)) {
46
47
  res.velocity = velocity * -factor;
47
48
  res.bounced = true;
48
49
  }
@@ -84,7 +85,8 @@
84
85
  }
85
86
  exports.safeMutationObserver = safeMutationObserver;
86
87
  function isInArray(value, array) {
87
- return value === array || (isArray(array) && array.indexOf(value) > -1);
88
+ const invalidIndex = -1;
89
+ return value === array || (isArray(array) && array.indexOf(value) > invalidIndex);
88
90
  }
89
91
  exports.isInArray = isInArray;
90
92
  async function loadFont(font, weight) {
@@ -104,7 +106,8 @@
104
106
  }
105
107
  exports.itemFromArray = itemFromArray;
106
108
  function isPointInside(point, size, offset, radius, direction) {
107
- return areBoundsInside(calculateBounds(point, radius ?? 0), size, offset, direction);
109
+ const minRadius = 0;
110
+ return areBoundsInside(calculateBounds(point, radius ?? minRadius), size, offset, direction);
108
111
  }
109
112
  exports.isPointInside = isPointInside;
110
113
  function areBoundsInside(bounds, size, offset, direction) {
@@ -203,8 +206,8 @@
203
206
  }
204
207
  exports.circleBounceDataFromParticle = circleBounceDataFromParticle;
205
208
  function circleBounce(p1, p2) {
206
- const { x: xVelocityDiff, y: yVelocityDiff } = p1.velocity.sub(p2.velocity), [pos1, pos2] = [p1.position, p2.position], { dx: xDist, dy: yDist } = (0, NumberUtils_js_1.getDistances)(pos2, pos1);
207
- if (xVelocityDiff * xDist + yVelocityDiff * yDist < 0) {
209
+ const { x: xVelocityDiff, y: yVelocityDiff } = p1.velocity.sub(p2.velocity), [pos1, pos2] = [p1.position, p2.position], { dx: xDist, dy: yDist } = (0, NumberUtils_js_1.getDistances)(pos2, pos1), minimumDistance = 0;
210
+ if (xVelocityDiff * xDist + yVelocityDiff * yDist < minimumDistance) {
208
211
  return;
209
212
  }
210
213
  const angle = -Math.atan2(yDist, xDist), m1 = p1.mass, m2 = p2.mass, u1 = p1.velocity.rotate(angle), u2 = p2.velocity.rotate(angle), v1 = (0, NumberUtils_js_1.collisionVelocity)(u1, u2, m1, m2), v2 = (0, NumberUtils_js_1.collisionVelocity)(u2, u1, m1, m2), vFinal1 = v1.rotate(-angle), vFinal2 = v2.rotate(-angle);
@@ -274,7 +277,8 @@
274
277
  }
275
278
  exports.rectBounce = rectBounce;
276
279
  function executeOnSingleOrMultiple(obj, callback) {
277
- return isArray(obj) ? obj.map((item, index) => callback(item, index)) : callback(obj, 0);
280
+ const defaultIndex = 0;
281
+ return isArray(obj) ? obj.map((item, index) => callback(item, index)) : callback(obj, defaultIndex);
278
282
  }
279
283
  exports.executeOnSingleOrMultiple = executeOnSingleOrMultiple;
280
284
  function itemFromSingleOrMultiple(obj, index, useIndex) {
@@ -282,12 +286,16 @@
282
286
  }
283
287
  exports.itemFromSingleOrMultiple = itemFromSingleOrMultiple;
284
288
  function findItemFromSingleOrMultiple(obj, callback) {
285
- return isArray(obj) ? obj.find((t, index) => callback(t, index)) : callback(obj, 0) ? obj : undefined;
289
+ if (isArray(obj)) {
290
+ return obj.find((t, index) => callback(t, index));
291
+ }
292
+ const defaultIndex = 0;
293
+ return callback(obj, defaultIndex) ? obj : undefined;
286
294
  }
287
295
  exports.findItemFromSingleOrMultiple = findItemFromSingleOrMultiple;
288
296
  function initParticleNumericAnimationValue(options, pxRatio) {
289
297
  const valueRange = options.value, animationOptions = options.animation, res = {
290
- delayTime: (0, NumberUtils_js_1.getRangeValue)(animationOptions.delay) * 1000,
298
+ delayTime: (0, NumberUtils_js_1.getRangeValue)(animationOptions.delay) * Constants_js_1.millisecondsToSeconds,
291
299
  enable: animationOptions.enable,
292
300
  value: (0, NumberUtils_js_1.getRangeValue)(options.value) * pxRatio,
293
301
  max: (0, NumberUtils_js_1.getRangeMax)(valueRange) * pxRatio,
@@ -295,9 +303,9 @@
295
303
  loops: 0,
296
304
  maxLoops: (0, NumberUtils_js_1.getRangeValue)(animationOptions.count),
297
305
  time: 0,
298
- };
306
+ }, decayOffset = 1;
299
307
  if (animationOptions.enable) {
300
- res.decay = 1 - (0, NumberUtils_js_1.getRangeValue)(animationOptions.decay);
308
+ res.decay = decayOffset - (0, NumberUtils_js_1.getRangeValue)(animationOptions.decay);
301
309
  switch (animationOptions.mode) {
302
310
  case "increase":
303
311
  res.status = "increasing";
@@ -306,7 +314,7 @@
306
314
  res.status = "decreasing";
307
315
  break;
308
316
  case "random":
309
- res.status = (0, NumberUtils_js_1.getRandom)() >= 0.5 ? "increasing" : "decreasing";
317
+ res.status = (0, NumberUtils_js_1.getRandom)() >= Constants_js_1.halfRandom ? "increasing" : "decreasing";
310
318
  break;
311
319
  }
312
320
  const autoStatus = animationOptions.mode === "auto";
@@ -327,7 +335,7 @@
327
335
  default:
328
336
  res.value = (0, NumberUtils_js_1.randomInRange)(res);
329
337
  if (autoStatus) {
330
- res.status = (0, NumberUtils_js_1.getRandom)() >= 0.5 ? "increasing" : "decreasing";
338
+ res.status = (0, NumberUtils_js_1.getRandom)() >= Constants_js_1.halfRandom ? "increasing" : "decreasing";
331
339
  }
332
340
  break;
333
341
  }
@@ -345,14 +353,14 @@
345
353
  const isPosition = "x" in positionOrSize;
346
354
  if (isPosition) {
347
355
  return {
348
- x: (positionOrSize.x / 100) * canvasSize.width,
349
- y: (positionOrSize.y / 100) * canvasSize.height,
356
+ x: (positionOrSize.x / Constants_js_1.percentDenominator) * canvasSize.width,
357
+ y: (positionOrSize.y / Constants_js_1.percentDenominator) * canvasSize.height,
350
358
  };
351
359
  }
352
360
  else {
353
361
  return {
354
- width: (positionOrSize.width / 100) * canvasSize.width,
355
- height: (positionOrSize.height / 100) * canvasSize.height,
362
+ width: (positionOrSize.width / Constants_js_1.percentDenominator) * canvasSize.width,
363
+ height: (positionOrSize.height / Constants_js_1.percentDenominator) * canvasSize.height,
356
364
  };
357
365
  }
358
366
  }
@@ -388,4 +396,80 @@
388
396
  return Array.isArray(arg);
389
397
  }
390
398
  exports.isArray = isArray;
399
+ function checkDestroy(particle, destroyType, value, minValue, maxValue) {
400
+ switch (destroyType) {
401
+ case "max":
402
+ if (value >= maxValue) {
403
+ particle.destroy();
404
+ }
405
+ break;
406
+ case "min":
407
+ if (value <= minValue) {
408
+ particle.destroy();
409
+ }
410
+ break;
411
+ }
412
+ }
413
+ function updateAnimation(particle, data, changeDirection, destroyType, delta) {
414
+ const minLoops = 0, minDelay = 0, identity = 1, minVelocity = 0, minDecay = 1;
415
+ if (particle.destroyed ||
416
+ !data ||
417
+ !data.enable ||
418
+ ((data.maxLoops ?? minLoops) > minLoops && (data.loops ?? minLoops) > (data.maxLoops ?? minLoops))) {
419
+ return;
420
+ }
421
+ const velocity = (data.velocity ?? minVelocity) * delta.factor, minValue = data.min, maxValue = data.max, decay = data.decay ?? minDecay;
422
+ if (!data.time) {
423
+ data.time = 0;
424
+ }
425
+ if ((data.delayTime ?? minDelay) > minDelay && data.time < (data.delayTime ?? minDelay)) {
426
+ data.time += delta.value;
427
+ }
428
+ if ((data.delayTime ?? minDelay) > minDelay && data.time < (data.delayTime ?? minDelay)) {
429
+ return;
430
+ }
431
+ switch (data.status) {
432
+ case "increasing":
433
+ if (data.value >= maxValue) {
434
+ if (changeDirection) {
435
+ data.status = "decreasing";
436
+ }
437
+ else {
438
+ data.value -= maxValue;
439
+ }
440
+ if (!data.loops) {
441
+ data.loops = minLoops;
442
+ }
443
+ data.loops++;
444
+ }
445
+ else {
446
+ data.value += velocity;
447
+ }
448
+ break;
449
+ case "decreasing":
450
+ if (data.value <= minValue) {
451
+ if (changeDirection) {
452
+ data.status = "increasing";
453
+ }
454
+ else {
455
+ data.value += maxValue;
456
+ }
457
+ if (!data.loops) {
458
+ data.loops = minLoops;
459
+ }
460
+ data.loops++;
461
+ }
462
+ else {
463
+ data.value -= velocity;
464
+ }
465
+ }
466
+ if (data.velocity && decay !== identity) {
467
+ data.velocity *= decay;
468
+ }
469
+ checkDestroy(particle, destroyType, data.value, minValue, maxValue);
470
+ if (!particle.destroyed) {
471
+ data.value = (0, NumberUtils_js_1.clamp)(data.value, minValue, maxValue);
472
+ }
473
+ }
474
+ exports.updateAnimation = updateAnimation;
391
475
  });