From 9b2647d112cf3fb75e7fd3bed4864a0e2ba16a73 Mon Sep 17 00:00:00 2001 From: Lou Catonnet Date: Wed, 5 Nov 2025 14:28:15 +0100 Subject: [PATCH] DrawCmd: Added ForbidMerging boolean --- imgui.cpp | 3 ++- imgui.h | 1 + imgui_draw.cpp | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 46a6fd79d..001037582 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -5777,7 +5777,8 @@ static void ImGui::RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 ImDrawList* draw_list = window->RootWindow->DrawList; if (draw_list->CmdBuffer.Size == 0) draw_list->AddDrawCmd(); - draw_list->PushClipRect(viewport_rect.Min - ImVec2(1, 1), viewport_rect.Max + ImVec2(1, 1), false); // FIXME: Need to stricty ensure ImDrawCmd are not merged (ElemCount==6 checks below will verify that) + draw_list->CmdBuffer.back().ForbidMerging = true; // Strictly ensure ImDrawCmd are not merged + draw_list->PushClipRect(viewport_rect.Min - ImVec2(1, 1), viewport_rect.Max + ImVec2(1, 1), false); draw_list->AddRectFilled(viewport_rect.Min, viewport_rect.Max, col); ImDrawCmd cmd = draw_list->CmdBuffer.back(); IM_ASSERT(cmd.ElemCount == 6); diff --git a/imgui.h b/imgui.h index bcafbf9a8..7bf1ff8b2 100644 --- a/imgui.h +++ b/imgui.h @@ -3144,6 +3144,7 @@ struct ImDrawCmd void* UserCallbackData; // 4-8 // Callback user data (when UserCallback != NULL). If called AddCallback() with size == 0, this is a copy of the AddCallback() argument. If called AddCallback() with size > 0, this is pointing to a buffer where data is stored. int UserCallbackDataSize; // 4 // Size of callback user data when using storage, otherwise 0. int UserCallbackDataOffset;// 4 // [Internal] Offset of callback user data when using storage, otherwise -1. + bool ForbidMerging; // 1 // Whether to allow merging with previous ImDrawCmd or not ImDrawCmd() { memset(this, 0, sizeof(*this)); } // Also ensure our padding fields are zeroed diff --git a/imgui_draw.cpp b/imgui_draw.cpp index 9e6babf78..a43c91c3f 100644 --- a/imgui_draw.cpp +++ b/imgui_draw.cpp @@ -587,7 +587,7 @@ void ImDrawList::_OnChangedClipRect() // Try to merge with previous command if it matches, else use current command ImDrawCmd* prev_cmd = curr_cmd - 1; - if (curr_cmd->ElemCount == 0 && CmdBuffer.Size > 1 && ImDrawCmd_HeaderCompare(&_CmdHeader, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset(prev_cmd, curr_cmd) && prev_cmd->UserCallback == NULL) + if ((prev_cmd->ForbidMerging || curr_cmd->ForbidMerging) == false && curr_cmd->ElemCount == 0 && CmdBuffer.Size > 1 && ImDrawCmd_HeaderCompare(&_CmdHeader, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset(prev_cmd, curr_cmd) && prev_cmd->UserCallback == NULL) { CmdBuffer.pop_back(); return;