#include "shader.h" static bool _shader_compile(u32 handle); static bool _shader_compile(u32 handle) { s32 success; char log[SHADER_LOG_BUFFER_SIZE]; glCompileShader(handle); glGetShaderiv(handle, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(handle, SHADER_LOG_BUFFER_SIZE, NULL, log); printf(STRING_SHADER_COMPILE_ERROR, handle, log); return false; } else printf(STRING_SHADER_COMPILE_SUCCESS, handle); return true; } bool shader_init(Shader* self, const char* vertex, const char* fragment) { GLuint vertexHandle; GLuint fragmentHandle; memset(self, '\0', sizeof(struct Shader)); vertexHandle = glCreateShader(GL_VERTEX_SHADER); fragmentHandle = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(vertexHandle, 1, &vertex, NULL); glShaderSource(fragmentHandle, 1, &fragment, NULL); if (!_shader_compile(vertexHandle) || !_shader_compile(fragmentHandle)) return false; self->handle = glCreateProgram(); glAttachShader(self->handle, vertexHandle); glAttachShader(self->handle, fragmentHandle); glLinkProgram(self->handle); glDeleteShader(vertexHandle); glDeleteShader(fragmentHandle); self->isInit = true; return true; } void shader_use(Shader* self) { glUseProgram(self->handle); } void shader_free(Shader* self) { if (self->isInit) { glDeleteProgram(self->handle); self->isInit = false; } } void shader_uniform_s32_set(Shader* self, const char* name, s32 value) { glUniform1i(glGetUniformLocation(self->handle, name), value); } void shader_uniform_u32_set(Shader* self, const char* name, u32 value) { glUniform1ui(glGetUniformLocation(self->handle, name), value); } void shader_uniform_bool_set(Shader* self, const char* name, bool value) { glUniform1i(glGetUniformLocation(self->handle, name), value); } void shader_uniform_f32_set(Shader* self, const char* name, f32 value) { glUniform1f(glGetUniformLocation(self->handle, name), value); } void shader_uniform_vec2_set(Shader* self, const char* name, vec2 value) { glUniform2fv(glGetUniformLocation(self->handle, name), 1, value); } void shader_uniform_vec3_set(Shader* self, const char* name, vec3 value) { glUniform3fv(glGetUniformLocation(self->handle, name), 1, value); } void shader_uniform_vec4_set(Shader* self, const char* name, vec4 value) { glUniform4fv(glGetUniformLocation(self->handle, name), 1, value); } void shader_uniform_mat4_set(Shader* self, const char* name, mat4 value) { glUniformMatrix4fv(glGetUniformLocation(self->handle, name), 1, GL_FALSE, (f32*)value); } void shader_uniform_texture_set(Shader* self, const char* name, Texture* texture, s32 index) { glActiveTexture(GL_TEXTURE0 + index); texture_bind(texture); glUniform1i(glGetUniformLocation(self->handle, name), index); }