Tweak the Christmas animation effect to be less harsh on the eyes (#7648)
* Tweak the Christmas animation effect to be less harsh on the eyes * Further improve the tweaked Christmas animation code - Use constants where it makes sense - Instead of complicated math, use a static variable to keep track if it's animating from or to red - Don't use pow (but a simple macro instead) - Using floating point math is necessary for the fraction in the cubic bezier function to work * Update docs for the tweaked Christmas animation effect * Further improve memory usage - Don't use floats, but 32 bit ints instead (where needed) - Replace limits.h with constant * Fix typo
This commit is contained in:
parent
d4be07dad3
commit
4b74f985ec
3 changed files with 40 additions and 17 deletions
|
@ -126,19 +126,19 @@ Use these defines to add or remove animations from the firmware. When you are ru
|
||||||
|
|
||||||
The following options are used to tweak the various animations:
|
The following options are used to tweak the various animations:
|
||||||
|
|
||||||
|Define |Default |Description |
|
|Define |Default |Description |
|
||||||
|------------------------------------|-------------|-------------------------------------------------------------------------------------|
|
|------------------------------------|-------------|-----------------------------------------------------------------------------------------------|
|
||||||
|`RGBLIGHT_EFFECT_BREATHE_CENTER` |*Not defined*|If defined, used to calculate the curve for the breathing animation. Valid values are 1.0 to 2.7 |
|
|`RGBLIGHT_EFFECT_BREATHE_CENTER` |*Not defined*|If defined, used to calculate the curve for the breathing animation. Valid values are 1.0 to 2.7 |
|
||||||
|`RGBLIGHT_EFFECT_BREATHE_MAX` |`255` |The maximum brightness for the breathing mode. Valid values are 1 to 255 |
|
|`RGBLIGHT_EFFECT_BREATHE_MAX` |`255` |The maximum brightness for the breathing mode. Valid values are 1 to 255 |
|
||||||
|`RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL`|`1000` |How long to wait between light changes for the "Christmas" animation, in milliseconds|
|
|`RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL`|`40` |How long (in milliseconds) to wait between animation steps for the "Christmas" animation |
|
||||||
|`RGBLIGHT_EFFECT_CHRISTMAS_STEP` |`2` |The number of LEDs to group the red/green colors by for the "Christmas" animation |
|
|`RGBLIGHT_EFFECT_CHRISTMAS_STEP` |`2` |The number of LEDs to group the red/green colors by for the "Christmas" animation |
|
||||||
|`RGBLIGHT_EFFECT_KNIGHT_LED_NUM` |`RGBLED_NUM` |The number of LEDs to have the "Knight" animation travel |
|
|`RGBLIGHT_EFFECT_KNIGHT_LED_NUM` |`RGBLED_NUM` |The number of LEDs to have the "Knight" animation travel |
|
||||||
|`RGBLIGHT_EFFECT_KNIGHT_LENGTH` |`3` |The number of LEDs to light up for the "Knight" animation |
|
|`RGBLIGHT_EFFECT_KNIGHT_LENGTH` |`3` |The number of LEDs to light up for the "Knight" animation |
|
||||||
|`RGBLIGHT_EFFECT_KNIGHT_OFFSET` |`0` |The number of LEDs to start the "Knight" animation from the start of the strip by |
|
|`RGBLIGHT_EFFECT_KNIGHT_OFFSET` |`0` |The number of LEDs to start the "Knight" animation from the start of the strip by |
|
||||||
|`RGBLIGHT_RAINBOW_SWIRL_RANGE` |`255` |Range adjustment for the rainbow swirl effect to get different swirls |
|
|`RGBLIGHT_RAINBOW_SWIRL_RANGE` |`255` |Range adjustment for the rainbow swirl effect to get different swirls |
|
||||||
|`RGBLIGHT_EFFECT_SNAKE_LENGTH` |`4` |The number of LEDs to light up for the "Snake" animation |
|
|`RGBLIGHT_EFFECT_SNAKE_LENGTH` |`4` |The number of LEDs to light up for the "Snake" animation |
|
||||||
|`RGBLIGHT_EFFECT_TWINKLE_LIFE` |`75` |Adjusts how quickly each LED brightens and dims when twinkling (in animation steps) |
|
|`RGBLIGHT_EFFECT_TWINKLE_LIFE` |`75` |Adjusts how quickly each LED brightens and dims when twinkling (in animation steps) |
|
||||||
|`RGBLIGHT_EFFECT_TWINKLE_PROBABILITY`|`1/127` |Adjusts how likely each LED is to twinkle (on each animation step) |
|
|`RGBLIGHT_EFFECT_TWINKLE_PROBABILITY`|`1/127` |Adjusts how likely each LED is to twinkle (on each animation step) |
|
||||||
|
|
||||||
### Example Usage to Reduce Memory Footprint
|
### Example Usage to Reduce Memory Footprint
|
||||||
1. Remove `RGBLIGHT_ANIMATIONS` from `config.h`.
|
1. Remove `RGBLIGHT_ANIMATIONS` from `config.h`.
|
||||||
|
|
|
@ -1163,16 +1163,39 @@ void rgblight_effect_knight(animation_status_t *anim) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RGBLIGHT_EFFECT_CHRISTMAS
|
#ifdef RGBLIGHT_EFFECT_CHRISTMAS
|
||||||
|
# define CUBED(x) ((x) * (x) * (x))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Christmas lights effect, with a smooth animation between red & green.
|
||||||
|
*/
|
||||||
void rgblight_effect_christmas(animation_status_t *anim) {
|
void rgblight_effect_christmas(animation_status_t *anim) {
|
||||||
uint8_t hue;
|
static int8_t increment = 1;
|
||||||
|
const uint8_t max_pos = 32;
|
||||||
|
const uint8_t hue_green = 85;
|
||||||
|
|
||||||
|
uint32_t xa;
|
||||||
|
uint8_t hue, val;
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
|
||||||
anim->current_offset = (anim->current_offset + 1) % 2;
|
// The effect works by animating anim->pos from 0 to 32 and back to 0.
|
||||||
|
// The pos is used in a cubic bezier formula to ease-in-out between red and green, leaving the interpolated colors visible as short as possible.
|
||||||
|
xa = CUBED((uint32_t) anim->pos);
|
||||||
|
hue = ((uint32_t) hue_green) * xa / (xa + CUBED((uint32_t) (max_pos - anim->pos)));
|
||||||
|
// Additionally, these interpolated colors get shown with a slightly darker value, to make them less prominent than the main colors.
|
||||||
|
val = 255 - (3 * (hue < hue_green / 2 ? hue : hue_green - hue) / 2);
|
||||||
|
|
||||||
for (i = 0; i < rgblight_ranges.effect_num_leds; i++) {
|
for (i = 0; i < rgblight_ranges.effect_num_leds; i++) {
|
||||||
hue = 0 + ((i / RGBLIGHT_EFFECT_CHRISTMAS_STEP + anim->current_offset) % 2) * 85;
|
uint8_t local_hue = (i / RGBLIGHT_EFFECT_CHRISTMAS_STEP) % 2 ? hue : hue_green - hue;
|
||||||
sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]);
|
sethsv(local_hue, rgblight_config.sat, val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]);
|
||||||
}
|
}
|
||||||
rgblight_set();
|
rgblight_set();
|
||||||
|
|
||||||
|
if (anim->pos == 0) {
|
||||||
|
increment = 1;
|
||||||
|
} else if (anim->pos == max_pos) {
|
||||||
|
increment = -1;
|
||||||
|
}
|
||||||
|
anim->pos += increment;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ enum RGBLIGHT_EFFECT_MODE {
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL
|
# ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL
|
||||||
# define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 1000
|
# define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 40
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP
|
# ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP
|
||||||
|
|
Loading…
Reference in a new issue