{"version":3,"file":"blob.cjs","sources":["../../../../../src/elements/oscilloscope/renderers/blob.js"],"sourcesContent":["import paper from '@chnak/paper';\n\n/**\n * Blob 样式默认配置\n */\nexport const defaultConfig = {\n  blobBallCount: 12, // Blob 球体数量\n  particleColors: [ // 颜色数组\n    '#ff0080', '#ff4080', '#ff8000', '#ffc000',\n    '#ffff00', '#80ff00', '#00ff80', '#00ffff',\n    '#0080ff', '#8000ff', '#ff00ff', '#ff0080',\n  ],\n  minRadiusRatio: 0.4, // 最小半径比例（相对于基础半径）\n  maxRadiusRatio: 2.0, // 最大半径比例（相对于基础半径）\n  directionChangeIntensity: 0.3, // 方向变化强度（0-1，0为不变化，1为完全随节奏变化）\n};\n\n/**\n * Blob 球体碰撞变形示波器渲染器\n * 基于 kynd.info 2014 的球体碰撞效果，结合音频数据\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 renderBlob(element, data, x, y, width, height, time, config = {}) {\n  // 合并默认配置\n  const cfg = { ...defaultConfig, ...config };\n  \n  const centerX = x + width / 2;\n  const centerY = y + height / 2;\n  const maxRadius = Math.min(width, height) / 2 - 20;\n  \n  // 将音频数据分成多个频段\n  const numBalls = cfg.blobBallCount;\n  const bands = [];\n  const bandSize = Math.floor(data.length / numBalls);\n  for (let i = 0; i < numBalls; i++) {\n    let sum = 0;\n    let count = 0;\n    const start = i * bandSize;\n    const end = Math.min(start + bandSize, data.length);\n    for (let j = start; j < end; j++) {\n      sum += Math.abs(data[j]);\n      count++;\n    }\n    bands.push(count > 0 ? sum / count : 0);\n  }\n  \n  // 初始化球体状态（如果还没有）\n  if (!element.blobBalls || element.blobBalls.length === 0) {\n    element.blobBalls = [];\n    const baseRadius = maxRadius * 0.15; // 减小基础半径\n    \n    // 获取半径范围配置\n    const minRadiusRatio = cfg.minRadiusRatio || 0.4;\n    const maxRadiusRatio = cfg.maxRadiusRatio || 2.0;\n    \n    for (let i = 0; i < numBalls; i++) {\n      // 随机位置（在显示区域内）\n      const randomX = x + Math.random() * width;\n      const randomY = y + Math.random() * height;\n      const position = new paper.Point(randomX, randomY);\n      \n      // 随机方向\n      const randomAngle = Math.random() * 360;\n      const vector = new paper.Point({\n        angle: randomAngle,\n        length: 1.5 + Math.random() * 2.5 // 进一步增加初始速度：1.5 到 4.0\n      });\n      \n      // 随机半径（在配置的范围内，生成大小不一的球体）\n      // 使用指数分布让大小分布更自然（更多小球，少量大球）\n      const randomValue = Math.random();\n      const radiusRatio = minRadiusRatio + (maxRadiusRatio - minRadiusRatio) * Math.pow(randomValue, 0.7);\n      const radius = baseRadius * radiusRatio;\n      \n      // 只保存状态，不创建路径（路径每一帧都会重新创建）\n      element.blobBalls.push({\n        radius: radius,\n        targetRadius: radius,\n        point: position,\n        vector: vector,\n        maxVec: 20, // 进一步增加最大速度限制：从 12 增加到 20\n        numSegment: Math.floor(radius / 3 + 2),\n        boundOffset: [],\n        boundOffsetBuff: [],\n        sidePoints: [],\n        colorIndex: i\n      });\n      \n      // 初始化边界偏移和侧面点\n      const ball = element.blobBalls[i];\n      for (let j = 0; j < ball.numSegment; j++) {\n        ball.boundOffset.push(radius);\n        ball.boundOffsetBuff.push(radius);\n        ball.sidePoints.push(new paper.Point({\n          angle: 360 / ball.numSegment * j,\n          length: 1\n        }));\n      }\n    }\n  }\n  \n  // 更新球体半径和速度（根据音频数据）\n  for (let i = 0; i < element.blobBalls.length && i < bands.length; i++) {\n    const ball = element.blobBalls[i];\n    const amplitude = bands[i];\n    \n    // 根据音频振幅调整目标半径，变化幅度与 sensitivity 挂钩\n    const baseRadius = maxRadius * 0.15; // 与初始化时保持一致\n    // 获取初始半径比例（相对于基础半径）\n    const initialRadiusRatio = ball.initialRadiusRatio || (ball.radius / baseRadius);\n    if (!ball.initialRadiusRatio) {\n      ball.initialRadiusRatio = initialRadiusRatio; // 保存初始比例\n    }\n    \n    // sensitivity 控制大小变化幅度：sensitivity 越大，变化幅度越大\n    // 变化幅度基于初始半径，保持大小比例关系\n    const sizeVariation = baseRadius * initialRadiusRatio * element.sensitivity;\n    const targetRadius = baseRadius * initialRadiusRatio + amplitude * sizeVariation;\n    \n    // 平滑过渡到目标半径（增加平滑度）\n    ball.targetRadius = targetRadius;\n    ball.radius += (targetRadius - ball.radius) * 0.05; // 减小变化速度，从 0.1 到 0.05\n    \n    // 保持最小半径，避免球体过小或消失（基于初始半径比例）\n    const minRadius = baseRadius * initialRadiusRatio * 0.5;\n    const maxRadiusLimit = baseRadius * (cfg.maxRadiusRatio || 2.0) * 1.5; // 允许在音频影响下稍微超过初始最大值\n    ball.radius = Math.max(minRadius, Math.min(maxRadiusLimit, ball.radius));\n    \n    // 更新边界偏移\n    for (let j = 0; j < ball.numSegment; j++) {\n      ball.boundOffset[j] = ball.radius;\n      ball.boundOffsetBuff[j] = ball.radius;\n    }\n    \n    // 根据音频调整速度（速度也受 sensitivity 影响）\n    // 进一步增加基础速度和变化幅度，让球体移动更快\n    const baseSpeed = 1.5; // 进一步增加基础速度：从 0.8 到 1.5\n    const speedVariation = 2.5; // 进一步增加速度变化幅度：从 1.5 到 2.5\n    const speed = baseSpeed + amplitude * speedVariation * element.sensitivity;\n    if (ball.vector.length > 0) {\n      ball.vector.length = speed;\n    }\n    \n    // 根据音频节奏调整移动方向\n    // 使用 directionChangeIntensity 控制方向变化的强度\n    const directionIntensity = cfg.directionChangeIntensity !== undefined \n      ? cfg.directionChangeIntensity \n      : 0.3;\n    \n    if (directionIntensity > 0 && ball.vector.length > 0) {\n      // 使用振幅来影响方向变化，让球体随节奏改变方向\n      // 不同球体使用不同的频段，产生不同的方向变化模式\n      const directionChange = amplitude * directionIntensity * element.sensitivity * 40; // 最大40度变化\n      \n      // 根据球体索引创建不同的相位，让每个球体有不同的响应模式\n      const phase = (i / numBalls) * Math.PI * 2; // 每个球体有不同的相位\n      \n      // 使用时间相位让方向变化更平滑，同时结合振幅让节奏感更强\n      const timePhase = time * 1.5; // 时间相位（可以调整速度）\n      const rhythmFactor = amplitude * 2; // 节奏因子，振幅越大变化越快\n      const angleOffset = Math.sin(phase + timePhase + rhythmFactor) * directionChange;\n      \n      // 应用方向变化（平滑过渡）\n      const currentAngle = ball.vector.angle;\n      const targetAngle = currentAngle + angleOffset;\n      \n      // 平滑过渡到目标角度（使用更大的过渡系数让响应更快）\n      const angleDiff = ((targetAngle - currentAngle + 180) % 360) - 180; // 处理角度环绕\n      const transitionSpeed = 0.15 + amplitude * 0.1; // 根据振幅调整过渡速度，节奏强时变化更快\n      ball.vector.angle = currentAngle + angleDiff * transitionSpeed;\n    }\n  }\n  \n  // 处理球体碰撞\n  for (let i = 0; i < element.blobBalls.length - 1; i++) {\n    for (let j = i + 1; j < element.blobBalls.length; j++) {\n      reactBlobBalls(element.blobBalls[i], element.blobBalls[j]);\n    }\n  }\n  \n  // 更新所有球体位置和形状\n  const bounds = new paper.Rectangle(x, y, width, height);\n  \n  for (let i = 0; i < element.blobBalls.length; i++) {\n    const ball = element.blobBalls[i];\n    checkBlobBorders(ball, bounds);\n    \n    if (ball.vector.length > ball.maxVec) {\n      ball.vector.length = ball.maxVec;\n    }\n    \n    ball.point = ball.point.add(ball.vector);\n  }\n  \n  // 创建并绘制所有球体路径（每一帧都重新创建）\n  for (let i = 0; i < element.blobBalls.length; i++) {\n    const ball = element.blobBalls[i];\n    updateBlobShape(ball);\n    drawBlobBall(ball, element, cfg);\n  }\n}\n\n/**\n * 绘制 Blob 球体路径\n */\nfunction drawBlobBall(ball, element, cfg) {\n  // 确保球体有效\n  if (!ball || !ball.point || !ball.radius || ball.radius <= 0) {\n    return; // 如果球体无效，跳过绘制\n  }\n  \n  // 选择颜色（从粒子颜色数组或使用随机色相）\n  let fillColor;\n    if (cfg && cfg.particleColors && cfg.particleColors.length > 0) {\n      const colorIndex = ball.colorIndex % cfg.particleColors.length;\n      fillColor = cfg.particleColors[colorIndex];\n    } else {\n    fillColor = {\n      hue: (ball.colorIndex * 60) % 360,\n      saturation: 0.8,\n      brightness: 1\n    };\n  }\n  \n  // 创建路径（每一帧都重新创建）\n  // 注意：路径会自动添加到当前激活的 layer，不需要手动添加\n  const path = new paper.Path({\n    fillColor: fillColor,\n    blendMode: 'normal', // 改为 normal，避免 lighter 模式导致的闪烁\n    closed: true\n  });\n  \n  // 设置透明度，让叠加效果更自然\n  if (typeof fillColor === 'string') {\n    path.fillColor.alpha = 0.7;\n  } else if (fillColor && fillColor.alpha === undefined) {\n    path.fillColor.alpha = 0.7;\n  }\n  \n  // 添加所有点\n  for (let i = 0; i < ball.numSegment; i++) {\n    const sidePoint = getBlobSidePoint(ball, i);\n    if (sidePoint && sidePoint.x !== undefined && sidePoint.y !== undefined) {\n      path.add(new paper.Point(sidePoint.x, sidePoint.y));\n    }\n  }\n  \n  // 确保路径有足够的点\n  if (path.segments.length >= 3) {\n    // 平滑路径\n    path.smooth();\n  }\n}\n\n/**\n * 检查边界（使用反弹而不是循环，避免突然消失）\n */\nfunction checkBlobBorders(ball, bounds) {\n  // 使用反弹逻辑，而不是循环边界，避免球体突然消失\n  let bounced = false;\n  \n  if (ball.point.x < bounds.x + ball.radius) {\n    ball.point.x = bounds.x + ball.radius;\n    // 反转 X 方向\n    const angle = ball.vector.angle;\n    ball.vector.angle = 180 - angle;\n    bounced = true;\n  }\n  if (ball.point.x > bounds.x + bounds.width - ball.radius) {\n    ball.point.x = bounds.x + bounds.width - ball.radius;\n    // 反转 X 方向\n    const angle = ball.vector.angle;\n    ball.vector.angle = 180 - angle;\n    bounced = true;\n  }\n  if (ball.point.y < bounds.y + ball.radius) {\n    ball.point.y = bounds.y + ball.radius;\n    // 反转 Y 方向\n    const angle = ball.vector.angle;\n    ball.vector.angle = -angle;\n    bounced = true;\n  }\n  if (ball.point.y > bounds.y + bounds.height - ball.radius) {\n    ball.point.y = bounds.y + bounds.height - ball.radius;\n    // 反转 Y 方向\n    const angle = ball.vector.angle;\n    ball.vector.angle = -angle;\n    bounced = true;\n  }\n}\n\n/**\n * 更新球体形状（更新边界偏移）\n */\nfunction updateBlobShape(ball) {\n  // 确保半径有效\n  if (!ball.radius || ball.radius <= 0) {\n    ball.radius = 10; // 设置一个最小默认值\n  }\n  \n  for (let i = 0; i < ball.numSegment; i++) {\n    // 确保边界偏移不会太小\n    const minOffset = ball.radius * 0.5; // 从 0.25 改为 0.5，确保球体不会消失\n    if (ball.boundOffset[i] < minOffset) {\n      ball.boundOffset[i] = minOffset;\n    }\n    const next = (i + 1) % ball.numSegment;\n    const prev = (i > 0) ? i - 1 : ball.numSegment - 1;\n    let offset = ball.boundOffset[i];\n    offset += (ball.radius - offset) / 15;\n    offset += ((ball.boundOffset[next] + ball.boundOffset[prev]) / 2 - offset) / 3;\n    // 确保偏移不会太小\n    offset = Math.max(minOffset, offset);\n    ball.boundOffsetBuff[i] = ball.boundOffset[i] = offset;\n  }\n}\n\n/**\n * 球体碰撞反应\n */\nfunction reactBlobBalls(a, b) {\n  const dist = a.point.getDistance(b.point);\n  if (dist < a.radius + b.radius && dist !== 0) {\n    const overlap = a.radius + b.radius - dist;\n    const direc = a.point.subtract(b.point).normalize(overlap * 0.015);\n    a.vector = a.vector.add(direc);\n    b.vector = b.vector.subtract(direc);\n    \n    calcBlobBounds(a, b);\n    calcBlobBounds(b, a);\n    updateBlobBounds(a);\n    updateBlobBounds(b);\n  }\n}\n\n/**\n * 计算边界偏移\n */\nfunction getBlobBoundOffset(ball, point) {\n  const diff = ball.point.subtract(point);\n  const angle = (diff.angle + 180) % 360;\n  return ball.boundOffset[Math.floor(angle / 360 * ball.boundOffset.length)];\n}\n\n/**\n * 计算碰撞边界\n */\nfunction calcBlobBounds(ball, other) {\n  for (let i = 0; i < ball.numSegment; i++) {\n    const tp = getBlobSidePoint(ball, i);\n    const bLen = getBlobBoundOffset(other, tp);\n    const td = tp.getDistance(other.point);\n    if (td < bLen) {\n      ball.boundOffsetBuff[i] -= (bLen - td) / 2;\n    }\n  }\n}\n\n/**\n * 获取侧面点\n */\nfunction getBlobSidePoint(ball, index) {\n  return ball.point.add(ball.sidePoints[index].multiply(ball.boundOffset[index]));\n}\n\n/**\n * 更新边界\n */\nfunction updateBlobBounds(ball) {\n  for (let i = 0; i < ball.numSegment; i++) {\n    ball.boundOffset[i] = ball.boundOffsetBuff[i];\n  }\n}\n\nrenderBlob.style = 'blob';\n\n"],"names":[],"mappings":"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"}