mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	ImDrawData: changed CmdLists from raw array to ImVector<> owned by ImDrawData itself. Faclitate user-manipulation of the array (#6406, #4879, #1878) + deep swap. (#6597, #6475, #6167, #5776, #5109, #4763, #3515, #1860)
+ Metrics: avoid misleadingly iterating all layers of DrawDataBuilder as everything is flattened into Layers[0] at this point. # Conflicts: # imgui.cpp # imgui_internal.h
This commit is contained in:
		
							
								
								
									
										56
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -399,6 +399,7 @@ CODE | ||||
|  When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files. | ||||
|  You can read releases logs https://github.com/ocornut/imgui/releases for more details. | ||||
|  | ||||
|  - 2023/07/12 (1.89.8) - ImDrawData: CmdLists now owned, changed from ImDrawList** to ImVector<ImDrawList*>. Majority of users shouldn't be affected, but you cannot compare to NULL nor reassign manually anymore. Instead use AddDrawList(). (#6406, #4879, #1878) | ||||
|  - 2023/06/28 (1.89.7) - overlapping items: obsoleted 'SetItemAllowOverlap()' (called after item) in favor of calling 'SetNextItemAllowOverlap()' (called before item). 'SetItemAllowOverlap()' didn't and couldn't work reliably since 1.89 (2022-11-15). | ||||
|  - 2023/06/28 (1.89.7) - overlapping items: renamed 'ImGuiTreeNodeFlags_AllowItemOverlap' to 'ImGuiTreeNodeFlags_AllowOverlap', 'ImGuiSelectableFlags_AllowItemOverlap' to 'ImGuiSelectableFlags_AllowOverlap'. Kept redirecting enums (will obsolete). | ||||
|  - 2023/06/28 (1.89.7) - overlapping items: IsItemHovered() now by default return false when querying an item using AllowOverlap mode which is being overlapped. Use ImGuiHoveredFlags_AllowWhenOverlappedByItem to revert to old behavior. | ||||
| @@ -4823,7 +4824,7 @@ static void AddWindowToDrawData(ImGuiWindow* window, int layer) | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiViewportP* viewport = g.Viewports[0]; | ||||
|     g.IO.MetricsRenderWindows++; | ||||
|     AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[layer], window->DrawList); | ||||
|     AddDrawListToDrawData(viewport->DrawDataBuilder.Layers[layer], window->DrawList); | ||||
|     for (int i = 0; i < window->DC.ChildWindows.Size; i++) | ||||
|     { | ||||
|         ImGuiWindow* child = window->DC.ChildWindows[i]; | ||||
| @@ -4845,36 +4846,36 @@ static inline void AddRootWindowToDrawData(ImGuiWindow* window) | ||||
|  | ||||
| void ImDrawDataBuilder::FlattenIntoSingleLayer() | ||||
| { | ||||
|     int n = Layers[0].Size; | ||||
|     int size = n; | ||||
|     int n = Layers[0]->Size; | ||||
|     int full_size = n; | ||||
|     for (int i = 1; i < IM_ARRAYSIZE(Layers); i++) | ||||
|         size += Layers[i].Size; | ||||
|     Layers[0].resize(size); | ||||
|         full_size += Layers[i]->Size; | ||||
|     Layers[0]->resize(full_size); | ||||
|     for (int layer_n = 1; layer_n < IM_ARRAYSIZE(Layers); layer_n++) | ||||
|     { | ||||
|         ImVector<ImDrawList*>& layer = Layers[layer_n]; | ||||
|         if (layer.empty()) | ||||
|         ImVector<ImDrawList*>* layer = Layers[layer_n]; | ||||
|         if (layer->empty()) | ||||
|             continue; | ||||
|         memcpy(&Layers[0][n], &layer[0], layer.Size * sizeof(ImDrawList*)); | ||||
|         n += layer.Size; | ||||
|         layer.resize(0); | ||||
|         memcpy(Layers[0]->Data + n, layer->Data, layer->Size * sizeof(ImDrawList*)); | ||||
|         n += layer->Size; | ||||
|         layer->resize(0); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void SetupViewportDrawData(ImGuiViewportP* viewport, ImVector<ImDrawList*>* draw_lists) | ||||
| static void SetupViewportDrawData(ImGuiViewportP* viewport) | ||||
| { | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     ImDrawData* draw_data = &viewport->DrawDataP; | ||||
|     draw_data->Valid = true; | ||||
|     draw_data->CmdLists = (draw_lists->Size > 0) ? draw_lists->Data : NULL; | ||||
|     draw_data->CmdListsCount = draw_lists->Size; | ||||
|     draw_data->CmdListsCount = draw_data->CmdLists.Size; | ||||
|     draw_data->TotalVtxCount = draw_data->TotalIdxCount = 0; | ||||
|     draw_data->DisplayPos = viewport->Pos; | ||||
|     draw_data->DisplaySize = viewport->Size; | ||||
|     draw_data->FramebufferScale = io.DisplayFramebufferScale; | ||||
|     for (int n = 0; n < draw_lists->Size; n++) | ||||
|     draw_data->OwnerViewport = viewport; | ||||
|     for (int n = 0; n < draw_data->CmdLists.Size; n++) | ||||
|     { | ||||
|         ImDrawList* draw_list = draw_lists->Data[n]; | ||||
|         ImDrawList* draw_list = draw_data->CmdLists[n]; | ||||
|         draw_list->_PopUnusedDrawCmd(); | ||||
|         draw_data->TotalVtxCount += draw_list->VtxBuffer.Size; | ||||
|         draw_data->TotalIdxCount += draw_list->IdxBuffer.Size; | ||||
| @@ -5099,9 +5100,9 @@ void ImGui::Render() | ||||
|     for (int n = 0; n != g.Viewports.Size; n++) | ||||
|     { | ||||
|         ImGuiViewportP* viewport = g.Viewports[n]; | ||||
|         viewport->DrawDataBuilder.Clear(); | ||||
|         viewport->DrawDataBuilder.Setup(&viewport->DrawDataP); | ||||
|         if (viewport->DrawLists[0] != NULL) | ||||
|             AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport)); | ||||
|             AddDrawListToDrawData(viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport)); | ||||
|     } | ||||
|  | ||||
|     // Draw modal/window whitening backgrounds | ||||
| @@ -5136,9 +5137,9 @@ void ImGui::Render() | ||||
|  | ||||
|         // Add foreground ImDrawList (for each active viewport) | ||||
|         if (viewport->DrawLists[1] != NULL) | ||||
|             AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport)); | ||||
|             AddDrawListToDrawData(viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport)); | ||||
|  | ||||
|         SetupViewportDrawData(viewport, &viewport->DrawDataBuilder.Layers[0]); | ||||
|         SetupViewportDrawData(viewport); | ||||
|         ImDrawData* draw_data = &viewport->DrawDataP; | ||||
|         g.IO.MetricsRenderVertices += draw_data->TotalVtxCount; | ||||
|         g.IO.MetricsRenderIndices += draw_data->TotalIdxCount; | ||||
| @@ -13862,7 +13863,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|     // DrawLists | ||||
|     int drawlist_count = 0; | ||||
|     for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) | ||||
|         drawlist_count += g.Viewports[viewport_i]->DrawDataBuilder.GetDrawListCount(); | ||||
|         drawlist_count += g.Viewports[viewport_i]->DrawDataP.CmdLists.Size; | ||||
|     if (TreeNode("DrawLists", "DrawLists (%d)", drawlist_count)) | ||||
|     { | ||||
|         Checkbox("Show ImDrawCmd mesh when hovering", &cfg->ShowDrawCmdMesh); | ||||
| @@ -13870,9 +13871,8 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|         for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) | ||||
|         { | ||||
|             ImGuiViewportP* viewport = g.Viewports[viewport_i]; | ||||
|             for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) | ||||
|                 for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) | ||||
|                     DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); | ||||
|             for (int draw_list_i = 0; draw_list_i < viewport->DrawDataP.CmdLists.Size; draw_list_i++) | ||||
|                 DebugNodeDrawList(NULL, viewport, viewport->DrawDataP.CmdLists[draw_list_i], "DrawList"); | ||||
|         } | ||||
|         TreePop(); | ||||
|     } | ||||
| @@ -14204,9 +14204,10 @@ void ImGui::DebugNodeColumns(ImGuiOldColumns* columns) | ||||
| } | ||||
|  | ||||
| // [DEBUG] Display contents of ImDrawList | ||||
| void ImGui::DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label) | ||||
| void ImGui::DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     IM_UNUSED(viewport); // Used in docking branch | ||||
|     ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; | ||||
|     int cmd_count = draw_list->CmdBuffer.Size; | ||||
|     if (cmd_count > 0 && draw_list->CmdBuffer.back().ElemCount == 0 && draw_list->CmdBuffer.back().UserCallback == NULL) | ||||
| @@ -14495,9 +14496,8 @@ void ImGui::DebugNodeViewport(ImGuiViewportP* viewport) | ||||
|             (flags & ImGuiViewportFlags_IsPlatformWindow)  ? " IsPlatformWindow"  : "", | ||||
|             (flags & ImGuiViewportFlags_IsPlatformMonitor) ? " IsPlatformMonitor" : "", | ||||
|             (flags & ImGuiViewportFlags_OwnedByApp)        ? " OwnedByApp"        : ""); | ||||
|         for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) | ||||
|             for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) | ||||
|                 DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); | ||||
|         for (int draw_list_i = 0; draw_list_i < viewport->DrawDataP.CmdLists.Size; draw_list_i++) | ||||
|             DebugNodeDrawList(NULL, viewport, viewport->DrawDataP.CmdLists[draw_list_i], "DrawList"); | ||||
|         TreePop(); | ||||
|     } | ||||
| } | ||||
| @@ -14525,7 +14525,7 @@ void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label) | ||||
|         TextDisabled("Note: some memory buffers have been compacted/freed."); | ||||
|  | ||||
|     ImGuiWindowFlags flags = window->Flags; | ||||
|     DebugNodeDrawList(window, window->DrawList, "DrawList"); | ||||
|     DebugNodeDrawList(window, window->Viewport, window->DrawList, "DrawList"); | ||||
|     BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), ContentSize (%.1f,%.1f) Ideal (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->ContentSize.x, window->ContentSize.y, window->ContentSizeIdeal.x, window->ContentSizeIdeal.y); | ||||
|     BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s%s%s..)", flags, | ||||
|         (flags & ImGuiWindowFlags_ChildWindow)  ? "Child " : "",      (flags & ImGuiWindowFlags_Tooltip)     ? "Tooltip "   : "",  (flags & ImGuiWindowFlags_Popup) ? "Popup " : "", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user