mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Internals: Made ContentsRegionRect absolute to reduce confusion. Renamed InnerRect to InnerMainRect, renamed WindowRectClipper to OuterRectClipped.
This commit is contained in:
		
							
								
								
									
										55
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -2969,7 +2969,7 @@ static void ImGui::NavUpdateWindowing() | ||||
| static void NavScrollToBringItemIntoView(ImGuiWindow* window, ImRect& item_rect_rel) | ||||
| { | ||||
|     // Scroll to keep newly navigated item fully into view | ||||
|     ImRect window_rect_rel(window->InnerRect.Min - window->Pos - ImVec2(1, 1), window->InnerRect.Max - window->Pos + ImVec2(1, 1)); | ||||
|     ImRect window_rect_rel(window->InnerMainRect.Min - window->Pos - ImVec2(1, 1), window->InnerMainRect.Max - window->Pos + ImVec2(1, 1)); | ||||
|     //g.OverlayDrawList.AddRect(window->Pos + window_rect_rel.Min, window->Pos + window_rect_rel.Max, IM_COL32_WHITE); // [DEBUG] | ||||
|     if (window_rect_rel.Contains(item_rect_rel)) | ||||
|         return; | ||||
| @@ -3252,7 +3252,7 @@ static void ImGui::NavUpdate() | ||||
|     if (g.NavMoveRequest && g.NavMoveFromClampedRefRect && g.NavLayer == 0) | ||||
|     { | ||||
|         ImGuiWindow* window = g.NavWindow; | ||||
|         ImRect window_rect_rel(window->InnerRect.Min - window->Pos - ImVec2(1,1), window->InnerRect.Max - window->Pos + ImVec2(1,1)); | ||||
|         ImRect window_rect_rel(window->InnerMainRect.Min - window->Pos - ImVec2(1,1), window->InnerMainRect.Max - window->Pos + ImVec2(1,1)); | ||||
|         if (!window_rect_rel.Contains(window->NavRectRel[g.NavLayer])) | ||||
|         { | ||||
|             float pad = window->CalcFontSize() * 0.5f; | ||||
| @@ -4528,7 +4528,7 @@ static ImGuiWindow* FindHoveredWindow() | ||||
|             continue; | ||||
|  | ||||
|         // Using the clipped AABB, a child window will typically be clipped by its parent (not always) | ||||
|         ImRect bb(window->WindowRectClipped.Min - g.Style.TouchExtraPadding, window->WindowRectClipped.Max + g.Style.TouchExtraPadding); | ||||
|         ImRect bb(window->OuterRectClipped.Min - g.Style.TouchExtraPadding, window->OuterRectClipped.Max + g.Style.TouchExtraPadding); | ||||
|         if (bb.Contains(g.IO.MousePos)) | ||||
|             return window; | ||||
|     } | ||||
| @@ -6102,11 +6102,12 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         // Store a backup of SizeFull which we will use next frame to decide if we need scrollbars.  | ||||
|         window->SizeFullAtLastBegin = window->SizeFull; | ||||
|  | ||||
|         // Update ContentsRegionMax. All the variable it depends on are set above in this function. | ||||
|         window->ContentsRegionRect.Min.x = -window->Scroll.x + window->WindowPadding.x; | ||||
|         window->ContentsRegionRect.Min.y = -window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight(); | ||||
|         window->ContentsRegionRect.Max.x = -window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x));  | ||||
|         window->ContentsRegionRect.Max.y = -window->Scroll.y - window->WindowPadding.y + (window->SizeContentsExplicit.y != 0.0f ? window->SizeContentsExplicit.y : (window->Size.y - window->ScrollbarSizes.y));  | ||||
|         // Update various regions. Variables they depends on are set above in this function. | ||||
|         // FIXME: window->ContentsRegion.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it. | ||||
|         window->ContentsRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x; | ||||
|         window->ContentsRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight(); | ||||
|         window->ContentsRegionRect.Max.x = window->Pos.x - window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x)); | ||||
|         window->ContentsRegionRect.Max.y = window->Pos.y - window->Scroll.y - window->WindowPadding.y + (window->SizeContentsExplicit.y != 0.0f ? window->SizeContentsExplicit.y : (window->Size.y - window->ScrollbarSizes.y)); | ||||
|  | ||||
|         // Setup drawing context | ||||
|         // (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.) | ||||
| @@ -6208,8 +6209,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         } | ||||
|  | ||||
|         // Save clipped aabb so we can access it in constant-time in FindHoveredWindow() | ||||
|         window->WindowRectClipped = window->Rect(); | ||||
|         window->WindowRectClipped.ClipWith(window->ClipRect); | ||||
|         window->OuterRectClipped = window->Rect(); | ||||
|         window->OuterRectClipped.ClipWith(window->ClipRect); | ||||
|  | ||||
|         // Pressing CTRL+C while holding on a window copy its content to the clipboard | ||||
|         // This works but 1. doesn't handle multiple Begin/End pairs, 2. recursing into another Begin/End pair - so we need to work that out and add better logging scope. | ||||
| @@ -6223,18 +6224,18 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         // Inner rectangle | ||||
|         // We set this up after processing the resize grip so that our clip rectangle doesn't lag by a frame | ||||
|         // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior. | ||||
|         window->InnerRect.Min.x = title_bar_rect.Min.x + window->WindowBorderSize; | ||||
|         window->InnerRect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); | ||||
|         window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x - window->WindowBorderSize; | ||||
|         window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y - window->WindowBorderSize; | ||||
|         window->InnerMainRect.Min.x = title_bar_rect.Min.x + window->WindowBorderSize; | ||||
|         window->InnerMainRect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); | ||||
|         window->InnerMainRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x - window->WindowBorderSize; | ||||
|         window->InnerMainRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y - window->WindowBorderSize; | ||||
|         //window->DrawList->AddRect(window->InnerRect.Min, window->InnerRect.Max, IM_COL32_WHITE); | ||||
|  | ||||
|         // Inner clipping rectangle | ||||
|         // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. | ||||
|         window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - window->WindowBorderSize))); | ||||
|         window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y); | ||||
|         window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - window->WindowBorderSize))); | ||||
|         window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y); | ||||
|         window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerMainRect.Min.x + ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - window->WindowBorderSize))); | ||||
|         window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerMainRect.Min.y); | ||||
|         window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerMainRect.Max.x - ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - window->WindowBorderSize))); | ||||
|         window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerMainRect.Max.y); | ||||
|  | ||||
|         // After Begin() we fill the last item / hovered data based on title bar data. It is a standard behavior (to allow creation of context menus on title bar only, etc.). | ||||
|         window->DC.LastItemId = window->MoveId; | ||||
| @@ -6259,7 +6260,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) | ||||
|         window->Collapsed = parent_window && parent_window->Collapsed; | ||||
|  | ||||
|         if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) | ||||
|             window->Collapsed |= (window->WindowRectClipped.Min.x >= window->WindowRectClipped.Max.x || window->WindowRectClipped.Min.y >= window->WindowRectClipped.Max.y); | ||||
|             window->Collapsed |= (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y); | ||||
|  | ||||
|         // We also hide the window from rendering because we've already added its border to the command list. | ||||
|         // (we could perform the check earlier in the function but it is simpler at this point) | ||||
| @@ -7101,7 +7102,7 @@ void ImGui::SetNextWindowBgAlpha(float alpha) | ||||
| ImVec2 ImGui::GetContentRegionMax() | ||||
| { | ||||
|     ImGuiWindow* window = GetCurrentWindowRead(); | ||||
|     ImVec2 mx = window->ContentsRegionRect.Max; | ||||
|     ImVec2 mx = window->ContentsRegionRect.Max - window->Pos; | ||||
|     if (window->DC.ColumnsSet) | ||||
|         mx.x = GetColumnOffset(window->DC.ColumnsSet->Current + 1) - window->WindowPadding.x; | ||||
|     return mx; | ||||
| @@ -7122,19 +7123,19 @@ float ImGui::GetContentRegionAvailWidth() | ||||
| ImVec2 ImGui::GetWindowContentRegionMin() | ||||
| { | ||||
|     ImGuiWindow* window = GetCurrentWindowRead(); | ||||
|     return window->ContentsRegionRect.Min; | ||||
|     return window->ContentsRegionRect.Min - window->Pos; | ||||
| } | ||||
|  | ||||
| ImVec2 ImGui::GetWindowContentRegionMax() | ||||
| { | ||||
|     ImGuiWindow* window = GetCurrentWindowRead(); | ||||
|     return window->ContentsRegionRect.Max; | ||||
|     return window->ContentsRegionRect.Max - window->Pos; | ||||
| } | ||||
|  | ||||
| float ImGui::GetWindowContentRegionWidth() | ||||
| { | ||||
|     ImGuiWindow* window = GetCurrentWindowRead(); | ||||
|     return window->ContentsRegionRect.Max.x - window->ContentsRegionRect.Min.x; | ||||
|     return window->ContentsRegionRect.GetWidth(); | ||||
| } | ||||
|  | ||||
| float ImGui::GetTextLineHeight() | ||||
| @@ -11286,7 +11287,7 @@ bool ImGui::BeginMenuBar() | ||||
|     // We remove 1 worth of rounding to Max.x to that text in long menus and small windows don't tend to display over the lower-right rounded area, which looks particularly glitchy. | ||||
|     ImRect bar_rect = window->MenuBarRect(); | ||||
|     ImRect clip_rect(ImFloor(bar_rect.Min.x + 0.5f), ImFloor(bar_rect.Min.y + window->WindowBorderSize + 0.5f), ImFloor(ImMax(bar_rect.Min.x, bar_rect.Max.x - window->WindowRounding) + 0.5f), ImFloor(bar_rect.Max.y + 0.5f)); | ||||
|     clip_rect.ClipWith(window->WindowRectClipped); | ||||
|     clip_rect.ClipWith(window->OuterRectClipped); | ||||
|     PushClipRect(clip_rect.Min, clip_rect.Max, false); | ||||
|  | ||||
|     window->DC.CursorPos = ImVec2(bar_rect.Min.x + window->DC.MenuBarOffset.x, bar_rect.Min.y + window->DC.MenuBarOffset.y); | ||||
| @@ -13309,12 +13310,12 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
| { | ||||
|     if (ImGui::Begin("ImGui Metrics", p_open)) | ||||
|     { | ||||
|         static bool show_draw_cmd_clip_rects = true; | ||||
|         ImGui::Text("Dear ImGui %s", ImGui::GetVersion()); | ||||
|         ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); | ||||
|         ImGui::Text("%d vertices, %d indices (%d triangles)", ImGui::GetIO().MetricsRenderVertices, ImGui::GetIO().MetricsRenderIndices, ImGui::GetIO().MetricsRenderIndices / 3); | ||||
|         ImGui::Text("%d allocations", (int)GImAllocatorActiveAllocationsCount); | ||||
|         static bool show_clip_rects = true; | ||||
|         ImGui::Checkbox("Show clipping rectangles when hovering draw commands", &show_clip_rects); | ||||
|         ImGui::Checkbox("Show clipping rectangles when hovering draw commands", &show_draw_cmd_clip_rects); | ||||
|         ImGui::Separator(); | ||||
|  | ||||
|         struct Funcs | ||||
| @@ -13348,7 +13349,7 @@ void ImGui::ShowMetricsWindow(bool* p_open) | ||||
|                     } | ||||
|                     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); | ||||
|                     if (show_clip_rects && ImGui::IsItemHovered()) | ||||
|                     if (show_draw_cmd_clip_rects && ImGui::IsItemHovered()) | ||||
|                     { | ||||
|                         ImRect clip_rect = pcmd->ClipRect; | ||||
|                         ImRect vtxs_rect; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user