#include #include #include #include #include #include #include // According to imgui documentation we have to do it this way in order to avoid link conflicts with windows.h extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); ImguiService::ImguiService() : OnDraw(m_drawSignal) { } ImguiService::~ImguiService() noexcept { } void ImguiService::Create(RenderSystemD3D11* apRenderSystem, HWND aHwnd) { m_imDriver.Initialize(static_cast(aHwnd)); // init platform if (!ImGui_ImplWin32_Init(aHwnd)) spdlog::error("Failed to initialize Imgui-Win32"); ImGui_ImplDX11_Init(apRenderSystem->GetDevice(), apRenderSystem->GetDeviceContext()); } void ImguiService::Render() const { ImGui_ImplDX11_NewFrame(); ImGui_ImplWin32_NewFrame(); ImGui::NewFrame(); m_drawSignal.publish(); ImGui::Render(); ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); } void ImguiService::Reset() const { // TODO: idk how imgui handles this } LRESULT ImguiService::WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { return ImGui_ImplWin32_WndProcHandler(hwnd, msg, wParam, lParam); } void ImguiService::RawInputHandler(RAWINPUT& aRawinput) { if (ImGui::GetCurrentContext() == NULL) return; ImGuiIO& io = ImGui::GetIO(); if (aRawinput.header.dwType == RIM_TYPEMOUSE) { const auto mouse = aRawinput.data.mouse; if (mouse.usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) { io.MouseDown[0] = true; } if (mouse.usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP) { io.MouseDown[0] = false; } if (mouse.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN) { io.MouseDown[1] = true; } if (mouse.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) { io.MouseDown[1] = false; } if (mouse.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN) { io.MouseDown[2] = true; } if (mouse.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP) { io.MouseDown[2] = false; } } }