]> git.donarmstrong.com Git - qmk_firmware.git/blob - quantum/rgb_matrix_animations/digital_rain_anim.h
Cleanup/rgb matrix (#5811)
[qmk_firmware.git] / quantum / rgb_matrix_animations / digital_rain_anim.h
1 #if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) && !defined(DISABLE_RGB_MATRIX_DIGITAL_RAIN)
2 RGB_MATRIX_EFFECT(DIGITAL_RAIN)
3 #ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
4
5 #ifndef RGB_DIGITAL_RAIN_DROPS
6     // lower the number for denser effect/wider keyboard
7     #define RGB_DIGITAL_RAIN_DROPS 24
8 #endif
9
10 bool DIGITAL_RAIN(effect_params_t* params) {
11   // algorithm ported from https://github.com/tremby/Kaleidoscope-LEDEffect-DigitalRain
12   const uint8_t drop_ticks           = 28;
13   const uint8_t pure_green_intensity = 0xd0;
14   const uint8_t max_brightness_boost = 0xc0;
15   const uint8_t max_intensity        = 0xff;
16
17   static uint8_t drop = 0;
18
19   if (params->init) {
20     rgb_matrix_set_color_all(0, 0, 0);
21     memset(rgb_frame_buffer, 0, sizeof(rgb_frame_buffer));
22     drop = 0;
23   }
24
25   for (uint8_t col = 0; col < MATRIX_COLS; col++) {
26     for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
27       if (row == 0 && drop == 0 && rand() < RAND_MAX / RGB_DIGITAL_RAIN_DROPS) {
28         // top row, pixels have just fallen and we're
29         // making a new rain drop in this column
30         rgb_frame_buffer[row][col] = max_intensity;
31       }
32       else if (rgb_frame_buffer[row][col] > 0 && rgb_frame_buffer[row][col] < max_intensity) {
33         // neither fully bright nor dark, decay it
34         rgb_frame_buffer[row][col]--;
35       }
36       // set the pixel colour
37       uint8_t led[LED_HITS_TO_REMEMBER];
38       uint8_t led_count = rgb_matrix_map_row_column_to_led(row, col, led);
39
40       // TODO: multiple leds are supported mapped to the same row/column
41       if (led_count > 0) {
42         if (rgb_frame_buffer[row][col] > pure_green_intensity) {
43           const uint8_t boost = (uint8_t) ((uint16_t) max_brightness_boost * (rgb_frame_buffer[row][col] - pure_green_intensity) / (max_intensity - pure_green_intensity));
44           rgb_matrix_set_color(led[0], boost, max_intensity, boost);
45         }
46         else {
47           const uint8_t green = (uint8_t) ((uint16_t) max_intensity * rgb_frame_buffer[row][col] / pure_green_intensity);
48           rgb_matrix_set_color(led[0], 0, green, 0);
49         }
50       }
51     }
52   }
53
54   if (++drop > drop_ticks) {
55     // reset drop timer
56     drop = 0;
57     for (uint8_t row = MATRIX_ROWS - 1; row > 0; row--) {
58       for (uint8_t col = 0; col < MATRIX_COLS; col++) {
59         // if ths is on the bottom row and bright allow decay
60         if (row == MATRIX_ROWS - 1 && rgb_frame_buffer[row][col] == max_intensity) {
61           rgb_frame_buffer[row][col]--;
62         }
63         // check if the pixel above is bright
64         if (rgb_frame_buffer[row - 1][col] == max_intensity) {
65           // allow old bright pixel to decay
66           rgb_frame_buffer[row - 1][col]--;
67           // make this pixel bright
68           rgb_frame_buffer[row][col] = max_intensity;
69         }
70       }
71     }
72   }
73   return false;
74 }
75
76 #endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
77 #endif // defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) && !defined(DISABLE_RGB_MATRIX_DIGITAL_RAIN)