@tsparticles/plugin-absorbers 4.0.0-alpha.5 → 4.0.0-beta.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 (77) hide show
  1. package/162.min.js +1 -0
  2. package/166.min.js +1 -0
  3. package/49.min.js +1 -0
  4. package/497.min.js +1 -0
  5. package/598.min.js +1 -0
  6. package/README.md +5 -0
  7. package/browser/AbsorberInstance.js +126 -53
  8. package/browser/AbsorbersInstancesManager.js +2 -0
  9. package/browser/AbsorbersInteractor.js +11 -6
  10. package/browser/AbsorbersPlugin.js +2 -1
  11. package/browser/AbsorbersPluginInstance.js +2 -0
  12. package/browser/Options/Classes/Absorber.js +14 -0
  13. package/browser/Options/Classes/AbsorberLife.js +27 -0
  14. package/browser/Options/Classes/AbsorberSize.js +2 -0
  15. package/browser/Options/Classes/AbsorberSizeLimit.js +2 -0
  16. package/browser/Options/Interfaces/IAbsorberLife.js +1 -0
  17. package/browser/index.js +7 -3
  18. package/cjs/AbsorberInstance.js +126 -53
  19. package/cjs/AbsorbersInstancesManager.js +2 -0
  20. package/cjs/AbsorbersInteractor.js +11 -6
  21. package/cjs/AbsorbersPlugin.js +2 -1
  22. package/cjs/AbsorbersPluginInstance.js +2 -0
  23. package/cjs/Options/Classes/Absorber.js +14 -0
  24. package/cjs/Options/Classes/AbsorberLife.js +27 -0
  25. package/cjs/Options/Classes/AbsorberSize.js +2 -0
  26. package/cjs/Options/Classes/AbsorberSizeLimit.js +2 -0
  27. package/cjs/Options/Interfaces/IAbsorberLife.js +1 -0
  28. package/cjs/index.js +7 -3
  29. package/dist_browser_AbsorberInstance_js.js +15 -5
  30. package/dist_browser_AbsorbersInstancesManager_js.js +2 -2
  31. package/dist_browser_AbsorbersInteractor_js.js +15 -5
  32. package/dist_browser_AbsorbersPluginInstance_js.js +2 -2
  33. package/dist_browser_AbsorbersPlugin_js.js +15 -5
  34. package/esm/AbsorberInstance.js +126 -53
  35. package/esm/AbsorbersInstancesManager.js +2 -0
  36. package/esm/AbsorbersInteractor.js +11 -6
  37. package/esm/AbsorbersPlugin.js +2 -1
  38. package/esm/AbsorbersPluginInstance.js +2 -0
  39. package/esm/Options/Classes/Absorber.js +14 -0
  40. package/esm/Options/Classes/AbsorberLife.js +27 -0
  41. package/esm/Options/Classes/AbsorberSize.js +2 -0
  42. package/esm/Options/Classes/AbsorberSizeLimit.js +2 -0
  43. package/esm/Options/Interfaces/IAbsorberLife.js +1 -0
  44. package/esm/index.js +7 -3
  45. package/package.json +3 -3
  46. package/report.html +3 -3
  47. package/tsparticles.plugin.absorbers.js +31 -19
  48. package/tsparticles.plugin.absorbers.min.js +2 -2
  49. package/types/AbsorberInstance.d.ts +10 -0
  50. package/types/AbsorbersInteractor.d.ts +3 -2
  51. package/types/AbsorbersPlugin.d.ts +1 -1
  52. package/types/Options/Classes/Absorber.d.ts +2 -0
  53. package/types/Options/Classes/AbsorberLife.d.ts +10 -0
  54. package/types/Options/Interfaces/IAbsorber.d.ts +2 -0
  55. package/types/Options/Interfaces/IAbsorberLife.d.ts +7 -0
  56. package/umd/AbsorberInstance.js +125 -52
  57. package/umd/AbsorbersInstancesManager.js +2 -0
  58. package/umd/AbsorbersInteractor.js +11 -6
  59. package/umd/AbsorbersPlugin.js +2 -1
  60. package/umd/AbsorbersPluginInstance.js +2 -0
  61. package/umd/Options/Classes/Absorber.js +15 -1
  62. package/umd/Options/Classes/AbsorberLife.js +41 -0
  63. package/umd/Options/Classes/AbsorberSize.js +2 -0
  64. package/umd/Options/Classes/AbsorberSizeLimit.js +2 -0
  65. package/umd/Options/Interfaces/IAbsorberLife.js +12 -0
  66. package/umd/index.js +7 -3
  67. package/215.min.js +0 -2
  68. package/215.min.js.LICENSE.txt +0 -1
  69. package/384.min.js +0 -2
  70. package/384.min.js.LICENSE.txt +0 -1
  71. package/688.min.js +0 -2
  72. package/688.min.js.LICENSE.txt +0 -1
  73. package/903.min.js +0 -2
  74. package/903.min.js.LICENSE.txt +0 -1
  75. package/980.min.js +0 -2
  76. package/980.min.js.LICENSE.txt +0 -1
  77. package/tsparticles.plugin.absorbers.min.js.LICENSE.txt +0 -1
package/162.min.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";(this.webpackChunk_tsparticles_plugin_absorbers=this.webpackChunk_tsparticles_plugin_absorbers||[]).push([[162],{162(i,s,t){t.r(s),t.d(s,{AbsorbersPlugin:()=>a});var o=t(303),e=t(866);class a{id="absorbers";_instancesManager;constructor(i){this._instancesManager=i}async getPlugin(i){let{AbsorbersPluginInstance:s}=await t.e(497).then(t.bind(t,497));return new s(i,this._instancesManager)}loadOptions(i,s,t){(this.needsPlugin(s)||this.needsPlugin(t))&&t?.absorbers&&(s.absorbers=(0,o.executeOnSingleOrMultiple)(t.absorbers,i=>{let s=new e.h;return s.load(i),s}))}needsPlugin(i){if(!i)return!1;let s=i.absorbers;return(0,o.isArray)(s)?!!s.length:!!s}}},866(i,s,t){t.d(s,{h:()=>l});var o=t(303);class e{count;delay;duration;wait;constructor(){this.wait=!1}load(i){(0,o.isNull)(i)||(void 0!==i.count&&(this.count=i.count),void 0!==i.delay&&(this.delay=(0,o.setRangeValue)(i.delay)),void 0!==i.duration&&(this.duration=(0,o.setRangeValue)(i.duration)),void 0!==i.wait&&(this.wait=i.wait))}}class a{mass;radius;constructor(){this.radius=0,this.mass=0}load(i){(0,o.isNull)(i)||(void 0!==i.mass&&(this.mass=i.mass),void 0!==i.radius&&(this.radius=i.radius))}}class r extends o.ValueWithRandom{density;limit;constructor(){super(),this.density=5,this.value=50,this.limit=new a}load(i){(0,o.isNull)(i)||(super.load(i),void 0!==i.density&&(this.density=i.density),(0,o.isNumber)(i.limit)?this.limit.radius=i.limit:this.limit.load(i.limit))}}class l{color;destroy;draggable;life;name;opacity;orbits;position;size;constructor(){this.color=new o.OptionsColor,this.color.value="#000000",this.draggable=!1,this.opacity=1,this.destroy=!0,this.orbits=!1,this.life=new e,this.size=new r}load(i){(0,o.isNull)(i)||(void 0!==i.color&&(this.color=o.OptionsColor.create(this.color,i.color)),void 0!==i.draggable&&(this.draggable=i.draggable),void 0!==i.life&&this.life.load(i.life),this.name=i.name,void 0!==i.opacity&&(this.opacity=i.opacity),void 0!==i.position&&(this.position={},void 0!==i.position.x&&(this.position.x=(0,o.setRangeValue)(i.position.x)),void 0!==i.position.y&&(this.position.y=(0,o.setRangeValue)(i.position.y))),void 0!==i.size&&this.size.load(i.size),void 0!==i.destroy&&(this.destroy=i.destroy),void 0!==i.orbits&&(this.orbits=i.orbits))}}}}]);
package/166.min.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";(this.webpackChunk_tsparticles_plugin_absorbers=this.webpackChunk_tsparticles_plugin_absorbers||[]).push([[166],{166(i,s,t){t.d(s,{AbsorbersInteractor:()=>n});var o=t(702),e=t(303),a=t(866);let r="absorbers";class n extends o.ExternalInteractorBase{handleClickMode;maxDistance;_dragging=!1;_draggingAbsorber;_instancesManager;constructor(i,s){super(i),this.maxDistance=0,this._instancesManager=s,this._instancesManager.initContainer(i),this.handleClickMode=(i,t)=>{let o=this.container,n=o.actualOptions.interactivity.modes.absorbers;if(!n||i!==r)return;let{clickPosition:l}=t.mouse;if(l&&s.getArray(this.container).some(i=>(0,e.getDistance)(i.position,l)<i.size))return;let d=(0,e.itemFromArray)(n)??new a.h;this._instancesManager.addAbsorber(o,d,l)}}clear(){}init(){}interact(i,s){for(let t of this.container.particles.filter(s=>this.isEnabled(i,s)))for(let o of this._instancesManager.getArray(this.container)){if(o.options.draggable){let s=i.mouse;s.clicking&&s.downPosition?(0,e.getDistance)(o.position,s.downPosition)<=o.size&&(this._dragging=!0,this._draggingAbsorber=o):(this._dragging=!1,this._draggingAbsorber=void 0),this._dragging&&this._draggingAbsorber==o&&s.position&&(o.position.x=s.position.x,o.position.y=s.position.y)}if(o.attract(t,s),t.destroyed)break}}isEnabled(i,s){let t=this.container.actualOptions,o=i.mouse,a=(s?.interactivity??t.interactivity).events;return!!o.clickPosition&&!!a.onClick.enable&&(0,e.isInArray)(r,a.onClick.mode)}loadModeOptions(i,...s){for(let t of(i.absorbers??=[],s))if(t)if((0,e.isArray)(t.absorbers))for(let s of t.absorbers){let t=new a.h;t.load(s),i.absorbers.push(t)}else{let s=new a.h;s.load(t.absorbers),i.absorbers.push(s)}}reset(){}}},866(i,s,t){t.d(s,{h:()=>n});var o=t(303);class e{count;delay;duration;wait;constructor(){this.wait=!1}load(i){(0,o.isNull)(i)||(void 0!==i.count&&(this.count=i.count),void 0!==i.delay&&(this.delay=(0,o.setRangeValue)(i.delay)),void 0!==i.duration&&(this.duration=(0,o.setRangeValue)(i.duration)),void 0!==i.wait&&(this.wait=i.wait))}}class a{mass;radius;constructor(){this.radius=0,this.mass=0}load(i){(0,o.isNull)(i)||(void 0!==i.mass&&(this.mass=i.mass),void 0!==i.radius&&(this.radius=i.radius))}}class r extends o.ValueWithRandom{density;limit;constructor(){super(),this.density=5,this.value=50,this.limit=new a}load(i){(0,o.isNull)(i)||(super.load(i),void 0!==i.density&&(this.density=i.density),(0,o.isNumber)(i.limit)?this.limit.radius=i.limit:this.limit.load(i.limit))}}class n{color;destroy;draggable;life;name;opacity;orbits;position;size;constructor(){this.color=new o.OptionsColor,this.color.value="#000000",this.draggable=!1,this.opacity=1,this.destroy=!0,this.orbits=!1,this.life=new e,this.size=new r}load(i){(0,o.isNull)(i)||(void 0!==i.color&&(this.color=o.OptionsColor.create(this.color,i.color)),void 0!==i.draggable&&(this.draggable=i.draggable),void 0!==i.life&&this.life.load(i.life),this.name=i.name,void 0!==i.opacity&&(this.opacity=i.opacity),void 0!==i.position&&(this.position={},void 0!==i.position.x&&(this.position.x=(0,o.setRangeValue)(i.position.x)),void 0!==i.position.y&&(this.position.y=(0,o.setRangeValue)(i.position.y))),void 0!==i.size&&this.size.load(i.size),void 0!==i.destroy&&(this.destroy=i.destroy),void 0!==i.orbits&&(this.orbits=i.orbits))}}}}]);
package/49.min.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";(this.webpackChunk_tsparticles_plugin_absorbers=this.webpackChunk_tsparticles_plugin_absorbers||[]).push([[49],{49(i,t,s){s.d(t,{AbsorberInstance:()=>n});var o=s(303),e=s(866);let a=o.doublePI;class n{color;limit;mass;name;opacity;options;position;size;_container;_currentDuration;_currentSpawnDelay;_duration;_engine;_firstSpawn;_immortal;_lifeCount;_spawnDelay;initialPosition;constructor(i,t,s,a){this._container=t,this._engine=i,this._currentDuration=0,this._currentSpawnDelay=0,this.initialPosition=a?o.Vector.create(a.x,a.y):void 0,s instanceof e.h?this.options=s:(this.options=new e.h,this.options.load(s)),this.name=this.options.name,this.opacity=this.options.opacity,this.size=(0,o.getRangeValue)(this.options.size.value)*t.retina.pixelRatio,this.mass=this.size*this.options.size.density*t.retina.reduceFactor;const n=this.options.size.limit;this.limit={radius:n.radius*t.retina.pixelRatio*t.retina.reduceFactor,mass:n.mass},this.color=(0,o.rangeColorToRgb)(this._engine,this.options.color)??{b:0,g:0,r:0},this.position=this.initialPosition?.copy()??this._calcPosition(),this._firstSpawn=!this.options.life.wait,this._lifeCount=this.options.life.count??-1,this._immortal=this._lifeCount<=0,this._spawnDelay=t.retina.reduceFactor?(0,o.getRangeValue)(this.options.life.delay??0)*o.millisecondsToSeconds/t.retina.reduceFactor:1/0}attract(i,t){let s=this._container,e=this.options,a=i.getPosition(),{dx:n,dy:r,distance:l}=(0,o.getDistances)(this.position,a),h=o.Vector.create(n,r);if(h.length=this.mass/Math.pow(l,2)*s.retina.reduceFactor,l<this.size+i.getRadius()){let o=.033*i.getRadius()*s.retina.pixelRatio*t.factor;this.size>i.getRadius()&&l<this.size-i.getRadius()||void 0!==i.absorberOrbit&&i.absorberOrbit.length<0?e.destroy?i.destroy():(i.needsNewPosition=!0,this._updateParticlePosition(i,h)):(e.destroy&&(i.size.value-=o),this._updateParticlePosition(i,h)),(this.limit.radius<=0||this.size<this.limit.radius)&&(this.size+=o),(this.limit.mass<=0||this.mass<this.limit.mass)&&(this.mass+=o*this.options.size.density*s.retina.reduceFactor)}else this._updateParticlePosition(i,h)}draw(i){i.translate(this.position.x,this.position.y),i.beginPath(),i.arc(o.originPoint.x,o.originPoint.y,this.size,0,a,!1),i.closePath(),i.fillStyle=(0,o.getStyleFromRgb)(this.color,this._container.hdr,this.opacity),i.fill()}resize(){let i=this.initialPosition;this.position=i&&(0,o.isPointInside)(i,this._container.canvas.size,o.Vector.origin)?i:this._calcPosition()}update(i){this._firstSpawn&&(this._firstSpawn=!1,this._currentSpawnDelay=this._spawnDelay??0),void 0!==this._duration&&(this._currentDuration+=i.value,this._currentDuration>=this._duration&&(!this._immortal&&this._lifeCount--,(this._lifeCount>0||this._immortal)&&(this.position=this._calcPosition(),this._spawnDelay=this._container.retina.reduceFactor?(0,o.getRangeValue)(this.options.life.delay??0)*o.millisecondsToSeconds/this._container.retina.reduceFactor:1/0),this._currentDuration-=this._duration,delete this._duration)),void 0!==this._spawnDelay&&(this._currentSpawnDelay+=i.value,this._currentSpawnDelay>=this._spawnDelay&&(this.play(),this._currentSpawnDelay-=this._spawnDelay,delete this._spawnDelay))}_calcPosition=()=>{let i=(0,o.calcPositionOrRandomFromSizeRanged)({size:this._container.canvas.size,position:this.options.position});return o.Vector.create(i.x,i.y)};_prepareToDie=()=>{let i=void 0!==this.options.life.duration?(0,o.getRangeValue)(this.options.life.duration):void 0;(this._lifeCount>0||this._immortal)&&void 0!==i&&i>0&&(this._duration=i*o.millisecondsToSeconds)};_updateParticlePosition=(i,t)=>{if(i.destroyed)return;let s=this._container,e=s.canvas.size;if(i.needsNewPosition){let t=(0,o.calcPositionOrRandomFromSize)({size:e});i.position.setTo(t),i.velocity.setTo(i.initialVelocity),i.absorberOrbit=void 0,i.needsNewPosition=!1}if(this.options.orbits){if(void 0===i.absorberOrbit&&(i.absorberOrbit=o.Vector.origin,i.absorberOrbit.length=(0,o.getDistance)(i.getPosition(),this.position),i.absorberOrbit.angle=(0,o.getRandom)()*a),i.absorberOrbit.length<=this.size&&!this.options.destroy){let t=Math.min(e.width,e.height);i.absorberOrbit.length=t*(1+(.2*(0,o.getRandom)()-.1))}i.absorberOrbitDirection??=i.velocity.x>=0?o.RotateDirection.clockwise:o.RotateDirection.counterClockwise;let n=i.absorberOrbit.length,r=i.absorberOrbit.angle,l=i.absorberOrbitDirection;i.velocity.setTo(o.Vector.origin);let h={x:l===o.RotateDirection.clockwise?Math.cos:Math.sin,y:l===o.RotateDirection.clockwise?Math.sin:Math.cos};i.position.x=this.position.x+n*h.x(r),i.position.y=this.position.y+n*h.y(r),i.absorberOrbit.length-=t.length,i.absorberOrbit.angle+=(i.retina.moveSpeed??0)*s.retina.pixelRatio/o.percentDenominator*s.retina.reduceFactor}else{let s=o.Vector.origin;s.length=t.length,s.angle=t.angle,i.velocity.addTo(s)}};play=()=>{(this._lifeCount>0||this._immortal||!this.options.life.count)&&(this._firstSpawn||this._currentSpawnDelay>=(this._spawnDelay??0))&&(this._lifeCount>0||this._immortal)&&this._prepareToDie()}}},866(i,t,s){s.d(t,{h:()=>r});var o=s(303);class e{count;delay;duration;wait;constructor(){this.wait=!1}load(i){(0,o.isNull)(i)||(void 0!==i.count&&(this.count=i.count),void 0!==i.delay&&(this.delay=(0,o.setRangeValue)(i.delay)),void 0!==i.duration&&(this.duration=(0,o.setRangeValue)(i.duration)),void 0!==i.wait&&(this.wait=i.wait))}}class a{mass;radius;constructor(){this.radius=0,this.mass=0}load(i){(0,o.isNull)(i)||(void 0!==i.mass&&(this.mass=i.mass),void 0!==i.radius&&(this.radius=i.radius))}}class n extends o.ValueWithRandom{density;limit;constructor(){super(),this.density=5,this.value=50,this.limit=new a}load(i){(0,o.isNull)(i)||(super.load(i),void 0!==i.density&&(this.density=i.density),(0,o.isNumber)(i.limit)?this.limit.radius=i.limit:this.limit.load(i.limit))}}class r{color;destroy;draggable;life;name;opacity;orbits;position;size;constructor(){this.color=new o.OptionsColor,this.color.value="#000000",this.draggable=!1,this.opacity=1,this.destroy=!0,this.orbits=!1,this.life=new e,this.size=new n}load(i){(0,o.isNull)(i)||(void 0!==i.color&&(this.color=o.OptionsColor.create(this.color,i.color)),void 0!==i.draggable&&(this.draggable=i.draggable),void 0!==i.life&&this.life.load(i.life),this.name=i.name,void 0!==i.opacity&&(this.opacity=i.opacity),void 0!==i.position&&(this.position={},void 0!==i.position.x&&(this.position.x=(0,o.setRangeValue)(i.position.x)),void 0!==i.position.y&&(this.position.y=(0,o.setRangeValue)(i.position.y))),void 0!==i.size&&this.size.load(i.size),void 0!==i.destroy&&(this.destroy=i.destroy),void 0!==i.orbits&&(this.orbits=i.orbits))}}}}]);
package/497.min.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";(this.webpackChunk_tsparticles_plugin_absorbers=this.webpackChunk_tsparticles_plugin_absorbers||[]).push([[497],{497(a,t,s){s.d(t,{AbsorbersPluginInstance:()=>n});var e=s(303);class n{_container;_instancesManager;constructor(a,t){this._container=a,this._instancesManager=t,this._instancesManager.initContainer(a)}draw(a){for(let t of this._instancesManager.getArray(this._container))t.draw(a)}async init(){let a=this._container.actualOptions.absorbers,t=(0,e.executeOnSingleOrMultiple)(a,async a=>{await this._instancesManager.addAbsorber(this._container,a)});(0,e.isArray)(t)?await Promise.all(t):await t}particleUpdate(a,t){for(let s of this._instancesManager.getArray(this._container))if(s.attract(a,t),a.destroyed)break}resize(){for(let a of this._instancesManager.getArray(this._container))a.resize()}stop(){this._instancesManager.clear(this._container)}}}}]);
package/598.min.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";(this.webpackChunk_tsparticles_plugin_absorbers=this.webpackChunk_tsparticles_plugin_absorbers||[]).push([[598],{598(r,e,t){t.r(e),t.d(e,{AbsorbersInstancesManager:()=>i});var s=t(303);class i{_containerArrays;_engine;constructor(r){this._containerArrays=new Map,this._engine=r}async addAbsorber(r,e,s){let{AbsorberInstance:i}=await t.e(49).then(t.bind(t,49)),n=new i(this._engine,r,e,s);return this.getArray(r).push(n),n}clear(r){this.initContainer(r),this._containerArrays.set(r,[])}getArray(r){this.initContainer(r);let e=this._containerArrays.get(r);return e||(e=[],this._containerArrays.set(r,e)),e}initContainer(r){this._containerArrays.has(r)||(this._containerArrays.set(r,[]),r.getAbsorber??=e=>{let t=this.getArray(r);return void 0===e||(0,s.isNumber)(e)?t[e??0]:t.find(r=>r.name===e)},r.addAbsorber??=(e,t)=>this.addAbsorber(r,e,t))}removeAbsorber(r,e){let t=this.getArray(r).indexOf(e);t>=0&&this.getArray(r).splice(t,1)}}}}]);
package/README.md CHANGED
@@ -26,6 +26,7 @@ Once the scripts are loaded you can set up `tsParticles` and the plugin like thi
26
26
 
27
27
  ```javascript
28
28
  (async () => {
29
+ await loadInteractivityPlugin(tsParticles);
29
30
  await loadAbsorbersPlugin(tsParticles);
30
31
 
31
32
  await tsParticles.load({
@@ -55,9 +56,11 @@ Then you need to import it in the app, like this:
55
56
 
56
57
  ```javascript
57
58
  const { tsParticles } = require("@tsparticles/engine");
59
+ const { loadInteractivityPlugin } = require("@tsparticles/plugin-interactivity");
58
60
  const { loadAbsorbersPlugin } = require("@tsparticles/plugin-absorbers");
59
61
 
60
62
  (async () => {
63
+ await loadInteractivityPlugin(tsParticles);
61
64
  await loadAbsorbersPlugin(tsParticles);
62
65
  })();
63
66
  ```
@@ -66,9 +69,11 @@ or
66
69
 
67
70
  ```javascript
68
71
  import { tsParticles } from "@tsparticles/engine";
72
+ import { loadInteractivityPlugin } from "@tsparticles/plugin-interactivity";
69
73
  import { loadAbsorbersPlugin } from "@tsparticles/plugin-absorbers";
70
74
 
71
75
  (async () => {
76
+ await loadInteractivityPlugin(tsParticles);
72
77
  await loadAbsorbersPlugin(tsParticles);
73
78
  })();
74
79
  ```
@@ -1,61 +1,30 @@
1
- import { RotateDirection, Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, doublePI, getDistance, getDistances, getRandom, getRangeValue, getStyleFromRgb, isPointInside, originPoint, percentDenominator, rangeColorToRgb, } from "@tsparticles/engine";
1
+ import { RotateDirection, Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, doublePI, getDistance, getDistances, getRandom, getRangeValue, getStyleFromRgb, isPointInside, millisecondsToSeconds, originPoint, percentDenominator, rangeColorToRgb, } from "@tsparticles/engine";
2
2
  import { Absorber } from "./Options/Classes/Absorber.js";
3
- const squareExp = 2, absorbFactor = 0.033, minOrbitLength = 0, minRadius = 0, minMass = 0, minAngle = 0, maxAngle = doublePI, minVelocity = 0;
3
+ const squareExp = 2, absorbFactor = 0.033, minOrbitLength = 0, minRadius = 0, minMass = 0, minAngle = 0, maxAngle = doublePI, minVelocity = 0, defaultLifeDelay = 0, minLifeCount = 0, defaultSpawnDelay = 0, defaultLifeCount = -1;
4
4
  export class AbsorberInstance {
5
+ color;
6
+ limit;
7
+ mass;
8
+ name;
9
+ opacity;
10
+ options;
11
+ position;
12
+ size;
13
+ _container;
14
+ _currentDuration;
15
+ _currentSpawnDelay;
16
+ _duration;
17
+ _engine;
18
+ _firstSpawn;
19
+ _immortal;
20
+ _lifeCount;
21
+ _spawnDelay;
22
+ initialPosition;
5
23
  constructor(engine, container, options, position) {
6
- this._calcPosition = () => {
7
- const exactPosition = calcPositionOrRandomFromSizeRanged({
8
- size: this._container.canvas.size,
9
- position: this.options.position,
10
- });
11
- return Vector.create(exactPosition.x, exactPosition.y);
12
- };
13
- this._updateParticlePosition = (particle, v) => {
14
- if (particle.destroyed) {
15
- return;
16
- }
17
- const container = this._container, canvasSize = container.canvas.size;
18
- if (particle.needsNewPosition) {
19
- const newPosition = calcPositionOrRandomFromSize({ size: canvasSize });
20
- particle.position.setTo(newPosition);
21
- particle.velocity.setTo(particle.initialVelocity);
22
- particle.absorberOrbit = undefined;
23
- particle.needsNewPosition = false;
24
- }
25
- if (this.options.orbits) {
26
- if (particle.absorberOrbit === undefined) {
27
- particle.absorberOrbit = Vector.origin;
28
- particle.absorberOrbit.length = getDistance(particle.getPosition(), this.position);
29
- particle.absorberOrbit.angle = getRandom() * maxAngle;
30
- }
31
- if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
32
- const minSize = Math.min(canvasSize.width, canvasSize.height), offset = 1, randomOffset = 0.1, randomFactor = 0.2;
33
- particle.absorberOrbit.length = minSize * (offset + (getRandom() * randomFactor - randomOffset));
34
- }
35
- particle.absorberOrbitDirection ??=
36
- particle.velocity.x >= minVelocity ? RotateDirection.clockwise : RotateDirection.counterClockwise;
37
- const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;
38
- particle.velocity.setTo(Vector.origin);
39
- const updateFunc = {
40
- x: orbitDirection === RotateDirection.clockwise ? Math.cos : Math.sin,
41
- y: orbitDirection === RotateDirection.clockwise ? Math.sin : Math.cos,
42
- };
43
- particle.position.x = this.position.x + orbitRadius * updateFunc.x(orbitAngle);
44
- particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
45
- particle.absorberOrbit.length -= v.length;
46
- particle.absorberOrbit.angle +=
47
- (((particle.retina.moveSpeed ?? minVelocity) * container.retina.pixelRatio) / percentDenominator) *
48
- container.retina.reduceFactor;
49
- }
50
- else {
51
- const addV = Vector.origin;
52
- addV.length = v.length;
53
- addV.angle = v.angle;
54
- particle.velocity.addTo(addV);
55
- }
56
- };
57
24
  this._container = container;
58
25
  this._engine = engine;
26
+ this._currentDuration = 0;
27
+ this._currentSpawnDelay = 0;
59
28
  this.initialPosition = position ? Vector.create(position.x, position.y) : undefined;
60
29
  if (options instanceof Absorber) {
61
30
  this.options = options;
@@ -79,6 +48,13 @@ export class AbsorberInstance {
79
48
  r: 0,
80
49
  };
81
50
  this.position = this.initialPosition?.copy() ?? this._calcPosition();
51
+ this._firstSpawn = !this.options.life.wait;
52
+ this._lifeCount = this.options.life.count ?? defaultLifeCount;
53
+ this._immortal = this._lifeCount <= minLifeCount;
54
+ this._spawnDelay = container.retina.reduceFactor
55
+ ? (getRangeValue(this.options.life.delay ?? defaultLifeDelay) * millisecondsToSeconds) /
56
+ container.retina.reduceFactor
57
+ : Infinity;
82
58
  }
83
59
  attract(particle, delta) {
84
60
  const container = this._container, options = this.options, pos = particle.getPosition(), { dx, dy, distance } = getDistances(this.position, pos), v = Vector.create(dx, dy);
@@ -127,4 +103,101 @@ export class AbsorberInstance {
127
103
  ? initialPosition
128
104
  : this._calcPosition();
129
105
  }
106
+ update(delta) {
107
+ if (this._firstSpawn) {
108
+ this._firstSpawn = false;
109
+ this._currentSpawnDelay = this._spawnDelay ?? defaultSpawnDelay;
110
+ }
111
+ if (this._duration !== undefined) {
112
+ this._currentDuration += delta.value;
113
+ if (this._currentDuration >= this._duration) {
114
+ if (!this._immortal) {
115
+ this._lifeCount--;
116
+ }
117
+ if (this._lifeCount > minLifeCount || this._immortal) {
118
+ this.position = this._calcPosition();
119
+ this._spawnDelay = this._container.retina.reduceFactor
120
+ ? (getRangeValue(this.options.life.delay ?? defaultLifeDelay) * millisecondsToSeconds) /
121
+ this._container.retina.reduceFactor
122
+ : Infinity;
123
+ }
124
+ this._currentDuration -= this._duration;
125
+ delete this._duration;
126
+ }
127
+ }
128
+ if (this._spawnDelay !== undefined) {
129
+ this._currentSpawnDelay += delta.value;
130
+ if (this._currentSpawnDelay >= this._spawnDelay) {
131
+ this.play();
132
+ this._currentSpawnDelay -= this._spawnDelay;
133
+ delete this._spawnDelay;
134
+ }
135
+ }
136
+ }
137
+ _calcPosition = () => {
138
+ const exactPosition = calcPositionOrRandomFromSizeRanged({
139
+ size: this._container.canvas.size,
140
+ position: this.options.position,
141
+ });
142
+ return Vector.create(exactPosition.x, exactPosition.y);
143
+ };
144
+ _prepareToDie = () => {
145
+ const duration = this.options.life.duration !== undefined ? getRangeValue(this.options.life.duration) : undefined, minDuration = 0;
146
+ if ((this._lifeCount > minLifeCount || this._immortal) && duration !== undefined && duration > minDuration) {
147
+ this._duration = duration * millisecondsToSeconds;
148
+ }
149
+ };
150
+ _updateParticlePosition = (particle, v) => {
151
+ if (particle.destroyed) {
152
+ return;
153
+ }
154
+ const container = this._container, canvasSize = container.canvas.size;
155
+ if (particle.needsNewPosition) {
156
+ const newPosition = calcPositionOrRandomFromSize({ size: canvasSize });
157
+ particle.position.setTo(newPosition);
158
+ particle.velocity.setTo(particle.initialVelocity);
159
+ particle.absorberOrbit = undefined;
160
+ particle.needsNewPosition = false;
161
+ }
162
+ if (this.options.orbits) {
163
+ if (particle.absorberOrbit === undefined) {
164
+ particle.absorberOrbit = Vector.origin;
165
+ particle.absorberOrbit.length = getDistance(particle.getPosition(), this.position);
166
+ particle.absorberOrbit.angle = getRandom() * maxAngle;
167
+ }
168
+ if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
169
+ const minSize = Math.min(canvasSize.width, canvasSize.height), offset = 1, randomOffset = 0.1, randomFactor = 0.2;
170
+ particle.absorberOrbit.length = minSize * (offset + (getRandom() * randomFactor - randomOffset));
171
+ }
172
+ particle.absorberOrbitDirection ??=
173
+ particle.velocity.x >= minVelocity ? RotateDirection.clockwise : RotateDirection.counterClockwise;
174
+ const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;
175
+ particle.velocity.setTo(Vector.origin);
176
+ const updateFunc = {
177
+ x: orbitDirection === RotateDirection.clockwise ? Math.cos : Math.sin,
178
+ y: orbitDirection === RotateDirection.clockwise ? Math.sin : Math.cos,
179
+ };
180
+ particle.position.x = this.position.x + orbitRadius * updateFunc.x(orbitAngle);
181
+ particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
182
+ particle.absorberOrbit.length -= v.length;
183
+ particle.absorberOrbit.angle +=
184
+ (((particle.retina.moveSpeed ?? minVelocity) * container.retina.pixelRatio) / percentDenominator) *
185
+ container.retina.reduceFactor;
186
+ }
187
+ else {
188
+ const addV = Vector.origin;
189
+ addV.length = v.length;
190
+ addV.angle = v.angle;
191
+ particle.velocity.addTo(addV);
192
+ }
193
+ };
194
+ play = () => {
195
+ if (!((this._lifeCount > minLifeCount || this._immortal || !this.options.life.count) &&
196
+ (this._firstSpawn || this._currentSpawnDelay >= (this._spawnDelay ?? defaultSpawnDelay)))) {
197
+ return;
198
+ }
199
+ if (this._lifeCount > minLifeCount || this._immortal) {
200
+ this._prepareToDie();
201
+ }
202
+ };
130
203
  }
@@ -1,6 +1,8 @@
1
1
  import { isNumber } from "@tsparticles/engine";
2
2
  const defaultIndex = 0;
3
3
  export class AbsorbersInstancesManager {
4
+ _containerArrays;
5
+ _engine;
4
6
  constructor(engine) {
5
7
  this._containerArrays = new Map();
6
8
  this._engine = engine;
@@ -3,9 +3,14 @@ import { getDistance, isArray, isInArray, itemFromArray, } from "@tsparticles/en
3
3
  import { Absorber } from "./Options/Classes/Absorber.js";
4
4
  const absorbersMode = "absorbers";
5
5
  export class AbsorbersInteractor extends ExternalInteractorBase {
6
+ handleClickMode;
7
+ maxDistance;
8
+ _dragging = false;
9
+ _draggingAbsorber;
10
+ _instancesManager;
6
11
  constructor(container, instancesManager) {
7
12
  super(container);
8
- this.dragging = false;
13
+ this.maxDistance = 0;
9
14
  this._instancesManager = instancesManager;
10
15
  this._instancesManager.initContainer(container);
11
16
  this.handleClickMode = (mode, interactivityData) => {
@@ -38,15 +43,15 @@ export class AbsorbersInteractor extends ExternalInteractorBase {
38
43
  if (mouse.clicking && mouse.downPosition) {
39
44
  const mouseDist = getDistance(absorber.position, mouse.downPosition);
40
45
  if (mouseDist <= absorber.size) {
41
- this.dragging = true;
42
- this.draggingAbsorber = absorber;
46
+ this._dragging = true;
47
+ this._draggingAbsorber = absorber;
43
48
  }
44
49
  }
45
50
  else {
46
- this.dragging = false;
47
- this.draggingAbsorber = undefined;
51
+ this._dragging = false;
52
+ this._draggingAbsorber = undefined;
48
53
  }
49
- if (this.dragging && this.draggingAbsorber == absorber && mouse.position) {
54
+ if (this._dragging && this._draggingAbsorber == absorber && mouse.position) {
50
55
  absorber.position.x = mouse.position.x;
51
56
  absorber.position.y = mouse.position.y;
52
57
  }
@@ -1,8 +1,9 @@
1
1
  import { executeOnSingleOrMultiple, isArray, } from "@tsparticles/engine";
2
2
  import { Absorber } from "./Options/Classes/Absorber.js";
3
3
  export class AbsorbersPlugin {
4
+ id = "absorbers";
5
+ _instancesManager;
4
6
  constructor(instancesManager) {
5
- this.id = "absorbers";
6
7
  this._instancesManager = instancesManager;
7
8
  }
8
9
  async getPlugin(container) {
@@ -1,5 +1,7 @@
1
1
  import { executeOnSingleOrMultiple, isArray, } from "@tsparticles/engine";
2
2
  export class AbsorbersPluginInstance {
3
+ _container;
4
+ _instancesManager;
3
5
  constructor(container, instancesManager) {
4
6
  this._container = container;
5
7
  this._instancesManager = instancesManager;
@@ -1,6 +1,16 @@
1
1
  import { OptionsColor, isNull, setRangeValue, } from "@tsparticles/engine";
2
+ import { AbsorberLife } from "./AbsorberLife.js";
2
3
  import { AbsorberSize } from "./AbsorberSize.js";
3
4
  export class Absorber {
5
+ color;
6
+ destroy;
7
+ draggable;
8
+ life;
9
+ name;
10
+ opacity;
11
+ orbits;
12
+ position;
13
+ size;
4
14
  constructor() {
5
15
  this.color = new OptionsColor();
6
16
  this.color.value = "#000000";
@@ -8,6 +18,7 @@ export class Absorber {
8
18
  this.opacity = 1;
9
19
  this.destroy = true;
10
20
  this.orbits = false;
21
+ this.life = new AbsorberLife();
11
22
  this.size = new AbsorberSize();
12
23
  }
13
24
  load(data) {
@@ -20,6 +31,9 @@ export class Absorber {
20
31
  if (data.draggable !== undefined) {
21
32
  this.draggable = data.draggable;
22
33
  }
34
+ if (data.life !== undefined) {
35
+ this.life.load(data.life);
36
+ }
23
37
  this.name = data.name;
24
38
  if (data.opacity !== undefined) {
25
39
  this.opacity = data.opacity;
@@ -0,0 +1,27 @@
1
+ import { isNull, setRangeValue } from "@tsparticles/engine";
2
+ export class AbsorberLife {
3
+ count;
4
+ delay;
5
+ duration;
6
+ wait;
7
+ constructor() {
8
+ this.wait = false;
9
+ }
10
+ load(data) {
11
+ if (isNull(data)) {
12
+ return;
13
+ }
14
+ if (data.count !== undefined) {
15
+ this.count = data.count;
16
+ }
17
+ if (data.delay !== undefined) {
18
+ this.delay = setRangeValue(data.delay);
19
+ }
20
+ if (data.duration !== undefined) {
21
+ this.duration = setRangeValue(data.duration);
22
+ }
23
+ if (data.wait !== undefined) {
24
+ this.wait = data.wait;
25
+ }
26
+ }
27
+ }
@@ -1,6 +1,8 @@
1
1
  import { ValueWithRandom, isNull, isNumber } from "@tsparticles/engine";
2
2
  import { AbsorberSizeLimit } from "./AbsorberSizeLimit.js";
3
3
  export class AbsorberSize extends ValueWithRandom {
4
+ density;
5
+ limit;
4
6
  constructor() {
5
7
  super();
6
8
  this.density = 5;
@@ -1,5 +1,7 @@
1
1
  import { isNull } from "@tsparticles/engine";
2
2
  export class AbsorberSizeLimit {
3
+ mass;
4
+ radius;
3
5
  constructor() {
4
6
  this.radius = 0;
5
7
  this.mass = 0;
@@ -0,0 +1 @@
1
+ export {};
package/browser/index.js CHANGED
@@ -1,8 +1,12 @@
1
1
  export async function loadAbsorbersPlugin(engine) {
2
- engine.checkVersion("4.0.0-alpha.5");
2
+ engine.checkVersion("4.0.0-beta.0");
3
3
  await engine.register(async (e) => {
4
- const { loadInteractivityPlugin } = await import("@tsparticles/plugin-interactivity"), { AbsorbersInstancesManager } = await import("./AbsorbersInstancesManager.js"), { AbsorbersPlugin } = await import("./AbsorbersPlugin.js"), instancesManager = new AbsorbersInstancesManager(e);
5
- await loadInteractivityPlugin(e);
4
+ const [{ ensureInteractivityPluginLoaded }, { AbsorbersInstancesManager }, { AbsorbersPlugin },] = await Promise.all([
5
+ import("@tsparticles/plugin-interactivity"),
6
+ import("./AbsorbersInstancesManager.js"),
7
+ import("./AbsorbersPlugin.js"),
8
+ ]), instancesManager = new AbsorbersInstancesManager(e);
9
+ ensureInteractivityPluginLoaded(e);
6
10
  e.addPlugin(new AbsorbersPlugin(instancesManager));
7
11
  e.addInteractor?.("externalAbsorbers", async (container) => {
8
12
  const { AbsorbersInteractor } = await import("./AbsorbersInteractor.js");
@@ -1,61 +1,30 @@
1
- import { RotateDirection, Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, doublePI, getDistance, getDistances, getRandom, getRangeValue, getStyleFromRgb, isPointInside, originPoint, percentDenominator, rangeColorToRgb, } from "@tsparticles/engine";
1
+ import { RotateDirection, Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, doublePI, getDistance, getDistances, getRandom, getRangeValue, getStyleFromRgb, isPointInside, millisecondsToSeconds, originPoint, percentDenominator, rangeColorToRgb, } from "@tsparticles/engine";
2
2
  import { Absorber } from "./Options/Classes/Absorber.js";
3
- const squareExp = 2, absorbFactor = 0.033, minOrbitLength = 0, minRadius = 0, minMass = 0, minAngle = 0, maxAngle = doublePI, minVelocity = 0;
3
+ const squareExp = 2, absorbFactor = 0.033, minOrbitLength = 0, minRadius = 0, minMass = 0, minAngle = 0, maxAngle = doublePI, minVelocity = 0, defaultLifeDelay = 0, minLifeCount = 0, defaultSpawnDelay = 0, defaultLifeCount = -1;
4
4
  export class AbsorberInstance {
5
+ color;
6
+ limit;
7
+ mass;
8
+ name;
9
+ opacity;
10
+ options;
11
+ position;
12
+ size;
13
+ _container;
14
+ _currentDuration;
15
+ _currentSpawnDelay;
16
+ _duration;
17
+ _engine;
18
+ _firstSpawn;
19
+ _immortal;
20
+ _lifeCount;
21
+ _spawnDelay;
22
+ initialPosition;
5
23
  constructor(engine, container, options, position) {
6
- this._calcPosition = () => {
7
- const exactPosition = calcPositionOrRandomFromSizeRanged({
8
- size: this._container.canvas.size,
9
- position: this.options.position,
10
- });
11
- return Vector.create(exactPosition.x, exactPosition.y);
12
- };
13
- this._updateParticlePosition = (particle, v) => {
14
- if (particle.destroyed) {
15
- return;
16
- }
17
- const container = this._container, canvasSize = container.canvas.size;
18
- if (particle.needsNewPosition) {
19
- const newPosition = calcPositionOrRandomFromSize({ size: canvasSize });
20
- particle.position.setTo(newPosition);
21
- particle.velocity.setTo(particle.initialVelocity);
22
- particle.absorberOrbit = undefined;
23
- particle.needsNewPosition = false;
24
- }
25
- if (this.options.orbits) {
26
- if (particle.absorberOrbit === undefined) {
27
- particle.absorberOrbit = Vector.origin;
28
- particle.absorberOrbit.length = getDistance(particle.getPosition(), this.position);
29
- particle.absorberOrbit.angle = getRandom() * maxAngle;
30
- }
31
- if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
32
- const minSize = Math.min(canvasSize.width, canvasSize.height), offset = 1, randomOffset = 0.1, randomFactor = 0.2;
33
- particle.absorberOrbit.length = minSize * (offset + (getRandom() * randomFactor - randomOffset));
34
- }
35
- particle.absorberOrbitDirection ??=
36
- particle.velocity.x >= minVelocity ? RotateDirection.clockwise : RotateDirection.counterClockwise;
37
- const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;
38
- particle.velocity.setTo(Vector.origin);
39
- const updateFunc = {
40
- x: orbitDirection === RotateDirection.clockwise ? Math.cos : Math.sin,
41
- y: orbitDirection === RotateDirection.clockwise ? Math.sin : Math.cos,
42
- };
43
- particle.position.x = this.position.x + orbitRadius * updateFunc.x(orbitAngle);
44
- particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
45
- particle.absorberOrbit.length -= v.length;
46
- particle.absorberOrbit.angle +=
47
- (((particle.retina.moveSpeed ?? minVelocity) * container.retina.pixelRatio) / percentDenominator) *
48
- container.retina.reduceFactor;
49
- }
50
- else {
51
- const addV = Vector.origin;
52
- addV.length = v.length;
53
- addV.angle = v.angle;
54
- particle.velocity.addTo(addV);
55
- }
56
- };
57
24
  this._container = container;
58
25
  this._engine = engine;
26
+ this._currentDuration = 0;
27
+ this._currentSpawnDelay = 0;
59
28
  this.initialPosition = position ? Vector.create(position.x, position.y) : undefined;
60
29
  if (options instanceof Absorber) {
61
30
  this.options = options;
@@ -79,6 +48,13 @@ export class AbsorberInstance {
79
48
  r: 0,
80
49
  };
81
50
  this.position = this.initialPosition?.copy() ?? this._calcPosition();
51
+ this._firstSpawn = !this.options.life.wait;
52
+ this._lifeCount = this.options.life.count ?? defaultLifeCount;
53
+ this._immortal = this._lifeCount <= minLifeCount;
54
+ this._spawnDelay = container.retina.reduceFactor
55
+ ? (getRangeValue(this.options.life.delay ?? defaultLifeDelay) * millisecondsToSeconds) /
56
+ container.retina.reduceFactor
57
+ : Infinity;
82
58
  }
83
59
  attract(particle, delta) {
84
60
  const container = this._container, options = this.options, pos = particle.getPosition(), { dx, dy, distance } = getDistances(this.position, pos), v = Vector.create(dx, dy);
@@ -127,4 +103,101 @@ export class AbsorberInstance {
127
103
  ? initialPosition
128
104
  : this._calcPosition();
129
105
  }
106
+ update(delta) {
107
+ if (this._firstSpawn) {
108
+ this._firstSpawn = false;
109
+ this._currentSpawnDelay = this._spawnDelay ?? defaultSpawnDelay;
110
+ }
111
+ if (this._duration !== undefined) {
112
+ this._currentDuration += delta.value;
113
+ if (this._currentDuration >= this._duration) {
114
+ if (!this._immortal) {
115
+ this._lifeCount--;
116
+ }
117
+ if (this._lifeCount > minLifeCount || this._immortal) {
118
+ this.position = this._calcPosition();
119
+ this._spawnDelay = this._container.retina.reduceFactor
120
+ ? (getRangeValue(this.options.life.delay ?? defaultLifeDelay) * millisecondsToSeconds) /
121
+ this._container.retina.reduceFactor
122
+ : Infinity;
123
+ }
124
+ this._currentDuration -= this._duration;
125
+ delete this._duration;
126
+ }
127
+ }
128
+ if (this._spawnDelay !== undefined) {
129
+ this._currentSpawnDelay += delta.value;
130
+ if (this._currentSpawnDelay >= this._spawnDelay) {
131
+ this.play();
132
+ this._currentSpawnDelay -= this._spawnDelay;
133
+ delete this._spawnDelay;
134
+ }
135
+ }
136
+ }
137
+ _calcPosition = () => {
138
+ const exactPosition = calcPositionOrRandomFromSizeRanged({
139
+ size: this._container.canvas.size,
140
+ position: this.options.position,
141
+ });
142
+ return Vector.create(exactPosition.x, exactPosition.y);
143
+ };
144
+ _prepareToDie = () => {
145
+ const duration = this.options.life.duration !== undefined ? getRangeValue(this.options.life.duration) : undefined, minDuration = 0;
146
+ if ((this._lifeCount > minLifeCount || this._immortal) && duration !== undefined && duration > minDuration) {
147
+ this._duration = duration * millisecondsToSeconds;
148
+ }
149
+ };
150
+ _updateParticlePosition = (particle, v) => {
151
+ if (particle.destroyed) {
152
+ return;
153
+ }
154
+ const container = this._container, canvasSize = container.canvas.size;
155
+ if (particle.needsNewPosition) {
156
+ const newPosition = calcPositionOrRandomFromSize({ size: canvasSize });
157
+ particle.position.setTo(newPosition);
158
+ particle.velocity.setTo(particle.initialVelocity);
159
+ particle.absorberOrbit = undefined;
160
+ particle.needsNewPosition = false;
161
+ }
162
+ if (this.options.orbits) {
163
+ if (particle.absorberOrbit === undefined) {
164
+ particle.absorberOrbit = Vector.origin;
165
+ particle.absorberOrbit.length = getDistance(particle.getPosition(), this.position);
166
+ particle.absorberOrbit.angle = getRandom() * maxAngle;
167
+ }
168
+ if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
169
+ const minSize = Math.min(canvasSize.width, canvasSize.height), offset = 1, randomOffset = 0.1, randomFactor = 0.2;
170
+ particle.absorberOrbit.length = minSize * (offset + (getRandom() * randomFactor - randomOffset));
171
+ }
172
+ particle.absorberOrbitDirection ??=
173
+ particle.velocity.x >= minVelocity ? RotateDirection.clockwise : RotateDirection.counterClockwise;
174
+ const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;
175
+ particle.velocity.setTo(Vector.origin);
176
+ const updateFunc = {
177
+ x: orbitDirection === RotateDirection.clockwise ? Math.cos : Math.sin,
178
+ y: orbitDirection === RotateDirection.clockwise ? Math.sin : Math.cos,
179
+ };
180
+ particle.position.x = this.position.x + orbitRadius * updateFunc.x(orbitAngle);
181
+ particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
182
+ particle.absorberOrbit.length -= v.length;
183
+ particle.absorberOrbit.angle +=
184
+ (((particle.retina.moveSpeed ?? minVelocity) * container.retina.pixelRatio) / percentDenominator) *
185
+ container.retina.reduceFactor;
186
+ }
187
+ else {
188
+ const addV = Vector.origin;
189
+ addV.length = v.length;
190
+ addV.angle = v.angle;
191
+ particle.velocity.addTo(addV);
192
+ }
193
+ };
194
+ play = () => {
195
+ if (!((this._lifeCount > minLifeCount || this._immortal || !this.options.life.count) &&
196
+ (this._firstSpawn || this._currentSpawnDelay >= (this._spawnDelay ?? defaultSpawnDelay)))) {
197
+ return;
198
+ }
199
+ if (this._lifeCount > minLifeCount || this._immortal) {
200
+ this._prepareToDie();
201
+ }
202
+ };
130
203
  }
@@ -1,6 +1,8 @@
1
1
  import { isNumber } from "@tsparticles/engine";
2
2
  const defaultIndex = 0;
3
3
  export class AbsorbersInstancesManager {
4
+ _containerArrays;
5
+ _engine;
4
6
  constructor(engine) {
5
7
  this._containerArrays = new Map();
6
8
  this._engine = engine;