158 lines
7.7 KiB
JavaScript
158 lines
7.7 KiB
JavaScript
(function (factory) {
|
|
if (typeof module === "object" && typeof module.exports === "object") {
|
|
var v = factory(require, exports);
|
|
if (v !== undefined) module.exports = v;
|
|
}
|
|
else if (typeof define === "function" && define.amd) {
|
|
define(["require", "exports", "./Utils", "tsparticles-engine"], factory);
|
|
}
|
|
})(function (require, exports) {
|
|
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.LinkInstance = void 0;
|
|
const Utils_1 = require("./Utils");
|
|
const tsparticles_engine_1 = require("tsparticles-engine");
|
|
function getLinkKey(ids) {
|
|
ids.sort((a, b) => a - b);
|
|
return ids.join("_");
|
|
}
|
|
function setLinkFrequency(particles, dictionary) {
|
|
const key = getLinkKey(particles.map((t) => t.id));
|
|
let res = dictionary.get(key);
|
|
if (res === undefined) {
|
|
res = (0, tsparticles_engine_1.getRandom)();
|
|
dictionary.set(key, res);
|
|
}
|
|
return res;
|
|
}
|
|
class LinkInstance {
|
|
constructor(container) {
|
|
this.container = container;
|
|
this._freqs = {
|
|
links: new Map(),
|
|
triangles: new Map(),
|
|
};
|
|
}
|
|
drawParticle(context, particle) {
|
|
var _a;
|
|
const pOptions = particle.options;
|
|
if (!particle.links || particle.links.length <= 0) {
|
|
return;
|
|
}
|
|
const p1Links = particle.links.filter((l) => pOptions.links && this.getLinkFrequency(particle, l.destination) <= pOptions.links.frequency);
|
|
for (const link of p1Links) {
|
|
this.drawTriangles(pOptions, particle, link, p1Links);
|
|
if (link.opacity > 0 && ((_a = particle.retina.linksWidth) !== null && _a !== void 0 ? _a : 0) > 0) {
|
|
this.drawLinkLine(particle, link);
|
|
}
|
|
}
|
|
}
|
|
async init() {
|
|
this._freqs.links = new Map();
|
|
this._freqs.triangles = new Map();
|
|
}
|
|
particleCreated(particle) {
|
|
particle.links = [];
|
|
if (!particle.options.links) {
|
|
return;
|
|
}
|
|
const ratio = this.container.retina.pixelRatio;
|
|
particle.retina.linksDistance = particle.options.links.distance * ratio;
|
|
particle.retina.linksWidth = particle.options.links.width * ratio;
|
|
}
|
|
particleDestroyed(particle) {
|
|
particle.links = [];
|
|
}
|
|
drawLinkLine(p1, link) {
|
|
const container = this.container, options = container.actualOptions, p2 = link.destination, pos1 = p1.getPosition(), pos2 = p2.getPosition();
|
|
let opacity = link.opacity;
|
|
container.canvas.draw((ctx) => {
|
|
var _a, _b, _c;
|
|
if (!p1.options.links) {
|
|
return;
|
|
}
|
|
let colorLine;
|
|
const twinkle = (_a = p1.options.twinkle) === null || _a === void 0 ? void 0 : _a.lines;
|
|
if (twinkle === null || twinkle === void 0 ? void 0 : twinkle.enable) {
|
|
const twinkleFreq = twinkle.frequency, twinkleRgb = (0, tsparticles_engine_1.rangeColorToRgb)(twinkle.color), twinkling = (0, tsparticles_engine_1.getRandom)() < twinkleFreq;
|
|
if (twinkling && twinkleRgb) {
|
|
colorLine = twinkleRgb;
|
|
opacity = (0, tsparticles_engine_1.getRangeValue)(twinkle.opacity);
|
|
}
|
|
}
|
|
if (!colorLine) {
|
|
const linksOptions = p1.options.links, linkColor = (linksOptions === null || linksOptions === void 0 ? void 0 : linksOptions.id) !== undefined
|
|
? container.particles.linksColors.get(linksOptions.id)
|
|
: container.particles.linksColor;
|
|
colorLine = (0, tsparticles_engine_1.getLinkColor)(p1, p2, linkColor);
|
|
}
|
|
if (!colorLine) {
|
|
return;
|
|
}
|
|
const width = (_b = p1.retina.linksWidth) !== null && _b !== void 0 ? _b : 0, maxDistance = (_c = p1.retina.linksDistance) !== null && _c !== void 0 ? _c : 0;
|
|
(0, Utils_1.drawLinkLine)(ctx, width, pos1, pos2, maxDistance, container.canvas.size, p1.options.links.warp, options.backgroundMask.enable, options.backgroundMask.composite, colorLine, opacity, p1.options.links.shadow);
|
|
});
|
|
}
|
|
drawLinkTriangle(p1, link1, link2) {
|
|
var _a;
|
|
if (!p1.options.links) {
|
|
return;
|
|
}
|
|
const container = this.container, options = container.actualOptions, p2 = link1.destination, p3 = link2.destination, triangleOptions = p1.options.links.triangles, opacityTriangle = (_a = triangleOptions.opacity) !== null && _a !== void 0 ? _a : (link1.opacity + link2.opacity) / 2;
|
|
if (opacityTriangle <= 0) {
|
|
return;
|
|
}
|
|
container.canvas.draw((ctx) => {
|
|
var _a;
|
|
const pos1 = p1.getPosition(), pos2 = p2.getPosition(), pos3 = p3.getPosition(), linksDistance = (_a = p1.retina.linksDistance) !== null && _a !== void 0 ? _a : 0;
|
|
if ((0, tsparticles_engine_1.getDistance)(pos1, pos2) > linksDistance ||
|
|
(0, tsparticles_engine_1.getDistance)(pos3, pos2) > linksDistance ||
|
|
(0, tsparticles_engine_1.getDistance)(pos3, pos1) > linksDistance) {
|
|
return;
|
|
}
|
|
let colorTriangle = (0, tsparticles_engine_1.rangeColorToRgb)(triangleOptions.color);
|
|
if (!colorTriangle) {
|
|
const linksOptions = p1.options.links, linkColor = (linksOptions === null || linksOptions === void 0 ? void 0 : linksOptions.id) !== undefined
|
|
? container.particles.linksColors.get(linksOptions.id)
|
|
: container.particles.linksColor;
|
|
colorTriangle = (0, tsparticles_engine_1.getLinkColor)(p1, p2, linkColor);
|
|
}
|
|
if (!colorTriangle) {
|
|
return;
|
|
}
|
|
(0, Utils_1.drawLinkTriangle)(ctx, pos1, pos2, pos3, options.backgroundMask.enable, options.backgroundMask.composite, colorTriangle, opacityTriangle);
|
|
});
|
|
}
|
|
drawTriangles(options, p1, link, p1Links) {
|
|
var _a, _b, _c;
|
|
const p2 = link.destination;
|
|
if (!(((_a = options.links) === null || _a === void 0 ? void 0 : _a.triangles.enable) && ((_b = p2.options.links) === null || _b === void 0 ? void 0 : _b.triangles.enable))) {
|
|
return;
|
|
}
|
|
const vertices = (_c = p2.links) === null || _c === void 0 ? void 0 : _c.filter((t) => {
|
|
const linkFreq = this.getLinkFrequency(p2, t.destination);
|
|
return (p2.options.links &&
|
|
linkFreq <= p2.options.links.frequency &&
|
|
p1Links.findIndex((l) => l.destination === t.destination) >= 0);
|
|
});
|
|
if (!(vertices === null || vertices === void 0 ? void 0 : vertices.length)) {
|
|
return;
|
|
}
|
|
for (const vertex of vertices) {
|
|
const p3 = vertex.destination, triangleFreq = this.getTriangleFrequency(p1, p2, p3);
|
|
if (triangleFreq > options.links.triangles.frequency) {
|
|
continue;
|
|
}
|
|
this.drawLinkTriangle(p1, link, vertex);
|
|
}
|
|
}
|
|
getLinkFrequency(p1, p2) {
|
|
return setLinkFrequency([p1, p2], this._freqs.links);
|
|
}
|
|
getTriangleFrequency(p1, p2, p3) {
|
|
return setLinkFrequency([p1, p2, p3], this._freqs.triangles);
|
|
}
|
|
}
|
|
exports.LinkInstance = LinkInstance;
|
|
});
|