#include "rain.h" #include "constants.h" #include "overlay.h" #include #define COLOR_HIGHLIGHT_R 128 #define COLOR_HIGHLIGHT_G 255 #define COLOR_HIGHLIGHT_B 128 #define COLOR_DEFAULT_R 0 #define COLOR_DEFAULT_G 255 #define COLOR_DEFAULT_B 0 //typedef struct { struct Raindrop { //bool reached_bottom = false; bool reached_bottom; int x; int y; int length; int speed; unsigned long last_moved; } ; bool rain_initialized = false; uint16_t color_highlight; uint16_t color_default; std::vector raindrops; void setup_rain(MatrixPanel_I2S_DMA *matrix) { color_highlight = matrix->color565( COLOR_HIGHLIGHT_R, COLOR_HIGHLIGHT_G, COLOR_HIGHLIGHT_B ); color_default = matrix->color565( COLOR_DEFAULT_R, COLOR_DEFAULT_B, COLOR_DEFAULT_G ); for (int x = 0; xdrawBitmap(0, 0, overlay, 64, 32, matrix->color565(64, 0, 0)); if (!rain_initialized) { setup_rain(matrix); rain_initialized = true; } unsigned long timestamp = millis(); int r = 0; while(r < raindrops.size()) { if ((timestamp - raindrops[r].last_moved) > raindrops[r].speed) { // step down a pixel raindrops[r].y++; raindrops[r].last_moved = timestamp; } if (raindrops[r].y > PANEL_HEIGHT + raindrops[r].length) { raindrops.push_back({ false, raindrops[r].x, 0 - random(4), random(20, 28), random(10, 55), millis() }); raindrops.erase(raindrops.begin() + r); continue; } if (raindrops[r].y >= 0) { //draw our pixel matrix->drawPixel(raindrops[r].x, raindrops[r].y, matrix->color565(128, 255, 128)); // draw our trail for (int trail_offset = 1; trail_offset < raindrops[r].length; trail_offset++) { int trail_y = raindrops[r].y - trail_offset; float brightness = ((raindrops[r].length - trail_offset) / (float)raindrops[r].length); uint16_t fade_color = matrix->color565( COLOR_DEFAULT_R * brightness, COLOR_DEFAULT_G * brightness, COLOR_DEFAULT_B * brightness ); if (trail_y < 0) { break; } int pixel_num = (trail_y * PANEL_WIDTH) + raindrops[r].x; if (overlay[pixel_num / 8] & (1 << (7 - (pixel_num % 8))) and mode != Stealth) { if (mode == HighVis) { matrix->drawPixel(raindrops[r].x, trail_y, color_highlight); } else { matrix->drawPixel(raindrops[r].x, trail_y, matrix->color565( COLOR_HIGHLIGHT_R * brightness, COLOR_HIGHLIGHT_G * brightness, COLOR_HIGHLIGHT_B * brightness )); } } else { matrix->drawPixel(raindrops[r].x, trail_y, fade_color); } } } r++; } //delay(25); }