diff --git a/openVulkanoCpp/Host/ImGuiImplOpenVulkano.cpp b/openVulkanoCpp/Host/ImGuiImplOpenVulkano.cpp new file mode 100644 index 0000000..bf1752c --- /dev/null +++ b/openVulkanoCpp/Host/ImGuiImplOpenVulkano.cpp @@ -0,0 +1,69 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#include "ImGuiImplOpenVulkano.hpp" +#include "Base/FrameMetadata.hpp" +#include + +namespace openVulkanoCpp +{ + ImGuiImplOpenVulkano ImGuiImplOpenVulkano::INSTANCE{}; + + void ImGuiImplOpenVulkano::Init(openVulkanoCpp::IWindow* window) + { + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!"); + + m_window = window; + + io.BackendPlatformUserData = this; + io.BackendPlatformName = "imgui_impl_ios"; + + /*io.SetClipboardTextFn = ImGui_ImplGlfw_SetClipboardText; + io.GetClipboardTextFn = ImGui_ImplGlfw_GetClipboardText; + io.ClipboardUserData = bd->Window;*/ + + + ImGuiViewport* mainViewport = ImGui::GetMainViewport(); + mainViewport->PlatformHandle = m_window; + } + + void ImGuiImplOpenVulkano::NewFrame() + { + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(m_window != nullptr && "Did you call Init?"); + + // Setup display size (every frame to accommodate for window resizing) + /*int w, h; + int display_w, display_h; + glfwGetWindowSize(bd->Window, &w, &h); + glfwGetFramebufferSize(bd->Window, &display_w, &display_h); + io.DisplaySize = ImVec2((float)w, (float)h); + if (w > 0 && h > 0) + io.DisplayFramebufferScale = ImVec2((float)display_w / (float)w, (float)display_h / (float)h);*/ + io.DisplaySize = { static_cast(m_window->GetWidth()), static_cast(m_window->GetHeight()) }; + io.DisplayFramebufferScale = { 1, 1 }; + + //if (bd->WantUpdateMonitors) + //ImGui_ImplGlfw_UpdateMonitors(); + + // Setup time step + io.DeltaTime = CURRENT_FRAME.frameTime; + + //TODO handle inputs + } + + void ImGuiImplOpenVulkano::Close() + { + ImGuiIO& io = ImGui::GetIO(); + + ImGui::DestroyPlatformWindows(); + + io.BackendPlatformName = nullptr; + io.BackendPlatformUserData = nullptr; + io.BackendFlags = ImGuiBackendFlags_None; + } +} \ No newline at end of file diff --git a/openVulkanoCpp/Host/ImGuiImplOpenVulkano.hpp b/openVulkanoCpp/Host/ImGuiImplOpenVulkano.hpp new file mode 100644 index 0000000..81bdc30 --- /dev/null +++ b/openVulkanoCpp/Host/ImGuiImplOpenVulkano.hpp @@ -0,0 +1,26 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include "Base/UI/IWindow.hpp" + +namespace openVulkanoCpp +{ + class ImGuiImplOpenVulkano + { + IWindow* m_window; + + public: + static ImGuiImplOpenVulkano INSTANCE; + + void Init(IWindow* window); + + void NewFrame(); + + void Close(); + }; +} diff --git a/openVulkanoCpp/Vulkan/UiRenderer.cpp b/openVulkanoCpp/Vulkan/UiRenderer.cpp index b6384ca..9d538e3 100644 --- a/openVulkanoCpp/Vulkan/UiRenderer.cpp +++ b/openVulkanoCpp/Vulkan/UiRenderer.cpp @@ -12,6 +12,8 @@ #if __has_include("GLFW/glfw3.h") #include #define GLFW_AVAILABLE +#else +#include "Host/ImGuiImplOpenVulkano.hpp" #endif namespace openVulkanoCpp::Vulkan @@ -61,6 +63,8 @@ namespace openVulkanoCpp::Vulkan ImGui_ImplVulkan_Init(&vkInfo, uiRenderPass.renderPass); #ifdef GLFW_AVAILABLE ImGui_ImplGlfw_InitForVulkan((GLFWwindow*)context->window->GetNativeWindowHandle(), true); +#else + ImGuiImplOpenVulkano::INSTANCE.Init(context->window); #endif uiInitialized = true; @@ -70,6 +74,11 @@ namespace openVulkanoCpp::Vulkan void UiRenderer::Close() { uiInitialized = false; +#ifdef GLFW_AVAILABLE + ImGui_ImplGlfw_Shutdown(); +#else + ImGuiImplOpenVulkano::INSTANCE.Close(); +#endif ImGui_ImplVulkan_Shutdown(); device.destroy(descriptorPool); } @@ -79,6 +88,8 @@ namespace openVulkanoCpp::Vulkan ImGui_ImplVulkan_NewFrame(); #ifdef GLFW_AVAILABLE ImGui_ImplGlfw_NewFrame(); +#else + ImGuiImplOpenVulkano::INSTANCE.NewFrame(); #endif ImGui::NewFrame(); }