#include "CApplication.h" CApplication::CApplication() { } CApplication::CApplication(CApplication &&other) noexcept { } CApplication::CApplication(int argcs,char** argv) noexcept { this->argc = argcs; this->argv = new std::string[argc+1]; for (int i = 0; i < argcs; i++) { this->argv[i] = argv[i]; } } CApplication::CApplication(CApplication *CApp) { } #ifdef _WIN32 // Data stored per platform window struct WGL_WindowData { HDC hDC; }; // Data static HGLRC g_hRC; static WGL_WindowData g_MainWindow; static int g_Width; static int g_Height; bool CreateDeviceWGL(HWND hWnd, WGL_WindowData* data) { HDC hDc = ::GetDC(hWnd); PIXELFORMATDESCRIPTOR pfd = { 0 }; pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; const int pf = ::ChoosePixelFormat(hDc, &pfd); if (pf == 0) return false; if (::SetPixelFormat(hDc, pf, &pfd) == FALSE) return false; ::ReleaseDC(hWnd, hDc); data->hDC = ::GetDC(hWnd); if (!g_hRC) g_hRC = wglCreateContext(data->hDC); return true; } void CleanupDeviceWGL(HWND hWnd, WGL_WindowData* data) { wglMakeCurrent(nullptr, nullptr); ::ReleaseDC(hWnd, data->hDC); } extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) return true; switch (msg) { case WM_SIZE: if (wParam != SIZE_MINIMIZED) { g_Width = LOWORD(lParam); g_Height = HIWORD(lParam); } return 0; case WM_SYSCOMMAND: if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu return 0; break; case WM_DESTROY: ::PostQuitMessage(0); return 0; } return ::DefWindowProcW(hWnd, msg, wParam, lParam); } std::wstring String2Wstring(std::string wstr) { std::wstring res; int len = MultiByteToWideChar(CP_ACP, 0, wstr.c_str(), wstr.size(), nullptr, 0); if( len < 0 ){ return res; } wchar_t* buffer = new wchar_t[len + 1]; if( buffer == nullptr){ return res; } MultiByteToWideChar(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len); buffer[len] = '\0'; res.append(buffer); delete[] buffer; return res; } #endif // bool CApplication::WindowCreate() { #ifdef _WIN32 glfwSetErrorCallback(glfw_error_callback); if (!glfwInit()) return false; // Decide GL+GLSL versions #if defined(IMGUI_IMPL_OPENGL_ES2) // GL ES 2.0 + GLSL 100 glsl_version = "#version 100"; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); #elif defined(__APPLE__) // GL 3.2 + GLSL 150 glsl_version = "#version 150"; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac #else // GL 3.0 + GLSL 130 glsl_version = "#version 130"; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE); //glfwWindowHint(GLFW_DECORATED, GLFW_FALSE); // glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 3.0+ only #endif if(NoFrameFlag) { glfwWindowHint(GLFW_DECORATED, GLFW_FALSE); glfwWindowHint(GLFW_FLOATING, GLFW_TRUE); } mode = (GLFWvidmode*)glfwGetVideoMode(glfwGetPrimaryMonitor()); // Create window with graphics context window = glfwCreateWindow((int)Size.width,(int)Size.height,Title.c_str(), nullptr, nullptr); if (window == nullptr) return false; WindowCreateFlag = true; // glfwSetWindowOpacity(window,this->opacity); if(CenterFlag) { int width = Size.width, height = Size.height; Pos.X = (mode->width - width) / 2; Pos.Y = (mode->height - height) / 2; } glfwSetWindowPos(window,Pos.X,Pos.Y); glfwMakeContextCurrent(window); glfwSwapInterval(1); // Enable vsync // Setup Dear ImGui context IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls //io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking ImGui::StyleColorsDark(); ImGuiStyle& style = ImGui::GetStyle(); if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) { style.WindowRounding = 15.0f; style.Colors[ImGuiCol_WindowBg].w = 1.0f; } #else glfwSetErrorCallback(glfw_error_callback); if (!glfwInit()) return false; // Decide GL+GLSL versions #if defined(IMGUI_IMPL_OPENGL_ES2) // GL ES 2.0 + GLSL 100 glsl_version = "#version 100"; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); #elif defined(__APPLE__) // GL 3.2 + GLSL 150 glsl_version = "#version 150"; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac #else // GL 3.0 + GLSL 130 glsl_version = "#version 130"; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); //glfwWindowHint(GLFW_DECORATED, GLFW_FALSE); glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE); //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 3.0+ only #endif if(NoFrameFlag) { glfwWindowHint(GLFW_DECORATED, GLFW_FALSE); glfwWindowHint(GLFW_FLOATING, GLFW_TRUE); } mode = (GLFWvidmode*)glfwGetVideoMode(glfwGetPrimaryMonitor()); // Create window with graphics context window = glfwCreateWindow((int)Size.width,(int)Size.height,Title.c_str(), nullptr, nullptr); if (window == nullptr) return false; WindowCreateFlag = true; //glfwSetWindowOpacity(window,this->opacity); if(CenterFlag) { int width = Size.width, height = Size.height; Pos.X = (mode->width - width) / 2; Pos.Y = (mode->height - height) / 2; } glfwSetWindowPos(window,Pos.X,Pos.Y); glfwMakeContextCurrent(window); glfwSwapInterval(1); // Enable vsync this->x11Window = glfwGetX11Window(window); display = glfwGetX11Display(); // Setup Dear ImGui context IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls //io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking ImGui::StyleColorsDark(); ImGuiStyle& style = ImGui::GetStyle(); if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) { style.WindowRounding = 15.0f; style.Colors[ImGuiCol_WindowBg].w = 1.0f; } #endif return true; } void CApplication::InitGL() { #ifdef _WIN32 #else #endif // Setup Platform/Renderer backends ImGui_ImplGlfw_InitForOpenGL(window, true); #ifdef __EMSCRIPTEN__ ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback("#canvas"); #endif ImGui_ImplOpenGL3_Init(glsl_version.c_str()); } bool CApplication::NewFrame() { #ifdef _WIN32 #else #endif #ifdef __EMSCRIPTEN__ // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. io.IniFilename = nullptr; EMSCRIPTEN_MAINLOOP_BEGIN glfwPollEvents(); // Start the Dear ImGui frame ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); return true; #else #endif auto flags = !glfwWindowShouldClose(window); if(!flags) { } return flags; } void CApplication::Render() { #ifdef _WIN32 #else #endif ImGui::Render(); int display_w, display_h; glfwGetFramebufferSize(window, &display_w, &display_h); glViewport(0, 0, display_w, display_h); glClearColor(ClearGround.x * ClearGround.w, ClearGround.y * ClearGround.w, ClearGround.z * ClearGround.w, ClearGround.w); glClear(GL_COLOR_BUFFER_BIT); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); auto io = ImGui::GetIO(); if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) { GLFWwindow* backup_current_context = glfwGetCurrentContext(); ImGui::UpdatePlatformWindows(); ImGui::RenderPlatformWindowsDefault(); glfwMakeContextCurrent(backup_current_context); } glfwSwapBuffers(window); } int CApplication::SwapBuffers() { #ifdef _WIN32 #else #endif ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplGlfw_Shutdown(); delete UI_ID::Fons; //ImGui::DestroyContext(); glfwDestroyWindow(window); glfwTerminate(); return 0; } int CApplication::Stop() { return 0; } CCString CApplication::GetTheProgramDirectory() { char buffer[PATH_MAX] = {0}; if (getcwd(buffer, sizeof(buffer)) != nullptr) { return buffer; } else { perror("getcwd() error"); return ""; } } void CApplication::Close() { exit(0); }