mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 15:11:05 +01:00 
			
		
		
		
	Metrics: inspect individual triangles in drawcall
This commit is contained in:
		
							
								
								
									
										30
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -9265,10 +9265,14 @@ void ImGui::ShowMetricsWindow(bool* opened)
 | 
			
		||||
                {
 | 
			
		||||
                    ImGui::SameLine();
 | 
			
		||||
                    ImGui::TextColored(ImColor(255,100,100), "CURRENTLY APPENDING"); // Can't display stats for active draw list! (we don't have the data double-buffered)
 | 
			
		||||
                    if (node_opened) ImGui::TreePop();
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (!node_opened)
 | 
			
		||||
                    return;
 | 
			
		||||
 | 
			
		||||
                ImDrawList* overlay_draw_list = &GImGui->OverlayDrawList;   // Render additional visuals into the top-most draw list
 | 
			
		||||
                overlay_draw_list->PushClipRectFullScreen();
 | 
			
		||||
                int elem_offset = 0;
 | 
			
		||||
                for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.begin(); pcmd < draw_list->CmdBuffer.end(); elem_offset += pcmd->ElemCount, pcmd++)
 | 
			
		||||
                {
 | 
			
		||||
@@ -9277,7 +9281,7 @@ void ImGui::ShowMetricsWindow(bool* opened)
 | 
			
		||||
                        ImGui::BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData);
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
                    ImGui::BulletText("Draw %-4d %s vtx, tex = %p, clip_rect = (%.0f,%.0f)..(%.0f,%.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 draw_opened = ImGui::TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "Draw %-4d %s vtx, tex = %p, clip_rect = (%.0f,%.0f)..(%.0f,%.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_clip_rects && ImGui::IsItemHovered())
 | 
			
		||||
                    {
 | 
			
		||||
                        ImRect clip_rect = pcmd->ClipRect;
 | 
			
		||||
@@ -9285,12 +9289,28 @@ void ImGui::ShowMetricsWindow(bool* opened)
 | 
			
		||||
                        ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL;
 | 
			
		||||
                        for (int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++)
 | 
			
		||||
                            vtxs_rect.Add(draw_list->VtxBuffer[idx_buffer ? idx_buffer[i] : i].pos);
 | 
			
		||||
                        GImGui->OverlayDrawList.PushClipRectFullScreen();
 | 
			
		||||
                        clip_rect.Round(); GImGui->OverlayDrawList.AddRect(clip_rect.Min, clip_rect.Max, ImColor(255,255,0));
 | 
			
		||||
                        vtxs_rect.Round(); GImGui->OverlayDrawList.AddRect(vtxs_rect.Min, vtxs_rect.Max, ImColor(255,0,255));
 | 
			
		||||
                        GImGui->OverlayDrawList.PopClipRect();
 | 
			
		||||
                        clip_rect.Round(); overlay_draw_list->AddRect(clip_rect.Min, clip_rect.Max, ImColor(255,255,0));
 | 
			
		||||
                        vtxs_rect.Round(); overlay_draw_list->AddRect(vtxs_rect.Min, vtxs_rect.Max, ImColor(255,0,255));
 | 
			
		||||
                    }
 | 
			
		||||
                    if (!draw_opened)
 | 
			
		||||
                        continue;
 | 
			
		||||
                    for (int i = elem_offset; i+2 < elem_offset + (int)pcmd->ElemCount; i += 3)
 | 
			
		||||
                    {
 | 
			
		||||
                        ImVec2 triangles_pos[3];
 | 
			
		||||
                        char buf[300], *buf_p = buf;
 | 
			
		||||
                        for (int n = 0; n < 3; n++)
 | 
			
		||||
                        {
 | 
			
		||||
                            ImDrawVert& v = draw_list->VtxBuffer[(draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data[i+n] : i+n];
 | 
			
		||||
                            triangles_pos[n] = v.pos;
 | 
			
		||||
                            buf_p += sprintf(buf_p, "vtx %04d { pos = (%8.2f,%8.2f), uv = (%.6f,%.6f), col = %08X }\n", i+n, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col);
 | 
			
		||||
                        }
 | 
			
		||||
                        ImGui::Selectable(buf, false);
 | 
			
		||||
                        if (ImGui::IsItemHovered())
 | 
			
		||||
                            overlay_draw_list->AddPolyline(triangles_pos, 3, ImColor(255,255,0), true, 1.0f, false);  // Add triangle without AA, more readable for large-thin triangle
 | 
			
		||||
                    }
 | 
			
		||||
                    ImGui::TreePop();
 | 
			
		||||
                }
 | 
			
		||||
                overlay_draw_list->PopClipRect();
 | 
			
		||||
                ImGui::TreePop();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user