#include // Include GLAD before GLFW #include #include #include "io.h" // ImGui includes #include "imgui/imgui.h" #include "imgui/imgui_impl_glfw.h" #include "imgui/imgui_impl_opengl3.h" char* fragmentShaderFile = "./source/shader/fragment.glsl"; char* vertexShaderFile = "./source/shader/vertex.glsl"; const unsigned int SCR_WIDTH = 1920; const unsigned int SCR_HEIGHT = 1080; // Callback to resize the viewport when the window is resized void framebuffer_size_callback(GLFWwindow *window, int width, int height) { (void)window; // Unused parameter glViewport(0, 0, width, height); } int main() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); #ifdef __APPLE__ const char* glsl_version = "#version 330"; glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac #endif GLFWwindow *window = glfwCreateWindow( SCR_WIDTH, SCR_HEIGHT , "OpenGLTemplate", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); if (!gladLoadGLLoader(reinterpret_cast(glfwGetProcAddress))) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } // Compile shaders char* vertexShaderSource = readFile(vertexShaderFile); char* fragmentShaderSource = readFile(fragmentShaderFile); unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); unsigned int shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); glDeleteShader(vertexShader); glDeleteShader(fragmentShader); delete[] vertexShaderSource; delete[] fragmentShaderSource; // --- ImGui Setup Start --- IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO &io = ImGui::GetIO(); (void)io; ImGui::StyleColorsDark(); ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init(glsl_version); while (!glfwWindowShouldClose(window)) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); ImGui::Begin("Settings"); ImGui::Text("FPS: %.1f", static_cast(ImGui::GetIO().Framerate)); ImGui::End(); glUseProgram(shaderProgram); glClearColor(0.01f, 0.01f, 0.01f, 1.0f); // Set clear color (Dark Gray) glClear(GL_COLOR_BUFFER_BIT); // Clear the screen ImGui::Render(); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); glfwSwapBuffers(window); glfwPollEvents(); } // 5. Clean up ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplGlfw_Shutdown(); ImGui::DestroyContext(); glfwTerminate(); return 0; }