@tsparticles/plugin-absorbers 4.0.0-alpha.8 → 4.0.0-beta.1
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/122.min.js +1 -0
- package/285.min.js +1 -0
- package/677.min.js +1 -0
- package/698.min.js +1 -0
- package/998.min.js +1 -0
- package/README.md +5 -0
- package/browser/AbsorberInstance.js +126 -59
- package/browser/AbsorbersInstancesManager.js +5 -3
- package/browser/AbsorbersInteractor.js +11 -6
- package/browser/AbsorbersPlugin.js +2 -1
- package/browser/AbsorbersPluginInstance.js +2 -0
- package/browser/Options/Classes/Absorber.js +14 -0
- package/browser/Options/Classes/AbsorberLife.js +27 -0
- package/browser/Options/Classes/AbsorberSize.js +2 -0
- package/browser/Options/Classes/AbsorberSizeLimit.js +2 -0
- package/browser/Options/Interfaces/IAbsorberLife.js +1 -0
- package/browser/index.js +10 -6
- package/cjs/AbsorberInstance.js +126 -59
- package/cjs/AbsorbersInstancesManager.js +5 -3
- package/cjs/AbsorbersInteractor.js +11 -6
- package/cjs/AbsorbersPlugin.js +2 -1
- package/cjs/AbsorbersPluginInstance.js +2 -0
- package/cjs/Options/Classes/Absorber.js +14 -0
- package/cjs/Options/Classes/AbsorberLife.js +27 -0
- package/cjs/Options/Classes/AbsorberSize.js +2 -0
- package/cjs/Options/Classes/AbsorberSizeLimit.js +2 -0
- package/cjs/Options/Interfaces/IAbsorberLife.js +1 -0
- package/cjs/index.js +10 -6
- package/dist_browser_AbsorberInstance_js.js +15 -5
- package/dist_browser_AbsorbersInstancesManager_js.js +2 -2
- package/dist_browser_AbsorbersInteractor_js.js +15 -5
- package/dist_browser_AbsorbersPluginInstance_js.js +2 -2
- package/dist_browser_AbsorbersPlugin_js.js +15 -5
- package/esm/AbsorberInstance.js +126 -59
- package/esm/AbsorbersInstancesManager.js +5 -3
- package/esm/AbsorbersInteractor.js +11 -6
- package/esm/AbsorbersPlugin.js +2 -1
- package/esm/AbsorbersPluginInstance.js +2 -0
- package/esm/Options/Classes/Absorber.js +14 -0
- package/esm/Options/Classes/AbsorberLife.js +27 -0
- package/esm/Options/Classes/AbsorberSize.js +2 -0
- package/esm/Options/Classes/AbsorberSizeLimit.js +2 -0
- package/esm/Options/Interfaces/IAbsorberLife.js +1 -0
- package/esm/index.js +10 -6
- package/package.json +3 -3
- package/report.html +84 -29
- package/tsparticles.plugin.absorbers.js +31 -19
- package/tsparticles.plugin.absorbers.min.js +2 -2
- package/types/AbsorberInstance.d.ts +14 -4
- package/types/AbsorbersInstancesManager.d.ts +3 -3
- package/types/AbsorbersInteractor.d.ts +3 -2
- package/types/AbsorbersPlugin.d.ts +1 -1
- package/types/AbsorbersPluginInstance.d.ts +2 -2
- package/types/Options/Classes/Absorber.d.ts +2 -0
- package/types/Options/Classes/AbsorberLife.d.ts +10 -0
- package/types/Options/Interfaces/IAbsorber.d.ts +2 -0
- package/types/Options/Interfaces/IAbsorberLife.d.ts +7 -0
- package/umd/AbsorberInstance.js +125 -58
- package/umd/AbsorbersInstancesManager.js +5 -3
- package/umd/AbsorbersInteractor.js +11 -6
- package/umd/AbsorbersPlugin.js +2 -1
- package/umd/AbsorbersPluginInstance.js +2 -0
- package/umd/Options/Classes/Absorber.js +15 -1
- package/umd/Options/Classes/AbsorberLife.js +41 -0
- package/umd/Options/Classes/AbsorberSize.js +2 -0
- package/umd/Options/Classes/AbsorberSizeLimit.js +2 -0
- package/umd/Options/Interfaces/IAbsorberLife.js +12 -0
- package/umd/index.js +10 -6
- package/215.min.js +0 -2
- package/215.min.js.LICENSE.txt +0 -1
- package/384.min.js +0 -2
- package/384.min.js.LICENSE.txt +0 -1
- package/688.min.js +0 -2
- package/688.min.js.LICENSE.txt +0 -1
- package/903.min.js +0 -2
- package/903.min.js.LICENSE.txt +0 -1
- package/980.min.js +0 -2
- package/980.min.js.LICENSE.txt +0 -1
- package/tsparticles.plugin.absorbers.min.js.LICENSE.txt +0 -1
|
@@ -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-
|
|
7
|
+
* v4.0.0-beta.1
|
|
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 */ AbsorbersInteractor: () => (/* binding */ AbsorbersInteractor)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_plugin_interactivity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/plugin-interactivity */ \"@tsparticles/plugin-interactivity\");\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Options/Classes/Absorber.js */ \"./dist/browser/Options/Classes/Absorber.js\");\n\n\n\nconst absorbersMode = \"absorbers\";\nclass AbsorbersInteractor extends _tsparticles_plugin_interactivity__WEBPACK_IMPORTED_MODULE_0__.ExternalInteractorBase {\n
|
|
26
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorbersInteractor: () => (/* binding */ AbsorbersInteractor)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_plugin_interactivity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/plugin-interactivity */ \"@tsparticles/plugin-interactivity\");\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Options/Classes/Absorber.js */ \"./dist/browser/Options/Classes/Absorber.js\");\n\n\n\nconst absorbersMode = \"absorbers\";\nclass AbsorbersInteractor extends _tsparticles_plugin_interactivity__WEBPACK_IMPORTED_MODULE_0__.ExternalInteractorBase {\n handleClickMode;\n maxDistance;\n _dragging = false;\n _draggingAbsorber;\n _instancesManager;\n constructor(container, instancesManager){\n super(container);\n this.maxDistance = 0;\n this._instancesManager = instancesManager;\n this._instancesManager.initContainer(container);\n this.handleClickMode = (mode, interactivityData)=>{\n const container = this.container, options = container.actualOptions, absorbers = options.interactivity.modes.absorbers;\n if (!absorbers || mode !== absorbersMode) {\n return;\n }\n const { clickPosition } = interactivityData.mouse;\n if (clickPosition) {\n const existingAbsorber = instancesManager.getArray(this.container).some((t)=>(0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_1__.getDistance)(t.position, clickPosition) < t.size);\n if (existingAbsorber) {\n return;\n }\n }\n const absorbersModeOptions = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_1__.itemFromArray)(absorbers) ?? new _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_2__.Absorber();\n void this._instancesManager.addAbsorber(container, absorbersModeOptions, clickPosition);\n };\n }\n clear() {}\n init() {}\n interact(interactivityData, delta) {\n for (const particle of this.container.particles.filter((p)=>this.isEnabled(interactivityData, p))){\n for (const absorber of this._instancesManager.getArray(this.container)){\n if (absorber.options.draggable) {\n const mouse = interactivityData.mouse;\n if (mouse.clicking && mouse.downPosition) {\n const mouseDist = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_1__.getDistance)(absorber.position, mouse.downPosition);\n if (mouseDist <= absorber.size) {\n this._dragging = true;\n this._draggingAbsorber = absorber;\n }\n } else {\n this._dragging = false;\n this._draggingAbsorber = undefined;\n }\n if (this._dragging && this._draggingAbsorber == absorber && mouse.position) {\n absorber.position.x = mouse.position.x;\n absorber.position.y = mouse.position.y;\n }\n }\n absorber.attract(particle, delta);\n if (particle.destroyed) {\n break;\n }\n }\n }\n }\n isEnabled(interactivityData, particle) {\n const container = this.container, options = container.actualOptions, mouse = interactivityData.mouse, events = (particle?.interactivity ?? options.interactivity).events;\n if (!mouse.clickPosition || !events.onClick.enable) {\n return false;\n }\n return (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_1__.isInArray)(absorbersMode, events.onClick.mode);\n }\n loadModeOptions(options, ...sources) {\n options.absorbers ??= [];\n for (const source of sources){\n if (!source) {\n continue;\n }\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_1__.isArray)(source.absorbers)) {\n for (const absorber of source.absorbers){\n const tmp = new _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_2__.Absorber();\n tmp.load(absorber);\n options.absorbers.push(tmp);\n }\n } else {\n const tmp = new _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_2__.Absorber();\n tmp.load(source.absorbers);\n options.absorbers.push(tmp);\n }\n }\n }\n reset() {}\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/AbsorbersInteractor.js?\n}");
|
|
27
27
|
|
|
28
28
|
/***/ },
|
|
29
29
|
|
|
@@ -33,7 +33,17 @@ 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 */ Absorber: () => (/* binding */ Absorber)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var
|
|
36
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Absorber: () => (/* binding */ Absorber)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _AbsorberLife_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberLife.js */ \"./dist/browser/Options/Classes/AbsorberLife.js\");\n/* harmony import */ var _AbsorberSize_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbsorberSize.js */ \"./dist/browser/Options/Classes/AbsorberSize.js\");\n\n\n\nclass Absorber {\n color;\n destroy;\n draggable;\n life;\n name;\n opacity;\n orbits;\n position;\n size;\n constructor(){\n this.color = new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.OptionsColor();\n this.color.value = \"#000000\";\n this.draggable = false;\n this.opacity = 1;\n this.destroy = true;\n this.orbits = false;\n this.life = new _AbsorberLife_js__WEBPACK_IMPORTED_MODULE_1__.AbsorberLife();\n this.size = new _AbsorberSize_js__WEBPACK_IMPORTED_MODULE_2__.AbsorberSize();\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n if (data.color !== undefined) {\n this.color = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.OptionsColor.create(this.color, data.color);\n }\n if (data.draggable !== undefined) {\n this.draggable = data.draggable;\n }\n if (data.life !== undefined) {\n this.life.load(data.life);\n }\n this.name = data.name;\n if (data.opacity !== undefined) {\n this.opacity = data.opacity;\n }\n if (data.position !== undefined) {\n this.position = {};\n if (data.position.x !== undefined) {\n this.position.x = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.position.x);\n }\n if (data.position.y !== undefined) {\n this.position.y = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.position.y);\n }\n }\n if (data.size !== undefined) {\n this.size.load(data.size);\n }\n if (data.destroy !== undefined) {\n this.destroy = data.destroy;\n }\n if (data.orbits !== undefined) {\n this.orbits = data.orbits;\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/Absorber.js?\n}");
|
|
37
|
+
|
|
38
|
+
/***/ },
|
|
39
|
+
|
|
40
|
+
/***/ "./dist/browser/Options/Classes/AbsorberLife.js"
|
|
41
|
+
/*!******************************************************!*\
|
|
42
|
+
!*** ./dist/browser/Options/Classes/AbsorberLife.js ***!
|
|
43
|
+
\******************************************************/
|
|
44
|
+
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
45
|
+
|
|
46
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberLife: () => (/* binding */ AbsorberLife)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nclass AbsorberLife {\n count;\n delay;\n duration;\n wait;\n constructor(){\n this.wait = false;\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n if (data.count !== undefined) {\n this.count = data.count;\n }\n if (data.delay !== undefined) {\n this.delay = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.delay);\n }\n if (data.duration !== undefined) {\n this.duration = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.duration);\n }\n if (data.wait !== undefined) {\n this.wait = data.wait;\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberLife.js?\n}");
|
|
37
47
|
|
|
38
48
|
/***/ },
|
|
39
49
|
|
|
@@ -43,7 +53,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
43
53
|
\******************************************************/
|
|
44
54
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
45
55
|
|
|
46
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSize: () => (/* binding */ AbsorberSize)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberSizeLimit.js */ \"./dist/browser/Options/Classes/AbsorberSizeLimit.js\");\n\n\nclass AbsorberSize extends _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.ValueWithRandom {\n
|
|
56
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSize: () => (/* binding */ AbsorberSize)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberSizeLimit.js */ \"./dist/browser/Options/Classes/AbsorberSizeLimit.js\");\n\n\nclass AbsorberSize extends _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.ValueWithRandom {\n density;\n limit;\n constructor(){\n super();\n this.density = 5;\n this.value = 50;\n this.limit = new _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__.AbsorberSizeLimit();\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n super.load(data);\n if (data.density !== undefined) {\n this.density = data.density;\n }\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNumber)(data.limit)) {\n this.limit.radius = data.limit;\n } else {\n this.limit.load(data.limit);\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberSize.js?\n}");
|
|
47
57
|
|
|
48
58
|
/***/ },
|
|
49
59
|
|
|
@@ -53,7 +63,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
53
63
|
\***********************************************************/
|
|
54
64
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
55
65
|
|
|
56
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSizeLimit: () => (/* binding */ AbsorberSizeLimit)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nclass AbsorberSizeLimit {\n
|
|
66
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSizeLimit: () => (/* binding */ AbsorberSizeLimit)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nclass AbsorberSizeLimit {\n mass;\n radius;\n constructor(){\n this.radius = 0;\n this.mass = 0;\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n if (data.mass !== undefined) {\n this.mass = data.mass;\n }\n if (data.radius !== undefined) {\n this.radius = data.radius;\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberSizeLimit.js?\n}");
|
|
57
67
|
|
|
58
68
|
/***/ }
|
|
59
69
|
|
|
@@ -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-
|
|
7
|
+
* v4.0.0-beta.1
|
|
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 */ AbsorbersPluginInstance: () => (/* binding */ AbsorbersPluginInstance)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nclass AbsorbersPluginInstance {\n
|
|
26
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorbersPluginInstance: () => (/* binding */ AbsorbersPluginInstance)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nclass AbsorbersPluginInstance {\n _container;\n _instancesManager;\n constructor(container, instancesManager){\n this._container = container;\n this._instancesManager = instancesManager;\n this._instancesManager.initContainer(container);\n }\n draw(context) {\n for (const absorber of this._instancesManager.getArray(this._container)){\n absorber.draw(context);\n }\n }\n async init() {\n const absorbers = this._container.actualOptions.absorbers, promises = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.executeOnSingleOrMultiple)(absorbers, async (absorber)=>{\n await this._instancesManager.addAbsorber(this._container, absorber);\n });\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isArray)(promises)) {\n await Promise.all(promises);\n } else {\n await promises;\n }\n }\n particleUpdate(particle, delta) {\n for (const absorber of this._instancesManager.getArray(this._container)){\n absorber.attract(particle, delta);\n if (particle.destroyed) {\n break;\n }\n }\n }\n resize() {\n for (const absorber of this._instancesManager.getArray(this._container)){\n absorber.resize();\n }\n }\n stop() {\n this._instancesManager.clear(this._container);\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/AbsorbersPluginInstance.js?\n}");
|
|
27
27
|
|
|
28
28
|
/***/ }
|
|
29
29
|
|
|
@@ -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-
|
|
7
|
+
* v4.0.0-beta.1
|
|
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 */ AbsorbersPlugin: () => (/* binding */ AbsorbersPlugin)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Absorber.js */ \"./dist/browser/Options/Classes/Absorber.js\");\n\n\nclass AbsorbersPlugin {\n
|
|
26
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorbersPlugin: () => (/* binding */ AbsorbersPlugin)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Absorber.js */ \"./dist/browser/Options/Classes/Absorber.js\");\n\n\nclass AbsorbersPlugin {\n id = \"absorbers\";\n _instancesManager;\n constructor(instancesManager){\n this._instancesManager = instancesManager;\n }\n async getPlugin(container) {\n const { AbsorbersPluginInstance } = await __webpack_require__.e(/*! import() */ \"dist_browser_AbsorbersPluginInstance_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./AbsorbersPluginInstance.js */ \"./dist/browser/AbsorbersPluginInstance.js\"));\n return new AbsorbersPluginInstance(container, this._instancesManager);\n }\n loadOptions(_container, options, source) {\n if (!this.needsPlugin(options) && !this.needsPlugin(source)) {\n return;\n }\n if (source?.absorbers) {\n options.absorbers = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.executeOnSingleOrMultiple)(source.absorbers, (absorber)=>{\n const tmp = new _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__.Absorber();\n tmp.load(absorber);\n return tmp;\n });\n }\n }\n needsPlugin(options) {\n if (!options) {\n return false;\n }\n const absorbers = options.absorbers;\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isArray)(absorbers)) {\n return !!absorbers.length;\n } else if (absorbers) {\n return true;\n }\n return false;\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/AbsorbersPlugin.js?\n}");
|
|
27
27
|
|
|
28
28
|
/***/ },
|
|
29
29
|
|
|
@@ -33,7 +33,17 @@ 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 */ Absorber: () => (/* binding */ Absorber)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var
|
|
36
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Absorber: () => (/* binding */ Absorber)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _AbsorberLife_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberLife.js */ \"./dist/browser/Options/Classes/AbsorberLife.js\");\n/* harmony import */ var _AbsorberSize_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbsorberSize.js */ \"./dist/browser/Options/Classes/AbsorberSize.js\");\n\n\n\nclass Absorber {\n color;\n destroy;\n draggable;\n life;\n name;\n opacity;\n orbits;\n position;\n size;\n constructor(){\n this.color = new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.OptionsColor();\n this.color.value = \"#000000\";\n this.draggable = false;\n this.opacity = 1;\n this.destroy = true;\n this.orbits = false;\n this.life = new _AbsorberLife_js__WEBPACK_IMPORTED_MODULE_1__.AbsorberLife();\n this.size = new _AbsorberSize_js__WEBPACK_IMPORTED_MODULE_2__.AbsorberSize();\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n if (data.color !== undefined) {\n this.color = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.OptionsColor.create(this.color, data.color);\n }\n if (data.draggable !== undefined) {\n this.draggable = data.draggable;\n }\n if (data.life !== undefined) {\n this.life.load(data.life);\n }\n this.name = data.name;\n if (data.opacity !== undefined) {\n this.opacity = data.opacity;\n }\n if (data.position !== undefined) {\n this.position = {};\n if (data.position.x !== undefined) {\n this.position.x = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.position.x);\n }\n if (data.position.y !== undefined) {\n this.position.y = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.position.y);\n }\n }\n if (data.size !== undefined) {\n this.size.load(data.size);\n }\n if (data.destroy !== undefined) {\n this.destroy = data.destroy;\n }\n if (data.orbits !== undefined) {\n this.orbits = data.orbits;\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/Absorber.js?\n}");
|
|
37
|
+
|
|
38
|
+
/***/ },
|
|
39
|
+
|
|
40
|
+
/***/ "./dist/browser/Options/Classes/AbsorberLife.js"
|
|
41
|
+
/*!******************************************************!*\
|
|
42
|
+
!*** ./dist/browser/Options/Classes/AbsorberLife.js ***!
|
|
43
|
+
\******************************************************/
|
|
44
|
+
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
45
|
+
|
|
46
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberLife: () => (/* binding */ AbsorberLife)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nclass AbsorberLife {\n count;\n delay;\n duration;\n wait;\n constructor(){\n this.wait = false;\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n if (data.count !== undefined) {\n this.count = data.count;\n }\n if (data.delay !== undefined) {\n this.delay = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.delay);\n }\n if (data.duration !== undefined) {\n this.duration = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.duration);\n }\n if (data.wait !== undefined) {\n this.wait = data.wait;\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberLife.js?\n}");
|
|
37
47
|
|
|
38
48
|
/***/ },
|
|
39
49
|
|
|
@@ -43,7 +53,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
43
53
|
\******************************************************/
|
|
44
54
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
45
55
|
|
|
46
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSize: () => (/* binding */ AbsorberSize)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberSizeLimit.js */ \"./dist/browser/Options/Classes/AbsorberSizeLimit.js\");\n\n\nclass AbsorberSize extends _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.ValueWithRandom {\n
|
|
56
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSize: () => (/* binding */ AbsorberSize)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberSizeLimit.js */ \"./dist/browser/Options/Classes/AbsorberSizeLimit.js\");\n\n\nclass AbsorberSize extends _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.ValueWithRandom {\n density;\n limit;\n constructor(){\n super();\n this.density = 5;\n this.value = 50;\n this.limit = new _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__.AbsorberSizeLimit();\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n super.load(data);\n if (data.density !== undefined) {\n this.density = data.density;\n }\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNumber)(data.limit)) {\n this.limit.radius = data.limit;\n } else {\n this.limit.load(data.limit);\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberSize.js?\n}");
|
|
47
57
|
|
|
48
58
|
/***/ },
|
|
49
59
|
|
|
@@ -53,7 +63,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
53
63
|
\***********************************************************/
|
|
54
64
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
55
65
|
|
|
56
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSizeLimit: () => (/* binding */ AbsorberSizeLimit)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nclass AbsorberSizeLimit {\n
|
|
66
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSizeLimit: () => (/* binding */ AbsorberSizeLimit)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n\nclass AbsorberSizeLimit {\n mass;\n radius;\n constructor(){\n this.radius = 0;\n this.mass = 0;\n }\n load(data) {\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNull)(data)) {\n return;\n }\n if (data.mass !== undefined) {\n this.mass = data.mass;\n }\n if (data.radius !== undefined) {\n this.radius = data.radius;\n }\n }\n}\n\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberSizeLimit.js?\n}");
|
|
57
67
|
|
|
58
68
|
/***/ }
|
|
59
69
|
|
package/esm/AbsorberInstance.js
CHANGED
|
@@ -1,61 +1,30 @@
|
|
|
1
|
-
import { RotateDirection, Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, doublePI, getDistance, getDistances, getRandom, getRangeValue, getStyleFromRgb, isPointInside,
|
|
1
|
+
import { RotateDirection, Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, doublePI, getDistance, getDistances, getRandom, getRangeMax, getRangeValue, getStyleFromRgb, half, identity, isPointInside, millisecondsToSeconds, originPoint, 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, maxDegreeAngle = 360, angleIncrementFactor = identity / maxDegreeAngle, minVelocity = 0, defaultLifeDelay = 0, minLifeCount = 0, defaultSpawnDelay = 0, defaultLifeCount = -1;
|
|
4
4
|
export class AbsorberInstance {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
};
|
|
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
|
+
_firstSpawn;
|
|
18
|
+
_immortal;
|
|
19
|
+
_lifeCount;
|
|
20
|
+
_pluginManager;
|
|
21
|
+
_spawnDelay;
|
|
22
|
+
initialPosition;
|
|
23
|
+
constructor(pluginManager, container, options, position) {
|
|
57
24
|
this._container = container;
|
|
58
|
-
this.
|
|
25
|
+
this._pluginManager = pluginManager;
|
|
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;
|
|
@@ -73,12 +42,19 @@ export class AbsorberInstance {
|
|
|
73
42
|
radius: limit.radius * container.retina.pixelRatio * container.retina.reduceFactor,
|
|
74
43
|
mass: limit.mass,
|
|
75
44
|
};
|
|
76
|
-
this.color = rangeColorToRgb(this.
|
|
45
|
+
this.color = rangeColorToRgb(this._pluginManager, this.options.color) ?? {
|
|
77
46
|
b: 0,
|
|
78
47
|
g: 0,
|
|
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);
|
|
@@ -92,14 +68,14 @@ export class AbsorberInstance {
|
|
|
92
68
|
}
|
|
93
69
|
else {
|
|
94
70
|
particle.needsNewPosition = true;
|
|
95
|
-
this._updateParticlePosition(particle, v);
|
|
71
|
+
this._updateParticlePosition(particle, delta, v);
|
|
96
72
|
}
|
|
97
73
|
}
|
|
98
74
|
else {
|
|
99
75
|
if (options.destroy) {
|
|
100
76
|
particle.size.value -= sizeFactor;
|
|
101
77
|
}
|
|
102
|
-
this._updateParticlePosition(particle, v);
|
|
78
|
+
this._updateParticlePosition(particle, delta, v);
|
|
103
79
|
}
|
|
104
80
|
if (this.limit.radius <= minRadius || this.size < this.limit.radius) {
|
|
105
81
|
this.size += sizeFactor;
|
|
@@ -109,7 +85,7 @@ export class AbsorberInstance {
|
|
|
109
85
|
}
|
|
110
86
|
}
|
|
111
87
|
else {
|
|
112
|
-
this._updateParticlePosition(particle, v);
|
|
88
|
+
this._updateParticlePosition(particle, delta, v);
|
|
113
89
|
}
|
|
114
90
|
}
|
|
115
91
|
draw(context) {
|
|
@@ -127,4 +103,95 @@ 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, delta, 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 maxSize = getRangeMax(particle.options.size.value) * container.retina.pixelRatio, sizeFactor = particle.options.move.size ? particle.getRadius() / maxSize : identity, deltaFactor = delta.factor || identity, baseSpeed = particle.retina.moveSpeed, moveSpeed = baseSpeed * sizeFactor * deltaFactor * half;
|
|
177
|
+
particle.position.x = this.position.x + orbitRadius * Math.cos(orbitAngle);
|
|
178
|
+
particle.position.y =
|
|
179
|
+
this.position.y +
|
|
180
|
+
orbitRadius * (orbitDirection === RotateDirection.clockwise ? identity : -identity) * Math.sin(orbitAngle);
|
|
181
|
+
particle.absorberOrbit.length = Math.max(minOrbitLength, particle.absorberOrbit.length - v.length);
|
|
182
|
+
particle.absorberOrbit.angle += moveSpeed * angleIncrementFactor * container.retina.reduceFactor;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
particle.velocity.addTo(v);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
play = () => {
|
|
189
|
+
if (!((this._lifeCount > minLifeCount || this._immortal || !this.options.life.count) &&
|
|
190
|
+
(this._firstSpawn || this._currentSpawnDelay >= (this._spawnDelay ?? defaultSpawnDelay)))) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (this._lifeCount > minLifeCount || this._immortal) {
|
|
194
|
+
this._prepareToDie();
|
|
195
|
+
}
|
|
196
|
+
};
|
|
130
197
|
}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { isNumber } from "@tsparticles/engine";
|
|
2
2
|
const defaultIndex = 0;
|
|
3
3
|
export class AbsorbersInstancesManager {
|
|
4
|
-
|
|
4
|
+
_containerArrays;
|
|
5
|
+
_pluginManager;
|
|
6
|
+
constructor(pluginManager) {
|
|
7
|
+
this._pluginManager = pluginManager;
|
|
5
8
|
this._containerArrays = new Map();
|
|
6
|
-
this._engine = engine;
|
|
7
9
|
}
|
|
8
10
|
async addAbsorber(container, options, position) {
|
|
9
|
-
const { AbsorberInstance } = await import("./AbsorberInstance.js"), absorber = new AbsorberInstance(this.
|
|
11
|
+
const { AbsorberInstance } = await import("./AbsorberInstance.js"), absorber = new AbsorberInstance(this._pluginManager, container, options, position), array = this.getArray(container);
|
|
10
12
|
array.push(absorber);
|
|
11
13
|
return absorber;
|
|
12
14
|
}
|
|
@@ -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.
|
|
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.
|
|
42
|
-
this.
|
|
46
|
+
this._dragging = true;
|
|
47
|
+
this._draggingAbsorber = absorber;
|
|
43
48
|
}
|
|
44
49
|
}
|
|
45
50
|
else {
|
|
46
|
-
this.
|
|
47
|
-
this.
|
|
51
|
+
this._dragging = false;
|
|
52
|
+
this._draggingAbsorber = undefined;
|
|
48
53
|
}
|
|
49
|
-
if (this.
|
|
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
|
}
|
package/esm/AbsorbersPlugin.js
CHANGED
|
@@ -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
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/esm/index.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
export async function loadAbsorbersPlugin(engine) {
|
|
2
|
-
engine.checkVersion("4.0.0-
|
|
3
|
-
await engine.register(async (e) => {
|
|
4
|
-
const {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
engine.checkVersion("4.0.0-beta.1");
|
|
3
|
+
await engine.pluginManager.register(async (e) => {
|
|
4
|
+
const [{ ensureInteractivityPluginLoaded }, { AbsorbersInstancesManager }, { AbsorbersPlugin },] = await Promise.all([
|
|
5
|
+
import("@tsparticles/plugin-interactivity"),
|
|
6
|
+
import("./AbsorbersInstancesManager.js"),
|
|
7
|
+
import("./AbsorbersPlugin.js"),
|
|
8
|
+
]), pluginManager = e.pluginManager, instancesManager = new AbsorbersInstancesManager(pluginManager);
|
|
9
|
+
ensureInteractivityPluginLoaded(e);
|
|
10
|
+
pluginManager.addPlugin(new AbsorbersPlugin(instancesManager));
|
|
11
|
+
pluginManager.addInteractor?.("externalAbsorbers", async (container) => {
|
|
8
12
|
const { AbsorbersInteractor } = await import("./AbsorbersInteractor.js");
|
|
9
13
|
return new AbsorbersInteractor(container, instancesManager);
|
|
10
14
|
});
|