1
0
Fork 0
mirror of https://github.com/gwm17/implot.git synced 2024-11-26 20:28:50 -05:00

PlotDigitalEx fix NAN values and fix circular buffer rollover (issue #60)

Fixes issue #60 (circular buffer rollover)
This commit is contained in:
ozlb 2020-06-14 22:28:01 +02:00 committed by GitHub
parent fcbbc6c735
commit 4cf06cf52c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3290,13 +3290,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);
@ -3307,12 +3310,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;
@ -3325,6 +3328,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;