2025-06-09 10:25:54 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 液化管理器
|
|
|
|
|
|
* 负责管理液化操作的核心算法和变形处理
|
|
|
|
|
|
*
|
|
|
|
|
|
* 此版本使用增强的液化算法,支持GPU加速和优化的CPU处理
|
|
|
|
|
|
*/
|
|
|
|
|
|
import { EnhancedLiquifyManager } from "./EnhancedLiquifyManager";
|
|
|
|
|
|
|
|
|
|
|
|
export class LiquifyManager {
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 创建液化管理器
|
|
|
|
|
|
* @param {Object} options 配置选项
|
|
|
|
|
|
*/
|
|
|
|
|
|
constructor(options = {}) {
|
|
|
|
|
|
// 将核心属性暴露给外部,保持API兼容性
|
|
|
|
|
|
this.canvas = options.canvas || null;
|
|
|
|
|
|
this.layerManager = options.layerManager || null;
|
|
|
|
|
|
|
|
|
|
|
|
// 配置参数
|
|
|
|
|
|
this.config = {
|
|
|
|
|
|
gridSize: options.gridSize || 20,
|
|
|
|
|
|
maxStrength: options.maxStrength || 100,
|
|
|
|
|
|
defaultParams: {
|
|
|
|
|
|
size: 50,
|
|
|
|
|
|
pressure: 0.5,
|
|
|
|
|
|
distortion: 0,
|
|
|
|
|
|
power: 0.5,
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 创建增强版液化管理器实例
|
|
|
|
|
|
this.enhancedManager = new EnhancedLiquifyManager({
|
|
|
|
|
|
// 配置选项
|
|
|
|
|
|
gridSize: options.gridSize || 15,
|
|
|
|
|
|
maxStrength: options.maxStrength || 100,
|
|
|
|
|
|
smoothingIterations: options.smoothingIterations || 2,
|
|
|
|
|
|
relaxFactor: options.relaxFactor || 0.25,
|
|
|
|
|
|
meshResolution: options.meshResolution || 64,
|
|
|
|
|
|
// 根据环境选择合适的渲染模式
|
|
|
|
|
|
forceCPU: true, // 默认不强制使用CPU
|
2025-06-18 11:05:23 +08:00
|
|
|
|
forceWebGL: true, // 优先使用WebGL模式
|
2025-06-09 10:25:54 +08:00
|
|
|
|
webglSizeThreshold: options.webglSizeThreshold || 500 * 500, // 降低阈值以更倾向使用WebGL
|
|
|
|
|
|
layerManager: options.layerManager || null,
|
|
|
|
|
|
canvas: options.canvas || null,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化液化管理器
|
|
|
|
|
|
this.initialize();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 初始化液化管理器
|
|
|
|
|
|
* @param {Object} options 配置选项
|
|
|
|
|
|
*/
|
|
|
|
|
|
initialize(options = {}) {
|
|
|
|
|
|
// 更新基础属性
|
|
|
|
|
|
if (options.canvas) this.canvas = options.canvas;
|
|
|
|
|
|
if (options.layerManager) this.layerManager = options.layerManager;
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化增强液化管理器
|
|
|
|
|
|
return this.enhancedManager.initialize({
|
|
|
|
|
|
canvas: this.canvas,
|
|
|
|
|
|
layerManager: this.layerManager,
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 为液化操作准备图像
|
|
|
|
|
|
* @param {Object|String} target 目标对象或图层ID
|
|
|
|
|
|
* @returns {Promise<Object>} 准备结果
|
|
|
|
|
|
*/
|
|
|
|
|
|
async prepareForLiquify(target) {
|
|
|
|
|
|
return this.enhancedManager.prepareForLiquify(target);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 设置液化模式
|
|
|
|
|
|
* @param {String} mode 液化模式
|
|
|
|
|
|
*/
|
|
|
|
|
|
setMode(mode) {
|
|
|
|
|
|
return this.enhancedManager.setMode(mode);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 设置液化参数
|
|
|
|
|
|
* @param {String} param 参数名称
|
|
|
|
|
|
* @param {Number} value 参数值
|
|
|
|
|
|
*/
|
|
|
|
|
|
setParam(param, value) {
|
2025-06-18 11:05:23 +08:00
|
|
|
|
console.log(`LiquifyManager 设置参数: ${param}=${value}`);
|
2025-06-09 10:25:54 +08:00
|
|
|
|
return this.enhancedManager.setParam(param, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-18 11:05:23 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 批量设置参数
|
|
|
|
|
|
* @param {Object} params 参数对象
|
|
|
|
|
|
*/
|
|
|
|
|
|
setParams(params) {
|
|
|
|
|
|
console.log("LiquifyManager 批量设置参数:", params);
|
|
|
|
|
|
return this.enhancedManager.setParams(params);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-09 10:25:54 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 获取当前参数
|
|
|
|
|
|
* @returns {Object} 当前参数对象
|
|
|
|
|
|
*/
|
|
|
|
|
|
getParams() {
|
|
|
|
|
|
return this.enhancedManager.getParams();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 重置参数为默认值
|
|
|
|
|
|
*/
|
|
|
|
|
|
resetParams() {
|
|
|
|
|
|
return this.enhancedManager.resetParams();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 应用液化效果
|
|
|
|
|
|
* @param {fabric.Object} targetObject 目标对象
|
|
|
|
|
|
* @param {String} mode 液化模式
|
|
|
|
|
|
* @param {Object} params 参数
|
|
|
|
|
|
* @param {Number} x X坐标
|
|
|
|
|
|
* @param {Number} y Y坐标
|
|
|
|
|
|
* @returns {ImageData} 处理后的图像数据
|
|
|
|
|
|
*/
|
|
|
|
|
|
async applyLiquify(targetObject, mode, params, x, y) {
|
|
|
|
|
|
if (!this.enhancedManager || !targetObject) {
|
|
|
|
|
|
console.error("液化管理器未正确初始化");
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-18 11:05:23 +08:00
|
|
|
|
console.log(
|
|
|
|
|
|
`LiquifyManager.applyLiquify: 模式=${mode}, 坐标=(${x}, ${y}), 参数=`,
|
|
|
|
|
|
params
|
|
|
|
|
|
);
|
2025-06-09 10:25:54 +08:00
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
// 直接调用EnhancedLiquifyManager的applyLiquify方法
|
2025-06-18 11:05:23 +08:00
|
|
|
|
// 避免重复设置参数,让EnhancedLiquifyManager处理参数设置
|
2025-06-09 10:25:54 +08:00
|
|
|
|
const resultData = await this.enhancedManager.applyLiquify(
|
|
|
|
|
|
targetObject,
|
|
|
|
|
|
mode,
|
|
|
|
|
|
params,
|
|
|
|
|
|
x,
|
|
|
|
|
|
y
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
// 确保返回结果数据
|
|
|
|
|
|
if (!resultData) {
|
|
|
|
|
|
console.warn("液化变形没有返回结果数据");
|
2025-06-18 11:05:23 +08:00
|
|
|
|
} else {
|
|
|
|
|
|
console.log(
|
|
|
|
|
|
"✅ 液化变形成功,返回图像数据尺寸:",
|
|
|
|
|
|
resultData.width,
|
|
|
|
|
|
"x",
|
|
|
|
|
|
resultData.height
|
|
|
|
|
|
);
|
2025-06-09 10:25:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return resultData;
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error("液化变形应用失败:", error);
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 重置液化操作
|
|
|
|
|
|
* @returns {ImageData} 重置后的图像数据
|
|
|
|
|
|
*/
|
|
|
|
|
|
reset() {
|
|
|
|
|
|
return this.enhancedManager.reset();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 检查图层是否可以液化
|
|
|
|
|
|
* @param {String} layerId 图层ID
|
|
|
|
|
|
* @returns {Object} 检查结果
|
|
|
|
|
|
*/
|
|
|
|
|
|
checkLayerForLiquify(layerId) {
|
|
|
|
|
|
return this.enhancedManager.checkLayerForLiquify(layerId);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取当前状态信息
|
|
|
|
|
|
* @returns {Object} 状态信息
|
|
|
|
|
|
*/
|
|
|
|
|
|
getStatus() {
|
|
|
|
|
|
return this.enhancedManager.getStatus();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-18 11:05:23 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 开始液化操作(记录初始点)
|
|
|
|
|
|
* @param {Number} x 初始X坐标
|
|
|
|
|
|
* @param {Number} y 初始Y坐标
|
|
|
|
|
|
*/
|
|
|
|
|
|
startLiquifyOperation(x, y) {
|
|
|
|
|
|
return this.enhancedManager.startLiquifyOperation(x, y);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 结束液化操作
|
|
|
|
|
|
*/
|
|
|
|
|
|
endLiquifyOperation() {
|
|
|
|
|
|
return this.enhancedManager.endLiquifyOperation();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-09 10:25:54 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 释放资源
|
|
|
|
|
|
*/
|
|
|
|
|
|
dispose() {
|
|
|
|
|
|
if (this.enhancedManager) {
|
|
|
|
|
|
this.enhancedManager.dispose();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|