@tsparticles/interaction-particles-collisions 4.0.0-alpha.25 → 4.0.0-alpha.27
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/224.min.js +1 -0
- package/{456.min.js → 235.min.js} +1 -1
- package/{279.min.js → 860.min.js} +1 -1
- package/browser/Absorb.js +7 -7
- package/browser/Bounce.js +10 -1
- package/browser/Collider.js +2 -1
- package/browser/index.js +1 -1
- package/cjs/Absorb.js +7 -7
- package/cjs/Bounce.js +10 -1
- package/cjs/Collider.js +2 -1
- package/cjs/index.js +1 -1
- package/dist_browser_Collider_js.js +4 -4
- package/dist_browser_OverlapPluginInstance_js.js +1 -1
- package/dist_browser_OverlapPlugin_js.js +1 -1
- package/esm/Absorb.js +7 -7
- package/esm/Bounce.js +10 -1
- package/esm/Collider.js +2 -1
- package/esm/index.js +1 -1
- package/package.json +3 -3
- package/report.html +1 -1
- package/tsparticles.interaction.particles.collisions.js +8 -8
- package/tsparticles.interaction.particles.collisions.min.js +1 -1
- package/umd/Absorb.js +6 -6
- package/umd/Bounce.js +10 -1
- package/umd/Collider.js +2 -1
- package/umd/index.js +1 -1
- package/61.min.js +0 -1
package/224.min.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(this.webpackChunk_tsparticles_interaction_particles_collisions=this.webpackChunk_tsparticles_interaction_particles_collisions||[]).push([[224],{224(e,s,o){o.d(s,{Collider:()=>p});var i,t,l=o(303),a=o(702);(i=t||(t={})).absorb="absorb",i.bounce="bounce",i.destroy="destroy";class n{speed;constructor(){this.speed=2}load(e){(0,l.isNull)(e)||void 0!==e.speed&&(this.speed=e.speed)}}class c{enable;retries;constructor(){this.enable=!0,this.retries=0}load(e){(0,l.isNull)(e)||(void 0!==e.enable&&(this.enable=e.enable),void 0!==e.retries&&(this.retries=e.retries))}}class r{absorb;bounce;enable;maxSpeed;mode;overlap;constructor(){this.absorb=new n,this.bounce=new l.ParticlesBounce,this.enable=!1,this.maxSpeed=50,this.mode=t.bounce,this.overlap=new c}load(e){(0,l.isNull)(e)||(this.absorb.load(e.absorb),this.bounce.load(e.bounce),void 0!==e.enable&&(this.enable=e.enable),void 0!==e.maxSpeed&&(this.maxSpeed=(0,l.setRangeValue)(e.maxSpeed)),void 0!==e.mode&&(this.mode=e.mode),this.overlap.load(e.overlap))}}function d(e,s,o,i,t,a){if(!e.options.collisions||!o.options.collisions)return;let n=e.options.collisions.absorb.speed,c=(0,l.clamp)(n*t.factor,0,i);e.size.value=Math.sqrt(s*s+c*c),o.size.value-=c,o.size.value<=a&&(o.size.value=0,o.destroy())}let u=e=>{e.options.collisions&&(e.collisionMaxSpeed??=(0,l.getRangeValue)(e.options.collisions.maxSpeed),e.velocity.length>e.collisionMaxSpeed&&(e.velocity.length=e.collisionMaxSpeed))};function b(e,s){let o=e.getMass(),i=s.getMass(),t=e.velocity.length,a=s.velocity.length,n=o*t*t+i*a*a;(0,l.circleBounce)((0,l.circleBounceDataFromParticle)(e),(0,l.circleBounceDataFromParticle)(s));let c=e.velocity.length,r=s.velocity.length,d=o*c*c+i*r*r;if(d>1e-6*n){let o=Math.sqrt(n/d);Math.abs(o-1)>1e-4&&(e.velocity.length=c*o,s.velocity.length=r*o)}u(e),u(s)}class p extends a.ParticlesInteractorBase{maxDistance;constructor(e){super(e),this.maxDistance=0}clear(){}init(){}interact(e,s,o){if(e.destroyed||e.spawning)return;let i=this.container,a=e.getPosition(),n=e.getRadius();for(let s of i.particles.grid.queryCircle(a,n*l.double)){if(e===s||e.id>=s.id||!e.options.collisions?.enable||!s.options.collisions?.enable||e.options.collisions.mode!==s.options.collisions.mode||s.destroyed||s.spawning)continue;let c=s.getPosition(),r=s.getRadius();if(!(Math.abs(Math.round(a.z)-Math.round(c.z))>n+r))(0,l.getDistance)(a,c)>n+r||function(e,s,o,i){if(e.options.collisions&&s.options.collisions)switch(e.options.collisions.mode){case t.absorb:let l,a;l=e.getRadius(),a=s.getRadius(),!l&&a?e.destroy():l&&!a?s.destroy():l&&a&&(l>=a?d(e,l,s,a,o,i):d(s,a,e,l,o,i));break;case t.bounce:b(e,s);break;case t.destroy:let n,c;e.unbreakable||s.unbreakable||b(e,s),n=e.getRadius(),c=s.getRadius(),!n&&c?e.destroy():n&&!c?s.destroy():n&&c&&(e.getRadius()>=s.getRadius()?s:e).destroy()}}(e,s,o,i.retina.pixelRatio)}}isEnabled(e){return!!e.options.collisions?.enable}loadParticlesOptions(e,...s){for(let o of(e.collisions??=new r,s))e.collisions.load(o?.collisions)}reset(){}}}}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(this.webpackChunk_tsparticles_interaction_particles_collisions=this.webpackChunk_tsparticles_interaction_particles_collisions||[]).push([[
|
|
1
|
+
"use strict";(this.webpackChunk_tsparticles_interaction_particles_collisions=this.webpackChunk_tsparticles_interaction_particles_collisions||[]).push([[235],{235(i,t,e){e.r(t),e.d(t,{OverlapPlugin:()=>s});class s{id="overlap";async getPlugin(i){let{OverlapPluginInstance:t}=await e.e(860).then(e.bind(e,860));return new t(i)}loadOptions(){}needsPlugin(){return!0}}}}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(this.webpackChunk_tsparticles_interaction_particles_collisions=this.webpackChunk_tsparticles_interaction_particles_collisions||[]).push([[
|
|
1
|
+
"use strict";(this.webpackChunk_tsparticles_interaction_particles_collisions=this.webpackChunk_tsparticles_interaction_particles_collisions||[]).push([[860],{860(t,i,e){e.d(i,{OverlapPluginInstance:()=>r});var s=e(303);class r{_container;constructor(t){this._container=t}checkParticlePosition(t,i,e){return!this._hasOverlaps(t,i,e)}_hasOverlaps=(t,i,e)=>{let r=t.options.collisions;if(!r?.enable)return!1;let n=r.overlap;if(n.enable)return!1;let a=n.retries;if(a>=0&&e>a)throw Error("Particle is overlapping and can't be placed");return!!this._container.particles.find(e=>(0,s.getDistance)(i,e.position)<t.getRadius()+e.getRadius())}}}}]);
|
package/browser/Absorb.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { clamp
|
|
2
|
-
const
|
|
3
|
-
function updateAbsorb(p1,
|
|
1
|
+
import { clamp } from "@tsparticles/engine";
|
|
2
|
+
const minAbsorbAmount = 0;
|
|
3
|
+
function updateAbsorb(p1, r1, p2, r2, delta, pixelRatio) {
|
|
4
4
|
if (!p1.options.collisions || !p2.options.collisions) {
|
|
5
5
|
return;
|
|
6
6
|
}
|
|
7
|
-
const
|
|
8
|
-
p1.size.value
|
|
9
|
-
p2.size.value -=
|
|
10
|
-
if (
|
|
7
|
+
const absorbSpeed = p1.options.collisions.absorb.speed, shrinkAmount = clamp(absorbSpeed * delta.factor, minAbsorbAmount, r2);
|
|
8
|
+
p1.size.value = Math.sqrt(r1 * r1 + shrinkAmount * shrinkAmount);
|
|
9
|
+
p2.size.value -= shrinkAmount;
|
|
10
|
+
if (p2.size.value <= pixelRatio) {
|
|
11
11
|
p2.size.value = 0;
|
|
12
12
|
p2.destroy();
|
|
13
13
|
}
|
package/browser/Bounce.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { circleBounce, circleBounceDataFromParticle, getRangeValue } from "@tsparticles/engine";
|
|
2
|
-
const fixBounceSpeed = (p) => {
|
|
2
|
+
const energyCorrectionMinRatio = 1e-6, energyDriftThreshold = 1e-4, correctionFactorNeutral = 1, fixBounceSpeed = (p) => {
|
|
3
3
|
if (!p.options.collisions) {
|
|
4
4
|
return;
|
|
5
5
|
}
|
|
@@ -9,7 +9,16 @@ const fixBounceSpeed = (p) => {
|
|
|
9
9
|
}
|
|
10
10
|
};
|
|
11
11
|
export function bounce(p1, p2) {
|
|
12
|
+
const m1 = p1.getMass(), m2 = p2.getMass(), speed1Before = p1.velocity.length, speed2Before = p2.velocity.length, keBefore = m1 * speed1Before * speed1Before + m2 * speed2Before * speed2Before;
|
|
12
13
|
circleBounce(circleBounceDataFromParticle(p1), circleBounceDataFromParticle(p2));
|
|
14
|
+
const speed1After = p1.velocity.length, speed2After = p2.velocity.length, keAfter = m1 * speed1After * speed1After + m2 * speed2After * speed2After;
|
|
15
|
+
if (keAfter > keBefore * energyCorrectionMinRatio) {
|
|
16
|
+
const correctionFactor = Math.sqrt(keBefore / keAfter);
|
|
17
|
+
if (Math.abs(correctionFactor - correctionFactorNeutral) > energyDriftThreshold) {
|
|
18
|
+
p1.velocity.length = speed1After * correctionFactor;
|
|
19
|
+
p2.velocity.length = speed2After * correctionFactor;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
13
22
|
fixBounceSpeed(p1);
|
|
14
23
|
fixBounceSpeed(p2);
|
|
15
24
|
}
|
package/browser/Collider.js
CHANGED
|
@@ -19,7 +19,8 @@ export class Collider extends ParticlesInteractorBase {
|
|
|
19
19
|
const container = this.container, pos1 = p1.getPosition(), radius1 = p1.getRadius(), query = container.particles.grid.queryCircle(pos1, radius1 * double);
|
|
20
20
|
for (const p2 of query) {
|
|
21
21
|
if (p1 === p2 ||
|
|
22
|
-
|
|
22
|
+
p1.id >= p2.id ||
|
|
23
|
+
!p1.options.collisions?.enable ||
|
|
23
24
|
!p2.options.collisions?.enable ||
|
|
24
25
|
p1.options.collisions.mode !== p2.options.collisions.mode ||
|
|
25
26
|
p2.destroyed ||
|
package/browser/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export async function loadParticlesCollisionsInteraction(engine) {
|
|
2
|
-
engine.checkVersion("4.0.0-alpha.
|
|
2
|
+
engine.checkVersion("4.0.0-alpha.27");
|
|
3
3
|
await engine.register(async (e) => {
|
|
4
4
|
const [{ ensureInteractivityPluginLoaded }, { OverlapPlugin },] = await Promise.all([
|
|
5
5
|
import("@tsparticles/plugin-interactivity"),
|
package/cjs/Absorb.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { clamp
|
|
2
|
-
const
|
|
3
|
-
function updateAbsorb(p1,
|
|
1
|
+
import { clamp } from "@tsparticles/engine";
|
|
2
|
+
const minAbsorbAmount = 0;
|
|
3
|
+
function updateAbsorb(p1, r1, p2, r2, delta, pixelRatio) {
|
|
4
4
|
if (!p1.options.collisions || !p2.options.collisions) {
|
|
5
5
|
return;
|
|
6
6
|
}
|
|
7
|
-
const
|
|
8
|
-
p1.size.value
|
|
9
|
-
p2.size.value -=
|
|
10
|
-
if (
|
|
7
|
+
const absorbSpeed = p1.options.collisions.absorb.speed, shrinkAmount = clamp(absorbSpeed * delta.factor, minAbsorbAmount, r2);
|
|
8
|
+
p1.size.value = Math.sqrt(r1 * r1 + shrinkAmount * shrinkAmount);
|
|
9
|
+
p2.size.value -= shrinkAmount;
|
|
10
|
+
if (p2.size.value <= pixelRatio) {
|
|
11
11
|
p2.size.value = 0;
|
|
12
12
|
p2.destroy();
|
|
13
13
|
}
|
package/cjs/Bounce.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { circleBounce, circleBounceDataFromParticle, getRangeValue } from "@tsparticles/engine";
|
|
2
|
-
const fixBounceSpeed = (p) => {
|
|
2
|
+
const energyCorrectionMinRatio = 1e-6, energyDriftThreshold = 1e-4, correctionFactorNeutral = 1, fixBounceSpeed = (p) => {
|
|
3
3
|
if (!p.options.collisions) {
|
|
4
4
|
return;
|
|
5
5
|
}
|
|
@@ -9,7 +9,16 @@ const fixBounceSpeed = (p) => {
|
|
|
9
9
|
}
|
|
10
10
|
};
|
|
11
11
|
export function bounce(p1, p2) {
|
|
12
|
+
const m1 = p1.getMass(), m2 = p2.getMass(), speed1Before = p1.velocity.length, speed2Before = p2.velocity.length, keBefore = m1 * speed1Before * speed1Before + m2 * speed2Before * speed2Before;
|
|
12
13
|
circleBounce(circleBounceDataFromParticle(p1), circleBounceDataFromParticle(p2));
|
|
14
|
+
const speed1After = p1.velocity.length, speed2After = p2.velocity.length, keAfter = m1 * speed1After * speed1After + m2 * speed2After * speed2After;
|
|
15
|
+
if (keAfter > keBefore * energyCorrectionMinRatio) {
|
|
16
|
+
const correctionFactor = Math.sqrt(keBefore / keAfter);
|
|
17
|
+
if (Math.abs(correctionFactor - correctionFactorNeutral) > energyDriftThreshold) {
|
|
18
|
+
p1.velocity.length = speed1After * correctionFactor;
|
|
19
|
+
p2.velocity.length = speed2After * correctionFactor;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
13
22
|
fixBounceSpeed(p1);
|
|
14
23
|
fixBounceSpeed(p2);
|
|
15
24
|
}
|
package/cjs/Collider.js
CHANGED
|
@@ -19,7 +19,8 @@ export class Collider extends ParticlesInteractorBase {
|
|
|
19
19
|
const container = this.container, pos1 = p1.getPosition(), radius1 = p1.getRadius(), query = container.particles.grid.queryCircle(pos1, radius1 * double);
|
|
20
20
|
for (const p2 of query) {
|
|
21
21
|
if (p1 === p2 ||
|
|
22
|
-
|
|
22
|
+
p1.id >= p2.id ||
|
|
23
|
+
!p1.options.collisions?.enable ||
|
|
23
24
|
!p2.options.collisions?.enable ||
|
|
24
25
|
p1.options.collisions.mode !== p2.options.collisions.mode ||
|
|
25
26
|
p2.destroyed ||
|
package/cjs/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export async function loadParticlesCollisionsInteraction(engine) {
|
|
2
|
-
engine.checkVersion("4.0.0-alpha.
|
|
2
|
+
engine.checkVersion("4.0.0-alpha.27");
|
|
3
3
|
await engine.register(async (e) => {
|
|
4
4
|
const [{ ensureInteractivityPluginLoaded }, { OverlapPlugin },] = await Promise.all([
|
|
5
5
|
import("@tsparticles/plugin-interactivity"),
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Demo / Generator : https://particles.js.org/
|
|
5
5
|
* GitHub : https://www.github.com/matteobruni/tsparticles
|
|
6
6
|
* How to use? : Check the GitHub README
|
|
7
|
-
* v4.0.0-alpha.
|
|
7
|
+
* v4.0.0-alpha.27
|
|
8
8
|
*/
|
|
9
9
|
"use strict";
|
|
10
10
|
/*
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
\********************************/
|
|
24
24
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
25
25
|
|
|
26
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ absorb: () => (/* binding */ absorb)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nconst
|
|
26
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ absorb: () => (/* binding */ absorb)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nconst minAbsorbAmount = 0;\nfunction updateAbsorb(p1, r1, p2, r2, delta, pixelRatio) {\n if (!p1.options.collisions || !p2.options.collisions) {\n return;\n }\n const absorbSpeed = p1.options.collisions.absorb.speed, shrinkAmount = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.clamp)(absorbSpeed * delta.factor, minAbsorbAmount, r2);\n p1.size.value = Math.sqrt(r1 * r1 + shrinkAmount * shrinkAmount);\n p2.size.value -= shrinkAmount;\n if (p2.size.value <= pixelRatio) {\n p2.size.value = 0;\n p2.destroy();\n }\n}\nfunction absorb(p1, p2, delta, pixelRatio) {\n const r1 = p1.getRadius(), r2 = p2.getRadius();\n if (!r1 && r2) {\n p1.destroy();\n } else if (r1 && !r2) {\n p2.destroy();\n } else if (r1 && r2) {\n if (r1 >= r2) {\n updateAbsorb(p1, r1, p2, r2, delta, pixelRatio);\n } else {\n updateAbsorb(p2, r2, p1, r1, delta, pixelRatio);\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/interaction-particles-collisions/./dist/browser/Absorb.js?\n}");
|
|
27
27
|
|
|
28
28
|
/***/ },
|
|
29
29
|
|
|
@@ -33,7 +33,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
33
33
|
\********************************/
|
|
34
34
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
35
35
|
|
|
36
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ bounce: () => (/* binding */ bounce)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nconst fixBounceSpeed = (p)=>{\n if (!p.options.collisions) {\n return;\n }\n p.collisionMaxSpeed ??= (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(p.options.collisions.maxSpeed);\n if (p.velocity.length > p.collisionMaxSpeed) {\n p.velocity.length = p.collisionMaxSpeed;\n }\n};\nfunction bounce(p1, p2) {\n (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.circleBounce)((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.circleBounceDataFromParticle)(p1), (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.circleBounceDataFromParticle)(p2));\n fixBounceSpeed(p1);\n fixBounceSpeed(p2);\n}\n\n\n//# sourceURL=webpack://@tsparticles/interaction-particles-collisions/./dist/browser/Bounce.js?\n}");
|
|
36
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ bounce: () => (/* binding */ bounce)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nconst energyCorrectionMinRatio = 1e-6, energyDriftThreshold = 1e-4, correctionFactorNeutral = 1, fixBounceSpeed = (p)=>{\n if (!p.options.collisions) {\n return;\n }\n p.collisionMaxSpeed ??= (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(p.options.collisions.maxSpeed);\n if (p.velocity.length > p.collisionMaxSpeed) {\n p.velocity.length = p.collisionMaxSpeed;\n }\n};\nfunction bounce(p1, p2) {\n const m1 = p1.getMass(), m2 = p2.getMass(), speed1Before = p1.velocity.length, speed2Before = p2.velocity.length, keBefore = m1 * speed1Before * speed1Before + m2 * speed2Before * speed2Before;\n (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.circleBounce)((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.circleBounceDataFromParticle)(p1), (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.circleBounceDataFromParticle)(p2));\n const speed1After = p1.velocity.length, speed2After = p2.velocity.length, keAfter = m1 * speed1After * speed1After + m2 * speed2After * speed2After;\n if (keAfter > keBefore * energyCorrectionMinRatio) {\n const correctionFactor = Math.sqrt(keBefore / keAfter);\n if (Math.abs(correctionFactor - correctionFactorNeutral) > energyDriftThreshold) {\n p1.velocity.length = speed1After * correctionFactor;\n p2.velocity.length = speed2After * correctionFactor;\n }\n }\n fixBounceSpeed(p1);\n fixBounceSpeed(p2);\n}\n\n\n//# sourceURL=webpack://@tsparticles/interaction-particles-collisions/./dist/browser/Bounce.js?\n}");
|
|
37
37
|
|
|
38
38
|
/***/ },
|
|
39
39
|
|
|
@@ -43,7 +43,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
43
43
|
\**********************************/
|
|
44
44
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
45
45
|
|
|
46
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Collider: () => (/* binding */ Collider)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _tsparticles_plugin_interactivity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tsparticles/plugin-interactivity */ \"@tsparticles/plugin-interactivity\");\n/* harmony import */ var _Options_Classes_Collisions_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Options/Classes/Collisions.js */ \"./dist/browser/Options/Classes/Collisions.js\");\n/* harmony import */ var _ResolveCollision_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ResolveCollision.js */ \"./dist/browser/ResolveCollision.js\");\n\n\n\n\nclass Collider extends _tsparticles_plugin_interactivity__WEBPACK_IMPORTED_MODULE_1__.ParticlesInteractorBase {\n maxDistance;\n constructor(container){\n super(container);\n this.maxDistance = 0;\n }\n clear() {}\n init() {}\n interact(p1, _interactivityData, delta) {\n if (p1.destroyed || p1.spawning) {\n return;\n }\n const container = this.container, pos1 = p1.getPosition(), radius1 = p1.getRadius(), query = container.particles.grid.queryCircle(pos1, radius1 * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.double);\n for (const p2 of query){\n if (p1 === p2 || !p1.options.collisions || !p2.options.collisions?.enable || p1.options.collisions.mode !== p2.options.collisions.mode || p2.destroyed || p2.spawning) {\n continue;\n }\n const pos2 = p2.getPosition(), radius2 = p2.getRadius();\n if (Math.abs(Math.round(pos1.z) - Math.round(pos2.z)) > radius1 + radius2) {\n continue;\n }\n const dist = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getDistance)(pos1, pos2), distP = radius1 + radius2;\n if (dist > distP) {\n continue;\n }\n (0,_ResolveCollision_js__WEBPACK_IMPORTED_MODULE_3__.resolveCollision)(p1, p2, delta, container.retina.pixelRatio);\n }\n }\n isEnabled(particle) {\n return !!particle.options.collisions?.enable;\n }\n loadParticlesOptions(options, ...sources) {\n options.collisions ??= new _Options_Classes_Collisions_js__WEBPACK_IMPORTED_MODULE_2__.Collisions();\n for (const source of sources){\n options.collisions.load(source?.collisions);\n }\n }\n reset() {}\n}\n\n\n//# sourceURL=webpack://@tsparticles/interaction-particles-collisions/./dist/browser/Collider.js?\n}");
|
|
46
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Collider: () => (/* binding */ Collider)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _tsparticles_plugin_interactivity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tsparticles/plugin-interactivity */ \"@tsparticles/plugin-interactivity\");\n/* harmony import */ var _Options_Classes_Collisions_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Options/Classes/Collisions.js */ \"./dist/browser/Options/Classes/Collisions.js\");\n/* harmony import */ var _ResolveCollision_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ResolveCollision.js */ \"./dist/browser/ResolveCollision.js\");\n\n\n\n\nclass Collider extends _tsparticles_plugin_interactivity__WEBPACK_IMPORTED_MODULE_1__.ParticlesInteractorBase {\n maxDistance;\n constructor(container){\n super(container);\n this.maxDistance = 0;\n }\n clear() {}\n init() {}\n interact(p1, _interactivityData, delta) {\n if (p1.destroyed || p1.spawning) {\n return;\n }\n const container = this.container, pos1 = p1.getPosition(), radius1 = p1.getRadius(), query = container.particles.grid.queryCircle(pos1, radius1 * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.double);\n for (const p2 of query){\n if (p1 === p2 || p1.id >= p2.id || !p1.options.collisions?.enable || !p2.options.collisions?.enable || p1.options.collisions.mode !== p2.options.collisions.mode || p2.destroyed || p2.spawning) {\n continue;\n }\n const pos2 = p2.getPosition(), radius2 = p2.getRadius();\n if (Math.abs(Math.round(pos1.z) - Math.round(pos2.z)) > radius1 + radius2) {\n continue;\n }\n const dist = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getDistance)(pos1, pos2), distP = radius1 + radius2;\n if (dist > distP) {\n continue;\n }\n (0,_ResolveCollision_js__WEBPACK_IMPORTED_MODULE_3__.resolveCollision)(p1, p2, delta, container.retina.pixelRatio);\n }\n }\n isEnabled(particle) {\n return !!particle.options.collisions?.enable;\n }\n loadParticlesOptions(options, ...sources) {\n options.collisions ??= new _Options_Classes_Collisions_js__WEBPACK_IMPORTED_MODULE_2__.Collisions();\n for (const source of sources){\n options.collisions.load(source?.collisions);\n }\n }\n reset() {}\n}\n\n\n//# sourceURL=webpack://@tsparticles/interaction-particles-collisions/./dist/browser/Collider.js?\n}");
|
|
47
47
|
|
|
48
48
|
/***/ },
|
|
49
49
|
|
package/esm/Absorb.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { clamp
|
|
2
|
-
const
|
|
3
|
-
function updateAbsorb(p1,
|
|
1
|
+
import { clamp } from "@tsparticles/engine";
|
|
2
|
+
const minAbsorbAmount = 0;
|
|
3
|
+
function updateAbsorb(p1, r1, p2, r2, delta, pixelRatio) {
|
|
4
4
|
if (!p1.options.collisions || !p2.options.collisions) {
|
|
5
5
|
return;
|
|
6
6
|
}
|
|
7
|
-
const
|
|
8
|
-
p1.size.value
|
|
9
|
-
p2.size.value -=
|
|
10
|
-
if (
|
|
7
|
+
const absorbSpeed = p1.options.collisions.absorb.speed, shrinkAmount = clamp(absorbSpeed * delta.factor, minAbsorbAmount, r2);
|
|
8
|
+
p1.size.value = Math.sqrt(r1 * r1 + shrinkAmount * shrinkAmount);
|
|
9
|
+
p2.size.value -= shrinkAmount;
|
|
10
|
+
if (p2.size.value <= pixelRatio) {
|
|
11
11
|
p2.size.value = 0;
|
|
12
12
|
p2.destroy();
|
|
13
13
|
}
|
package/esm/Bounce.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { circleBounce, circleBounceDataFromParticle, getRangeValue } from "@tsparticles/engine";
|
|
2
|
-
const fixBounceSpeed = (p) => {
|
|
2
|
+
const energyCorrectionMinRatio = 1e-6, energyDriftThreshold = 1e-4, correctionFactorNeutral = 1, fixBounceSpeed = (p) => {
|
|
3
3
|
if (!p.options.collisions) {
|
|
4
4
|
return;
|
|
5
5
|
}
|
|
@@ -9,7 +9,16 @@ const fixBounceSpeed = (p) => {
|
|
|
9
9
|
}
|
|
10
10
|
};
|
|
11
11
|
export function bounce(p1, p2) {
|
|
12
|
+
const m1 = p1.getMass(), m2 = p2.getMass(), speed1Before = p1.velocity.length, speed2Before = p2.velocity.length, keBefore = m1 * speed1Before * speed1Before + m2 * speed2Before * speed2Before;
|
|
12
13
|
circleBounce(circleBounceDataFromParticle(p1), circleBounceDataFromParticle(p2));
|
|
14
|
+
const speed1After = p1.velocity.length, speed2After = p2.velocity.length, keAfter = m1 * speed1After * speed1After + m2 * speed2After * speed2After;
|
|
15
|
+
if (keAfter > keBefore * energyCorrectionMinRatio) {
|
|
16
|
+
const correctionFactor = Math.sqrt(keBefore / keAfter);
|
|
17
|
+
if (Math.abs(correctionFactor - correctionFactorNeutral) > energyDriftThreshold) {
|
|
18
|
+
p1.velocity.length = speed1After * correctionFactor;
|
|
19
|
+
p2.velocity.length = speed2After * correctionFactor;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
13
22
|
fixBounceSpeed(p1);
|
|
14
23
|
fixBounceSpeed(p2);
|
|
15
24
|
}
|
package/esm/Collider.js
CHANGED
|
@@ -19,7 +19,8 @@ export class Collider extends ParticlesInteractorBase {
|
|
|
19
19
|
const container = this.container, pos1 = p1.getPosition(), radius1 = p1.getRadius(), query = container.particles.grid.queryCircle(pos1, radius1 * double);
|
|
20
20
|
for (const p2 of query) {
|
|
21
21
|
if (p1 === p2 ||
|
|
22
|
-
|
|
22
|
+
p1.id >= p2.id ||
|
|
23
|
+
!p1.options.collisions?.enable ||
|
|
23
24
|
!p2.options.collisions?.enable ||
|
|
24
25
|
p1.options.collisions.mode !== p2.options.collisions.mode ||
|
|
25
26
|
p2.destroyed ||
|
package/esm/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export async function loadParticlesCollisionsInteraction(engine) {
|
|
2
|
-
engine.checkVersion("4.0.0-alpha.
|
|
2
|
+
engine.checkVersion("4.0.0-alpha.27");
|
|
3
3
|
await engine.register(async (e) => {
|
|
4
4
|
const [{ ensureInteractivityPluginLoaded }, { OverlapPlugin },] = await Promise.all([
|
|
5
5
|
import("@tsparticles/plugin-interactivity"),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsparticles/interaction-particles-collisions",
|
|
3
|
-
"version": "4.0.0-alpha.
|
|
3
|
+
"version": "4.0.0-alpha.27",
|
|
4
4
|
"description": "tsParticles collisions particles interaction",
|
|
5
5
|
"homepage": "https://particles.js.org",
|
|
6
6
|
"repository": {
|
|
@@ -87,8 +87,8 @@
|
|
|
87
87
|
"./package.json": "./package.json"
|
|
88
88
|
},
|
|
89
89
|
"dependencies": {
|
|
90
|
-
"@tsparticles/engine": "4.0.0-alpha.
|
|
91
|
-
"@tsparticles/plugin-interactivity": "4.0.0-alpha.
|
|
90
|
+
"@tsparticles/engine": "4.0.0-alpha.27",
|
|
91
|
+
"@tsparticles/plugin-interactivity": "4.0.0-alpha.27"
|
|
92
92
|
},
|
|
93
93
|
"publishConfig": {
|
|
94
94
|
"access": "public"
|
package/report.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8"/>
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
6
|
-
<title>@tsparticles/interaction-particles-collisions [
|
|
6
|
+
<title>@tsparticles/interaction-particles-collisions [9 Mar 2026 at 17:22]</title>
|
|
7
7
|
<link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABrVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+O1foceMD///+J0/qK1Pr7/v8Xdr/9///W8P4UdL7L7P0Scr2r4Pyj3vwad8D5/f/2/f+55f3E6f34+/2H0/ojfMKpzOd0rNgQcb3F3O/j9f7c8v6g3Pz0/P/w+v/q+P7n9v6T1/uQ1vuE0vqLut/y+v+Z2fvt+f+15Pzv9fuc2/vR7v2V2Pvd6/bg9P7I6/285/2y4/yp3/zp8vk8i8kqgMT7/P31+fyv4vxGkcz6/P6/6P3j7vfS5PNnpNUxhcbO7f7F6v3O4vHK3/DA2u631Ouy0eqXweKJud5wqthfoNMMbLvY8f73+v2dxeR8sNtTmdDx9/zX6PSjyeaCtd1YnNGX2PuQveCGt95Nls42h8dLlM3F4vBtAAAAM3RSTlMAAyOx0/sKBvik8opWGBMOAe3l1snDm2E9LSb06eHcu5JpHbarfHZCN9CBb08zzkdNS0kYaptYAAAFV0lEQVRYw92X51/aYBDHHS2O2qqttVbrqNq9m+TJIAYIShBkWwqIiCgoWvfeq7Z2/s29hyQNyUcR7LveGwVyXy6XH8/9rqxglLfUPLxVduUor3h0rfp2TYvpivk37929TkG037hffoX0+peVtZQc1589rigVUdXS/ABSAyEmGIO/1XfvldSK8vs3OqB6u3m0nxmIrvgB0dj7rr7Y9IbuF68hnfFaiHA/sxqm0wciIG43P60qKv9WXWc1RXGh/mFESFABTSBi0sNAKzqet17eCtOb3kZIDwxEEU0oAIJGYxNBDhBND29e0rtXXbcpuPmED9IhEAAQ/AXEaF8EPmnrrKsv0LvWR3fg5sWDNAFZOgAgaKvZDogHNU9MFwnnYROkc56RD5CjAbQX9Ow4g7upCsvYu55aSI/Nj0H1akgKQEUM94dwK65hYRmFU9MIcH/fqJYOZYcnuJSU/waKDgTOEVaVKhwrTRP5XzgSpAITYzom7UvkhFX5VutmxeNnWDjjswTKTyfgluNDGbUpWissXhF3s7mlSml+czWkg3D0l1nNjGNjz3myOQOa1KM/jOS6ebdbAVTCi4gljHSFrviza7tOgRWcS0MOUX9zdNgag5w7rRqA44Lzw0hr1WqES36dFliSJFlh2rXIae3FFcDDgKdxrUIDePr8jGcSClV1u7A9xeN0ModY/pHMxmR1EzRh8TJiwqsHmKW0l4FCEZI+jHio+JdPPE9qwQtTRxku2D8sIeRL2LnxWSllANCQGOIiqVHAz2ye2JR0DcH+HoxDkaADLjgxjKQ+AwCX/g0+DNgdG0ukYCONAe+dbc2IAc6fwt1ARoDSezNHxV2Cmzwv3O6lDMV55edBGwGK9n1+x2F8EDfAGCxug8MhpsMEcTEAWf3rx2vZhe/LAmtIn/6apE6PN0ULKgywD9mmdxbmFl3OvD5AS5fW5zLbv/YHmcsBTjf/afDz3MaZTVCfAP9z6/Bw6ycv8EUBWJIn9zYcoAWWlW9+OzO3vkTy8H+RANLmdrpOuYWdZYEXpo+TlCJrW5EARb7fF+bWdqf3hhyZI1nWJQHgznErZhbjoEsWqi8dQNoE294aldzFurwSABL2XXMf9+H1VQGke9exw5P/AnA5Pv5ngMul7LOvO922iwACu8WkCwLCafvM4CeWPxfA8lNHcWZSoi8EwMAIciKX2Z4SWCMAa3snCZ/G4EA8D6CMLNFsGQhkkz/gQNEBbPCbWsxGUpYVu3z8IyNAknwJkfPMEhLyrdi5RTyUVACkw4GSFRNWJNEW+fgPGwHD8/JxnRuLabN4CGNRkAE23na2+VmEAUmrYymSGjMAYqH84YUIyzgzs3XC7gNgH36Vcc4zKY9o9fgPBXUAiHHwVboBHGLiX6Zcjp1f2wu4tvzZKo0ecPnDtQYDQvJXaBeNzce45Fp28ZQLrEZVuFqgBwOalArKXnW1UzlnSusQKJqKYNuz4tOnI6sZG4zanpemv+7ySU2jbA9h6uhcgpfy6G2PahirDZ6zvq6zDduMVFTKvzw8wgyEdelwY9in3XkEPs3osJuwRQ4qTkfzifndg9Gfc4pdsu82+tTnHZTBa2EAMrqr2t43pguc8tNm7JQVQ2S0ukj2d22dhXYP0/veWtwKrCkNoNimAN5+Xr/oLrxswKbVJjteWrX7eR63o4j9q0GxnaBdWgGA5VStpanIjQmEhV0/nVt5VOFUvix6awJhPcAaTEShgrG+iGyvb5a0Ndb1YGHFPEwoqAinoaykaID1o1pdPNu7XsnCKQ3R+hwWIIhGvORcJUBYXe3Xa3vq/mF/N9V13ugufMkfXn+KHsRD0B8AAAAASUVORK5CYII=" type="image/x-icon" />
|
|
8
8
|
|
|
9
9
|
<script>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Demo / Generator : https://particles.js.org/
|
|
5
5
|
* GitHub : https://www.github.com/matteobruni/tsparticles
|
|
6
6
|
* How to use? : Check the GitHub README
|
|
7
|
-
* v4.0.0-alpha.
|
|
7
|
+
* v4.0.0-alpha.27
|
|
8
8
|
*/
|
|
9
9
|
/*
|
|
10
10
|
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
|
|
@@ -54,7 +54,7 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__tsparticles_plugin_interactivity__;
|
|
|
54
54
|
\*******************************/
|
|
55
55
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
56
56
|
|
|
57
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ loadParticlesCollisionsInteraction: () => (/* binding */ loadParticlesCollisionsInteraction)\n/* harmony export */ });\nasync function loadParticlesCollisionsInteraction(engine) {\n engine.checkVersion(\"4.0.0-alpha.
|
|
57
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ loadParticlesCollisionsInteraction: () => (/* binding */ loadParticlesCollisionsInteraction)\n/* harmony export */ });\nasync function loadParticlesCollisionsInteraction(engine) {\n engine.checkVersion(\"4.0.0-alpha.27\");\n await engine.register(async (e)=>{\n const [{ ensureInteractivityPluginLoaded }, { OverlapPlugin }] = await Promise.all([\n Promise.resolve(/*! import() */).then(__webpack_require__.t.bind(__webpack_require__, /*! @tsparticles/plugin-interactivity */ \"@tsparticles/plugin-interactivity\", 19)),\n __webpack_require__.e(/*! import() */ \"dist_browser_OverlapPlugin_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./OverlapPlugin.js */ \"./dist/browser/OverlapPlugin.js\"))\n ]);\n ensureInteractivityPluginLoaded(e);\n e.addPlugin(new OverlapPlugin());\n e.addInteractor?.(\"particlesCollisions\", async (container)=>{\n const { Collider } = await __webpack_require__.e(/*! import() */ \"dist_browser_Collider_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./Collider.js */ \"./dist/browser/Collider.js\"));\n return new Collider(container);\n });\n });\n}\n\n\n//# sourceURL=webpack://@tsparticles/interaction-particles-collisions/./dist/browser/index.js?\n}");
|
|
58
58
|
|
|
59
59
|
/***/ }
|
|
60
60
|
|
|
@@ -70,12 +70,6 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
70
70
|
/******/ if (cachedModule !== undefined) {
|
|
71
71
|
/******/ return cachedModule.exports;
|
|
72
72
|
/******/ }
|
|
73
|
-
/******/ // Check if module exists (development only)
|
|
74
|
-
/******/ if (__webpack_modules__[moduleId] === undefined) {
|
|
75
|
-
/******/ var e = new Error("Cannot find module '" + moduleId + "'");
|
|
76
|
-
/******/ e.code = 'MODULE_NOT_FOUND';
|
|
77
|
-
/******/ throw e;
|
|
78
|
-
/******/ }
|
|
79
73
|
/******/ // Create a new module (and put it into the cache)
|
|
80
74
|
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
81
75
|
/******/ // no module.id needed
|
|
@@ -84,6 +78,12 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
84
78
|
/******/ };
|
|
85
79
|
/******/
|
|
86
80
|
/******/ // Execute the module function
|
|
81
|
+
/******/ if (!(moduleId in __webpack_modules__)) {
|
|
82
|
+
/******/ delete __webpack_module_cache__[moduleId];
|
|
83
|
+
/******/ var e = new Error("Cannot find module '" + moduleId + "'");
|
|
84
|
+
/******/ e.code = 'MODULE_NOT_FOUND';
|
|
85
|
+
/******/ throw e;
|
|
86
|
+
/******/ }
|
|
87
87
|
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
88
88
|
/******/
|
|
89
89
|
/******/ // Return the exports of the module
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("@tsparticles/plugin-interactivity"),require("@tsparticles/engine"));else if("function"==typeof define&&define.amd)define(["@tsparticles/plugin-interactivity","@tsparticles/engine"],t);else{var r="object"==typeof exports?t(require("@tsparticles/plugin-interactivity"),require("@tsparticles/engine")):t(e.window,e.window);for(var i in r)("object"==typeof exports?exports:e)[i]=r[i]}}(this,(e,t)=>(()=>{"use strict";var r,i,o,n={303(e){e.exports=t},702(t){t.exports=e}},a={};function s(e){var t=a[e];if(void 0!==t)return t.exports;var r=a[e]={exports:{}};return n[e](r,r.exports,s),r.exports}s.m=n,l=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,s.t=function(e,t){if(1&t&&(e=this(e)),8&t||"object"==typeof e&&e&&(4&t&&e.__esModule||16&t&&"function"==typeof e.then))return e;var r=Object.create(null);s.r(r);var i={};c=c||[null,l({}),l([]),l(l)];for(var o=2&t&&e;("object"==typeof o||"function"==typeof o)&&!~c.indexOf(o);o=l(o))Object.getOwnPropertyNames(o).forEach(t=>i[t]=()=>e[t]);return i.default=()=>e,s.d(r,i),r},s.d=(e,t)=>{for(var r in t)s.o(t,r)&&!s.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce((t,r)=>(s.f[r](e,t),t),[])),s.u=e=>""+e+".min.js",s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),p={},s.l=(e,t,r,i)=>{if(p[e])return void p[e].push(t);if(void 0!==r)for(var o,n,a=document.getElementsByTagName("script"),c=0;c<a.length;c++){var l=a[c];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")=="@tsparticles/interaction-particles-collisions:"+r){o=l;break}}o||(n=!0,(o=document.createElement("script")).charset="utf-8",s.nc&&o.setAttribute("nonce",s.nc),o.setAttribute("data-webpack","@tsparticles/interaction-particles-collisions:"+r),o.src=e),p[e]=[t];var u=(t,r)=>{o.onerror=o.onload=null,clearTimeout(d);var i=p[e];if(delete p[e],o.parentNode&&o.parentNode.removeChild(o),i&&i.forEach(e=>e(r)),t)return t(r)},d=setTimeout(u.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=u.bind(null,o.onerror),o.onload=u.bind(null,o.onload),n&&document.head.appendChild(o)},s.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.g.importScripts&&(u=s.g.location+"");var c,l,p,u,d=s.g.document;if(!u&&d&&(d.currentScript&&"SCRIPT"===d.currentScript.tagName.toUpperCase()&&(u=d.currentScript.src),!u)){var f=d.getElementsByTagName("script");if(f.length)for(var b=f.length-1;b>-1&&(!u||!/^http(s?):/.test(u));)u=f[b--].src}if(!u)throw Error("Automatic publicPath is not supported in this browser");s.p=u=u.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),r={459:0},s.f.j=(e,t)=>{var i=s.o(r,e)?r[e]:void 0;if(0!==i)if(i)t.push(i[2]);else{var o=new Promise((t,o)=>i=r[e]=[t,o]);t.push(i[2]=o);var n=s.p+s.u(e),a=Error();s.l(n,t=>{if(s.o(r,e)&&(0!==(i=r[e])&&(r[e]=void 0),i)){var o=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;a.message="Loading chunk "+e+` failed.
|
|
2
|
-
(`+o+": "+n+")",a.name="ChunkLoadError",a.type=o,a.request=n,i[1](a)}},"chunk-"+e,e)}},i=(e,t)=>{var i,o,[n,a,c]=t,l=0;if(n.some(e=>0!==r[e])){for(i in a)s.o(a,i)&&(s.m[i]=a[i]);c&&c(s)}for(e&&e(t);l<n.length;l++)o=n[l],s.o(r,o)&&r[o]&&r[o][0](),r[o]=0},(o=this.webpackChunk_tsparticles_interaction_particles_collisions=this.webpackChunk_tsparticles_interaction_particles_collisions||[]).forEach(i.bind(null,0)),o.push=i.bind(null,o.push.bind(o));var h={};async function g(e){e.checkVersion("4.0.0-alpha.
|
|
2
|
+
(`+o+": "+n+")",a.name="ChunkLoadError",a.type=o,a.request=n,i[1](a)}},"chunk-"+e,e)}},i=(e,t)=>{var i,o,[n,a,c]=t,l=0;if(n.some(e=>0!==r[e])){for(i in a)s.o(a,i)&&(s.m[i]=a[i]);c&&c(s)}for(e&&e(t);l<n.length;l++)o=n[l],s.o(r,o)&&r[o]&&r[o][0](),r[o]=0},(o=this.webpackChunk_tsparticles_interaction_particles_collisions=this.webpackChunk_tsparticles_interaction_particles_collisions||[]).forEach(i.bind(null,0)),o.push=i.bind(null,o.push.bind(o));var h={};async function g(e){e.checkVersion("4.0.0-alpha.27"),await e.register(async e=>{let[{ensureInteractivityPluginLoaded:t},{OverlapPlugin:r}]=await Promise.all([Promise.resolve().then(s.t.bind(s,702,19)),s.e(235).then(s.bind(s,235))]);t(e),e.addPlugin(new r),e.addInteractor?.("particlesCollisions",async e=>{let{Collider:t}=await s.e(224).then(s.bind(s,224));return new t(e)})})}return s.r(h),s.d(h,{loadParticlesCollisionsInteraction:()=>g}),h})());
|
package/umd/Absorb.js
CHANGED
|
@@ -11,15 +11,15 @@
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.absorb = absorb;
|
|
13
13
|
const engine_1 = require("@tsparticles/engine");
|
|
14
|
-
const
|
|
15
|
-
function updateAbsorb(p1,
|
|
14
|
+
const minAbsorbAmount = 0;
|
|
15
|
+
function updateAbsorb(p1, r1, p2, r2, delta, pixelRatio) {
|
|
16
16
|
if (!p1.options.collisions || !p2.options.collisions) {
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
|
-
const
|
|
20
|
-
p1.size.value
|
|
21
|
-
p2.size.value -=
|
|
22
|
-
if (
|
|
19
|
+
const absorbSpeed = p1.options.collisions.absorb.speed, shrinkAmount = (0, engine_1.clamp)(absorbSpeed * delta.factor, minAbsorbAmount, r2);
|
|
20
|
+
p1.size.value = Math.sqrt(r1 * r1 + shrinkAmount * shrinkAmount);
|
|
21
|
+
p2.size.value -= shrinkAmount;
|
|
22
|
+
if (p2.size.value <= pixelRatio) {
|
|
23
23
|
p2.size.value = 0;
|
|
24
24
|
p2.destroy();
|
|
25
25
|
}
|
package/umd/Bounce.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.bounce = bounce;
|
|
13
13
|
const engine_1 = require("@tsparticles/engine");
|
|
14
|
-
const fixBounceSpeed = (p) => {
|
|
14
|
+
const energyCorrectionMinRatio = 1e-6, energyDriftThreshold = 1e-4, correctionFactorNeutral = 1, fixBounceSpeed = (p) => {
|
|
15
15
|
if (!p.options.collisions) {
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
@@ -21,7 +21,16 @@
|
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
function bounce(p1, p2) {
|
|
24
|
+
const m1 = p1.getMass(), m2 = p2.getMass(), speed1Before = p1.velocity.length, speed2Before = p2.velocity.length, keBefore = m1 * speed1Before * speed1Before + m2 * speed2Before * speed2Before;
|
|
24
25
|
(0, engine_1.circleBounce)((0, engine_1.circleBounceDataFromParticle)(p1), (0, engine_1.circleBounceDataFromParticle)(p2));
|
|
26
|
+
const speed1After = p1.velocity.length, speed2After = p2.velocity.length, keAfter = m1 * speed1After * speed1After + m2 * speed2After * speed2After;
|
|
27
|
+
if (keAfter > keBefore * energyCorrectionMinRatio) {
|
|
28
|
+
const correctionFactor = Math.sqrt(keBefore / keAfter);
|
|
29
|
+
if (Math.abs(correctionFactor - correctionFactorNeutral) > energyDriftThreshold) {
|
|
30
|
+
p1.velocity.length = speed1After * correctionFactor;
|
|
31
|
+
p2.velocity.length = speed2After * correctionFactor;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
25
34
|
fixBounceSpeed(p1);
|
|
26
35
|
fixBounceSpeed(p2);
|
|
27
36
|
}
|
package/umd/Collider.js
CHANGED
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
const container = this.container, pos1 = p1.getPosition(), radius1 = p1.getRadius(), query = container.particles.grid.queryCircle(pos1, radius1 * engine_1.double);
|
|
32
32
|
for (const p2 of query) {
|
|
33
33
|
if (p1 === p2 ||
|
|
34
|
-
|
|
34
|
+
p1.id >= p2.id ||
|
|
35
|
+
!p1.options.collisions?.enable ||
|
|
35
36
|
!p2.options.collisions?.enable ||
|
|
36
37
|
p1.options.collisions.mode !== p2.options.collisions.mode ||
|
|
37
38
|
p2.destroyed ||
|
package/umd/index.js
CHANGED
|
@@ -45,7 +45,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
46
|
exports.loadParticlesCollisionsInteraction = loadParticlesCollisionsInteraction;
|
|
47
47
|
async function loadParticlesCollisionsInteraction(engine) {
|
|
48
|
-
engine.checkVersion("4.0.0-alpha.
|
|
48
|
+
engine.checkVersion("4.0.0-alpha.27");
|
|
49
49
|
await engine.register(async (e) => {
|
|
50
50
|
const [{ ensureInteractivityPluginLoaded }, { OverlapPlugin },] = await Promise.all([
|
|
51
51
|
__syncRequire ? Promise.resolve().then(() => __importStar(require("@tsparticles/plugin-interactivity"))) : new Promise((resolve_1, reject_1) => { require(["@tsparticles/plugin-interactivity"], resolve_1, reject_1); }).then(__importStar),
|
package/61.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(this.webpackChunk_tsparticles_interaction_particles_collisions=this.webpackChunk_tsparticles_interaction_particles_collisions||[]).push([[61],{61(e,s,o){o.d(s,{Collider:()=>p});var i,t,l=o(303),a=o(702);(i=t||(t={})).absorb="absorb",i.bounce="bounce",i.destroy="destroy";class n{speed;constructor(){this.speed=2}load(e){(0,l.isNull)(e)||void 0!==e.speed&&(this.speed=e.speed)}}class r{enable;retries;constructor(){this.enable=!0,this.retries=0}load(e){(0,l.isNull)(e)||(void 0!==e.enable&&(this.enable=e.enable),void 0!==e.retries&&(this.retries=e.retries))}}class c{absorb;bounce;enable;maxSpeed;mode;overlap;constructor(){this.absorb=new n,this.bounce=new l.ParticlesBounce,this.enable=!1,this.maxSpeed=50,this.mode=t.bounce,this.overlap=new r}load(e){(0,l.isNull)(e)||(this.absorb.load(e.absorb),this.bounce.load(e.bounce),void 0!==e.enable&&(this.enable=e.enable),void 0!==e.maxSpeed&&(this.maxSpeed=(0,l.setRangeValue)(e.maxSpeed)),void 0!==e.mode&&(this.mode=e.mode),this.overlap.load(e.overlap))}}function d(e,s,o,i,t,a){if(!e.options.collisions||!o.options.collisions)return;let n=(0,l.clamp)(e.options.collisions.absorb.speed*t.factor/10,0,i);e.size.value+=n*l.half,o.size.value-=n,i<=a&&(o.size.value=0,o.destroy())}let u=e=>{e.options.collisions&&(e.collisionMaxSpeed??=(0,l.getRangeValue)(e.options.collisions.maxSpeed),e.velocity.length>e.collisionMaxSpeed&&(e.velocity.length=e.collisionMaxSpeed))};function b(e,s){(0,l.circleBounce)((0,l.circleBounceDataFromParticle)(e),(0,l.circleBounceDataFromParticle)(s)),u(e),u(s)}class p extends a.ParticlesInteractorBase{maxDistance;constructor(e){super(e),this.maxDistance=0}clear(){}init(){}interact(e,s,o){if(e.destroyed||e.spawning)return;let i=this.container,a=e.getPosition(),n=e.getRadius();for(let s of i.particles.grid.queryCircle(a,n*l.double)){if(e===s||!e.options.collisions||!s.options.collisions?.enable||e.options.collisions.mode!==s.options.collisions.mode||s.destroyed||s.spawning)continue;let r=s.getPosition(),c=s.getRadius();if(!(Math.abs(Math.round(a.z)-Math.round(r.z))>n+c))(0,l.getDistance)(a,r)>n+c||function(e,s,o,i){if(e.options.collisions&&s.options.collisions)switch(e.options.collisions.mode){case t.absorb:let l,a;l=e.getRadius(),a=s.getRadius(),!l&&a?e.destroy():l&&!a?s.destroy():l&&a&&(l>=a?d(e,l,s,a,o,i):d(s,a,e,l,o,i));break;case t.bounce:b(e,s);break;case t.destroy:let n,r;e.unbreakable||s.unbreakable||b(e,s),n=e.getRadius(),r=s.getRadius(),!n&&r?e.destroy():n&&!r?s.destroy():n&&r&&(e.getRadius()>=s.getRadius()?s:e).destroy()}}(e,s,o,i.retina.pixelRatio)}}isEnabled(e){return!!e.options.collisions?.enable}loadParticlesOptions(e,...s){for(let o of(e.collisions??=new c,s))e.collisions.load(o?.collisions)}reset(){}}}}]);
|