#if GARLAND_SUPPORT
|
|
|
|
#include <list>
|
|
|
|
#include "../anim.h"
|
|
#include "../color.h"
|
|
#include "../palette.h"
|
|
|
|
//------------------------------------------------------------------------------
|
|
class AnimComets : public Anim {
|
|
public:
|
|
AnimComets() : Anim("Comets") {
|
|
}
|
|
|
|
void SetupImpl() override {
|
|
comets.clear();
|
|
for (int i = 0; i < 4; ++i)
|
|
comets.emplace_back(palette, numLeds);
|
|
}
|
|
|
|
void Run() override {
|
|
for (int i = 0; i < numLeds; ++i) leds[i] = 0;
|
|
|
|
for (auto& c : comets) {
|
|
int tail = c.head + c.len * -c.dir;
|
|
// Check if Comet out of range and generate it again
|
|
if ((c.head < 0 && tail < 0) || (c.head >= numLeds && tail >= numLeds)) {
|
|
Comet new_comet(palette, numLeds);
|
|
std::swap(c, new_comet);
|
|
}
|
|
|
|
for (int l = 0; l < c.len; ++l) {
|
|
int p = c.head + l * -c.dir;
|
|
if (p >= 0 && p < numLeds) {
|
|
leds[p] = c.points[l];
|
|
}
|
|
}
|
|
c.head = c.head + c.speed * c.dir;
|
|
}
|
|
}
|
|
|
|
private:
|
|
struct Comet {
|
|
float head;
|
|
int len = secureRandom(10, 20);
|
|
float speed = ((float)secureRandom(4, 10)) / 10;
|
|
Color color;
|
|
int dir = 1;
|
|
std::vector<Color> points;
|
|
Comet(Palette* pal, uint16_t numLeds) : head(secureRandom(0, numLeds / 2)), color(pal->getRndInterpColor()), points(len) {
|
|
// DEBUG_MSG_P(PSTR("[GARLAND] Comet created head = %d len = %d speed = %g cr = %d cg = %d cb = %d\n"), head, len, speed, color.r, color.g, color.b);
|
|
if (secureRandom(10) > 5) {
|
|
head = numLeds - head;
|
|
dir = -1;
|
|
}
|
|
|
|
for (int i = 0; i < len; ++i) {
|
|
points[i] = Color((byte)(color.r * (len - i) / len), (byte)(color.g * (len - i) / len), (byte)(color.b * (len - i) / len));
|
|
}
|
|
}
|
|
};
|
|
|
|
std::list<Comet> comets;
|
|
};
|
|
|
|
#endif // GARLAND_SUPPORT
|