#include "Animation/MatrixCodeAnimation.h" #include MatrixCodeAnimation::MatrixCodeAnimation(Fader *fader, int vspeed, int spawn_rate) : Animation(fader), m_vspeed(vspeed), m_spawnRate(spawn_rate) { reset(); } void MatrixCodeAnimation::loop(uint64_t frame) { int nled = m_fader->modules_per_strip(); int nstrip = m_fader->strips(); if(frame == 0) { m_fader->set_fadestep(8); } // create new pixels std::uniform_int_distribution spawnRNG(0, (60*nstrip / m_spawnRate) - 1); std::uniform_int_distribution vspeedRNG(m_vspeed - 32, m_vspeed + 32); if(!m_stopping) { for(int i = 0; i < nstrip; i++) { if(spawnRNG(m_gen) == 0) { m_pixels.emplace_back(Pixel{i, 256*nled-1, vspeedRNG(m_gen)}); } } } m_fader->fade_color(Fader::Color{0, 0, 0, 0}); // move all pixels down and render them for(auto &px: m_pixels) { px.y -= px.vspeed; if(px.y >= 0) { m_fader->set_color(px.x, px.y/256, Fader::Color{0, 192, 0, 16}); } } m_pixels.remove_if( [](const Pixel &px) { return px.y < 0; }); m_fader->update(); m_running = !m_stopping || m_fader->something_changed(); } void MatrixCodeAnimation::reset(void) { m_pixels.clear(); m_stopping = false; m_running = true; }