Ennix/rendering.h

126 lines
3.2 KiB
C

#pragma once
#include <GLFW/glfw3.h>
void checkCode(int code, char* errorMsg) {
if (code < 0) {
fprintf(stderr, "Application Error %i: %s\n", code, errorMsg);
exit(1);
}
}
void* checkPtr(void *ptr, char* errorMsg) {
if (ptr == NULL) {
fprintf(stderr, "Application Error: %s\n", errorMsg);
exit(1);
}
return ptr;
}
void checkShader(unsigned int shader, int statusFlag, char* actionName) {
int success;
glGetShaderiv(shader, statusFlag, &success);
if (success < 0) {
fprintf(stderr, "%s Error %i\n", actionName, success);
exit(1);
}
}
char *loadText(char* path) {
char *buffer = NULL;
FILE *f = fopen(path, "r");
if (f == NULL) {
return NULL;
}
if (fseek(f, 0, SEEK_END) != 0) {
return NULL;
}
i16 length = ftell(f);
if (length == -1) {
return NULL;
}
buffer = malloc((length + 1) * sizeof(char));
if (fseek(f, 0, SEEK_SET) != 0) {
return NULL;
}
usize newLen = fread(buffer, sizeof(char), length, f);
if (ferror(f) != 0) {
return NULL;
} else {
buffer[newLen] = '\0';
}
fclose(f);
return buffer;
}
void checkCompileErrors(unsigned int object, char* type)
{
int success;
char infoLog[1024];
if (strcmp("PROGRAM", type))
{
glGetShaderiv(object, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(object, 1024, NULL, infoLog);
fprintf(stderr, "| ERROR::SHADER: Compile-time error: Type: %s \n %s\n", type, infoLog);
}
}
else
{
glGetProgramiv(object, GL_LINK_STATUS, &success);
if (!success)
{
glGetProgramInfoLog(object, 1024, NULL, infoLog);
fprintf(stderr, "| ERROR::Shader: Link-time error: Type: %s \n %s\n", type, infoLog);
}
}
}
unsigned int compileShaderProgram(char* vertSrcPath, char* fragSrcPath, char* geoSrcPath) {
unsigned int vertShader, fragShader, geoShader;
char* vertSrc = loadText(vertSrcPath);
vertShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertShader, 1, (const GLchar* const*)&vertSrc, NULL);
glCompileShader(vertShader);
checkCompileErrors(vertShader, "VERTEX");
char* fragSrc = loadText(fragSrcPath);
fragShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragShader, 1, (const GLchar* const*)&fragSrc, NULL);
glCompileShader(fragShader);
checkCompileErrors(fragShader, "FRAGMENT");
char* geoSrc = NULL;
if (geoSrcPath != NULL) {
geoSrc = loadText(geoSrcPath);
geoShader = glCreateShader(GL_GEOMETRY_SHADER);
glShaderSource(geoShader, 1, (const GLchar* const*)&geoSrc, NULL);
glCompileShader(geoShader);
checkCompileErrors(geoShader, "GEOMETRY");
}
unsigned int program = glCreateProgram();
glAttachShader(program, vertShader);
glAttachShader(program, fragShader);
if (geoSrcPath != NULL) {
glAttachShader(program, geoShader);
}
glLinkProgram(program);
checkCompileErrors(program, "PROGRAM");
glDeleteShader(vertShader);
glDeleteShader(fragShader);
free(vertSrc);
free(fragSrc);
if (geoSrc != NULL) {
free(geoSrc);
}
return program;
}