#include "rain.h" #include "constants.h" #include "overlay.h" #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 { bool reached_bottom = false; int y; int length; int speed; unsigned long last_moved; } Raindrop; // TODO: Use a dynamic vector instead Raindrop raindrops[PANEL_WIDTH]; bool rain_initialized = false; uint16_t color_highlight; uint16_t color_default; void setup_rain() { 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 i = 0; idrawBitmap(0, 0, overlay, 64, 32, matrix->color565(64, 0, 0)); if (!rain_initialized) { setup_rain(); rain_initialized = true; } unsigned long timestamp = millis(); for (int x = 0; x < PANEL_WIDTH; x++) { if ((timestamp - raindrops[x].last_moved) > raindrops[x].speed) { // step down a pixel raindrops[x].y++; raindrops[x].last_moved = timestamp; } if (raindrops[x].y > PANEL_HEIGHT) { raindrops[x].y = 0; raindrops[x].reached_bottom = true; } if (raindrops[x].y >= 0) { //draw our pixel matrix->drawPixel(x, raindrops[x].y, matrix->color565(128, 255, 128)); // draw our trail for (int trail_offset = 1; trail_offset < raindrops[x].length; trail_offset++) { int trail_y = raindrops[x].y - trail_offset; float brightness = (raindrops[x].length - trail_offset); uint16_t fade_color = matrix->color565( COLOR_DEFAULT_R * brightness, COLOR_DEFAULT_G * brightness, COLOR_DEFAULT_B * brightness ); if (trail_y < 0) { if (not raindrops[x].reached_bottom) { continue; } // we need to count from the bottom up trail_y = PANEL_WIDTH + trail_y; } int pixel_num = (trail_y * PANEL_WIDTH) + x; if (overlay[pixel_num / 8] & (1 << (7 - (pixel_num % 8))) and mode != Stealth) { if (mode == HighVis) { matrix->drawPixel(x, trail_y, color_highlight); } else { matrix->drawPixel(x, trail_y, matrix->color565( COLOR_HIGHLIGHT_R * brightness, COLOR_HIGHLIGHT_G * brightness, COLOR_HIGHLIGHT_B * brightness )); } } else { matrix->drawPixel(x, trail_y, fade_color); } //} else if (raindrops[x].reached_bottom) { // int pixel_num = ((PANEL_HEIGHT + trail_y) * PANEL_WIDTH) + x; // if (raindrops[x].y >= 0) { // if (overlay[ pixel_num / 8 ] & (1 << (7 - (pixel_num % 8)) ) and mode != Stealth) { // if (mode == HighVis) { // matrix->drawPixel(x, PANEL_HEIGHT + trail_y, color_highlight); // } else { // matrix->drawPixel(x, PANEL_HEIGHT + trail_y, matrix->color565( // COLOR_HIGHLIGHT_R * brightness, // COLOR_HIGHLIGHT_G * brightness, // COLOR_HIGHLIGHT_B * brightness // )); // } // } else { // matrix->drawPixel(x, PANEL_HEIGHT + trail_y, matrix->color565(0, fade_color, 0)); // } // } else { // break; // } //} } } } }