diff --git a/examples/imgui_impl_dx10.cpp b/examples/imgui_impl_dx10.cpp index db909015..4636e7da 100644 --- a/examples/imgui_impl_dx10.cpp +++ b/examples/imgui_impl_dx10.cpp @@ -587,10 +587,10 @@ static void ImGui_ImplDX10_ResizeViewport(ImGuiViewport* viewport, ImVec2 size) static void ImGui_ImplDX10_RenderViewport(ImGuiViewport* viewport) { ImGuiPlatformDataDx10* data = (ImGuiPlatformDataDx10*)viewport->RendererUserData; - ImVec4 clear_color = ImGui::GetStyle().Colors[ImGuiCol_WindowBg]; // FIXME-PLATFORM - clear_color.w = 1.0f; + ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); g_pd3dDevice->OMSetRenderTargets(1, &data->RTView, NULL); - g_pd3dDevice->ClearRenderTargetView(data->RTView, (float*)&clear_color); + if (!(viewport->Flags & ImGuiViewportFlags_NoRendererClear)) + g_pd3dDevice->ClearRenderTargetView(data->RTView, (float*)&clear_color); ImGui_ImplDX10_RenderDrawData(&viewport->DrawData); } diff --git a/examples/imgui_impl_dx11.cpp b/examples/imgui_impl_dx11.cpp index 52952bc0..09e32d80 100644 --- a/examples/imgui_impl_dx11.cpp +++ b/examples/imgui_impl_dx11.cpp @@ -595,10 +595,10 @@ static void ImGui_ImplDX11_ResizeViewport(ImGuiViewport* viewport, ImVec2 size) static void ImGui_ImplDX11_RenderViewport(ImGuiViewport* viewport) { ImGuiPlatformDataDx11* data = (ImGuiPlatformDataDx11*)viewport->RendererUserData; - ImVec4 clear_color = ImGui::GetStyle().Colors[ImGuiCol_WindowBg]; // FIXME-PLATFORM - clear_color.w = 1.0f; + ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); g_pd3dDeviceContext->OMSetRenderTargets(1, &data->RTView, NULL); - g_pd3dDeviceContext->ClearRenderTargetView(data->RTView, (float*)&clear_color); + if (!(viewport->Flags & ImGuiViewportFlags_NoRendererClear)) + g_pd3dDeviceContext->ClearRenderTargetView(data->RTView, (float*)&clear_color); ImGui_ImplDX11_RenderDrawData(&viewport->DrawData); } diff --git a/examples/imgui_impl_dx12.cpp b/examples/imgui_impl_dx12.cpp index d0d05d60..dc7f1d75 100644 --- a/examples/imgui_impl_dx12.cpp +++ b/examples/imgui_impl_dx12.cpp @@ -734,10 +734,10 @@ static void ImGui_ImplDX12_RenderViewport(ImGuiViewport* viewport) IM_ASSERT(0); (void)data; /* - ImVec4 clear_color = ImGui::GetStyle().Colors[ImGuiCol_WindowBg]; // FIXME-PLATFORM - clear_color.w = 1.0f; + ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); g_pd3dDeviceContext->OMSetRenderTargets(1, &data->RTView, NULL); - g_pd3dDeviceContext->ClearRenderTargetView(data->RTView, (float*)&clear_color); + if (!(viewport->Flags & ImGuiViewportFlags_NoRendererClear)) + g_pd3dDeviceContext->ClearRenderTargetView(data->RTView, (float*)&clear_color); */ ImGui_ImplDX12_RenderDrawData(&viewport->DrawData); } diff --git a/examples/imgui_impl_opengl3.cpp b/examples/imgui_impl_opengl3.cpp index e851f0e2..42f2ccb6 100644 --- a/examples/imgui_impl_opengl3.cpp +++ b/examples/imgui_impl_opengl3.cpp @@ -331,9 +331,12 @@ void ImGui_ImplOpenGL3_DestroyDeviceObjects() static void ImGui_ImplOpenGL3_RenderViewport(ImGuiViewport* viewport) { - ImVec4 clear_color = ImGui::GetStyle().Colors[ImGuiCol_WindowBg]; - glClearColor(clear_color.x, clear_color.y, clear_color.z, 1.0f); // FIXME-PLATFORM - glClear(GL_COLOR_BUFFER_BIT); + if (!(viewport->Flags & ImGuiViewportFlags_NoRendererClear)) + { + ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); + glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + } ImGui_ImplOpenGL3_RenderDrawData(&viewport->DrawData); } diff --git a/examples/imgui_impl_vulkan.cpp b/examples/imgui_impl_vulkan.cpp index e817ea1f..fe7af6dd 100644 --- a/examples/imgui_impl_vulkan.cpp +++ b/examples/imgui_impl_vulkan.cpp @@ -757,6 +757,7 @@ ImGui_ImplVulkan_WindowData::ImGui_ImplVulkan_WindowData() memset(&SurfaceFormat, 0, sizeof(SurfaceFormat)); PresentMode = VK_PRESENT_MODE_MAX_ENUM_KHR; RenderPass = VK_NULL_HANDLE; + ClearEnable = true; memset(&ClearValue, 0, sizeof(ClearValue)); BackBufferCount = 0; memset(&BackBuffer, 0, sizeof(BackBuffer)); @@ -959,7 +960,7 @@ void ImGui_ImplVulkanH_CreateWindowDataSwapChainAndFramebuffer(VkPhysicalDevice VkAttachmentDescription attachment = {}; attachment.format = wd->SurfaceFormat.format; attachment.samples = VK_SAMPLE_COUNT_1_BIT; - attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + attachment.loadOp = wd->ClearEnable ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_DONT_CARE; attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; @@ -1091,6 +1092,7 @@ static void ImGui_ImplVulkan_CreateViewport(ImGuiViewport* viewport) wd->PresentMode = ImGui_ImplVulkanH_SelectPresentMode(g_PhysicalDevice, wd->Surface, &present_mode, 1); // Create SwapChain, RenderPass, Framebuffer, etc. + wd->ClearEnable = (viewport->Flags & ImGuiViewportFlags_NoRendererClear) ? false : true; ImGui_ImplVulkanH_CreateWindowDataCommandBuffers(g_PhysicalDevice, g_Device, g_QueueFamily, wd, g_Allocator); ImGui_ImplVulkanH_CreateWindowDataSwapChainAndFramebuffer(g_PhysicalDevice, g_Device, wd, g_Allocator, (int)viewport->Size.x, (int)viewport->Size.y); } @@ -1110,6 +1112,7 @@ static void ImGui_ImplVulkan_ResizeViewport(ImGuiViewport* viewport, ImVec2 size ImGuiPlatformDataVulkan* data = (ImGuiPlatformDataVulkan*)viewport->RendererUserData; if (data == NULL) // This is NULL for the main viewport (which is left to the user/app to handle) return; + data->WindowData.ClearEnable = (viewport->Flags & ImGuiViewportFlags_NoRendererClear) ? false : true; ImGui_ImplVulkanH_CreateWindowDataSwapChainAndFramebuffer(g_PhysicalDevice, g_Device, &data->WindowData, g_Allocator, (int)size.x, (int)size.y); } @@ -1119,9 +1122,6 @@ static void ImGui_ImplVulkan_RenderViewport(ImGuiViewport* viewport) ImGui_ImplVulkan_WindowData* wd = &data->WindowData; VkResult err; - ImVec4 clear_color = ImGui::GetStyle().Colors[ImGuiCol_WindowBg]; // FIXME-PLATFORM - clear_color.w = 1.0f; - { ImGui_ImplVulkan_FrameData* fd = &wd->Frames[wd->FrameIndex]; for (;;) @@ -1145,19 +1145,21 @@ static void ImGui_ImplVulkan_RenderViewport(ImGuiViewport* viewport) check_vk_result(err); } { + ImVec4 clear_color = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); + memcpy(&wd->ClearValue.color.float32[0], &clear_color, 4 * sizeof(float)); + VkRenderPassBeginInfo info = {}; info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; info.renderPass = wd->RenderPass; info.framebuffer = wd->Framebuffer[fd->BackbufferIndex]; info.renderArea.extent.width = wd->Width; info.renderArea.extent.height = wd->Height; - info.clearValueCount = 1; - info.pClearValues = &wd->ClearValue; + info.clearValueCount = (viewport->Flags & ImGuiViewportFlags_NoRendererClear) ? 0 : 1; + info.pClearValues = (viewport->Flags & ImGuiViewportFlags_NoRendererClear) ? NULL : &wd->ClearValue; vkCmdBeginRenderPass(fd->CommandBuffer, &info, VK_SUBPASS_CONTENTS_INLINE); } } - memcpy(&wd->ClearValue.color.float32[0], &clear_color, 4 * sizeof(float)); ImGui_ImplVulkan_RenderDrawData(wd->Frames[wd->FrameIndex].CommandBuffer, &viewport->DrawData); { diff --git a/examples/imgui_impl_vulkan.h b/examples/imgui_impl_vulkan.h index f9ef133e..03d6ed3c 100644 --- a/examples/imgui_impl_vulkan.h +++ b/examples/imgui_impl_vulkan.h @@ -77,6 +77,7 @@ struct ImGui_ImplVulkan_WindowData VkSurfaceFormatKHR SurfaceFormat; VkPresentModeKHR PresentMode; VkRenderPass RenderPass; + bool ClearEnable; VkClearValue ClearValue; uint32_t BackBufferCount; VkImage BackBuffer[16]; diff --git a/imgui.cpp b/imgui.cpp index 001a86c6..53e8698c 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -6053,6 +6053,10 @@ static void ImGui::UpdateWindowViewport(ImGuiWindow* window, bool window_pos_set if (window->Flags & ImGuiWindowFlags_FullViewport) { + // We currently have window fully covering a viewport and we disable WindowBg alpha, so clearing is not necessary + window->Viewport->Flags |= ImGuiViewportFlags_NoRendererClear; + + // Position SetWindowPos(window, window->Viewport->Pos, ImGuiCond_Always); if (window->Viewport->PlatformRequestResize) SetWindowSize(window, window->Viewport->Size, ImGuiCond_Always); @@ -6606,6 +6610,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) ImU32 bg_col = GetColorU32(GetWindowBgColorIdxFromFlags(flags)); if (g.NextWindowData.BgAlphaCond != 0) bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(g.NextWindowData.BgAlphaVal) << IM_COL32_A_SHIFT); + if (window->Flags & ImGuiWindowFlags_FullViewport) + bg_col = (bg_col | IM_COL32_A_MASK); window->DrawList->AddRectFilled(window->Pos+ImVec2(0,window->TitleBarHeight()), window->Pos+window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot); // Title bar diff --git a/imgui_internal.h b/imgui_internal.h index 1d49b913..6631fb89 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -510,9 +510,10 @@ enum ImGuiViewportFlags_ { ImGuiViewportFlags_MainViewport = 1 << 0, ImGuiViewportFlags_HostOtherWindows = 1 << 1, - ImGuiViewportFlags_NoDecoration = 1 << 2, // Platform Window: Disable platform title bar, borders, etc. - ImGuiViewportFlags_NoFocusOnAppearing = 1 << 3, // Platform Window: Don't take focus when created. - ImGuiViewportFlags_NoInputs = 1 << 4 // Platform Window: Make mouse pass through so we can drag this window while peaking behind it. + ImGuiViewportFlags_NoRendererClear = 1 << 2, // Platform Window: Renderer doesn't need to clear the framebuffer ahead. + ImGuiViewportFlags_NoDecoration = 1 << 3, // Platform Window: Disable platform title bar, borders, etc. + ImGuiViewportFlags_NoFocusOnAppearing = 1 << 4, // Platform Window: Don't take focus when created. + ImGuiViewportFlags_NoInputs = 1 << 5 // Platform Window: Make mouse pass through so we can drag this window while peaking behind it. }; struct ImGuiViewport