173 lines
4.9 KiB
C
173 lines
4.9 KiB
C
#pragma once
|
|
|
|
#include <string.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;
|
|
long length;
|
|
FILE* f = fopen(path, "rb");
|
|
if (f) {
|
|
fseek(f, 0, SEEK_END);
|
|
length = ftell(f);
|
|
fseek(f, 0, SEEK_SET);
|
|
buffer = calloc(length, sizeof(char));
|
|
if (buffer) {
|
|
fread(buffer, 1, length, f);
|
|
}
|
|
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 = checkPtr(loadText(vertSrcPath), "Error loading source file");
|
|
vertShader = glCreateShader(GL_VERTEX_SHADER);
|
|
glShaderSource(vertShader, 1, (const GLchar* const*)&vertSrc, NULL);
|
|
glCompileShader(vertShader);
|
|
checkCompileErrors(vertShader, "VERTEX");
|
|
|
|
char* fragSrc = checkPtr(loadText(fragSrcPath), "Error loading source file");
|
|
|
|
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 = checkPtr(loadText(geoSrcPath), "Error loading source file");
|
|
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;
|
|
}
|
|
|
|
|
|
float quadVerts[] = {
|
|
// Position // Color // UV
|
|
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
|
|
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
|
|
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
|
|
-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f
|
|
};
|
|
|
|
unsigned int quadIndices[] = {
|
|
0, 1, 3, // first triangle
|
|
1, 2, 3 // second triangle
|
|
};
|
|
|
|
float cubeVerts[] = {
|
|
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
|
|
0.5f, -0.5f, -0.5f, 1.0f, 0.0f,
|
|
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
|
|
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
|
|
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
|
|
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
|
|
|
|
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
|
|
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
|
|
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
|
|
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
|
|
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,
|
|
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
|
|
|
|
-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
|
-0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
|
|
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
|
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
|
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
|
|
-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
|
|
|
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
|
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
|
|
0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
|
0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
|
0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
|
|
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
|
|
|
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
|
0.5f, -0.5f, -0.5f, 1.0f, 1.0f,
|
|
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
|
|
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
|
|
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
|
|
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
|
|
|
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
|
|
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
|
|
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
|
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
|
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,
|
|
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f
|
|
};
|