/* * 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 "Input/InputManager.hpp" #include "Base/Logger.hpp" #include namespace OpenVulkano { ImGuiImplOpenVulkano ImGuiImplOpenVulkano::INSTANCE{}; namespace { Input::InputAction pressed("ImGuiMousePressed"); Input::InputAction positionX("ImGuiMousePositionX"); Input::InputAction positionY("ImGuiMousePositionY"); } void ImGuiImplOpenVulkano::Init(OpenVulkano::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; pressed.BindKey(Input::InputKey::Mouse::BUTTON_1); pressed.BindKey(Input::InputKey::Touch::BUTTON_TAP); pressed.BindKey(Input::InputKey::Touch::BUTTON_PAN); positionX.BindKey(Input::InputKey::Mouse::AXIS_X_ABS); positionX.BindKey(Input::InputKey::Touch::AXIS_TAP_X_ABS); positionX.BindKey(Input::InputKey::Touch::AXIS_PAN_X_ABS); positionY.BindKey(Input::InputKey::Mouse::AXIS_Y_ABS); positionY.BindKey(Input::InputKey::Touch::AXIS_TAP_Y_ABS); positionY.BindKey(Input::InputKey::Touch::AXIS_PAN_Y_ABS); } 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 = { m_window->GetContentScale(), m_window->GetContentScale() }; //if (bd->WantUpdateMonitors) //ImGui_ImplGlfw_UpdateMonitors(); // Setup time step io.DeltaTime = CURRENT_FRAME.frameTime; //TODO handle inputs auto input = Input::InputManager::GetInstance(); auto p = io.MousePos = { input->GetAxis(&positionX) / io.DisplayFramebufferScale.x, input->GetAxis(&positionY) / io.DisplayFramebufferScale.y }; io.MouseDown[0] = input->GetButton(&pressed); } void ImGuiImplOpenVulkano::Close() { ImGuiIO& io = ImGui::GetIO(); #ifndef __APPLE__ ImGui::DestroyPlatformWindows(); #endif io.BackendPlatformName = nullptr; io.BackendPlatformUserData = nullptr; io.BackendFlags = ImGuiBackendFlags_None; } }