"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Attractor = void 0; const tsparticles_engine_1 = require("tsparticles-engine"); const Attract_1 = require("./Options/Classes/Attract"); class Attractor extends tsparticles_engine_1.ExternalInteractorBase { constructor(engine, container) { super(container); this._engine = engine; if (!container.attract) { container.attract = { particles: [] }; } this.handleClickMode = (mode) => { const options = this.container.actualOptions, attract = options.interactivity.modes.attract; if (!attract || mode !== "attract") { return; } if (!container.attract) { container.attract = { particles: [] }; } container.attract.clicking = true; container.attract.count = 0; for (const particle of container.attract.particles) { if (!this.isEnabled(particle)) { continue; } particle.velocity.setTo(particle.initialVelocity); } container.attract.particles = []; container.attract.finish = false; setTimeout(() => { if (!container.destroyed) { if (!container.attract) { container.attract = { particles: [] }; } container.attract.clicking = false; } }, attract.duration * 1000); }; } clear() { } init() { const container = this.container, attract = container.actualOptions.interactivity.modes.attract; if (!attract) { return; } container.retina.attractModeDistance = attract.distance * container.retina.pixelRatio; } interact() { return __awaiter(this, void 0, void 0, function* () { const container = this.container, options = container.actualOptions, mouseMoveStatus = container.interactivity.status === tsparticles_engine_1.mouseMoveEvent, events = options.interactivity.events, hoverEnabled = events.onHover.enable, hoverMode = events.onHover.mode, clickEnabled = events.onClick.enable, clickMode = events.onClick.mode; if (mouseMoveStatus && hoverEnabled && (0, tsparticles_engine_1.isInArray)("attract", hoverMode)) { this.hoverAttract(); } else if (clickEnabled && (0, tsparticles_engine_1.isInArray)("attract", clickMode)) { this.clickAttract(); } }); } isEnabled(particle) { var _a; const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = ((_a = particle === null || particle === void 0 ? void 0 : particle.interactivity) !== null && _a !== void 0 ? _a : options.interactivity).events; if ((!mouse.position || !events.onHover.enable) && (!mouse.clickPosition || !events.onClick.enable)) { return false; } const hoverMode = events.onHover.mode, clickMode = events.onClick.mode; return (0, tsparticles_engine_1.isInArray)("attract", hoverMode) || (0, tsparticles_engine_1.isInArray)("attract", clickMode); } loadModeOptions(options, ...sources) { if (!options.attract) { options.attract = new Attract_1.Attract(); } for (const source of sources) { options.attract.load(source === null || source === void 0 ? void 0 : source.attract); } } reset() { } clickAttract() { const container = this.container; if (!container.attract) { container.attract = { particles: [] }; } if (!container.attract.finish) { if (!container.attract.count) { container.attract.count = 0; } container.attract.count++; if (container.attract.count === container.particles.count) { container.attract.finish = true; } } if (container.attract.clicking) { const mousePos = container.interactivity.mouse.clickPosition, attractRadius = container.retina.attractModeDistance; if (!attractRadius || attractRadius < 0 || !mousePos) { return; } this.processAttract(mousePos, attractRadius, new tsparticles_engine_1.Circle(mousePos.x, mousePos.y, attractRadius)); } else if (container.attract.clicking === false) { container.attract.particles = []; } return; } hoverAttract() { const container = this.container, mousePos = container.interactivity.mouse.position, attractRadius = container.retina.attractModeDistance; if (!attractRadius || attractRadius < 0 || !mousePos) { return; } this.processAttract(mousePos, attractRadius, new tsparticles_engine_1.Circle(mousePos.x, mousePos.y, attractRadius)); } processAttract(position, attractRadius, area) { const container = this.container, attractOptions = container.actualOptions.interactivity.modes.attract; if (!attractOptions) { return; } const query = container.particles.quadTree.query(area, (p) => this.isEnabled(p)); for (const particle of query) { const { dx, dy, distance } = (0, tsparticles_engine_1.getDistances)(particle.position, position); const velocity = attractOptions.speed * attractOptions.factor; const attractFactor = (0, tsparticles_engine_1.clamp)((0, tsparticles_engine_1.getEasing)(attractOptions.easing)(1 - distance / attractRadius) * velocity, 0, attractOptions.maxSpeed); const normVec = tsparticles_engine_1.Vector.create(distance === 0 ? velocity : (dx / distance) * attractFactor, distance === 0 ? velocity : (dy / distance) * attractFactor); particle.position.subFrom(normVec); } } } exports.Attractor = Attractor;