@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.
- package/cjs/custom/disappear/base/CustomEffectBase.js +1 -1
- package/cjs/custom/disappear/base/CustomEffectBase.js.map +1 -1
- package/cjs/custom/disappear/particle.d.ts +1 -0
- package/cjs/custom/disappear/particle.js +3 -2
- package/cjs/custom/disappear/particle.js.map +1 -1
- package/cjs/custom/fade.js +2 -1
- package/cjs/custom/groupFade.js +1 -2
- package/cjs/custom/register.js +2 -1
- package/cjs/custom/scale.js +1 -2
- package/cjs/step.d.ts +0 -1
- package/cjs/step.js +0 -2
- package/cjs/step.js.map +1 -1
- package/dist/index.es.js +4 -5
- package/es/custom/disappear/base/CustomEffectBase.js +1 -1
- package/es/custom/disappear/base/CustomEffectBase.js.map +1 -1
- package/es/custom/disappear/particle.d.ts +1 -0
- package/es/custom/disappear/particle.js +3 -2
- package/es/custom/disappear/particle.js.map +1 -1
- package/es/custom/fade.js +2 -1
- package/es/custom/groupFade.js +1 -2
- package/es/custom/register.js +2 -1
- package/es/custom/scale.js +1 -2
- package/es/step.d.ts +0 -1
- package/es/step.js +0 -2
- package/es/step.js.map +1 -1
- package/package.json +4 -4
|
@@ -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":";;;AACA,iEAA8D;AAM9D,MAAsB,eAAgB,SAAQ,2CAAoB;IAChE,YAAY,IAAU,EAAE,EAAQ,EAAE,QAAgB,EAAE,MAAkB,EAAE,MAAW;QACjF,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAOS,mBAAmB,CAAC,MAAyB;QACrD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,wBAAwB,CAAC,CAAC;QAE/D,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO,MAAM,CAAC;SACf;QAED,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC;QAG7B,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC9D,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5B,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;CACF;AA1BD,0CA0BC;AAMD,MAAsB,kBAAmB,SAAQ,2CAAoB;IACnE,YAAY,IAAU,EAAE,EAAQ,EAAE,QAAgB,EAAE,MAAkB,EAAE,MAAW;QACjF,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAMS,gBAAgB;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAES,gBAAgB,CAAC,MAAyB;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAhBD,gDAgBC;AAMD,MAAa,gBAAiB,SAAQ,2CAAoB;IACxD,YAAY,IAAU,EAAE,EAAQ,EAAE,QAAgB,EAAE,MAAkB,EAAE,MAAW;QACjF,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAGS,gBAAgB;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAES,gBAAgB,CAAC,MAAyB;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAGS,mBAAmB,CAAC,MAAyB;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAGS,aAAa;QACrB,OAAO,IAAI,CAAC,gBAAgB,KAAK,gBAAgB,CAAC,SAAS,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,IAAI,CAAC;IACnH,CAAC;IAES,gBAAgB;QACxB,OAAO,IAAI,CAAC,mBAAmB,KAAK,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,CAAC;IACrF,CAAC;IAKS,gBAAgB,CAAC,KAAU,EAAE,MAAyB;;QAC9D,IAAI,MAAM,GAA6B,IAAI,CAAC;QAG5C,IAAI,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,OAAO,0CAAE,QAAQ,EAAE;
|
|
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"]}
|
|
@@ -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"]}
|
package/cjs/custom/fade.js
CHANGED
package/cjs/custom/groupFade.js
CHANGED
package/cjs/custom/register.js
CHANGED
|
@@ -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
|
package/cjs/custom/scale.js
CHANGED
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
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":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAM9D,MAAM,OAAgB,eAAgB,SAAQ,oBAAoB;IAChE,YAAY,IAAU,EAAE,EAAQ,EAAE,QAAgB,EAAE,MAAkB,EAAE,MAAW;QACjF,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAOS,mBAAmB,CAAC,MAAyB;QACrD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,wBAAwB,CAAC,CAAC;QAE/D,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO,MAAM,CAAC;SACf;QAED,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC;QAG7B,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC9D,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5B,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;CACF;AAMD,MAAM,OAAgB,kBAAmB,SAAQ,oBAAoB;IACnE,YAAY,IAAU,EAAE,EAAQ,EAAE,QAAgB,EAAE,MAAkB,EAAE,MAAW;QACjF,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAMS,gBAAgB;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAES,gBAAgB,CAAC,MAAyB;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAMD,MAAM,OAAO,gBAAiB,SAAQ,oBAAoB;IACxD,YAAY,IAAU,EAAE,EAAQ,EAAE,QAAgB,EAAE,MAAkB,EAAE,MAAW;QACjF,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAGS,gBAAgB;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAES,gBAAgB,CAAC,MAAyB;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAGS,mBAAmB,CAAC,MAAyB;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAGS,aAAa;QACrB,OAAO,IAAI,CAAC,gBAAgB,KAAK,gBAAgB,CAAC,SAAS,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,IAAI,CAAC;IACnH,CAAC;IAES,gBAAgB;QACxB,OAAO,IAAI,CAAC,mBAAmB,KAAK,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,CAAC;IACrF,CAAC;IAKS,gBAAgB,CAAC,KAAU,EAAE,MAAyB;;QAC9D,IAAI,MAAM,GAA6B,IAAI,CAAC;QAG5C,IAAI,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,OAAO,0CAAE,QAAQ,EAAE;
|
|
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"]}
|
|
@@ -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":"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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"]}
|
package/es/custom/fade.js
CHANGED
package/es/custom/groupFade.js
CHANGED
package/es/custom/register.js
CHANGED
|
@@ -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
|
package/es/custom/scale.js
CHANGED
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
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
|
|
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
|
|
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/
|
|
34
|
-
"@internal/
|
|
33
|
+
"@internal/ts-config": "0.0.1",
|
|
34
|
+
"@internal/eslint-config": "0.0.1"
|
|
35
35
|
},
|
|
36
36
|
"keywords": [
|
|
37
37
|
"VisActor",
|