first commit
This commit is contained in:
128
src/engine/shader.c
Normal file
128
src/engine/shader.c
Normal file
@@ -0,0 +1,128 @@
|
||||
#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);
|
||||
}
|
Reference in New Issue
Block a user