Columns: Clipping columns borders on Y axis on CPU because some GPU drivers appears to be unhappy with triangle spanning large regions (not sure why tbh). (#125)

Demo: Columns: Adding a billion of extra lines and using clipper.
This commit is contained in:
omar 2017-11-14 22:40:57 +01:00
parent 0858c3d7cb
commit 6001d9c7a4
2 changed files with 14 additions and 8 deletions

View File

@ -10511,9 +10511,10 @@ void ImGui::EndColumns()
} }
// Draw column // Draw column
// We clip the Y boundaries CPU side because very long triangles are mishandled by some GPU drivers.
const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator);
const float xi = (float)(int)x; const float xi = (float)(int)x;
window->DrawList->AddLine(ImVec2(xi, y1 + 1.0f), ImVec2(xi, y2), col); window->DrawList->AddLine(ImVec2(xi, ImMax(y1 + 1.0f, window->ClipRect.Min.y)), ImVec2(xi, ImMin(y2, window->ClipRect.Max.y)), col);
} }
// Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame. // Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame.

View File

@ -1652,14 +1652,19 @@ void ImGui::ShowTestWindow(bool* p_open)
if (ImGui::TreeNode("Horizontal Scrolling")) if (ImGui::TreeNode("Horizontal Scrolling"))
{ {
ImGui::SetNextWindowContentWidth(1500); ImGui::SetNextWindowContentWidth(1500);
ImGui::BeginChild("##scrollingregion", ImVec2(0, 120), false, ImGuiWindowFlags_HorizontalScrollbar); ImGui::BeginChild("##ScrollingRegion", ImVec2(0, ImGui::GetFontSize() * 20), false, ImGuiWindowFlags_HorizontalScrollbar);
ImGui::Columns(10); ImGui::Columns(10);
for (int i = 0; i < 20; i++) int ITEMS_COUNT = 2000;
for (int j = 0; j < 10; j++) ImGuiListClipper clipper(ITEMS_COUNT); // Also demonstrate using the clipper for large list
{ while (clipper.Step())
ImGui::Text("Line %d Column %d...", i, j); {
ImGui::NextColumn(); for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
} for (int j = 0; j < 10; j++)
{
ImGui::Text("Line %d Column %d...", i, j);
ImGui::NextColumn();
}
}
ImGui::Columns(1); ImGui::Columns(1);
ImGui::EndChild(); ImGui::EndChild();
ImGui::TreePop(); ImGui::TreePop();