diff --git a/include/effect_sinematrix3.h b/include/effect_sinematrix3.h index 5eef7d7..a120c3c 100644 --- a/include/effect_sinematrix3.h +++ b/include/effect_sinematrix3.h @@ -4,6 +4,12 @@ #include "functions.h" #include "Effect.h" +enum SinematrixColorScheme { + SINEMATRIX_COLOR_PASTEL_RAINBOW, + SINEMATRIX_COLOR_RAINBOW, + SINEMATRIX_COLOR_PURPLEFLY, +}; + class Sinematrix3Effect : public Effect { private: double pangle = 0; @@ -25,12 +31,14 @@ private: double fx = 1.0 / (LED_WIDTH / PI); double fy = 1.0 / (LED_HEIGHT / PI); Matrix rotate; + SinematrixColorScheme _color_scheme; + CRGB _get_color(int value); public: + Sinematrix3Effect(SinematrixColorScheme s = SINEMATRIX_COLOR_PASTEL_RAINBOW): _color_scheme(s) {}; boolean supports_window = true; boolean can_be_shown_with_clock(); boolean clock_as_mask(); void loop(uint16_t ms); String get_name() override { return "sinematrix3"; } }; - diff --git a/include/my_color_palettes.h b/include/my_color_palettes.h index 09baead..84885f2 100644 --- a/include/my_color_palettes.h +++ b/include/my_color_palettes.h @@ -6,3 +6,4 @@ extern const TProgmemRGBGradientPalette_byte palette_fire[] FL_PROGMEM; extern const TProgmemRGBGradientPalette_byte palette_matrix[] FL_PROGMEM; +extern const TProgmemRGBGradientPalette_byte palette_purplefly_gp[] FL_PROGMEM; diff --git a/src/color_palettes.cpp b/src/color_palettes.cpp index 8619a77..c6ab1b7 100644 --- a/src/color_palettes.cpp +++ b/src/color_palettes.cpp @@ -9,3 +9,14 @@ __attribute__ ((aligned(4))) extern const TProgmemRGBGradientPalette_byte palett __attribute__ ((aligned(4))) extern const TProgmemRGBGradientPalette_byte palette_matrix[] FL_PROGMEM = { 0, 0, 0, 0, // black 255, 0,255, 0 }; // green + +// Gradient palette "purplefly_gp", originally from +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/rc/tn/purplefly.png.index.html +// converted for FastLED with gammas (2.6, 2.2, 2.5) +// Size: 16 bytes of program space. + +__attribute__ ((aligned(4))) extern const TProgmemRGBGradientPalette_byte palette_purplefly_gp[] FL_PROGMEM = { + 0, 0, 0, 0, + 63, 239, 0,122, + 191, 252,255, 78, + 255, 0, 0, 0}; diff --git a/src/effect_sinematrix3.cpp b/src/effect_sinematrix3.cpp index 709e282..cb36549 100644 --- a/src/effect_sinematrix3.cpp +++ b/src/effect_sinematrix3.cpp @@ -2,9 +2,9 @@ #include "prototypes.h" #include "functions.h" #include "Effect.h" +#include "my_color_palettes.h" boolean Sinematrix3Effect::can_be_shown_with_clock() { return true; }; -boolean Sinematrix3Effect::clock_as_mask() { return true; }; void Sinematrix3Effect::loop(uint16_t ms) { pangle = addmodpi( pangle, 0.0133 + (angle / 256) ); angle = cos(pangle) * PI; @@ -44,8 +44,22 @@ void Sinematrix3Effect::loop(uint16_t ms) { for ( int y = 0; y < LED_HEIGHT; y++ ) { Vector c = add(multiply( multiply(rotate, zoom), { .x1 = x - rcx, .x2 = y - rcy } ), translate); int sat = (basecol + basefield(c.x1, c.x2)) * 255; - CRGB color(CHSV(sat, 120, 255)); - window->setPixel(x, y, &color); + CRGB color(_get_color(sat)); + window->setPixel(x, y, &color); } } } + +CRGB Sinematrix3Effect::_get_color(int sat) { + switch(_color_scheme) { + case SINEMATRIX_COLOR_PASTEL_RAINBOW: return CRGB(CHSV(sat, 120, 255)); + case SINEMATRIX_COLOR_RAINBOW: return CRGB(CHSV(sat, 255, 255)); + case SINEMATRIX_COLOR_PURPLEFLY: return ColorFromPalette((CRGBPalette16)palette_purplefly_gp, (uint8_t)sat); + } + return CRGB(0xFF00FF); +} + +boolean Sinematrix3Effect::clock_as_mask() { + if (_color_scheme == SINEMATRIX_COLOR_PASTEL_RAINBOW) return true; + return false; +}; diff --git a/src/effects.cpp b/src/effects.cpp index 45b22d9..b340e85 100644 --- a/src/effects.cpp +++ b/src/effects.cpp @@ -55,8 +55,11 @@ const EffectEntry effects[] = { /* 23 */ {"marquee", 0, [](){ return new MarqueeEffect(); }}, /* 24 */ {"night_clock", false, [](){ return new NightClockEffect(); }}, /* 25 */ {"tv_static", false, [](){ return new TvStaticEffect(); }}, + /* 26 */ {"sinematrix3_rainbow", true,[](){ return new Sinematrix3Effect(SINEMATRIX_COLOR_RAINBOW); }}, + /* 27 */ {"sinematrix3_purplefly", true,[](){ return new Sinematrix3Effect(SINEMATRIX_COLOR_PURPLEFLY); }}, + }; -const uint8_t effects_size = 26; +const uint8_t effects_size = 28; Effect* select_effect(const char* name) {