Files
manigraph/src/shader.c
2024-12-01 16:12:17 -06:00

69 lines
1.5 KiB
C

#include "main.h"
#ifndef EMSCRIPTEN
#include <glad.h>
#else
#include <GL/gl.h>
#endif
#ifdef DEBUG
#include <stdio.h>
#endif
void destroy_shader(unsigned int shader) { glDeleteProgram(shader); }
unsigned int create_shader(void) { return glCreateProgram(); }
void use_shader(unsigned int program) { glUseProgram(program); }
unsigned char load_program_to_shader(
unsigned int program, const char *src, unsigned int i)
{
int shader, status;
unsigned int type[] = {
[VERTEX] = GL_VERTEX_SHADER, [FRAGMENT] = GL_FRAGMENT_SHADER};
if (!src)
return 0;
shader = glCreateShader(type[i]);
glShaderSource(shader, 1, (const GLchar **)&src, ((void *)0));
glCompileShader(shader);
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
if (!status)
{
#ifdef DEBUG
char log[256];
glGetShaderInfoLog(shader, 256, NULL, log);
printf("%s", log);
#endif
return 0;
}
glAttachShader(program, shader);
glDeleteShader(shader);
glLinkProgram(program);
return 1;
}
void load_float_to_shader(unsigned int program, char *var, float f)
{
glUseProgram(program);
glUniform1f(glGetUniformLocation(program, var), f);
}
void load_mat4_to_shader(unsigned int program, char *var, float *mat)
{
glUseProgram(program);
glUniformMatrix4fv(glGetUniformLocation(program, var), 1, 0, mat);
}
void load_float4_to_shader(unsigned int program, char *var, float float4[4])
{
glUseProgram(program);
glUniform4f(glGetUniformLocation(program, var), float4[0], float4[1],
float4[2], float4[3]);
}