"""
流体发射器组件
负责生成流体粒子
"""

from panda3d.core import Vec3, Point3
import random
import math

class FluidEmitter:
    """
    流体发射器类
    负责生成流体粒子
    """
    
    def __init__(self, position, fluid_world):
        """
        初始化流体发射器
        
        Args:
            position (Point3): 发射器位置
            fluid_world: 流体世界对象的引用
        """
        self.position = position
        self.fluid_world = fluid_world
        
        # 发射器属性
        self.emit_rate = 10  # 每秒发射粒子数
        self.emit_velocity = Vec3(0, 0, 5)  # 发射速度
        self.emit_spread = 0.1  # 发射扩散角度
        self.emit_count = 0  # 已发射粒子数
        self.is_active = True  # 是否激活
        
        # 粒子属性
        self.particle_mass = 1.0  # 粒子质量
        self.particle_lifespan = 5.0  # 粒子寿命
        
        print(f"流体发射器创建完成: {position}")
        
    def update(self, dt):
        """
        更新发射器状态
        
        Args:
            dt (float): 时间步长
        """
        if not self.is_active:
            return
            
        # 计算应该发射的粒子数
        particles_to_emit = int(self.emit_rate * dt)
        
        # 发射粒子
        for _ in range(particles_to_emit):
            self._emit_particle()
            
    def _emit_particle(self):
        """
        发射单个粒子
        """
        # 创建粒子对象（这里简化为字典，实际实现中应该是专门的粒子类）
        particle = {
            'position': self.position + Vec3(
                random.uniform(-0.1, 0.1),
                random.uniform(-0.1, 0.1),
                random.uniform(-0.1, 0.1)
            ),
            'velocity': self._get_random_velocity(),
            'mass': self.particle_mass,
            'lifespan': self.particle_lifespan,
            'age': 0.0
        }
        
        # 添加到流体世界
        self.fluid_world.add_fluid_particle(particle)
        self.emit_count += 1
        
    def _get_random_velocity(self):
        """
        获取随机发射速度
        
        Returns:
            Vec3: 随机速度向量
        """
        # 基础发射方向
        base_direction = self.emit_velocity.normalized()
        
        # 添加随机扩散
        angle = random.uniform(0, 2 * math.pi)
        spread = random.uniform(0, self.emit_spread)
        
        # 简化的扩散计算
        spread_x = math.cos(angle) * spread
        spread_y = math.sin(angle) * spread
        
        # 应用扩散到速度向量
        velocity = base_direction + Vec3(spread_x, spread_y, 0)
        velocity.normalize()
        velocity *= self.emit_velocity.length()
        
        return velocity
        
    def set_emit_rate(self, rate):
        """
        设置发射速率
        
        Args:
            rate (float): 每秒发射粒子数
        """
        self.emit_rate = rate
        
    def set_emit_velocity(self, velocity):
        """
        设置发射速度
        
        Args:
            velocity (Vec3): 发射速度向量
        """
        self.emit_velocity = velocity
        
    def set_emit_spread(self, spread):
        """
        设置发射扩散角度
        
        Args:
            spread (float): 扩散角度（弧度）
        """
        self.emit_spread = spread
        
    def activate(self):
        """
        激活发射器
        """
        self.is_active = True
        
    def deactivate(self):
        """
        停用发射器
        """
        self.is_active = False