diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index be0789e1f..57cf03198 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -134,10 +134,8 @@ void IRAM_ATTR WS2812FX::setPixelColorXY(uint16_t x, uint16_t y, byte r, byte g, } uint32_t col = RGBW32(r, g, b, w); - uint16_t width = _segments[segIdx].virtualWidth(); // segment width in logical pixels - uint16_t height = _segments[segIdx].virtualHeight(); // segment height in logical pixels - if (_segments[segIdx].options & MIRROR ) width = (width + 1) /2; // divide by 2 if mirror, leave at least a single LED - if (_segments[segIdx].options & MIRROR_Y_2D) height = (height + 1) /2; // divide by 2 if mirror, leave at least a single LED + uint16_t width = _segments[segIdx].virtualWidth(); // segment width in logical pixels (includes mirror) + uint16_t height = _segments[segIdx].virtualHeight(); // segment height in logical pixels (includes mirror) if (_segments[segIdx].options & TRANSPOSED ) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed x *= _segments[segIdx].groupLength(); @@ -157,12 +155,12 @@ void IRAM_ATTR WS2812FX::setPixelColorXY(uint16_t x, uint16_t y, byte r, byte g, busses.setPixelColor(index, col); if (_segments[segIdx].options & MIRROR) { //set the corresponding horizontally mirrored pixel - index = XY(_segments[segIdx].stop - xX - 1, yY, segIdx); + index = XY(_segments[segIdx].width() - xX - 1, yY, segIdx); if (index < customMappingSize) index = customMappingTable[index]; busses.setPixelColor(index, col); } if (_segments[segIdx].options & MIRROR_Y_2D) { //set the corresponding vertically mirrored pixel - index = XY(xX, _segments[segIdx].stopY - yY - 1, segIdx); + index = XY(xX, _segments[segIdx].height() - yY - 1, segIdx); if (index < customMappingSize) index = customMappingTable[index]; busses.setPixelColor(index, col); } @@ -176,8 +174,6 @@ uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) uint8_t segIdx = _segment_index; uint16_t width = _segments[segIdx].virtualWidth(); // segment width in logical pixels uint16_t height = _segments[segIdx].virtualHeight(); // segment height in logical pixels - if (_segments[segIdx].options & MIRROR ) width = (width + 1) /2; // divide by 2 if mirror, leave at least a single LED - if (_segments[segIdx].options & MIRROR_Y_2D) height = (height + 1) /2; // divide by 2 if mirror, leave at least a single LED if (_segments[segIdx].options & TRANSPOSED ) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed x *= _segments[segIdx].groupLength(); diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 2efd52936..9562ba9f1 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -733,7 +733,18 @@ void WS2812FX::resetSegments() { } void WS2812FX::makeAutoSegments(bool forceReset) { - if (autoSegments) { //make one segment per bus + if (isMatrix) { + // only create 1 2D segment + uint8_t mainSeg = getMainSegmentId(); + if (forceReset) { + for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) { + setSegment(i, 0, 0); + } + } + if (getActiveSegmentsNum() < 2) { + setSegment(mainSeg, 0, matrixWidth, 1, 0, 0, 0, matrixHeight); + } + } else if (autoSegments) { //make one segment per bus uint16_t segStarts[MAX_NUM_SEGMENTS] = {0}; uint16_t segStops [MAX_NUM_SEGMENTS] = {0}; uint8_t s = 0;