forked from qmk/qmk_firmware
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
RGB Matrix Animations: Three/six new reactive effects (wide, cross, n…
…exus) (qmk#5602) * added 3 new RGB_Matrix effects * made cross effect behavior smoother * removed dead code * added effect descriptions
- Loading branch information
1 parent
b61baf4
commit bb52119
Showing
6 changed files
with
224 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
#pragma once | ||
#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED | ||
#if !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS) || !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS) | ||
|
||
extern const rgb_led g_rgb_leds[DRIVER_LED_TOTAL]; | ||
extern rgb_config_t rgb_matrix_config; | ||
extern last_hit_t g_last_hit_tracker; | ||
|
||
static bool rgb_matrix_solid_reactive_multicross_range(uint8_t start, effect_params_t* params) { | ||
RGB_MATRIX_USE_LIMITS(led_min, led_max); | ||
|
||
HSV hsv = { rgb_matrix_config.hue, rgb_matrix_config.sat, 0 }; | ||
uint8_t count = g_last_hit_tracker.count; | ||
for (uint8_t i = led_min; i < led_max; i++) { | ||
hsv.v = 0; | ||
point_t point = g_rgb_leds[i].point; | ||
for (uint8_t j = start; j < count; j++) { | ||
int16_t dx = point.x - g_last_hit_tracker.x[j]; | ||
int16_t dy = point.y - g_last_hit_tracker.y[j]; | ||
uint8_t dist = sqrt16(dx * dx + dy * dy); | ||
int16_t dist2 = 16; | ||
uint8_t dist3; | ||
uint16_t effect = scale16by8(g_last_hit_tracker.tick[j], rgb_matrix_config.speed) + dist; | ||
dx = dx < 0 ? dx * -1 : dx; | ||
dy = dy < 0 ? dy * -1 : dy; | ||
dx = dx * dist2 > 255 ? 255 : dx * dist2; | ||
dy = dy * dist2 > 255 ? 255 : dy * dist2; | ||
dist3 = dx > dy ? dy : dx; | ||
effect += dist3; | ||
if (effect > 255) | ||
effect = 255; | ||
hsv.v = qadd8(hsv.v, 255 - effect); | ||
} | ||
hsv.v = scale8(hsv.v, rgb_matrix_config.val); | ||
RGB rgb = hsv_to_rgb(hsv); | ||
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); | ||
} | ||
return led_max < DRIVER_LED_TOTAL; | ||
} | ||
|
||
bool rgb_matrix_solid_reactive_multicross(effect_params_t* params) { | ||
return rgb_matrix_solid_reactive_multicross_range(0, params); | ||
} | ||
|
||
bool rgb_matrix_solid_reactive_cross(effect_params_t* params) { | ||
return rgb_matrix_solid_reactive_multicross_range(qsub8(g_last_hit_tracker.count, 1), params); | ||
} | ||
|
||
#endif // !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS) || !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS) | ||
#endif // RGB_MATRIX_KEYREACTIVE_ENABLED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
#pragma once | ||
#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED | ||
#if !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS) || !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS) | ||
|
||
extern const rgb_led g_rgb_leds[DRIVER_LED_TOTAL]; | ||
extern rgb_config_t rgb_matrix_config; | ||
extern last_hit_t g_last_hit_tracker; | ||
|
||
static bool rgb_matrix_solid_reactive_multinexus_range(uint8_t start, effect_params_t* params) { | ||
RGB_MATRIX_USE_LIMITS(led_min, led_max); | ||
|
||
HSV hsv = { rgb_matrix_config.hue, rgb_matrix_config.sat, 0 }; | ||
uint8_t count = g_last_hit_tracker.count; | ||
for (uint8_t i = led_min; i < led_max; i++) { | ||
hsv.v = 0; | ||
point_t point = g_rgb_leds[i].point; | ||
for (uint8_t j = start; j < count; j++) { | ||
int16_t dx = point.x - g_last_hit_tracker.x[j]; | ||
int16_t dy = point.y - g_last_hit_tracker.y[j]; | ||
uint8_t dist = sqrt16(dx * dx + dy * dy); | ||
int16_t dist2 = 8; | ||
uint16_t effect = scale16by8(g_last_hit_tracker.tick[j], rgb_matrix_config.speed) - dist; | ||
if (effect > 255) | ||
effect = 255; | ||
if (dist > 72) | ||
effect = 255; | ||
if ((dx > dist2 || dx < -dist2) && (dy > dist2 || dy < -dist2)) | ||
effect = 255; | ||
hsv.v = qadd8(hsv.v, 255 - effect); | ||
hsv.h = rgb_matrix_config.hue + dy / 4; | ||
} | ||
hsv.v = scale8(hsv.v, rgb_matrix_config.val); | ||
RGB rgb = hsv_to_rgb(hsv); | ||
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); | ||
} | ||
return led_max < DRIVER_LED_TOTAL; | ||
} | ||
|
||
bool rgb_matrix_solid_reactive_multinexus(effect_params_t* params) { | ||
return rgb_matrix_solid_reactive_multinexus_range(0, params); | ||
} | ||
|
||
bool rgb_matrix_solid_reactive_nexus(effect_params_t* params) { | ||
return rgb_matrix_solid_reactive_multinexus_range(qsub8(g_last_hit_tracker.count, 1), params); | ||
} | ||
|
||
#endif // !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS) || !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS) | ||
#endif // RGB_MATRIX_KEYREACTIVE_ENABLED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
#pragma once | ||
#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED | ||
#if !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE) || !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE) | ||
|
||
extern const rgb_led g_rgb_leds[DRIVER_LED_TOTAL]; | ||
extern rgb_config_t rgb_matrix_config; | ||
extern last_hit_t g_last_hit_tracker; | ||
|
||
static bool rgb_matrix_solid_reactive_multiwide_range(uint8_t start, effect_params_t* params) { | ||
RGB_MATRIX_USE_LIMITS(led_min, led_max); | ||
|
||
HSV hsv = { rgb_matrix_config.hue, rgb_matrix_config.sat, 0 }; | ||
uint8_t count = g_last_hit_tracker.count; | ||
for (uint8_t i = led_min; i < led_max; i++) { | ||
hsv.v = 0; | ||
point_t point = g_rgb_leds[i].point; | ||
for (uint8_t j = start; j < count; j++) { | ||
int16_t dx = point.x - g_last_hit_tracker.x[j]; | ||
int16_t dy = point.y - g_last_hit_tracker.y[j]; | ||
uint8_t dist = sqrt16(dx * dx + dy * dy); | ||
uint16_t effect = scale16by8(g_last_hit_tracker.tick[j], rgb_matrix_config.speed) + dist * 5; | ||
if (effect > 255) | ||
effect = 255; | ||
hsv.v = qadd8(hsv.v, 255 - effect); | ||
} | ||
hsv.v = scale8(hsv.v, rgb_matrix_config.val); | ||
RGB rgb = hsv_to_rgb(hsv); | ||
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); | ||
} | ||
return led_max < DRIVER_LED_TOTAL; | ||
} | ||
|
||
bool rgb_matrix_solid_reactive_multiwide(effect_params_t* params) { | ||
return rgb_matrix_solid_reactive_multiwide_range(0, params); | ||
} | ||
|
||
bool rgb_matrix_solid_reactive_wide(effect_params_t* params) { | ||
return rgb_matrix_solid_reactive_multiwide_range(qsub8(g_last_hit_tracker.count, 1), params); | ||
} | ||
|
||
#endif // !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE) || !defined(DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE) | ||
#endif // RGB_MATRIX_KEYREACTIVE_ENABLED |