{"version":3,"file":"lightwave.cjs","sources":["../../../../../src/elements/oscilloscope/renderers/lightwave.js"],"sourcesContent":["import paper from '@chnak/paper';\n\n/**\n * 光波扩散样式默认配置\n */\nexport const defaultConfig = {\n  lightwaveCount: 8, // 光波数量\n  lightwaveSpeed: 2.0, // 光波速度\n  lightwaveSegments: 64, // 光波分段数\n  particleColors: [ // 颜色数组\n    '#ff0080', '#ff4080', '#ff8000', '#ffc000',\n    '#ffff00', '#80ff00', '#00ff80', '#00ffff',\n    '#0080ff', '#8000ff', '#ff00ff', '#ff0080',\n  ],\n};\n\n/**\n * 光波扩散渲染器（光波从中心扩散）\n * @param {Object} element - 元素实例\n * @param {Array} data - 波形数据\n * @param {number} x - X坐标\n * @param {number} y - Y坐标\n * @param {number} width - 宽度\n * @param {number} height - 高度\n * @param {number} time - 当前时间\n * @param {Object} config - 配置对象（合并了默认配置和用户配置）\n */\nexport default function renderLightwave(element, data, x, y, width, height, time, config = {}) {\n  // 合并默认配置\n  const cfg = { ...defaultConfig, ...config };\n  \n  if (!data || data.length === 0) return;\n  \n  const centerX = x + width / 2;\n  const centerY = y + height / 2;\n  const maxRadius = Math.min(width, height) / 2;\n  \n  // 计算平均振幅\n  let avgAmplitude = 0;\n  for (let i = 0; i < data.length; i++) {\n    avgAmplitude += Math.abs(data[i]);\n  }\n  avgAmplitude = (avgAmplitude / data.length) * element.sensitivity;\n  \n  // 光波数量\n  const waveCount = cfg.lightwaveCount;\n  const waveSpeed = cfg.lightwaveSpeed;\n  \n  // 绘制多个光波\n  for (let i = 0; i < waveCount; i++) {\n    const waveProgress = ((time * waveSpeed + i / waveCount) % 1);\n    const radius = maxRadius * waveProgress;\n    \n    if (radius > 0) {\n      // 根据音频数据调整光波形状\n      const segments = cfg.lightwaveSegments;\n      const path = new paper.Path();\n      path.strokeColor = element.waveColor;\n      path.strokeWidth = 3;\n      path.strokeColor.alpha = (1 - waveProgress) * 0.9;\n      path.closed = true;\n      \n      // 选择颜色\n      if (cfg.particleColors && cfg.particleColors.length > 0) {\n        const colorIndex = Math.floor((waveProgress * waveCount + i) % cfg.particleColors.length);\n        path.strokeColor = cfg.particleColors[colorIndex];\n      }\n      \n      for (let j = 0; j < segments; j++) {\n        const angle = (j / segments) * Math.PI * 2;\n        \n        // 根据音频数据调整半径\n        const dataIndex = Math.floor((j / segments) * data.length);\n        const amplitude = Math.abs(data[dataIndex]) * element.sensitivity;\n        const waveRadius = radius * (1 + amplitude * 0.5);\n        \n        const px = centerX + Math.cos(angle) * waveRadius;\n        const py = centerY + Math.sin(angle) * waveRadius;\n        \n        if (j === 0) {\n          path.moveTo(new paper.Point(px, py));\n        } else {\n          path.lineTo(new paper.Point(px, py));\n        }\n      }\n      \n      // 填充光波（渐变透明度）\n      path.fillColor = path.strokeColor;\n      path.fillColor.alpha = (1 - waveProgress) * 0.2;\n      path.blendMode = 'screen';\n      \n      // 添加内层光晕\n      if (waveProgress > 0.1 && waveProgress < 0.9) {\n        const innerRadius = radius * 0.8;\n        const innerPath = new paper.Path();\n        innerPath.strokeColor = path.strokeColor;\n        innerPath.strokeWidth = 1;\n        innerPath.strokeColor.alpha = (1 - waveProgress) * 0.5;\n        innerPath.closed = true;\n        \n        for (let j = 0; j < segments; j++) {\n          const angle = (j / segments) * Math.PI * 2;\n          const dataIndex = Math.floor((j / segments) * data.length);\n          const amplitude = Math.abs(data[dataIndex]) * element.sensitivity;\n          const waveRadius = innerRadius * (1 + amplitude * 0.3);\n          \n          const px = centerX + Math.cos(angle) * waveRadius;\n          const py = centerY + Math.sin(angle) * waveRadius;\n          \n          if (j === 0) {\n            innerPath.moveTo(new paper.Point(px, py));\n          } else {\n            innerPath.lineTo(new paper.Point(px, py));\n          }\n        }\n      }\n    }\n  }\n  \n  // 中心亮点\n  const centerSize = 5 + avgAmplitude * 15;\n  const centerCircle = new paper.Path.Circle({\n    center: new paper.Point(centerX, centerY),\n    radius: centerSize\n  });\n  \n  if (cfg.particleColors && cfg.particleColors.length > 0) {\n    centerCircle.fillColor = cfg.particleColors[0];\n  } else {\n    centerCircle.fillColor = element.waveColor;\n  }\n  centerCircle.fillColor.alpha = 0.9;\n  centerCircle.blendMode = 'screen';\n  \n  // 中心光晕\n  const glowCircle = new paper.Path.Circle({\n    center: new paper.Point(centerX, centerY),\n    radius: centerSize * 2\n  });\n  glowCircle.fillColor = centerCircle.fillColor;\n  glowCircle.fillColor.alpha = 0.3;\n  glowCircle.blendMode = 'screen';\n}\n\nrenderLightwave.style = 'lightwave';\n\n"],"names":[],"mappings":"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"}