@tsparticles/engine 3.0.3 → 3.2.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 (156) hide show
  1. package/373.min.js +2 -0
  2. package/373.min.js.LICENSE.txt +1 -0
  3. package/438.min.js +2 -0
  4. package/438.min.js.LICENSE.txt +1 -0
  5. package/README.md +337 -216
  6. package/browser/Core/Canvas.js +102 -49
  7. package/browser/Core/Container.js +53 -41
  8. package/browser/Core/Engine.js +47 -32
  9. package/browser/Core/Particle.js +46 -48
  10. package/browser/Core/Particles.js +70 -57
  11. package/browser/Core/Retina.js +5 -4
  12. package/browser/Core/Utils/Circle.js +4 -3
  13. package/browser/Core/Utils/Constants.js +3 -0
  14. package/browser/Core/Utils/EventListeners.js +19 -16
  15. package/browser/Core/Utils/ExternalInteractorBase.js +1 -1
  16. package/browser/Core/Utils/InteractionManager.js +17 -8
  17. package/browser/Core/Utils/ParticlesInteractorBase.js +1 -1
  18. package/browser/Core/Utils/QuadTree.js +5 -3
  19. package/browser/Core/Utils/Vector.js +7 -2
  20. package/browser/Core/Utils/Vector3d.js +14 -9
  21. package/browser/Options/Classes/BackgroundMask/BackgroundMask.js +1 -1
  22. package/browser/Options/Classes/BackgroundMask/BackgroundMaskCover.js +3 -2
  23. package/browser/Options/Classes/ManualParticle.js +3 -2
  24. package/browser/Options/Classes/Options.js +3 -0
  25. package/browser/Utils/CanvasUtils.js +50 -40
  26. package/browser/Utils/ColorUtils.js +124 -45
  27. package/browser/Utils/EventDispatcher.js +6 -5
  28. package/browser/Utils/HslColorManager.js +5 -5
  29. package/browser/Utils/NumberUtils.js +35 -23
  30. package/browser/Utils/RgbColorManager.js +5 -5
  31. package/browser/Utils/Utils.js +102 -19
  32. package/cjs/Core/Canvas.js +102 -49
  33. package/cjs/Core/Container.js +53 -41
  34. package/cjs/Core/Engine.js +70 -32
  35. package/cjs/Core/Particle.js +45 -47
  36. package/cjs/Core/Particles.js +93 -57
  37. package/cjs/Core/Retina.js +5 -4
  38. package/cjs/Core/Utils/Circle.js +4 -3
  39. package/cjs/Core/Utils/Constants.js +4 -1
  40. package/cjs/Core/Utils/EventListeners.js +18 -15
  41. package/cjs/Core/Utils/ExternalInteractorBase.js +1 -1
  42. package/cjs/Core/Utils/InteractionManager.js +17 -8
  43. package/cjs/Core/Utils/ParticlesInteractorBase.js +1 -1
  44. package/cjs/Core/Utils/QuadTree.js +5 -3
  45. package/cjs/Core/Utils/Vector.js +7 -2
  46. package/cjs/Core/Utils/Vector3d.js +14 -9
  47. package/cjs/Options/Classes/BackgroundMask/BackgroundMask.js +1 -1
  48. package/cjs/Options/Classes/BackgroundMask/BackgroundMaskCover.js +3 -2
  49. package/cjs/Options/Classes/ManualParticle.js +3 -2
  50. package/cjs/Options/Classes/Options.js +3 -0
  51. package/cjs/Utils/CanvasUtils.js +50 -40
  52. package/cjs/Utils/ColorUtils.js +126 -45
  53. package/cjs/Utils/EventDispatcher.js +6 -5
  54. package/cjs/Utils/HslColorManager.js +5 -5
  55. package/cjs/Utils/NumberUtils.js +37 -24
  56. package/cjs/Utils/RgbColorManager.js +5 -5
  57. package/cjs/Utils/Utils.js +103 -19
  58. package/dist_browser_Core_Container_js.js +92 -0
  59. package/dist_browser_Core_Particle_js.js +32 -0
  60. package/esm/Core/Canvas.js +102 -49
  61. package/esm/Core/Container.js +53 -41
  62. package/esm/Core/Engine.js +47 -32
  63. package/esm/Core/Particle.js +46 -48
  64. package/esm/Core/Particles.js +70 -57
  65. package/esm/Core/Retina.js +5 -4
  66. package/esm/Core/Utils/Circle.js +4 -3
  67. package/esm/Core/Utils/Constants.js +3 -0
  68. package/esm/Core/Utils/EventListeners.js +19 -16
  69. package/esm/Core/Utils/ExternalInteractorBase.js +1 -1
  70. package/esm/Core/Utils/InteractionManager.js +17 -8
  71. package/esm/Core/Utils/ParticlesInteractorBase.js +1 -1
  72. package/esm/Core/Utils/QuadTree.js +5 -3
  73. package/esm/Core/Utils/Vector.js +7 -2
  74. package/esm/Core/Utils/Vector3d.js +14 -9
  75. package/esm/Options/Classes/BackgroundMask/BackgroundMask.js +1 -1
  76. package/esm/Options/Classes/BackgroundMask/BackgroundMaskCover.js +3 -2
  77. package/esm/Options/Classes/ManualParticle.js +3 -2
  78. package/esm/Options/Classes/Options.js +3 -0
  79. package/esm/Utils/CanvasUtils.js +50 -40
  80. package/esm/Utils/ColorUtils.js +124 -45
  81. package/esm/Utils/EventDispatcher.js +6 -5
  82. package/esm/Utils/HslColorManager.js +5 -5
  83. package/esm/Utils/NumberUtils.js +35 -23
  84. package/esm/Utils/RgbColorManager.js +5 -5
  85. package/esm/Utils/Utils.js +102 -19
  86. package/package.json +1 -1
  87. package/report.html +3 -3
  88. package/tsparticles.engine.js +894 -5461
  89. package/tsparticles.engine.min.js +1 -1
  90. package/tsparticles.engine.min.js.LICENSE.txt +1 -1
  91. package/types/Core/Canvas.d.ts +5 -3
  92. package/types/Core/Container.d.ts +1 -1
  93. package/types/Core/Engine.d.ts +13 -8
  94. package/types/Core/Interfaces/IContainerPlugin.d.ts +3 -3
  95. package/types/Core/Interfaces/IEffectDrawer.d.ts +3 -3
  96. package/types/Core/Interfaces/IMovePathGenerator.d.ts +2 -2
  97. package/types/Core/Interfaces/IParticleHslAnimation.d.ts +4 -4
  98. package/types/Core/Interfaces/IParticleMover.d.ts +2 -2
  99. package/types/Core/Interfaces/IParticleUpdater.d.ts +2 -2
  100. package/types/Core/Interfaces/IParticleValueAnimation.d.ts +4 -0
  101. package/types/Core/Interfaces/IPlugin.d.ts +1 -1
  102. package/types/Core/Interfaces/IShapeDrawData.d.ts +2 -2
  103. package/types/Core/Interfaces/IShapeDrawer.d.ts +4 -4
  104. package/types/Core/Particle.d.ts +3 -3
  105. package/types/Core/Particles.d.ts +12 -8
  106. package/types/Core/Utils/Constants.d.ts +3 -0
  107. package/types/Core/Utils/ExternalInteractorBase.d.ts +1 -1
  108. package/types/Core/Utils/InteractionManager.d.ts +3 -3
  109. package/types/Core/Utils/ParticlesInteractorBase.d.ts +1 -1
  110. package/types/Core/Utils/Point.d.ts +1 -1
  111. package/types/Enums/Modes/OutMode.d.ts +0 -3
  112. package/types/Options/Classes/BackgroundMask/BackgroundMaskCover.d.ts +2 -1
  113. package/types/Options/Classes/Options.d.ts +1 -0
  114. package/types/Options/Classes/Particles/Move/Move.d.ts +1 -2
  115. package/types/Options/Classes/Particles/Move/OutModes.d.ts +5 -6
  116. package/types/Options/Interfaces/BackgroundMask/IBackgroundMask.d.ts +2 -1
  117. package/types/Options/Interfaces/BackgroundMask/IBackgroundMaskCover.d.ts +2 -1
  118. package/types/Options/Interfaces/IOptions.d.ts +1 -0
  119. package/types/Options/Interfaces/Interactivity/Modes/IModes.d.ts +1 -3
  120. package/types/Options/Interfaces/Particles/Move/IMove.d.ts +2 -2
  121. package/types/Options/Interfaces/Particles/Move/IOutModes.d.ts +6 -6
  122. package/types/Types/CustomEventArgs.d.ts +2 -2
  123. package/types/Types/ExportResult.d.ts +2 -2
  124. package/types/Types/ParticlesGroups.d.ts +1 -3
  125. package/types/Types/PathOptions.d.ts +1 -3
  126. package/types/Types/ShapeData.d.ts +1 -3
  127. package/types/Utils/CanvasUtils.d.ts +9 -8
  128. package/types/Utils/ColorUtils.d.ts +5 -0
  129. package/types/Utils/NumberUtils.d.ts +2 -2
  130. package/types/Utils/Utils.d.ts +9 -6
  131. package/umd/Core/Canvas.js +102 -49
  132. package/umd/Core/Container.js +54 -42
  133. package/umd/Core/Engine.js +72 -33
  134. package/umd/Core/Particle.js +46 -48
  135. package/umd/Core/Particles.js +95 -58
  136. package/umd/Core/Retina.js +5 -4
  137. package/umd/Core/Utils/Circle.js +4 -3
  138. package/umd/Core/Utils/Constants.js +4 -1
  139. package/umd/Core/Utils/EventListeners.js +18 -15
  140. package/umd/Core/Utils/ExternalInteractorBase.js +1 -1
  141. package/umd/Core/Utils/InteractionManager.js +17 -8
  142. package/umd/Core/Utils/ParticlesInteractorBase.js +1 -1
  143. package/umd/Core/Utils/QuadTree.js +5 -3
  144. package/umd/Core/Utils/Vector.js +7 -2
  145. package/umd/Core/Utils/Vector3d.js +14 -9
  146. package/umd/Options/Classes/BackgroundMask/BackgroundMask.js +1 -1
  147. package/umd/Options/Classes/BackgroundMask/BackgroundMaskCover.js +3 -2
  148. package/umd/Options/Classes/ManualParticle.js +3 -2
  149. package/umd/Options/Classes/Options.js +3 -0
  150. package/umd/Utils/CanvasUtils.js +50 -40
  151. package/umd/Utils/ColorUtils.js +127 -46
  152. package/umd/Utils/EventDispatcher.js +6 -5
  153. package/umd/Utils/HslColorManager.js +5 -5
  154. package/umd/Utils/NumberUtils.js +38 -25
  155. package/umd/Utils/RgbColorManager.js +5 -5
  156. package/umd/Utils/Utils.js +104 -20
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getHslAnimationFromHsl = exports.getHslFromAnimation = exports.getLinkRandomColor = exports.getLinkColor = exports.colorMix = exports.getStyleFromHsl = exports.getStyleFromRgb = exports.getRandomRgbColor = exports.hslaToRgba = exports.hslToRgb = exports.stringToRgb = exports.stringToAlpha = exports.rgbToHsl = exports.rangeColorToHsl = exports.colorToHsl = exports.colorToRgb = exports.rangeColorToRgb = exports.addColorManager = void 0;
3
+ exports.updateColor = exports.updateColorValue = exports.getHslAnimationFromHsl = exports.getHslFromAnimation = exports.getLinkRandomColor = exports.getLinkColor = exports.colorMix = exports.getStyleFromHsl = exports.getStyleFromRgb = exports.getRandomRgbColor = exports.hslaToRgba = exports.hslToRgb = exports.stringToRgb = exports.stringToAlpha = exports.rgbToHsl = exports.rangeColorToHsl = exports.colorToHsl = exports.colorToRgb = exports.rangeColorToRgb = exports.addColorManager = void 0;
4
4
  const NumberUtils_js_1 = require("./NumberUtils.js");
5
5
  const Utils_js_1 = require("./Utils.js");
6
+ const Constants_js_1 = require("../Core/Utils/Constants.js");
6
7
  const randomColorValue = "random", midColorValue = "mid", colorManagers = new Map();
7
8
  function addColorManager(manager) {
8
9
  colorManagers.set(manager.key, manager);
@@ -16,13 +17,15 @@ function stringToRgba(input) {
16
17
  }
17
18
  const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i, hexFixed = input.replace(shorthandRegex, (_, r, g, b, a) => {
18
19
  return r + r + g + g + b + b + (a !== undefined ? a + a : "");
19
- }), regex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i, result = regex.exec(hexFixed);
20
+ }), regex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i, result = regex.exec(hexFixed), radix = 16, defaultAlpha = 1, alphaFactor = 0xff;
20
21
  return result
21
22
  ? {
22
- a: result[4] !== undefined ? parseInt(result[4], 16) / 0xff : 1,
23
- b: parseInt(result[3], 16),
24
- g: parseInt(result[2], 16),
25
- r: parseInt(result[1], 16),
23
+ a: result[4] !== undefined
24
+ ? parseInt(result[4], radix) / alphaFactor
25
+ : defaultAlpha,
26
+ b: parseInt(result[3], radix),
27
+ g: parseInt(result[2], radix),
28
+ r: parseInt(result[1], radix),
26
29
  }
27
30
  : undefined;
28
31
  }
@@ -79,26 +82,26 @@ function rangeColorToHsl(color, index, useIndex = true) {
79
82
  }
80
83
  exports.rangeColorToHsl = rangeColorToHsl;
81
84
  function rgbToHsl(color) {
82
- const r1 = color.r / 255, g1 = color.g / 255, b1 = color.b / 255, max = Math.max(r1, g1, b1), min = Math.min(r1, g1, b1), res = {
83
- h: 0,
84
- l: (max + min) * 0.5,
85
- s: 0,
85
+ const rgbMax = 255, hMax = 360, sMax = 100, lMax = 100, hMin = 0, sMin = 0, hPhase = 60, half = 0.5, double = 2, r1 = color.r / rgbMax, g1 = color.g / rgbMax, b1 = color.b / rgbMax, max = Math.max(r1, g1, b1), min = Math.min(r1, g1, b1), res = {
86
+ h: hMin,
87
+ l: (max + min) * half,
88
+ s: sMin,
86
89
  };
87
90
  if (max !== min) {
88
- res.s = res.l < 0.5 ? (max - min) / (max + min) : (max - min) / (2.0 - max - min);
91
+ res.s = res.l < half ? (max - min) / (max + min) : (max - min) / (double - max - min);
89
92
  res.h =
90
93
  r1 === max
91
94
  ? (g1 - b1) / (max - min)
92
- : (res.h = g1 === max ? 2.0 + (b1 - r1) / (max - min) : 4.0 + (r1 - g1) / (max - min));
95
+ : (res.h = g1 === max ? double + (b1 - r1) / (max - min) : double * double + (r1 - g1) / (max - min));
93
96
  }
94
- res.l *= 100;
95
- res.s *= 100;
96
- res.h *= 60;
97
- if (res.h < 0) {
98
- res.h += 360;
97
+ res.l *= lMax;
98
+ res.s *= sMax;
99
+ res.h *= hPhase;
100
+ if (res.h < hMin) {
101
+ res.h += hMax;
99
102
  }
100
- if (res.h >= 360) {
101
- res.h -= 360;
103
+ if (res.h >= hMax) {
104
+ res.h -= hMax;
102
105
  }
103
106
  return res;
104
107
  }
@@ -112,29 +115,33 @@ function stringToRgb(input) {
112
115
  }
113
116
  exports.stringToRgb = stringToRgb;
114
117
  function hslToRgb(hsl) {
115
- const h = ((hsl.h % 360) + 360) % 360, s = Math.max(0, Math.min(100, hsl.s)), l = Math.max(0, Math.min(100, hsl.l)), hNormalized = h / 360, sNormalized = s / 100, lNormalized = l / 100;
116
- if (s === 0) {
117
- const grayscaleValue = Math.round(lNormalized * 255);
118
+ const hMax = 360, sMax = 100, lMax = 100, sMin = 0, lMin = 0, h = ((hsl.h % hMax) + hMax) % hMax, s = Math.max(sMin, Math.min(sMax, hsl.s)), l = Math.max(lMin, Math.min(lMax, hsl.l)), hNormalized = h / hMax, sNormalized = s / sMax, lNormalized = l / lMax, rgbFactor = 255, triple = 3;
119
+ if (s === sMin) {
120
+ const grayscaleValue = Math.round(lNormalized * rgbFactor);
118
121
  return { r: grayscaleValue, g: grayscaleValue, b: grayscaleValue };
119
122
  }
120
- const channel = (temp1, temp2, temp3) => {
121
- if (temp3 < 0) {
122
- temp3 += 1;
123
+ const half = 0.5, double = 2, channel = (temp1, temp2, temp3) => {
124
+ const temp3Min = 0, temp3Max = 1, sextuple = 6;
125
+ if (temp3 < temp3Min) {
126
+ temp3++;
123
127
  }
124
- if (temp3 > 1) {
125
- temp3 -= 1;
128
+ if (temp3 > temp3Max) {
129
+ temp3--;
126
130
  }
127
- if (temp3 * 6 < 1) {
128
- return temp1 + (temp2 - temp1) * 6 * temp3;
131
+ if (temp3 * sextuple < temp3Max) {
132
+ return temp1 + (temp2 - temp1) * sextuple * temp3;
129
133
  }
130
- if (temp3 * 2 < 1) {
134
+ if (temp3 * double < temp3Max) {
131
135
  return temp2;
132
136
  }
133
- if (temp3 * 3 < 2) {
134
- return temp1 + (temp2 - temp1) * (2 / 3 - temp3) * 6;
137
+ if (temp3 * triple < temp3Max * double) {
138
+ const temp3Offset = double / triple;
139
+ return temp1 + (temp2 - temp1) * (temp3Offset - temp3) * sextuple;
135
140
  }
136
141
  return temp1;
137
- }, temp1 = lNormalized < 0.5 ? lNormalized * (1 + sNormalized) : lNormalized + sNormalized - lNormalized * sNormalized, temp2 = 2 * lNormalized - temp1, red = Math.min(255, 255 * channel(temp2, temp1, hNormalized + 1 / 3)), green = Math.min(255, 255 * channel(temp2, temp1, hNormalized)), blue = Math.min(255, 255 * channel(temp2, temp1, hNormalized - 1 / 3));
142
+ }, sNormalizedOffset = 1, temp1 = lNormalized < half
143
+ ? lNormalized * (sNormalizedOffset + sNormalized)
144
+ : lNormalized + sNormalized - lNormalized * sNormalized, temp2 = double * lNormalized - temp1, phaseNumerator = 1, phaseThird = phaseNumerator / triple, red = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized + phaseThird)), green = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized)), blue = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized - phaseThird));
138
145
  return { r: Math.round(red), g: Math.round(green), b: Math.round(blue) };
139
146
  }
140
147
  exports.hslToRgb = hslToRgb;
@@ -149,20 +156,22 @@ function hslaToRgba(hsla) {
149
156
  }
150
157
  exports.hslaToRgba = hslaToRgba;
151
158
  function getRandomRgbColor(min) {
152
- const fixedMin = min ?? 0;
159
+ const defaultMin = 0, fixedMin = min ?? defaultMin, rgbMax = 256;
153
160
  return {
154
- b: Math.floor((0, NumberUtils_js_1.randomInRange)((0, NumberUtils_js_1.setRangeValue)(fixedMin, 256))),
155
- g: Math.floor((0, NumberUtils_js_1.randomInRange)((0, NumberUtils_js_1.setRangeValue)(fixedMin, 256))),
156
- r: Math.floor((0, NumberUtils_js_1.randomInRange)((0, NumberUtils_js_1.setRangeValue)(fixedMin, 256))),
161
+ b: Math.floor((0, NumberUtils_js_1.randomInRange)((0, NumberUtils_js_1.setRangeValue)(fixedMin, rgbMax))),
162
+ g: Math.floor((0, NumberUtils_js_1.randomInRange)((0, NumberUtils_js_1.setRangeValue)(fixedMin, rgbMax))),
163
+ r: Math.floor((0, NumberUtils_js_1.randomInRange)((0, NumberUtils_js_1.setRangeValue)(fixedMin, rgbMax))),
157
164
  };
158
165
  }
159
166
  exports.getRandomRgbColor = getRandomRgbColor;
160
167
  function getStyleFromRgb(color, opacity) {
161
- return `rgba(${color.r}, ${color.g}, ${color.b}, ${opacity ?? 1})`;
168
+ const defaultOpacity = 1;
169
+ return `rgba(${color.r}, ${color.g}, ${color.b}, ${opacity ?? defaultOpacity})`;
162
170
  }
163
171
  exports.getStyleFromRgb = getStyleFromRgb;
164
172
  function getStyleFromHsl(color, opacity) {
165
- return `hsla(${color.h}, ${color.s}%, ${color.l}%, ${opacity ?? 1})`;
173
+ const defaultOpacity = 1;
174
+ return `hsla(${color.h}, ${color.s}%, ${color.l}%, ${opacity ?? defaultOpacity})`;
166
175
  }
167
176
  exports.getStyleFromHsl = getStyleFromHsl;
168
177
  function colorMix(color1, color2, size1, size2) {
@@ -259,21 +268,93 @@ function getHslAnimationFromHsl(hsl, animationOptions, reduceFactor) {
259
268
  exports.getHslAnimationFromHsl = getHslAnimationFromHsl;
260
269
  function setColorAnimation(colorValue, colorAnimation, reduceFactor) {
261
270
  colorValue.enable = colorAnimation.enable;
271
+ const defaultVelocity = 0, decayOffset = 1, defaultLoops = 0, defaultTime = 0;
262
272
  if (colorValue.enable) {
263
- colorValue.velocity = ((0, NumberUtils_js_1.getRangeValue)(colorAnimation.speed) / 100) * reduceFactor;
264
- colorValue.decay = 1 - (0, NumberUtils_js_1.getRangeValue)(colorAnimation.decay);
273
+ colorValue.velocity = ((0, NumberUtils_js_1.getRangeValue)(colorAnimation.speed) / Constants_js_1.percentDenominator) * reduceFactor;
274
+ colorValue.decay = decayOffset - (0, NumberUtils_js_1.getRangeValue)(colorAnimation.decay);
265
275
  colorValue.status = "increasing";
266
- colorValue.loops = 0;
276
+ colorValue.loops = defaultLoops;
267
277
  colorValue.maxLoops = (0, NumberUtils_js_1.getRangeValue)(colorAnimation.count);
268
- colorValue.time = 0;
269
- colorValue.delayTime = (0, NumberUtils_js_1.getRangeValue)(colorAnimation.delay) * 1000;
278
+ colorValue.time = defaultTime;
279
+ colorValue.delayTime = (0, NumberUtils_js_1.getRangeValue)(colorAnimation.delay) * Constants_js_1.millisecondsToSeconds;
270
280
  if (!colorAnimation.sync) {
271
281
  colorValue.velocity *= (0, NumberUtils_js_1.getRandom)();
272
282
  colorValue.value *= (0, NumberUtils_js_1.getRandom)();
273
283
  }
274
284
  colorValue.initialValue = colorValue.value;
285
+ colorValue.offset = (0, NumberUtils_js_1.setRangeValue)(colorAnimation.offset);
275
286
  }
276
287
  else {
277
- colorValue.velocity = 0;
288
+ colorValue.velocity = defaultVelocity;
278
289
  }
279
290
  }
291
+ function updateColorValue(data, range, decrease, delta) {
292
+ const minLoops = 0, minDelay = 0, identity = 1, minVelocity = 0, minOffset = 0, velocityFactor = 3.6;
293
+ if (!data ||
294
+ !data.enable ||
295
+ ((data.maxLoops ?? minLoops) > minLoops && (data.loops ?? minLoops) > (data.maxLoops ?? minLoops))) {
296
+ return;
297
+ }
298
+ if (!data.time) {
299
+ data.time = 0;
300
+ }
301
+ if ((data.delayTime ?? minDelay) > minDelay && data.time < (data.delayTime ?? minDelay)) {
302
+ data.time += delta.value;
303
+ }
304
+ if ((data.delayTime ?? minDelay) > minDelay && data.time < (data.delayTime ?? minDelay)) {
305
+ return;
306
+ }
307
+ const offset = data.offset ? (0, NumberUtils_js_1.randomInRange)(data.offset) : minOffset, velocity = (data.velocity ?? minVelocity) * delta.factor + offset * velocityFactor, decay = data.decay ?? identity, max = (0, NumberUtils_js_1.getRangeMax)(range), min = (0, NumberUtils_js_1.getRangeMin)(range);
308
+ if (!decrease || data.status === "increasing") {
309
+ data.value += velocity;
310
+ if (data.value > max) {
311
+ if (!data.loops) {
312
+ data.loops = 0;
313
+ }
314
+ data.loops++;
315
+ if (decrease) {
316
+ data.status = "decreasing";
317
+ }
318
+ else {
319
+ data.value -= max;
320
+ }
321
+ }
322
+ }
323
+ else {
324
+ data.value -= velocity;
325
+ const minValue = 0;
326
+ if (data.value < minValue) {
327
+ if (!data.loops) {
328
+ data.loops = 0;
329
+ }
330
+ data.loops++;
331
+ data.status = "increasing";
332
+ }
333
+ }
334
+ if (data.velocity && decay !== identity) {
335
+ data.velocity *= decay;
336
+ }
337
+ data.value = (0, NumberUtils_js_1.clamp)(data.value, min, max);
338
+ }
339
+ exports.updateColorValue = updateColorValue;
340
+ function updateColor(color, delta) {
341
+ if (!color) {
342
+ return;
343
+ }
344
+ const { h, s, l } = color;
345
+ const ranges = {
346
+ h: { min: 0, max: 360 },
347
+ s: { min: 0, max: 100 },
348
+ l: { min: 0, max: 100 },
349
+ };
350
+ if (h) {
351
+ updateColorValue(h, ranges.h, false, delta);
352
+ }
353
+ if (s) {
354
+ updateColorValue(s, ranges.s, true, delta);
355
+ }
356
+ if (l) {
357
+ updateColorValue(l, ranges.l, true, delta);
358
+ }
359
+ }
360
+ exports.updateColor = updateColor;
@@ -16,7 +16,7 @@ class EventDispatcher {
16
16
  }
17
17
  dispatchEvent(type, args) {
18
18
  const listeners = this._listeners.get(type);
19
- listeners && listeners.forEach((handler) => handler(args));
19
+ listeners?.forEach((handler) => handler(args));
20
20
  }
21
21
  hasEventListener(type) {
22
22
  return !!this._listeners.get(type);
@@ -34,15 +34,16 @@ class EventDispatcher {
34
34
  if (!arr) {
35
35
  return;
36
36
  }
37
- const length = arr.length, idx = arr.indexOf(listener);
38
- if (idx < 0) {
37
+ const length = arr.length, idx = arr.indexOf(listener), minIndex = 0;
38
+ if (idx < minIndex) {
39
39
  return;
40
40
  }
41
- if (length === 1) {
41
+ const deleteCount = 1;
42
+ if (length === deleteCount) {
42
43
  this._listeners.delete(type);
43
44
  }
44
45
  else {
45
- arr.splice(idx, 1);
46
+ arr.splice(idx, deleteCount);
46
47
  }
47
48
  }
48
49
  }
@@ -28,13 +28,13 @@ class HslColorManager {
28
28
  if (!input.startsWith("hsl")) {
29
29
  return;
30
30
  }
31
- const regex = /hsla?\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([\d.%]+)\s*)?\)/i, result = regex.exec(input);
31
+ const regex = /hsla?\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([\d.%]+)\s*)?\)/i, result = regex.exec(input), minLength = 4, defaultAlpha = 1, radix = 10;
32
32
  return result
33
33
  ? (0, ColorUtils_js_1.hslaToRgba)({
34
- a: result.length > 4 ? (0, NumberUtils_js_1.parseAlpha)(result[5]) : 1,
35
- h: parseInt(result[1], 10),
36
- l: parseInt(result[3], 10),
37
- s: parseInt(result[2], 10),
34
+ a: result.length > minLength ? (0, NumberUtils_js_1.parseAlpha)(result[5]) : defaultAlpha,
35
+ h: parseInt(result[1], radix),
36
+ l: parseInt(result[3], radix),
37
+ s: parseInt(result[2], radix),
38
38
  })
39
39
  : undefined;
40
40
  }
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- 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;
3
+ 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;
4
4
  const Vector_js_1 = require("../Core/Utils/Vector.js");
5
5
  const Utils_js_1 = require("./Utils.js");
6
+ const Constants_js_1 = require("../Core/Utils/Constants.js");
6
7
  let _random = Math.random;
7
- const easings = new Map();
8
+ const easings = new Map(), double = 2, doublePI = Math.PI * double;
8
9
  function addEasing(name, easing) {
9
10
  if (easings.get(name)) {
10
11
  return;
@@ -13,7 +14,7 @@ function addEasing(name, easing) {
13
14
  }
14
15
  exports.addEasing = addEasing;
15
16
  function getEasing(name) {
16
- return easings.get(name) || ((value) => value);
17
+ return easings.get(name) ?? ((value) => value);
17
18
  }
18
19
  exports.getEasing = getEasing;
19
20
  function setRandom(rnd = Math.random) {
@@ -21,7 +22,8 @@ function setRandom(rnd = Math.random) {
21
22
  }
22
23
  exports.setRandom = setRandom;
23
24
  function getRandom() {
24
- return clamp(_random(), 0, 1 - 1e-16);
25
+ const min = 0, max = 1;
26
+ return clamp(_random(), min, max - Number.EPSILON);
25
27
  }
26
28
  exports.getRandom = getRandom;
27
29
  function clamp(num, min, max) {
@@ -33,10 +35,10 @@ function mix(comp1, comp2, weight1, weight2) {
33
35
  }
34
36
  exports.mix = mix;
35
37
  function randomInRange(r) {
36
- const max = getRangeMax(r);
38
+ const max = getRangeMax(r), minOffset = 0;
37
39
  let min = getRangeMin(r);
38
40
  if (max === min) {
39
- min = 0;
41
+ min = minOffset;
40
42
  }
41
43
  return getRandom() * (max - min) + min;
42
44
  }
@@ -67,41 +69,47 @@ function setRangeValue(source, value) {
67
69
  }
68
70
  exports.setRangeValue = setRangeValue;
69
71
  function getDistances(pointA, pointB) {
70
- const dx = pointA.x - pointB.x, dy = pointA.y - pointB.y;
71
- return { dx: dx, dy: dy, distance: Math.sqrt(dx ** 2 + dy ** 2) };
72
+ const dx = pointA.x - pointB.x, dy = pointA.y - pointB.y, squareExp = 2;
73
+ return { dx: dx, dy: dy, distance: Math.sqrt(dx ** squareExp + dy ** squareExp) };
72
74
  }
73
75
  exports.getDistances = getDistances;
74
76
  function getDistance(pointA, pointB) {
75
77
  return getDistances(pointA, pointB).distance;
76
78
  }
77
79
  exports.getDistance = getDistance;
80
+ function degToRad(degrees) {
81
+ const PIDeg = 180;
82
+ return (degrees * Math.PI) / PIDeg;
83
+ }
84
+ exports.degToRad = degToRad;
78
85
  function getParticleDirectionAngle(direction, position, center) {
79
86
  if ((0, Utils_js_1.isNumber)(direction)) {
80
- return (direction * Math.PI) / 180;
87
+ return degToRad(direction);
81
88
  }
89
+ const empty = 0, half = 0.5, quarter = 0.25, threeQuarter = half + quarter;
82
90
  switch (direction) {
83
91
  case "top":
84
- return -Math.PI * 0.5;
92
+ return -Math.PI * half;
85
93
  case "top-right":
86
- return -Math.PI * 0.25;
94
+ return -Math.PI * quarter;
87
95
  case "right":
88
- return 0;
96
+ return empty;
89
97
  case "bottom-right":
90
- return Math.PI * 0.25;
98
+ return Math.PI * quarter;
91
99
  case "bottom":
92
- return Math.PI * 0.5;
100
+ return Math.PI * half;
93
101
  case "bottom-left":
94
- return Math.PI * 0.75;
102
+ return Math.PI * threeQuarter;
95
103
  case "left":
96
104
  return Math.PI;
97
105
  case "top-left":
98
- return -Math.PI * 0.75;
106
+ return -Math.PI * threeQuarter;
99
107
  case "inside":
100
108
  return Math.atan2(center.y - position.y, center.x - position.x);
101
109
  case "outside":
102
110
  return Math.atan2(position.y - center.y, position.x - center.x);
103
111
  default:
104
- return getRandom() * Math.PI * 2;
112
+ return getRandom() * doublePI;
105
113
  }
106
114
  }
107
115
  exports.getParticleDirectionAngle = getParticleDirectionAngle;
@@ -113,22 +121,23 @@ function getParticleBaseVelocity(direction) {
113
121
  }
114
122
  exports.getParticleBaseVelocity = getParticleBaseVelocity;
115
123
  function collisionVelocity(v1, v2, m1, m2) {
116
- return Vector_js_1.Vector.create((v1.x * (m1 - m2)) / (m1 + m2) + (v2.x * 2 * m2) / (m1 + m2), v1.y);
124
+ const double = 2;
125
+ return Vector_js_1.Vector.create((v1.x * (m1 - m2)) / (m1 + m2) + (v2.x * double * m2) / (m1 + m2), v1.y);
117
126
  }
118
127
  exports.collisionVelocity = collisionVelocity;
119
128
  function calcPositionFromSize(data) {
120
- return data.position && data.position.x !== undefined && data.position.y !== undefined
129
+ return data.position?.x !== undefined && data.position.y !== undefined
121
130
  ? {
122
- x: (data.position.x * data.size.width) / 100,
123
- y: (data.position.y * data.size.height) / 100,
131
+ x: (data.position.x * data.size.width) / Constants_js_1.percentDenominator,
132
+ y: (data.position.y * data.size.height) / Constants_js_1.percentDenominator,
124
133
  }
125
134
  : undefined;
126
135
  }
127
136
  exports.calcPositionFromSize = calcPositionFromSize;
128
137
  function calcPositionOrRandomFromSize(data) {
129
138
  return {
130
- x: ((data.position?.x ?? getRandom() * 100) * data.size.width) / 100,
131
- y: ((data.position?.y ?? getRandom() * 100) * data.size.height) / 100,
139
+ x: ((data.position?.x ?? getRandom() * Constants_js_1.percentDenominator) * data.size.width) / Constants_js_1.percentDenominator,
140
+ y: ((data.position?.y ?? getRandom() * Constants_js_1.percentDenominator) * data.size.height) / Constants_js_1.percentDenominator,
132
141
  };
133
142
  }
134
143
  exports.calcPositionOrRandomFromSize = calcPositionOrRandomFromSize;
@@ -156,6 +165,10 @@ function calcExactPositionOrRandomFromSizeRanged(data) {
156
165
  }
157
166
  exports.calcExactPositionOrRandomFromSizeRanged = calcExactPositionOrRandomFromSizeRanged;
158
167
  function parseAlpha(input) {
159
- return input ? (input.endsWith("%") ? parseFloat(input) / 100 : parseFloat(input)) : 1;
168
+ const defaultAlpha = 1;
169
+ if (!input) {
170
+ return defaultAlpha;
171
+ }
172
+ return input.endsWith("%") ? parseFloat(input) / Constants_js_1.percentDenominator : parseFloat(input);
160
173
  }
161
174
  exports.parseAlpha = parseAlpha;
@@ -27,13 +27,13 @@ class RgbColorManager {
27
27
  if (!input.startsWith(this.stringPrefix)) {
28
28
  return;
29
29
  }
30
- const regex = /rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([\d.%]+)\s*)?\)/i, result = regex.exec(input);
30
+ 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;
31
31
  return result
32
32
  ? {
33
- a: result.length > 4 ? (0, NumberUtils_js_1.parseAlpha)(result[5]) : 1,
34
- b: parseInt(result[3], 10),
35
- g: parseInt(result[2], 10),
36
- r: parseInt(result[1], 10),
33
+ a: result.length > minLength ? (0, NumberUtils_js_1.parseAlpha)(result[5]) : defaultAlpha,
34
+ b: parseInt(result[3], radix),
35
+ g: parseInt(result[2], radix),
36
+ r: parseInt(result[1], radix),
37
37
  }
38
38
  : undefined;
39
39
  }