@tsparticles/plugin-absorbers 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.
- package/142.min.js +2 -0
- package/142.min.js.LICENSE.txt +1 -0
- package/28.min.js +2 -0
- package/28.min.js.LICENSE.txt +1 -0
- package/327.min.js +2 -0
- package/327.min.js.LICENSE.txt +1 -0
- package/browser/AbsorberInstance.js +19 -14
- package/browser/Absorbers.js +19 -13
- package/browser/AbsorbersPlugin.js +45 -0
- package/browser/index.js +1 -45
- package/cjs/AbsorberInstance.js +18 -13
- package/cjs/Absorbers.js +42 -13
- package/cjs/AbsorbersPlugin.js +72 -0
- package/cjs/index.js +13 -45
- package/dist_browser_AbsorberInstance_js.js +30 -0
- package/dist_browser_AbsorbersPlugin_js.js +60 -0
- package/dist_browser_Absorbers_js.js +30 -0
- package/esm/AbsorberInstance.js +19 -14
- package/esm/Absorbers.js +19 -13
- package/esm/AbsorbersPlugin.js +45 -0
- package/esm/index.js +1 -45
- package/package.json +2 -2
- package/report.html +3 -3
- package/tsparticles.plugin.absorbers.js +241 -368
- package/tsparticles.plugin.absorbers.min.js +1 -1
- package/tsparticles.plugin.absorbers.min.js.LICENSE.txt +1 -1
- package/types/AbsorberContainer.d.ts +1 -1
- package/types/AbsorberInstance.d.ts +1 -1
- package/types/Absorbers.d.ts +3 -3
- package/types/AbsorbersPlugin.d.ts +11 -0
- package/umd/AbsorberInstance.js +18 -13
- package/umd/Absorbers.js +44 -14
- package/umd/AbsorbersPlugin.js +83 -0
- package/umd/index.js +15 -46
package/142.min.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! For license information please see 142.min.js.LICENSE.txt */
|
|
2
|
+
(this.webpackChunk_tsparticles_plugin_absorbers=this.webpackChunk_tsparticles_plugin_absorbers||[]).push([[142],{142:(i,s,t)=>{t.d(s,{AbsorbersPlugin:()=>r});var o=t(533),e=t(806);class r{constructor(){this.id="absorbers"}async getPlugin(i){const{Absorbers:s}=await t.e(327).then(t.bind(t,327));return new s(i)}loadOptions(i,s){(this.needsPlugin(i)||this.needsPlugin(s))&&(s?.absorbers&&(i.absorbers=(0,o.executeOnSingleOrMultiple)(s.absorbers,(i=>{const s=new e.C;return s.load(i),s}))),i.interactivity.modes.absorbers=(0,o.executeOnSingleOrMultiple)(s?.interactivity?.modes?.absorbers,(i=>{const s=new e.C;return s.load(i),s})))}needsPlugin(i){if(!i)return!1;const s=i.absorbers;return(0,o.isArray)(s)?!!s.length:!!s||!(!i.interactivity?.events?.onClick?.mode||!(0,o.isInArray)("absorber",i.interactivity.events.onClick.mode))}}},806:(i,s,t)=>{t.d(s,{C:()=>a});var o=t(533);class e{constructor(){this.radius=0,this.mass=0}load(i){i&&(void 0!==i.mass&&(this.mass=i.mass),void 0!==i.radius&&(this.radius=i.radius))}}class r extends o.ValueWithRandom{constructor(){super(),this.density=5,this.value=50,this.limit=new e}load(i){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 a{constructor(){this.color=new o.OptionsColor,this.color.value="#000000",this.draggable=!1,this.opacity=1,this.destroy=!0,this.orbits=!1,this.size=new r}load(i){void 0!==i&&(void 0!==i.color&&(this.color=o.OptionsColor.create(this.color,i.color)),void 0!==i.draggable&&(this.draggable=i.draggable),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))}}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tsParticles Absorbers Plugin v3.2.0 by Matteo Bruni */
|
package/28.min.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! For license information please see 28.min.js.LICENSE.txt */
|
|
2
|
+
(this.webpackChunk_tsparticles_plugin_absorbers=this.webpackChunk_tsparticles_plugin_absorbers||[]).push([[28],{28:(i,t,s)=>{s.d(t,{AbsorberInstance:()=>c});var o=s(533),e=s(806);const n=0,r=0,a=2*Math.PI;class c{constructor(i,t,s,n){this.absorbers=i,this.container=t,this._calcPosition=()=>{const i=(0,o.calcPositionOrRandomFromSizeRanged)({size:this.container.canvas.size,position:this.options.position});return o.Vector.create(i.x,i.y)},this._updateParticlePosition=(i,t)=>{if(i.destroyed)return;const s=this.container,e=s.canvas.size;if(i.needsNewPosition){const 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){const t=Math.min(e.width,e.height),s=1,n=.1,r=.2;i.absorberOrbit.length=t*(s+((0,o.getRandom)()*r-n))}void 0===i.absorberOrbitDirection&&(i.absorberOrbitDirection=i.velocity.x>=0?"clockwise":"counter-clockwise");const n=i.absorberOrbit.length,r=i.absorberOrbit.angle,c=i.absorberOrbitDirection;i.velocity.setTo(o.Vector.origin);const h={x:"clockwise"===c?Math.cos:Math.sin,y:"clockwise"===c?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{const s=o.Vector.origin;s.length=t.length,s.angle=t.angle,i.velocity.addTo(s)}},this.initialPosition=n?o.Vector.create(n.x,n.y):void 0,s instanceof e.C?this.options=s:(this.options=new e.C,this.options.load(s)),this.dragging=!1,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 r=this.options.size.limit;this.limit={radius:r.radius*t.retina.pixelRatio*t.retina.reduceFactor,mass:r.mass},this.color=(0,o.rangeColorToRgb)(this.options.color)??{b:0,g:0,r:0},this.position=this.initialPosition?.copy()??this._calcPosition()}attract(i){const t=this.container,s=this.options;if(s.draggable){const i=t.interactivity.mouse;if(i.clicking&&i.downPosition){(0,o.getDistance)(this.position,i.downPosition)<=this.size&&(this.dragging=!0)}else this.dragging=!1;this.dragging&&i.position&&(this.position.x=i.position.x,this.position.y=i.position.y)}const e=i.getPosition(),{dx:n,dy:r,distance:a}=(0,o.getDistances)(this.position,e),c=o.Vector.create(n,r);if(c.length=this.mass/Math.pow(a,2)*t.retina.reduceFactor,a<this.size+i.getRadius()){const o=.033*i.getRadius()*t.retina.pixelRatio;this.size>i.getRadius()&&a<this.size-i.getRadius()||void 0!==i.absorberOrbit&&i.absorberOrbit.length<0?s.destroy?i.destroy():(i.needsNewPosition=!0,this._updateParticlePosition(i,c)):(s.destroy&&(i.size.value-=o),this._updateParticlePosition(i,c)),(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*t.retina.reduceFactor)}else this._updateParticlePosition(i,c)}async draw(i){i.translate(this.position.x,this.position.y),i.beginPath(),i.arc(n,r,this.size,0,a,!1),i.closePath(),i.fillStyle=(0,o.getStyleFromRgb)(this.color,this.opacity),i.fill(),await Promise.resolve()}resize(){const i=this.initialPosition;this.position=i&&(0,o.isPointInside)(i,this.container.canvas.size,o.Vector.origin)?i:this._calcPosition()}}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tsParticles Absorbers Plugin v3.2.0 by Matteo Bruni */
|
package/327.min.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! For license information please see 327.min.js.LICENSE.txt */
|
|
2
|
+
(this.webpackChunk_tsparticles_plugin_absorbers=this.webpackChunk_tsparticles_plugin_absorbers||[]).push([[327],{327:(r,s,t)=>{t.d(s,{Absorbers:()=>a});var i=t(533);class a{constructor(r){this.container=r,this.array=[],this.absorbers=[],this.interactivityAbsorbers=[],r.getAbsorber=r=>void 0===r||(0,i.isNumber)(r)?this.array[r??0]:this.array.find((s=>s.name===r)),r.addAbsorber=async(r,s)=>this.addAbsorber(r,s)}async addAbsorber(r,s){const{AbsorberInstance:i}=await t.e(28).then(t.bind(t,28)),a=new i(this,this.container,r,s);return this.array.push(a),a}async draw(r){for(const s of this.array)await s.draw(r)}handleClickMode(r){const s=this.absorbers,t=this.interactivityAbsorbers;if("absorber"===r){const r=(0,i.itemFromSingleOrMultiple)(t)??(0,i.itemFromSingleOrMultiple)(s),a=this.container.interactivity.mouse.clickPosition;this.addAbsorber(r,a)}}async init(){this.absorbers=this.container.actualOptions.absorbers,this.interactivityAbsorbers=this.container.actualOptions.interactivity.modes.absorbers;const r=(0,i.executeOnSingleOrMultiple)(this.absorbers,(async r=>{await this.addAbsorber(r)}));r instanceof Array?await Promise.all(r):await r}particleUpdate(r){for(const s of this.array)if(s.attract(r),r.destroyed)break}removeAbsorber(r){const s=this.array.indexOf(r);s>=0&&this.array.splice(s,1)}resize(){for(const r of this.array)r.resize()}stop(){this.array=[]}}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tsParticles Absorbers Plugin v3.2.0 by Matteo Bruni */
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, getDistance, getDistances, getRandom, getRangeValue, getStyleFromRgb, isPointInside, rangeColorToRgb, } from "@tsparticles/engine";
|
|
1
|
+
import { Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, getDistance, getDistances, getRandom, getRangeValue, getStyleFromRgb, isPointInside, 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, origin = {
|
|
4
|
+
x: 0,
|
|
5
|
+
y: 0,
|
|
6
|
+
}, minAngle = 0, double = 2, maxAngle = Math.PI * double, minVelocity = 0;
|
|
3
7
|
export class AbsorberInstance {
|
|
4
8
|
constructor(absorbers, container, options, position) {
|
|
5
9
|
this.absorbers = absorbers;
|
|
@@ -25,17 +29,17 @@ export class AbsorberInstance {
|
|
|
25
29
|
}
|
|
26
30
|
if (this.options.orbits) {
|
|
27
31
|
if (particle.absorberOrbit === undefined) {
|
|
28
|
-
particle.absorberOrbit = Vector.
|
|
32
|
+
particle.absorberOrbit = Vector.origin;
|
|
29
33
|
particle.absorberOrbit.length = getDistance(particle.getPosition(), this.position);
|
|
30
|
-
particle.absorberOrbit.angle = getRandom() *
|
|
34
|
+
particle.absorberOrbit.angle = getRandom() * maxAngle;
|
|
31
35
|
}
|
|
32
36
|
if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
|
|
33
|
-
const minSize = Math.min(canvasSize.width, canvasSize.height);
|
|
34
|
-
particle.absorberOrbit.length = minSize * (
|
|
37
|
+
const minSize = Math.min(canvasSize.width, canvasSize.height), offset = 1, randomOffset = 0.1, randomFactor = 0.2;
|
|
38
|
+
particle.absorberOrbit.length = minSize * (offset + (getRandom() * randomFactor - randomOffset));
|
|
35
39
|
}
|
|
36
40
|
if (particle.absorberOrbitDirection === undefined) {
|
|
37
41
|
particle.absorberOrbitDirection =
|
|
38
|
-
particle.velocity.x >=
|
|
42
|
+
particle.velocity.x >= minVelocity ? "clockwise" : "counter-clockwise";
|
|
39
43
|
}
|
|
40
44
|
const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;
|
|
41
45
|
particle.velocity.setTo(Vector.origin);
|
|
@@ -47,7 +51,7 @@ export class AbsorberInstance {
|
|
|
47
51
|
particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
|
|
48
52
|
particle.absorberOrbit.length -= v.length;
|
|
49
53
|
particle.absorberOrbit.angle +=
|
|
50
|
-
(((particle.retina.moveSpeed ??
|
|
54
|
+
(((particle.retina.moveSpeed ?? minVelocity) * container.retina.pixelRatio) / percentDenominator) *
|
|
51
55
|
container.retina.reduceFactor;
|
|
52
56
|
}
|
|
53
57
|
else {
|
|
@@ -101,11 +105,11 @@ export class AbsorberInstance {
|
|
|
101
105
|
}
|
|
102
106
|
}
|
|
103
107
|
const pos = particle.getPosition(), { dx, dy, distance } = getDistances(this.position, pos), v = Vector.create(dx, dy);
|
|
104
|
-
v.length = (this.mass / Math.pow(distance,
|
|
108
|
+
v.length = (this.mass / Math.pow(distance, squareExp)) * container.retina.reduceFactor;
|
|
105
109
|
if (distance < this.size + particle.getRadius()) {
|
|
106
|
-
const sizeFactor = particle.getRadius() *
|
|
110
|
+
const sizeFactor = particle.getRadius() * absorbFactor * container.retina.pixelRatio;
|
|
107
111
|
if ((this.size > particle.getRadius() && distance < this.size - particle.getRadius()) ||
|
|
108
|
-
(particle.absorberOrbit !== undefined && particle.absorberOrbit.length <
|
|
112
|
+
(particle.absorberOrbit !== undefined && particle.absorberOrbit.length < minOrbitLength)) {
|
|
109
113
|
if (options.destroy) {
|
|
110
114
|
particle.destroy();
|
|
111
115
|
}
|
|
@@ -120,10 +124,10 @@ export class AbsorberInstance {
|
|
|
120
124
|
}
|
|
121
125
|
this._updateParticlePosition(particle, v);
|
|
122
126
|
}
|
|
123
|
-
if (this.limit.radius <=
|
|
127
|
+
if (this.limit.radius <= minRadius || this.size < this.limit.radius) {
|
|
124
128
|
this.size += sizeFactor;
|
|
125
129
|
}
|
|
126
|
-
if (this.limit.mass <=
|
|
130
|
+
if (this.limit.mass <= minMass || this.mass < this.limit.mass) {
|
|
127
131
|
this.mass += sizeFactor * this.options.size.density * container.retina.reduceFactor;
|
|
128
132
|
}
|
|
129
133
|
}
|
|
@@ -131,13 +135,14 @@ export class AbsorberInstance {
|
|
|
131
135
|
this._updateParticlePosition(particle, v);
|
|
132
136
|
}
|
|
133
137
|
}
|
|
134
|
-
draw(context) {
|
|
138
|
+
async draw(context) {
|
|
135
139
|
context.translate(this.position.x, this.position.y);
|
|
136
140
|
context.beginPath();
|
|
137
|
-
context.arc(
|
|
141
|
+
context.arc(origin.x, origin.y, this.size, minAngle, maxAngle, false);
|
|
138
142
|
context.closePath();
|
|
139
143
|
context.fillStyle = getStyleFromRgb(this.color, this.opacity);
|
|
140
144
|
context.fill();
|
|
145
|
+
await Promise.resolve();
|
|
141
146
|
}
|
|
142
147
|
resize() {
|
|
143
148
|
const initialPosition = this.initialPosition;
|
package/browser/Absorbers.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { executeOnSingleOrMultiple, isNumber, itemFromSingleOrMultiple, } from "@tsparticles/engine";
|
|
2
|
-
|
|
2
|
+
const defaultIndex = 0;
|
|
3
3
|
export class Absorbers {
|
|
4
4
|
constructor(container) {
|
|
5
5
|
this.container = container;
|
|
@@ -7,33 +7,39 @@ export class Absorbers {
|
|
|
7
7
|
this.absorbers = [];
|
|
8
8
|
this.interactivityAbsorbers = [];
|
|
9
9
|
container.getAbsorber = (idxOrName) => idxOrName === undefined || isNumber(idxOrName)
|
|
10
|
-
? this.array[idxOrName
|
|
10
|
+
? this.array[idxOrName ?? defaultIndex]
|
|
11
11
|
: this.array.find((t) => t.name === idxOrName);
|
|
12
|
-
container.addAbsorber = (options, position) => this.addAbsorber(options, position);
|
|
12
|
+
container.addAbsorber = async (options, position) => this.addAbsorber(options, position);
|
|
13
13
|
}
|
|
14
|
-
addAbsorber(options, position) {
|
|
15
|
-
const absorber = new AbsorberInstance(this, this.container, options, position);
|
|
14
|
+
async addAbsorber(options, position) {
|
|
15
|
+
const { AbsorberInstance } = await import("./AbsorberInstance.js"), absorber = new AbsorberInstance(this, this.container, options, position);
|
|
16
16
|
this.array.push(absorber);
|
|
17
17
|
return absorber;
|
|
18
18
|
}
|
|
19
|
-
draw(context) {
|
|
19
|
+
async draw(context) {
|
|
20
20
|
for (const absorber of this.array) {
|
|
21
|
-
absorber.draw(context);
|
|
21
|
+
await absorber.draw(context);
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
handleClickMode(mode) {
|
|
25
25
|
const absorberOptions = this.absorbers, modeAbsorbers = this.interactivityAbsorbers;
|
|
26
26
|
if (mode === "absorber") {
|
|
27
27
|
const absorbersModeOptions = itemFromSingleOrMultiple(modeAbsorbers), absorbersOptions = absorbersModeOptions ?? itemFromSingleOrMultiple(absorberOptions), aPosition = this.container.interactivity.mouse.clickPosition;
|
|
28
|
-
this.addAbsorber(absorbersOptions, aPosition);
|
|
28
|
+
void this.addAbsorber(absorbersOptions, aPosition);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
async init() {
|
|
32
32
|
this.absorbers = this.container.actualOptions.absorbers;
|
|
33
33
|
this.interactivityAbsorbers = this.container.actualOptions.interactivity.modes.absorbers;
|
|
34
|
-
executeOnSingleOrMultiple(this.absorbers, (absorber) => {
|
|
35
|
-
this.addAbsorber(absorber);
|
|
34
|
+
const promises = executeOnSingleOrMultiple(this.absorbers, async (absorber) => {
|
|
35
|
+
await this.addAbsorber(absorber);
|
|
36
36
|
});
|
|
37
|
+
if (promises instanceof Array) {
|
|
38
|
+
await Promise.all(promises);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
await promises;
|
|
42
|
+
}
|
|
37
43
|
}
|
|
38
44
|
particleUpdate(particle) {
|
|
39
45
|
for (const absorber of this.array) {
|
|
@@ -44,9 +50,9 @@ export class Absorbers {
|
|
|
44
50
|
}
|
|
45
51
|
}
|
|
46
52
|
removeAbsorber(absorber) {
|
|
47
|
-
const index = this.array.indexOf(absorber);
|
|
48
|
-
if (index >=
|
|
49
|
-
this.array.splice(index,
|
|
53
|
+
const index = this.array.indexOf(absorber), deleteCount = 1;
|
|
54
|
+
if (index >= defaultIndex) {
|
|
55
|
+
this.array.splice(index, deleteCount);
|
|
50
56
|
}
|
|
51
57
|
}
|
|
52
58
|
resize() {
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { executeOnSingleOrMultiple, isArray, isInArray, } from "@tsparticles/engine";
|
|
2
|
+
import { Absorber } from "./Options/Classes/Absorber.js";
|
|
3
|
+
export class AbsorbersPlugin {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.id = "absorbers";
|
|
6
|
+
}
|
|
7
|
+
async getPlugin(container) {
|
|
8
|
+
const { Absorbers } = await import("./Absorbers.js");
|
|
9
|
+
return new Absorbers(container);
|
|
10
|
+
}
|
|
11
|
+
loadOptions(options, source) {
|
|
12
|
+
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (source?.absorbers) {
|
|
16
|
+
options.absorbers = executeOnSingleOrMultiple(source.absorbers, (absorber) => {
|
|
17
|
+
const tmp = new Absorber();
|
|
18
|
+
tmp.load(absorber);
|
|
19
|
+
return tmp;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
options.interactivity.modes.absorbers = executeOnSingleOrMultiple(source?.interactivity?.modes?.absorbers, (absorber) => {
|
|
23
|
+
const tmp = new Absorber();
|
|
24
|
+
tmp.load(absorber);
|
|
25
|
+
return tmp;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
needsPlugin(options) {
|
|
29
|
+
if (!options) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const absorbers = options.absorbers;
|
|
33
|
+
if (isArray(absorbers)) {
|
|
34
|
+
return !!absorbers.length;
|
|
35
|
+
}
|
|
36
|
+
else if (absorbers) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
else if (options.interactivity?.events?.onClick?.mode &&
|
|
40
|
+
isInArray("absorber", options.interactivity.events.onClick.mode)) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
package/browser/index.js
CHANGED
|
@@ -1,49 +1,5 @@
|
|
|
1
|
-
import { executeOnSingleOrMultiple, isArray, isInArray, } from "@tsparticles/engine";
|
|
2
|
-
import { Absorber } from "./Options/Classes/Absorber.js";
|
|
3
|
-
import { Absorbers } from "./Absorbers.js";
|
|
4
|
-
class AbsorbersPlugin {
|
|
5
|
-
constructor() {
|
|
6
|
-
this.id = "absorbers";
|
|
7
|
-
}
|
|
8
|
-
getPlugin(container) {
|
|
9
|
-
return new Absorbers(container);
|
|
10
|
-
}
|
|
11
|
-
loadOptions(options, source) {
|
|
12
|
-
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
if (source?.absorbers) {
|
|
16
|
-
options.absorbers = executeOnSingleOrMultiple(source.absorbers, (absorber) => {
|
|
17
|
-
const tmp = new Absorber();
|
|
18
|
-
tmp.load(absorber);
|
|
19
|
-
return tmp;
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
options.interactivity.modes.absorbers = executeOnSingleOrMultiple(source?.interactivity?.modes?.absorbers, (absorber) => {
|
|
23
|
-
const tmp = new Absorber();
|
|
24
|
-
tmp.load(absorber);
|
|
25
|
-
return tmp;
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
needsPlugin(options) {
|
|
29
|
-
if (!options) {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
const absorbers = options.absorbers;
|
|
33
|
-
if (isArray(absorbers)) {
|
|
34
|
-
return !!absorbers.length;
|
|
35
|
-
}
|
|
36
|
-
else if (absorbers) {
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
else if (options.interactivity?.events?.onClick?.mode &&
|
|
40
|
-
isInArray("absorber", options.interactivity.events.onClick.mode)) {
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
1
|
export async function loadAbsorbersPlugin(engine, refresh = true) {
|
|
2
|
+
const { AbsorbersPlugin } = await import("./AbsorbersPlugin.js");
|
|
47
3
|
await engine.addPlugin(new AbsorbersPlugin(), refresh);
|
|
48
4
|
}
|
|
49
5
|
export * from "./AbsorberContainer.js";
|
package/cjs/AbsorberInstance.js
CHANGED
|
@@ -3,6 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AbsorberInstance = void 0;
|
|
4
4
|
const engine_1 = require("@tsparticles/engine");
|
|
5
5
|
const Absorber_js_1 = require("./Options/Classes/Absorber.js");
|
|
6
|
+
const squareExp = 2, absorbFactor = 0.033, minOrbitLength = 0, minRadius = 0, minMass = 0, origin = {
|
|
7
|
+
x: 0,
|
|
8
|
+
y: 0,
|
|
9
|
+
}, minAngle = 0, double = 2, maxAngle = Math.PI * double, minVelocity = 0;
|
|
6
10
|
class AbsorberInstance {
|
|
7
11
|
constructor(absorbers, container, options, position) {
|
|
8
12
|
this.absorbers = absorbers;
|
|
@@ -28,17 +32,17 @@ class AbsorberInstance {
|
|
|
28
32
|
}
|
|
29
33
|
if (this.options.orbits) {
|
|
30
34
|
if (particle.absorberOrbit === undefined) {
|
|
31
|
-
particle.absorberOrbit = engine_1.Vector.
|
|
35
|
+
particle.absorberOrbit = engine_1.Vector.origin;
|
|
32
36
|
particle.absorberOrbit.length = (0, engine_1.getDistance)(particle.getPosition(), this.position);
|
|
33
|
-
particle.absorberOrbit.angle = (0, engine_1.getRandom)() *
|
|
37
|
+
particle.absorberOrbit.angle = (0, engine_1.getRandom)() * maxAngle;
|
|
34
38
|
}
|
|
35
39
|
if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
|
|
36
|
-
const minSize = Math.min(canvasSize.width, canvasSize.height);
|
|
37
|
-
particle.absorberOrbit.length = minSize * (
|
|
40
|
+
const minSize = Math.min(canvasSize.width, canvasSize.height), offset = 1, randomOffset = 0.1, randomFactor = 0.2;
|
|
41
|
+
particle.absorberOrbit.length = minSize * (offset + ((0, engine_1.getRandom)() * randomFactor - randomOffset));
|
|
38
42
|
}
|
|
39
43
|
if (particle.absorberOrbitDirection === undefined) {
|
|
40
44
|
particle.absorberOrbitDirection =
|
|
41
|
-
particle.velocity.x >=
|
|
45
|
+
particle.velocity.x >= minVelocity ? "clockwise" : "counter-clockwise";
|
|
42
46
|
}
|
|
43
47
|
const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;
|
|
44
48
|
particle.velocity.setTo(engine_1.Vector.origin);
|
|
@@ -50,7 +54,7 @@ class AbsorberInstance {
|
|
|
50
54
|
particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
|
|
51
55
|
particle.absorberOrbit.length -= v.length;
|
|
52
56
|
particle.absorberOrbit.angle +=
|
|
53
|
-
(((particle.retina.moveSpeed ??
|
|
57
|
+
(((particle.retina.moveSpeed ?? minVelocity) * container.retina.pixelRatio) / engine_1.percentDenominator) *
|
|
54
58
|
container.retina.reduceFactor;
|
|
55
59
|
}
|
|
56
60
|
else {
|
|
@@ -104,11 +108,11 @@ class AbsorberInstance {
|
|
|
104
108
|
}
|
|
105
109
|
}
|
|
106
110
|
const pos = particle.getPosition(), { dx, dy, distance } = (0, engine_1.getDistances)(this.position, pos), v = engine_1.Vector.create(dx, dy);
|
|
107
|
-
v.length = (this.mass / Math.pow(distance,
|
|
111
|
+
v.length = (this.mass / Math.pow(distance, squareExp)) * container.retina.reduceFactor;
|
|
108
112
|
if (distance < this.size + particle.getRadius()) {
|
|
109
|
-
const sizeFactor = particle.getRadius() *
|
|
113
|
+
const sizeFactor = particle.getRadius() * absorbFactor * container.retina.pixelRatio;
|
|
110
114
|
if ((this.size > particle.getRadius() && distance < this.size - particle.getRadius()) ||
|
|
111
|
-
(particle.absorberOrbit !== undefined && particle.absorberOrbit.length <
|
|
115
|
+
(particle.absorberOrbit !== undefined && particle.absorberOrbit.length < minOrbitLength)) {
|
|
112
116
|
if (options.destroy) {
|
|
113
117
|
particle.destroy();
|
|
114
118
|
}
|
|
@@ -123,10 +127,10 @@ class AbsorberInstance {
|
|
|
123
127
|
}
|
|
124
128
|
this._updateParticlePosition(particle, v);
|
|
125
129
|
}
|
|
126
|
-
if (this.limit.radius <=
|
|
130
|
+
if (this.limit.radius <= minRadius || this.size < this.limit.radius) {
|
|
127
131
|
this.size += sizeFactor;
|
|
128
132
|
}
|
|
129
|
-
if (this.limit.mass <=
|
|
133
|
+
if (this.limit.mass <= minMass || this.mass < this.limit.mass) {
|
|
130
134
|
this.mass += sizeFactor * this.options.size.density * container.retina.reduceFactor;
|
|
131
135
|
}
|
|
132
136
|
}
|
|
@@ -134,13 +138,14 @@ class AbsorberInstance {
|
|
|
134
138
|
this._updateParticlePosition(particle, v);
|
|
135
139
|
}
|
|
136
140
|
}
|
|
137
|
-
draw(context) {
|
|
141
|
+
async draw(context) {
|
|
138
142
|
context.translate(this.position.x, this.position.y);
|
|
139
143
|
context.beginPath();
|
|
140
|
-
context.arc(
|
|
144
|
+
context.arc(origin.x, origin.y, this.size, minAngle, maxAngle, false);
|
|
141
145
|
context.closePath();
|
|
142
146
|
context.fillStyle = (0, engine_1.getStyleFromRgb)(this.color, this.opacity);
|
|
143
147
|
context.fill();
|
|
148
|
+
await Promise.resolve();
|
|
144
149
|
}
|
|
145
150
|
resize() {
|
|
146
151
|
const initialPosition = this.initialPosition;
|
package/cjs/Absorbers.js
CHANGED
|
@@ -1,8 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
26
|
exports.Absorbers = void 0;
|
|
4
27
|
const engine_1 = require("@tsparticles/engine");
|
|
5
|
-
const
|
|
28
|
+
const defaultIndex = 0;
|
|
6
29
|
class Absorbers {
|
|
7
30
|
constructor(container) {
|
|
8
31
|
this.container = container;
|
|
@@ -10,33 +33,39 @@ class Absorbers {
|
|
|
10
33
|
this.absorbers = [];
|
|
11
34
|
this.interactivityAbsorbers = [];
|
|
12
35
|
container.getAbsorber = (idxOrName) => idxOrName === undefined || (0, engine_1.isNumber)(idxOrName)
|
|
13
|
-
? this.array[idxOrName
|
|
36
|
+
? this.array[idxOrName ?? defaultIndex]
|
|
14
37
|
: this.array.find((t) => t.name === idxOrName);
|
|
15
|
-
container.addAbsorber = (options, position) => this.addAbsorber(options, position);
|
|
38
|
+
container.addAbsorber = async (options, position) => this.addAbsorber(options, position);
|
|
16
39
|
}
|
|
17
|
-
addAbsorber(options, position) {
|
|
18
|
-
const absorber = new
|
|
40
|
+
async addAbsorber(options, position) {
|
|
41
|
+
const { AbsorberInstance } = await Promise.resolve().then(() => __importStar(require("./AbsorberInstance.js"))), absorber = new AbsorberInstance(this, this.container, options, position);
|
|
19
42
|
this.array.push(absorber);
|
|
20
43
|
return absorber;
|
|
21
44
|
}
|
|
22
|
-
draw(context) {
|
|
45
|
+
async draw(context) {
|
|
23
46
|
for (const absorber of this.array) {
|
|
24
|
-
absorber.draw(context);
|
|
47
|
+
await absorber.draw(context);
|
|
25
48
|
}
|
|
26
49
|
}
|
|
27
50
|
handleClickMode(mode) {
|
|
28
51
|
const absorberOptions = this.absorbers, modeAbsorbers = this.interactivityAbsorbers;
|
|
29
52
|
if (mode === "absorber") {
|
|
30
53
|
const absorbersModeOptions = (0, engine_1.itemFromSingleOrMultiple)(modeAbsorbers), absorbersOptions = absorbersModeOptions ?? (0, engine_1.itemFromSingleOrMultiple)(absorberOptions), aPosition = this.container.interactivity.mouse.clickPosition;
|
|
31
|
-
this.addAbsorber(absorbersOptions, aPosition);
|
|
54
|
+
void this.addAbsorber(absorbersOptions, aPosition);
|
|
32
55
|
}
|
|
33
56
|
}
|
|
34
57
|
async init() {
|
|
35
58
|
this.absorbers = this.container.actualOptions.absorbers;
|
|
36
59
|
this.interactivityAbsorbers = this.container.actualOptions.interactivity.modes.absorbers;
|
|
37
|
-
(0, engine_1.executeOnSingleOrMultiple)(this.absorbers, (absorber) => {
|
|
38
|
-
this.addAbsorber(absorber);
|
|
60
|
+
const promises = (0, engine_1.executeOnSingleOrMultiple)(this.absorbers, async (absorber) => {
|
|
61
|
+
await this.addAbsorber(absorber);
|
|
39
62
|
});
|
|
63
|
+
if (promises instanceof Array) {
|
|
64
|
+
await Promise.all(promises);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
await promises;
|
|
68
|
+
}
|
|
40
69
|
}
|
|
41
70
|
particleUpdate(particle) {
|
|
42
71
|
for (const absorber of this.array) {
|
|
@@ -47,9 +76,9 @@ class Absorbers {
|
|
|
47
76
|
}
|
|
48
77
|
}
|
|
49
78
|
removeAbsorber(absorber) {
|
|
50
|
-
const index = this.array.indexOf(absorber);
|
|
51
|
-
if (index >=
|
|
52
|
-
this.array.splice(index,
|
|
79
|
+
const index = this.array.indexOf(absorber), deleteCount = 1;
|
|
80
|
+
if (index >= defaultIndex) {
|
|
81
|
+
this.array.splice(index, deleteCount);
|
|
53
82
|
}
|
|
54
83
|
}
|
|
55
84
|
resize() {
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.AbsorbersPlugin = void 0;
|
|
27
|
+
const engine_1 = require("@tsparticles/engine");
|
|
28
|
+
const Absorber_js_1 = require("./Options/Classes/Absorber.js");
|
|
29
|
+
class AbsorbersPlugin {
|
|
30
|
+
constructor() {
|
|
31
|
+
this.id = "absorbers";
|
|
32
|
+
}
|
|
33
|
+
async getPlugin(container) {
|
|
34
|
+
const { Absorbers } = await Promise.resolve().then(() => __importStar(require("./Absorbers.js")));
|
|
35
|
+
return new Absorbers(container);
|
|
36
|
+
}
|
|
37
|
+
loadOptions(options, source) {
|
|
38
|
+
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (source?.absorbers) {
|
|
42
|
+
options.absorbers = (0, engine_1.executeOnSingleOrMultiple)(source.absorbers, (absorber) => {
|
|
43
|
+
const tmp = new Absorber_js_1.Absorber();
|
|
44
|
+
tmp.load(absorber);
|
|
45
|
+
return tmp;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
options.interactivity.modes.absorbers = (0, engine_1.executeOnSingleOrMultiple)(source?.interactivity?.modes?.absorbers, (absorber) => {
|
|
49
|
+
const tmp = new Absorber_js_1.Absorber();
|
|
50
|
+
tmp.load(absorber);
|
|
51
|
+
return tmp;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
needsPlugin(options) {
|
|
55
|
+
if (!options) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const absorbers = options.absorbers;
|
|
59
|
+
if ((0, engine_1.isArray)(absorbers)) {
|
|
60
|
+
return !!absorbers.length;
|
|
61
|
+
}
|
|
62
|
+
else if (absorbers) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
else if (options.interactivity?.events?.onClick?.mode &&
|
|
66
|
+
(0, engine_1.isInArray)("absorber", options.interactivity.events.onClick.mode)) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.AbsorbersPlugin = AbsorbersPlugin;
|
package/cjs/index.js
CHANGED
|
@@ -10,57 +10,25 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
10
10
|
if (k2 === undefined) k2 = k;
|
|
11
11
|
o[k2] = m[k];
|
|
12
12
|
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
13
25
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
26
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
27
|
};
|
|
16
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
29
|
exports.loadAbsorbersPlugin = void 0;
|
|
18
|
-
const engine_1 = require("@tsparticles/engine");
|
|
19
|
-
const Absorber_js_1 = require("./Options/Classes/Absorber.js");
|
|
20
|
-
const Absorbers_js_1 = require("./Absorbers.js");
|
|
21
|
-
class AbsorbersPlugin {
|
|
22
|
-
constructor() {
|
|
23
|
-
this.id = "absorbers";
|
|
24
|
-
}
|
|
25
|
-
getPlugin(container) {
|
|
26
|
-
return new Absorbers_js_1.Absorbers(container);
|
|
27
|
-
}
|
|
28
|
-
loadOptions(options, source) {
|
|
29
|
-
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
if (source?.absorbers) {
|
|
33
|
-
options.absorbers = (0, engine_1.executeOnSingleOrMultiple)(source.absorbers, (absorber) => {
|
|
34
|
-
const tmp = new Absorber_js_1.Absorber();
|
|
35
|
-
tmp.load(absorber);
|
|
36
|
-
return tmp;
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
options.interactivity.modes.absorbers = (0, engine_1.executeOnSingleOrMultiple)(source?.interactivity?.modes?.absorbers, (absorber) => {
|
|
40
|
-
const tmp = new Absorber_js_1.Absorber();
|
|
41
|
-
tmp.load(absorber);
|
|
42
|
-
return tmp;
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
needsPlugin(options) {
|
|
46
|
-
if (!options) {
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
const absorbers = options.absorbers;
|
|
50
|
-
if ((0, engine_1.isArray)(absorbers)) {
|
|
51
|
-
return !!absorbers.length;
|
|
52
|
-
}
|
|
53
|
-
else if (absorbers) {
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
else if (options.interactivity?.events?.onClick?.mode &&
|
|
57
|
-
(0, engine_1.isInArray)("absorber", options.interactivity.events.onClick.mode)) {
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
30
|
async function loadAbsorbersPlugin(engine, refresh = true) {
|
|
31
|
+
const { AbsorbersPlugin } = await Promise.resolve().then(() => __importStar(require("./AbsorbersPlugin.js")));
|
|
64
32
|
await engine.addPlugin(new AbsorbersPlugin(), refresh);
|
|
65
33
|
}
|
|
66
34
|
exports.loadAbsorbersPlugin = loadAbsorbersPlugin;
|