From 4484721a9f09eff2f3705dab84de5590d1441fe7 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Wed, 11 May 2022 09:37:38 +0200 Subject: [PATCH] 2D Haloween eyes Misc fix. --- wled00/FX.cpp | 19 +++++++++++-------- wled00/FX.h | 7 ++++--- wled00/FX_2Dfcn.cpp | 13 +++++++++---- wled00/FX_fcn.cpp | 2 +- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index a7cff4aaf..a263b04d6 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -2506,6 +2506,7 @@ uint16_t WS2812FX::mode_halloween_eyes() if (state == 0) { //spawn eyes SEGENV.aux0 = random16(0, SEGLEN - eyeLength); //start pos SEGENV.aux1 = random8(); //color + if (isMatrix) SEGMENT.offset = random16(SEGMENT.virtualHeight()-1); // a hack: reuse offset since it is not used in matrices state = 1; } @@ -2517,20 +2518,22 @@ uint16_t WS2812FX::mode_halloween_eyes() if (fadestage > 255) fadestage = 255; uint32_t c = color_blend(color_from_palette(SEGENV.aux1 & 0xFF, false, false, 0), SEGCOLOR(1), fadestage); - for (uint16_t i = 0; i < HALLOWEEN_EYE_WIDTH; i++) - { - setPixelColor(startPos + i, c); - setPixelColor(start2ndEye + i, c); + for (uint16_t i = 0; i < HALLOWEEN_EYE_WIDTH; i++) { + if (isMatrix) { + setPixelColorXY(startPos + i, SEGMENT.offset, c); + setPixelColorXY(start2ndEye + i, SEGMENT.offset, c); + } else { + setPixelColor(startPos + i, c); + setPixelColor(start2ndEye + i, c); + } } } - if (now - SEGENV.step > stateTime) - { + if (now - SEGENV.step > stateTime) { state++; if (state > 2) state = 0; - if (state < 2) - { + if (state < 2) { stateTime = 100 + (255 - SEGMENT.intensity)*10; //eye fade time } else { uint16_t eyeOffTimeBase = (255 - SEGMENT.speed)*10; diff --git a/wled00/FX.h b/wled00/FX.h index f8e042d61..e2e24d38b 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -330,19 +330,19 @@ class WS2812FX { uint16_t virtualWidth() { uint16_t groupLen = groupLength(); uint16_t vWidth = (width() + groupLen - 1) / groupLen; - if (options & MIRROR) vWidth = (vWidth + 1) /2; // divide by 2 if mirror, leave at least a single LED + if (getOption(SEG_OPTION_MIRROR)) vWidth = (vWidth + 1) /2; // divide by 2 if mirror, leave at least a single LED return vWidth; } uint16_t virtualHeight() { uint16_t groupLen = groupLength(); uint16_t vHeight = (height() + groupLen - 1) / groupLen; - if (options & MIRROR_Y_2D) vHeight = (vHeight + 1) /2; // divide by 2 if mirror, leave at least a single LED + if (getOption(SEG_OPTION_MIRROR_Y)) vHeight = (vHeight + 1) /2; // divide by 2 if mirror, leave at least a single LED return vHeight; } uint16_t virtualLength() { uint16_t groupLen = groupLength(); uint16_t vLength = (length() + groupLen - 1) / groupLen; - if (options & MIRROR) vLength = (vLength + 1) /2; // divide by 2 if mirror, leave at least a single LED + if (getOption(SEG_OPTION_MIRROR)) vLength = (vLength + 1) /2; // divide by 2 if mirror, leave at least a single LED return vLength; } uint8_t differs(Segment& b); @@ -879,6 +879,7 @@ class WS2812FX { void setUpMatrix(), setPixelColorXY(uint16_t x, uint16_t y, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), + blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, uint8_t blend), blur1d(CRGB* leds, fract8 blur_amount), blur2d(CRGB* leds, fract8 blur_amount), blurRow(uint16_t row, fract8 blur_amount, CRGB* leds=nullptr), diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 59edf4c7c..5e92c1aff 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -187,8 +187,14 @@ uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) { return busses.getPixelColor(index); } +/* + * Blends the specified color with the existing pixel color. + */ +void WS2812FX::blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, uint8_t blend) { + setPixelColorXY(x, y, color_blend(getPixelColorXY(x,y), color, blend)); +} -// blurRows: perform a blur1d on every row of a rectangular matrix +// blurRow: perform a blur on a row of a rectangular matrix void WS2812FX::blurRow(uint16_t row, fract8 blur_amount, CRGB* leds) { uint16_t width = SEGMENT.virtualWidth(); uint16_t height = SEGMENT.virtualHeight(); @@ -209,9 +215,8 @@ void WS2812FX::blurRow(uint16_t row, fract8 blur_amount, CRGB* leds) { } } -// blurColumns: perform a blur1d on each column of a rectangular matrix -void WS2812FX::blurCol(uint16_t col, fract8 blur_amount, CRGB* leds) -{ +// blurCol: perform a blur on a column of a rectangular matrix +void WS2812FX::blurCol(uint16_t col, fract8 blur_amount, CRGB* leds) { uint16_t width = SEGMENT.virtualWidth(); uint16_t height = SEGMENT.virtualHeight(); if (col >= width) return; diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index ef2c9a2df..5180be908 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1367,7 +1367,7 @@ const char JSON_mode_names[] PROGMEM = R"=====([ "Two Dots@!,Dot size;1,2,Bg;!", "Fairy Twinkle", "Running Dual", -"Halloween", +"Halloween@Duration,Eye fade time;Fx,Bg,;!", "Chase 3@!,Size;1,2,3;0", "Tri Wipe@!,Width;1,2,3;0", "Tri Fade",