#include "common.hpp" #include "file_manager.hpp" #include "fonts/fonts.hpp" #include "gui.hpp" #include "pointers.hpp" #include "renderer.hpp" #include #include #include #include IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); namespace big { renderer::renderer() : m_dxgi_swapchain(*g_pointers->m_swapchain) { void *d3d_device{}; if (SUCCEEDED(m_dxgi_swapchain->GetDevice(__uuidof(ID3D11Device), &d3d_device))) { m_d3d_device.Attach(static_cast(d3d_device)); } else { throw std::runtime_error("Failed to get D3D device."); } m_d3d_device->GetImmediateContext(m_d3d_device_context.GetAddressOf()); auto file_path = g_file_manager->get_project_file("./imgui.ini").get_path(); ImGuiContext* ctx = ImGui::CreateContext(); static std::string path = file_path.make_preferred().string(); ctx->IO.IniFilename = path.c_str(); ImGui_ImplDX11_Init(m_d3d_device.Get(), m_d3d_device_context.Get()); ImGui_ImplWin32_Init(g_pointers->m_hwnd); ImFontConfig font_cfg{}; font_cfg.FontDataOwnedByAtlas = false; std::strcpy(font_cfg.Name, "Storopia"); m_font = ImGui::GetIO().Fonts->AddFontFromMemoryTTF(const_cast(font_storopia), sizeof(font_storopia), 20.f, &font_cfg); g->window.font_title = ImGui::GetIO().Fonts->AddFontFromMemoryTTF(const_cast(font_storopia), sizeof(font_storopia), 40.f, &font_cfg); g->window.font_sub_title = ImGui::GetIO().Fonts->AddFontFromMemoryTTF(const_cast(font_storopia), sizeof(font_storopia), 30.f, &font_cfg); g->window.font_small = ImGui::GetIO().Fonts->AddFontFromMemoryTTF(const_cast(font_storopia), sizeof(font_storopia), 17.5f, &font_cfg); g_gui.dx_init(); g_renderer = this; } renderer::~renderer() { ImGui_ImplWin32_Shutdown(); ImGui_ImplDX11_Shutdown(); ImGui::DestroyContext(); g_renderer = nullptr; } void renderer::on_present() { if (g_gui.m_opened) { ImGui::GetIO().MouseDrawCursor = true; ImGui::GetIO().ConfigFlags &= ~ImGuiConfigFlags_NoMouse; } else { ImGui::GetIO().MouseDrawCursor = false; ImGui::GetIO().ConfigFlags |= ImGuiConfigFlags_NoMouse; } ImGui_ImplDX11_NewFrame(); ImGui_ImplWin32_NewFrame(); ImGui::NewFrame(); g_gui.always_draw(); if (g_gui.m_opened) { g_gui.dx_on_tick(); } ImGui::Render(); ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); } void renderer::pre_reset() { ImGui_ImplDX11_InvalidateDeviceObjects(); } void renderer::post_reset() { ImGui_ImplDX11_CreateDeviceObjects(); } void renderer::wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { if (msg == WM_KEYUP && wparam == g->settings.hotkeys.menu_toggle) { //Persist and restore the cursor position between menu instances. static POINT cursor_coords{}; if (g_gui.m_opened) { GetCursorPos(&cursor_coords); } else if (cursor_coords.x + cursor_coords.y != 0) { SetCursorPos(cursor_coords.x, cursor_coords.y); } g_gui.m_opened = g->settings.hotkeys.editing_menu_toggle || !g_gui.m_opened; if (g->settings.hotkeys.editing_menu_toggle) g->settings.hotkeys.editing_menu_toggle = false; } if (g_gui.m_opened) { ImGui_ImplWin32_WndProcHandler(hwnd, msg, wparam, lparam); } } }