129 lines
2.7 KiB
C
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);
|
|
}
|