mirror of
https://github.com/gwm17/implot.git
synced 2024-11-13 22:48:50 -05:00
Cleanup and pixel density optimization
This commit is contained in:
parent
2338c9b4c9
commit
33ffd8e5c6
161
implot.cpp
161
implot.cpp
|
@ -1766,6 +1766,12 @@ void Plot(const char* label_id, ImVec2 (*getter)(void* data, int idx), void* dat
|
||||||
p1 = gp.ToPixels(getter(data, i1));
|
p1 = gp.ToPixels(getter(data, i1));
|
||||||
p2 = gp.ToPixels(getter(data, i2));
|
p2 = gp.ToPixels(getter(data, i2));
|
||||||
i1 = i2;
|
i1 = i2;
|
||||||
|
while (((s+1) < segments) && (round(p2.x) == round(p1.x))) {
|
||||||
|
const int i2 = (i1 + 1) % count;
|
||||||
|
p2 = ImMax(p2, gp.ToPixels(getter(data, i2)));
|
||||||
|
i1 = i2;
|
||||||
|
s++;
|
||||||
|
}
|
||||||
if (!cull || gp.BB_Grid.Contains(p1) || gp.BB_Grid.Contains(p2))
|
if (!cull || gp.BB_Grid.Contains(p1) || gp.BB_Grid.Contains(p2))
|
||||||
DrawList.AddLine(p1, p2, col_line, line_weight);
|
DrawList.AddLine(p1, p2, col_line, line_weight);
|
||||||
}
|
}
|
||||||
|
@ -1781,6 +1787,13 @@ void Plot(const char* label_id, ImVec2 (*getter)(void* data, int idx), void* dat
|
||||||
p1 = gp.ToPixels(getter(data, i1));
|
p1 = gp.ToPixels(getter(data, i1));
|
||||||
p2 = gp.ToPixels(getter(data, i2));
|
p2 = gp.ToPixels(getter(data, i2));
|
||||||
i1 = i2;
|
i1 = i2;
|
||||||
|
while (((s+1) < segments) && (round(p2.x) == round(p1.x))) {
|
||||||
|
segments_culled++;
|
||||||
|
const int i2 = (i1 + 1) % count;
|
||||||
|
p2 = ImMax(p2, gp.ToPixels(getter(data, i2)));
|
||||||
|
i1 = i2;
|
||||||
|
s++;
|
||||||
|
}
|
||||||
if (!cull || gp.BB_Grid.Contains(p1) || gp.BB_Grid.Contains(p2)) {
|
if (!cull || gp.BB_Grid.Contains(p1) || gp.BB_Grid.Contains(p2)) {
|
||||||
float dx = p2.x - p1.x;
|
float dx = p2.x - p1.x;
|
||||||
float dy = p2.y - p1.y;
|
float dy = p2.y - p1.y;
|
||||||
|
@ -1857,154 +1870,6 @@ void Plot(const char* label_id, ImVec2 (*getter)(void* data, int idx), void* dat
|
||||||
ImGui::PopClipRect();
|
ImGui::PopClipRect();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlotP(const char* label_id, const float* xs, const float* ys, int count, int offset) {
|
|
||||||
IM_ASSERT_USER_ERROR(gp.CurrentPlot != NULL, "PlotP() Needs to be called between BeginPlot() and EndPlot()!");
|
|
||||||
|
|
||||||
ImPlotItem* item = gp.RegisterItem(label_id);
|
|
||||||
if (!item->Show)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ImDrawList &DrawList = *ImGui::GetWindowDrawList();
|
|
||||||
|
|
||||||
const bool rend_line = gp.Style.Colors[ImPlotCol_Line].w != 0 && gp.Style.LineWeight > 0;
|
|
||||||
const bool rend_mk_line = gp.Style.Colors[ImPlotCol_MarkerOutline].w != 0 && gp.Style.MarkerWeight > 0;
|
|
||||||
const bool rend_mk_fill = gp.Style.Colors[ImPlotCol_MarkerFill].w != 0;
|
|
||||||
|
|
||||||
ImU32 col_line = gp.Style.Colors[ImPlotCol_Line].w == -1 ? GetColorU32(item->Color) : GetColorU32(gp.Style.Colors[ImPlotCol_Line]);
|
|
||||||
ImU32 col_mk_line = gp.Style.Colors[ImPlotCol_MarkerOutline].w == -1 ? col_line : GetColorU32(gp.Style.Colors[ImPlotCol_MarkerOutline]);
|
|
||||||
ImU32 col_mk_fill = gp.Style.Colors[ImPlotCol_MarkerFill].w == -1 ? col_line : GetColorU32(gp.Style.Colors[ImPlotCol_MarkerFill]);
|
|
||||||
|
|
||||||
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 = {xs[i], ys[i]};
|
|
||||||
gp.FitPoint(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::PushClipRect(gp.BB_Grid.Min, gp.BB_Grid.Max, true);
|
|
||||||
bool cull = HasFlag(gp.CurrentPlot->Flags, ImPlotFlags_CullData);
|
|
||||||
|
|
||||||
const float line_weight = item->Highlight ? gp.Style.LineWeight * 2 : gp.Style.LineWeight;
|
|
||||||
|
|
||||||
// render line segments
|
|
||||||
if (count > 1 && rend_line) {
|
|
||||||
const int segments = count - 1;
|
|
||||||
int i1 = offset;
|
|
||||||
ImVec2 p1, p2;
|
|
||||||
if (HasFlag(gp.CurrentPlot->Flags, ImPlotFlags_AntiAliased)) {
|
|
||||||
for (int s = 0; s < segments; ++s) {
|
|
||||||
const int i2 = (i1 + 1) % count;
|
|
||||||
p1 = gp.ToPixels({xs[i1], ys[i1]});
|
|
||||||
p2 = gp.ToPixels({xs[i2], ys[i2]});
|
|
||||||
i1 = i2;
|
|
||||||
while (((s+1) < segments) && (round(p2.x) == round(p1.x))) {
|
|
||||||
const int i2 = (i1 + 1) % count;
|
|
||||||
p2 = ImMax(p2, gp.ToPixels({xs[i2], ys[i2]}));
|
|
||||||
i1 = i2;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
if (!cull || gp.BB_Grid.Contains(p1) || gp.BB_Grid.Contains(p2))
|
|
||||||
DrawList.AddLine(p1, p2, col_line, line_weight);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const int idx_count = segments * 6;
|
|
||||||
const int vtx_count = segments * 4;
|
|
||||||
const ImVec2 uv = DrawList._Data->TexUvWhitePixel;
|
|
||||||
DrawList.PrimReserve(idx_count, vtx_count);
|
|
||||||
int segments_culled = 0;
|
|
||||||
for (int s = 0; s < segments; ++s) {
|
|
||||||
const int i2 = (i1 + 1) % count;
|
|
||||||
p1 = gp.ToPixels({xs[i1], ys[i1]});
|
|
||||||
p2 = gp.ToPixels({xs[i2], ys[i2]});
|
|
||||||
i1 = i2;
|
|
||||||
while (((s+1) < segments) && (round(p2.x) == round(p1.x))) {
|
|
||||||
segments_culled++;
|
|
||||||
const int i2 = (i1 + 1) % count;
|
|
||||||
p2 = ImMax(p2, gp.ToPixels({xs[i2], ys[i2]}));
|
|
||||||
i1 = i2;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
if (!cull || gp.BB_Grid.Contains(p1) || gp.BB_Grid.Contains(p2)) {
|
|
||||||
float dx = p2.x - p1.x;
|
|
||||||
float dy = p2.y - p1.y;
|
|
||||||
IM_NORMALIZE2F_OVER_ZERO(dx, dy);
|
|
||||||
dx *= (line_weight * 0.5f);
|
|
||||||
dy *= (line_weight * 0.5f);
|
|
||||||
DrawList._VtxWritePtr[0].pos.x = p1.x + dy;
|
|
||||||
DrawList._VtxWritePtr[0].pos.y = p1.y - dx;
|
|
||||||
DrawList._VtxWritePtr[0].uv = uv;
|
|
||||||
DrawList._VtxWritePtr[0].col = col_line;
|
|
||||||
DrawList._VtxWritePtr[1].pos.x = p2.x + dy;
|
|
||||||
DrawList._VtxWritePtr[1].pos.y = p2.y - dx;
|
|
||||||
DrawList._VtxWritePtr[1].uv = uv;
|
|
||||||
DrawList._VtxWritePtr[1].col = col_line;
|
|
||||||
DrawList._VtxWritePtr[2].pos.x = p2.x - dy;
|
|
||||||
DrawList._VtxWritePtr[2].pos.y = p2.y + dx;
|
|
||||||
DrawList._VtxWritePtr[2].uv = uv;
|
|
||||||
DrawList._VtxWritePtr[2].col = col_line;
|
|
||||||
DrawList._VtxWritePtr[3].pos.x = p1.x - dy;
|
|
||||||
DrawList._VtxWritePtr[3].pos.y = p1.y + dx;
|
|
||||||
DrawList._VtxWritePtr[3].uv = uv;
|
|
||||||
DrawList._VtxWritePtr[3].col = col_line;
|
|
||||||
DrawList._VtxWritePtr += 4;
|
|
||||||
DrawList._IdxWritePtr[0] = (ImDrawIdx)(DrawList._VtxCurrentIdx);
|
|
||||||
DrawList._IdxWritePtr[1] = (ImDrawIdx)(DrawList._VtxCurrentIdx + 1);
|
|
||||||
DrawList._IdxWritePtr[2] = (ImDrawIdx)(DrawList._VtxCurrentIdx + 2);
|
|
||||||
DrawList._IdxWritePtr[3] = (ImDrawIdx)(DrawList._VtxCurrentIdx);
|
|
||||||
DrawList._IdxWritePtr[4] = (ImDrawIdx)(DrawList._VtxCurrentIdx + 2);
|
|
||||||
DrawList._IdxWritePtr[5] = (ImDrawIdx)(DrawList._VtxCurrentIdx + 3);
|
|
||||||
DrawList._IdxWritePtr += 6;
|
|
||||||
DrawList._VtxCurrentIdx += 4;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
segments_culled++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (segments_culled > 0)
|
|
||||||
DrawList.PrimUnreserve(segments_culled * 6, segments_culled * 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// render markers
|
|
||||||
if (gp.Style.Marker != ImMarker_None) {
|
|
||||||
int idx = offset;
|
|
||||||
for (int i = 0; i < count; ++i) {
|
|
||||||
ImVec2 c;
|
|
||||||
c = gp.ToPixels({xs[idx], ys[idx]});
|
|
||||||
idx = (idx + 1) % count;
|
|
||||||
if (!cull || gp.BB_Grid.Contains(c)) {
|
|
||||||
// TODO: Optimize the loop and if statements, this is atrocious
|
|
||||||
if (HasFlag(gp.Style.Marker, ImMarker_Circle))
|
|
||||||
MakerCircle(DrawList, c, gp.Style.MarkerSize, rend_mk_line, col_mk_line, rend_mk_fill, col_mk_fill, gp.Style.MarkerWeight);
|
|
||||||
if (HasFlag(gp.Style.Marker, ImMarker_Square))
|
|
||||||
MarkerSquare(DrawList, c, gp.Style.MarkerSize, rend_mk_line, col_mk_line, rend_mk_fill, col_mk_fill, gp.Style.MarkerWeight);
|
|
||||||
if (HasFlag(gp.Style.Marker, ImMarker_Diamond))
|
|
||||||
MarkerDiamond(DrawList, c, gp.Style.MarkerSize, rend_mk_line, col_mk_line, rend_mk_fill, col_mk_fill, gp.Style.MarkerWeight);
|
|
||||||
if (HasFlag(gp.Style.Marker, ImMarker_Up))
|
|
||||||
MarkerUp(DrawList, c, gp.Style.MarkerSize, rend_mk_line, col_mk_line, rend_mk_fill, col_mk_fill, gp.Style.MarkerWeight);
|
|
||||||
if (HasFlag(gp.Style.Marker, ImMarker_Down))
|
|
||||||
MarkerDown(DrawList, c, gp.Style.MarkerSize, rend_mk_line, col_mk_line, rend_mk_fill, col_mk_fill, gp.Style.MarkerWeight);
|
|
||||||
if (HasFlag(gp.Style.Marker, ImMarker_Left))
|
|
||||||
MarkerLeft(DrawList, c, gp.Style.MarkerSize, rend_mk_line, col_mk_line, rend_mk_fill, col_mk_fill, gp.Style.MarkerWeight);
|
|
||||||
if (HasFlag(gp.Style.Marker, ImMarker_Right))
|
|
||||||
MarkerRight(DrawList, c, gp.Style.MarkerSize, rend_mk_line, col_mk_line, rend_mk_fill, col_mk_fill, gp.Style.MarkerWeight);
|
|
||||||
if (HasFlag(gp.Style.Marker, ImMarker_Cross))
|
|
||||||
MarkerCross(DrawList, c, gp.Style.MarkerSize, rend_mk_line, col_mk_line, rend_mk_fill, col_mk_fill, gp.Style.MarkerWeight);
|
|
||||||
if (HasFlag(gp.Style.Marker, ImMarker_Plus))
|
|
||||||
MarkerPlus(DrawList, c, gp.Style.MarkerSize, rend_mk_line, col_mk_line, rend_mk_fill, col_mk_fill, gp.Style.MarkerWeight);
|
|
||||||
if (HasFlag(gp.Style.Marker, ImMarker_Asterisk))
|
|
||||||
MarkerAsterisk(DrawList, c, gp.Style.MarkerSize, rend_mk_line, col_mk_line, rend_mk_fill, col_mk_fill, gp.Style.MarkerWeight);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ImGui::PopClipRect();
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void PlotDigital(const char* label_id, const float* xs, const float* ys, int count, int offset, int stride) {
|
void PlotDigital(const char* label_id, const float* xs, const float* ys, int count, int offset, int stride) {
|
||||||
|
|
7
implot.h
7
implot.h
|
@ -159,10 +159,6 @@ void EndPlot();
|
||||||
void Plot(const char* label_id, const float* values, int count, int offset = 0, int stride = sizeof(float));
|
void Plot(const char* label_id, const float* values, int count, int offset = 0, int stride = sizeof(float));
|
||||||
void Plot(const char* label_id, const float* xs, const float* ys, int count, int offset = 0, int stride = sizeof(float));
|
void Plot(const char* label_id, const float* xs, const float* ys, int count, int offset = 0, int stride = sizeof(float));
|
||||||
void Plot(const char* label_id, ImVec2 (*getter)(void* data, int idx), void* data, int count, int offset = 0);
|
void Plot(const char* label_id, ImVec2 (*getter)(void* data, int idx), void* data, int count, int offset = 0);
|
||||||
void PlotP(const char* label_id, const float* xs, const float* ys, int count, int offset = 0);
|
|
||||||
// Plots digital channels.
|
|
||||||
void PlotDigital(const char* label_id, const float* xs, const float* ys, int count, int offset = 0, int stride = sizeof(float) + sizeof(bool));
|
|
||||||
void PlotDigital(const char* label_id, ImVec2 (*getter)(void* data, int idx), void* data, int count, int offset = 0);
|
|
||||||
// Plots vertical bars.
|
// Plots vertical bars.
|
||||||
void PlotBar(const char* label_id, const float* values, int count, float width = 0.67f, float shift = 0, int offset = 0, int stride = sizeof(float));
|
void PlotBar(const char* label_id, const float* values, int count, float width = 0.67f, float shift = 0, int offset = 0, int stride = sizeof(float));
|
||||||
void PlotBar(const char* label_id, const float* xs, const float* ys, int count, float width, int offset = 0, int stride = sizeof(float));
|
void PlotBar(const char* label_id, const float* xs, const float* ys, int count, float width, int offset = 0, int stride = sizeof(float));
|
||||||
|
@ -177,6 +173,9 @@ void PlotErrorBars(const char* label_id, const float* xs, const float* ys, const
|
||||||
void PlotErrorBars(const char* label_id, ImVec4 (*getter)(void* data, int idx), void* data, int count, int offset = 0);
|
void PlotErrorBars(const char* label_id, ImVec4 (*getter)(void* data, int idx), void* data, int count, int offset = 0);
|
||||||
// Plots a text label at point x,y.
|
// Plots a text label at point x,y.
|
||||||
void PlotLabel(const char* text, float x, float y, bool vertical = false, const ImVec2& pixel_offset = ImVec2(0,0));
|
void PlotLabel(const char* text, float x, float y, bool vertical = false, const ImVec2& pixel_offset = ImVec2(0,0));
|
||||||
|
// Plots digital channels.
|
||||||
|
void PlotDigital(const char* label_id, const float* xs, const float* ys, int count, int offset = 0, int stride = sizeof(float) + sizeof(bool));
|
||||||
|
void PlotDigital(const char* label_id, ImVec2 (*getter)(void* data, int idx), void* data, int count, int offset = 0);
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Plot Queries
|
// Plot Queries
|
||||||
|
|
|
@ -687,7 +687,7 @@ void ShowImPlotDemoWindow(bool* p_open) {
|
||||||
for (int i = 0; i < 100; ++i) {
|
for (int i = 0; i < 100; ++i) {
|
||||||
sprintf(buff, "item_%d",i);
|
sprintf(buff, "item_%d",i);
|
||||||
ImGui::PushPlotColor(ImPlotCol_Line, items[i].Col);
|
ImGui::PushPlotColor(ImPlotCol_Line, items[i].Col);
|
||||||
ImGui::PlotP(buff, items[i].Xs, items[i].Ys, 1000, 0);
|
ImGui::Plot(buff, items[i].Xs, items[i].Ys, 1000, 0, 2 * sizeof(float));
|
||||||
ImGui::PopPlotColor();
|
ImGui::PopPlotColor();
|
||||||
}
|
}
|
||||||
ImGui::EndPlot();
|
ImGui::EndPlot();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user