1
0
Fork 0
mirror of https://github.com/gwm17/implot.git synced 2024-10-09 23:57:26 -04:00

Merge pull request #64 from ozlb/patch-2

Fix circular buffer rollover (issue #60)
This commit is contained in:
Evan Pezent 2020-06-15 21:21:55 -05:00 committed by GitHub
commit 307205bb7f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3311,13 +3311,16 @@ inline void PlotDigitalEx(const char* label_id, Getter getter, int count, int of
const int segments = count - 1; const int segments = count - 1;
int i1 = offset; int i1 = offset;
int pixYMax = 0; int pixYMax = 0;
for (int s = 0; s < segments; ++s) { ImPlotPoint itemData1 = getter(0);
const int i2 = (i1 + 1) % count; for (int i = 0; i < getter.Count; ++i) {
ImPlotPoint itemData1 = getter(i1); ImPlotPoint itemData2 = getter(i);
ImPlotPoint itemData2 = getter(i2); if (NanOrInf(itemData1.y)) {
i1 = i2; itemData1 = itemData2;
continue;
}
if (NanOrInf(itemData2.y)) itemData2.y = ConstrainNan(ConstrainInf(itemData2.y));
int pixY_0 = (int)(line_weight); int pixY_0 = (int)(line_weight);
itemData1.y = itemData1.y < 0 ? 0 : itemData1.y; itemData1.y = ImMax(0.0, itemData1.y);
float pixY_1_float = gp.Style.DigitalBitHeight * (float)itemData1.y; float pixY_1_float = gp.Style.DigitalBitHeight * (float)itemData1.y;
int pixY_1 = (int)(pixY_1_float); //allow only positive values int pixY_1 = (int)(pixY_1_float); //allow only positive values
int pixY_chPosOffset = (int)(ImMax(gp.Style.DigitalBitHeight, pixY_1_float) + gp.Style.DigitalBitGap); int pixY_chPosOffset = (int)(ImMax(gp.Style.DigitalBitHeight, pixY_1_float) + gp.Style.DigitalBitGap);
@ -3328,12 +3331,12 @@ inline void PlotDigitalEx(const char* label_id, Getter getter, int count, int of
pMin.y = (gp.PixelRange[y_axis].Min.y) + ((-gp.DigitalPlotOffset) - pixY_Offset); pMin.y = (gp.PixelRange[y_axis].Min.y) + ((-gp.DigitalPlotOffset) - pixY_Offset);
pMax.y = (gp.PixelRange[y_axis].Min.y) + ((-gp.DigitalPlotOffset) - pixY_0 - pixY_1 - pixY_Offset); pMax.y = (gp.PixelRange[y_axis].Min.y) + ((-gp.DigitalPlotOffset) - pixY_0 - pixY_1 - pixY_Offset);
//plot only one rectangle for same digital state //plot only one rectangle for same digital state
while (((s+2) < segments) && (itemData1.y == itemData2.y)) { while (((i+2) < getter.Count) && (itemData1.y == itemData2.y)) {
const int i3 = (i1 + 1) % count; const int in = (i + 1);
itemData2 = getter(i3); itemData2 = getter(in);
if (NanOrInf(itemData2.y)) break;
pMax.x = PlotToPixels(itemData2).x; pMax.x = PlotToPixels(itemData2).x;
i1 = i3; i++;
s++;
} }
//do not extend plot outside plot range //do not extend plot outside plot range
if (pMin.x < gp.PixelRange[y_axis].Min.x) pMin.x = gp.PixelRange[y_axis].Min.x; if (pMin.x < gp.PixelRange[y_axis].Min.x) pMin.x = gp.PixelRange[y_axis].Min.x;
@ -3346,6 +3349,7 @@ inline void PlotDigitalEx(const char* label_id, Getter getter, int count, int of
colAlpha.w = item->Highlight ? 1.0f : 0.9f; colAlpha.w = item->Highlight ? 1.0f : 0.9f;
DrawList.AddRectFilled(pMin, pMax, ImGui::GetColorU32(colAlpha)); DrawList.AddRectFilled(pMin, pMax, ImGui::GetColorU32(colAlpha));
} }
itemData1 = itemData2;
} }
gp.DigitalPlotItemCnt++; gp.DigitalPlotItemCnt++;
gp.DigitalPlotOffset += pixYMax; gp.DigitalPlotOffset += pixYMax;