@tsparticles/plugin-emitters
Version:
tsParticles emitters plugin
72 lines (71 loc) • 2.65 kB
JavaScript
import { isNumber } from "@tsparticles/engine";
import { Emitter } from "./Options/Classes/Emitter.js";
const defaultIndex = 0;
export class EmittersInstancesManager {
#containerArrays;
#pluginManager;
constructor(pluginManager) {
this.#containerArrays = new Map();
this.#pluginManager = pluginManager;
}
async addEmitter(container, options, position) {
const emitterOptions = new Emitter();
emitterOptions.load(options);
const { EmitterInstance } = await import("./EmitterInstance.js"), emitter = new EmitterInstance(this.#pluginManager, container, (emitter) => {
this.removeEmitter(container, emitter);
}, emitterOptions, position);
await emitter.init();
this.getArray(container).push(emitter);
return emitter;
}
clear(container) {
this.initContainer(container);
this.#containerArrays.set(container, []);
}
getArray(container) {
this.initContainer(container);
let array = this.#containerArrays.get(container);
if (!array) {
array = [];
this.#containerArrays.set(container, array);
}
return array;
}
initContainer(container) {
if (this.#containerArrays.has(container)) {
return;
}
this.#containerArrays.set(container, []);
container.getEmitter = (idxOrName) => {
const array = this.getArray(container);
return idxOrName === undefined || isNumber(idxOrName)
? array[idxOrName ?? defaultIndex]
: array.find(t => t.name === idxOrName);
};
container.addEmitter = async (options, position) => this.addEmitter(container, options, position);
container.removeEmitter = (idxOrName) => {
const emitter = container.getEmitter?.(idxOrName);
if (emitter) {
this.removeEmitter(container, 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();
}
};
}
removeEmitter(container, emitter) {
const index = this.getArray(container).indexOf(emitter), minIndex = 0, deleteCount = 1;
if (index >= minIndex) {
this.getArray(container).splice(index, deleteCount);
}
}
}