|
|
|
@ -45,7 +45,7 @@ CODE |
|
|
|
|
// [SECTION] FORWARD DECLARATIONS
|
|
|
|
|
// [SECTION] CONTEXT AND MEMORY ALLOCATORS
|
|
|
|
|
// [SECTION] MAIN USER FACING STRUCTURES (ImGuiStyle, ImGuiIO)
|
|
|
|
|
// [SECTION] MISC HELPERS/UTILITIES (Maths, String, Format, Hash, File functions)
|
|
|
|
|
// [SECTION] MISC HELPERS/UTILITIES (Geomtry, String, Format, Hash, File functions)
|
|
|
|
|
// [SECTION] MISC HELPERS/UTILITIES (File functions)
|
|
|
|
|
// [SECTION] MISC HELPERS/UTILITIES (ImText* functions)
|
|
|
|
|
// [SECTION] MISC HELPERS/UTILITIES (Color functions)
|
|
|
|
@ -1083,7 +1083,7 @@ void ImGuiIO::ClearInputCharacters() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
// [SECTION] MISC HELPERS/UTILITIES (Maths, String, Format, Hash, File functions)
|
|
|
|
|
// [SECTION] MISC HELPERS/UTILITIES (Geometry, String, Format, Hash, File functions)
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p) |
|
|
|
@ -9715,7 +9715,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) |
|
|
|
|
static bool show_windows_rects = false; |
|
|
|
|
static int show_windows_rect_type = WRT_WorkRect; |
|
|
|
|
static bool show_windows_begin_order = false; |
|
|
|
|
static bool show_drawcmd_clip_rects = true; |
|
|
|
|
static bool show_drawcmd_details = true; |
|
|
|
|
|
|
|
|
|
// Basic info
|
|
|
|
|
ImGuiContext& g = *GImGui; |
|
|
|
@ -9766,7 +9766,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
if (window && !window->WasActive) |
|
|
|
|
ImGui::Text("(Note: owning Window is inactive: DrawList is not being rendered!)"); |
|
|
|
|
ImGui::TextDisabled("Warning: owning Window is inactive. This DrawList is not being rendered!"); |
|
|
|
|
|
|
|
|
|
unsigned int elem_offset = 0; |
|
|
|
|
for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.begin(); pcmd < draw_list->CmdBuffer.end(); elem_offset += pcmd->ElemCount, pcmd++) |
|
|
|
@ -9780,73 +9780,51 @@ void ImGui::ShowMetricsWindow(bool* p_open) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; |
|
|
|
|
|
|
|
|
|
// Calculate approximate coverage area (touched pixel count)
|
|
|
|
|
// This will be in pixels squared as long there's no post-scaling happening to the ImGui output
|
|
|
|
|
// Optionally also draw all the polys in the list in wireframe when hovering over
|
|
|
|
|
|
|
|
|
|
float total_area = 0.0f; |
|
|
|
|
|
|
|
|
|
for (unsigned int base_idx = elem_offset; base_idx < (elem_offset + pcmd->ElemCount); base_idx += 3) |
|
|
|
|
{ |
|
|
|
|
ImVec2 triangles_pos[3]; |
|
|
|
|
for (int n = 0; n < 3; n++) |
|
|
|
|
{ |
|
|
|
|
int vtx_i = idx_buffer ? idx_buffer[base_idx + n] : (base_idx + n); |
|
|
|
|
ImDrawVert& v = draw_list->VtxBuffer[vtx_i]; |
|
|
|
|
triangles_pos[n] = v.pos;
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Calculate triangle area and accumulate
|
|
|
|
|
|
|
|
|
|
float area = abs((triangles_pos[0].x * (triangles_pos[1].y - triangles_pos[2].y)) + |
|
|
|
|
(triangles_pos[1].x * (triangles_pos[2].y - triangles_pos[0].y)) + |
|
|
|
|
(triangles_pos[2].x * (triangles_pos[0].y - triangles_pos[1].y))) * 0.5f; |
|
|
|
|
|
|
|
|
|
total_area += area; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
char buf[300]; |
|
|
|
|
ImFormatString(buf, IM_ARRAYSIZE(buf), "Draw %4d triangles, tex 0x%p, area %.0fpx^2, clip_rect (%4.0f,%4.0f)-(%4.0f,%4.0f)", |
|
|
|
|
pcmd->ElemCount/3, (void*)(intptr_t)pcmd->TextureId, total_area, |
|
|
|
|
ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd: %4d triangles, Tex 0x%p, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)", |
|
|
|
|
pcmd->ElemCount/3, (void*)(intptr_t)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()), "%s", buf); |
|
|
|
|
if (show_drawcmd_clip_rects && fg_draw_list && ImGui::IsItemHovered()) |
|
|
|
|
if (show_drawcmd_details && fg_draw_list && ImGui::IsItemHovered()) |
|
|
|
|
{ |
|
|
|
|
ImRect clip_rect = pcmd->ClipRect; |
|
|
|
|
ImRect vtxs_rect; |
|
|
|
|
for (unsigned int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++) |
|
|
|
|
vtxs_rect.Add(draw_list->VtxBuffer[idx_buffer ? idx_buffer[i] : i].pos); |
|
|
|
|
clip_rect.Floor(); fg_draw_list->AddRect(clip_rect.Min, clip_rect.Max, IM_COL32(255,0,255,255)); |
|
|
|
|
vtxs_rect.Floor(); fg_draw_list->AddRect(vtxs_rect.Min, vtxs_rect.Max, IM_COL32(255,255,0,255)); |
|
|
|
|
fg_draw_list->AddRect(ImFloor(clip_rect.Min), ImFloor(clip_rect.Max), IM_COL32(255,0,255,255)); |
|
|
|
|
fg_draw_list->AddRect(ImFloor(vtxs_rect.Min), ImFloor(vtxs_rect.Max), IM_COL32(255,255,0,255)); |
|
|
|
|
} |
|
|
|
|
if (!pcmd_node_open) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
// Display vertex information summary. Hover to get all triangles drawn in wireframe
|
|
|
|
|
ImFormatString(buf, IM_ARRAYSIZE(buf), "ElemCount: %d, ElemCount/3: %d, VtxOffset: +%d, IdxOffset: +%d", pcmd->ElemCount, pcmd->ElemCount/3, pcmd->VtxOffset, pcmd->IdxOffset); |
|
|
|
|
ImGui::Selectable(buf, false); |
|
|
|
|
|
|
|
|
|
if (fg_draw_list && ImGui::IsItemHovered()) |
|
|
|
|
// Calculate approximate coverage area (touched pixel count)
|
|
|
|
|
// This will be in pixels squared as long there's no post-scaling happening to the renderer output.
|
|
|
|
|
float total_area = 0.0f; |
|
|
|
|
for (unsigned int base_idx = elem_offset; base_idx < (elem_offset + pcmd->ElemCount); base_idx += 3) |
|
|
|
|
{ |
|
|
|
|
// Draw wireframe version of everything
|
|
|
|
|
ImVec2 triangle[3]; |
|
|
|
|
for (int n = 0; n < 3; n++) |
|
|
|
|
triangle[n] = draw_list->VtxBuffer[idx_buffer ? idx_buffer[base_idx + n] : (base_idx + n)].pos; |
|
|
|
|
total_area += ImTriangleArea(triangle[0], triangle[1], triangle[2]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Display vertex information summary. Hover to get all triangles drawn in wire-frame
|
|
|
|
|
ImFormatString(buf, IM_ARRAYSIZE(buf), "Mesh: ElemCount: %d, VtxOffset: +%d, IdxOffset: +%d, Area: ~%0.f px", pcmd->ElemCount, pcmd->VtxOffset, pcmd->IdxOffset, total_area); |
|
|
|
|
ImGui::Selectable(buf); |
|
|
|
|
if (fg_draw_list && ImGui::IsItemHovered() && show_drawcmd_details) |
|
|
|
|
{ |
|
|
|
|
// Draw wire-frame version of everything
|
|
|
|
|
ImDrawListFlags backup_flags = fg_draw_list->Flags; |
|
|
|
|
fg_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines at is more readable for very large and thin triangles.
|
|
|
|
|
|
|
|
|
|
fg_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles.
|
|
|
|
|
ImRect clip_rect = pcmd->ClipRect; |
|
|
|
|
fg_draw_list->AddRect(ImFloor(clip_rect.Min), ImFloor(clip_rect.Max), IM_COL32(255, 0, 255, 255)); |
|
|
|
|
for (unsigned int base_idx = elem_offset; base_idx < (elem_offset + pcmd->ElemCount); base_idx += 3) |
|
|
|
|
{ |
|
|
|
|
ImVec2 triangles_pos[3]; |
|
|
|
|
ImVec2 triangle[3]; |
|
|
|
|
for (int n = 0; n < 3; n++) |
|
|
|
|
{ |
|
|
|
|
int vtx_i = idx_buffer ? idx_buffer[base_idx + n] : (base_idx + n); |
|
|
|
|
ImDrawVert& v = draw_list->VtxBuffer[vtx_i]; |
|
|
|
|
triangles_pos[n] = v.pos; |
|
|
|
|
triangle[n] = draw_list->VtxBuffer[idx_buffer ? idx_buffer[base_idx + n] : (base_idx + n)].pos; |
|
|
|
|
fg_draw_list->AddPolyline(triangle, 3, IM_COL32(255, 255, 0, 255), true, 1.0f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fg_draw_list->AddPolyline(triangles_pos, 3, IM_COL32(255, 255, 0, 255), true, 1.0f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fg_draw_list->Flags = backup_flags; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -9856,22 +9834,21 @@ void ImGui::ShowMetricsWindow(bool* p_open) |
|
|
|
|
for (int prim = clipper.DisplayStart, idx_i = elem_offset + clipper.DisplayStart*3; prim < clipper.DisplayEnd; prim++) |
|
|
|
|
{ |
|
|
|
|
char *buf_p = buf, *buf_end = buf + IM_ARRAYSIZE(buf); |
|
|
|
|
ImVec2 triangles_pos[3]; |
|
|
|
|
ImVec2 triangle[3]; |
|
|
|
|
for (int n = 0; n < 3; n++, idx_i++) |
|
|
|
|
{ |
|
|
|
|
int vtx_i = idx_buffer ? idx_buffer[idx_i] : idx_i; |
|
|
|
|
ImDrawVert& v = draw_list->VtxBuffer[vtx_i]; |
|
|
|
|
triangles_pos[n] = v.pos; |
|
|
|
|
ImDrawVert& v = draw_list->VtxBuffer[idx_buffer ? idx_buffer[idx_i] : idx_i]; |
|
|
|
|
triangle[n] = v.pos; |
|
|
|
|
buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", |
|
|
|
|
(n == 0) ? "elem" : " ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col); |
|
|
|
|
(n == 0) ? "Vert:" : " ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ImGui::Selectable(buf, false); |
|
|
|
|
if (fg_draw_list && ImGui::IsItemHovered()) |
|
|
|
|
{ |
|
|
|
|
ImDrawListFlags backup_flags = fg_draw_list->Flags; |
|
|
|
|
fg_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines at is more readable for very large and thin triangles.
|
|
|
|
|
fg_draw_list->AddPolyline(triangles_pos, 3, IM_COL32(255,255,0,255), true, 1.0f); |
|
|
|
|
fg_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles.
|
|
|
|
|
fg_draw_list->AddPolyline(triangle, 3, IM_COL32(255,255,0,255), true, 1.0f); |
|
|
|
|
fg_draw_list->Flags = backup_flags; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -10058,7 +10035,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) |
|
|
|
|
} |
|
|
|
|
ImGui::Unindent(); |
|
|
|
|
} |
|
|
|
|
ImGui::Checkbox("Show clipping rectangle when hovering ImDrawCmd node", &show_drawcmd_clip_rects); |
|
|
|
|
ImGui::Checkbox("Show details when hovering ImDrawCmd node", &show_drawcmd_details); |
|
|
|
|
ImGui::TreePop(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|