generateRandomLoaderConfig function

LoaderRandomConfig generateRandomLoaderConfig({
  1. Color? preferredColor,
  2. Set<LoaderPersona>? excludedPersonas,
  3. bool isLightBackground = false,
})

Generates a random loader config for the comet animation.

Implementation

LoaderRandomConfig generateRandomLoaderConfig({
  Color? preferredColor,
  Set<LoaderPersona>? excludedPersonas,
  bool isLightBackground = false,
}) {
  final excluded = excludedPersonas;
  final allowedIndices = excluded != null && excluded.isNotEmpty
      ? List.generate(_personas.length, (i) => i)
          .where((i) => !excluded.contains(LoaderPersona.values[i]))
          .toList()
      : null;
  final personaIndex = allowedIndices != null && allowedIndices.isNotEmpty
      ? allowedIndices[_random.nextInt(allowedIndices.length)]
      : _random.nextInt(_personas.length);
  final persona = _personas[personaIndex];

  final palette = isLightBackground ? _lightPresetColors : _presetColors;
  final colorIdx = _inRangeInt(persona.colorIndices).clamp(0, palette.length - 1);
  final color = preferredColor ?? palette[colorIdx];

  return LoaderRandomConfig(
    objectCount: _inRangeInt(persona.objectCount).clamp(1, 4),
    dotSize: _inRange(persona.dotSize).clamp(1.0, 8.0),
    trailLength: _inRangeInt(persona.trailLength).clamp(1, 5),
    trailSpacing: _inRange(persona.trailSpacing).clamp(0.02, 0.5),
    perturbAmplitude: _inRange(persona.perturbAmplitude).clamp(0.0, 20.0),
    perturbFrequency: _inRange(persona.perturbFrequency).clamp(0.0, 10.0),
    velocityMultiplier: _inRange(persona.velocityMultiplier).clamp(0.2, 5.0),
    glowBlurRadius: _inRange(persona.glowBlurRadius).clamp(0.0, 8.0),
    glowOpacity: _inRange(persona.glowOpacity).clamp(0.1, 1.0),
    reactiveRadius: _inRange(persona.reactiveRadius).clamp(0.0, 50.0),
    orbitEccentricity: _inRange(persona.orbitEccentricity).clamp(0.0, 0.4),
    perihelionGlow: _inRange(persona.perihelionGlow).clamp(0.0, 0.6),
    tailCurvature: _inRange(persona.tailCurvature).clamp(0.0, 1.0),
    velocityWarp: _inRange(persona.velocityWarp).clamp(0.0, 0.25),
    precessionRate: _inRange(persona.precessionRate).clamp(0.0, 0.15),
    orbitalInclination: _inRange(persona.orbitalInclination).clamp(0.0, 0.25),
    intensityTransitionDurationMs:
        _inRangeInt(persona.intensityTransitionMs).clamp(100, 500),
    color: color,
  );
}