generateParticles static method

List<ConfettiParticle> generateParticles({
  1. required ConfettiType confettiType,
  2. required ConfettiStyle confettiStyle,
  3. required AnimationConfetti animationStyle,
  4. required ConfettiColorTheme colorTheme,
  5. required ConfettiDensity density,
  6. required bool isColorMixedFromModel,
})

Implementation

static List<ConfettiParticle> generateParticles({
  required ConfettiType confettiType,
  required ConfettiStyle confettiStyle,
  required AnimationConfetti animationStyle,
  required ConfettiColorTheme colorTheme,
  required ConfettiDensity density,
  required bool isColorMixedFromModel,
}) {
  final rand = math.Random();
  final List<ConfettiParticle> particles = [];

  int quantity;
  switch (density) {
    case ConfettiDensity.low:
      quantity = 50;
      break;
    case ConfettiDensity.medium:
      quantity = 100;
      break;
    case ConfettiDensity.high:
      quantity = 200;
      break;
  }

  // Extra for celebration/levelUp
  if (confettiType == ConfettiType.celebration ||
      confettiType == ConfettiType.levelUp) {
    quantity = (quantity * 1.5).round();
  }

  for (int i = 0; i < quantity; i++) {
    // Calculate initial position based on animation style
    Offset position = _calculateInitialPosition(animationStyle, rand);

    // Calculate velocity based on animation style
    Offset velocity = _calculateInitialVelocity(animationStyle, rand);

    // Get color based on theme
    Color color = _getColorFromTheme(
        rand, colorTheme, confettiType, isColorMixedFromModel);

    // Calculate size
    double size = 5.0 + rand.nextDouble() * 5.0;
    if (confettiStyle == ConfettiStyle.star ||
        confettiStyle == ConfettiStyle.emoji) {
      size *= 1.5;
    }

    // Calculate rotation speed
    double rotationSpeed = 0.0;
    if (confettiStyle == ConfettiStyle.star ||
        confettiStyle == ConfettiStyle.ribbons ||
        confettiStyle == ConfettiStyle.paper) {
      rotationSpeed = (rand.nextDouble() - 0.5) * 10.0;
    }

    // Get emoji if needed
    String? emoji;
    if (confettiStyle == ConfettiStyle.emoji) {
      emoji = _getRandomEmoji(confettiType, rand);
    }

    // Create particle using factory method
    particles.add(
      ConfettiParticle.create(
        position: position,
        velocity: velocity,
        color: color,
        size: size,
        rotationSpeed: rotationSpeed,
        emoji: emoji,
        opacity: 0.8 + rand.nextDouble() * 0.2,
        lifespan: 0.7 + rand.nextDouble() * 0.3,
        style: confettiStyle,
      ),
    );
  }

  return particles;
}