From 385896da0fd4252eb2548d832aef6f5005834a18 Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 29 Apr 2024 22:41:13 +1200 Subject: [PATCH] lots of changes --- include/debugging.h | 6 ++++ include/events.h | 9 ++++++ include/init.h | 9 ++++++ include/opengl.h | 7 ++++ include/shaders.h | 9 ++++++ include/types.h | 8 +++++ shader.frag | 8 +++++ shader.vert | 10 ++++++ src/debugging.c | 79 +++++++++++++++++++++++++++++++++++++++++++++ src/events.c | 11 +++++++ src/init.c | 43 ++++++++++++++++++++++++ src/main.c | 77 ++++++++++++++++++------------------------- src/shaders.c | 67 ++++++++++++++++++++++++++++++++++++++ 13 files changed, 298 insertions(+), 45 deletions(-) create mode 100644 include/debugging.h create mode 100644 include/events.h create mode 100644 include/init.h create mode 100644 include/opengl.h create mode 100644 include/shaders.h create mode 100644 include/types.h create mode 100644 shader.frag create mode 100644 shader.vert create mode 100644 src/debugging.c create mode 100644 src/events.c create mode 100644 src/init.c create mode 100644 src/shaders.c diff --git a/include/debugging.h b/include/debugging.h new file mode 100644 index 0000000..d923c0a --- /dev/null +++ b/include/debugging.h @@ -0,0 +1,6 @@ +#ifndef __DEBUGGING_H__ +#define __DEBUGGING_H__ + +void enable_debugging(); + +#endif diff --git a/include/events.h b/include/events.h new file mode 100644 index 0000000..150d879 --- /dev/null +++ b/include/events.h @@ -0,0 +1,9 @@ +#ifndef __EVENTS_H__ +#define __EVENTS_H__ + +#include + +void framebuffer_size_callback(Window window, int width, int height); +void process_input(Window window); + +#endif diff --git a/include/init.h b/include/init.h new file mode 100644 index 0000000..ff59926 --- /dev/null +++ b/include/init.h @@ -0,0 +1,9 @@ +#ifndef __INIT_H__ +#define __INIT_H__ + +#include + +void init_gl(int major, int minor); +Window create_window(int width, int height, const char* title); + +#endif diff --git a/include/opengl.h b/include/opengl.h new file mode 100644 index 0000000..73ddc0e --- /dev/null +++ b/include/opengl.h @@ -0,0 +1,7 @@ +#ifndef __OPENGL_H__ +#define __OPENGL_H__ + +#include +#include + +#endif diff --git a/include/shaders.h b/include/shaders.h new file mode 100644 index 0000000..2966351 --- /dev/null +++ b/include/shaders.h @@ -0,0 +1,9 @@ +#ifndef __SHADERS_H__ +#define __SHADERS_H__ + +#include + +uint32_t compile_shader(const char* path, int32_t type); +uint32_t load_shader_program(uint32_t shader, ...); + +#endif diff --git a/include/types.h b/include/types.h new file mode 100644 index 0000000..fd4eb5d --- /dev/null +++ b/include/types.h @@ -0,0 +1,8 @@ +#ifndef __TYPES_H__ +#define __TYPES_H__ + +#include + +typedef GLFWwindow* Window; + +#endif diff --git a/shader.frag b/shader.frag new file mode 100644 index 0000000..e6c3540 --- /dev/null +++ b/shader.frag @@ -0,0 +1,8 @@ +#version 460 core + +in vec4 fragColor; +out vec4 finalColor; + +void main() { + finalColor = fragColor; +} diff --git a/shader.vert b/shader.vert new file mode 100644 index 0000000..09a1e4d --- /dev/null +++ b/shader.vert @@ -0,0 +1,10 @@ +#version 460 core + +layout(location = 0) in vec3 aPos; + +out vec4 fragColor; + +void main() { + gl_Position = vec4(aPos, 1.0); + fragColor = vec4(1.0, 0.0, 0.0, 1.0); +} diff --git a/src/debugging.c b/src/debugging.c new file mode 100644 index 0000000..079e577 --- /dev/null +++ b/src/debugging.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include + +void message_callback(int32_t source, int32_t type, uint32_t id, int32_t severity, size_t length, char const* message, void const* user_param) +{ + char* src_str; + switch (source) { + case GL_DEBUG_SOURCE_API: + src_str = "API"; + break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: + src_str = "WINDOW SYSTEM"; + break; + case GL_DEBUG_SOURCE_SHADER_COMPILER: + src_str = "SHADER COMPILER"; + break; + case GL_DEBUG_SOURCE_THIRD_PARTY: + src_str = "THIRD PARTY"; + break; + case GL_DEBUG_SOURCE_APPLICATION: + src_str = "APPLICATION"; + break; + case GL_DEBUG_SOURCE_OTHER: + src_str = "OTHER"; + break; + } + + char* type_str; + switch (type) { + case GL_DEBUG_TYPE_ERROR: + type_str = "ERROR"; + break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: + type_str = "DEPRECATED_BEHAVIOR"; + break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: + type_str = "UNDEFINED_BEHAVIOR"; + break; + case GL_DEBUG_TYPE_PORTABILITY: + type_str = "PORTABILITY"; + break; + case GL_DEBUG_TYPE_PERFORMANCE: + type_str = "PERFORMANCE"; + break; + case GL_DEBUG_TYPE_MARKER: + type_str = "MARKER"; + break; + case GL_DEBUG_TYPE_OTHER: + type_str = "OTHER"; + break; + } + + char* severity_str; + switch (severity) { + case GL_DEBUG_SEVERITY_NOTIFICATION: + severity_str = "NOTIFICATION"; + break; + case GL_DEBUG_SEVERITY_LOW: + severity_str = "LOW"; + break; + case GL_DEBUG_SEVERITY_MEDIUM: + severity_str = "MEDIUM"; + break; + case GL_DEBUG_SEVERITY_HIGH: + severity_str = "HIGH"; + break; + } + + printf("[%s] %s (%s): %d, %s\n", src_str, type_str, severity_str, id, message); +} + +void enable_debugging() { + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, NULL, GL_FALSE); + glDebugMessageCallback((GLDEBUGPROC)message_callback, NULL); +} diff --git a/src/events.c b/src/events.c new file mode 100644 index 0000000..681a46e --- /dev/null +++ b/src/events.c @@ -0,0 +1,11 @@ +#include + +void framebuffer_size_callback(Window window, int width, int height) { + glViewport(0, 0, width, height); +} + +void process_input(Window window) { + if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) + glfwSetWindowShouldClose(window, GLFW_TRUE); +} + diff --git a/src/init.c b/src/init.c new file mode 100644 index 0000000..a84408a --- /dev/null +++ b/src/init.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include + +#include + +void init_gl(int major, int minor) { + if(!glfwInit()) { + printf("[GLFW] Failed to initialize\n"); + exit(-1); + } else { + printf("[GLFW] Initialized successfully\n"); + } + + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, major); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, minor); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); +} + +Window create_window(int width, int height, const char* title) { + Window window = glfwCreateWindow(width, height, title, NULL, NULL); + if(!window) { + printf("[GLFW] Failed to create window\n"); + glfwTerminate(); + exit(-1); + } else { + printf("[GLFW] Window created successfully\n"); + } + glfwMakeContextCurrent(window); + glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + + if (!gladLoadGL((GLADloadfunc)glfwGetProcAddress)) { + printf("[GLAD] Failed to initialize\n"); + exit(-1); + } else { + printf("[GLAD] Initialized successfully\n"); + } + + glViewport(0, 0, width, height); + + return window; +} diff --git a/src/main.c b/src/main.c index 461b8c2..29cf349 100644 --- a/src/main.c +++ b/src/main.c @@ -1,51 +1,33 @@ -#include -#include -#include -#include - -void framebuffer_size_callback(GLFWwindow* window, int width, int height) { - glViewport(0, 0, width, height); -} - -void process_input(GLFWwindow *window) { - if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) - glfwSetWindowShouldClose(window, GLFW_TRUE); -} - -void init_glfw(int major, int minor) { - if(!glfwInit()) { - fprintf(stderr, "Failed to initialize GLFW\n"); - exit(-1); - } - - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, major); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, minor); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); -} - -GLFWwindow* create_window(int width, int height, const char* title) { - GLFWwindow* window = glfwCreateWindow(width, height, title, NULL, NULL); - if(!window) { - fprintf(stderr, "Failed to create GLFW window\n"); - glfwTerminate(); - exit(-1); - } - glfwMakeContextCurrent(window); - glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); - - if (!gladLoadGL((GLADloadfunc)glfwGetProcAddress)) { - fprintf(stderr, "Failed to initialize GLAD\n"); - exit(-1); - } - - glViewport(0, 0, width, height); - - return window; -} +#include +#include +#include +#include int main() { - init_glfw(4, 6); + init_gl(4, 6); GLFWwindow* window = create_window(800, 600, "gearlib"); + enable_debugging(); + + float vertices[] = { + -0.5f, -0.5f, 0.0f, // bottom left + 0.5f, -0.5f, 0.0f, // bottom right + 0.0f, 0.5f, 0.0f // top + }; + + uint32_t vbo; + glCreateBuffers(1, &vbo); + glNamedBufferStorage(vbo, sizeof(vertices), vertices, GL_DYNAMIC_STORAGE_BIT); + + uint32_t vao; + glCreateVertexArrays(1, &vao); + glVertexArrayVertexBuffer(vao, 0, vbo, 0, 3 * sizeof(float)); + glEnableVertexArrayAttrib(vao, 0); + glVertexArrayAttribFormat(vao, 0, 3, GL_FLOAT, GL_FALSE, 0); + glVertexArrayAttribBinding(vao, 0, 0); + + uint32_t program = load_shader_program( + compile_shader("shader.vert", GL_VERTEX_SHADER), + compile_shader("shader.frag", GL_FRAGMENT_SHADER), 0); while (!glfwWindowShouldClose(window)) { process_input(window); @@ -53,6 +35,11 @@ int main() { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(program); + + glBindVertexArray(vao); + glDrawArrays(GL_TRIANGLES, 0, 3); + glfwSwapBuffers(window); glfwPollEvents(); } diff --git a/src/shaders.c b/src/shaders.c new file mode 100644 index 0000000..b8fed4b --- /dev/null +++ b/src/shaders.c @@ -0,0 +1,67 @@ +#include +#include +#define SL_IMPLEMENTATION +#include +#include + +uint32_t compile_shader(const char* path, int32_t type) { + sl_string source = { 0 }; + sl_read_file(path, &source); + const char* source_cstr = sl_c_str(source); + + uint32_t shader = glCreateShader(type); + glShaderSource(shader, 1, &source_cstr, NULL); + glCompileShader(shader); + + sl_str_free(source); + + int success; + char info_log[512]; + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + if(!success) { + glGetShaderInfoLog(shader, 512, NULL, info_log); + printf("[Shader %d, %s] Failed to compile: %s\n", shader, path, info_log); + exit(-1); + } else { + printf("[Shader %d, %s] Compiled successfully\n", shader, path); + } + + return shader; +} + +uint32_t load_shader_program(uint32_t shader, ...) { + sl_vec(uint32_t) shaders = { 0 }; + + va_list args; + va_start(args, shader); + while(shader != 0) { + sl_vec_push(shaders, shader); + shader = va_arg(args, uint32_t); + } + va_end(args); + + uint32_t program = glCreateProgram(); + for(sl_vec_it(shader, shaders)) { + glAttachShader(program, *shader); + printf("[Shader %d] Attached to program %d\n", *shader, program); + } + glLinkProgram(program); + + int success; + char info_log[512]; + glGetProgramiv(program, GL_LINK_STATUS, &success); + if(!success) { + glGetProgramInfoLog(program, 512, NULL, info_log); + printf("[Program %d] Failed to link: %s\n", program, info_log); + exit(-1); + } else { + printf("[Program %d] Linked successfully\n", program); + } + + for(sl_vec_it(shader, shaders)) { + glDeleteShader(*shader); + printf("[Shader %d] Deleted successfully\n", *shader); + } + + return program; +}