#if GARLAND_SUPPORT
|
|
|
|
#include "../anim.h"
|
|
#include "../color.h"
|
|
#include "../palette.h"
|
|
|
|
#define DUST_LENGTH 20
|
|
|
|
//------------------------------------------------------------------------------
|
|
class AnimPixieDust : public Anim {
|
|
public:
|
|
AnimPixieDust() : Anim("PixieDust") {
|
|
}
|
|
|
|
void SetupImpl() override {
|
|
phase = 0;
|
|
curColor = palette->getRndInterpColor();
|
|
prevColor = palette->getRndInterpColor();
|
|
inc = secureRandom(2) * 2 - 1;
|
|
if (inc > 0) {
|
|
phase = -DUST_LENGTH / 2;
|
|
} else {
|
|
phase = numLeds + DUST_LENGTH / 2;
|
|
}
|
|
glowSetUp();
|
|
}
|
|
|
|
void Run() override {
|
|
if (inc > 0) {
|
|
for (int i = 0; i < numLeds; ++i) {
|
|
leds[i] = (i > phase) ? prevColor : curColor;
|
|
glowForEachLed(i);
|
|
}
|
|
phase++;
|
|
if (phase >= 4 * numLeds) {
|
|
phase = -DUST_LENGTH / 2;
|
|
prevColor = curColor;
|
|
curColor = palette->getRndInterpColor();
|
|
}
|
|
} else {
|
|
for (int i = 0; i < numLeds; ++i) {
|
|
leds[i] = (i < phase) ? prevColor : curColor;
|
|
glowForEachLed(i);
|
|
}
|
|
phase--;
|
|
if (phase <= -3 * numLeds) {
|
|
phase = numLeds + DUST_LENGTH / 2;
|
|
prevColor = curColor;
|
|
curColor = palette->getContrastColor(prevColor);
|
|
}
|
|
}
|
|
glowRun();
|
|
|
|
for (int k = phase - DUST_LENGTH / 2; k < (phase + DUST_LENGTH / 2); k++) {
|
|
if (k >= 0 && k < numLeds) {
|
|
int mix = abs(k - phase) * 255 / DUST_LENGTH + ((int)rngb() - 125);
|
|
if (mix < 0) {
|
|
mix = 0;
|
|
} else if (mix > 255) {
|
|
mix = 255;
|
|
}
|
|
leds[k] = sparkleColor.interpolate(leds[k], (float)mix / 255);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
#endif // GARLAND_SUPPORT
|