Improved openGL and ImGUI implementation

This commit is contained in:
Afonso Clerigo Mendes de Sousa 2026-02-26 19:20:41 +00:00
parent 2364038c5c
commit 645faf6546
7 changed files with 102 additions and 84 deletions

BIN
alv

Binary file not shown.

View File

@ -1,8 +0,0 @@
[Window][Debug##Default]
Pos=60,60
Size=400,400
[Window][Settings]
Pos=60,60
Size=170,48

View File

@ -6,7 +6,7 @@
extern "C" { extern "C" {
#endif #endif
char* readFile(const char* filePath); char* read_file(const char* filePath);
#ifdef __cplusplus #ifdef __cplusplus
} }

8
include/main.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef MAIN_H
#define MAIN_H
#include <glad/glad.h> // Include GLAD before GLFW
#include <GLFW/glfw3.h>
#include <iostream>
#endif // MAIN_H

View File

@ -1,6 +1,6 @@
#include "io.h" #include "io.h"
char* readFile(const char* filePath) { char* read_file(const char* filePath) {
FILE* file = fopen(filePath, "rb"); FILE* file = fopen(filePath, "rb");
if (file == NULL) { if (file == NULL) {
fprintf(stderr, "Error: Could not open file %s\n", filePath); fprintf(stderr, "Error: Could not open file %s\n", filePath);

View File

@ -1,7 +1,4 @@
#include <glad/glad.h> // Include GLAD before GLFW #include "main.h"
#include <GLFW/glfw3.h>
#include <iostream>
#include "io.h" #include "io.h"
// ImGui includes // ImGui includes
@ -9,103 +6,124 @@
#include "imgui/imgui_impl_glfw.h" #include "imgui/imgui_impl_glfw.h"
#include "imgui/imgui_impl_opengl3.h" #include "imgui/imgui_impl_opengl3.h"
char* fragmentShaderFile = "./source/shader/fragment.glsl"; const char FRAGMENT_SHADER_SOURCE[] = "./source/shader/fragment.glsl";
char* vertexShaderFile = "./source/shader/vertex.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_WIDTH = 1920;
const unsigned int SCR_HEIGHT = 1080; const unsigned int SCR_HEIGHT = 1080;
const char *glsl_version;
// Callback to resize the viewport when the window is resized GLFWwindow *window;
void framebuffer_size_callback(GLFWwindow *window, int width, int height) { unsigned int VBO, VAO;
(void)window; // Unused parameter unsigned int shader;
glViewport(0, 0, width, height);
}
int main() { __attribute__((constructor)) static void init_glfw(void) {
glfwInit(); 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_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__ window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, PROGRAM_NAME, NULL, NULL);
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) { if (window == NULL) {
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate(); glfwTerminate();
return -1; fprintf(stderr, "Failed to create GLFW window\n");
abort(); // program cannot continue
} }
glfwMakeContextCurrent(window); glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glfwSwapInterval(1); // Enable vsync
if (!gladLoadGLLoader(reinterpret_cast<GLADloadproc>(glfwGetProcAddress))) { if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl; std::cout << "Failed to initialize GLAD" << std::endl;
return -1; glfwTerminate();
} }
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// Compile shaders glGenVertexArrays(1, &VAO);
char* vertexShaderSource = readFile(vertexShaderFile); glBindVertexArray(VAO);
char* fragmentShaderSource = readFile(fragmentShaderFile); glBindBuffer(GL_ARRAY_BUFFER, VBO);
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); glEnableVertexAttribArray(0);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0);
glCompileShader(vertexShader);
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); char *vertex_shader_source = read_file(VERTEX_SHADER_SOURCE);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); char *fragment_shader_source = read_file(FRAGMENT_SHADER_SOURCE);
glCompileShader(fragmentShader);
unsigned int shaderProgram = glCreateProgram(); unsigned int vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glAttachShader(shaderProgram, vertexShader); glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
glAttachShader(shaderProgram, fragmentShader); glCompileShader(vertex_shader);
glLinkProgram(shaderProgram);
glDeleteShader(vertexShader); unsigned int fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glDeleteShader(fragmentShader); glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);
glCompileShader(fragment_shader);
delete[] vertexShaderSource; shader = glCreateProgram();
delete[] fragmentShaderSource; glAttachShader(shader, vertex_shader);
glAttachShader(shader, fragment_shader);
glLinkProgram(shader);
// --- ImGui Setup Start --- glDeleteShader(vertex_shader);
IMGUI_CHECKVERSION(); glDeleteShader(fragment_shader);
ImGui::CreateContext();
ImGuiIO &io = ImGui::GetIO(); free(vertex_shader_source);
(void)io; free(fragment_shader_source);
ImGui::StyleColorsDark(); }
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init(glsl_version); __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)) { while (!glfwWindowShouldClose(window)) {
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) // Poll events
glfwSetWindowShouldClose(window, true);
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
ImGui::Begin("Settings");
ImGui::Text("FPS: %.1f", static_cast<double>(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(); glfwPollEvents();
// Start ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
// Create ImGui window
ImGui::Begin("Debug");
ImGui::Text("FPS: %.1f", static_cast<double>(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; return 0;
} }

BIN
test

Binary file not shown.