openwindow/other/graphics.c

88 lines
2.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include "graphics.h"
#include "../deps/include/glad/glad.h"
const char * defaultVertexShader =
"#version 330 core\n"
"precision mediump float;"
"void main()\n"
"{\n"
"}";
const char * defaultFragmentShader =
"#version 330 core\n"
"precision mediump float;"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);\n"
"}";
void compileShader(GLuint program, const char * source, GLenum type) {
GLint status = 0;
GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, &source, NULL);
glCompileShader(shader);
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
if (status != GL_TRUE) {
fprintf(stderr, "Failed to compile %s shader!\n", type == GL_VERTEX_SHADER ? "vertex" : "fragment");
GLint len;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
char * infolog = (char*) malloc(len * sizeof(char));
glGetShaderInfoLog(shader, len, NULL, infolog);
fprintf(stderr, "Shader compilation error: %s\n", infolog);
free(infolog);
exit(1);
}
glAttachShader(program, shader);
}
void linkProgram(GLuint program) {
int status = 0;
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &status);
if (status != GL_TRUE) {
fprintf(stderr, "Failed to link program!\n");
GLint len;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
char * infolog = (char*) malloc(len * sizeof(char));
glGetProgramInfoLog(program, len, NULL, infolog);
fprintf(stderr, "Program linking error: %s", infolog);
free(infolog);
exit(1);
}
}
Graphics createGraphics(const char * vss, const char * fss) {
GLuint program = glCreateProgram();
if (vss == NULL) vss = defaultVertexShader;
if (fss == NULL) fss = defaultFragmentShader;
compileShader(program, vss, GL_VERTEX_SHADER);
compileShader(program, fss, GL_FRAGMENT_SHADER);
linkProgram(program);
GLuint vao;
glGenVertexArrays(1, &vao);
return (Graphics) {
.program = program,
.vao = vao,
};
}