mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Metrics: Added "Show windows rectangles" tool to visualize the different rectangles.
This commit is contained in:
parent
742b5f4c68
commit
7baf45cffa
@ -53,6 +53,7 @@ Other Changes:
|
|||||||
- Window: Window close button is horizontally aligned with style.FramePadding.x.
|
- Window: Window close button is horizontally aligned with style.FramePadding.x.
|
||||||
- Misc: Added IM_MALLOC/IM_FREE macros mimicking IM_NEW/IM_DELETE so user doesn't need to revert
|
- Misc: Added IM_MALLOC/IM_FREE macros mimicking IM_NEW/IM_DELETE so user doesn't need to revert
|
||||||
to using the ImGui::MemAlloc()/MemFree() calls directly.
|
to using the ImGui::MemAlloc()/MemFree() calls directly.
|
||||||
|
- Metrics: Added "Show windows rectangles" tool to visualize the different rectangles.
|
||||||
- Examples: OpenGL: Added a dummy GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized
|
- Examples: OpenGL: Added a dummy GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized
|
||||||
GL function loaders early, and help users understand what they are missing. (#2421)
|
GL function loaders early, and help users understand what they are missing. (#2421)
|
||||||
- Examples: Emscripten: Added Emscripten+SDL+GLES2 example. (#2494, #2492, #2351, #336) [@nicolasnoble]
|
- Examples: Emscripten: Added Emscripten+SDL+GLES2 example. (#2494, #2492, #2351, #336) [@nicolasnoble]
|
||||||
|
85
imgui.cpp
85
imgui.cpp
@ -9500,16 +9500,18 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool show_draw_cmd_clip_rects = true;
|
enum { RT_OuterRect, RT_OuterRectClipped, RT_InnerMainRect, RT_InnerClipRect, RT_ContentsRegionRect, RT_ContentsFullRect };
|
||||||
static bool show_window_begin_order = false;
|
static bool show_windows_begin_order = false;
|
||||||
|
static bool show_windows_rects = false;
|
||||||
|
static int show_windows_rect_type = RT_ContentsRegionRect;
|
||||||
|
static bool show_drawcmd_clip_rects = true;
|
||||||
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
ImGui::Text("Dear ImGui %s", ImGui::GetVersion());
|
ImGui::Text("Dear ImGui %s", ImGui::GetVersion());
|
||||||
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
|
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
|
||||||
ImGui::Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3);
|
ImGui::Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3);
|
||||||
ImGui::Text("%d active windows (%d visible)", io.MetricsActiveWindows, io.MetricsRenderWindows);
|
ImGui::Text("%d active windows (%d visible)", io.MetricsActiveWindows, io.MetricsRenderWindows);
|
||||||
ImGui::Text("%d allocations", io.MetricsActiveAllocations);
|
ImGui::Text("%d active allocations", io.MetricsActiveAllocations);
|
||||||
ImGui::Checkbox("Show clipping rectangles when hovering draw commands", &show_draw_cmd_clip_rects);
|
|
||||||
ImGui::Checkbox("Ctrl shows window begin order", &show_window_begin_order);
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
struct Funcs
|
struct Funcs
|
||||||
@ -9543,7 +9545,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
}
|
}
|
||||||
ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL;
|
ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL;
|
||||||
bool pcmd_node_open = ImGui::TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "Draw %4d %s vtx, tex 0x%p, clip_rect (%4.0f,%4.0f)-(%4.0f,%4.0f)", pcmd->ElemCount, draw_list->IdxBuffer.Size > 0 ? "indexed" : "non-indexed", pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
|
bool pcmd_node_open = ImGui::TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "Draw %4d %s vtx, tex 0x%p, clip_rect (%4.0f,%4.0f)-(%4.0f,%4.0f)", pcmd->ElemCount, draw_list->IdxBuffer.Size > 0 ? "indexed" : "non-indexed", pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
|
||||||
if (show_draw_cmd_clip_rects && fg_draw_list && ImGui::IsItemHovered())
|
if (show_drawcmd_clip_rects && fg_draw_list && ImGui::IsItemHovered())
|
||||||
{
|
{
|
||||||
ImRect clip_rect = pcmd->ClipRect;
|
ImRect clip_rect = pcmd->ClipRect;
|
||||||
ImRect vtxs_rect;
|
ImRect vtxs_rect;
|
||||||
@ -9585,6 +9587,16 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void NodeColumns(const ImGuiColumns* columns)
|
||||||
|
{
|
||||||
|
if (!ImGui::TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags))
|
||||||
|
return;
|
||||||
|
ImGui::BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->MaxX - columns->MinX, columns->MinX, columns->MaxX);
|
||||||
|
for (int column_n = 0; column_n < columns->Columns.Size; column_n++)
|
||||||
|
ImGui::BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, OffsetNormToPixels(columns, columns->Columns[column_n].OffsetNorm));
|
||||||
|
ImGui::TreePop();
|
||||||
|
}
|
||||||
|
|
||||||
static void NodeWindows(ImVector<ImGuiWindow*>& windows, const char* label)
|
static void NodeWindows(ImVector<ImGuiWindow*>& windows, const char* label)
|
||||||
{
|
{
|
||||||
if (!ImGui::TreeNode(label, "%s (%d)", label, windows.Size))
|
if (!ImGui::TreeNode(label, "%s (%d)", label, windows.Size))
|
||||||
@ -9596,8 +9608,15 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
|
|
||||||
static void NodeWindow(ImGuiWindow* window, const char* label)
|
static void NodeWindow(ImGuiWindow* window, const char* label)
|
||||||
{
|
{
|
||||||
if (!ImGui::TreeNode(window, "%s '%s', %d @ 0x%p", label, window->Name, window->Active || window->WasActive, window))
|
bool node_open = ImGui::TreeNode(window, "%s '%s', %d @ 0x%p", label, window->Name, window->Active || window->WasActive, window);
|
||||||
|
if (show_windows_rects && ImGui::IsItemHovered())
|
||||||
|
if (ImDrawList* fg_draw_list = GetForegroundDrawList(window))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!node_open)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ImGuiWindowFlags flags = window->Flags;
|
ImGuiWindowFlags flags = window->Flags;
|
||||||
NodeDrawList(window, window->DrawList, "DrawList");
|
NodeDrawList(window, window->DrawList, "DrawList");
|
||||||
ImGui::BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), SizeContents (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->SizeContents.x, window->SizeContents.y);
|
ImGui::BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), SizeContents (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->SizeContents.x, window->SizeContents.y);
|
||||||
@ -9620,16 +9639,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
if (window->ColumnsStorage.Size > 0 && ImGui::TreeNode("Columns", "Columns sets (%d)", window->ColumnsStorage.Size))
|
if (window->ColumnsStorage.Size > 0 && ImGui::TreeNode("Columns", "Columns sets (%d)", window->ColumnsStorage.Size))
|
||||||
{
|
{
|
||||||
for (int n = 0; n < window->ColumnsStorage.Size; n++)
|
for (int n = 0; n < window->ColumnsStorage.Size; n++)
|
||||||
{
|
NodeColumns(&window->ColumnsStorage[n]);
|
||||||
const ImGuiColumns* columns = &window->ColumnsStorage[n];
|
|
||||||
if (ImGui::TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags))
|
|
||||||
{
|
|
||||||
ImGui::BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->MaxX - columns->MinX, columns->MinX, columns->MaxX);
|
|
||||||
for (int column_n = 0; column_n < columns->Columns.Size; column_n++)
|
|
||||||
ImGui::BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, OffsetNormToPixels(columns, columns->Columns[column_n].OffsetNorm));
|
|
||||||
ImGui::TreePop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
ImGui::BulletText("Storage: %d bytes", window->StateStorage.Data.Size * (int)sizeof(ImGuiStorage::Pair));
|
ImGui::BulletText("Storage: %d bytes", window->StateStorage.Data.Size * (int)sizeof(ImGuiStorage::Pair));
|
||||||
@ -9668,6 +9678,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
Funcs::NodeDrawList(NULL, g.DrawDataBuilder.Layers[0][i], "DrawList");
|
Funcs::NodeDrawList(NULL, g.DrawDataBuilder.Layers[0][i], "DrawList");
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size))
|
if (ImGui::TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size))
|
||||||
{
|
{
|
||||||
for (int i = 0; i < g.OpenPopupStack.Size; i++)
|
for (int i = 0; i < g.OpenPopupStack.Size; i++)
|
||||||
@ -9677,12 +9688,14 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
}
|
}
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::TreeNode("TabBars", "Tab Bars (%d)", g.TabBars.Data.Size))
|
if (ImGui::TreeNode("TabBars", "Tab Bars (%d)", g.TabBars.Data.Size))
|
||||||
{
|
{
|
||||||
for (int n = 0; n < g.TabBars.Data.Size; n++)
|
for (int n = 0; n < g.TabBars.Data.Size; n++)
|
||||||
Funcs::NodeTabBar(g.TabBars.GetByIndex(n));
|
Funcs::NodeTabBar(g.TabBars.GetByIndex(n));
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::TreeNode("Internal state"))
|
if (ImGui::TreeNode("Internal state"))
|
||||||
{
|
{
|
||||||
const char* input_source_names[] = { "None", "Mouse", "Nav", "NavKeyboard", "NavGamepad" }; IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT);
|
const char* input_source_names[] = { "None", "Mouse", "Nav", "NavKeyboard", "NavGamepad" }; IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT);
|
||||||
@ -9703,20 +9716,44 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
|||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ImGui::TreeNode("Tools"))
|
||||||
|
{
|
||||||
|
ImGui::Checkbox("Show windows begin order", &show_windows_begin_order);
|
||||||
|
ImGui::Checkbox("Show windows rectangles", &show_windows_rects);
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::PushItemWidth(ImGui::GetFontSize() * 12);
|
||||||
|
show_windows_rects |= ImGui::Combo("##rects_type", &show_windows_rect_type, "OuterRect\0" "OuterRectClipped\0" "InnerMainRect\0" "InnerClipRect\0" "ContentsRegionRect\0");
|
||||||
|
ImGui::PopItemWidth();
|
||||||
|
ImGui::Checkbox("Show clipping rectangle when hovering ImDrawCmd node", &show_drawcmd_clip_rects);
|
||||||
|
ImGui::TreePop();
|
||||||
|
}
|
||||||
|
|
||||||
if (g.IO.KeyCtrl && show_window_begin_order)
|
if (show_windows_rects || show_windows_begin_order)
|
||||||
{
|
{
|
||||||
for (int n = 0; n < g.Windows.Size; n++)
|
for (int n = 0; n < g.Windows.Size; n++)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = g.Windows[n];
|
ImGuiWindow* window = g.Windows[n];
|
||||||
if ((window->Flags & ImGuiWindowFlags_ChildWindow) || !window->WasActive)
|
if ((window->Flags & ImGuiWindowFlags_ChildWindow) || !window->WasActive)
|
||||||
continue;
|
continue;
|
||||||
char buf[32];
|
ImDrawList* draw_list = GetForegroundDrawList(window);
|
||||||
ImFormatString(buf, IM_ARRAYSIZE(buf), "%d", window->BeginOrderWithinContext);
|
if (show_windows_rects)
|
||||||
float font_size = ImGui::GetFontSize() * 2;
|
{
|
||||||
ImDrawList* fg_draw_list = GetForegroundDrawList(window);
|
ImRect r;
|
||||||
fg_draw_list->AddRectFilled(window->Pos, window->Pos + ImVec2(font_size, font_size), IM_COL32(200, 100, 100, 255));
|
if (show_windows_rect_type == RT_OuterRect) { r = window->Rect(); }
|
||||||
fg_draw_list->AddText(NULL, font_size, window->Pos, IM_COL32(255, 255, 255, 255), buf);
|
else if (show_windows_rect_type == RT_OuterRectClipped) { r = window->OuterRectClipped; }
|
||||||
|
else if (show_windows_rect_type == RT_InnerMainRect) { r = window->InnerMainRect; }
|
||||||
|
else if (show_windows_rect_type == RT_InnerClipRect) { r = window->InnerClipRect; }
|
||||||
|
else if (show_windows_rect_type == RT_ContentsRegionRect) { r = window->ContentsRegionRect; }
|
||||||
|
draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 0, 128, 255));
|
||||||
|
}
|
||||||
|
if (show_windows_begin_order)
|
||||||
|
{
|
||||||
|
char buf[32];
|
||||||
|
ImFormatString(buf, IM_ARRAYSIZE(buf), "%d", window->BeginOrderWithinContext);
|
||||||
|
float font_size = ImGui::GetFontSize();
|
||||||
|
draw_list->AddRectFilled(window->Pos, window->Pos + ImVec2(font_size, font_size), IM_COL32(200, 100, 100, 255));
|
||||||
|
draw_list->AddText(window->Pos, IM_COL32(255, 255, 255, 255), buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
@ -793,7 +793,7 @@ void ImGui::Scrollbar(ImGuiAxis axis)
|
|||||||
? ImRect(window->Pos.x + border_size, window_rect.Max.y - style.ScrollbarSize, window_rect.Max.x - other_scrollbar_size_w - border_size, window_rect.Max.y - border_size)
|
? ImRect(window->Pos.x + border_size, window_rect.Max.y - style.ScrollbarSize, window_rect.Max.x - other_scrollbar_size_w - border_size, window_rect.Max.y - border_size)
|
||||||
: ImRect(window_rect.Max.x - style.ScrollbarSize, window->Pos.y + border_size, window_rect.Max.x - border_size, window_rect.Max.y - other_scrollbar_size_w - border_size);
|
: ImRect(window_rect.Max.x - style.ScrollbarSize, window->Pos.y + border_size, window_rect.Max.x - border_size, window_rect.Max.y - other_scrollbar_size_w - border_size);
|
||||||
if (!horizontal)
|
if (!horizontal)
|
||||||
bb.Min.y += window->TitleBarHeight() + ((window->Flags & ImGuiWindowFlags_MenuBar) ? window->MenuBarHeight() : 0.0f);
|
bb.Min.y += window->TitleBarHeight() + ((window->Flags & ImGuiWindowFlags_MenuBar) ? window->MenuBarHeight() : 0.0f); // FIXME: InnerRect?
|
||||||
|
|
||||||
const float bb_height = bb.GetHeight();
|
const float bb_height = bb.GetHeight();
|
||||||
if (bb.GetWidth() <= 0.0f || bb_height <= 0.0f)
|
if (bb.GetWidth() <= 0.0f || bb_height <= 0.0f)
|
||||||
|
Loading…
Reference in New Issue
Block a user