2 #ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
3 #if !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS) || !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS)
5 extern const rgb_led g_rgb_leds
[DRIVER_LED_TOTAL
];
6 extern rgb_config_t rgb_matrix_config
;
7 extern last_hit_t g_last_hit_tracker
;
9 static bool rgb_matrix_solid_reactive_multicross_range(uint8_t start
, effect_params_t
* params
) {
10 RGB_MATRIX_USE_LIMITS(led_min
, led_max
);
12 HSV hsv
= { rgb_matrix_config
.hue
, rgb_matrix_config
.sat
, 0 };
13 uint8_t count
= g_last_hit_tracker
.count
;
14 for (uint8_t i
= led_min
; i
< led_max
; i
++) {
16 point_t point
= g_rgb_leds
[i
].point
;
17 for (uint8_t j
= start
; j
< count
; j
++) {
18 int16_t dx
= point
.x
- g_last_hit_tracker
.x
[j
];
19 int16_t dy
= point
.y
- g_last_hit_tracker
.y
[j
];
20 uint8_t dist
= sqrt16(dx
* dx
+ dy
* dy
);
23 uint16_t effect
= scale16by8(g_last_hit_tracker
.tick
[j
], rgb_matrix_config
.speed
) + dist
;
24 dx
= dx
< 0 ? dx
* -1 : dx
;
25 dy
= dy
< 0 ? dy
* -1 : dy
;
26 dx
= dx
* dist2
> 255 ? 255 : dx
* dist2
;
27 dy
= dy
* dist2
> 255 ? 255 : dy
* dist2
;
28 dist3
= dx
> dy
? dy
: dx
;
32 hsv
.v
= qadd8(hsv
.v
, 255 - effect
);
34 hsv
.v
= scale8(hsv
.v
, rgb_matrix_config
.val
);
35 RGB rgb
= hsv_to_rgb(hsv
);
36 rgb_matrix_set_color(i
, rgb
.r
, rgb
.g
, rgb
.b
);
38 return led_max
< DRIVER_LED_TOTAL
;
41 bool rgb_matrix_solid_reactive_multicross(effect_params_t
* params
) {
42 return rgb_matrix_solid_reactive_multicross_range(0, params
);
45 bool rgb_matrix_solid_reactive_cross(effect_params_t
* params
) {
46 return rgb_matrix_solid_reactive_multicross_range(qsub8(g_last_hit_tracker
.count
, 1), params
);
49 #endif // !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS) || !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS)
50 #endif // RGB_MATRIX_KEYREACTIVE_ENABLED