{"version":3,"file":"SceneGroupElement.cjs","sources":["../../../src/elements/SceneGroupElement.js"],"sourcesContent":["/**\n * 场景组元素 - 使用 paper.Group 包装场景，避免重新实例化 paper\n */\nimport { BaseElement } from './BaseElement.js';\nimport { DEFAULT_ELEMENT_CONFIG } from '../types/constants.js';\nimport { deepMerge } from '../utils/helpers.js';\nimport { ElementType } from '../types/enums.js';\nimport paper from '@chnak/paper';\n\n/**\n * 场景组元素类\n * 使用 paper.Group 包装场景元素，避免重新实例化 paper\n */\nexport class SceneGroupElement extends BaseElement {\n  constructor(config = {}) {\n    super(config);\n    this.type = ElementType.SCENE_GROUP || 'sceneGroup';\n    this.config = deepMerge({}, DEFAULT_ELEMENT_CONFIG, config);\n    \n    // 子元素数组（元素实例）\n    this.elements = config.elements || [];\n    \n    // 场景组的宽高\n    this.groupWidth = config.width || 1920;\n    this.groupHeight = config.height || 1080;\n    \n    // 是否已初始化\n    this.isInitialized = false;\n  }\n\n  /**\n   * 初始化场景组\n   */\n  async initialize() {\n    if (this.isInitialized) return;\n    \n    // 设置子元素的 canvasWidth 和 canvasHeight\n    for (const element of this.elements) {\n      if (element) {\n        element.canvasWidth = this.groupWidth;\n        element.canvasHeight = this.groupHeight;\n      }\n    }\n    \n    this.isInitialized = true;\n  }\n\n  /**\n   * 检查是否已初始化\n   */\n  checkInitialized() {\n    return this.isInitialized;\n  }\n\n  /**\n   * 渲染场景组元素（使用 Paper.js Group）\n   */\n  async render(layer, time) {\n    if (!this.isActiveAtTime(time)) {\n      return null;\n    }\n\n    // 确保已初始化\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    // 创建 paper.Group 来包装所有子元素\n    const group = new paper.Group();\n    \n    // 获取当前状态\n    const viewSize = paper.view.viewSize;\n    const context = { width: viewSize.width, height: viewSize.height };\n    const state = this.getStateAtTime(time, context);\n    \n    // 设置 Group 的位置（相对于场景组的中心）\n    const x = typeof state.x === 'string' ? \n      parseFloat(state.x) / 100 * context.width : \n      (state.x !== undefined ? state.x : context.width / 2);\n    const y = typeof state.y === 'string' ? \n      parseFloat(state.y) / 100 * context.height : \n      (state.y !== undefined ? state.y : context.height / 2);\n    \n    group.position = new paper.Point(x, y);\n    \n    // 渲染所有子元素到 Group 中\n    // 注意：元素的时间是绝对时间（相对于视频开始），所以直接使用 time\n    for (const element of this.elements) {\n      if (!element || element.type === 'audio') {\n        continue; // 跳过音频元素\n      }\n      \n      // 检查元素是否在指定时间激活（使用绝对时间）\n      if (element.isActiveAtTime && !element.isActiveAtTime(time)) {\n        continue;\n      }\n      \n      try {\n        // 确保元素已初始化\n        let needsInit = false;\n        if (typeof element.checkInitialized === 'function' && !element.checkInitialized()) {\n          needsInit = true;\n        } else if (typeof element.isInitialized === 'function' && !element.isInitialized()) {\n          needsInit = true;\n        }\n        \n        if (needsInit && typeof element.initialize === 'function') {\n          const initResult = element.initialize();\n          if (initResult && typeof initResult.then === 'function') {\n            await initResult;\n          }\n        }\n        \n        // 渲染元素到 Group 中\n        // 元素的时间是绝对时间（相对于视频开始），所以直接使用 time\n        if (typeof element.render === 'function') {\n          const result = element.render(group, time);\n          if (result && typeof result.then === 'function') {\n            await result;\n          }\n        }\n      } catch (error) {\n        console.error(`[SceneGroupElement] 渲染子元素失败 (${element.type || 'unknown'}):`, error);\n      }\n    }\n    \n    // 应用变换（缩放、旋转等）\n    this.applyTransform(group, state, {\n      applyPosition: false, // 位置已经通过 group.position 设置了\n    });\n    \n    // 添加到 layer\n    layer.addChild(group);\n    \n    return group;\n  }\n\n  /**\n   * 销毁场景组\n   */\n  destroy() {\n    // 销毁所有子元素\n    for (const element of this.elements) {\n      if (element && typeof element.destroy === 'function') {\n        element.destroy();\n      }\n    }\n    this.elements = [];\n    this.isInitialized = false;\n  }\n}\n\n"],"names":["BaseElement","ElementType","deepMerge","DEFAULT_ELEMENT_CONFIG"],"mappings":"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"}