UNPKG

@tsparticles/updater-orbit

Version:

tsParticles particles orbit updater

76 lines (75 loc) 3.32 kB
import { defaultOpacity, doublePI, getRangeValue, half, loadOptionProperty, rangeColorToHsl, } from "@tsparticles/engine"; import { Orbit } from "./Options/Classes/Orbit.js"; import { OrbitType } from "./Enums.js"; import { drawEllipse } from "./Utils.js"; const defaultOrbitSpeed = 0, halfPI = Math.PI * half, piAndAHalf = Math.PI + halfPI, startAngle = 0, defaultWidth = 1, defaultRotation = 0; export class OrbitUpdater { #container; #pluginManager; constructor(pluginManager, container) { this.#pluginManager = pluginManager; this.#container = container; } afterDraw(particle) { const orbitOptions = particle.options.orbit; if (orbitOptions?.enable) { this.drawOrbit(particle, OrbitType.front); } } beforeDraw(particle) { const orbitOptions = particle.options.orbit; if (orbitOptions?.enable) { this.drawOrbit(particle, OrbitType.back); } } drawOrbit(particle, type) { const container = this.#container; let start, end; switch (type) { case OrbitType.back: start = halfPI; end = piAndAHalf; break; case OrbitType.front: start = piAndAHalf; end = halfPI; break; default: start = startAngle; end = doublePI; } container.canvas.render.draw(ctx => { drawEllipse(container, ctx, particle, particle.orbitColor ?? particle.getFillColor(), particle.retina.orbitRadius ?? container.retina.orbitRadius ?? particle.getRadius(), particle.orbitOpacity ?? defaultOpacity, particle.orbitWidth ?? defaultWidth, (particle.orbitRotation ?? defaultRotation) * container.retina.pixelRatio, start, end); }); } init(particle) { const container = this.#container, particlesOptions = particle.options, orbitOptions = particlesOptions.orbit; if (!orbitOptions?.enable) { return; } particle.orbitRotation = getRangeValue(orbitOptions.rotation.value); particle.orbitColor = rangeColorToHsl(this.#pluginManager, orbitOptions.color); particle.retina.orbitRadius = orbitOptions.radius !== undefined ? getRangeValue(orbitOptions.radius) * container.retina.pixelRatio : undefined; container.retina.orbitRadius = particle.retina.orbitRadius; particle.orbitAnimationSpeed = orbitOptions.animation.enable ? getRangeValue(orbitOptions.animation.speed) : defaultOrbitSpeed; particle.orbitWidth = getRangeValue(orbitOptions.width); particle.orbitOpacity = getRangeValue(orbitOptions.opacity); } isEnabled(particle) { const orbitAnimations = particle.options.orbit?.animation; return !particle.destroyed && !particle.spawning && !!orbitAnimations?.enable; } loadOptions(options, ...sources) { loadOptionProperty(options, "orbit", Orbit, ...sources); } update(particle, delta) { if (!this.isEnabled(particle)) { return; } particle.orbitRotation ??= defaultRotation; particle.orbitRotation += (particle.orbitAnimationSpeed ?? defaultOrbitSpeed / doublePI) * delta.factor; } }