From 2ba6350cbd1f81f9511c42b5dc63864a54f5f3e8 Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Wed, 17 Jul 2024 15:24:21 +0200 Subject: [PATCH] GEQ 3D bugfixing and minor improvements * prevent loss of projector when changing segment witdth (mirror). * prevent unsigned wrap-around "0 -1" for projector * use aux0 and aux1 segment vars (use them as signed) * change default NUM_BANDS to 50% - better for smaller panels * if less than 16 bands : map to full range instead of only showing lower frequencies - same behavious as GEQ 2D. --- wled00/FX.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index b0e46366..7797835b 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -8420,21 +8420,20 @@ uint16_t mode_GEQLASER(void) { const int rows = SEGMENT.virtualHeight(); if ((cols < 3) || (rows < 3)) return mode_static(); // too small - const size_t dataSize = sizeof(uint16_t); - if (!SEGENV.allocateData(dataSize * 2)) return mode_static(); //allocation failed - uint16_t *projector = reinterpret_cast(SEGENV.data); - uint16_t *projector_dir = reinterpret_cast(SEGENV.data + dataSize); + int16_t *projector = reinterpret_cast(&(SEGENV.aux0)); // *projector is an alias for aux0 (uint16_t) + int16_t *projector_dir = reinterpret_cast(&(SEGENV.aux1)); // *projector_dir is an alias for aux1 (uint16_t) if (SEGENV.call == 0) { *projector = 0; - *projector_dir = 0; + *projector_dir = 1; SEGMENT.setUpLeds(); // WLEDMM use lossless getPixelColor() SEGMENT.fill(BLACK); } else { if (SEGENV.call % map(SEGMENT.speed,0,255,10,1) == 0) *projector += *projector_dir; - if (*projector == SEGMENT.virtualWidth()) *projector_dir = -1; - if (*projector == 0) *projector_dir = 1; + if (*projector >= cols) *projector_dir = -1; + if (*projector <= 0) *projector_dir = 1; } + *projector = constrain(*projector, 0, cols-1); // make sure we don't walk out of range SEGMENT.fill(BLACK); @@ -8453,7 +8452,9 @@ uint16_t mode_GEQLASER(void) { uint8_t heights[NUM_GEQ_CHANNELS] = { 0 }; for (int i=0; i