Files
game-engine/src/engine/shader.c
2024-04-11 01:05:03 -04:00

129 lines
2.7 KiB
C

#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);
}