UNPKG

tsparticles

Version:

Easily create highly customizable particle animations and use them as animated backgrounds for your website. Ready to use components available also for React, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Riot.js, Inferno.

128 lines (127 loc) 4.55 kB
import { EmitterInstance } from "./EmitterInstance"; import { Emitter } from "./Options/Classes/Emitter"; import { EmitterClickMode } from "./Enums"; import { deepExtend, itemFromArray } from "../../Utils"; export class Emitters { constructor(container) { this.container = container; this.array = []; this.emitters = []; this.interactivityEmitters = []; const overridableContainer = container; overridableContainer.getEmitter = (idxOrName) => idxOrName === undefined || typeof idxOrName === "number" ? this.array[idxOrName || 0] : this.array.find((t) => t.name === idxOrName); overridableContainer.addEmitter = (options, position) => this.addEmitter(options, position); overridableContainer.playEmitter = (idxOrName) => { const emitter = overridableContainer.getEmitter(idxOrName); if (emitter) { emitter.externalPlay(); } }; overridableContainer.pauseEmitter = (idxOrName) => { const emitter = overridableContainer.getEmitter(idxOrName); if (emitter) { emitter.externalPause(); } }; } init(options) { var _a, _b; if (!options) { return; } if (options.emitters) { if (options.emitters instanceof Array) { this.emitters = options.emitters.map((s) => { const tmp = new Emitter(); tmp.load(s); return tmp; }); } else { if (this.emitters instanceof Array) { this.emitters = new Emitter(); } this.emitters.load(options.emitters); } } const interactivityEmitters = (_b = (_a = options.interactivity) === null || _a === void 0 ? void 0 : _a.modes) === null || _b === void 0 ? void 0 : _b.emitters; if (interactivityEmitters) { if (interactivityEmitters instanceof Array) { this.interactivityEmitters = interactivityEmitters.map((s) => { const tmp = new Emitter(); tmp.load(s); return tmp; }); } else { if (this.interactivityEmitters instanceof Array) { this.interactivityEmitters = new Emitter(); } this.interactivityEmitters.load(interactivityEmitters); } } if (this.emitters instanceof Array) { for (const emitterOptions of this.emitters) { this.addEmitter(emitterOptions); } } else { this.addEmitter(this.emitters); } } play() { for (const emitter of this.array) { emitter.play(); } } pause() { for (const emitter of this.array) { emitter.pause(); } } stop() { this.array = []; } update(delta) { for (const emitter of this.array) { emitter.update(delta); } } handleClickMode(mode) { const container = this.container; const emitterOptions = this.emitters; const modeEmitters = this.interactivityEmitters; if (mode === EmitterClickMode.emitter) { let emitterModeOptions; if (modeEmitters instanceof Array) { if (modeEmitters.length > 0) { emitterModeOptions = itemFromArray(modeEmitters); } } else { emitterModeOptions = modeEmitters; } const emittersOptions = emitterModeOptions !== null && emitterModeOptions !== void 0 ? emitterModeOptions : (emitterOptions instanceof Array ? itemFromArray(emitterOptions) : emitterOptions); const ePosition = container.interactivity.mouse.clickPosition; this.addEmitter(deepExtend({}, emittersOptions), ePosition); } } resize() { for (const emitter of this.array) { emitter.resize(); } } addEmitter(options, position) { const emitter = new EmitterInstance(this, this.container, options, position); this.array.push(emitter); return emitter; } removeEmitter(emitter) { const index = this.array.indexOf(emitter); if (index >= 0) { this.array.splice(index, 1); } } }