{"version":3,"file":"Scene.cjs","sources":["../../../src/builder/Scene.js"],"sourcesContent":["/**\r\n * 场景类 - 直接使用 Layer 方式构建\r\n */\r\nimport { TextElement } from '../elements/TextElement.js';\r\nimport { ImageElement } from '../elements/ImageElement.js';\r\nimport { VideoElement } from '../elements/VideoElement.js';\r\nimport { RectElement } from '../elements/RectElement.js';\r\nimport { CircleElement } from '../elements/CircleElement.js';\r\nimport { PathElement } from '../elements/PathElement.js';\r\nimport { SVGElement } from '../elements/SVGElement.js';\r\nimport { JSONElement } from '../elements/JSONElement.js';\r\nimport { AudioElement } from '../elements/AudioElement.js';\r\nimport { SubtitleElement } from '../elements/SubtitleElement.js';\r\nimport { OscilloscopeElement } from '../elements/OscilloscopeElement.js';\r\nimport { CodeElement } from '../elements/CodeElement.js';\r\nimport { EChartsElement } from '../elements/EChartsElement.js';\r\nimport { SpriteElement } from '../elements/SpriteElement.js';\r\nimport { HTMLElement } from '../elements/HTMLElement.js';\r\nimport { LRCSubtitleBuilder } from '../utils/lrcSubtitleBuilder.js';\r\nimport { Component } from './Component.js';\r\n\r\n/**\r\n * 场景类 - 直接返回元素实例数组，不使用 CompositionElement\r\n */\r\nexport class Scene {\r\n  constructor(config = {}) {\r\n    this.track = config.track;\r\n    this.startTime = config.startTime; // 可选，如果不指定则自动计算\r\n    this.duration = config.duration || 5;\r\n    this.name = config.name || `Scene-${this.track?.scenes?.length || 0}`;\r\n    this.width = config.width || config.track?.width || config.track?.builder?.config?.width || 1920;\r\n    this.height = config.height || config.track?.height || config.track?.builder?.config?.height || 1080;\r\n    this.fps = config.fps || config.track?.fps || config.track?.builder?.config?.fps || 30;\r\n    \r\n    this.elements = [];\r\n    this.backgroundLayer = null;\r\n    this.components = []; // 组件列表\r\n    this.subtitleCursor = 0; // 字幕自动播放游标，未指定 startTime 时按累加顺序播放\r\n  }\r\n\r\n  /**\r\n   * 添加背景\r\n   * @param {Object} config - 背景配置 { color, image, ... }\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addBackground(config = {}) {\r\n    // 预设颜色列表（参考 FKVideo）\r\n    const presetColors = [\r\n      \"#4ecdc4\", // 青色\r\n      \"#45b7d1\", // 蓝色\r\n      \"#f39c12\", // 橙色\r\n      \"#e74c3c\", // 深红色\r\n      \"#9b59b6\", // 紫色\r\n      \"#1abc9c\", // 青绿色\r\n      \"#2ecc71\", // 绿色\r\n      \"#f1c40f\", // 黄色\r\n      \"#34495e\", // 深灰色\r\n      \"#16a085\", // 深青绿色\r\n      \"#27ae60\", // 深绿色\r\n      \"#2980b9\", // 深蓝色\r\n      \"#8e44ad\", // 深紫色\r\n      \"#c0392b\", // 深红色\r\n      \"#d35400\", // 深橙色\r\n      \"#e67e22\", // 橙色\r\n      \"#3498db\", // 天蓝色\r\n      \"#95a5a6\", // 浅灰色\r\n    ];\r\n    \r\n    // 如果没有指定颜色，随机选择一个预设颜色\r\n    // 处理 config 是字符串的情况（即直接传入颜色值）\r\n    let backgroundColor = typeof config === 'string' ? config : (config.color || config.backgroundColor);\r\n    if (!backgroundColor) {\r\n      const randomIndex = Math.floor(Math.random() * presetColors.length);\r\n      backgroundColor = presetColors[randomIndex];\r\n    }\r\n    \r\n    // 如果已经有背景图层，更新它\r\n    if (!this.backgroundLayer) {\r\n      this.backgroundLayer = {\r\n        type: 'background',\r\n        config: {\r\n          backgroundColor: backgroundColor,\r\n          ...(typeof config === 'object' && config ? config : {}),\r\n        },\r\n      };\r\n    } else {\r\n      this.backgroundLayer.config = {\r\n        ...this.backgroundLayer.config,\r\n        backgroundColor: backgroundColor,\r\n        ...(typeof config === 'object' && config ? config : {}),\r\n      };\r\n    }\r\n    \r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加文本元素\r\n   * @param {Object} config - 文本配置\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addText(config = {}) {\r\n    this.elements.push({\r\n      type: 'text',\r\n      element: new TextElement(config),\r\n    });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加图片元素\r\n   * @param {Object} config - 图片配置\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addImage(config = {}) {\r\n    // 跳过没有 src 的图片元素\r\n    if (!config.src || !config.src.trim()) {\r\n      //console.warn(`[Scene] addImage: 跳过空的图片元素 ${config.id || 'unknown'}`);\r\n      return this;\r\n    }\r\n    const imageElement = new ImageElement(config);\r\n    // 如果提供了src，异步加载图片\r\n    this.elements.push({\r\n      type: 'image',\r\n      element: imageElement,\r\n    });\r\n    return this;\r\n  }\r\n\r\n  addSprite(config = {}) {\r\n    const spriteElement = new SpriteElement(config);\r\n    this.elements.push({\r\n      type: 'sprite',\r\n      element: spriteElement,\r\n    });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加视频元素\r\n   * @param {Object} config - 视频配置\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addVideo(config = {}) {\r\n    // 跳过没有 src 的视频元素\r\n    if (!config.src || !config.src.trim()) {\r\n      //console.warn(`[Scene] addVideo: 跳过空的视频元素 ${config.id || 'unknown'}`);\r\n      return this;\r\n    }\r\n    const videoElement = new VideoElement(config);\r\n    // 如果提供了src，异步初始化视频\r\n    this.elements.push({\r\n      type: 'video',\r\n      element: videoElement,\r\n    });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加矩形元素\r\n   * @param {Object} config - 矩形配置\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addRect(config = {}) {\r\n    this.elements.push({\r\n      type: 'rect',\r\n      element: new RectElement(config),\r\n    });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加圆形元素\r\n   * @param {Object} config - 圆形配置\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addCircle(config = {}) {\r\n    this.elements.push({\r\n      type: 'circle',\r\n      element: new CircleElement(config),\r\n    });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加路径元素\r\n   * @param {Object} config - 路径配置\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addPath(config = {}) {\r\n    this.elements.push({\r\n      type: 'path',\r\n      element: new PathElement(config),\r\n    });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加 SVG 元素\r\n   * @param {Object} config - SVG 配置 { \r\n   *   src, svgString, width, height, fit, ...,\r\n   *   onLoaded: (svgElement, time) => void,  // SVG 加载完成后的回调\r\n   *   onRender: (svgElement, time) => void,  // 每次渲染时的回调\r\n   *   onFrame: (svgElement, event, paperItem) => void  // Paper.js onFrame 回调\r\n   * }\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addSVG(config = {}) {\r\n    const svgElement = new SVGElement(config);\r\n    // SVG 会在 build 时或渲染时自动加载，不需要在这里立即加载\r\n    // 这样可以支持链式调用\r\n    this.elements.push({\r\n      type: 'svg',\r\n      element: svgElement,\r\n    });\r\n    return this; // 返回 this 以支持链式调用\r\n  }\r\n\r\n  /**\r\n   * 添加 JSON 元素（支持 Paper.js JSON 格式）\r\n   * @param {Object} config - JSON 配置 { src, jsonString, jsonData, width, height, fit, ... }\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addJSON(config = {}) {\r\n    const jsonElement = new JSONElement(config);\r\n    // 如果提供了 src，异步加载 JSON\r\n    this.elements.push({\r\n      type: 'json',\r\n      element: jsonElement,\r\n    });\r\n    return this;\r\n  }\r\n\r\n  addSprite(config = {}) {\r\n    const spriteElement = new SpriteElement(config);\r\n    this.elements.push({\r\n      type: 'sprite',\r\n      element: spriteElement,\r\n    });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加字幕元素\r\n   * 同一场景内多次调用 addSubtitle 且未指定 startTime 时，会按调用顺序自动顺序播放；\r\n   * 场景的 duration 也会自动延长到能容纳所有字幕。\r\n   * @param {Object} config - 字幕配置\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addSubtitle(config = {}) {\r\n    const hasExplicitStartTime = config.startTime !== undefined && config.startTime !== null;\r\n    const resolvedStartTime = hasExplicitStartTime ? config.startTime : this.subtitleCursor;\r\n    const resolvedDuration = config.duration || 0;\r\n\r\n    this.elements.push({\r\n      type: 'subtitle',\r\n      element: new SubtitleElement({\r\n        ...config,\r\n        startTime: resolvedStartTime,\r\n      }),\r\n    });\r\n\r\n    // 推进游标：取 (当前游标) 与 (本次字幕结束时间) 的较大值\r\n    this.subtitleCursor = Math.max(this.subtitleCursor, resolvedStartTime + resolvedDuration);\r\n\r\n    // 自动延长场景时长以容纳所有字幕\r\n    if (this.subtitleCursor > this.duration) {\r\n      this.duration = this.subtitleCursor;\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 从 LRC 文件添加歌词字幕（同步方式）\r\n   * @param {string} lrcPath - LRC 文件路径\r\n   * @param {Object} options - 字幕样式选项\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addLRC(lrcPath, options = {}) {\r\n    LRCSubtitleBuilder.addSubtitlesFromLRC(this, lrcPath, options);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加音频元素\r\n   * @param {Object} config - 音频配置 { src, startTime, duration, volume, fadeIn, fadeOut, loop }\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addAudio(config = {}) {\r\n    const audioElement = new AudioElement(config);\r\n    // 异步加载音频信息\r\n    this.elements.push({\r\n      type: 'audio',\r\n      element: audioElement,\r\n    });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加示波器元素\r\n   * @param {Object} config - 示波器配置 { audioPath, waveColor, style, width, height, ... }\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addOscilloscope(config = {}) {\r\n    const oscilloscopeElement = new OscilloscopeElement(config);\r\n    // 初始化会在渲染时自动调用，不需要在这里手动加载\r\n    // 这样可以支持链式调用，同时确保在渲染前数据已准备好\r\n    this.elements.push({\r\n      type: 'oscilloscope',\r\n      element: oscilloscopeElement,\r\n    });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加自定义元素\r\n   * @param {BaseElement} element - 元素实例\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addElement(element) {\r\n    this.elements.push({\r\n      type: 'custom',\r\n      element: element,\r\n    });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加代码元素（便利方法）\r\n   * @param {Object} config - code element 配置\r\n   */\r\n  addCode(config = {}) {\r\n    const codeEl = new CodeElement(config);\r\n    this.elements.push({ type: 'code', element: codeEl });\r\n    return this;\r\n  }\r\n\r\n  addECharts(config = {}) {\r\n    const el = new EChartsElement(config);\r\n    this.elements.push({ type: 'echarts', element: el });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加 HTML 元素(由 Takumi 渲染)\r\n   * @param {Object} config - 至少包含 html | node,以及 x/y/width/height\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addHtml(config = {}) {\r\n    if (!config.html && !config.node) {\r\n      console.warn('[Scene.addHtml] 必须提供 html 或 node 字段');\r\n      return this;\r\n    }\r\n    const el = new HTMLElement({ ...config });\r\n    this.elements.push({ type: 'html', element: el });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加 Sprite 精灵图元素\r\n   * @param {Object} config - Sprite 配置\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addSprite(config = {}) {\r\n    const el = new SpriteElement(config);\r\n    this.elements.push({ type: 'sprite', element: el });\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 添加组件\r\n   * @param {Component|Object} component - 组件实例或组件配置\r\n   * @returns {Scene} 返回自身以支持链式调用\r\n   */\r\n  addComponent(component) {\r\n    // 如果传入的是配置对象，创建组件实例\r\n    if (!(component instanceof Component)) {\r\n      component = new Component(component);\r\n    }\r\n    \r\n    // 设置父容器引用\r\n    component.parent = this;\r\n    component.parentType = 'scene';\r\n    \r\n    this.components.push(component);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 获取所有元素\r\n   * @returns {Array}\r\n   */\r\n  getElements() {\r\n    // 过滤掉没有 src 的图片和没有 videoPath/src 的视频元素\r\n    return this.elements\r\n      .filter(e => {\r\n        if (e.type === 'image' && !e.element.src) {\r\n          //console.warn(`[Scene] getElements 跳过无效元素: ${e.type} 缺少 src`);\r\n          return false;\r\n        }\r\n        if (e.type === 'video' && !e.element.videoPath) {\r\n          //console.warn(`[Scene] getElements 跳过无效元素: ${e.type} 缺少 videoPath`);\r\n          return false;\r\n        }\r\n        return true;\r\n      })\r\n      .map(e => e.element);\r\n  }\r\n\r\n  /**\r\n   * 初始化场景（预加载需要异步加载的元素）\r\n   * @returns {Promise<void>}\r\n   */\r\n  async initialize() {\r\n    // 预加载所有需要异步加载的元素，使用统一的 initialize 方法\r\n    for (const { element } of this.elements) {\r\n      if (element && typeof element.initialize === 'function') {\r\n        try {\r\n          const initResult = element.initialize();\r\n          // 如果返回 Promise，等待完成\r\n          if (initResult && typeof initResult.then === 'function') {\r\n            await initResult;\r\n          }\r\n        } catch (err) {\r\n          console.warn(`[Scene] 元素 ${element.type} 初始化失败:`, err);\r\n        }\r\n      }\r\n    }\r\n    \r\n    // 初始化所有组件\r\n    for (const component of this.components) {\r\n      if (component && typeof component.initialize === 'function') {\r\n        try {\r\n          await component.initialize();\r\n        } catch (err) {\r\n          console.warn(`[Scene] 组件 ${component.name} 初始化失败:`, err);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 构建场景（返回元素实例数组，不使用 CompositionElement）\r\n   * @param {number} sceneStartTime - 场景在轨道中的开始时间（绝对时间）\r\n   * @returns {Array<BaseElement>} 元素实例数组\r\n   */\r\n  build(sceneStartTime = 0) {\r\n    const elementInstances = [];\r\n    \r\n    // 添加背景（作为矩形元素）\r\n    // 注意：Paper.js 的原点在画布左上角 (0, 0)，所以背景矩形应该从 (0, 0) 开始\r\n    if (this.backgroundLayer) {\r\n      const backgroundElement = new RectElement({\r\n        x: this.width / 2, // 画布中心 X（因为 anchor 是 [0.5, 0.5]，所以需要设置为中心）\r\n        y: this.height / 2, // 画布中心 Y\r\n        width: this.width,\r\n        height: this.height,\r\n        anchor: [0.5, 0.5], // 以中心为锚点，这样矩形会从 (0, 0) 到 (width, height)\r\n        bgcolor: this.backgroundLayer.config.backgroundColor,\r\n        startTime: 0, // 相对于场景的开始时间\r\n        duration: this.duration,\r\n        zIndex: -9999,\r\n      });\r\n      elementInstances.push(backgroundElement);\r\n    }\r\n\r\n    // 添加所有元素实例\r\n    for (const { element, type } of this.elements) {\r\n      // 元素的时间是相对于场景的，需要确保正确设置\r\n      if (element) {\r\n        // 过滤没有 src 的图片和没有 videoPath 的视频元素\r\n        if (type === 'image' && !element.src) {\r\n          //console.warn(`[Scene] 跳过无效元素: ${type} 缺少 src`);\r\n          continue;\r\n        }\r\n        if (element.type === 'video' && !element.videoPath) {\r\n          //console.warn(`[Scene] 跳过无效元素: ${type} 缺少 videoPath`);\r\n          continue;\r\n        }\r\n        // 如果元素没有设置 startTime，默认为 0（相对于场景开始）\r\n        if (element.startTime === undefined) {\r\n          element.startTime = 0;\r\n        }\r\n        // 确保元素的 endTime 正确\r\n        if (element.duration !== undefined && element.endTime === Infinity) {\r\n          element.endTime = element.startTime + element.duration;\r\n        }\r\n        elementInstances.push(element);\r\n      }\r\n    }\r\n\r\n    // 添加所有组件的元素（组件会将其内部元素转换为绝对坐标）\r\n    // 注意：组件 build 返回的元素时间已经是绝对时间（相对于视频开始），不需要再次转换\r\n    for (const component of this.components) {\r\n      if (component && component.visible) {\r\n        const componentElements = component.build(sceneStartTime, this.width, this.height);\r\n        // 标记这些元素来自组件，时间已经是绝对时间\r\n        for (const element of componentElements) {\r\n          element._fromComponent = true;\r\n        }\r\n        elementInstances.push(...componentElements);\r\n      }\r\n    }\r\n\r\n    return elementInstances;\r\n  }\r\n\r\n  /**\r\n   * 将元素实例转换为配置对象\r\n   * @param {BaseElement} element - 元素实例\r\n   * @returns {Object} 元素配置对象\r\n   */\r\n  elementToConfig(element) {\r\n    if (!element) return null;\r\n    \r\n    // 元素的属性可能存储在 element.config 中，也可能直接作为 element 的属性\r\n    // 优先从 element.config 读取，如果没有则从 element 本身读取\r\n    const elementConfig = element.config || {};\r\n    \r\n    // 获取元素的所有属性\r\n    const config = {\r\n      type: element.type,\r\n      x: element.x !== undefined ? element.x : elementConfig.x,\r\n      y: element.y !== undefined ? element.y : elementConfig.y,\r\n      width: element.width !== undefined ? element.width : elementConfig.width,\r\n      height: element.height !== undefined ? element.height : elementConfig.height,\r\n      startTime: element.startTime,\r\n      duration: element.duration,\r\n      zIndex: element.zIndex !== undefined ? element.zIndex : elementConfig.zIndex,\r\n      opacity: element.opacity !== undefined ? element.opacity : elementConfig.opacity,\r\n      anchor: element.anchor || elementConfig.anchor,\r\n      animations: element.animations || elementConfig.animations,\r\n    };\r\n\r\n    // 根据元素类型添加特定属性\r\n    if (element.type === 'text') {\r\n      config.text = element.text !== undefined ? element.text : elementConfig.text;\r\n      config.fontSize = element.fontSize !== undefined ? element.fontSize : elementConfig.fontSize;\r\n      config.color = element.color !== undefined ? element.color : elementConfig.color;\r\n      config.fontFamily = element.fontFamily !== undefined ? element.fontFamily : elementConfig.fontFamily;\r\n      config.textAlign = element.textAlign !== undefined ? element.textAlign : elementConfig.textAlign;\r\n      config.stroke = element.stroke !== undefined ? element.stroke : elementConfig.stroke;\r\n      config.strokeColor = element.strokeColor !== undefined ? element.strokeColor : elementConfig.strokeColor;\r\n      config.strokeWidth = element.strokeWidth !== undefined ? element.strokeWidth : elementConfig.strokeWidth;\r\n      config.split = element.split !== undefined ? element.split : elementConfig.split;\r\n      config.splitDelay = element.splitDelay !== undefined ? element.splitDelay : elementConfig.splitDelay;\r\n      config.splitDuration = element.splitDuration !== undefined ? element.splitDuration : elementConfig.splitDuration;\r\n    } else if (element.type === 'subtitle') {\r\n      config.text = element.text !== undefined ? element.text : elementConfig.text;\r\n      config.fontSize = element.fontSize !== undefined ? element.fontSize : elementConfig.fontSize;\r\n      config.color = element.color !== undefined ? element.color : (element.textColor !== undefined ? element.textColor : elementConfig.color);\r\n      config.textColor = element.textColor !== undefined ? element.textColor : elementConfig.textColor;\r\n      config.fontFamily = element.fontFamily !== undefined ? element.fontFamily : elementConfig.fontFamily;\r\n      config.textAlign = element.textAlign !== undefined ? element.textAlign : elementConfig.textAlign;\r\n      config.split = element.split !== undefined ? element.split : elementConfig.split;\r\n      config.splitDelay = element.splitDelay !== undefined ? element.splitDelay : elementConfig.splitDelay;\r\n      config.splitDuration = element.splitDuration !== undefined ? element.splitDuration : elementConfig.splitDuration;\r\n      config.animations = element.animations !== undefined ? element.animations : elementConfig.animations;\r\n    } else if (element.type === 'image') {\r\n      config.src = element.src !== undefined ? element.src : elementConfig.src;\r\n      config.fit = element.fit !== undefined ? element.fit : elementConfig.fit;\r\n    } else if (element.type === 'rect') {\r\n      config.fillColor = element.fillColor || element.bgcolor || elementConfig.fillColor || elementConfig.bgcolor;\r\n      config.strokeColor = element.strokeColor || element.borderColor || elementConfig.strokeColor || elementConfig.borderColor;\r\n      config.strokeWidth = element.strokeWidth || element.borderWidth || elementConfig.strokeWidth || elementConfig.borderWidth;\r\n    } else if (element.type === 'circle') {\r\n      config.radius = element.radius !== undefined ? element.radius : elementConfig.radius;\r\n      config.fillColor = element.fillColor !== undefined ? element.fillColor : elementConfig.fillColor;\r\n      config.strokeColor = element.strokeColor !== undefined ? element.strokeColor : elementConfig.strokeColor;\r\n      config.strokeWidth = element.strokeWidth !== undefined ? element.strokeWidth : elementConfig.strokeWidth;\r\n    } else if (element.type === 'audio') {\r\n      config.src = element.src !== undefined ? element.src : elementConfig.src;\r\n      config.audioPath = element.audioPath !== undefined ? element.audioPath : elementConfig.audioPath;\r\n      // 支持 cutFrom 和 cutTo（新方式）以及 audioStartTime 和 audioEndTime（旧方式）\r\n      config.cutFrom = element.cutFrom !== undefined ? element.cutFrom : (element.audioStartTime !== undefined ? element.audioStartTime : elementConfig.cutFrom);\r\n      config.cutTo = element.cutTo !== undefined ? element.cutTo : (element.audioEndTime !== undefined ? element.audioEndTime : elementConfig.cutTo);\r\n      config.volume = element.volume !== undefined ? element.volume : elementConfig.volume;\r\n      config.fadeIn = element.fadeIn !== undefined ? element.fadeIn : elementConfig.fadeIn;\r\n      config.fadeOut = element.fadeOut !== undefined ? element.fadeOut : elementConfig.fadeOut;\r\n      config.loop = element.loop !== undefined ? element.loop : elementConfig.loop;\r\n    } else if (element.type === 'sprite') {\r\n      config.spriteType = element.spriteType !== undefined ? element.spriteType : elementConfig.spriteType;\r\n      config.spriteConfig = element.spriteConfig !== undefined ? element.spriteConfig : elementConfig.spriteConfig;\r\n      config.frames = element.frames !== undefined ? element.frames : elementConfig.frames;\r\n      config.frameRate = element.frameRate !== undefined ? element.frameRate : elementConfig.frameRate;\r\n      config.loop = element.loop !== undefined ? element.loop : elementConfig.loop;\r\n      config.autoplay = element.autoplay !== undefined ? element.autoplay : elementConfig.autoplay;\r\n      config.playMode = element.playMode !== undefined ? element.playMode : elementConfig.playMode;\r\n      config.fit = element.fit !== undefined ? element.fit : elementConfig.fit;\r\n      config.preserveAspectRatio = element.preserveAspectRatio !== undefined ? element.preserveAspectRatio : elementConfig.preserveAspectRatio;\r\n      config.src = element.src !== undefined ? element.src : elementConfig.src;\r\n      config.columns = element.columns !== undefined ? element.columns : elementConfig.columns;\r\n      config.rows = element.rows !== undefined ? element.rows : elementConfig.rows;\r\n      config.frameWidth = element.frameWidth !== undefined ? element.frameWidth : elementConfig.frameWidth;\r\n      config.frameHeight = element.frameHeight !== undefined ? element.frameHeight : elementConfig.frameHeight;\r\n      config.frameCount = element.frameCount !== undefined ? element.frameCount : elementConfig.frameCount;\r\n      config.margin = element.margin !== undefined ? element.margin : elementConfig.margin;\r\n      config.spacing = element.spacing !== undefined ? element.spacing : elementConfig.spacing;\r\n      config.startIndex = element.startIndex !== undefined ? element.startIndex : elementConfig.startIndex;\r\n      config.orientation = element.orientation !== undefined ? element.orientation : elementConfig.orientation;\r\n    }\r\n\r\n    return config;\r\n  }\r\n\r\n  /**\r\n   * 销毁场景\r\n   */\r\n  destroy() {\r\n    for (const { element } of this.elements) {\r\n      if (element.destroy) {\r\n        element.destroy();\r\n      }\r\n    }\r\n    this.elements = [];\r\n    this.backgroundLayer = null;\r\n    \r\n    // 销毁所有组件\r\n    for (const component of this.components) {\r\n      if (component.destroy) {\r\n        component.destroy();\r\n      }\r\n    }\r\n    this.components = [];\r\n  }\r\n}\r\n\r\n"],"names":["TextElement","ImageElement","SpriteElement","VideoElement","RectElement","CircleElement","PathElement","SVGElement","JSONElement","SubtitleElement","LRCSubtitleBuilder","AudioElement","OscilloscopeElement","CodeElement","EChartsElement","HTMLElement","Component"],"mappings":"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"}