From f42a8333cf24dcfaca55c116aea2ef10f77484ee Mon Sep 17 00:00:00 2001 From: ozlb Date: Mon, 9 Oct 2023 10:48:27 +0200 Subject: [PATCH 1/3] PlotDigital : Fix Digital plots do not respect axis inversion https://github.com/epezent/implot/issues/520 --- implot_items.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/implot_items.cpp b/implot_items.cpp index 91c71d82..3f6b451f 100644 --- a/implot_items.cpp +++ b/implot_items.cpp @@ -2693,15 +2693,14 @@ void PlotDigitalEx(const char* label_id, Getter getter, ImPlotDigitalFlags flags if (ImNanOrInf(itemData2.y)) itemData2.y = ImConstrainNan(ImConstrainInf(itemData2.y)); int pixY_0 = (int)(s.LineWeight); itemData1.y = ImMax(0.0, itemData1.y); - float pixY_1_float = s.DigitalBitHeight * (float)itemData1.y; - int pixY_1 = (int)(pixY_1_float); //allow only positive values - int pixY_chPosOffset = (int)(ImMax(s.DigitalBitHeight, pixY_1_float) + s.DigitalBitGap); + const float pixY_1 = s.DigitalBitHeight * (float)itemData1.y; + const int pixY_chPosOffset = (int)(ImMax(s.DigitalBitHeight, pixY_1) + s.DigitalBitGap); pixYMax = ImMax(pixYMax, pixY_chPosOffset); ImVec2 pMin = PlotToPixels(itemData1,IMPLOT_AUTO,IMPLOT_AUTO); ImVec2 pMax = PlotToPixels(itemData2,IMPLOT_AUTO,IMPLOT_AUTO); - int pixY_Offset = 0; //20 pixel from bottom due to mouse cursor label - pMin.y = (y_axis.PixelMin) + ((-gp.DigitalPlotOffset) - pixY_Offset); - pMax.y = (y_axis.PixelMin) + ((-gp.DigitalPlotOffset) - pixY_0 - pixY_1 - pixY_Offset); + const int pixY_Offset = 0; //20 pixel from bottom due to mouse cursor label + pMin.y = (y_axis.PixelMin) + ((-gp.DigitalPlotOffset) - pixY_Offset); + pMax.y = (y_axis.PixelMin) + ((-gp.DigitalPlotOffset) - pixY_0 - (int)(pixY_1) - pixY_Offset); //plot only one rectangle for same digital state while (((i+2) < getter.Count) && (itemData1.y == itemData2.y)) { const int in = (i + 1); @@ -2710,13 +2709,12 @@ void PlotDigitalEx(const char* label_id, Getter getter, ImPlotDigitalFlags flags pMax.x = PlotToPixels(itemData2,IMPLOT_AUTO,IMPLOT_AUTO).x; i++; } - //do not extend plot outside plot range - if (pMin.x < x_axis.PixelMin) pMin.x = x_axis.PixelMin; - if (pMax.x < x_axis.PixelMin) pMax.x = x_axis.PixelMin; - if (pMin.x > x_axis.PixelMax) pMin.x = x_axis.PixelMax - 1; //fix issue related to https://github.com/ocornut/imgui/issues/3976 - if (pMax.x > x_axis.PixelMax) pMax.x = x_axis.PixelMax - 1; //fix issue related to https://github.com/ocornut/imgui/issues/3976 + // do not extend plot outside plot range + pMin.x = ImClamp(pMin.x, !x_axis.IsInverted() ? x_axis.PixelMin : x_axis.PixelMax, !x_axis.IsInverted() ? x_axis.PixelMax - 1 : x_axis.PixelMin - 1); + pMax.x = ImClamp(pMax.x, !x_axis.IsInverted() ? x_axis.PixelMin : x_axis.PixelMax, !x_axis.IsInverted() ? x_axis.PixelMax - 1 : x_axis.PixelMin - 1); + //plot a rectangle that extends up to x2 with y1 height - if ((pMax.x > pMin.x) && (gp.CurrentPlot->PlotRect.Contains(pMin) || gp.CurrentPlot->PlotRect.Contains(pMax))) { + if ((gp.CurrentPlot->PlotRect.Contains(pMin) || gp.CurrentPlot->PlotRect.Contains(pMax))) { // ImVec4 colAlpha = item->Color; // colAlpha.w = item->Highlight ? 1.0f : 0.9f; draw_list.AddRectFilled(pMin, pMax, ImGui::GetColorU32(s.Colors[ImPlotCol_Fill])); From b3f331fa230521318f87a9278236fa7f66fa6b8d Mon Sep 17 00:00:00 2001 From: Breno Cunha Queiroz Date: Tue, 11 Nov 2025 05:45:22 +0100 Subject: [PATCH 2/3] fix: digital plot demo not spanning whole x-axis --- implot_demo.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/implot_demo.cpp b/implot_demo.cpp index 9e0b5c4a..06a3add1 100644 --- a/implot_demo.cpp +++ b/implot_demo.cpp @@ -822,19 +822,22 @@ void Demo_DigitalPlots() { ImGui::Checkbox("analog_0", &showAnalog[0]); ImGui::SameLine(); ImGui::Checkbox("analog_1", &showAnalog[1]); - static float t = 0; + static float t = 0, last_t = 0; if (!paused) { t += ImGui::GetIO().DeltaTime; - //digital signal values - if (showDigital[0]) - dataDigital[0].AddPoint(t, sinf(2*t) > 0.45); - if (showDigital[1]) - dataDigital[1].AddPoint(t, sinf(2*t) < 0.45); - //Analog signal values - if (showAnalog[0]) - dataAnalog[0].AddPoint(t, sinf(2*t)); - if (showAnalog[1]) - dataAnalog[1].AddPoint(t, cosf(2*t)); + if (t - last_t >= 0.01f) { + last_t = t; + // Digital signal values + if (showDigital[0]) + dataDigital[0].AddPoint(t, sinf(2*t) > 0.45); + if (showDigital[1]) + dataDigital[1].AddPoint(t, sinf(2*t) < 0.45); + // Analog signal values + if (showAnalog[0]) + dataAnalog[0].AddPoint(t, sinf(2*t)); + if (showAnalog[1]) + dataAnalog[1].AddPoint(t, cosf(2*t)); + } } if (ImPlot::BeginPlot("##Digital")) { ImPlot::SetupAxisLimits(ImAxis_X1, t - 10.0, t, paused ? ImGuiCond_Once : ImGuiCond_Always); From 17db0f46e968a9d3953492cbe1eb80bb7bb55fe7 Mon Sep 17 00:00:00 2001 From: Breno Cunha Queiroz Date: Tue, 11 Nov 2025 06:17:05 +0100 Subject: [PATCH 3/3] fix: digital plots disappearing on y-axis inversion --- implot_items.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/implot_items.cpp b/implot_items.cpp index fd981c91..af03bf16 100644 --- a/implot_items.cpp +++ b/implot_items.cpp @@ -2738,8 +2738,9 @@ void PlotDigitalEx(const char* label_id, Getter getter, ImPlotDigitalFlags flags ImVec2 pMin = PlotToPixels(itemData1,IMPLOT_AUTO,IMPLOT_AUTO); ImVec2 pMax = PlotToPixels(itemData2,IMPLOT_AUTO,IMPLOT_AUTO); const int pixY_Offset = 0; //20 pixel from bottom due to mouse cursor label - pMin.y = (y_axis.PixelMin) + ((-gp.DigitalPlotOffset) - pixY_Offset); - pMax.y = (y_axis.PixelMin) + ((-gp.DigitalPlotOffset) - pixY_0 - (int)(pixY_1) - pixY_Offset); + const float y_ref = y_axis.IsInverted() ? y_axis.PixelMax : y_axis.PixelMin; + pMin.y = y_ref - (gp.DigitalPlotOffset + pixY_Offset); + pMax.y = y_ref - (gp.DigitalPlotOffset + pixY_0 + (int)pixY_1 + pixY_Offset); //plot only one rectangle for same digital state while (((i+2) < getter.Count) && (itemData1.y == itemData2.y)) { const int in = (i + 1);