#include "SDL.hpp" #ifdef _WIN32 #include "D3D.hpp" #include #include #endif #include #include #include #include namespace Li::Gui { SDL::SDL(std::string windowTitle, int windowWidth, int windowHeight) { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) { std::cout << "Error: " << SDL_GetError() << std::endl; return; } #ifdef SDL_HINT_IME_SHOW_UI SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); #endif SDL_WindowFlags windowFlags = (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); this->window = SDL_CreateWindow(windowTitle.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, windowWidth, windowHeight, windowFlags); SDL_VERSION(&this->wmInfo.version); SDL_GetWindowWMInfo(this->window, &this->wmInfo); #ifdef _WIN32 HWND hwnd = (HWND)this->wmInfo.info.win.window; this->renderer = new D3D(hwnd); #endif IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); io.IniFilename = nullptr; io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls ImGui::StyleColorsDark(); #ifdef _WIN32 ImGui_ImplSDL2_InitForD3D(this->window); this->renderer->InitImgui(); #endif isExiting = false; } bool SDL::IsExiting() { return this->isExiting; } void SDL::PollEvent() { SDL_Event event; while (SDL_PollEvent(&event)) { ImGui_ImplSDL2_ProcessEvent(&event); if (event.type == SDL_QUIT) this->isExiting = true; if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) this->isExiting = true; if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED && event.window.windowID == SDL_GetWindowID(window)) { // Release all outstanding references to the swap chain's buffers before resizing. #ifdef _WIN32 D3D* d3d = (D3D*)this->renderer; d3d->Resize(); #endif } } } void SDL::NewFrame() { this->renderer->ImGuiNewFrame(); ImGui_ImplSDL2_NewFrame(); ImGui::NewFrame(); } void SDL::Render() { ImGui::Render(); ImVec4 clearColor = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); this->renderer->Render(clearColor); } SDL::~SDL() { #ifdef _WIN32 ImGui_ImplDX11_Shutdown(); #endif ImGui_ImplSDL2_Shutdown(); ImGui::DestroyContext(); delete renderer; SDL_DestroyWindow(this->window); SDL_Quit(); } }