Skip to content

Commit

Permalink
Update Raindrops effect to respect LED range limits
Browse files Browse the repository at this point in the history
Improved effect to update LED index within `led_min` and `led_max` limits
  • Loading branch information
filterpaper committed Oct 27, 2024
1 parent d316331 commit 2b3e7c2
Showing 1 changed file with 22 additions and 16 deletions.
38 changes: 22 additions & 16 deletions quantum/rgb_matrix/animations/raindrops_anim.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,41 @@
RGB_MATRIX_EFFECT(RAINDROPS)
# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS

static void raindrops_set_color(int i, effect_params_t* params) {
if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) return;
hsv_t hsv = {0, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v};

static rgb_t raindrops_set_color(hsv_t hsv) {
// Take the shortest path between hues
int16_t deltaH = ((rgb_matrix_config.hsv.h + 180) % 360 - rgb_matrix_config.hsv.h) / 4;
int16_t deltaH = ((hsv.h + 180) % 360 - hsv.h) / 4;
if (deltaH > 127) {
deltaH -= 256;
} else if (deltaH < -127) {
deltaH += 256;
}

hsv.h = rgb_matrix_config.hsv.h + (deltaH * (random8() & 0x03));
rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv);
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
hsv.h += (deltaH * random8_max(3));
return rgb_matrix_hsv_to_rgb(hsv);
}

bool RAINDROPS(effect_params_t* params) {
static uint16_t idx = 0;
static rgb_t rgb = {0};

if (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 16)) % 10 == 0) {
idx = random8_max(RGB_MATRIX_LED_COUNT);
rgb = raindrops_set_color(rgb_matrix_config.hsv);
}

RGB_MATRIX_USE_LIMITS(led_min, led_max);
if (!params->init) {
// Change one LED every tick, make sure speed is not 0
if (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 16)) % 10 == 0) {
raindrops_set_color(random8_max(RGB_MATRIX_LED_COUNT), params);
}
} else {
for (int i = led_min; i < led_max; i++) {
raindrops_set_color(i, params);
if (params->init) {
for (uint8_t i = led_min; i < led_max; i++) {
if (HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) {
rgb = raindrops_set_color(rgb_matrix_config.hsv);
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
}
}
}
// Change one LED every tick
else if (led_min <= idx && idx <= led_max && HAS_ANY_FLAGS(g_led_config.flags[idx], params->flags)) {
rgb_matrix_set_color(idx, rgb.r, rgb.g, rgb.b);
}
return rgb_matrix_check_finished_leds(led_max);
}

Expand Down

0 comments on commit 2b3e7c2

Please sign in to comment.