mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-29 12:11:06 +01:00 
			
		
		
		
	Metrics window: coarse clipping the detailed vertex buffer for pleasure and benefits.
This commit is contained in:
		
							
								
								
									
										14
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -9507,12 +9507,12 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|                         ImGui::BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData); | ||||
|                         continue; | ||||
|                     } | ||||
|                     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 = %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; | ||||
|                         ImRect vtxs_rect; | ||||
|                         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); | ||||
|                         clip_rect.Floor(); overlay_draw_list->AddRect(clip_rect.Min, clip_rect.Max, IM_COL32(255,255,0,255)); | ||||
| @@ -9520,20 +9520,22 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|                     } | ||||
|                     if (!pcmd_node_open) | ||||
|                         continue; | ||||
|                     for (int i = elem_offset; i+2 < elem_offset + (int)pcmd->ElemCount; i += 3) | ||||
|                     ImGuiListClipper clipper(pcmd->ElemCount/3, ImGui::GetTextLineHeight()*3 + ImGui::GetStyle().ItemSpacing.y); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible. | ||||
|                     for (int prim = clipper.DisplayStart, vtx_i = elem_offset + clipper.DisplayStart*3; prim < clipper.DisplayEnd; prim++) | ||||
|                     { | ||||
|                         ImVec2 triangles_pos[3]; | ||||
|                         char buf[300], *buf_p = buf; | ||||
|                         for (int n = 0; n < 3; n++) | ||||
|                         ImVec2 triangles_pos[3]; | ||||
|                         for (int n = 0; n < 3; n++, vtx_i++) | ||||
|                         { | ||||
|                             ImDrawVert& v = draw_list->VtxBuffer[(draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data[i+n] : i+n]; | ||||
|                             ImDrawVert& v = draw_list->VtxBuffer[idx_buffer ? idx_buffer[vtx_i] : vtx_i]; | ||||
|                             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); | ||||
|                             buf_p += sprintf(buf_p, "%s %04d { pos = (%8.2f,%8.2f), uv = (%.6f,%.6f), col = %08X }\n", (n == 0) ? "vtx" : "   ", vtx_i, 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, IM_COL32(255,255,0,255), true, 1.0f, false);  // Add triangle without AA, more readable for large-thin triangle | ||||
|                     } | ||||
|                     clipper.End(); | ||||
|                     ImGui::TreePop(); | ||||
|                 } | ||||
|                 overlay_draw_list->PopClipRect(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user