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" {
#endif
char* readFile(const char* filePath);
char* read_file(const char* filePath);
#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"
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);

View File

@ -1,7 +1,4 @@
#include <glad/glad.h> // Include GLAD before GLFW
#include <GLFW/glfw3.h>
#include <iostream>
#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<GLADloadproc>(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 ---
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();
ImGuiIO &io = ImGui::GetIO();
(void)io;
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);
// Poll events
glfwPollEvents();
// Start ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
ImGui::Begin("Settings");
// Create ImGui window
ImGui::Begin("Debug");
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
// 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);
glfwPollEvents();
}
// 5. Clean up
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
glfwTerminate();
return 0;
}

BIN
test

Binary file not shown.