diff --git a/alv b/alv deleted file mode 100755 index b606f89..0000000 Binary files a/alv and /dev/null differ diff --git a/imgui.ini b/imgui.ini deleted file mode 100644 index 494ce45..0000000 --- a/imgui.ini +++ /dev/null @@ -1,8 +0,0 @@ -[Window][Debug##Default] -Pos=60,60 -Size=400,400 - -[Window][Settings] -Pos=60,60 -Size=170,48 - diff --git a/include/io.h b/include/io.h index 6037247..886f017 100644 --- a/include/io.h +++ b/include/io.h @@ -6,7 +6,7 @@ extern "C" { #endif -char* readFile(const char* filePath); +char* read_file(const char* filePath); #ifdef __cplusplus } diff --git a/include/main.h b/include/main.h new file mode 100644 index 0000000..027b121 --- /dev/null +++ b/include/main.h @@ -0,0 +1,8 @@ +#ifndef MAIN_H +#define MAIN_H + +#include // Include GLAD before GLFW +#include +#include + +#endif // MAIN_H diff --git a/source/io.c b/source/io.c index 739968b..242f6d9 100644 --- a/source/io.c +++ b/source/io.c @@ -1,6 +1,6 @@ #include "io.h" -char* readFile(const char* filePath) { +char* read_file(const char* filePath) { FILE* file = fopen(filePath, "rb"); if (file == NULL) { fprintf(stderr, "Error: Could not open file %s\n", filePath); diff --git a/source/main.cpp b/source/main.cpp index 0c628b1..61fbc71 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -1,7 +1,4 @@ -#include // Include GLAD before GLFW -#include -#include - +#include "main.h" #include "io.h" // ImGui includes @@ -9,103 +6,124 @@ #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 char FRAGMENT_SHADER_SOURCE[] = "./source/shader/fragment.glsl"; +const char VERTEX_SHADER_SOURCE[] = "./source/shader/vertex.glsl"; + +const char PROGRAM_NAME[] = "ImGui OpenGL Example"; const unsigned int SCR_WIDTH = 1920; const unsigned int SCR_HEIGHT = 1080; +const char *glsl_version; -// 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); -} +GLFWwindow *window; +unsigned int VBO, VAO; +unsigned int shader; -int main() { - glfwInit(); +__attribute__((constructor)) static void init_glfw(void) { + if (!glfwInit()) { + fprintf(stderr, "GLFW initialization failed\n"); + abort(); // program cannot continue + } +#ifdef __APPLE__ + glsl_version = "#version 330"; + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac +#else + glsl_version = "#version 130"; +#endif 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); + window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, PROGRAM_NAME, NULL, NULL); if (window == NULL) { - std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); - return -1; + fprintf(stderr, "Failed to create GLFW window\n"); + abort(); // program cannot continue } + glfwMakeContextCurrent(window); - glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + glfwSwapInterval(1); // Enable vsync - if (!gladLoadGLLoader(reinterpret_cast(glfwGetProcAddress))) { + if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; - return -1; + glfwTerminate(); } + glGenBuffers(1, &VBO); + glBindBuffer(GL_ARRAY_BUFFER, VBO); - // Compile shaders - char* vertexShaderSource = readFile(vertexShaderFile); - char* fragmentShaderSource = readFile(fragmentShaderFile); + glGenVertexArrays(1, &VAO); + glBindVertexArray(VAO); + glBindBuffer(GL_ARRAY_BUFFER, VBO); - unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); - glCompileShader(vertexShader); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0); - unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); - glCompileShader(fragmentShader); + char *vertex_shader_source = read_file(VERTEX_SHADER_SOURCE); + char *fragment_shader_source = read_file(FRAGMENT_SHADER_SOURCE); - unsigned int shaderProgram = glCreateProgram(); - glAttachShader(shaderProgram, vertexShader); - glAttachShader(shaderProgram, fragmentShader); - glLinkProgram(shaderProgram); + unsigned int vertex_shader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL); + glCompileShader(vertex_shader); - glDeleteShader(vertexShader); - glDeleteShader(fragmentShader); + unsigned int fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL); + glCompileShader(fragment_shader); - delete[] vertexShaderSource; - delete[] fragmentShaderSource; + shader = glCreateProgram(); + glAttachShader(shader, vertex_shader); + glAttachShader(shader, fragment_shader); + glLinkProgram(shader); - // --- 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); + glDeleteShader(vertex_shader); + glDeleteShader(fragment_shader); + + free(vertex_shader_source); + free(fragment_shader_source); +} + +__attribute__((destructor)) static void shutdown_glfw(void) { + glDeleteVertexArrays(1, &VAO); + glDeleteBuffers(1, &VBO); + glfwDestroyWindow(window); + glfwTerminate(); +} + +static inline void init_imgui() { + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGui::StyleColorsDark(); + ImGui_ImplGlfw_InitForOpenGL(window, true); + ImGui_ImplOpenGL3_Init(glsl_version); +} + +int main() { + init_imgui(); 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); + // Poll events glfwPollEvents(); + + // Start ImGui frame + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + // Create ImGui window + ImGui::Begin("Debug"); + ImGui::Text("FPS: %.1f", static_cast(ImGui::GetIO().Framerate)); + ImGui::End(); + + // Render + glClearColor(0.03f, 0.03f, 0.03f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // Render ImGui + ImGui::Render(); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + + // Swap buffers + glfwSwapBuffers(window); } - // 5. Clean up - ImGui_ImplOpenGL3_Shutdown(); - ImGui_ImplGlfw_Shutdown(); - ImGui::DestroyContext(); - glfwTerminate(); return 0; } diff --git a/test b/test deleted file mode 100755 index 3763289..0000000 Binary files a/test and /dev/null differ