@visactor/vrender-animate 1.0.13-alpha.1 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -58,7 +58,7 @@ class HybridEffectBase extends DisappearAnimateBase_1.DisappearAnimateBase {
58
58
  afterStageRender(stage, canvas) {
59
59
  var _a, _b;
60
60
  let result = null;
61
- if (null === (_b = null === (_a = this.params) || void 0 === _a ? void 0 : _a.options) || void 0 === _b ? void 0 : _b.useWebGL) {
61
+ if (!1 !== (null === (_b = null === (_a = this.params) || void 0 === _a ? void 0 : _a.options) || void 0 === _b ? void 0 : _b.useWebGL)) {
62
62
  if (this.supportsWebGL() && (this.gl || this.initWebGL(canvas) || console.warn("WebGL初始化失败,尝试Canvas 2D回退"),
63
63
  this.gl)) {
64
64
  if (result = this.applyWebGLEffect(canvas), result) return result;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/custom/disappear/base/CustomEffectBase.ts"],"names":[],"mappings":"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","file":"CustomEffectBase.js","sourcesContent":["import type { EasingType } from '@visactor/vrender-core';\nimport { DisappearAnimateBase } from './DisappearAnimateBase';\n\n/**\n * 仅支持WebGL的特效基类\n * 适用于复杂的GPU计算特效,如粒子系统、复杂着色器特效等\n */\nexport abstract class WebGLEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 必须实现WebGL相关方法\n protected abstract getShaderSources(): { vertex: string; fragment: string };\n protected abstract applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement;\n\n // Canvas 2D回退:简单的透明度动画或返回原图\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement {\n console.warn(`${this.constructor.name}: WebGL不可用,使用简单透明度回退动画`);\n\n const outputCanvas = this.createOutputCanvas(canvas);\n if (!outputCanvas) {\n return canvas;\n }\n\n const { ctx } = outputCanvas;\n\n // 简单的透明度渐变作为回退\n ctx.globalAlpha = Math.max(0, 1 - this.currentAnimationRatio);\n ctx.drawImage(canvas, 0, 0);\n\n return outputCanvas.canvas;\n }\n}\n\n/**\n * 仅支持Canvas 2D的特效基类\n * 适用于简单的2D图像处理特效,如模糊、颜色调整等\n */\nexport abstract class Canvas2DEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 必须实现Canvas 2D方法\n protected abstract applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement;\n\n // 不支持WebGL,返回null\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n return null;\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null;\n }\n}\n\n/**\n * 混合实现特效基类\n * 既支持WebGL也支持Canvas 2D,根据环境自动选择\n */\nexport class HybridEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 可选实现WebGL方法\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n return null; // 子类可以重写\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null; // 子类可以重写\n }\n\n // 可选实现Canvas 2D方法\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null; // 子类可以重写\n }\n\n // 重写检查方法,使用更准确的检测\n protected supportsWebGL(): boolean {\n return this.getShaderSources !== HybridEffectBase.prototype.getShaderSources && this.getShaderSources() !== null;\n }\n\n protected supportsCanvas2D(): boolean {\n return this.applyCanvas2DEffect !== HybridEffectBase.prototype.applyCanvas2DEffect;\n }\n\n /**\n * 重写渲染方法,支持用户配置的 useWebGL 控制\n */\n protected afterStageRender(stage: any, canvas: HTMLCanvasElement): HTMLCanvasElement | void | null | false {\n let result: HTMLCanvasElement | null = null;\n\n // 根据用户配置决定渲染策略\n if (this.params?.options?.useWebGL) {\n // 用户允许使用WebGL,按照父类的自动判别逻辑\n // 优先尝试WebGL实现\n if (this.supportsWebGL()) {\n if (!this.gl && !this.initWebGL(canvas)) {\n console.warn('WebGL初始化失败,尝试Canvas 2D回退');\n }\n\n if (this.gl) {\n result = this.applyWebGLEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('WebGL特效执行失败,尝试Canvas 2D回退');\n }\n }\n\n // WebGL不可用或执行失败,尝试Canvas 2D回退\n if (this.supportsCanvas2D()) {\n result = this.applyCanvas2DEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('Canvas 2D特效执行失败');\n }\n } else {\n // 用户禁用WebGL,直接使用Canvas 2D\n if (this.supportsCanvas2D()) {\n result = this.applyCanvas2DEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('Canvas 2D特效执行失败');\n } else {\n console.warn(`${this.constructor.name}: useWebGL=false 但未实现Canvas 2D方法`);\n }\n }\n\n // 如果都不支持或都失败了,给出明确的错误信息\n if (!this.supportsWebGL() && !this.supportsCanvas2D()) {\n console.error(\n `特效类 ${this.constructor.name} 未实现任何渲染方法。请实现 applyWebGLEffect 或 applyCanvas2DEffect 方法。`\n );\n }\n\n // 返回原图作为最后的回退\n return canvas;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/custom/disappear/base/CustomEffectBase.ts"],"names":[],"mappings":"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","file":"CustomEffectBase.js","sourcesContent":["import type { EasingType } from '@visactor/vrender-core';\nimport { DisappearAnimateBase } from './DisappearAnimateBase';\n\n/**\n * 仅支持WebGL的特效基类\n * 适用于复杂的GPU计算特效,如粒子系统、复杂着色器特效等\n */\nexport abstract class WebGLEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 必须实现WebGL相关方法\n protected abstract getShaderSources(): { vertex: string; fragment: string };\n protected abstract applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement;\n\n // Canvas 2D回退:简单的透明度动画或返回原图\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement {\n console.warn(`${this.constructor.name}: WebGL不可用,使用简单透明度回退动画`);\n\n const outputCanvas = this.createOutputCanvas(canvas);\n if (!outputCanvas) {\n return canvas;\n }\n\n const { ctx } = outputCanvas;\n\n // 简单的透明度渐变作为回退\n ctx.globalAlpha = Math.max(0, 1 - this.currentAnimationRatio);\n ctx.drawImage(canvas, 0, 0);\n\n return outputCanvas.canvas;\n }\n}\n\n/**\n * 仅支持Canvas 2D的特效基类\n * 适用于简单的2D图像处理特效,如模糊、颜色调整等\n */\nexport abstract class Canvas2DEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 必须实现Canvas 2D方法\n protected abstract applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement;\n\n // 不支持WebGL,返回null\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n return null;\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null;\n }\n}\n\n/**\n * 混合实现特效基类\n * 既支持WebGL也支持Canvas 2D,根据环境自动选择\n */\nexport class HybridEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 可选实现WebGL方法\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n return null; // 子类可以重写\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null; // 子类可以重写\n }\n\n // 可选实现Canvas 2D方法\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null; // 子类可以重写\n }\n\n // 重写检查方法,使用更准确的检测\n protected supportsWebGL(): boolean {\n return this.getShaderSources !== HybridEffectBase.prototype.getShaderSources && this.getShaderSources() !== null;\n }\n\n protected supportsCanvas2D(): boolean {\n return this.applyCanvas2DEffect !== HybridEffectBase.prototype.applyCanvas2DEffect;\n }\n\n /**\n * 重写渲染方法,支持用户配置的 useWebGL 控制\n */\n protected afterStageRender(stage: any, canvas: HTMLCanvasElement): HTMLCanvasElement | void | null | false {\n let result: HTMLCanvasElement | null = null;\n\n // 根据用户配置决定渲染策略\n if (this.params?.options?.useWebGL !== false) {\n // 用户允许使用WebGL,按照父类的自动判别逻辑\n // 优先尝试WebGL实现\n if (this.supportsWebGL()) {\n if (!this.gl && !this.initWebGL(canvas)) {\n console.warn('WebGL初始化失败,尝试Canvas 2D回退');\n }\n\n if (this.gl) {\n result = this.applyWebGLEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('WebGL特效执行失败,尝试Canvas 2D回退');\n }\n }\n\n // WebGL不可用或执行失败,尝试Canvas 2D回退\n if (this.supportsCanvas2D()) {\n result = this.applyCanvas2DEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('Canvas 2D特效执行失败');\n }\n } else {\n // 用户禁用WebGL,直接使用Canvas 2D\n if (this.supportsCanvas2D()) {\n result = this.applyCanvas2DEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('Canvas 2D特效执行失败');\n } else {\n console.warn(`${this.constructor.name}: useWebGL=false 但未实现Canvas 2D方法`);\n }\n }\n\n // 如果都不支持或都失败了,给出明确的错误信息\n if (!this.supportsWebGL() && !this.supportsCanvas2D()) {\n console.error(\n `特效类 ${this.constructor.name} 未实现任何渲染方法。请实现 applyWebGLEffect 或 applyCanvas2DEffect 方法。`\n );\n }\n\n // 返回原图作为最后的回退\n return canvas;\n }\n}\n"]}
@@ -5,6 +5,7 @@ export interface ParticleConfig {
5
5
  count?: number;
6
6
  size?: number;
7
7
  strength?: number;
8
+ useWebGL: boolean;
8
9
  }
9
10
  export interface ParticleData {
10
11
  x: number;
@@ -8,13 +8,14 @@ const CustomEffectBase_1 = require("./base/CustomEffectBase"), ImageProcessUtils
8
8
 
9
9
  class Particle extends CustomEffectBase_1.HybridEffectBase {
10
10
  constructor(from, to, duration, easing, params) {
11
- var _a, _b, _c, _d;
11
+ var _a, _b, _c, _d, _e;
12
12
  super(from, to, duration, easing, params), this.particles = [], this.positionBuffer = null,
13
13
  this.colorBuffer = null, this.particleConfig = {
14
14
  effectType: (null === (_a = null == params ? void 0 : params.options) || void 0 === _a ? void 0 : _a.effectType) || "gravity",
15
15
  count: (null === (_b = null == params ? void 0 : params.options) || void 0 === _b ? void 0 : _b.count) || 4e3,
16
16
  size: (null === (_c = null == params ? void 0 : params.options) || void 0 === _c ? void 0 : _c.size) || 20,
17
- strength: (null === (_d = null == params ? void 0 : params.options) || void 0 === _d ? void 0 : _d.strength) || 1.5
17
+ strength: (null === (_d = null == params ? void 0 : params.options) || void 0 === _d ? void 0 : _d.strength) || 1.5,
18
+ useWebGL: void 0 === (null === (_e = null == params ? void 0 : params.options) || void 0 === _e ? void 0 : _e.useWebGL) || params.options.useWebGL
18
19
  };
19
20
  }
20
21
  getShaderSources() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/custom/disappear/particle.ts"],"names":[],"mappings":"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","file":"particle.js","sourcesContent":["import type { EasingType } from '@visactor/vrender-core';\nimport { HybridEffectBase } from './base/CustomEffectBase';\nimport { ImageProcessUtils } from './base/ImageProcessUtils';\n\nexport interface ParticleConfig {\n effectType?: 'explode' | 'vortex' | 'gravity'; // 粒子效果类型\n count?: number; // 粒子数量\n size?: number; // 粒子大小\n strength?: number; // 力场强度\n}\n// 粒子数据结构\nexport interface ParticleData {\n x: number;\n y: number;\n originX: number;\n originY: number;\n vx: number;\n vy: number;\n r: number;\n g: number;\n b: number;\n a: number;\n life: number;\n size: number;\n}\n\n/**\n * 重构后的粒子消散特效\n * 使用HybridEffectBase,优先WebGL实现,Canvas 2D回退\n */\nexport class Particle extends HybridEffectBase {\n private particles: ParticleData[] = [];\n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private particleConfig: ParticleConfig;\n\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n\n this.particleConfig = {\n effectType: params?.options?.effectType || 'gravity', //'explode' | 'vortex' | 'gravity'; // 粒子效果类型\n count: params?.options?.count || 4000,\n size: params?.options?.size || 20,\n strength: params?.options?.strength || 1.5\n };\n }\n\n // WebGL实现 - 高性能版本\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n const vertexShader = `\n attribute vec2 a_position;\n attribute vec4 a_color;\n attribute float a_size;\n\n uniform vec2 u_resolution;\n uniform float u_time;\n uniform float u_forceStrength;\n uniform int u_effectType;\n\n varying vec4 v_color;\n\n void main() {\n // 将像素坐标转换为剪辑空间坐标\n vec2 clipSpace = ((a_position / u_resolution) * 2.0) - 1.0;\n clipSpace.y = -clipSpace.y; // 翻转Y轴\n\n gl_Position = vec4(clipSpace, 0.0, 1.0);\n gl_PointSize = a_size;\n v_color = a_color;\n }\n `;\n\n const fragmentShader = `\n precision mediump float;\n varying vec4 v_color;\n\n void main() {\n // 创建圆形粒子\n vec2 coord = gl_PointCoord - vec2(0.5);\n float distance = length(coord);\n\n if (distance > 0.5) {\n discard;\n }\n\n // 保持原始颜色,只调整透明度渐变\n gl_FragColor = vec4(v_color.rgb, v_color.a);\n }\n `;\n\n return { vertex: vertexShader, fragment: fragmentShader };\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n if (!this.gl || !this.program || !this.webglCanvas) {\n return null;\n }\n\n // 使用基类提供的WebGL状态设置\n this.setupWebGLState(canvas);\n\n // 如果没有粒子,提取粒子数据\n if (this.particles.length === 0) {\n this.extractParticles(canvas);\n }\n\n // 更新粒子物理\n this.updateParticles(canvas);\n\n const gl = this.gl;\n\n // 启用混合\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n gl.useProgram(this.program);\n\n // 准备粒子数据并绘制\n this.prepareAndDrawParticles(gl);\n\n return this.webglCanvas;\n }\n\n // Canvas 2D回退实现 - 简化版本,主要用于兼容性\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n const output = this.createOutputCanvas(canvas);\n if (!output) {\n return null;\n }\n\n const { canvas: outputCanvas, ctx } = output;\n\n // 简化的粒子效果:使用透明度和简单变换模拟粒子消散\n const progress = this.currentAnimationRatio;\n\n // 根据效果类型应用不同的Canvas 2D模拟\n switch (this.particleConfig.effectType) {\n case 'explode':\n this.applyCanvas2DExplode(ctx, canvas, progress);\n break;\n case 'gravity':\n this.applyCanvas2DGravity(ctx, canvas, progress);\n break;\n case 'vortex':\n this.applyCanvas2DVortex(ctx, canvas, progress);\n break;\n default:\n // 默认简单透明度淡出\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.drawImage(canvas, 0, 0);\n }\n\n return outputCanvas;\n }\n\n /**\n * 从canvas提取粒子数据\n */\n private extractParticles(canvas: HTMLCanvasElement): void {\n const tempCanvas = ImageProcessUtils.createTempCanvas(canvas.width, canvas.height, 1);\n const tempCtx = tempCanvas.getContext('2d');\n if (!tempCtx) {\n return;\n }\n\n // 绘制原始图像到临时canvas\n tempCtx.drawImage(canvas, 0, 0, tempCanvas.width, tempCanvas.height);\n\n // 获取图像数据\n const imageData = tempCtx.getImageData(0, 0, tempCanvas.width, tempCanvas.height);\n const data = imageData.data;\n\n this.particles = [];\n\n // 计算采样步长\n const step = Math.max(\n 1,\n Math.floor(Math.sqrt((tempCanvas.width * tempCanvas.height) / (this.particleConfig.count * 1.5)))\n );\n\n for (let y = 0; y < tempCanvas.height; y += step) {\n for (let x = 0; x < tempCanvas.width; x += step) {\n const index = (y * tempCanvas.width + x) * 4;\n\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n // 只创建非透明像素的粒子\n if (a > 5) {\n // 将坐标转换回原始canvas尺寸\n const realX = (x / tempCanvas.width) * canvas.width;\n const realY = (y / tempCanvas.height) * canvas.height;\n\n const particle: ParticleData = {\n x: realX,\n y: realY,\n originX: realX,\n originY: realY,\n vx: 0,\n vy: 0,\n r: r / 255,\n g: g / 255,\n b: b / 255,\n a: Math.max(0.6, a / 255),\n life: 1.0,\n size: this.particleConfig.size * (1 + Math.random() * 0.5)\n };\n\n this.particles.push(particle);\n }\n }\n }\n }\n\n /**\n * 更新粒子物理模拟\n */\n private updateParticles(canvas: HTMLCanvasElement): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n const progress = this.currentAnimationRatio;\n const duration = this.getDurationFromParent();\n const isShortAnimation = duration < 2000;\n const timeMultiplier = isShortAnimation ? Math.max(1.5, 3000 / duration) : 1.0;\n const intensityBoost = isShortAnimation ? Math.min(2.0, 2000 / duration) : 1.0;\n\n this.particles.forEach(particle => {\n const dx = particle.x - centerX;\n const dy = particle.y - centerY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const angle = Math.atan2(dy, dx);\n\n // 根据效果类型应用不同的物理力\n this.applyParticleForces(particle, angle, distance, progress, intensityBoost, canvas);\n\n // 更新粒子属性\n this.updateParticleProperties(particle, progress, isShortAnimation, timeMultiplier, intensityBoost);\n });\n }\n\n /**\n * 根据效果类型应用粒子力\n */\n private applyParticleForces(\n particle: ParticleData,\n angle: number,\n distance: number,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement\n ): void {\n const time = this.getAnimationTime();\n\n switch (this.particleConfig.effectType) {\n case 'explode':\n const explodeIntensity = progress * this.particleConfig.strength * intensityBoost * 5;\n particle.vx += Math.cos(angle) * explodeIntensity;\n particle.vy += Math.sin(angle) * explodeIntensity;\n break;\n\n case 'gravity':\n this.applyGravityEffect(particle, progress, intensityBoost, canvas, time);\n break;\n\n case 'vortex':\n this.applyVortexEffect(particle, progress, intensityBoost, canvas, angle, distance);\n break;\n }\n }\n\n /**\n * 应用重力效果\n */\n private applyGravityEffect(\n particle: ParticleData,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement,\n time: number\n ): void {\n const gravityThreshold = ((particle.originX + particle.originY * 0.7) / (canvas.width + canvas.height)) * 0.8;\n\n if (progress > gravityThreshold) {\n const gravityProgress = (progress - gravityThreshold) / (1 - gravityThreshold);\n const gravityForce = this.particleConfig.strength * gravityProgress * gravityProgress * 12 * intensityBoost;\n\n particle.vy += gravityForce;\n\n // 添加水平随机扰动\n const turbulence = Math.sin(time * 3 + particle.originX * 0.02) * Math.cos(time * 2 + particle.originY * 0.015);\n particle.vx += turbulence * this.particleConfig.strength * 2 * intensityBoost;\n }\n }\n\n /**\n * 应用漩涡效果\n */\n private applyVortexEffect(\n particle: ParticleData,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement,\n angle: number,\n distance: number\n ): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n const spiralAngle = angle + progress * Math.PI * 0.8;\n const targetRadius = distance + progress * Math.max(canvas.width, canvas.height) * 0.7 * 1.8;\n\n const targetX = centerX + Math.cos(spiralAngle) * targetRadius;\n const targetY = centerY + Math.sin(spiralAngle) * targetRadius;\n\n const baseForce = progress * this.particleConfig.strength * 0.08 * intensityBoost;\n\n particle.vx += (targetX - particle.x) * baseForce;\n particle.vy += (targetY - particle.y) * baseForce;\n }\n\n /**\n * 更新粒子生命周期属性\n */\n private updateParticleProperties(\n particle: ParticleData,\n progress: number,\n isShortAnimation: boolean,\n timeMultiplier: number,\n intensityBoost: number\n ): void {\n // 应用阻力\n const dragCoeff = isShortAnimation ? 0.99 : 0.98;\n particle.vx *= dragCoeff;\n particle.vy *= dragCoeff;\n\n // 更新位置\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n // 更新生命值和透明度\n if (isShortAnimation) {\n const lifeDecayRate = Math.max(0.1, 0.5 / timeMultiplier);\n particle.life = Math.max(0, 1 - progress * lifeDecayRate);\n particle.a = Math.max(0.2, particle.life * Math.min(1, particle.a * 1.2));\n particle.size = Math.max(this.particleConfig.size * 0.7, this.particleConfig.size * (0.5 + particle.life * 0.5));\n } else {\n particle.life = Math.max(0, 1 - progress * 0.2);\n particle.a = Math.max(0.1, particle.life * Math.min(1, particle.a * 1.5));\n particle.size = Math.max(this.particleConfig.size * 0.5, this.particleConfig.size * (0.3 + particle.life * 0.7));\n }\n }\n\n /**\n * 准备粒子数据并绘制\n */\n private prepareAndDrawParticles(gl: WebGLRenderingContext): void {\n const positions = new Float32Array(this.particles.length * 2);\n const colors = new Float32Array(this.particles.length * 4);\n const sizes = new Float32Array(this.particles.length);\n\n this.particles.forEach((particle, i) => {\n positions[i * 2] = particle.x;\n positions[i * 2 + 1] = particle.y;\n\n colors[i * 4] = particle.r;\n colors[i * 4 + 1] = particle.g;\n colors[i * 4 + 2] = particle.b;\n colors[i * 4 + 3] = Math.max(0.1, particle.a);\n\n sizes[i] = Math.max(6, particle.size * 1.5);\n });\n\n // 更新缓冲区\n this.updateParticleBuffers(gl, positions, colors, sizes);\n\n // 设置uniforms\n this.setParticleUniforms(gl);\n\n // 绘制粒子\n gl.drawArrays(gl.POINTS, 0, this.particles.length);\n\n // 清理临时缓冲区\n this.cleanupTempBuffers(gl);\n }\n\n /**\n * 更新粒子缓冲区\n */\n private updateParticleBuffers(\n gl: WebGLRenderingContext,\n positions: Float32Array,\n colors: Float32Array,\n sizes: Float32Array\n ): void {\n // 位置缓冲区\n if (!this.positionBuffer) {\n this.positionBuffer = gl.createBuffer();\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(this.program, 'a_position');\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n // 颜色缓冲区\n if (!this.colorBuffer) {\n this.colorBuffer = gl.createBuffer();\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n\n const colorLocation = gl.getAttribLocation(this.program, 'a_color');\n gl.enableVertexAttribArray(colorLocation);\n gl.vertexAttribPointer(colorLocation, 4, gl.FLOAT, false, 0, 0);\n\n // 大小缓冲区\n const sizeBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, sizeBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, sizes, gl.DYNAMIC_DRAW);\n\n const sizeLocation = gl.getAttribLocation(this.program, 'a_size');\n gl.enableVertexAttribArray(sizeLocation);\n gl.vertexAttribPointer(sizeLocation, 1, gl.FLOAT, false, 0, 0);\n\n // 保存临时缓冲区引用,用于清理\n (this as any)._tempSizeBuffer = sizeBuffer;\n }\n\n /**\n * 设置粒子着色器uniforms\n */\n private setParticleUniforms(gl: WebGLRenderingContext): void {\n const resolutionLocation = gl.getUniformLocation(this.program, 'u_resolution');\n const timeLocation = gl.getUniformLocation(this.program, 'u_time');\n const forceStrengthLocation = gl.getUniformLocation(this.program, 'u_forceStrength');\n const effectTypeLocation = gl.getUniformLocation(this.program, 'u_effectType');\n\n gl.uniform2f(resolutionLocation, this.webglCanvas.width, this.webglCanvas.height);\n gl.uniform1f(timeLocation, this.getAnimationTime());\n gl.uniform1f(forceStrengthLocation, this.particleConfig.strength);\n\n const effectTypeMap: { [key: string]: number } = {\n explode: 0,\n vortex: 1,\n gravity: 2\n };\n gl.uniform1i(effectTypeLocation, effectTypeMap[this.particleConfig.effectType] || 0);\n }\n\n /**\n * 清理临时缓冲区\n */\n private cleanupTempBuffers(gl: WebGLRenderingContext): void {\n const tempSizeBuffer = (this as any)._tempSizeBuffer;\n if (tempSizeBuffer) {\n gl.deleteBuffer(tempSizeBuffer);\n delete (this as any)._tempSizeBuffer;\n }\n }\n\n // Canvas 2D回退实现的具体方法\n\n /**\n * Canvas 2D爆炸效果模拟\n */\n private applyCanvas2DExplode(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n // 简单的放大和透明度模拟爆炸效果\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.translate(centerX, centerY);\n const scale = 1 + progress * 0.5;\n ctx.scale(scale, scale);\n ctx.translate(-centerX, -centerY);\n ctx.drawImage(canvas, 0, 0);\n ctx.restore();\n }\n\n /**\n * Canvas 2D重力效果模拟\n */\n private applyCanvas2DGravity(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n // 使用垂直偏移和透明度模拟重力下落\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n const offsetY = progress * canvas.height * 0.3;\n ctx.drawImage(canvas, 0, offsetY);\n ctx.restore();\n }\n\n /**\n * Canvas 2D漩涡效果模拟\n */\n private applyCanvas2DVortex(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n // 使用旋转和透明度模拟漩涡效果\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.translate(centerX, centerY);\n ctx.rotate(progress * Math.PI * 2);\n ctx.translate(-centerX, -centerY);\n ctx.drawImage(canvas, 0, 0);\n ctx.restore();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/custom/disappear/particle.ts"],"names":[],"mappings":"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","file":"particle.js","sourcesContent":["import type { EasingType } from '@visactor/vrender-core';\nimport { HybridEffectBase } from './base/CustomEffectBase';\nimport { ImageProcessUtils } from './base/ImageProcessUtils';\n\nexport interface ParticleConfig {\n effectType?: 'explode' | 'vortex' | 'gravity'; // 粒子效果类型\n count?: number; // 粒子数量\n size?: number; // 粒子大小\n strength?: number; // 力场强度\n useWebGL: boolean;\n}\n// 粒子数据结构\nexport interface ParticleData {\n x: number;\n y: number;\n originX: number;\n originY: number;\n vx: number;\n vy: number;\n r: number;\n g: number;\n b: number;\n a: number;\n life: number;\n size: number;\n}\n\n/**\n * 重构后的粒子消散特效\n * 使用HybridEffectBase,优先WebGL实现,Canvas 2D回退\n */\nexport class Particle extends HybridEffectBase {\n private particles: ParticleData[] = [];\n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private particleConfig: ParticleConfig;\n\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n\n this.particleConfig = {\n effectType: params?.options?.effectType || 'gravity', //'explode' | 'vortex' | 'gravity'; // 粒子效果类型\n count: params?.options?.count || 4000,\n size: params?.options?.size || 20,\n strength: params?.options?.strength || 1.5,\n useWebGL: params?.options?.useWebGL !== undefined ? params.options.useWebGL : true // 是否使用WebGL实现\n };\n }\n\n // WebGL实现 - 高性能版本\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n const vertexShader = `\n attribute vec2 a_position;\n attribute vec4 a_color;\n attribute float a_size;\n\n uniform vec2 u_resolution;\n uniform float u_time;\n uniform float u_forceStrength;\n uniform int u_effectType;\n\n varying vec4 v_color;\n\n void main() {\n // 将像素坐标转换为剪辑空间坐标\n vec2 clipSpace = ((a_position / u_resolution) * 2.0) - 1.0;\n clipSpace.y = -clipSpace.y; // 翻转Y轴\n\n gl_Position = vec4(clipSpace, 0.0, 1.0);\n gl_PointSize = a_size;\n v_color = a_color;\n }\n `;\n\n const fragmentShader = `\n precision mediump float;\n varying vec4 v_color;\n\n void main() {\n // 创建圆形粒子\n vec2 coord = gl_PointCoord - vec2(0.5);\n float distance = length(coord);\n\n if (distance > 0.5) {\n discard;\n }\n\n // 保持原始颜色,只调整透明度渐变\n gl_FragColor = vec4(v_color.rgb, v_color.a);\n }\n `;\n\n return { vertex: vertexShader, fragment: fragmentShader };\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n if (!this.gl || !this.program || !this.webglCanvas) {\n return null;\n }\n\n // 使用基类提供的WebGL状态设置\n this.setupWebGLState(canvas);\n\n // 如果没有粒子,提取粒子数据\n if (this.particles.length === 0) {\n this.extractParticles(canvas);\n }\n\n // 更新粒子物理\n this.updateParticles(canvas);\n\n const gl = this.gl;\n\n // 启用混合\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n gl.useProgram(this.program);\n\n // 准备粒子数据并绘制\n this.prepareAndDrawParticles(gl);\n\n return this.webglCanvas;\n }\n\n // Canvas 2D回退实现 - 简化版本,主要用于兼容性\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n const output = this.createOutputCanvas(canvas);\n if (!output) {\n return null;\n }\n\n const { canvas: outputCanvas, ctx } = output;\n\n // 简化的粒子效果:使用透明度和简单变换模拟粒子消散\n const progress = this.currentAnimationRatio;\n\n // 根据效果类型应用不同的Canvas 2D模拟\n switch (this.particleConfig.effectType) {\n case 'explode':\n this.applyCanvas2DExplode(ctx, canvas, progress);\n break;\n case 'gravity':\n this.applyCanvas2DGravity(ctx, canvas, progress);\n break;\n case 'vortex':\n this.applyCanvas2DVortex(ctx, canvas, progress);\n break;\n default:\n // 默认简单透明度淡出\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.drawImage(canvas, 0, 0);\n }\n\n return outputCanvas;\n }\n\n /**\n * 从canvas提取粒子数据\n */\n private extractParticles(canvas: HTMLCanvasElement): void {\n const tempCanvas = ImageProcessUtils.createTempCanvas(canvas.width, canvas.height, 1);\n const tempCtx = tempCanvas.getContext('2d');\n if (!tempCtx) {\n return;\n }\n\n // 绘制原始图像到临时canvas\n tempCtx.drawImage(canvas, 0, 0, tempCanvas.width, tempCanvas.height);\n\n // 获取图像数据\n const imageData = tempCtx.getImageData(0, 0, tempCanvas.width, tempCanvas.height);\n const data = imageData.data;\n\n this.particles = [];\n\n // 计算采样步长\n const step = Math.max(\n 1,\n Math.floor(Math.sqrt((tempCanvas.width * tempCanvas.height) / (this.particleConfig.count * 1.5)))\n );\n\n for (let y = 0; y < tempCanvas.height; y += step) {\n for (let x = 0; x < tempCanvas.width; x += step) {\n const index = (y * tempCanvas.width + x) * 4;\n\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n // 只创建非透明像素的粒子\n if (a > 5) {\n // 将坐标转换回原始canvas尺寸\n const realX = (x / tempCanvas.width) * canvas.width;\n const realY = (y / tempCanvas.height) * canvas.height;\n\n const particle: ParticleData = {\n x: realX,\n y: realY,\n originX: realX,\n originY: realY,\n vx: 0,\n vy: 0,\n r: r / 255,\n g: g / 255,\n b: b / 255,\n a: Math.max(0.6, a / 255),\n life: 1.0,\n size: this.particleConfig.size * (1 + Math.random() * 0.5)\n };\n\n this.particles.push(particle);\n }\n }\n }\n }\n\n /**\n * 更新粒子物理模拟\n */\n private updateParticles(canvas: HTMLCanvasElement): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n const progress = this.currentAnimationRatio;\n const duration = this.getDurationFromParent();\n const isShortAnimation = duration < 2000;\n const timeMultiplier = isShortAnimation ? Math.max(1.5, 3000 / duration) : 1.0;\n const intensityBoost = isShortAnimation ? Math.min(2.0, 2000 / duration) : 1.0;\n\n this.particles.forEach(particle => {\n const dx = particle.x - centerX;\n const dy = particle.y - centerY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const angle = Math.atan2(dy, dx);\n\n // 根据效果类型应用不同的物理力\n this.applyParticleForces(particle, angle, distance, progress, intensityBoost, canvas);\n\n // 更新粒子属性\n this.updateParticleProperties(particle, progress, isShortAnimation, timeMultiplier, intensityBoost);\n });\n }\n\n /**\n * 根据效果类型应用粒子力\n */\n private applyParticleForces(\n particle: ParticleData,\n angle: number,\n distance: number,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement\n ): void {\n const time = this.getAnimationTime();\n\n switch (this.particleConfig.effectType) {\n case 'explode':\n const explodeIntensity = progress * this.particleConfig.strength * intensityBoost * 5;\n particle.vx += Math.cos(angle) * explodeIntensity;\n particle.vy += Math.sin(angle) * explodeIntensity;\n break;\n\n case 'gravity':\n this.applyGravityEffect(particle, progress, intensityBoost, canvas, time);\n break;\n\n case 'vortex':\n this.applyVortexEffect(particle, progress, intensityBoost, canvas, angle, distance);\n break;\n }\n }\n\n /**\n * 应用重力效果\n */\n private applyGravityEffect(\n particle: ParticleData,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement,\n time: number\n ): void {\n const gravityThreshold = ((particle.originX + particle.originY * 0.7) / (canvas.width + canvas.height)) * 0.8;\n\n if (progress > gravityThreshold) {\n const gravityProgress = (progress - gravityThreshold) / (1 - gravityThreshold);\n const gravityForce = this.particleConfig.strength * gravityProgress * gravityProgress * 12 * intensityBoost;\n\n particle.vy += gravityForce;\n\n // 添加水平随机扰动\n const turbulence = Math.sin(time * 3 + particle.originX * 0.02) * Math.cos(time * 2 + particle.originY * 0.015);\n particle.vx += turbulence * this.particleConfig.strength * 2 * intensityBoost;\n }\n }\n\n /**\n * 应用漩涡效果\n */\n private applyVortexEffect(\n particle: ParticleData,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement,\n angle: number,\n distance: number\n ): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n const spiralAngle = angle + progress * Math.PI * 0.8;\n const targetRadius = distance + progress * Math.max(canvas.width, canvas.height) * 0.7 * 1.8;\n\n const targetX = centerX + Math.cos(spiralAngle) * targetRadius;\n const targetY = centerY + Math.sin(spiralAngle) * targetRadius;\n\n const baseForce = progress * this.particleConfig.strength * 0.08 * intensityBoost;\n\n particle.vx += (targetX - particle.x) * baseForce;\n particle.vy += (targetY - particle.y) * baseForce;\n }\n\n /**\n * 更新粒子生命周期属性\n */\n private updateParticleProperties(\n particle: ParticleData,\n progress: number,\n isShortAnimation: boolean,\n timeMultiplier: number,\n intensityBoost: number\n ): void {\n // 应用阻力\n const dragCoeff = isShortAnimation ? 0.99 : 0.98;\n particle.vx *= dragCoeff;\n particle.vy *= dragCoeff;\n\n // 更新位置\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n // 更新生命值和透明度\n if (isShortAnimation) {\n const lifeDecayRate = Math.max(0.1, 0.5 / timeMultiplier);\n particle.life = Math.max(0, 1 - progress * lifeDecayRate);\n particle.a = Math.max(0.2, particle.life * Math.min(1, particle.a * 1.2));\n particle.size = Math.max(this.particleConfig.size * 0.7, this.particleConfig.size * (0.5 + particle.life * 0.5));\n } else {\n particle.life = Math.max(0, 1 - progress * 0.2);\n particle.a = Math.max(0.1, particle.life * Math.min(1, particle.a * 1.5));\n particle.size = Math.max(this.particleConfig.size * 0.5, this.particleConfig.size * (0.3 + particle.life * 0.7));\n }\n }\n\n /**\n * 准备粒子数据并绘制\n */\n private prepareAndDrawParticles(gl: WebGLRenderingContext): void {\n const positions = new Float32Array(this.particles.length * 2);\n const colors = new Float32Array(this.particles.length * 4);\n const sizes = new Float32Array(this.particles.length);\n\n this.particles.forEach((particle, i) => {\n positions[i * 2] = particle.x;\n positions[i * 2 + 1] = particle.y;\n\n colors[i * 4] = particle.r;\n colors[i * 4 + 1] = particle.g;\n colors[i * 4 + 2] = particle.b;\n colors[i * 4 + 3] = Math.max(0.1, particle.a);\n\n sizes[i] = Math.max(6, particle.size * 1.5);\n });\n\n // 更新缓冲区\n this.updateParticleBuffers(gl, positions, colors, sizes);\n\n // 设置uniforms\n this.setParticleUniforms(gl);\n\n // 绘制粒子\n gl.drawArrays(gl.POINTS, 0, this.particles.length);\n\n // 清理临时缓冲区\n this.cleanupTempBuffers(gl);\n }\n\n /**\n * 更新粒子缓冲区\n */\n private updateParticleBuffers(\n gl: WebGLRenderingContext,\n positions: Float32Array,\n colors: Float32Array,\n sizes: Float32Array\n ): void {\n // 位置缓冲区\n if (!this.positionBuffer) {\n this.positionBuffer = gl.createBuffer();\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(this.program, 'a_position');\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n // 颜色缓冲区\n if (!this.colorBuffer) {\n this.colorBuffer = gl.createBuffer();\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n\n const colorLocation = gl.getAttribLocation(this.program, 'a_color');\n gl.enableVertexAttribArray(colorLocation);\n gl.vertexAttribPointer(colorLocation, 4, gl.FLOAT, false, 0, 0);\n\n // 大小缓冲区\n const sizeBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, sizeBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, sizes, gl.DYNAMIC_DRAW);\n\n const sizeLocation = gl.getAttribLocation(this.program, 'a_size');\n gl.enableVertexAttribArray(sizeLocation);\n gl.vertexAttribPointer(sizeLocation, 1, gl.FLOAT, false, 0, 0);\n\n // 保存临时缓冲区引用,用于清理\n (this as any)._tempSizeBuffer = sizeBuffer;\n }\n\n /**\n * 设置粒子着色器uniforms\n */\n private setParticleUniforms(gl: WebGLRenderingContext): void {\n const resolutionLocation = gl.getUniformLocation(this.program, 'u_resolution');\n const timeLocation = gl.getUniformLocation(this.program, 'u_time');\n const forceStrengthLocation = gl.getUniformLocation(this.program, 'u_forceStrength');\n const effectTypeLocation = gl.getUniformLocation(this.program, 'u_effectType');\n\n gl.uniform2f(resolutionLocation, this.webglCanvas.width, this.webglCanvas.height);\n gl.uniform1f(timeLocation, this.getAnimationTime());\n gl.uniform1f(forceStrengthLocation, this.particleConfig.strength);\n\n const effectTypeMap: { [key: string]: number } = {\n explode: 0,\n vortex: 1,\n gravity: 2\n };\n gl.uniform1i(effectTypeLocation, effectTypeMap[this.particleConfig.effectType] || 0);\n }\n\n /**\n * 清理临时缓冲区\n */\n private cleanupTempBuffers(gl: WebGLRenderingContext): void {\n const tempSizeBuffer = (this as any)._tempSizeBuffer;\n if (tempSizeBuffer) {\n gl.deleteBuffer(tempSizeBuffer);\n delete (this as any)._tempSizeBuffer;\n }\n }\n\n // Canvas 2D回退实现的具体方法\n\n /**\n * Canvas 2D爆炸效果模拟\n */\n private applyCanvas2DExplode(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n // 简单的放大和透明度模拟爆炸效果\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.translate(centerX, centerY);\n const scale = 1 + progress * 0.5;\n ctx.scale(scale, scale);\n ctx.translate(-centerX, -centerY);\n ctx.drawImage(canvas, 0, 0);\n ctx.restore();\n }\n\n /**\n * Canvas 2D重力效果模拟\n */\n private applyCanvas2DGravity(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n // 使用垂直偏移和透明度模拟重力下落\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n const offsetY = progress * canvas.height * 0.3;\n ctx.drawImage(canvas, 0, offsetY);\n ctx.restore();\n }\n\n /**\n * Canvas 2D漩涡效果模拟\n */\n private applyCanvas2DVortex(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n // 使用旋转和透明度模拟漩涡效果\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.translate(centerX, centerY);\n ctx.rotate(progress * Math.PI * 2);\n ctx.translate(-centerX, -centerY);\n ctx.drawImage(canvas, 0, 0);\n ctx.restore();\n }\n}\n"]}
@@ -25,4 +25,5 @@ class FadeOut extends common_1.CommonOut {
25
25
  }
26
26
  }
27
27
 
28
- exports.FadeOut = FadeOut;
28
+ exports.FadeOut = FadeOut;
29
+ //# sourceMappingURL=fade.js.map
@@ -22,5 +22,4 @@ class GroupFadeOut extends common_1.CommonOut {
22
22
  }
23
23
  }
24
24
 
25
- exports.GroupFadeOut = GroupFadeOut;
26
- //# sourceMappingURL=groupFade.js.map
25
+ exports.GroupFadeOut = GroupFadeOut;
@@ -516,4 +516,5 @@ const registerCustomAnimate = () => {
516
516
  animate_executor_1.AnimateExecutor.registerBuiltInAnimate("pixelation", pixelation_1.Pixelation);
517
517
  };
518
518
 
519
- exports.registerCustomAnimate = registerCustomAnimate;
519
+ exports.registerCustomAnimate = registerCustomAnimate;
520
+ //# sourceMappingURL=register.js.map
@@ -118,5 +118,4 @@ class ScaleOut extends custom_animate_1.ACustomAnimate {
118
118
  }
119
119
  }
120
120
 
121
- exports.ScaleOut = ScaleOut;
122
- //# sourceMappingURL=scale.js.map
121
+ exports.ScaleOut = ScaleOut;
package/cjs/step.d.ts CHANGED
@@ -47,7 +47,6 @@ export declare class Step implements IStep {
47
47
  export declare class WaitStep extends Step {
48
48
  constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType);
49
49
  onStart(): void;
50
- onFirstRun(): void;
51
50
  update(end: boolean, ratio: number, out: Record<string, any>): void;
52
51
  determineInterpolateUpdateFunction(): void;
53
52
  }
package/cjs/step.js CHANGED
@@ -128,8 +128,6 @@ class WaitStep extends Step {
128
128
  }
129
129
  onStart() {
130
130
  super.onStart();
131
- }
132
- onFirstRun() {
133
131
  const fromProps = this.getFromProps();
134
132
  this.target.setAttributes(fromProps);
135
133
  }
package/cjs/step.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/step.ts"],"names":[],"mappings":"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","file":"step.js","sourcesContent":["import {\n ColorStore,\n ColorType,\n Generator,\n type IGraphic,\n type IAnimate,\n type IStep,\n type EasingType,\n type EasingTypeFunc,\n type IAnimateStepType\n} from '@visactor/vrender-core';\nimport { Easing } from './utils/easing';\nimport { commonInterpolateUpdate, interpolateUpdateStore } from './interpolate/store';\nimport { isString } from '@visactor/vutils';\n\nfunction noop() {\n //...\n}\n\nexport class Step implements IStep {\n id: number;\n type: IAnimateStepType;\n prev?: IStep;\n duration: number;\n next?: IStep;\n props?: Record<string, any>;\n propKeys?: string[];\n interpolateUpdateFunctions?: ((\n key: string,\n from: number,\n to: number,\n ratio: number,\n step: IStep,\n target: IGraphic\n ) => void)[];\n easing: EasingTypeFunc;\n animate: IAnimate;\n target: IGraphic;\n fromProps: Record<string, any>;\n fromParsedProps: Record<string, any>;\n toParsedProps: Record<string, any>;\n\n // 内部状态\n protected _startTime: number = 0;\n _hasFirstRun: boolean = false;\n\n protected _endCb?: (animate: IAnimate, step: IStep) => void;\n\n syncAttributeUpdate: () => void;\n\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n this.type = type;\n this.props = props;\n this.duration = duration;\n // 设置缓动函数\n if (easing) {\n this.easing = typeof easing === 'function' ? easing : Easing[easing] ?? Easing.linear;\n } else {\n this.easing = Easing.linear;\n }\n if (type === 'wait') {\n this.onUpdate = noop;\n }\n this.id = Generator.GenAutoIncrementId();\n this.syncAttributeUpdate = noop;\n }\n\n bind(target: IGraphic, animate: IAnimate): void {\n this.target = target;\n this.animate = animate;\n this.onBind();\n this.syncAttributeUpdate();\n }\n\n append(step: IStep): void {\n this.next = step;\n step.prev = this;\n\n // 更新绝对时间\n step.setStartTime(this.getStartTime() + this.duration, false);\n }\n\n // 更新下游节点的开始时间\n private updateDownstreamStartTimes(): void {\n let currentStep = this.next;\n let currentStartTime = this._startTime + this.duration;\n\n while (currentStep) {\n currentStep.setStartTime(currentStartTime, false);\n currentStartTime += currentStep.duration;\n currentStep = currentStep.next;\n }\n this.animate.updateDuration();\n }\n\n getLastProps(): any {\n if (this.prev) {\n return this.prev.props || {};\n }\n return this.animate.getStartProps();\n }\n\n setDuration(duration: number, updateDownstream: boolean = true): void {\n this.duration = duration;\n\n // 如果有后续节点,更新所有后续节点的开始时间\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n determineInterpolateUpdateFunction(): void {\n // 根据属性类型确定插值更新函数\n // 这里可以进行优化,例如缓存不同类型属性的插值更新函数\n if (!this.props) {\n return;\n }\n\n const funcs: ((key: string, from: number, to: number, ratio: number, step: IStep, target: IGraphic) => void)[] = [];\n this.propKeys.forEach(key => {\n // 普通颜色特殊处理,需要提前解析成number[]\n if (key === 'fill' || key === 'stroke') {\n const from = this.fromProps[key];\n const to = this.props[key];\n if (isString(from) && isString(to)) {\n const fromArray = ColorStore.Get(from, ColorType.Color255);\n const toArray = ColorStore.Get(to, ColorType.Color255);\n if (!this.fromParsedProps) {\n this.fromParsedProps = {};\n }\n if (!this.toParsedProps) {\n this.toParsedProps = {};\n }\n this.fromParsedProps[key] = fromArray;\n this.toParsedProps[key] = toArray;\n funcs.push((interpolateUpdateStore as any)[key === 'fill' ? 'fillPure' : 'strokePure']);\n } else if ((interpolateUpdateStore as any)[key]) {\n funcs.push((interpolateUpdateStore as any)[key]);\n } else {\n funcs.push(commonInterpolateUpdate);\n }\n } else if ((interpolateUpdateStore as any)[key]) {\n funcs.push((interpolateUpdateStore as any)[key]);\n } else {\n funcs.push(commonInterpolateUpdate);\n }\n });\n this.interpolateUpdateFunctions = funcs;\n }\n\n setStartTime(time: number, updateDownstream: boolean = true): void {\n this._startTime = time;\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getStartTime(): number {\n return this._startTime;\n }\n\n onBind(): void {\n // 在第一次绑定到Animate的时候触发\n if (this.target.type === 'glyph') {\n this.syncAttributeUpdate = this._syncAttributeUpdate;\n }\n }\n\n _syncAttributeUpdate = (): void => {\n this.target.setAttributes(this.target.attribute);\n };\n\n /**\n * 首次运行逻辑\n * 如果跳帧了就不一定会执行\n */\n onFirstRun(): void {\n // 首次运行逻辑\n }\n\n /**\n * 开始执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onStart(): void {\n if (!this._hasFirstRun) {\n this._hasFirstRun = true;\n // 获取上一步的属性值作为起始值\n this.fromProps = this.getLastProps();\n const startProps = this.animate.getStartProps();\n this.propKeys &&\n this.propKeys.forEach(key => {\n this.fromProps[key] = this.fromProps[key] ?? startProps[key];\n });\n this.determineInterpolateUpdateFunction();\n this.tryPreventConflict();\n this.trySyncStartProps();\n this.onFirstRun();\n }\n }\n\n protected tryPreventConflict(): void {\n // 屏蔽掉之前动画冲突的属性\n const animate = this.animate;\n const target = this.target;\n target.animates.forEach((a: any) => {\n if (a === animate || a.priority > animate.priority || a.priority === Infinity) {\n return;\n }\n const fromProps = a.getStartProps();\n this.propKeys.forEach(key => {\n if (fromProps[key] != null) {\n a.preventAttr(key);\n }\n });\n });\n }\n\n /**\n * 删除自身属性,会直接从props等内容里删除掉\n */\n deleteSelfAttr(key: string): void {\n delete this.props[key];\n // fromProps在动画开始时才会计算,这时可能不在\n this.fromProps && delete this.fromProps[key];\n const index = this.propKeys.indexOf(key);\n if (index !== -1) {\n this.propKeys.splice(index, 1);\n this.interpolateUpdateFunctions?.splice(index, 1);\n }\n }\n\n /**\n * 尝试同步startProps,因为当前animate的startProps仅包含当前animate的信息,不排除过程中有其他animate的干扰\n * 所以为了避免属性突变,需要确保startProps的属性值是最新的\n */\n trySyncStartProps(): void {\n this.propKeys.forEach(key => {\n this.fromProps[key] = this.animate.target.getComputedAttribute(key);\n });\n }\n\n /**\n * 更新执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n // TODO 需要修复,只有在开始的时候才调用\n this.onStart();\n if (!this.props || !this.propKeys) {\n return;\n }\n // 应用缓动函数\n const easedRatio = this.easing(ratio);\n this.animate.interpolateUpdateFunction\n ? this.animate.interpolateUpdateFunction(this.fromProps, this.props, easedRatio, this, this.target)\n : this.interpolateUpdateFunctions.forEach((func, index) => {\n // 如果这个属性被屏蔽了,直接跳过\n if (!this.animate.validAttr(this.propKeys[index])) {\n return;\n }\n const key = this.propKeys[index];\n const fromValue = this.fromProps[key];\n const toValue = this.props[key];\n func(key, fromValue, toValue, easedRatio, this, this.target);\n });\n this.onUpdate(end, easedRatio, out);\n this.syncAttributeUpdate();\n }\n\n onUpdate(end: boolean, ratio: number, out: Record<string, any>): void {\n // ...\n }\n\n /**\n * 结束执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onEnd(cb?: (animate: IAnimate, step: IStep) => void): void {\n this.target.setAttributes(this.props);\n if (cb) {\n this._endCb = cb;\n } else if (this._endCb) {\n this._endCb(this.animate, this);\n }\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的\n * @returns\n */\n getEndProps(): Record<string, any> {\n return this.props;\n }\n\n /**\n * 获取开始的属性,是前序的终值\n * @returns\n */\n getFromProps(): Record<string, any> {\n return this.fromProps;\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的,同getEndProps\n * @returns\n */\n getMergedEndProps(): Record<string, any> | void {\n return this.getEndProps();\n }\n\n stop(): void {\n // ...\n }\n\n release(): void {\n // ...\n }\n}\n\nexport class WaitStep extends Step {\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n super(type, props, duration, easing);\n }\n\n onStart(): void {\n super.onStart();\n }\n onFirstRun(): void {\n // 设置上一个阶段的props到attribute\n const fromProps = this.getFromProps();\n this.target.setAttributes(fromProps);\n }\n\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n this.onStart();\n // 其他的不执行\n }\n\n determineInterpolateUpdateFunction(): void {\n return;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/step.ts"],"names":[],"mappings":"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","file":"step.js","sourcesContent":["import {\n ColorStore,\n ColorType,\n Generator,\n type IGraphic,\n type IAnimate,\n type IStep,\n type EasingType,\n type EasingTypeFunc,\n type IAnimateStepType\n} from '@visactor/vrender-core';\nimport { Easing } from './utils/easing';\nimport { commonInterpolateUpdate, interpolateUpdateStore } from './interpolate/store';\nimport { isString } from '@visactor/vutils';\n\nfunction noop() {\n //...\n}\n\nexport class Step implements IStep {\n id: number;\n type: IAnimateStepType;\n prev?: IStep;\n duration: number;\n next?: IStep;\n props?: Record<string, any>;\n propKeys?: string[];\n interpolateUpdateFunctions?: ((\n key: string,\n from: number,\n to: number,\n ratio: number,\n step: IStep,\n target: IGraphic\n ) => void)[];\n easing: EasingTypeFunc;\n animate: IAnimate;\n target: IGraphic;\n fromProps: Record<string, any>;\n fromParsedProps: Record<string, any>;\n toParsedProps: Record<string, any>;\n\n // 内部状态\n protected _startTime: number = 0;\n _hasFirstRun: boolean = false;\n\n protected _endCb?: (animate: IAnimate, step: IStep) => void;\n\n syncAttributeUpdate: () => void;\n\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n this.type = type;\n this.props = props;\n this.duration = duration;\n // 设置缓动函数\n if (easing) {\n this.easing = typeof easing === 'function' ? easing : Easing[easing] ?? Easing.linear;\n } else {\n this.easing = Easing.linear;\n }\n if (type === 'wait') {\n this.onUpdate = noop;\n }\n this.id = Generator.GenAutoIncrementId();\n this.syncAttributeUpdate = noop;\n }\n\n bind(target: IGraphic, animate: IAnimate): void {\n this.target = target;\n this.animate = animate;\n this.onBind();\n this.syncAttributeUpdate();\n }\n\n append(step: IStep): void {\n this.next = step;\n step.prev = this;\n\n // 更新绝对时间\n step.setStartTime(this.getStartTime() + this.duration, false);\n }\n\n // 更新下游节点的开始时间\n private updateDownstreamStartTimes(): void {\n let currentStep = this.next;\n let currentStartTime = this._startTime + this.duration;\n\n while (currentStep) {\n currentStep.setStartTime(currentStartTime, false);\n currentStartTime += currentStep.duration;\n currentStep = currentStep.next;\n }\n this.animate.updateDuration();\n }\n\n getLastProps(): any {\n if (this.prev) {\n return this.prev.props || {};\n }\n return this.animate.getStartProps();\n }\n\n setDuration(duration: number, updateDownstream: boolean = true): void {\n this.duration = duration;\n\n // 如果有后续节点,更新所有后续节点的开始时间\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n determineInterpolateUpdateFunction(): void {\n // 根据属性类型确定插值更新函数\n // 这里可以进行优化,例如缓存不同类型属性的插值更新函数\n if (!this.props) {\n return;\n }\n\n const funcs: ((key: string, from: number, to: number, ratio: number, step: IStep, target: IGraphic) => void)[] = [];\n this.propKeys.forEach(key => {\n // 普通颜色特殊处理,需要提前解析成number[]\n if (key === 'fill' || key === 'stroke') {\n const from = this.fromProps[key];\n const to = this.props[key];\n if (isString(from) && isString(to)) {\n const fromArray = ColorStore.Get(from, ColorType.Color255);\n const toArray = ColorStore.Get(to, ColorType.Color255);\n if (!this.fromParsedProps) {\n this.fromParsedProps = {};\n }\n if (!this.toParsedProps) {\n this.toParsedProps = {};\n }\n this.fromParsedProps[key] = fromArray;\n this.toParsedProps[key] = toArray;\n funcs.push((interpolateUpdateStore as any)[key === 'fill' ? 'fillPure' : 'strokePure']);\n } else if ((interpolateUpdateStore as any)[key]) {\n funcs.push((interpolateUpdateStore as any)[key]);\n } else {\n funcs.push(commonInterpolateUpdate);\n }\n } else if ((interpolateUpdateStore as any)[key]) {\n funcs.push((interpolateUpdateStore as any)[key]);\n } else {\n funcs.push(commonInterpolateUpdate);\n }\n });\n this.interpolateUpdateFunctions = funcs;\n }\n\n setStartTime(time: number, updateDownstream: boolean = true): void {\n this._startTime = time;\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getStartTime(): number {\n return this._startTime;\n }\n\n onBind(): void {\n // 在第一次绑定到Animate的时候触发\n if (this.target.type === 'glyph') {\n this.syncAttributeUpdate = this._syncAttributeUpdate;\n }\n }\n\n _syncAttributeUpdate = (): void => {\n this.target.setAttributes(this.target.attribute);\n };\n\n /**\n * 首次运行逻辑\n * 如果跳帧了就不一定会执行\n */\n onFirstRun(): void {\n // 首次运行逻辑\n }\n\n /**\n * 开始执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onStart(): void {\n if (!this._hasFirstRun) {\n this._hasFirstRun = true;\n // 获取上一步的属性值作为起始值\n this.fromProps = this.getLastProps();\n const startProps = this.animate.getStartProps();\n this.propKeys &&\n this.propKeys.forEach(key => {\n this.fromProps[key] = this.fromProps[key] ?? startProps[key];\n });\n this.determineInterpolateUpdateFunction();\n this.tryPreventConflict();\n this.trySyncStartProps();\n this.onFirstRun();\n }\n }\n\n protected tryPreventConflict(): void {\n // 屏蔽掉之前动画冲突的属性\n const animate = this.animate;\n const target = this.target;\n target.animates.forEach((a: any) => {\n if (a === animate || a.priority > animate.priority || a.priority === Infinity) {\n return;\n }\n const fromProps = a.getStartProps();\n this.propKeys.forEach(key => {\n if (fromProps[key] != null) {\n a.preventAttr(key);\n }\n });\n });\n }\n\n /**\n * 删除自身属性,会直接从props等内容里删除掉\n */\n deleteSelfAttr(key: string): void {\n delete this.props[key];\n // fromProps在动画开始时才会计算,这时可能不在\n this.fromProps && delete this.fromProps[key];\n const index = this.propKeys.indexOf(key);\n if (index !== -1) {\n this.propKeys.splice(index, 1);\n this.interpolateUpdateFunctions?.splice(index, 1);\n }\n }\n\n /**\n * 尝试同步startProps,因为当前animate的startProps仅包含当前animate的信息,不排除过程中有其他animate的干扰\n * 所以为了避免属性突变,需要确保startProps的属性值是最新的\n */\n trySyncStartProps(): void {\n this.propKeys.forEach(key => {\n this.fromProps[key] = this.animate.target.getComputedAttribute(key);\n });\n }\n\n /**\n * 更新执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n // TODO 需要修复,只有在开始的时候才调用\n this.onStart();\n if (!this.props || !this.propKeys) {\n return;\n }\n // 应用缓动函数\n const easedRatio = this.easing(ratio);\n this.animate.interpolateUpdateFunction\n ? this.animate.interpolateUpdateFunction(this.fromProps, this.props, easedRatio, this, this.target)\n : this.interpolateUpdateFunctions.forEach((func, index) => {\n // 如果这个属性被屏蔽了,直接跳过\n if (!this.animate.validAttr(this.propKeys[index])) {\n return;\n }\n const key = this.propKeys[index];\n const fromValue = this.fromProps[key];\n const toValue = this.props[key];\n func(key, fromValue, toValue, easedRatio, this, this.target);\n });\n this.onUpdate(end, easedRatio, out);\n this.syncAttributeUpdate();\n }\n\n onUpdate(end: boolean, ratio: number, out: Record<string, any>): void {\n // ...\n }\n\n /**\n * 结束执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onEnd(cb?: (animate: IAnimate, step: IStep) => void): void {\n this.target.setAttributes(this.props);\n if (cb) {\n this._endCb = cb;\n } else if (this._endCb) {\n this._endCb(this.animate, this);\n }\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的\n * @returns\n */\n getEndProps(): Record<string, any> {\n return this.props;\n }\n\n /**\n * 获取开始的属性,是前序的终值\n * @returns\n */\n getFromProps(): Record<string, any> {\n return this.fromProps;\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的,同getEndProps\n * @returns\n */\n getMergedEndProps(): Record<string, any> | void {\n return this.getEndProps();\n }\n\n stop(): void {\n // ...\n }\n\n release(): void {\n // ...\n }\n}\n\nexport class WaitStep extends Step {\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n super(type, props, duration, easing);\n }\n\n onStart(): void {\n super.onStart();\n\n const fromProps = this.getFromProps();\n this.target.setAttributes(fromProps);\n }\n\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n this.onStart();\n // 其他的不执行\n }\n\n determineInterpolateUpdateFunction(): void {\n return;\n }\n}\n"]}
package/dist/index.es.js CHANGED
@@ -565,8 +565,6 @@ class WaitStep extends Step {
565
565
  }
566
566
  onStart() {
567
567
  super.onStart();
568
- }
569
- onFirstRun() {
570
568
  const fromProps = this.getFromProps();
571
569
  this.target.setAttributes(fromProps);
572
570
  }
@@ -7424,7 +7422,7 @@ class HybridEffectBase extends DisappearAnimateBase {
7424
7422
  afterStageRender(stage, canvas) {
7425
7423
  var _a, _b;
7426
7424
  let result = null;
7427
- if ((_b = (_a = this.params) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.useWebGL) {
7425
+ if (((_b = (_a = this.params) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.useWebGL) !== false) {
7428
7426
  if (this.supportsWebGL()) {
7429
7427
  if (!this.gl && !this.initWebGL(canvas)) {
7430
7428
  console.warn('WebGL初始化失败,尝试Canvas 2D回退');
@@ -8713,7 +8711,7 @@ class Distortion extends HybridEffectBase {
8713
8711
 
8714
8712
  class Particle extends HybridEffectBase {
8715
8713
  constructor(from, to, duration, easing, params) {
8716
- var _a, _b, _c, _d;
8714
+ var _a, _b, _c, _d, _e;
8717
8715
  super(from, to, duration, easing, params);
8718
8716
  this.particles = [];
8719
8717
  this.positionBuffer = null;
@@ -8722,7 +8720,8 @@ class Particle extends HybridEffectBase {
8722
8720
  effectType: ((_a = params === null || params === void 0 ? void 0 : params.options) === null || _a === void 0 ? void 0 : _a.effectType) || 'gravity',
8723
8721
  count: ((_b = params === null || params === void 0 ? void 0 : params.options) === null || _b === void 0 ? void 0 : _b.count) || 4000,
8724
8722
  size: ((_c = params === null || params === void 0 ? void 0 : params.options) === null || _c === void 0 ? void 0 : _c.size) || 20,
8725
- strength: ((_d = params === null || params === void 0 ? void 0 : params.options) === null || _d === void 0 ? void 0 : _d.strength) || 1.5
8723
+ strength: ((_d = params === null || params === void 0 ? void 0 : params.options) === null || _d === void 0 ? void 0 : _d.strength) || 1.5,
8724
+ useWebGL: ((_e = params === null || params === void 0 ? void 0 : params.options) === null || _e === void 0 ? void 0 : _e.useWebGL) !== undefined ? params.options.useWebGL : true
8726
8725
  };
8727
8726
  }
8728
8727
  getShaderSources() {
@@ -48,7 +48,7 @@ export class HybridEffectBase extends DisappearAnimateBase {
48
48
  afterStageRender(stage, canvas) {
49
49
  var _a, _b;
50
50
  let result = null;
51
- if (null === (_b = null === (_a = this.params) || void 0 === _a ? void 0 : _a.options) || void 0 === _b ? void 0 : _b.useWebGL) {
51
+ if (!1 !== (null === (_b = null === (_a = this.params) || void 0 === _a ? void 0 : _a.options) || void 0 === _b ? void 0 : _b.useWebGL)) {
52
52
  if (this.supportsWebGL() && (this.gl || this.initWebGL(canvas) || console.warn("WebGL初始化失败,尝试Canvas 2D回退"),
53
53
  this.gl)) {
54
54
  if (result = this.applyWebGLEffect(canvas), result) return result;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/custom/disappear/base/CustomEffectBase.ts"],"names":[],"mappings":"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","file":"CustomEffectBase.js","sourcesContent":["import type { EasingType } from '@visactor/vrender-core';\nimport { DisappearAnimateBase } from './DisappearAnimateBase';\n\n/**\n * 仅支持WebGL的特效基类\n * 适用于复杂的GPU计算特效,如粒子系统、复杂着色器特效等\n */\nexport abstract class WebGLEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 必须实现WebGL相关方法\n protected abstract getShaderSources(): { vertex: string; fragment: string };\n protected abstract applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement;\n\n // Canvas 2D回退:简单的透明度动画或返回原图\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement {\n console.warn(`${this.constructor.name}: WebGL不可用,使用简单透明度回退动画`);\n\n const outputCanvas = this.createOutputCanvas(canvas);\n if (!outputCanvas) {\n return canvas;\n }\n\n const { ctx } = outputCanvas;\n\n // 简单的透明度渐变作为回退\n ctx.globalAlpha = Math.max(0, 1 - this.currentAnimationRatio);\n ctx.drawImage(canvas, 0, 0);\n\n return outputCanvas.canvas;\n }\n}\n\n/**\n * 仅支持Canvas 2D的特效基类\n * 适用于简单的2D图像处理特效,如模糊、颜色调整等\n */\nexport abstract class Canvas2DEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 必须实现Canvas 2D方法\n protected abstract applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement;\n\n // 不支持WebGL,返回null\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n return null;\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null;\n }\n}\n\n/**\n * 混合实现特效基类\n * 既支持WebGL也支持Canvas 2D,根据环境自动选择\n */\nexport class HybridEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 可选实现WebGL方法\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n return null; // 子类可以重写\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null; // 子类可以重写\n }\n\n // 可选实现Canvas 2D方法\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null; // 子类可以重写\n }\n\n // 重写检查方法,使用更准确的检测\n protected supportsWebGL(): boolean {\n return this.getShaderSources !== HybridEffectBase.prototype.getShaderSources && this.getShaderSources() !== null;\n }\n\n protected supportsCanvas2D(): boolean {\n return this.applyCanvas2DEffect !== HybridEffectBase.prototype.applyCanvas2DEffect;\n }\n\n /**\n * 重写渲染方法,支持用户配置的 useWebGL 控制\n */\n protected afterStageRender(stage: any, canvas: HTMLCanvasElement): HTMLCanvasElement | void | null | false {\n let result: HTMLCanvasElement | null = null;\n\n // 根据用户配置决定渲染策略\n if (this.params?.options?.useWebGL) {\n // 用户允许使用WebGL,按照父类的自动判别逻辑\n // 优先尝试WebGL实现\n if (this.supportsWebGL()) {\n if (!this.gl && !this.initWebGL(canvas)) {\n console.warn('WebGL初始化失败,尝试Canvas 2D回退');\n }\n\n if (this.gl) {\n result = this.applyWebGLEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('WebGL特效执行失败,尝试Canvas 2D回退');\n }\n }\n\n // WebGL不可用或执行失败,尝试Canvas 2D回退\n if (this.supportsCanvas2D()) {\n result = this.applyCanvas2DEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('Canvas 2D特效执行失败');\n }\n } else {\n // 用户禁用WebGL,直接使用Canvas 2D\n if (this.supportsCanvas2D()) {\n result = this.applyCanvas2DEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('Canvas 2D特效执行失败');\n } else {\n console.warn(`${this.constructor.name}: useWebGL=false 但未实现Canvas 2D方法`);\n }\n }\n\n // 如果都不支持或都失败了,给出明确的错误信息\n if (!this.supportsWebGL() && !this.supportsCanvas2D()) {\n console.error(\n `特效类 ${this.constructor.name} 未实现任何渲染方法。请实现 applyWebGLEffect 或 applyCanvas2DEffect 方法。`\n );\n }\n\n // 返回原图作为最后的回退\n return canvas;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/custom/disappear/base/CustomEffectBase.ts"],"names":[],"mappings":"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","file":"CustomEffectBase.js","sourcesContent":["import type { EasingType } from '@visactor/vrender-core';\nimport { DisappearAnimateBase } from './DisappearAnimateBase';\n\n/**\n * 仅支持WebGL的特效基类\n * 适用于复杂的GPU计算特效,如粒子系统、复杂着色器特效等\n */\nexport abstract class WebGLEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 必须实现WebGL相关方法\n protected abstract getShaderSources(): { vertex: string; fragment: string };\n protected abstract applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement;\n\n // Canvas 2D回退:简单的透明度动画或返回原图\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement {\n console.warn(`${this.constructor.name}: WebGL不可用,使用简单透明度回退动画`);\n\n const outputCanvas = this.createOutputCanvas(canvas);\n if (!outputCanvas) {\n return canvas;\n }\n\n const { ctx } = outputCanvas;\n\n // 简单的透明度渐变作为回退\n ctx.globalAlpha = Math.max(0, 1 - this.currentAnimationRatio);\n ctx.drawImage(canvas, 0, 0);\n\n return outputCanvas.canvas;\n }\n}\n\n/**\n * 仅支持Canvas 2D的特效基类\n * 适用于简单的2D图像处理特效,如模糊、颜色调整等\n */\nexport abstract class Canvas2DEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 必须实现Canvas 2D方法\n protected abstract applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement;\n\n // 不支持WebGL,返回null\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n return null;\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null;\n }\n}\n\n/**\n * 混合实现特效基类\n * 既支持WebGL也支持Canvas 2D,根据环境自动选择\n */\nexport class HybridEffectBase extends DisappearAnimateBase {\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n }\n\n // 可选实现WebGL方法\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n return null; // 子类可以重写\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null; // 子类可以重写\n }\n\n // 可选实现Canvas 2D方法\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n return null; // 子类可以重写\n }\n\n // 重写检查方法,使用更准确的检测\n protected supportsWebGL(): boolean {\n return this.getShaderSources !== HybridEffectBase.prototype.getShaderSources && this.getShaderSources() !== null;\n }\n\n protected supportsCanvas2D(): boolean {\n return this.applyCanvas2DEffect !== HybridEffectBase.prototype.applyCanvas2DEffect;\n }\n\n /**\n * 重写渲染方法,支持用户配置的 useWebGL 控制\n */\n protected afterStageRender(stage: any, canvas: HTMLCanvasElement): HTMLCanvasElement | void | null | false {\n let result: HTMLCanvasElement | null = null;\n\n // 根据用户配置决定渲染策略\n if (this.params?.options?.useWebGL !== false) {\n // 用户允许使用WebGL,按照父类的自动判别逻辑\n // 优先尝试WebGL实现\n if (this.supportsWebGL()) {\n if (!this.gl && !this.initWebGL(canvas)) {\n console.warn('WebGL初始化失败,尝试Canvas 2D回退');\n }\n\n if (this.gl) {\n result = this.applyWebGLEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('WebGL特效执行失败,尝试Canvas 2D回退');\n }\n }\n\n // WebGL不可用或执行失败,尝试Canvas 2D回退\n if (this.supportsCanvas2D()) {\n result = this.applyCanvas2DEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('Canvas 2D特效执行失败');\n }\n } else {\n // 用户禁用WebGL,直接使用Canvas 2D\n if (this.supportsCanvas2D()) {\n result = this.applyCanvas2DEffect(canvas);\n if (result) {\n return result;\n }\n console.warn('Canvas 2D特效执行失败');\n } else {\n console.warn(`${this.constructor.name}: useWebGL=false 但未实现Canvas 2D方法`);\n }\n }\n\n // 如果都不支持或都失败了,给出明确的错误信息\n if (!this.supportsWebGL() && !this.supportsCanvas2D()) {\n console.error(\n `特效类 ${this.constructor.name} 未实现任何渲染方法。请实现 applyWebGLEffect 或 applyCanvas2DEffect 方法。`\n );\n }\n\n // 返回原图作为最后的回退\n return canvas;\n }\n}\n"]}
@@ -5,6 +5,7 @@ export interface ParticleConfig {
5
5
  count?: number;
6
6
  size?: number;
7
7
  strength?: number;
8
+ useWebGL: boolean;
8
9
  }
9
10
  export interface ParticleData {
10
11
  x: number;
@@ -4,13 +4,14 @@ import { ImageProcessUtils } from "./base/ImageProcessUtils";
4
4
 
5
5
  export class Particle extends HybridEffectBase {
6
6
  constructor(from, to, duration, easing, params) {
7
- var _a, _b, _c, _d;
7
+ var _a, _b, _c, _d, _e;
8
8
  super(from, to, duration, easing, params), this.particles = [], this.positionBuffer = null,
9
9
  this.colorBuffer = null, this.particleConfig = {
10
10
  effectType: (null === (_a = null == params ? void 0 : params.options) || void 0 === _a ? void 0 : _a.effectType) || "gravity",
11
11
  count: (null === (_b = null == params ? void 0 : params.options) || void 0 === _b ? void 0 : _b.count) || 4e3,
12
12
  size: (null === (_c = null == params ? void 0 : params.options) || void 0 === _c ? void 0 : _c.size) || 20,
13
- strength: (null === (_d = null == params ? void 0 : params.options) || void 0 === _d ? void 0 : _d.strength) || 1.5
13
+ strength: (null === (_d = null == params ? void 0 : params.options) || void 0 === _d ? void 0 : _d.strength) || 1.5,
14
+ useWebGL: void 0 === (null === (_e = null == params ? void 0 : params.options) || void 0 === _e ? void 0 : _e.useWebGL) || params.options.useWebGL
14
15
  };
15
16
  }
16
17
  getShaderSources() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/custom/disappear/particle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AA4B7D,MAAM,OAAO,QAAS,SAAQ,gBAAgB;IAM5C,YAAY,IAAU,EAAE,EAAQ,EAAE,QAAgB,EAAE,MAAkB,EAAE,MAAW;;QACjF,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QANpC,cAAS,GAAmB,EAAE,CAAC;QAC/B,mBAAc,GAAuB,IAAI,CAAC;QAC1C,gBAAW,GAAuB,IAAI,CAAC;QAM7C,IAAI,CAAC,cAAc,GAAG;YACpB,UAAU,EAAE,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,UAAU,KAAI,SAAS;YACpD,KAAK,EAAE,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,KAAK,KAAI,IAAI;YACrC,IAAI,EAAE,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,IAAI,KAAI,EAAE;YACjC,QAAQ,EAAE,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,QAAQ,KAAI,GAAG;SAC3C,CAAC;IACJ,CAAC;IAGS,gBAAgB;QACxB,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;KAqBpB,CAAC;QAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;KAgBtB,CAAC;QAEF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC5D,CAAC;IAES,gBAAgB,CAAC,MAAyB;QAClD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAClD,OAAO,IAAI,CAAC;SACb;QAGD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAG7B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;SAC/B;QAGD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAE7B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAGnB,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACpB,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC;QAEnD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAG5B,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAEjC,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAGS,mBAAmB,CAAC,MAAyB;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,IAAI,CAAC;SACb;QAED,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;QAG7C,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAG5C,QAAQ,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;YACtC,KAAK,SAAS;gBACZ,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACjD,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACjD,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAChD,MAAM;YACR;gBAEE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAC5C,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SAC/B;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAKO,gBAAgB,CAAC,MAAyB;QAChD,MAAM,UAAU,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO;SACR;QAGD,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAGrE,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAE5B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QAGpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,EACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAClG,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE;YAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE;gBAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAE7C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAG1B,IAAI,CAAC,GAAG,CAAC,EAAE;oBAET,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;oBACpD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;oBAEtD,MAAM,QAAQ,GAAiB;wBAC7B,CAAC,EAAE,KAAK;wBACR,CAAC,EAAE,KAAK;wBACR,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,KAAK;wBACd,EAAE,EAAE,CAAC;wBACL,EAAE,EAAE,CAAC;wBACL,CAAC,EAAE,CAAC,GAAG,GAAG;wBACV,CAAC,EAAE,CAAC,GAAG,GAAG;wBACV,CAAC,EAAE,CAAC,GAAG,GAAG;wBACV,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;wBACzB,IAAI,EAAE,GAAG;wBACT,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;qBAC3D,CAAC;oBAEF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAC/B;aACF;SACF;IACH,CAAC;IAKO,eAAe,CAAC,MAAyB;QAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC9C,MAAM,gBAAgB,GAAG,QAAQ,GAAG,IAAI,CAAC;QACzC,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/E,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE/E,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC;YAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAGjC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;YAGtF,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;IACL,CAAC;IAKO,mBAAmB,CACzB,QAAsB,EACtB,KAAa,EACb,QAAgB,EAChB,QAAgB,EAChB,cAAsB,EACtB,MAAyB;QAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAErC,QAAQ,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;YACtC,KAAK,SAAS;gBACZ,MAAM,gBAAgB,GAAG,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,cAAc,GAAG,CAAC,CAAC;gBACtF,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC;gBAClD,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC;gBAClD,MAAM;YAER,KAAK,SAAS;gBACZ,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC1E,MAAM;YAER,KAAK,QAAQ;gBACX,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACpF,MAAM;SACT;IACH,CAAC;IAKO,kBAAkB,CACxB,QAAsB,EACtB,QAAgB,EAChB,cAAsB,EACtB,MAAyB,EACzB,IAAY;QAEZ,MAAM,gBAAgB,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;QAE9G,IAAI,QAAQ,GAAG,gBAAgB,EAAE;YAC/B,MAAM,eAAe,GAAG,CAAC,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,eAAe,GAAG,eAAe,GAAG,EAAE,GAAG,cAAc,CAAC;YAE5G,QAAQ,CAAC,EAAE,IAAI,YAAY,CAAC;YAG5B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;YAChH,QAAQ,CAAC,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,CAAC,GAAG,cAAc,CAAC;SAC/E;IACH,CAAC;IAKO,iBAAiB,CACvB,QAAsB,EACtB,QAAgB,EAChB,cAAsB,EACtB,MAAyB,EACzB,KAAa,EACb,QAAgB;QAEhB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAElC,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;QACrD,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;QAE7F,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC;QAC/D,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC;QAE/D,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,IAAI,GAAG,cAAc,CAAC;QAElF,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QAClD,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACpD,CAAC;IAKO,wBAAwB,CAC9B,QAAsB,EACtB,QAAgB,EAChB,gBAAyB,EACzB,cAAsB,EACtB,cAAsB;QAGtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,QAAQ,CAAC,EAAE,IAAI,SAAS,CAAC;QACzB,QAAQ,CAAC,EAAE,IAAI,SAAS,CAAC;QAGzB,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC1B,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;QAG1B,IAAI,gBAAgB,EAAE;YACpB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC;YAC1D,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,aAAa,CAAC,CAAC;YAC1D,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC1E,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;SAClH;aAAM;YACL,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC,CAAC;YAChD,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC1E,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;SAClH;IACH,CAAC;IAKO,uBAAuB,CAAC,EAAyB;QACvD,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEtD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;YACrC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAC9B,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAElC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;YAE9C,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAGH,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAGzD,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAG7B,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAGnD,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAKO,qBAAqB,CAC3B,EAAyB,EACzB,SAAuB,EACvB,MAAoB,EACpB,KAAmB;QAGnB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;SACzC;QACD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACpD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;QAE3D,MAAM,gBAAgB,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC1E,EAAE,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;QAC7C,EAAE,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAGnE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;SACtC;QACD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;QAExD,MAAM,aAAa,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpE,EAAE,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;QAC1C,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAGhE,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QACrC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAC3C,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;QAEvD,MAAM,YAAY,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClE,EAAE,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;QACzC,EAAE,CAAC,mBAAmB,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAG9D,IAAY,CAAC,eAAe,GAAG,UAAU,CAAC;IAC7C,CAAC;IAKO,mBAAmB,CAAC,EAAyB;QACnD,MAAM,kBAAkB,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC/E,MAAM,YAAY,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnE,MAAM,qBAAqB,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACrF,MAAM,kBAAkB,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAE/E,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClF,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpD,EAAE,CAAC,SAAS,CAAC,qBAAqB,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAElE,MAAM,aAAa,GAA8B;YAC/C,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;SACX,CAAC;QACF,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,CAAC;IAKO,kBAAkB,CAAC,EAAyB;QAClD,MAAM,cAAc,GAAI,IAAY,CAAC,eAAe,CAAC;QACrD,IAAI,cAAc,EAAE;YAClB,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YAChC,OAAQ,IAAY,CAAC,eAAe,CAAC;SACtC;IACH,CAAC;IAOO,oBAAoB,CAAC,GAA6B,EAAE,MAAyB,EAAE,QAAgB;QACrG,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAGlC,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC5C,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC;QACjC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxB,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;QAClC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAKO,oBAAoB,CAAC,GAA6B,EAAE,MAAyB,EAAE,QAAgB;QAErG,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;QAC/C,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAClC,GAAG,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAKO,mBAAmB,CAAC,GAA6B,EAAE,MAAyB,EAAE,QAAgB;QACpG,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAGlC,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC5C,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChC,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;QAClC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;CACF","file":"particle.js","sourcesContent":["import type { EasingType } from '@visactor/vrender-core';\nimport { HybridEffectBase } from './base/CustomEffectBase';\nimport { ImageProcessUtils } from './base/ImageProcessUtils';\n\nexport interface ParticleConfig {\n effectType?: 'explode' | 'vortex' | 'gravity'; // 粒子效果类型\n count?: number; // 粒子数量\n size?: number; // 粒子大小\n strength?: number; // 力场强度\n}\n// 粒子数据结构\nexport interface ParticleData {\n x: number;\n y: number;\n originX: number;\n originY: number;\n vx: number;\n vy: number;\n r: number;\n g: number;\n b: number;\n a: number;\n life: number;\n size: number;\n}\n\n/**\n * 重构后的粒子消散特效\n * 使用HybridEffectBase,优先WebGL实现,Canvas 2D回退\n */\nexport class Particle extends HybridEffectBase {\n private particles: ParticleData[] = [];\n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private particleConfig: ParticleConfig;\n\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n\n this.particleConfig = {\n effectType: params?.options?.effectType || 'gravity', //'explode' | 'vortex' | 'gravity'; // 粒子效果类型\n count: params?.options?.count || 4000,\n size: params?.options?.size || 20,\n strength: params?.options?.strength || 1.5\n };\n }\n\n // WebGL实现 - 高性能版本\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n const vertexShader = `\n attribute vec2 a_position;\n attribute vec4 a_color;\n attribute float a_size;\n\n uniform vec2 u_resolution;\n uniform float u_time;\n uniform float u_forceStrength;\n uniform int u_effectType;\n\n varying vec4 v_color;\n\n void main() {\n // 将像素坐标转换为剪辑空间坐标\n vec2 clipSpace = ((a_position / u_resolution) * 2.0) - 1.0;\n clipSpace.y = -clipSpace.y; // 翻转Y轴\n\n gl_Position = vec4(clipSpace, 0.0, 1.0);\n gl_PointSize = a_size;\n v_color = a_color;\n }\n `;\n\n const fragmentShader = `\n precision mediump float;\n varying vec4 v_color;\n\n void main() {\n // 创建圆形粒子\n vec2 coord = gl_PointCoord - vec2(0.5);\n float distance = length(coord);\n\n if (distance > 0.5) {\n discard;\n }\n\n // 保持原始颜色,只调整透明度渐变\n gl_FragColor = vec4(v_color.rgb, v_color.a);\n }\n `;\n\n return { vertex: vertexShader, fragment: fragmentShader };\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n if (!this.gl || !this.program || !this.webglCanvas) {\n return null;\n }\n\n // 使用基类提供的WebGL状态设置\n this.setupWebGLState(canvas);\n\n // 如果没有粒子,提取粒子数据\n if (this.particles.length === 0) {\n this.extractParticles(canvas);\n }\n\n // 更新粒子物理\n this.updateParticles(canvas);\n\n const gl = this.gl;\n\n // 启用混合\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n gl.useProgram(this.program);\n\n // 准备粒子数据并绘制\n this.prepareAndDrawParticles(gl);\n\n return this.webglCanvas;\n }\n\n // Canvas 2D回退实现 - 简化版本,主要用于兼容性\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n const output = this.createOutputCanvas(canvas);\n if (!output) {\n return null;\n }\n\n const { canvas: outputCanvas, ctx } = output;\n\n // 简化的粒子效果:使用透明度和简单变换模拟粒子消散\n const progress = this.currentAnimationRatio;\n\n // 根据效果类型应用不同的Canvas 2D模拟\n switch (this.particleConfig.effectType) {\n case 'explode':\n this.applyCanvas2DExplode(ctx, canvas, progress);\n break;\n case 'gravity':\n this.applyCanvas2DGravity(ctx, canvas, progress);\n break;\n case 'vortex':\n this.applyCanvas2DVortex(ctx, canvas, progress);\n break;\n default:\n // 默认简单透明度淡出\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.drawImage(canvas, 0, 0);\n }\n\n return outputCanvas;\n }\n\n /**\n * 从canvas提取粒子数据\n */\n private extractParticles(canvas: HTMLCanvasElement): void {\n const tempCanvas = ImageProcessUtils.createTempCanvas(canvas.width, canvas.height, 1);\n const tempCtx = tempCanvas.getContext('2d');\n if (!tempCtx) {\n return;\n }\n\n // 绘制原始图像到临时canvas\n tempCtx.drawImage(canvas, 0, 0, tempCanvas.width, tempCanvas.height);\n\n // 获取图像数据\n const imageData = tempCtx.getImageData(0, 0, tempCanvas.width, tempCanvas.height);\n const data = imageData.data;\n\n this.particles = [];\n\n // 计算采样步长\n const step = Math.max(\n 1,\n Math.floor(Math.sqrt((tempCanvas.width * tempCanvas.height) / (this.particleConfig.count * 1.5)))\n );\n\n for (let y = 0; y < tempCanvas.height; y += step) {\n for (let x = 0; x < tempCanvas.width; x += step) {\n const index = (y * tempCanvas.width + x) * 4;\n\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n // 只创建非透明像素的粒子\n if (a > 5) {\n // 将坐标转换回原始canvas尺寸\n const realX = (x / tempCanvas.width) * canvas.width;\n const realY = (y / tempCanvas.height) * canvas.height;\n\n const particle: ParticleData = {\n x: realX,\n y: realY,\n originX: realX,\n originY: realY,\n vx: 0,\n vy: 0,\n r: r / 255,\n g: g / 255,\n b: b / 255,\n a: Math.max(0.6, a / 255),\n life: 1.0,\n size: this.particleConfig.size * (1 + Math.random() * 0.5)\n };\n\n this.particles.push(particle);\n }\n }\n }\n }\n\n /**\n * 更新粒子物理模拟\n */\n private updateParticles(canvas: HTMLCanvasElement): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n const progress = this.currentAnimationRatio;\n const duration = this.getDurationFromParent();\n const isShortAnimation = duration < 2000;\n const timeMultiplier = isShortAnimation ? Math.max(1.5, 3000 / duration) : 1.0;\n const intensityBoost = isShortAnimation ? Math.min(2.0, 2000 / duration) : 1.0;\n\n this.particles.forEach(particle => {\n const dx = particle.x - centerX;\n const dy = particle.y - centerY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const angle = Math.atan2(dy, dx);\n\n // 根据效果类型应用不同的物理力\n this.applyParticleForces(particle, angle, distance, progress, intensityBoost, canvas);\n\n // 更新粒子属性\n this.updateParticleProperties(particle, progress, isShortAnimation, timeMultiplier, intensityBoost);\n });\n }\n\n /**\n * 根据效果类型应用粒子力\n */\n private applyParticleForces(\n particle: ParticleData,\n angle: number,\n distance: number,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement\n ): void {\n const time = this.getAnimationTime();\n\n switch (this.particleConfig.effectType) {\n case 'explode':\n const explodeIntensity = progress * this.particleConfig.strength * intensityBoost * 5;\n particle.vx += Math.cos(angle) * explodeIntensity;\n particle.vy += Math.sin(angle) * explodeIntensity;\n break;\n\n case 'gravity':\n this.applyGravityEffect(particle, progress, intensityBoost, canvas, time);\n break;\n\n case 'vortex':\n this.applyVortexEffect(particle, progress, intensityBoost, canvas, angle, distance);\n break;\n }\n }\n\n /**\n * 应用重力效果\n */\n private applyGravityEffect(\n particle: ParticleData,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement,\n time: number\n ): void {\n const gravityThreshold = ((particle.originX + particle.originY * 0.7) / (canvas.width + canvas.height)) * 0.8;\n\n if (progress > gravityThreshold) {\n const gravityProgress = (progress - gravityThreshold) / (1 - gravityThreshold);\n const gravityForce = this.particleConfig.strength * gravityProgress * gravityProgress * 12 * intensityBoost;\n\n particle.vy += gravityForce;\n\n // 添加水平随机扰动\n const turbulence = Math.sin(time * 3 + particle.originX * 0.02) * Math.cos(time * 2 + particle.originY * 0.015);\n particle.vx += turbulence * this.particleConfig.strength * 2 * intensityBoost;\n }\n }\n\n /**\n * 应用漩涡效果\n */\n private applyVortexEffect(\n particle: ParticleData,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement,\n angle: number,\n distance: number\n ): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n const spiralAngle = angle + progress * Math.PI * 0.8;\n const targetRadius = distance + progress * Math.max(canvas.width, canvas.height) * 0.7 * 1.8;\n\n const targetX = centerX + Math.cos(spiralAngle) * targetRadius;\n const targetY = centerY + Math.sin(spiralAngle) * targetRadius;\n\n const baseForce = progress * this.particleConfig.strength * 0.08 * intensityBoost;\n\n particle.vx += (targetX - particle.x) * baseForce;\n particle.vy += (targetY - particle.y) * baseForce;\n }\n\n /**\n * 更新粒子生命周期属性\n */\n private updateParticleProperties(\n particle: ParticleData,\n progress: number,\n isShortAnimation: boolean,\n timeMultiplier: number,\n intensityBoost: number\n ): void {\n // 应用阻力\n const dragCoeff = isShortAnimation ? 0.99 : 0.98;\n particle.vx *= dragCoeff;\n particle.vy *= dragCoeff;\n\n // 更新位置\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n // 更新生命值和透明度\n if (isShortAnimation) {\n const lifeDecayRate = Math.max(0.1, 0.5 / timeMultiplier);\n particle.life = Math.max(0, 1 - progress * lifeDecayRate);\n particle.a = Math.max(0.2, particle.life * Math.min(1, particle.a * 1.2));\n particle.size = Math.max(this.particleConfig.size * 0.7, this.particleConfig.size * (0.5 + particle.life * 0.5));\n } else {\n particle.life = Math.max(0, 1 - progress * 0.2);\n particle.a = Math.max(0.1, particle.life * Math.min(1, particle.a * 1.5));\n particle.size = Math.max(this.particleConfig.size * 0.5, this.particleConfig.size * (0.3 + particle.life * 0.7));\n }\n }\n\n /**\n * 准备粒子数据并绘制\n */\n private prepareAndDrawParticles(gl: WebGLRenderingContext): void {\n const positions = new Float32Array(this.particles.length * 2);\n const colors = new Float32Array(this.particles.length * 4);\n const sizes = new Float32Array(this.particles.length);\n\n this.particles.forEach((particle, i) => {\n positions[i * 2] = particle.x;\n positions[i * 2 + 1] = particle.y;\n\n colors[i * 4] = particle.r;\n colors[i * 4 + 1] = particle.g;\n colors[i * 4 + 2] = particle.b;\n colors[i * 4 + 3] = Math.max(0.1, particle.a);\n\n sizes[i] = Math.max(6, particle.size * 1.5);\n });\n\n // 更新缓冲区\n this.updateParticleBuffers(gl, positions, colors, sizes);\n\n // 设置uniforms\n this.setParticleUniforms(gl);\n\n // 绘制粒子\n gl.drawArrays(gl.POINTS, 0, this.particles.length);\n\n // 清理临时缓冲区\n this.cleanupTempBuffers(gl);\n }\n\n /**\n * 更新粒子缓冲区\n */\n private updateParticleBuffers(\n gl: WebGLRenderingContext,\n positions: Float32Array,\n colors: Float32Array,\n sizes: Float32Array\n ): void {\n // 位置缓冲区\n if (!this.positionBuffer) {\n this.positionBuffer = gl.createBuffer();\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(this.program, 'a_position');\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n // 颜色缓冲区\n if (!this.colorBuffer) {\n this.colorBuffer = gl.createBuffer();\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n\n const colorLocation = gl.getAttribLocation(this.program, 'a_color');\n gl.enableVertexAttribArray(colorLocation);\n gl.vertexAttribPointer(colorLocation, 4, gl.FLOAT, false, 0, 0);\n\n // 大小缓冲区\n const sizeBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, sizeBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, sizes, gl.DYNAMIC_DRAW);\n\n const sizeLocation = gl.getAttribLocation(this.program, 'a_size');\n gl.enableVertexAttribArray(sizeLocation);\n gl.vertexAttribPointer(sizeLocation, 1, gl.FLOAT, false, 0, 0);\n\n // 保存临时缓冲区引用,用于清理\n (this as any)._tempSizeBuffer = sizeBuffer;\n }\n\n /**\n * 设置粒子着色器uniforms\n */\n private setParticleUniforms(gl: WebGLRenderingContext): void {\n const resolutionLocation = gl.getUniformLocation(this.program, 'u_resolution');\n const timeLocation = gl.getUniformLocation(this.program, 'u_time');\n const forceStrengthLocation = gl.getUniformLocation(this.program, 'u_forceStrength');\n const effectTypeLocation = gl.getUniformLocation(this.program, 'u_effectType');\n\n gl.uniform2f(resolutionLocation, this.webglCanvas.width, this.webglCanvas.height);\n gl.uniform1f(timeLocation, this.getAnimationTime());\n gl.uniform1f(forceStrengthLocation, this.particleConfig.strength);\n\n const effectTypeMap: { [key: string]: number } = {\n explode: 0,\n vortex: 1,\n gravity: 2\n };\n gl.uniform1i(effectTypeLocation, effectTypeMap[this.particleConfig.effectType] || 0);\n }\n\n /**\n * 清理临时缓冲区\n */\n private cleanupTempBuffers(gl: WebGLRenderingContext): void {\n const tempSizeBuffer = (this as any)._tempSizeBuffer;\n if (tempSizeBuffer) {\n gl.deleteBuffer(tempSizeBuffer);\n delete (this as any)._tempSizeBuffer;\n }\n }\n\n // Canvas 2D回退实现的具体方法\n\n /**\n * Canvas 2D爆炸效果模拟\n */\n private applyCanvas2DExplode(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n // 简单的放大和透明度模拟爆炸效果\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.translate(centerX, centerY);\n const scale = 1 + progress * 0.5;\n ctx.scale(scale, scale);\n ctx.translate(-centerX, -centerY);\n ctx.drawImage(canvas, 0, 0);\n ctx.restore();\n }\n\n /**\n * Canvas 2D重力效果模拟\n */\n private applyCanvas2DGravity(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n // 使用垂直偏移和透明度模拟重力下落\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n const offsetY = progress * canvas.height * 0.3;\n ctx.drawImage(canvas, 0, offsetY);\n ctx.restore();\n }\n\n /**\n * Canvas 2D漩涡效果模拟\n */\n private applyCanvas2DVortex(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n // 使用旋转和透明度模拟漩涡效果\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.translate(centerX, centerY);\n ctx.rotate(progress * Math.PI * 2);\n ctx.translate(-centerX, -centerY);\n ctx.drawImage(canvas, 0, 0);\n ctx.restore();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/custom/disappear/particle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AA6B7D,MAAM,OAAO,QAAS,SAAQ,gBAAgB;IAM5C,YAAY,IAAU,EAAE,EAAQ,EAAE,QAAgB,EAAE,MAAkB,EAAE,MAAW;;QACjF,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QANpC,cAAS,GAAmB,EAAE,CAAC;QAC/B,mBAAc,GAAuB,IAAI,CAAC;QAC1C,gBAAW,GAAuB,IAAI,CAAC;QAM7C,IAAI,CAAC,cAAc,GAAG;YACpB,UAAU,EAAE,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,UAAU,KAAI,SAAS;YACpD,KAAK,EAAE,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,KAAK,KAAI,IAAI;YACrC,IAAI,EAAE,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,IAAI,KAAI,EAAE;YACjC,QAAQ,EAAE,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,QAAQ,KAAI,GAAG;YAC1C,QAAQ,EAAE,CAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,0CAAE,QAAQ,MAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;SACnF,CAAC;IACJ,CAAC;IAGS,gBAAgB;QACxB,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;KAqBpB,CAAC;QAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;KAgBtB,CAAC;QAEF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC5D,CAAC;IAES,gBAAgB,CAAC,MAAyB;QAClD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAClD,OAAO,IAAI,CAAC;SACb;QAGD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAG7B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;SAC/B;QAGD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAE7B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAGnB,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACpB,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC;QAEnD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAG5B,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAEjC,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAGS,mBAAmB,CAAC,MAAyB;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,IAAI,CAAC;SACb;QAED,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;QAG7C,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAG5C,QAAQ,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;YACtC,KAAK,SAAS;gBACZ,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACjD,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACjD,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAChD,MAAM;YACR;gBAEE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAC5C,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SAC/B;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAKO,gBAAgB,CAAC,MAAyB;QAChD,MAAM,UAAU,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO;SACR;QAGD,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAGrE,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;QAE5B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QAGpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,EACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAClG,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE;YAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE;gBAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAE7C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAG1B,IAAI,CAAC,GAAG,CAAC,EAAE;oBAET,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;oBACpD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;oBAEtD,MAAM,QAAQ,GAAiB;wBAC7B,CAAC,EAAE,KAAK;wBACR,CAAC,EAAE,KAAK;wBACR,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,KAAK;wBACd,EAAE,EAAE,CAAC;wBACL,EAAE,EAAE,CAAC;wBACL,CAAC,EAAE,CAAC,GAAG,GAAG;wBACV,CAAC,EAAE,CAAC,GAAG,GAAG;wBACV,CAAC,EAAE,CAAC,GAAG,GAAG;wBACV,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;wBACzB,IAAI,EAAE,GAAG;wBACT,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;qBAC3D,CAAC;oBAEF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAC/B;aACF;SACF;IACH,CAAC;IAKO,eAAe,CAAC,MAAyB;QAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC9C,MAAM,gBAAgB,GAAG,QAAQ,GAAG,IAAI,CAAC;QACzC,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/E,MAAM,cAAc,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE/E,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC;YAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAGjC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;YAGtF,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;IACL,CAAC;IAKO,mBAAmB,CACzB,QAAsB,EACtB,KAAa,EACb,QAAgB,EAChB,QAAgB,EAChB,cAAsB,EACtB,MAAyB;QAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAErC,QAAQ,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;YACtC,KAAK,SAAS;gBACZ,MAAM,gBAAgB,GAAG,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,cAAc,GAAG,CAAC,CAAC;gBACtF,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC;gBAClD,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC;gBAClD,MAAM;YAER,KAAK,SAAS;gBACZ,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC1E,MAAM;YAER,KAAK,QAAQ;gBACX,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACpF,MAAM;SACT;IACH,CAAC;IAKO,kBAAkB,CACxB,QAAsB,EACtB,QAAgB,EAChB,cAAsB,EACtB,MAAyB,EACzB,IAAY;QAEZ,MAAM,gBAAgB,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;QAE9G,IAAI,QAAQ,GAAG,gBAAgB,EAAE;YAC/B,MAAM,eAAe,GAAG,CAAC,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,eAAe,GAAG,eAAe,GAAG,EAAE,GAAG,cAAc,CAAC;YAE5G,QAAQ,CAAC,EAAE,IAAI,YAAY,CAAC;YAG5B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;YAChH,QAAQ,CAAC,EAAE,IAAI,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,CAAC,GAAG,cAAc,CAAC;SAC/E;IACH,CAAC;IAKO,iBAAiB,CACvB,QAAsB,EACtB,QAAgB,EAChB,cAAsB,EACtB,MAAyB,EACzB,KAAa,EACb,QAAgB;QAEhB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAElC,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;QACrD,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;QAE7F,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC;QAC/D,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC;QAE/D,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,IAAI,GAAG,cAAc,CAAC;QAElF,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QAClD,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACpD,CAAC;IAKO,wBAAwB,CAC9B,QAAsB,EACtB,QAAgB,EAChB,gBAAyB,EACzB,cAAsB,EACtB,cAAsB;QAGtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,QAAQ,CAAC,EAAE,IAAI,SAAS,CAAC;QACzB,QAAQ,CAAC,EAAE,IAAI,SAAS,CAAC;QAGzB,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC1B,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;QAG1B,IAAI,gBAAgB,EAAE;YACpB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,cAAc,CAAC,CAAC;YAC1D,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,aAAa,CAAC,CAAC;YAC1D,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC1E,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;SAClH;aAAM;YACL,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC,CAAC;YAChD,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YAC1E,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;SAClH;IACH,CAAC;IAKO,uBAAuB,CAAC,EAAyB;QACvD,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEtD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;YACrC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAC9B,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAElC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;YAE9C,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAGH,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAGzD,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAG7B,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAGnD,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAKO,qBAAqB,CAC3B,EAAyB,EACzB,SAAuB,EACvB,MAAoB,EACpB,KAAmB;QAGnB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;SACzC;QACD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACpD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;QAE3D,MAAM,gBAAgB,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC1E,EAAE,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;QAC7C,EAAE,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAGnE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;SACtC;QACD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;QAExD,MAAM,aAAa,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpE,EAAE,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;QAC1C,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAGhE,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;QACrC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAC3C,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;QAEvD,MAAM,YAAY,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClE,EAAE,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;QACzC,EAAE,CAAC,mBAAmB,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAG9D,IAAY,CAAC,eAAe,GAAG,UAAU,CAAC;IAC7C,CAAC;IAKO,mBAAmB,CAAC,EAAyB;QACnD,MAAM,kBAAkB,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC/E,MAAM,YAAY,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnE,MAAM,qBAAqB,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACrF,MAAM,kBAAkB,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAE/E,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClF,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpD,EAAE,CAAC,SAAS,CAAC,qBAAqB,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAElE,MAAM,aAAa,GAA8B;YAC/C,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;SACX,CAAC;QACF,EAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,CAAC;IAKO,kBAAkB,CAAC,EAAyB;QAClD,MAAM,cAAc,GAAI,IAAY,CAAC,eAAe,CAAC;QACrD,IAAI,cAAc,EAAE;YAClB,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YAChC,OAAQ,IAAY,CAAC,eAAe,CAAC;SACtC;IACH,CAAC;IAOO,oBAAoB,CAAC,GAA6B,EAAE,MAAyB,EAAE,QAAgB;QACrG,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAGlC,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC5C,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC;QACjC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxB,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;QAClC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAKO,oBAAoB,CAAC,GAA6B,EAAE,MAAyB,EAAE,QAAgB;QAErG,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;QAC/C,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAClC,GAAG,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAKO,mBAAmB,CAAC,GAA6B,EAAE,MAAyB,EAAE,QAAgB;QACpG,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAGlC,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC5C,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChC,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;QAClC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;CACF","file":"particle.js","sourcesContent":["import type { EasingType } from '@visactor/vrender-core';\nimport { HybridEffectBase } from './base/CustomEffectBase';\nimport { ImageProcessUtils } from './base/ImageProcessUtils';\n\nexport interface ParticleConfig {\n effectType?: 'explode' | 'vortex' | 'gravity'; // 粒子效果类型\n count?: number; // 粒子数量\n size?: number; // 粒子大小\n strength?: number; // 力场强度\n useWebGL: boolean;\n}\n// 粒子数据结构\nexport interface ParticleData {\n x: number;\n y: number;\n originX: number;\n originY: number;\n vx: number;\n vy: number;\n r: number;\n g: number;\n b: number;\n a: number;\n life: number;\n size: number;\n}\n\n/**\n * 重构后的粒子消散特效\n * 使用HybridEffectBase,优先WebGL实现,Canvas 2D回退\n */\nexport class Particle extends HybridEffectBase {\n private particles: ParticleData[] = [];\n private positionBuffer: WebGLBuffer | null = null;\n private colorBuffer: WebGLBuffer | null = null;\n private particleConfig: ParticleConfig;\n\n constructor(from: null, to: null, duration: number, easing: EasingType, params: any) {\n super(from, to, duration, easing, params);\n\n this.particleConfig = {\n effectType: params?.options?.effectType || 'gravity', //'explode' | 'vortex' | 'gravity'; // 粒子效果类型\n count: params?.options?.count || 4000,\n size: params?.options?.size || 20,\n strength: params?.options?.strength || 1.5,\n useWebGL: params?.options?.useWebGL !== undefined ? params.options.useWebGL : true // 是否使用WebGL实现\n };\n }\n\n // WebGL实现 - 高性能版本\n protected getShaderSources(): { vertex: string; fragment: string } | null {\n const vertexShader = `\n attribute vec2 a_position;\n attribute vec4 a_color;\n attribute float a_size;\n\n uniform vec2 u_resolution;\n uniform float u_time;\n uniform float u_forceStrength;\n uniform int u_effectType;\n\n varying vec4 v_color;\n\n void main() {\n // 将像素坐标转换为剪辑空间坐标\n vec2 clipSpace = ((a_position / u_resolution) * 2.0) - 1.0;\n clipSpace.y = -clipSpace.y; // 翻转Y轴\n\n gl_Position = vec4(clipSpace, 0.0, 1.0);\n gl_PointSize = a_size;\n v_color = a_color;\n }\n `;\n\n const fragmentShader = `\n precision mediump float;\n varying vec4 v_color;\n\n void main() {\n // 创建圆形粒子\n vec2 coord = gl_PointCoord - vec2(0.5);\n float distance = length(coord);\n\n if (distance > 0.5) {\n discard;\n }\n\n // 保持原始颜色,只调整透明度渐变\n gl_FragColor = vec4(v_color.rgb, v_color.a);\n }\n `;\n\n return { vertex: vertexShader, fragment: fragmentShader };\n }\n\n protected applyWebGLEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n if (!this.gl || !this.program || !this.webglCanvas) {\n return null;\n }\n\n // 使用基类提供的WebGL状态设置\n this.setupWebGLState(canvas);\n\n // 如果没有粒子,提取粒子数据\n if (this.particles.length === 0) {\n this.extractParticles(canvas);\n }\n\n // 更新粒子物理\n this.updateParticles(canvas);\n\n const gl = this.gl;\n\n // 启用混合\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n gl.useProgram(this.program);\n\n // 准备粒子数据并绘制\n this.prepareAndDrawParticles(gl);\n\n return this.webglCanvas;\n }\n\n // Canvas 2D回退实现 - 简化版本,主要用于兼容性\n protected applyCanvas2DEffect(canvas: HTMLCanvasElement): HTMLCanvasElement | null {\n const output = this.createOutputCanvas(canvas);\n if (!output) {\n return null;\n }\n\n const { canvas: outputCanvas, ctx } = output;\n\n // 简化的粒子效果:使用透明度和简单变换模拟粒子消散\n const progress = this.currentAnimationRatio;\n\n // 根据效果类型应用不同的Canvas 2D模拟\n switch (this.particleConfig.effectType) {\n case 'explode':\n this.applyCanvas2DExplode(ctx, canvas, progress);\n break;\n case 'gravity':\n this.applyCanvas2DGravity(ctx, canvas, progress);\n break;\n case 'vortex':\n this.applyCanvas2DVortex(ctx, canvas, progress);\n break;\n default:\n // 默认简单透明度淡出\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.drawImage(canvas, 0, 0);\n }\n\n return outputCanvas;\n }\n\n /**\n * 从canvas提取粒子数据\n */\n private extractParticles(canvas: HTMLCanvasElement): void {\n const tempCanvas = ImageProcessUtils.createTempCanvas(canvas.width, canvas.height, 1);\n const tempCtx = tempCanvas.getContext('2d');\n if (!tempCtx) {\n return;\n }\n\n // 绘制原始图像到临时canvas\n tempCtx.drawImage(canvas, 0, 0, tempCanvas.width, tempCanvas.height);\n\n // 获取图像数据\n const imageData = tempCtx.getImageData(0, 0, tempCanvas.width, tempCanvas.height);\n const data = imageData.data;\n\n this.particles = [];\n\n // 计算采样步长\n const step = Math.max(\n 1,\n Math.floor(Math.sqrt((tempCanvas.width * tempCanvas.height) / (this.particleConfig.count * 1.5)))\n );\n\n for (let y = 0; y < tempCanvas.height; y += step) {\n for (let x = 0; x < tempCanvas.width; x += step) {\n const index = (y * tempCanvas.width + x) * 4;\n\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const a = data[index + 3];\n\n // 只创建非透明像素的粒子\n if (a > 5) {\n // 将坐标转换回原始canvas尺寸\n const realX = (x / tempCanvas.width) * canvas.width;\n const realY = (y / tempCanvas.height) * canvas.height;\n\n const particle: ParticleData = {\n x: realX,\n y: realY,\n originX: realX,\n originY: realY,\n vx: 0,\n vy: 0,\n r: r / 255,\n g: g / 255,\n b: b / 255,\n a: Math.max(0.6, a / 255),\n life: 1.0,\n size: this.particleConfig.size * (1 + Math.random() * 0.5)\n };\n\n this.particles.push(particle);\n }\n }\n }\n }\n\n /**\n * 更新粒子物理模拟\n */\n private updateParticles(canvas: HTMLCanvasElement): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n const progress = this.currentAnimationRatio;\n const duration = this.getDurationFromParent();\n const isShortAnimation = duration < 2000;\n const timeMultiplier = isShortAnimation ? Math.max(1.5, 3000 / duration) : 1.0;\n const intensityBoost = isShortAnimation ? Math.min(2.0, 2000 / duration) : 1.0;\n\n this.particles.forEach(particle => {\n const dx = particle.x - centerX;\n const dy = particle.y - centerY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const angle = Math.atan2(dy, dx);\n\n // 根据效果类型应用不同的物理力\n this.applyParticleForces(particle, angle, distance, progress, intensityBoost, canvas);\n\n // 更新粒子属性\n this.updateParticleProperties(particle, progress, isShortAnimation, timeMultiplier, intensityBoost);\n });\n }\n\n /**\n * 根据效果类型应用粒子力\n */\n private applyParticleForces(\n particle: ParticleData,\n angle: number,\n distance: number,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement\n ): void {\n const time = this.getAnimationTime();\n\n switch (this.particleConfig.effectType) {\n case 'explode':\n const explodeIntensity = progress * this.particleConfig.strength * intensityBoost * 5;\n particle.vx += Math.cos(angle) * explodeIntensity;\n particle.vy += Math.sin(angle) * explodeIntensity;\n break;\n\n case 'gravity':\n this.applyGravityEffect(particle, progress, intensityBoost, canvas, time);\n break;\n\n case 'vortex':\n this.applyVortexEffect(particle, progress, intensityBoost, canvas, angle, distance);\n break;\n }\n }\n\n /**\n * 应用重力效果\n */\n private applyGravityEffect(\n particle: ParticleData,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement,\n time: number\n ): void {\n const gravityThreshold = ((particle.originX + particle.originY * 0.7) / (canvas.width + canvas.height)) * 0.8;\n\n if (progress > gravityThreshold) {\n const gravityProgress = (progress - gravityThreshold) / (1 - gravityThreshold);\n const gravityForce = this.particleConfig.strength * gravityProgress * gravityProgress * 12 * intensityBoost;\n\n particle.vy += gravityForce;\n\n // 添加水平随机扰动\n const turbulence = Math.sin(time * 3 + particle.originX * 0.02) * Math.cos(time * 2 + particle.originY * 0.015);\n particle.vx += turbulence * this.particleConfig.strength * 2 * intensityBoost;\n }\n }\n\n /**\n * 应用漩涡效果\n */\n private applyVortexEffect(\n particle: ParticleData,\n progress: number,\n intensityBoost: number,\n canvas: HTMLCanvasElement,\n angle: number,\n distance: number\n ): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n const spiralAngle = angle + progress * Math.PI * 0.8;\n const targetRadius = distance + progress * Math.max(canvas.width, canvas.height) * 0.7 * 1.8;\n\n const targetX = centerX + Math.cos(spiralAngle) * targetRadius;\n const targetY = centerY + Math.sin(spiralAngle) * targetRadius;\n\n const baseForce = progress * this.particleConfig.strength * 0.08 * intensityBoost;\n\n particle.vx += (targetX - particle.x) * baseForce;\n particle.vy += (targetY - particle.y) * baseForce;\n }\n\n /**\n * 更新粒子生命周期属性\n */\n private updateParticleProperties(\n particle: ParticleData,\n progress: number,\n isShortAnimation: boolean,\n timeMultiplier: number,\n intensityBoost: number\n ): void {\n // 应用阻力\n const dragCoeff = isShortAnimation ? 0.99 : 0.98;\n particle.vx *= dragCoeff;\n particle.vy *= dragCoeff;\n\n // 更新位置\n particle.x += particle.vx;\n particle.y += particle.vy;\n\n // 更新生命值和透明度\n if (isShortAnimation) {\n const lifeDecayRate = Math.max(0.1, 0.5 / timeMultiplier);\n particle.life = Math.max(0, 1 - progress * lifeDecayRate);\n particle.a = Math.max(0.2, particle.life * Math.min(1, particle.a * 1.2));\n particle.size = Math.max(this.particleConfig.size * 0.7, this.particleConfig.size * (0.5 + particle.life * 0.5));\n } else {\n particle.life = Math.max(0, 1 - progress * 0.2);\n particle.a = Math.max(0.1, particle.life * Math.min(1, particle.a * 1.5));\n particle.size = Math.max(this.particleConfig.size * 0.5, this.particleConfig.size * (0.3 + particle.life * 0.7));\n }\n }\n\n /**\n * 准备粒子数据并绘制\n */\n private prepareAndDrawParticles(gl: WebGLRenderingContext): void {\n const positions = new Float32Array(this.particles.length * 2);\n const colors = new Float32Array(this.particles.length * 4);\n const sizes = new Float32Array(this.particles.length);\n\n this.particles.forEach((particle, i) => {\n positions[i * 2] = particle.x;\n positions[i * 2 + 1] = particle.y;\n\n colors[i * 4] = particle.r;\n colors[i * 4 + 1] = particle.g;\n colors[i * 4 + 2] = particle.b;\n colors[i * 4 + 3] = Math.max(0.1, particle.a);\n\n sizes[i] = Math.max(6, particle.size * 1.5);\n });\n\n // 更新缓冲区\n this.updateParticleBuffers(gl, positions, colors, sizes);\n\n // 设置uniforms\n this.setParticleUniforms(gl);\n\n // 绘制粒子\n gl.drawArrays(gl.POINTS, 0, this.particles.length);\n\n // 清理临时缓冲区\n this.cleanupTempBuffers(gl);\n }\n\n /**\n * 更新粒子缓冲区\n */\n private updateParticleBuffers(\n gl: WebGLRenderingContext,\n positions: Float32Array,\n colors: Float32Array,\n sizes: Float32Array\n ): void {\n // 位置缓冲区\n if (!this.positionBuffer) {\n this.positionBuffer = gl.createBuffer();\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.DYNAMIC_DRAW);\n\n const positionLocation = gl.getAttribLocation(this.program, 'a_position');\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n // 颜色缓冲区\n if (!this.colorBuffer) {\n this.colorBuffer = gl.createBuffer();\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, colors, gl.DYNAMIC_DRAW);\n\n const colorLocation = gl.getAttribLocation(this.program, 'a_color');\n gl.enableVertexAttribArray(colorLocation);\n gl.vertexAttribPointer(colorLocation, 4, gl.FLOAT, false, 0, 0);\n\n // 大小缓冲区\n const sizeBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, sizeBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, sizes, gl.DYNAMIC_DRAW);\n\n const sizeLocation = gl.getAttribLocation(this.program, 'a_size');\n gl.enableVertexAttribArray(sizeLocation);\n gl.vertexAttribPointer(sizeLocation, 1, gl.FLOAT, false, 0, 0);\n\n // 保存临时缓冲区引用,用于清理\n (this as any)._tempSizeBuffer = sizeBuffer;\n }\n\n /**\n * 设置粒子着色器uniforms\n */\n private setParticleUniforms(gl: WebGLRenderingContext): void {\n const resolutionLocation = gl.getUniformLocation(this.program, 'u_resolution');\n const timeLocation = gl.getUniformLocation(this.program, 'u_time');\n const forceStrengthLocation = gl.getUniformLocation(this.program, 'u_forceStrength');\n const effectTypeLocation = gl.getUniformLocation(this.program, 'u_effectType');\n\n gl.uniform2f(resolutionLocation, this.webglCanvas.width, this.webglCanvas.height);\n gl.uniform1f(timeLocation, this.getAnimationTime());\n gl.uniform1f(forceStrengthLocation, this.particleConfig.strength);\n\n const effectTypeMap: { [key: string]: number } = {\n explode: 0,\n vortex: 1,\n gravity: 2\n };\n gl.uniform1i(effectTypeLocation, effectTypeMap[this.particleConfig.effectType] || 0);\n }\n\n /**\n * 清理临时缓冲区\n */\n private cleanupTempBuffers(gl: WebGLRenderingContext): void {\n const tempSizeBuffer = (this as any)._tempSizeBuffer;\n if (tempSizeBuffer) {\n gl.deleteBuffer(tempSizeBuffer);\n delete (this as any)._tempSizeBuffer;\n }\n }\n\n // Canvas 2D回退实现的具体方法\n\n /**\n * Canvas 2D爆炸效果模拟\n */\n private applyCanvas2DExplode(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n // 简单的放大和透明度模拟爆炸效果\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.translate(centerX, centerY);\n const scale = 1 + progress * 0.5;\n ctx.scale(scale, scale);\n ctx.translate(-centerX, -centerY);\n ctx.drawImage(canvas, 0, 0);\n ctx.restore();\n }\n\n /**\n * Canvas 2D重力效果模拟\n */\n private applyCanvas2DGravity(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n // 使用垂直偏移和透明度模拟重力下落\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n const offsetY = progress * canvas.height * 0.3;\n ctx.drawImage(canvas, 0, offsetY);\n ctx.restore();\n }\n\n /**\n * Canvas 2D漩涡效果模拟\n */\n private applyCanvas2DVortex(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement, progress: number): void {\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n // 使用旋转和透明度模拟漩涡效果\n ctx.save();\n ctx.globalAlpha = Math.max(0, 1 - progress);\n ctx.translate(centerX, centerY);\n ctx.rotate(progress * Math.PI * 2);\n ctx.translate(-centerX, -centerY);\n ctx.drawImage(canvas, 0, 0);\n ctx.restore();\n }\n}\n"]}
package/es/custom/fade.js CHANGED
@@ -15,4 +15,5 @@ export class FadeOut extends CommonOut {
15
15
  constructor(from, to, duration, easing, params) {
16
16
  super(from, to, duration, easing, params), this.keys = [ "opacity", "fillOpacity", "strokeOpacity" ];
17
17
  }
18
- }
18
+ }
19
+ //# sourceMappingURL=fade.js.map
@@ -12,5 +12,4 @@ export class GroupFadeOut extends CommonOut {
12
12
  constructor(from, to, duration, easing, params) {
13
13
  super(from, to, duration, easing, params), this.keys = [ "baseOpacity" ];
14
14
  }
15
- }
16
- //# sourceMappingURL=groupFade.js.map
15
+ }
@@ -100,4 +100,5 @@ export const registerCustomAnimate = () => {
100
100
  AnimateExecutor.registerBuiltInAnimate("pixelation", Pixelation);
101
101
  };
102
102
 
103
- export { ClipIn, ClipOut, FadeIn, FadeOut, GrowAngleIn, GrowAngleOut, GrowCenterIn, GrowCenterOut, GrowHeightIn, GrowHeightOut, GrowPointsIn, GrowPointsOut, GrowPointsXIn, GrowPointsXOut, GrowPointsYIn, GrowPointsYOut, GrowRadiusIn, GrowRadiusOut, GrowWidthIn, GrowWidthOut, IncreaseCount, PoptipAppear, PoptipDisappear, ScaleIn, ScaleOut, MoveIn, MoveOut, RotateIn, RotateOut, State, Update, MotionPath, LabelItemAppear, LabelItemDisappear, InputText, InputRichText, OutputRichText, SlideRichText, SlideOutRichText, SlideIn, GrowIn, SpinIn, MoveScaleIn, MoveRotateIn, SlideOut, GrowOut, SpinOut, MoveScaleOut, MoveRotateOut, StrokeIn, StrokeOut, PulseAnimate, GroupFadeIn, GroupFadeOut, FromTo, StreamLight, Dissolve, Grayscale, Distortion, Particle, Glitch, GaussianBlur, Pixelation };
103
+ export { ClipIn, ClipOut, FadeIn, FadeOut, GrowAngleIn, GrowAngleOut, GrowCenterIn, GrowCenterOut, GrowHeightIn, GrowHeightOut, GrowPointsIn, GrowPointsOut, GrowPointsXIn, GrowPointsXOut, GrowPointsYIn, GrowPointsYOut, GrowRadiusIn, GrowRadiusOut, GrowWidthIn, GrowWidthOut, IncreaseCount, PoptipAppear, PoptipDisappear, ScaleIn, ScaleOut, MoveIn, MoveOut, RotateIn, RotateOut, State, Update, MotionPath, LabelItemAppear, LabelItemDisappear, InputText, InputRichText, OutputRichText, SlideRichText, SlideOutRichText, SlideIn, GrowIn, SpinIn, MoveScaleIn, MoveRotateIn, SlideOut, GrowOut, SpinOut, MoveScaleOut, MoveRotateOut, StrokeIn, StrokeOut, PulseAnimate, GroupFadeIn, GroupFadeOut, FromTo, StreamLight, Dissolve, Grayscale, Distortion, Particle, Glitch, GaussianBlur, Pixelation };
104
+ //# sourceMappingURL=register.js.map
@@ -108,5 +108,4 @@ export class ScaleOut extends ACustomAnimate {
108
108
  attribute[key] = this.from[key] + (this.to[key] - this.from[key]) * ratio;
109
109
  })), this.target.addUpdatePositionTag(), this.target.addUpdateBoundTag();
110
110
  }
111
- }
112
- //# sourceMappingURL=scale.js.map
111
+ }
package/es/step.d.ts CHANGED
@@ -47,7 +47,6 @@ export declare class Step implements IStep {
47
47
  export declare class WaitStep extends Step {
48
48
  constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType);
49
49
  onStart(): void;
50
- onFirstRun(): void;
51
50
  update(end: boolean, ratio: number, out: Record<string, any>): void;
52
51
  determineInterpolateUpdateFunction(): void;
53
52
  }
package/es/step.js CHANGED
@@ -126,8 +126,6 @@ export class WaitStep extends Step {
126
126
  }
127
127
  onStart() {
128
128
  super.onStart();
129
- }
130
- onFirstRun() {
131
129
  const fromProps = this.getFromProps();
132
130
  this.target.setAttributes(fromProps);
133
131
  }
package/es/step.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/step.ts"],"names":[],"mappings":"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","file":"step.js","sourcesContent":["import {\n ColorStore,\n ColorType,\n Generator,\n type IGraphic,\n type IAnimate,\n type IStep,\n type EasingType,\n type EasingTypeFunc,\n type IAnimateStepType\n} from '@visactor/vrender-core';\nimport { Easing } from './utils/easing';\nimport { commonInterpolateUpdate, interpolateUpdateStore } from './interpolate/store';\nimport { isString } from '@visactor/vutils';\n\nfunction noop() {\n //...\n}\n\nexport class Step implements IStep {\n id: number;\n type: IAnimateStepType;\n prev?: IStep;\n duration: number;\n next?: IStep;\n props?: Record<string, any>;\n propKeys?: string[];\n interpolateUpdateFunctions?: ((\n key: string,\n from: number,\n to: number,\n ratio: number,\n step: IStep,\n target: IGraphic\n ) => void)[];\n easing: EasingTypeFunc;\n animate: IAnimate;\n target: IGraphic;\n fromProps: Record<string, any>;\n fromParsedProps: Record<string, any>;\n toParsedProps: Record<string, any>;\n\n // 内部状态\n protected _startTime: number = 0;\n _hasFirstRun: boolean = false;\n\n protected _endCb?: (animate: IAnimate, step: IStep) => void;\n\n syncAttributeUpdate: () => void;\n\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n this.type = type;\n this.props = props;\n this.duration = duration;\n // 设置缓动函数\n if (easing) {\n this.easing = typeof easing === 'function' ? easing : Easing[easing] ?? Easing.linear;\n } else {\n this.easing = Easing.linear;\n }\n if (type === 'wait') {\n this.onUpdate = noop;\n }\n this.id = Generator.GenAutoIncrementId();\n this.syncAttributeUpdate = noop;\n }\n\n bind(target: IGraphic, animate: IAnimate): void {\n this.target = target;\n this.animate = animate;\n this.onBind();\n this.syncAttributeUpdate();\n }\n\n append(step: IStep): void {\n this.next = step;\n step.prev = this;\n\n // 更新绝对时间\n step.setStartTime(this.getStartTime() + this.duration, false);\n }\n\n // 更新下游节点的开始时间\n private updateDownstreamStartTimes(): void {\n let currentStep = this.next;\n let currentStartTime = this._startTime + this.duration;\n\n while (currentStep) {\n currentStep.setStartTime(currentStartTime, false);\n currentStartTime += currentStep.duration;\n currentStep = currentStep.next;\n }\n this.animate.updateDuration();\n }\n\n getLastProps(): any {\n if (this.prev) {\n return this.prev.props || {};\n }\n return this.animate.getStartProps();\n }\n\n setDuration(duration: number, updateDownstream: boolean = true): void {\n this.duration = duration;\n\n // 如果有后续节点,更新所有后续节点的开始时间\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n determineInterpolateUpdateFunction(): void {\n // 根据属性类型确定插值更新函数\n // 这里可以进行优化,例如缓存不同类型属性的插值更新函数\n if (!this.props) {\n return;\n }\n\n const funcs: ((key: string, from: number, to: number, ratio: number, step: IStep, target: IGraphic) => void)[] = [];\n this.propKeys.forEach(key => {\n // 普通颜色特殊处理,需要提前解析成number[]\n if (key === 'fill' || key === 'stroke') {\n const from = this.fromProps[key];\n const to = this.props[key];\n if (isString(from) && isString(to)) {\n const fromArray = ColorStore.Get(from, ColorType.Color255);\n const toArray = ColorStore.Get(to, ColorType.Color255);\n if (!this.fromParsedProps) {\n this.fromParsedProps = {};\n }\n if (!this.toParsedProps) {\n this.toParsedProps = {};\n }\n this.fromParsedProps[key] = fromArray;\n this.toParsedProps[key] = toArray;\n funcs.push((interpolateUpdateStore as any)[key === 'fill' ? 'fillPure' : 'strokePure']);\n } else if ((interpolateUpdateStore as any)[key]) {\n funcs.push((interpolateUpdateStore as any)[key]);\n } else {\n funcs.push(commonInterpolateUpdate);\n }\n } else if ((interpolateUpdateStore as any)[key]) {\n funcs.push((interpolateUpdateStore as any)[key]);\n } else {\n funcs.push(commonInterpolateUpdate);\n }\n });\n this.interpolateUpdateFunctions = funcs;\n }\n\n setStartTime(time: number, updateDownstream: boolean = true): void {\n this._startTime = time;\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getStartTime(): number {\n return this._startTime;\n }\n\n onBind(): void {\n // 在第一次绑定到Animate的时候触发\n if (this.target.type === 'glyph') {\n this.syncAttributeUpdate = this._syncAttributeUpdate;\n }\n }\n\n _syncAttributeUpdate = (): void => {\n this.target.setAttributes(this.target.attribute);\n };\n\n /**\n * 首次运行逻辑\n * 如果跳帧了就不一定会执行\n */\n onFirstRun(): void {\n // 首次运行逻辑\n }\n\n /**\n * 开始执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onStart(): void {\n if (!this._hasFirstRun) {\n this._hasFirstRun = true;\n // 获取上一步的属性值作为起始值\n this.fromProps = this.getLastProps();\n const startProps = this.animate.getStartProps();\n this.propKeys &&\n this.propKeys.forEach(key => {\n this.fromProps[key] = this.fromProps[key] ?? startProps[key];\n });\n this.determineInterpolateUpdateFunction();\n this.tryPreventConflict();\n this.trySyncStartProps();\n this.onFirstRun();\n }\n }\n\n protected tryPreventConflict(): void {\n // 屏蔽掉之前动画冲突的属性\n const animate = this.animate;\n const target = this.target;\n target.animates.forEach((a: any) => {\n if (a === animate || a.priority > animate.priority || a.priority === Infinity) {\n return;\n }\n const fromProps = a.getStartProps();\n this.propKeys.forEach(key => {\n if (fromProps[key] != null) {\n a.preventAttr(key);\n }\n });\n });\n }\n\n /**\n * 删除自身属性,会直接从props等内容里删除掉\n */\n deleteSelfAttr(key: string): void {\n delete this.props[key];\n // fromProps在动画开始时才会计算,这时可能不在\n this.fromProps && delete this.fromProps[key];\n const index = this.propKeys.indexOf(key);\n if (index !== -1) {\n this.propKeys.splice(index, 1);\n this.interpolateUpdateFunctions?.splice(index, 1);\n }\n }\n\n /**\n * 尝试同步startProps,因为当前animate的startProps仅包含当前animate的信息,不排除过程中有其他animate的干扰\n * 所以为了避免属性突变,需要确保startProps的属性值是最新的\n */\n trySyncStartProps(): void {\n this.propKeys.forEach(key => {\n this.fromProps[key] = this.animate.target.getComputedAttribute(key);\n });\n }\n\n /**\n * 更新执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n // TODO 需要修复,只有在开始的时候才调用\n this.onStart();\n if (!this.props || !this.propKeys) {\n return;\n }\n // 应用缓动函数\n const easedRatio = this.easing(ratio);\n this.animate.interpolateUpdateFunction\n ? this.animate.interpolateUpdateFunction(this.fromProps, this.props, easedRatio, this, this.target)\n : this.interpolateUpdateFunctions.forEach((func, index) => {\n // 如果这个属性被屏蔽了,直接跳过\n if (!this.animate.validAttr(this.propKeys[index])) {\n return;\n }\n const key = this.propKeys[index];\n const fromValue = this.fromProps[key];\n const toValue = this.props[key];\n func(key, fromValue, toValue, easedRatio, this, this.target);\n });\n this.onUpdate(end, easedRatio, out);\n this.syncAttributeUpdate();\n }\n\n onUpdate(end: boolean, ratio: number, out: Record<string, any>): void {\n // ...\n }\n\n /**\n * 结束执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onEnd(cb?: (animate: IAnimate, step: IStep) => void): void {\n this.target.setAttributes(this.props);\n if (cb) {\n this._endCb = cb;\n } else if (this._endCb) {\n this._endCb(this.animate, this);\n }\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的\n * @returns\n */\n getEndProps(): Record<string, any> {\n return this.props;\n }\n\n /**\n * 获取开始的属性,是前序的终值\n * @returns\n */\n getFromProps(): Record<string, any> {\n return this.fromProps;\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的,同getEndProps\n * @returns\n */\n getMergedEndProps(): Record<string, any> | void {\n return this.getEndProps();\n }\n\n stop(): void {\n // ...\n }\n\n release(): void {\n // ...\n }\n}\n\nexport class WaitStep extends Step {\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n super(type, props, duration, easing);\n }\n\n onStart(): void {\n super.onStart();\n }\n onFirstRun(): void {\n // 设置上一个阶段的props到attribute\n const fromProps = this.getFromProps();\n this.target.setAttributes(fromProps);\n }\n\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n this.onStart();\n // 其他的不执行\n }\n\n determineInterpolateUpdateFunction(): void {\n return;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/step.ts"],"names":[],"mappings":"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","file":"step.js","sourcesContent":["import {\n ColorStore,\n ColorType,\n Generator,\n type IGraphic,\n type IAnimate,\n type IStep,\n type EasingType,\n type EasingTypeFunc,\n type IAnimateStepType\n} from '@visactor/vrender-core';\nimport { Easing } from './utils/easing';\nimport { commonInterpolateUpdate, interpolateUpdateStore } from './interpolate/store';\nimport { isString } from '@visactor/vutils';\n\nfunction noop() {\n //...\n}\n\nexport class Step implements IStep {\n id: number;\n type: IAnimateStepType;\n prev?: IStep;\n duration: number;\n next?: IStep;\n props?: Record<string, any>;\n propKeys?: string[];\n interpolateUpdateFunctions?: ((\n key: string,\n from: number,\n to: number,\n ratio: number,\n step: IStep,\n target: IGraphic\n ) => void)[];\n easing: EasingTypeFunc;\n animate: IAnimate;\n target: IGraphic;\n fromProps: Record<string, any>;\n fromParsedProps: Record<string, any>;\n toParsedProps: Record<string, any>;\n\n // 内部状态\n protected _startTime: number = 0;\n _hasFirstRun: boolean = false;\n\n protected _endCb?: (animate: IAnimate, step: IStep) => void;\n\n syncAttributeUpdate: () => void;\n\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n this.type = type;\n this.props = props;\n this.duration = duration;\n // 设置缓动函数\n if (easing) {\n this.easing = typeof easing === 'function' ? easing : Easing[easing] ?? Easing.linear;\n } else {\n this.easing = Easing.linear;\n }\n if (type === 'wait') {\n this.onUpdate = noop;\n }\n this.id = Generator.GenAutoIncrementId();\n this.syncAttributeUpdate = noop;\n }\n\n bind(target: IGraphic, animate: IAnimate): void {\n this.target = target;\n this.animate = animate;\n this.onBind();\n this.syncAttributeUpdate();\n }\n\n append(step: IStep): void {\n this.next = step;\n step.prev = this;\n\n // 更新绝对时间\n step.setStartTime(this.getStartTime() + this.duration, false);\n }\n\n // 更新下游节点的开始时间\n private updateDownstreamStartTimes(): void {\n let currentStep = this.next;\n let currentStartTime = this._startTime + this.duration;\n\n while (currentStep) {\n currentStep.setStartTime(currentStartTime, false);\n currentStartTime += currentStep.duration;\n currentStep = currentStep.next;\n }\n this.animate.updateDuration();\n }\n\n getLastProps(): any {\n if (this.prev) {\n return this.prev.props || {};\n }\n return this.animate.getStartProps();\n }\n\n setDuration(duration: number, updateDownstream: boolean = true): void {\n this.duration = duration;\n\n // 如果有后续节点,更新所有后续节点的开始时间\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n determineInterpolateUpdateFunction(): void {\n // 根据属性类型确定插值更新函数\n // 这里可以进行优化,例如缓存不同类型属性的插值更新函数\n if (!this.props) {\n return;\n }\n\n const funcs: ((key: string, from: number, to: number, ratio: number, step: IStep, target: IGraphic) => void)[] = [];\n this.propKeys.forEach(key => {\n // 普通颜色特殊处理,需要提前解析成number[]\n if (key === 'fill' || key === 'stroke') {\n const from = this.fromProps[key];\n const to = this.props[key];\n if (isString(from) && isString(to)) {\n const fromArray = ColorStore.Get(from, ColorType.Color255);\n const toArray = ColorStore.Get(to, ColorType.Color255);\n if (!this.fromParsedProps) {\n this.fromParsedProps = {};\n }\n if (!this.toParsedProps) {\n this.toParsedProps = {};\n }\n this.fromParsedProps[key] = fromArray;\n this.toParsedProps[key] = toArray;\n funcs.push((interpolateUpdateStore as any)[key === 'fill' ? 'fillPure' : 'strokePure']);\n } else if ((interpolateUpdateStore as any)[key]) {\n funcs.push((interpolateUpdateStore as any)[key]);\n } else {\n funcs.push(commonInterpolateUpdate);\n }\n } else if ((interpolateUpdateStore as any)[key]) {\n funcs.push((interpolateUpdateStore as any)[key]);\n } else {\n funcs.push(commonInterpolateUpdate);\n }\n });\n this.interpolateUpdateFunctions = funcs;\n }\n\n setStartTime(time: number, updateDownstream: boolean = true): void {\n this._startTime = time;\n if (updateDownstream) {\n this.updateDownstreamStartTimes();\n }\n }\n\n getStartTime(): number {\n return this._startTime;\n }\n\n onBind(): void {\n // 在第一次绑定到Animate的时候触发\n if (this.target.type === 'glyph') {\n this.syncAttributeUpdate = this._syncAttributeUpdate;\n }\n }\n\n _syncAttributeUpdate = (): void => {\n this.target.setAttributes(this.target.attribute);\n };\n\n /**\n * 首次运行逻辑\n * 如果跳帧了就不一定会执行\n */\n onFirstRun(): void {\n // 首次运行逻辑\n }\n\n /**\n * 开始执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onStart(): void {\n if (!this._hasFirstRun) {\n this._hasFirstRun = true;\n // 获取上一步的属性值作为起始值\n this.fromProps = this.getLastProps();\n const startProps = this.animate.getStartProps();\n this.propKeys &&\n this.propKeys.forEach(key => {\n this.fromProps[key] = this.fromProps[key] ?? startProps[key];\n });\n this.determineInterpolateUpdateFunction();\n this.tryPreventConflict();\n this.trySyncStartProps();\n this.onFirstRun();\n }\n }\n\n protected tryPreventConflict(): void {\n // 屏蔽掉之前动画冲突的属性\n const animate = this.animate;\n const target = this.target;\n target.animates.forEach((a: any) => {\n if (a === animate || a.priority > animate.priority || a.priority === Infinity) {\n return;\n }\n const fromProps = a.getStartProps();\n this.propKeys.forEach(key => {\n if (fromProps[key] != null) {\n a.preventAttr(key);\n }\n });\n });\n }\n\n /**\n * 删除自身属性,会直接从props等内容里删除掉\n */\n deleteSelfAttr(key: string): void {\n delete this.props[key];\n // fromProps在动画开始时才会计算,这时可能不在\n this.fromProps && delete this.fromProps[key];\n const index = this.propKeys.indexOf(key);\n if (index !== -1) {\n this.propKeys.splice(index, 1);\n this.interpolateUpdateFunctions?.splice(index, 1);\n }\n }\n\n /**\n * 尝试同步startProps,因为当前animate的startProps仅包含当前animate的信息,不排除过程中有其他animate的干扰\n * 所以为了避免属性突变,需要确保startProps的属性值是最新的\n */\n trySyncStartProps(): void {\n this.propKeys.forEach(key => {\n this.fromProps[key] = this.animate.target.getComputedAttribute(key);\n });\n }\n\n /**\n * 更新执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n // TODO 需要修复,只有在开始的时候才调用\n this.onStart();\n if (!this.props || !this.propKeys) {\n return;\n }\n // 应用缓动函数\n const easedRatio = this.easing(ratio);\n this.animate.interpolateUpdateFunction\n ? this.animate.interpolateUpdateFunction(this.fromProps, this.props, easedRatio, this, this.target)\n : this.interpolateUpdateFunctions.forEach((func, index) => {\n // 如果这个属性被屏蔽了,直接跳过\n if (!this.animate.validAttr(this.propKeys[index])) {\n return;\n }\n const key = this.propKeys[index];\n const fromValue = this.fromProps[key];\n const toValue = this.props[key];\n func(key, fromValue, toValue, easedRatio, this, this.target);\n });\n this.onUpdate(end, easedRatio, out);\n this.syncAttributeUpdate();\n }\n\n onUpdate(end: boolean, ratio: number, out: Record<string, any>): void {\n // ...\n }\n\n /**\n * 结束执行的时候调用\n * 如果跳帧了就不一定会执行\n */\n onEnd(cb?: (animate: IAnimate, step: IStep) => void): void {\n this.target.setAttributes(this.props);\n if (cb) {\n this._endCb = cb;\n } else if (this._endCb) {\n this._endCb(this.animate, this);\n }\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的\n * @returns\n */\n getEndProps(): Record<string, any> {\n return this.props;\n }\n\n /**\n * 获取开始的属性,是前序的终值\n * @returns\n */\n getFromProps(): Record<string, any> {\n return this.fromProps;\n }\n\n /**\n * 获取结束的属性,包含前序的终值,是merge过的,同getEndProps\n * @returns\n */\n getMergedEndProps(): Record<string, any> | void {\n return this.getEndProps();\n }\n\n stop(): void {\n // ...\n }\n\n release(): void {\n // ...\n }\n}\n\nexport class WaitStep extends Step {\n constructor(type: IAnimateStepType, props: Record<string, any>, duration: number, easing: EasingType) {\n super(type, props, duration, easing);\n }\n\n onStart(): void {\n super.onStart();\n\n const fromProps = this.getFromProps();\n this.target.setAttributes(fromProps);\n }\n\n update(end: boolean, ratio: number, out: Record<string, any>): void {\n this.onStart();\n // 其他的不执行\n }\n\n determineInterpolateUpdateFunction(): void {\n return;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visactor/vrender-animate",
3
- "version": "1.0.13-alpha.1",
3
+ "version": "1.0.13",
4
4
  "description": "",
5
5
  "sideEffects": false,
6
6
  "main": "cjs/index.js",
@@ -13,7 +13,7 @@
13
13
  ],
14
14
  "dependencies": {
15
15
  "@visactor/vutils": "1.0.6",
16
- "@visactor/vrender-core": "1.0.13-alpha.1"
16
+ "@visactor/vrender-core": "1.0.13"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@rushstack/eslint-patch": "~1.1.4",
@@ -30,8 +30,8 @@
30
30
  "typescript": "4.9.5",
31
31
  "cross-env": "^7.0.3",
32
32
  "@internal/bundler": "0.0.1",
33
- "@internal/eslint-config": "0.0.1",
34
- "@internal/ts-config": "0.0.1"
33
+ "@internal/ts-config": "0.0.1",
34
+ "@internal/eslint-config": "0.0.1"
35
35
  },
36
36
  "keywords": [
37
37
  "VisActor",