From 994cbc688fc330fbd524b9edb11965439efb203a Mon Sep 17 00:00:00 2001 From: Daniel Ledda Date: Wed, 8 Jan 2025 11:02:30 +0100 Subject: [PATCH] shader update strings --- src/gfx/Shader.cpp | 52 +++++++++++++++++++++++----------------------- src/gfx/Shader.h | 6 ++++-- src/main.cpp | 14 ++++++------- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/gfx/Shader.cpp b/src/gfx/Shader.cpp index dac8433..a64fb69 100644 --- a/src/gfx/Shader.cpp +++ b/src/gfx/Shader.cpp @@ -1,6 +1,3 @@ -#include -#include -#include #include "Shader.h" #include "../lib/djstdlib/core.h" #include "../lib/glad/glad.h" @@ -10,35 +7,34 @@ enum ShaderType { vertex=GL_VERTEX_SHADER, }; -uint32 createGlShader(const char* file_path, ShaderType shader_type, char* info_log) { - std::stringstream shader_stream; - std::ifstream shader_file; - shader_file.open(file_path); - shader_stream << shader_file.rdbuf(); - shader_file.close(); - std::string string = shader_stream.str(); - const char *shader_code = string.c_str(); - - GLuint vertex_shader = glCreateShader(shader_type); - glShaderSource(vertex_shader, 1, &shader_code, NULL); - glCompileShader(vertex_shader); +uint32 createGlShader(string file_path, ShaderType shader_type) { + Scratch temp = scratchStart(0, 0); + string shader_code = readEntireFile(temp.arena, file_path); + GLuint shader = glCreateShader(shader_type); + const char *shader_code_cstr = cstring(temp.arena, shader_code); + glShaderSource(shader, 1, &shader_code_cstr, NULL); + glCompileShader(shader); int success; - glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success); + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); if (!success) { - glGetShaderInfoLog(vertex_shader, 512, NULL, info_log); + GLint info_log_length; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_length); + string info_log = PushString(temp.arena, (size_t)info_log_length + 1); + glGetShaderInfoLog(shader, info_log_length, NULL, info_log.str); const char* shader_type_name = shader_type == ShaderType::fragment ? "FRAGMENT" : "VERTEX"; - std::cout << "ERROR::SHADER::" << shader_type_name << "::COMPILATION_FAILED\n" << info_log << std::endl; + log("%s shader compilation error (%S):\n%S", shader_type_name, file_path, info_log); } - - return vertex_shader; + scratchEnd(temp); + return shader; } -Shader createShader(const char* vertex_path, const char* fragment_path) { +Shader createShader(string vertex_path, string fragment_path) { + Scratch temp = scratchStart(0, 0); + Shader result = {0}; - char info_log[512] = {0}; - uint32 vertex_shader = createGlShader(vertex_path, ShaderType::vertex, info_log); - uint32 fragment_shader = createGlShader(fragment_path, ShaderType::fragment, info_log); + uint32 vertex_shader = createGlShader(vertex_path, ShaderType::vertex); + uint32 fragment_shader = createGlShader(fragment_path, ShaderType::fragment); result.prog_id = glCreateProgram(); glAttachShader(result.prog_id, vertex_shader); @@ -48,13 +44,17 @@ Shader createShader(const char* vertex_path, const char* fragment_path) { int success; glGetProgramiv(result.prog_id, GL_LINK_STATUS, &success); if (!success) { - glGetProgramInfoLog(result.prog_id, 512, NULL, info_log); - std::cout << "ERROR::SHADER::PROGRAM::LINK_FAILED\n" << info_log << std::endl; + GLint info_log_length; + glGetShaderiv(result.prog_id, GL_INFO_LOG_LENGTH, &info_log_length); + string info_log_prog = PushString(temp.arena, (size_t)info_log_length + 1); + glGetProgramInfoLog(result.prog_id, info_log_length, NULL, info_log_prog.str); + log("Shader program link error:\n%S", info_log_prog); } glDeleteShader(vertex_shader); glDeleteShader(fragment_shader); + scratchEnd(temp); return result; } diff --git a/src/gfx/Shader.h b/src/gfx/Shader.h index 55b6e0c..a592a69 100644 --- a/src/gfx/Shader.h +++ b/src/gfx/Shader.h @@ -1,10 +1,12 @@ #ifndef LEDDA_SHADER_H #define LEDDA_SHADER_H +#include "../lib/djstdlib/core.h" + struct Shader { - unsigned int prog_id; + uint32 prog_id; }; -Shader createShader(const char* vertex_path, const char* fragment_path); +Shader createShader(string vertex_path, string fragment_path); #endif diff --git a/src/main.cpp b/src/main.cpp index 07318b2..479adb3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -300,20 +300,20 @@ int main_cmd() { } int main_gfx() { + Arena *arena = arenaAlloc(Megabytes(128)); + WindowDims window_dims = { 800, 600 }; GLFWwindow *window = init_window_and_gl(&window_dims); if (!window) { return -1; } - Arena *arena = arenaAlloc(Megabytes(128)); + app_state.current_polycube = 0; + app_state.last_polycube_visible = 6; + app_state.active_shader = 0; + app_state.polycubes = {}; - app_state.current_polycube=0; - app_state.last_polycube_visible=6; - app_state.active_shader=0; - app_state.polycubes={}; - - Shader phong_shader = createShader("../assets/shaders/phong-solid.vertex.glsl", "../assets/shaders/phong-solid.fragment.glsl"); + Shader phong_shader = createShader("../assets/shaders/phong-solid.vertex.glsl"_s, "../assets/shaders/phong-solid.fragment.glsl"_s); app_state.active_shader = &phong_shader; cube_mesh = createMesh("../assets/models/c000000.obj");