rgb_matrix_kb.inc (3710B)
1 RGB_MATRIX_EFFECT(SINGLE_COLOR_RAINDROPS) 2 RGB_MATRIX_EFFECT(STATIC_GAME_MODE) 3 #ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS 4 5 /* This effect has been partially derived from quantum/rgb_matrix/animations/pixel_rain_anim.h and raindrops_anim.h 6 It sets random LEDs to matrix color (with very slight hue variation) but random intensity */ 7 static bool SINGLE_COLOR_RAINDROPS(effect_params_t* params) { 8 static uint32_t wait_timer = 0; 9 10 // interval function and timing in general taken from pixel rain animation 11 inline uint32_t interval(void) { 12 return 500 / scale16by8(qadd8(rgb_matrix_config.speed, 16), 16); 13 } 14 15 void single_color_raindrops_set_color(uint8_t i, effect_params_t * params) { 16 if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) { 17 return; 18 } 19 20 // Take matrix color, add between -5 and +5 to hue, random brightness between 0 and val, set to 0 if val between 0 and 5, then write to LED 21 hsv_t hsv = rgb_matrix_get_hsv(); 22 hsv.h = rgb_matrix_get_hue() - 2 + random8() % 5; 23 hsv.v = random8() % rgb_matrix_get_val(); 24 if (hsv.v < 5) { 25 hsv.v = 0; 26 } 27 rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv); 28 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 29 wait_timer = g_rgb_timer + interval(); 30 } 31 32 RGB_MATRIX_USE_LIMITS(led_min, led_max); 33 if (!params->init) { 34 if (g_rgb_timer > wait_timer) { 35 single_color_raindrops_set_color(mod8(random8(), RGB_MATRIX_LED_COUNT), params); 36 } 37 } else { 38 for (int i = led_min; i < led_max; i++) { 39 single_color_raindrops_set_color(i, params); 40 } 41 } 42 return rgb_matrix_check_finished_leds(led_max); 43 } 44 45 /* This "effect" is a workaround to fix long matrix scan pauses caused by i2c communication. 46 When enabled, it writes all relevant LEDs once to static colors, then halts LED refreshes until a different animation is selcted. */ 47 bool STATIC_GAME_MODE(effect_params_t* params) { 48 49 void game_mode_set_color(int i, effect_params_t* params) { 50 if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) { 51 return; 52 } 53 54 hsv_t hsv = rgb_matrix_get_hsv(); 55 56 switch (i) { 57 case W_LED_INDEX: 58 case A_LED_INDEX: 59 case S_LED_INDEX: 60 case D_LED_INDEX: 61 62 case M_LED_INDEX: 63 case K_LED_INDEX: 64 case O_LED_INDEX: 65 case P_LED_INDEX: 66 case NUM_0_LED_INDEX: 67 case SLSH_LED_INDEX: 68 break; 69 70 case SCLN_LED_INDEX: 71 case ANV_A_LED_INDEX: 72 case ANV_N_LED_INDEX: 73 case ANV_V_LED_INDEX: 74 case ANV_I_LED_INDEX: 75 case ANV_L_LED_INDEX: 76 hsv.s = 255; 77 hsv.h = rgb_matrix_get_hue()+30; 78 break; 79 80 case NUM_1_LED_INDEX: 81 case NUM_2_LED_INDEX: 82 case NUM_3_LED_INDEX: 83 case NUM_4_LED_INDEX: 84 case NUM_5_LED_INDEX: 85 hsv.s = 255; 86 hsv.h = rgb_matrix_get_hue()+30; 87 hsv.v = rgb_matrix_get_val()*2/3; 88 break; 89 90 default: 91 hsv.v = 0; 92 break; 93 } 94 95 rgb_t rgb = hsv_to_rgb(hsv); 96 rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); 97 } 98 99 RGB_MATRIX_USE_LIMITS(led_min, led_max); 100 if (!params->init) { 101 // Do not update LEDs after initial blanking 102 } else { 103 for (int i = led_min; i < led_max; i++) { 104 game_mode_set_color(i, params); 105 } 106 } 107 return rgb_matrix_check_finished_leds(led_max); 108 } 109 110 #endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS