UNPKG

@tsparticles/plugin-emitters

Version:

tsParticles emitters plugin

128 lines (127 loc) 4.54 kB
import { arrayRandomIndex, executeOnSingleOrMultiple, isArray, isNumber, itemFromArray, } from "@tsparticles/engine"; import { Emitter } from "./Options/Classes/Emitter.js"; import { EmitterClickMode } from "./Enums/EmitterClickMode.js"; import { EmitterInstance } from "./EmitterInstance.js"; export class Emitters { constructor(engine, container) { this.container = container; this._engine = engine; this.array = []; this.emitters = []; this.interactivityEmitters = { random: { count: 1, enable: false, }, value: [], }; const defaultIndex = 0; container.getEmitter = (idxOrName) => idxOrName === undefined || isNumber(idxOrName) ? this.array[idxOrName ?? defaultIndex] : this.array.find(t => t.name === idxOrName); container.addEmitter = async (options, position) => this.addEmitter(options, position); container.removeEmitter = (idxOrName) => { const emitter = container.getEmitter(idxOrName); if (emitter) { this.removeEmitter(emitter); } }; container.playEmitter = (idxOrName) => { const emitter = container.getEmitter(idxOrName); if (emitter) { emitter.externalPlay(); } }; container.pauseEmitter = (idxOrName) => { const emitter = container.getEmitter(idxOrName); if (emitter) { emitter.externalPause(); } }; } async addEmitter(options, position) { const emitterOptions = new Emitter(); emitterOptions.load(options); const emitter = new EmitterInstance(this._engine, this, this.container, emitterOptions, position); await emitter.init(); this.array.push(emitter); return emitter; } handleClickMode(mode) { const emitterOptions = this.emitters, modeEmitters = this.interactivityEmitters; if (mode !== EmitterClickMode.emitter) { return; } let emittersModeOptions; if (modeEmitters && isArray(modeEmitters.value)) { const minLength = 0; if (modeEmitters.value.length > minLength && modeEmitters.random.enable) { emittersModeOptions = []; const usedIndexes = []; for (let i = 0; i < modeEmitters.random.count; i++) { const idx = arrayRandomIndex(modeEmitters.value); if (usedIndexes.includes(idx) && usedIndexes.length < modeEmitters.value.length) { i--; continue; } usedIndexes.push(idx); emittersModeOptions.push(itemFromArray(modeEmitters.value, idx)); } } else { emittersModeOptions = modeEmitters.value; } } else { emittersModeOptions = modeEmitters?.value; } const emittersOptions = emittersModeOptions ?? emitterOptions, ePosition = this.container.interactivity.mouse.clickPosition; void executeOnSingleOrMultiple(emittersOptions, async (emitter) => { await this.addEmitter(emitter, ePosition); }); } async init() { this.emitters = this.container.actualOptions.emitters; this.interactivityEmitters = this.container.actualOptions.interactivity.modes.emitters; if (!this.emitters) { return; } if (isArray(this.emitters)) { for (const emitterOptions of this.emitters) { await this.addEmitter(emitterOptions); } } else { await this.addEmitter(this.emitters); } } pause() { for (const emitter of this.array) { emitter.pause(); } } play() { for (const emitter of this.array) { emitter.play(); } } removeEmitter(emitter) { const index = this.array.indexOf(emitter), minIndex = 0, deleteCount = 1; if (index >= minIndex) { this.array.splice(index, deleteCount); } } resize() { for (const emitter of this.array) { emitter.resize(); } } stop() { this.array = []; } update(delta) { for (const emitter of this.array) { emitter.update(delta); } } }