generateRandomLoaderConfig function
LoaderRandomConfig
generateRandomLoaderConfig({
- Color? preferredColor,
- Set<
LoaderPersona> ? excludedPersonas, - 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,
);
}