@tsparticles/plugin-emitters 4.0.0-alpha.3 → 4.0.0-alpha.5
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/129.min.js +2 -0
- package/129.min.js.LICENSE.txt +1 -0
- package/246.min.js +2 -0
- package/246.min.js.LICENSE.txt +1 -0
- package/330.min.js +2 -0
- package/330.min.js.LICENSE.txt +1 -0
- package/{921.min.js → 490.min.js} +2 -2
- package/490.min.js.LICENSE.txt +1 -0
- package/849.min.js +2 -0
- package/849.min.js.LICENSE.txt +1 -0
- package/940.min.js +2 -0
- package/940.min.js.LICENSE.txt +1 -0
- package/browser/EmitterInstance.js +5 -4
- package/browser/EmittersInstancesManager.js +69 -0
- package/browser/EmittersInteractor.js +112 -0
- package/browser/EmittersPlugin.js +8 -68
- package/browser/EmittersPluginInstance.js +42 -0
- package/browser/constants.js +4 -0
- package/browser/index.js +10 -6
- package/cjs/EmitterInstance.js +5 -4
- package/cjs/EmittersInstancesManager.js +69 -0
- package/cjs/EmittersInteractor.js +112 -0
- package/cjs/EmittersPlugin.js +8 -68
- package/cjs/EmittersPluginInstance.js +42 -0
- package/cjs/constants.js +4 -0
- package/cjs/index.js +10 -6
- package/dist_browser_EmitterInstance_js.js +30 -0
- package/dist_browser_EmittersInstancesManager_js.js +90 -0
- package/dist_browser_EmittersInteractor_js.js +100 -0
- package/dist_browser_EmittersPluginInstance_js.js +30 -0
- package/dist_browser_EmittersPlugin_js.js +2 -22
- package/dist_browser_ShapeManager_js.js +1 -1
- package/esm/EmitterInstance.js +5 -4
- package/esm/EmittersInstancesManager.js +69 -0
- package/esm/EmittersInteractor.js +112 -0
- package/esm/EmittersPlugin.js +8 -68
- package/esm/EmittersPluginInstance.js +42 -0
- package/esm/constants.js +4 -0
- package/esm/index.js +10 -6
- package/package.json +3 -2
- package/report.html +1 -1
- package/tsparticles.plugin.emitters.js +48 -20
- package/tsparticles.plugin.emitters.min.js +1 -1
- package/tsparticles.plugin.emitters.min.js.LICENSE.txt +1 -1
- package/types/EmitterContainer.d.ts +8 -7
- package/types/EmitterInstance.d.ts +2 -3
- package/types/EmittersEngine.d.ts +2 -2
- package/types/EmittersInstancesManager.d.ts +15 -0
- package/types/EmittersInteractor.d.ts +18 -0
- package/types/EmittersPlugin.d.ts +6 -7
- package/types/EmittersPluginInstance.d.ts +14 -0
- package/types/constants.d.ts +2 -0
- package/types/index.d.ts +1 -1
- package/types/types.d.ts +15 -9
- package/umd/EmitterInstance.js +5 -4
- package/umd/EmittersInstancesManager.js +117 -0
- package/umd/EmittersInteractor.js +126 -0
- package/umd/EmittersPlugin.js +42 -68
- package/umd/EmittersPluginInstance.js +56 -0
- package/umd/constants.js +17 -0
- package/umd/index.js +10 -6
- package/214.min.js +0 -2
- package/214.min.js.LICENSE.txt +0 -1
- package/921.min.js.LICENSE.txt +0 -1
- package/browser/Emitters.js +0 -134
- package/cjs/Emitters.js +0 -134
- package/esm/Emitters.js +0 -134
- package/types/Emitters.d.ts +0 -24
- package/umd/Emitters.js +0 -148
|
@@ -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.5
|
|
8
8
|
*/
|
|
9
9
|
"use strict";
|
|
10
10
|
/*
|
|
@@ -17,33 +17,13 @@
|
|
|
17
17
|
*/
|
|
18
18
|
(this["webpackChunk_tsparticles_plugin_emitters"] = this["webpackChunk_tsparticles_plugin_emitters"] || []).push([["dist_browser_EmittersPlugin_js"],{
|
|
19
19
|
|
|
20
|
-
/***/ "./dist/browser/EmitterInstance.js"
|
|
21
|
-
/*!*****************************************!*\
|
|
22
|
-
!*** ./dist/browser/EmitterInstance.js ***!
|
|
23
|
-
\*****************************************/
|
|
24
|
-
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
25
|
-
|
|
26
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmitterInstance: () => (/* binding */ EmitterInstance)\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_Emitter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Emitter.js */ \"./dist/browser/Options/Classes/Emitter.js\");\n/* harmony import */ var _Options_Classes_EmitterSize_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Options/Classes/EmitterSize.js */ \"./dist/browser/Options/Classes/EmitterSize.js\");\n\n\n\nconst defaultLifeDelay = 0,\n minLifeCount = 0,\n defaultSpawnDelay = 0,\n defaultEmitDelay = 0,\n defaultLifeCount = -1,\n defaultColorAnimationFactor = 1,\n colorFactor = 3.6;\nfunction setParticlesOptionsColor(particlesOptions, color) {\n if (particlesOptions.color) {\n particlesOptions.color.value = color;\n } else {\n particlesOptions.color = {\n value: color\n };\n }\n}\nclass EmitterInstance {\n constructor(engine, emitters, container, options, position) {\n this.emitters = emitters;\n this.container = container;\n this._destroy = () => {\n this._mutationObserver?.disconnect();\n this._mutationObserver = undefined;\n this._resizeObserver?.disconnect();\n this._resizeObserver = undefined;\n this.emitters.removeEmitter(this);\n this._engine.dispatchEvent(\"emitterDestroyed\", {\n container: this.container,\n data: {\n emitter: this\n }\n });\n };\n this._prepareToDie = () => {\n if (this._paused) {\n return;\n }\n const duration = this.options.life.duration !== undefined ? (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.life.duration) : undefined,\n minDuration = 0,\n minLifeCount = 0;\n if ((this._lifeCount > minLifeCount || this._immortal) && duration !== undefined && duration > minDuration) {\n this._duration = duration * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.millisecondsToSeconds;\n }\n };\n this._setColorAnimation = (animation, initValue, maxValue, factor = defaultColorAnimationFactor) => {\n const container = this.container;\n if (!animation.enable) {\n return initValue;\n }\n const colorOffset = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.randomInRangeValue)(animation.offset),\n delay = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.rate.delay),\n emitFactor = container.retina.reduceFactor ? delay * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.millisecondsToSeconds / container.retina.reduceFactor : Infinity,\n colorSpeed = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(animation.speed);\n return (initValue + colorSpeed * container.fpsLimit / emitFactor + colorOffset * factor) % maxValue;\n };\n this._engine = engine;\n this._currentDuration = 0;\n this._currentEmitDelay = 0;\n this._currentSpawnDelay = 0;\n this._initialPosition = position;\n if (options instanceof _Options_Classes_Emitter_js__WEBPACK_IMPORTED_MODULE_1__.Emitter) {\n this.options = options;\n } else {\n this.options = new _Options_Classes_Emitter_js__WEBPACK_IMPORTED_MODULE_1__.Emitter();\n this.options.load(options);\n }\n this._spawnDelay = container.retina.reduceFactor ? (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.life.delay ?? defaultLifeDelay) * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.millisecondsToSeconds / container.retina.reduceFactor : Infinity;\n this.position = this._initialPosition ?? this._calcPosition();\n this.name = this.options.name;\n this.fill = this.options.fill;\n this._firstSpawn = !this.options.life.wait;\n this._startParticlesAdded = false;\n const particlesOptions = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.deepExtend)({}, this.options.particles);\n particlesOptions.move ??= {};\n particlesOptions.move.direction ??= this.options.direction;\n if (this.options.spawnColor) {\n this.spawnColor = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.rangeColorToHsl)(this._engine, this.options.spawnColor);\n }\n this._paused = !this.options.autoPlay;\n this._particlesOptions = particlesOptions;\n this._size = this._calcSize();\n this.size = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getSize)(this._size, this.container.canvas.size);\n this._lifeCount = this.options.life.count ?? defaultLifeCount;\n this._immortal = this._lifeCount <= minLifeCount;\n if (this.options.domId) {\n const element = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.safeDocument)().getElementById(this.options.domId);\n if (element) {\n this._mutationObserver = new MutationObserver(() => {\n this.resize();\n });\n this._resizeObserver = new ResizeObserver(() => {\n this.resize();\n });\n this._mutationObserver.observe(element, {\n attributes: true,\n attributeFilter: [\"style\", \"width\", \"height\"]\n });\n this._resizeObserver.observe(element);\n }\n }\n const shapeOptions = this.options.shape,\n shapeGenerator = this._engine.emitterShapeManager?.getShapeGenerator(shapeOptions.type);\n if (shapeGenerator) {\n this._shape = shapeGenerator.generate(this.position, this.size, this.fill, shapeOptions.options);\n }\n this._engine.dispatchEvent(\"emitterCreated\", {\n container,\n data: {\n emitter: this\n }\n });\n this.play();\n }\n externalPause() {\n this._paused = true;\n this.pause();\n }\n externalPlay() {\n this._paused = false;\n this.play();\n }\n async init() {\n await this._shape?.init();\n }\n pause() {\n if (this._paused) {\n return;\n }\n delete this._emitDelay;\n }\n play() {\n if (this._paused) {\n return;\n }\n if (!((this._lifeCount > minLifeCount || this._immortal || !this.options.life.count) && (this._firstSpawn || this._currentSpawnDelay >= (this._spawnDelay ?? defaultSpawnDelay)))) {\n return;\n }\n const container = this.container;\n if (this._emitDelay === undefined) {\n const delay = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.rate.delay);\n this._emitDelay = container.retina.reduceFactor ? delay * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.millisecondsToSeconds / container.retina.reduceFactor : Infinity;\n }\n if (this._lifeCount > minLifeCount || this._immortal) {\n this._prepareToDie();\n }\n }\n resize() {\n const initialPosition = this._initialPosition,\n container = this.container;\n this.position = initialPosition && (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isPointInside)(initialPosition, container.canvas.size, _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin) ? initialPosition : this._calcPosition();\n this._size = this._calcSize();\n this.size = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getSize)(this._size, container.canvas.size);\n this._shape?.resize(this.position, this.size);\n }\n update(delta) {\n if (this._paused) {\n return;\n }\n const container = this.container;\n if (this._firstSpawn) {\n this._firstSpawn = false;\n this._currentSpawnDelay = this._spawnDelay ?? defaultSpawnDelay;\n this._currentEmitDelay = this._emitDelay ?? defaultEmitDelay;\n }\n if (!this._startParticlesAdded) {\n this._startParticlesAdded = true;\n this._emitParticles(this.options.startCount);\n }\n if (this._duration !== undefined) {\n this._currentDuration += delta.value;\n if (this._currentDuration >= this._duration) {\n this.pause();\n if (this._spawnDelay !== undefined) {\n delete this._spawnDelay;\n }\n if (!this._immortal) {\n this._lifeCount--;\n }\n if (this._lifeCount > minLifeCount || this._immortal) {\n this.position = this._calcPosition();\n this._shape?.resize(this.position, this.size);\n this._spawnDelay = container.retina.reduceFactor ? (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.life.delay ?? defaultLifeDelay) * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.millisecondsToSeconds / container.retina.reduceFactor : Infinity;\n } else {\n this._destroy();\n }\n this._currentDuration -= this._duration;\n delete this._duration;\n }\n }\n if (this._spawnDelay !== undefined) {\n this._currentSpawnDelay += delta.value;\n if (this._currentSpawnDelay >= this._spawnDelay) {\n this._engine.dispatchEvent(\"emitterPlay\", {\n container: this.container\n });\n this.play();\n this._currentSpawnDelay -= this._currentSpawnDelay;\n delete this._spawnDelay;\n }\n }\n if (this._emitDelay !== undefined) {\n this._currentEmitDelay += delta.value;\n if (this._currentEmitDelay >= this._emitDelay) {\n this._emit();\n this._currentEmitDelay -= this._emitDelay;\n }\n }\n }\n _calcPosition() {\n const container = this.container;\n if (this.options.domId) {\n const element = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.safeDocument)().getElementById(this.options.domId);\n if (element) {\n const elRect = element.getBoundingClientRect(),\n pxRatio = container.retina.pixelRatio;\n return {\n x: (elRect.x + elRect.width * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.half) * pxRatio,\n y: (elRect.y + elRect.height * _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.half) * pxRatio\n };\n }\n }\n return (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.calcPositionOrRandomFromSizeRanged)({\n size: container.canvas.size,\n position: this.options.position\n });\n }\n _calcSize() {\n const container = this.container;\n if (this.options.domId) {\n const element = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.safeDocument)().getElementById(this.options.domId);\n if (element) {\n const elRect = element.getBoundingClientRect();\n return {\n width: elRect.width * container.retina.pixelRatio,\n height: elRect.height * container.retina.pixelRatio,\n mode: _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.PixelMode.precise\n };\n }\n }\n return this.options.size ?? (() => {\n const size = new _Options_Classes_EmitterSize_js__WEBPACK_IMPORTED_MODULE_2__.EmitterSize();\n size.load({\n height: 0,\n mode: _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.PixelMode.percent,\n width: 0\n });\n return size;\n })();\n }\n _emit() {\n if (this._paused) {\n return;\n }\n const quantity = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.rate.quantity);\n this._emitParticles(quantity);\n }\n _emitParticles(quantity) {\n const singleParticlesOptions = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.itemFromSingleOrMultiple)(this._particlesOptions),\n hslAnimation = this.options.spawnColor?.animation,\n reduceFactor = this.container.retina.reduceFactor,\n needsColorAnimation = !!hslAnimation,\n needsShapeData = !!this._shape,\n needsCopy = needsColorAnimation || needsShapeData,\n maxValues = needsColorAnimation ? {\n h: _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.hMax,\n s: _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.sMax,\n l: _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.lMax\n } : null,\n shapeOptions = this.options.shape;\n for (let i = 0; i < quantity * reduceFactor; i++) {\n const particlesOptions = needsCopy ? (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.deepExtend)({}, singleParticlesOptions) : singleParticlesOptions;\n if (this.spawnColor) {\n if (hslAnimation && maxValues) {\n this.spawnColor.h = this._setColorAnimation(hslAnimation.h, this.spawnColor.h, maxValues.h, colorFactor);\n this.spawnColor.s = this._setColorAnimation(hslAnimation.s, this.spawnColor.s, maxValues.s);\n this.spawnColor.l = this._setColorAnimation(hslAnimation.l, this.spawnColor.l, maxValues.l);\n }\n setParticlesOptionsColor(particlesOptions, this.spawnColor);\n }\n let position = this.position;\n if (this._shape) {\n const shapePosData = this._shape.randomPosition();\n if (shapePosData) {\n position = shapePosData.position;\n const replaceData = shapeOptions.replace;\n if (replaceData.color && shapePosData.color) {\n setParticlesOptionsColor(particlesOptions, shapePosData.color);\n }\n if (replaceData.opacity) {\n if (particlesOptions.opacity) {\n particlesOptions.opacity.value = shapePosData.opacity;\n } else {\n particlesOptions.opacity = {\n value: shapePosData.opacity\n };\n }\n }\n } else {\n position = null;\n }\n }\n if (position) {\n this.container.particles.addParticle(position, particlesOptions);\n }\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-emitters/./dist/browser/EmitterInstance.js?\n}");
|
|
27
|
-
|
|
28
|
-
/***/ },
|
|
29
|
-
|
|
30
|
-
/***/ "./dist/browser/Emitters.js"
|
|
31
|
-
/*!**********************************!*\
|
|
32
|
-
!*** ./dist/browser/Emitters.js ***!
|
|
33
|
-
\**********************************/
|
|
34
|
-
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
35
|
-
|
|
36
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Emitters: () => (/* binding */ Emitters)\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_Emitter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Emitter.js */ \"./dist/browser/Options/Classes/Emitter.js\");\n/* harmony import */ var _Enums_EmitterClickMode_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Enums/EmitterClickMode.js */ \"./dist/browser/Enums/EmitterClickMode.js\");\n/* harmony import */ var _EmitterInstance_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EmitterInstance.js */ \"./dist/browser/EmitterInstance.js\");\n\n\n\n\nclass Emitters {\n constructor(engine, container) {\n this.container = container;\n this._engine = engine;\n this.array = [];\n this.emitters = [];\n this.interactivityEmitters = {\n random: {\n count: 1,\n enable: false\n },\n value: []\n };\n const defaultIndex = 0;\n container.getEmitter = idxOrName => idxOrName === undefined || (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNumber)(idxOrName) ? this.array[idxOrName ?? defaultIndex] : this.array.find(t => t.name === idxOrName);\n container.addEmitter = async (options, position) => this.addEmitter(options, position);\n container.removeEmitter = idxOrName => {\n const emitter = container.getEmitter(idxOrName);\n if (emitter) {\n this.removeEmitter(emitter);\n }\n };\n container.playEmitter = idxOrName => {\n const emitter = container.getEmitter(idxOrName);\n if (emitter) {\n emitter.externalPlay();\n }\n };\n container.pauseEmitter = idxOrName => {\n const emitter = container.getEmitter(idxOrName);\n if (emitter) {\n emitter.externalPause();\n }\n };\n }\n async addEmitter(options, position) {\n const emitterOptions = new _Options_Classes_Emitter_js__WEBPACK_IMPORTED_MODULE_1__.Emitter();\n emitterOptions.load(options);\n const emitter = new _EmitterInstance_js__WEBPACK_IMPORTED_MODULE_3__.EmitterInstance(this._engine, this, this.container, emitterOptions, position);\n await emitter.init();\n this.array.push(emitter);\n return emitter;\n }\n handleClickMode(mode) {\n const modeEmitters = this.interactivityEmitters;\n if (mode !== _Enums_EmitterClickMode_js__WEBPACK_IMPORTED_MODULE_2__.EmitterClickMode.emitter) {\n return;\n }\n let emittersModeOptions;\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isArray)(modeEmitters.value)) {\n const minLength = 0,\n modeEmittersCount = modeEmitters.value.length;\n if (modeEmittersCount > minLength && modeEmitters.random.enable) {\n emittersModeOptions = [];\n const usedIndexes = new Set();\n for (let i = 0; i < modeEmitters.random.count; i++) {\n const idx = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.arrayRandomIndex)(modeEmitters.value);\n if (usedIndexes.has(idx) && usedIndexes.size < modeEmittersCount) {\n i--;\n continue;\n }\n usedIndexes.add(idx);\n const selectedOptions = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.itemFromArray)(modeEmitters.value, idx);\n if (!selectedOptions) {\n continue;\n }\n emittersModeOptions.push(selectedOptions);\n }\n } else {\n emittersModeOptions = modeEmitters.value;\n }\n } else {\n emittersModeOptions = modeEmitters.value;\n }\n const emittersOptions = emittersModeOptions,\n ePosition = this.container.interactivity.mouse.clickPosition;\n void (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.executeOnSingleOrMultiple)(emittersOptions, async emitter => {\n await this.addEmitter(emitter, ePosition);\n });\n }\n async init() {\n this.emitters = this.container.actualOptions.emitters;\n this.interactivityEmitters = this.container.actualOptions.interactivity.modes.emitters;\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isArray)(this.emitters)) {\n for (const emitterOptions of this.emitters) {\n await this.addEmitter(emitterOptions);\n }\n } else {\n await this.addEmitter(this.emitters);\n }\n }\n pause() {\n for (const emitter of this.array) {\n emitter.pause();\n }\n }\n play() {\n for (const emitter of this.array) {\n emitter.play();\n }\n }\n removeEmitter(emitter) {\n const index = this.array.indexOf(emitter),\n minIndex = 0,\n deleteCount = 1;\n if (index >= minIndex) {\n this.array.splice(index, deleteCount);\n }\n }\n resize() {\n for (const emitter of this.array) {\n emitter.resize();\n }\n }\n stop() {\n this.array = [];\n }\n update(delta) {\n const updates = [];\n for (const emitter of this.array) {\n updates.push(() => {\n emitter.update(delta);\n });\n }\n updates.forEach(update => {\n update();\n });\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-emitters/./dist/browser/Emitters.js?\n}");
|
|
37
|
-
|
|
38
|
-
/***/ },
|
|
39
|
-
|
|
40
20
|
/***/ "./dist/browser/EmittersPlugin.js"
|
|
41
21
|
/*!****************************************!*\
|
|
42
22
|
!*** ./dist/browser/EmittersPlugin.js ***!
|
|
43
23
|
\****************************************/
|
|
44
24
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
45
25
|
|
|
46
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmittersPlugin: () => (/* binding */ EmittersPlugin)\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_Emitter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Emitter.js */ \"./dist/browser/Options/Classes/Emitter.js\");\n
|
|
26
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EmittersPlugin: () => (/* binding */ EmittersPlugin)\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_Emitter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Emitter.js */ \"./dist/browser/Options/Classes/Emitter.js\");\n\n\nclass EmittersPlugin {\n constructor(instancesManager) {\n this._instancesManager = instancesManager;\n this.id = \"emitters\";\n }\n async getPlugin(container) {\n const {\n EmittersPluginInstance\n } = await __webpack_require__.e(/*! import() */ \"dist_browser_EmittersPluginInstance_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./EmittersPluginInstance.js */ \"./dist/browser/EmittersPluginInstance.js\"));\n return new EmittersPluginInstance(this._instancesManager, container);\n }\n loadOptions(_container, options, source) {\n if (!this.needsPlugin(options) && !this.needsPlugin(source)) {\n return;\n }\n if (source?.emitters) {\n options.emitters = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.executeOnSingleOrMultiple)(source.emitters, emitter => {\n const tmp = new _Options_Classes_Emitter_js__WEBPACK_IMPORTED_MODULE_1__.Emitter();\n tmp.load(emitter);\n return tmp;\n });\n }\n }\n needsPlugin(options) {\n if (!options) {\n return false;\n }\n const emitters = options.emitters;\n return (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isArray)(emitters) && !!emitters.length || emitters !== undefined;\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-emitters/./dist/browser/EmittersPlugin.js?\n}");
|
|
47
27
|
|
|
48
28
|
/***/ },
|
|
49
29
|
|
package/esm/EmitterInstance.js
CHANGED
|
@@ -13,15 +13,15 @@ function setParticlesOptionsColor(particlesOptions, color) {
|
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
export class EmitterInstance {
|
|
16
|
-
constructor(engine,
|
|
17
|
-
this.emitters = emitters;
|
|
16
|
+
constructor(engine, container, removeCallback, options, position) {
|
|
18
17
|
this.container = container;
|
|
18
|
+
this.removeCallback = removeCallback;
|
|
19
19
|
this._destroy = () => {
|
|
20
20
|
this._mutationObserver?.disconnect();
|
|
21
21
|
this._mutationObserver = undefined;
|
|
22
22
|
this._resizeObserver?.disconnect();
|
|
23
23
|
this._resizeObserver = undefined;
|
|
24
|
-
this.
|
|
24
|
+
this.removeCallback(this);
|
|
25
25
|
this._engine.dispatchEvent("emitterDestroyed", {
|
|
26
26
|
container: this.container,
|
|
27
27
|
data: {
|
|
@@ -262,7 +262,8 @@ export class EmitterInstance {
|
|
|
262
262
|
this._emitParticles(quantity);
|
|
263
263
|
}
|
|
264
264
|
_emitParticles(quantity) {
|
|
265
|
-
const singleParticlesOptions = itemFromSingleOrMultiple(this._particlesOptions)
|
|
265
|
+
const singleParticlesOptions = (itemFromSingleOrMultiple(this._particlesOptions) ??
|
|
266
|
+
{}), hslAnimation = this.options.spawnColor?.animation, reduceFactor = this.container.retina.reduceFactor, needsColorAnimation = !!hslAnimation, needsShapeData = !!this._shape, needsCopy = needsColorAnimation || needsShapeData, maxValues = needsColorAnimation ? { h: hMax, s: sMax, l: lMax } : null, shapeOptions = this.options.shape;
|
|
266
267
|
for (let i = 0; i < quantity * reduceFactor; i++) {
|
|
267
268
|
const particlesOptions = needsCopy
|
|
268
269
|
? deepExtend({}, singleParticlesOptions)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { isNumber } from "@tsparticles/engine";
|
|
2
|
+
import { Emitter } from "./Options/Classes/Emitter.js";
|
|
3
|
+
const defaultIndex = 0;
|
|
4
|
+
export class EmittersInstancesManager {
|
|
5
|
+
constructor(engine) {
|
|
6
|
+
this._containerArrays = new Map();
|
|
7
|
+
this._engine = engine;
|
|
8
|
+
}
|
|
9
|
+
async addEmitter(container, options, position) {
|
|
10
|
+
const emitterOptions = new Emitter();
|
|
11
|
+
emitterOptions.load(options);
|
|
12
|
+
const { EmitterInstance } = await import("./EmitterInstance.js"), emitter = new EmitterInstance(this._engine, container, (emitter) => {
|
|
13
|
+
this.removeEmitter(container, emitter);
|
|
14
|
+
}, emitterOptions, position);
|
|
15
|
+
await emitter.init();
|
|
16
|
+
this.getArray(container).push(emitter);
|
|
17
|
+
return emitter;
|
|
18
|
+
}
|
|
19
|
+
clear(container) {
|
|
20
|
+
this.initContainer(container);
|
|
21
|
+
this._containerArrays.set(container, []);
|
|
22
|
+
}
|
|
23
|
+
getArray(container) {
|
|
24
|
+
this.initContainer(container);
|
|
25
|
+
let array = this._containerArrays.get(container);
|
|
26
|
+
if (!array) {
|
|
27
|
+
array = [];
|
|
28
|
+
this._containerArrays.set(container, array);
|
|
29
|
+
}
|
|
30
|
+
return array;
|
|
31
|
+
}
|
|
32
|
+
initContainer(container) {
|
|
33
|
+
if (this._containerArrays.has(container)) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
this._containerArrays.set(container, []);
|
|
37
|
+
container.getEmitter = (idxOrName) => {
|
|
38
|
+
const array = this.getArray(container);
|
|
39
|
+
return idxOrName === undefined || isNumber(idxOrName)
|
|
40
|
+
? array[idxOrName ?? defaultIndex]
|
|
41
|
+
: array.find(t => t.name === idxOrName);
|
|
42
|
+
};
|
|
43
|
+
container.addEmitter = async (options, position) => this.addEmitter(container, options, position);
|
|
44
|
+
container.removeEmitter = (idxOrName) => {
|
|
45
|
+
const emitter = container.getEmitter?.(idxOrName);
|
|
46
|
+
if (emitter) {
|
|
47
|
+
this.removeEmitter(container, emitter);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
container.playEmitter = (idxOrName) => {
|
|
51
|
+
const emitter = container.getEmitter?.(idxOrName);
|
|
52
|
+
if (emitter) {
|
|
53
|
+
emitter.externalPlay();
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
container.pauseEmitter = (idxOrName) => {
|
|
57
|
+
const emitter = container.getEmitter?.(idxOrName);
|
|
58
|
+
if (emitter) {
|
|
59
|
+
emitter.externalPause();
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
removeEmitter(container, emitter) {
|
|
64
|
+
const index = this.getArray(container).indexOf(emitter), minIndex = 0, deleteCount = 1;
|
|
65
|
+
if (index >= minIndex) {
|
|
66
|
+
this.getArray(container).splice(index, deleteCount);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { ExternalInteractorBase, } from "@tsparticles/plugin-interactivity";
|
|
2
|
+
import { arrayRandomIndex, executeOnSingleOrMultiple, isArray, isInArray, itemFromArray, } from "@tsparticles/engine";
|
|
3
|
+
import { Emitter } from "./Options/Classes/Emitter.js";
|
|
4
|
+
import { defaultRandomOptions } from "./constants.js";
|
|
5
|
+
const emittersMode = "emitters";
|
|
6
|
+
export class EmittersInteractor extends ExternalInteractorBase {
|
|
7
|
+
constructor(instancesManager, container) {
|
|
8
|
+
super(container);
|
|
9
|
+
this._instancesManager = instancesManager;
|
|
10
|
+
this.handleClickMode = (mode, interactivityData) => {
|
|
11
|
+
const container = this.container, options = container.actualOptions, modeEmitters = options.interactivity.modes.emitters;
|
|
12
|
+
if (!modeEmitters || mode !== emittersMode) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
let emittersModeOptions;
|
|
16
|
+
if (isArray(modeEmitters.value)) {
|
|
17
|
+
const minLength = 0, modeEmittersCount = modeEmitters.value.length;
|
|
18
|
+
if (modeEmittersCount > minLength && modeEmitters.random.enable) {
|
|
19
|
+
emittersModeOptions = [];
|
|
20
|
+
const usedIndexes = new Set();
|
|
21
|
+
for (let i = 0; i < modeEmitters.random.count; i++) {
|
|
22
|
+
const idx = arrayRandomIndex(modeEmitters.value);
|
|
23
|
+
if (usedIndexes.has(idx) && usedIndexes.size < modeEmittersCount) {
|
|
24
|
+
i--;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
usedIndexes.add(idx);
|
|
28
|
+
const selectedOptions = itemFromArray(modeEmitters.value, idx);
|
|
29
|
+
if (!selectedOptions) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
emittersModeOptions.push(selectedOptions);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
emittersModeOptions = modeEmitters.value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
emittersModeOptions = modeEmitters.value;
|
|
41
|
+
}
|
|
42
|
+
const emittersOptions = emittersModeOptions, ePosition = interactivityData.mouse.clickPosition;
|
|
43
|
+
void executeOnSingleOrMultiple(emittersOptions, async (emitter) => {
|
|
44
|
+
await this._instancesManager.addEmitter(this.container, emitter, ePosition);
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
clear() {
|
|
49
|
+
}
|
|
50
|
+
init() {
|
|
51
|
+
}
|
|
52
|
+
interact(_interactivityData, delta) {
|
|
53
|
+
for (const emitter of this._instancesManager.getArray(this.container)) {
|
|
54
|
+
emitter.update(delta);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
isEnabled(interactivityData, particle) {
|
|
58
|
+
const container = this.container, options = container.actualOptions, mouse = interactivityData.mouse, events = (particle?.interactivity ?? options.interactivity).events;
|
|
59
|
+
if (!mouse.clickPosition || !events.onClick.enable) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return isInArray(emittersMode, events.onClick.mode);
|
|
63
|
+
}
|
|
64
|
+
loadModeOptions(options, ...sources) {
|
|
65
|
+
options.emitters = {
|
|
66
|
+
random: defaultRandomOptions,
|
|
67
|
+
value: [],
|
|
68
|
+
};
|
|
69
|
+
for (const source of sources) {
|
|
70
|
+
if (!source?.emitters) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (isArray(source.emitters)) {
|
|
74
|
+
for (const emitter of source.emitters) {
|
|
75
|
+
const tmp = new Emitter();
|
|
76
|
+
tmp.load(emitter);
|
|
77
|
+
options.emitters.value.push(tmp);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if (Object.hasOwn(source.emitters, "value")) {
|
|
81
|
+
const emitterModeOptions = source.emitters;
|
|
82
|
+
options.emitters.random.enable = emitterModeOptions.random?.enable ?? options.emitters.random.enable;
|
|
83
|
+
options.emitters.random.count = emitterModeOptions.random?.count ?? options.emitters.random.count;
|
|
84
|
+
if (isArray(emitterModeOptions.value)) {
|
|
85
|
+
for (const emitter of emitterModeOptions.value) {
|
|
86
|
+
const tmp = new Emitter();
|
|
87
|
+
tmp.load(emitter);
|
|
88
|
+
options.emitters.value.push(tmp);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const tmp = new Emitter();
|
|
93
|
+
tmp.load(emitterModeOptions.value);
|
|
94
|
+
options.emitters.value.push(tmp);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const tmp = new Emitter();
|
|
99
|
+
tmp.load(source.emitters);
|
|
100
|
+
options.emitters.value.push(tmp);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
removeEmitter(emitter) {
|
|
105
|
+
const index = this._instancesManager.getArray(this.container).indexOf(emitter), minIndex = 0, deleteCount = 1;
|
|
106
|
+
if (index >= minIndex) {
|
|
107
|
+
this._instancesManager.getArray(this.container).splice(index, deleteCount);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
reset() {
|
|
111
|
+
}
|
|
112
|
+
}
|
package/esm/EmittersPlugin.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import { executeOnSingleOrMultiple, isArray,
|
|
1
|
+
import { executeOnSingleOrMultiple, isArray, } from "@tsparticles/engine";
|
|
2
2
|
import { Emitter } from "./Options/Classes/Emitter.js";
|
|
3
|
-
import { EmitterClickMode } from "./Enums/EmitterClickMode.js";
|
|
4
|
-
import { Emitters } from "./Emitters.js";
|
|
5
3
|
export class EmittersPlugin {
|
|
6
|
-
constructor(
|
|
7
|
-
this.
|
|
4
|
+
constructor(instancesManager) {
|
|
5
|
+
this._instancesManager = instancesManager;
|
|
8
6
|
this.id = "emitters";
|
|
9
7
|
}
|
|
10
|
-
getPlugin(container) {
|
|
11
|
-
|
|
8
|
+
async getPlugin(container) {
|
|
9
|
+
const { EmittersPluginInstance } = await import("./EmittersPluginInstance.js");
|
|
10
|
+
return new EmittersPluginInstance(this._instancesManager, container);
|
|
12
11
|
}
|
|
13
|
-
loadOptions(options, source) {
|
|
12
|
+
loadOptions(_container, options, source) {
|
|
14
13
|
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
15
14
|
return;
|
|
16
15
|
}
|
|
@@ -21,71 +20,12 @@ export class EmittersPlugin {
|
|
|
21
20
|
return tmp;
|
|
22
21
|
});
|
|
23
22
|
}
|
|
24
|
-
const interactivityEmitters = source?.interactivity?.modes?.emitters;
|
|
25
|
-
if (!interactivityEmitters) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const defaultRandomOptions = {
|
|
29
|
-
count: 1,
|
|
30
|
-
enable: true,
|
|
31
|
-
};
|
|
32
|
-
if (isArray(interactivityEmitters)) {
|
|
33
|
-
options.interactivity.modes.emitters = {
|
|
34
|
-
random: defaultRandomOptions,
|
|
35
|
-
value: interactivityEmitters.map(s => {
|
|
36
|
-
const tmp = new Emitter();
|
|
37
|
-
tmp.load(s);
|
|
38
|
-
return tmp;
|
|
39
|
-
}),
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
const emitterMode = interactivityEmitters;
|
|
44
|
-
if (Object.hasOwn(emitterMode, "value")) {
|
|
45
|
-
const emitterModeOptions = emitterMode;
|
|
46
|
-
if (isArray(emitterModeOptions.value)) {
|
|
47
|
-
options.interactivity.modes.emitters = {
|
|
48
|
-
random: {
|
|
49
|
-
count: emitterModeOptions.random?.count ?? defaultRandomOptions.count,
|
|
50
|
-
enable: emitterModeOptions.random?.enable ?? defaultRandomOptions.enable,
|
|
51
|
-
},
|
|
52
|
-
value: emitterModeOptions.value.map(s => {
|
|
53
|
-
const tmp = new Emitter();
|
|
54
|
-
tmp.load(s);
|
|
55
|
-
return tmp;
|
|
56
|
-
}),
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
const tmp = new Emitter();
|
|
61
|
-
tmp.load(emitterModeOptions.value);
|
|
62
|
-
options.interactivity.modes.emitters = {
|
|
63
|
-
random: {
|
|
64
|
-
count: emitterModeOptions.random?.count ?? defaultRandomOptions.count,
|
|
65
|
-
enable: emitterModeOptions.random?.enable ?? defaultRandomOptions.enable,
|
|
66
|
-
},
|
|
67
|
-
value: tmp,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
const tmp = new Emitter();
|
|
73
|
-
tmp.load(emitterMode);
|
|
74
|
-
options.interactivity.modes.emitters = {
|
|
75
|
-
random: defaultRandomOptions,
|
|
76
|
-
value: tmp,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
23
|
}
|
|
81
24
|
needsPlugin(options) {
|
|
82
25
|
if (!options) {
|
|
83
26
|
return false;
|
|
84
27
|
}
|
|
85
28
|
const emitters = options.emitters;
|
|
86
|
-
return (
|
|
87
|
-
emitters !== undefined ||
|
|
88
|
-
(!!options.interactivity?.events?.onClick?.mode &&
|
|
89
|
-
isInArray(EmitterClickMode.emitter, options.interactivity.events.onClick.mode)));
|
|
29
|
+
return (isArray(emitters) && !!emitters.length) || emitters !== undefined;
|
|
90
30
|
}
|
|
91
31
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { isArray } from "@tsparticles/engine";
|
|
2
|
+
export class EmittersPluginInstance {
|
|
3
|
+
constructor(instancesManager, container) {
|
|
4
|
+
this.container = container;
|
|
5
|
+
this._instancesManager = instancesManager;
|
|
6
|
+
this._instancesManager.initContainer(container);
|
|
7
|
+
}
|
|
8
|
+
async init() {
|
|
9
|
+
const emittersOptions = this.container.actualOptions.emitters;
|
|
10
|
+
if (isArray(emittersOptions)) {
|
|
11
|
+
for (const emitterOptions of emittersOptions) {
|
|
12
|
+
await this._instancesManager.addEmitter(this.container, emitterOptions);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
await this._instancesManager.addEmitter(this.container, emittersOptions);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
pause() {
|
|
20
|
+
for (const emitter of this._instancesManager.getArray(this.container)) {
|
|
21
|
+
emitter.pause();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
play() {
|
|
25
|
+
for (const emitter of this._instancesManager.getArray(this.container)) {
|
|
26
|
+
emitter.play();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
resize() {
|
|
30
|
+
for (const emitter of this._instancesManager.getArray(this.container)) {
|
|
31
|
+
emitter.resize();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
stop() {
|
|
35
|
+
this._instancesManager.clear(this.container);
|
|
36
|
+
}
|
|
37
|
+
update(delta) {
|
|
38
|
+
this._instancesManager.getArray(this.container).forEach(emitter => {
|
|
39
|
+
emitter.update(delta);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
package/esm/constants.js
ADDED
package/esm/index.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
export function loadEmittersPlugin(engine) {
|
|
2
|
-
engine.checkVersion("4.0.0-alpha.
|
|
3
|
-
engine.register(async (e) => {
|
|
4
|
-
const { ShapeManager } = await import("./ShapeManager.js"), { EmittersPlugin } = await import("./EmittersPlugin.js");
|
|
1
|
+
export async function loadEmittersPlugin(engine) {
|
|
2
|
+
engine.checkVersion("4.0.0-alpha.5");
|
|
3
|
+
await engine.register(async (e) => {
|
|
4
|
+
const { loadInteractivityPlugin } = await import("@tsparticles/plugin-interactivity"), { ShapeManager } = await import("./ShapeManager.js"), { EmittersInstancesManager } = await import("./EmittersInstancesManager.js"), { EmittersPlugin } = await import("./EmittersPlugin.js"), instancesManager = new EmittersInstancesManager(e);
|
|
5
|
+
await loadInteractivityPlugin(e);
|
|
5
6
|
e.emitterShapeManager ??= new ShapeManager();
|
|
6
7
|
e.addEmitterShapeGenerator ??= (name, generator) => {
|
|
7
8
|
e.emitterShapeManager?.addShapeGenerator(name, generator);
|
|
8
9
|
};
|
|
9
|
-
|
|
10
|
-
e.
|
|
10
|
+
e.addPlugin(new EmittersPlugin(instancesManager));
|
|
11
|
+
e.addInteractor?.("externalEmitters", async (container) => {
|
|
12
|
+
const { EmittersInteractor } = await import("./EmittersInteractor.js");
|
|
13
|
+
return new EmittersInteractor(instancesManager, container);
|
|
14
|
+
});
|
|
11
15
|
});
|
|
12
16
|
}
|
|
13
17
|
export * from "./EmitterShapeBase.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsparticles/plugin-emitters",
|
|
3
|
-
"version": "4.0.0-alpha.
|
|
3
|
+
"version": "4.0.0-alpha.5",
|
|
4
4
|
"description": "tsParticles emitters plugin",
|
|
5
5
|
"homepage": "https://particles.js.org",
|
|
6
6
|
"repository": {
|
|
@@ -86,7 +86,8 @@
|
|
|
86
86
|
"./package.json": "./package.json"
|
|
87
87
|
},
|
|
88
88
|
"dependencies": {
|
|
89
|
-
"@tsparticles/engine": "4.0.0-alpha.
|
|
89
|
+
"@tsparticles/engine": "4.0.0-alpha.5",
|
|
90
|
+
"@tsparticles/plugin-interactivity": "4.0.0-alpha.5"
|
|
90
91
|
},
|
|
91
92
|
"publishConfig": {
|
|
92
93
|
"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/plugin-emitters [
|
|
6
|
+
<title>@tsparticles/plugin-emitters [21 Jan 2026 at 19:04]</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>
|