Merge pull request #1729 from blazoncek/tetris-fx
Tetris (falling bricks) effect & Colortwinkles low brightness fix.
This commit is contained in:
commit
f7114fc2aa
@ -1001,14 +1001,6 @@ uint16_t WS2812FX::mode_running_color(void) {
|
|||||||
return running(SEGCOLOR(0), SEGCOLOR(1));
|
return running(SEGCOLOR(0), SEGCOLOR(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Alternating red/green pixels running.
|
|
||||||
*/
|
|
||||||
uint16_t WS2812FX::mode_merry_christmas(void) {
|
|
||||||
return running(RED, GREEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Alternating red/white pixels running.
|
* Alternating red/white pixels running.
|
||||||
*/
|
*/
|
||||||
@ -1991,7 +1983,7 @@ uint16_t WS2812FX::mode_colortwinkle()
|
|||||||
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
|
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
|
||||||
|
|
||||||
CRGB fastled_col, prev;
|
CRGB fastled_col, prev;
|
||||||
fract8 fadeUpAmount = 8 + (SEGMENT.speed/4), fadeDownAmount = 5 + (SEGMENT.speed/7);
|
fract8 fadeUpAmount = _brightness>28 ? 8 + (SEGMENT.speed>>2) : 68-_brightness, fadeDownAmount = _brightness>28 ? 8 + (SEGMENT.speed>>3) : 68-_brightness;
|
||||||
for (uint16_t i = 0; i < SEGLEN; i++) {
|
for (uint16_t i = 0; i < SEGLEN; i++) {
|
||||||
fastled_col = col_to_crgb(getPixelColor(i));
|
fastled_col = col_to_crgb(getPixelColor(i));
|
||||||
prev = fastled_col;
|
prev = fastled_col;
|
||||||
@ -3144,6 +3136,59 @@ uint16_t WS2812FX::mode_drip(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tetris or Stacking (falling bricks) Effect
|
||||||
|
* by Blaz Kristan (https://github.com/blazoncek, https://blaz.at/home)
|
||||||
|
*/
|
||||||
|
typedef struct Tetris {
|
||||||
|
float pos;
|
||||||
|
float speed;
|
||||||
|
uint32_t col;
|
||||||
|
} tetris;
|
||||||
|
|
||||||
|
uint16_t WS2812FX::mode_tetrix(void) {
|
||||||
|
|
||||||
|
uint16_t dataSize = sizeof(tetris);
|
||||||
|
if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed
|
||||||
|
Tetris* drop = reinterpret_cast<Tetris*>(SEGENV.data);
|
||||||
|
|
||||||
|
// initialize dropping on first call or segment full
|
||||||
|
if (SEGENV.call == 0 || SEGENV.aux1 >= SEGLEN) {
|
||||||
|
SEGENV.aux1 = 0; // reset brick stack size
|
||||||
|
SEGENV.step = 0;
|
||||||
|
fill(SEGCOLOR(1));
|
||||||
|
return 250; // short wait
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SEGENV.step == 0) { //init
|
||||||
|
drop->speed = 0.0238 * (SEGMENT.speed ? (SEGMENT.speed>>3)+1 : random8(6,40)); // set speed
|
||||||
|
drop->pos = SEGLEN-1; // start at end of segment
|
||||||
|
drop->col = color_from_palette(random8(0,15)<<4,false,false,0); // limit color choices so there is enough HUE gap
|
||||||
|
SEGENV.step = 1; // drop state (0 init, 1 forming, 2 falling)
|
||||||
|
SEGENV.aux0 = (SEGMENT.intensity ? (SEGMENT.intensity>>5)+1 : random8(1,5)) * (1+(SEGLEN>>6)); // size of brick
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SEGENV.step == 1) { // forming
|
||||||
|
if (random8()>>6) { // random drop
|
||||||
|
SEGENV.step = 2; // fall
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SEGENV.step > 1) { // falling
|
||||||
|
if (drop->pos > SEGENV.aux1) { // fall until top of stack
|
||||||
|
drop->pos -= drop->speed; // may add gravity as: speed += gravity
|
||||||
|
if (int(drop->pos) < SEGENV.aux1) drop->pos = SEGENV.aux1;
|
||||||
|
for (uint16_t i=int(drop->pos); i<SEGLEN; i++) setPixelColor(i,i<int(drop->pos)+SEGENV.aux0 ? drop->col : SEGCOLOR(1));
|
||||||
|
} else { // we hit bottom
|
||||||
|
SEGENV.step = 0; // go back to init
|
||||||
|
SEGENV.aux1 += SEGENV.aux0; // increase the stack size
|
||||||
|
if (SEGENV.aux1 >= SEGLEN) return 1000; // wait for a second
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FRAMETIME;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
/ Plasma Effect
|
/ Plasma Effect
|
||||||
/ adapted from https://github.com/atuline/FastLED-Demos/blob/master/plasma/plasma.ino
|
/ adapted from https://github.com/atuline/FastLED-Demos/blob/master/plasma/plasma.ino
|
||||||
|
@ -164,7 +164,7 @@
|
|||||||
#define FX_MODE_COMET 41
|
#define FX_MODE_COMET 41
|
||||||
#define FX_MODE_FIREWORKS 42
|
#define FX_MODE_FIREWORKS 42
|
||||||
#define FX_MODE_RAIN 43
|
#define FX_MODE_RAIN 43
|
||||||
#define FX_MODE_MERRY_CHRISTMAS 44
|
#define FX_MODE_TETRIX 44
|
||||||
#define FX_MODE_FIRE_FLICKER 45
|
#define FX_MODE_FIRE_FLICKER 45
|
||||||
#define FX_MODE_GRADIENT 46
|
#define FX_MODE_GRADIENT 46
|
||||||
#define FX_MODE_LOADING 47
|
#define FX_MODE_LOADING 47
|
||||||
@ -501,7 +501,7 @@ class WS2812FX {
|
|||||||
_mode[FX_MODE_COMET] = &WS2812FX::mode_comet;
|
_mode[FX_MODE_COMET] = &WS2812FX::mode_comet;
|
||||||
_mode[FX_MODE_FIREWORKS] = &WS2812FX::mode_fireworks;
|
_mode[FX_MODE_FIREWORKS] = &WS2812FX::mode_fireworks;
|
||||||
_mode[FX_MODE_RAIN] = &WS2812FX::mode_rain;
|
_mode[FX_MODE_RAIN] = &WS2812FX::mode_rain;
|
||||||
_mode[FX_MODE_MERRY_CHRISTMAS] = &WS2812FX::mode_merry_christmas;
|
_mode[FX_MODE_TETRIX] = &WS2812FX::mode_tetrix;
|
||||||
_mode[FX_MODE_FIRE_FLICKER] = &WS2812FX::mode_fire_flicker;
|
_mode[FX_MODE_FIRE_FLICKER] = &WS2812FX::mode_fire_flicker;
|
||||||
_mode[FX_MODE_GRADIENT] = &WS2812FX::mode_gradient;
|
_mode[FX_MODE_GRADIENT] = &WS2812FX::mode_gradient;
|
||||||
_mode[FX_MODE_LOADING] = &WS2812FX::mode_loading;
|
_mode[FX_MODE_LOADING] = &WS2812FX::mode_loading;
|
||||||
@ -717,7 +717,7 @@ class WS2812FX {
|
|||||||
mode_comet(void),
|
mode_comet(void),
|
||||||
mode_fireworks(void),
|
mode_fireworks(void),
|
||||||
mode_rain(void),
|
mode_rain(void),
|
||||||
mode_merry_christmas(void),
|
mode_tetrix(void),
|
||||||
mode_halloween(void),
|
mode_halloween(void),
|
||||||
mode_fire_flicker(void),
|
mode_fire_flicker(void),
|
||||||
mode_gradient(void),
|
mode_gradient(void),
|
||||||
@ -884,7 +884,7 @@ const char JSON_mode_names[] PROGMEM = R"=====([
|
|||||||
"Scan","Scan Dual","Fade","Theater","Theater Rainbow","Running","Saw","Twinkle","Dissolve","Dissolve Rnd",
|
"Scan","Scan Dual","Fade","Theater","Theater Rainbow","Running","Saw","Twinkle","Dissolve","Dissolve Rnd",
|
||||||
"Sparkle","Sparkle Dark","Sparkle+","Strobe","Strobe Rainbow","Strobe Mega","Blink Rainbow","Android","Chase","Chase Random",
|
"Sparkle","Sparkle Dark","Sparkle+","Strobe","Strobe Rainbow","Strobe Mega","Blink Rainbow","Android","Chase","Chase Random",
|
||||||
"Chase Rainbow","Chase Flash","Chase Flash Rnd","Rainbow Runner","Colorful","Traffic Light","Sweep Random","Running 2","Aurora","Stream",
|
"Chase Rainbow","Chase Flash","Chase Flash Rnd","Rainbow Runner","Colorful","Traffic Light","Sweep Random","Running 2","Aurora","Stream",
|
||||||
"Scanner","Lighthouse","Fireworks","Rain","Merry Christmas","Fire Flicker","Gradient","Loading","Police","Police All",
|
"Scanner","Lighthouse","Fireworks","Rain","Tetrix","Fire Flicker","Gradient","Loading","Police","Police All",
|
||||||
"Two Dots","Two Areas","Circus","Halloween","Tri Chase","Tri Wipe","Tri Fade","Lightning","ICU","Multi Comet",
|
"Two Dots","Two Areas","Circus","Halloween","Tri Chase","Tri Wipe","Tri Fade","Lightning","ICU","Multi Comet",
|
||||||
"Scanner Dual","Stream 2","Oscillate","Pride 2015","Juggle","Palette","Fire 2012","Colorwaves","Bpm","Fill Noise",
|
"Scanner Dual","Stream 2","Oscillate","Pride 2015","Juggle","Palette","Fire 2012","Colorwaves","Bpm","Fill Noise",
|
||||||
"Noise 1","Noise 2","Noise 3","Noise 4","Colortwinkles","Lake","Meteor","Meteor Smooth","Railway","Ripple",
|
"Noise 1","Noise 2","Noise 3","Noise 4","Colortwinkles","Lake","Meteor","Meteor Smooth","Railway","Ripple",
|
||||||
|
Loading…
Reference in New Issue
Block a user