From b01ed99a1cd0c863c8709930658513c04dd70f61 Mon Sep 17 00:00:00 2001 From: rtk0c Date: Thu, 30 Jun 2022 23:47:26 -0700 Subject: Rename Entrypoint/ to ImGuiBackend/ for accuracy --- app/source/Cplt/ImGuiBackend/Backend_OpenGL2.cpp | 106 +++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 app/source/Cplt/ImGuiBackend/Backend_OpenGL2.cpp (limited to 'app/source/Cplt/ImGuiBackend/Backend_OpenGL2.cpp') diff --git a/app/source/Cplt/ImGuiBackend/Backend_OpenGL2.cpp b/app/source/Cplt/ImGuiBackend/Backend_OpenGL2.cpp new file mode 100644 index 0000000..943a527 --- /dev/null +++ b/app/source/Cplt/ImGuiBackend/Backend_OpenGL2.cpp @@ -0,0 +1,106 @@ +#include "Backend.hpp" + +#if BUILD_CORE_WITH_OPENGL2_BACKEND +# include + +# include +# include +# include +# include +# include +# include + +# define IMGUI_IMPL_OPENGL_LOADER_CUSTOM +# include + +class OpenGL2Backend : public RenderingBackend +{ +private: + GLFWwindow* mWindow; + +public: + OpenGL2Backend() + { + glfwSetErrorCallback(&GlfwErrorCallback); + if (!glfwInit()) { + throw std::runtime_error("Failed to initialize GLFW."); + } + + mWindow = glfwCreateWindow(1280, 720, "Cplt", nullptr, nullptr); + if (mWindow == nullptr) { + throw std::runtime_error("Failed to create GLFW window."); + } + glfwMakeContextCurrent(mWindow); + glfwSwapInterval(1); // Enable vsync + + if (gladLoadGLLoader((GLADloadproc)glfwGetProcAddress) == 0) { + throw std::runtime_error("Failed to initialize OpenGL."); + } + + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + + ImGui_ImplGlfw_InitForOpenGL(mWindow, true); + ImGui_ImplOpenGL2_Init(); + } + + virtual ~OpenGL2Backend() + { + ImGui_ImplOpenGL2_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + + glfwDestroyWindow(mWindow); + glfwTerminate(); + } + + virtual void RunUntilWindowClose(void (*windowContent)()) + { + while (!glfwWindowShouldClose(mWindow)) { + glfwPollEvents(); + + ImGui_ImplOpenGL2_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + windowContent(); + + int displayWidth, displayHeight; + glfwGetFramebufferSize(mWindow, &displayWidth, &displayHeight); + glViewport(0, 0, displayWidth, displayHeight); + + const ImVec4 kClearColor = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + glClearColor(kClearColor.x * kClearColor.w, kClearColor.y * kClearColor.w, kClearColor.z * kClearColor.w, kClearColor.w); + glClear(GL_COLOR_BUFFER_BIT); + + ImGui::Render(); + ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); + + glfwMakeContextCurrent(mWindow); + glfwSwapBuffers(mWindow); + } + } + + static void GlfwErrorCallback(int errorCode, const char* message) + { + std::cerr << "GLFW Error " << errorCode << ": " << message << "\n"; + } +}; + +std::unique_ptr RenderingBackend::CreateOpenGL2Backend() +{ + try { + return std::make_unique(); + } catch (std::exception& e) { + return nullptr; + } +} + +#else // ^^ BUILD_CORE_WITH_OPENGL2_BACKEND | !BUILD_CORE_WITH_OPENGL2_BACKEND vv + +std::unique_ptr RenderingBackend::CreateOpenGL2Backend() +{ + return nullptr; +} + +#endif -- cgit v1.2.3-70-g09d2