From 99319d9fa7f0af3347a7dcf434f704f88e7fdecf Mon Sep 17 00:00:00 2001 From: ozlb Date: Tue, 12 May 2020 15:05:14 +0200 Subject: [PATCH 1/3] PlotDigital FitThisFrame issue FitThisFrame is triggering wrong fit for analog signals. It' not necessary due to actual nature of digital plot. --- implot.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/implot.cpp b/implot.cpp index 98cb7e8..de8e2ad 100644 --- a/implot.cpp +++ b/implot.cpp @@ -2563,14 +2563,6 @@ inline void PlotDigitalEx(const char* label_id, Getter getter, int count, int of if (gp.Style.Colors[ImPlotCol_Line].w != -1) item->Color = gp.Style.Colors[ImPlotCol_Line]; - // find data extents - if (gp.FitThisFrame) { - for (int i = 0; i < count; ++i) { - ImVec2 p = getter(i); - FitPoint(p); - } - } - ImGui::PushClipRect(gp.BB_Grid.Min, gp.BB_Grid.Max, true); bool cull = HasFlag(gp.CurrentPlot->Flags, ImPlotFlags_CullData); From 2a7430dae84972fa877682ef04c0aa66eceea6eb Mon Sep 17 00:00:00 2001 From: ozlb Date: Wed, 13 May 2020 11:10:14 +0200 Subject: [PATCH 2/3] FitPoint on x --- implot.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/implot.cpp b/implot.cpp index de8e2ad..8a192c9 100644 --- a/implot.cpp +++ b/implot.cpp @@ -2562,7 +2562,15 @@ inline void PlotDigitalEx(const char* label_id, Getter getter, int count, int of if (gp.Style.Colors[ImPlotCol_Line].w != -1) item->Color = gp.Style.Colors[ImPlotCol_Line]; - + + // find data extents + if (gp.FitThisFrame) { + for (int i = 0; i < count; ++i) { + ImVec2 p = getter(i); + FitPoint(ImVec2(p.x, 0)); + } + } + ImGui::PushClipRect(gp.BB_Grid.Min, gp.BB_Grid.Max, true); bool cull = HasFlag(gp.CurrentPlot->Flags, ImPlotFlags_CullData); From 17dba653a9bca435b04f195a42268bac258fd4ca Mon Sep 17 00:00:00 2001 From: SergeyN Date: Thu, 14 May 2020 01:52:47 +0200 Subject: [PATCH 3/3] bbox overlap test to avoid disappearing lines when two ends end up outside culling area --- implot.cpp | 59 +++++++++++++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/implot.cpp b/implot.cpp index 45aa640..c8245e1 100644 --- a/implot.cpp +++ b/implot.cpp @@ -2090,39 +2090,34 @@ inline void RenderLineStrip(Transformer transformer, ImDrawList& DrawList, Gette if (i_start >= count ) i_start -= count; int i_end = offset + count; if (i_end >= count) i_end -= count; + + const int segments = count - 1; + ImVec2 p1 = transformer(getter(offset)); + if (HasFlag(gp.CurrentPlot->Flags, ImPlotFlags_AntiAliased)) { + for (int i1 = i_start; i1 != i_end; i1 = i1 + 1 < count ? i1 + 1 : i1 + 1 - count) { + ImVec2 p2 = transformer(getter(i1)); - const int segments = count - 1; - ImVec2 p1 = transformer(getter(offset)); - bool test1 = !cull || gp.BB_Grid.Contains(p1); - if (HasFlag(gp.CurrentPlot->Flags, ImPlotFlags_AntiAliased)) { - for (int i1 = i_start; i1 != i_end; i1 = i1 + 1 < count ? i1 + 1 : i1 + 1 - count) - { - ImVec2 p2 = transformer(getter(i1)); - bool test2 = !cull || gp.BB_Grid.Contains(p2); - if (test1 | test2) - RenderLineAA(DrawList, p1, p2, line_weight, col_line); - p1 = p2; - test1 = test2; - } - } - else { - const ImVec2 uv = DrawList._Data->TexUvWhitePixel; - DrawList.PrimReserve(segments * 6, segments * 4); - int segments_culled = 0; - for (int i1 = i_start; i1 != i_end; i1 = i1 + 1 < count ? i1 + 1 : i1 + 1 - count) - { - ImVec2 p2 = transformer(getter(i1)); - bool test2 = !cull || gp.BB_Grid.Contains(p2); - if (test1 | test2) - RenderLine(DrawList, p1, p2, line_weight, col_line, uv); - else - segments_culled++; - p1 = p2; - test1 = test2; - } - if (segments_culled > 0) - DrawList.PrimUnreserve(segments_culled * 6, segments_culled * 4); - } + if (!cull || gp.BB_Grid.Overlaps(ImRect(ImMin(p1,p2), ImMax(p1,p2)))) + RenderLineAA(DrawList, p1, p2, line_weight, col_line); + p1 = p2; + } + } + else { + const ImVec2 uv = DrawList._Data->TexUvWhitePixel; + DrawList.PrimReserve(segments * 6, segments * 4); + int segments_culled = 0; + for (int i1 = i_start; i1 != i_end; i1 = i1 + 1 < count ? i1 + 1 : i1 + 1 - count) { + ImVec2 p2 = transformer(getter(i1)); + + if (!cull || gp.BB_Grid.Overlaps(ImRect(ImMin(p1, p2), ImMax(p1, p2)))) + RenderLine(DrawList, p1, p2, line_weight, col_line, uv); + else + segments_culled++; + p1 = p2; + } + if (segments_culled > 0) + DrawList.PrimUnreserve(segments_culled * 6, segments_culled * 4); + } } //-----------------------------------------------------------------------------