From 17dba653a9bca435b04f195a42268bac258fd4ca Mon Sep 17 00:00:00 2001 From: SergeyN Date: Thu, 14 May 2020 01:52:47 +0200 Subject: [PATCH] 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); + } } //-----------------------------------------------------------------------------