#include #include #include #include #include #include #include #include #include #include "scolor.hpp" #include "util.h" // Will be used for a lot of stuff throughout the demo // NOTE: general_buffer is NOT thread safe. Don't try to load shaders in parallel! // NOTE on the NOTE: You probably shouldn't do that anyway! //#define GBLEN (1024*32) extern char general_buffer[GBLEN]; GLuint make_shader(const char *filename, GLenum shaderType){ int fd = open(filename, O_RDONLY); size_t readlen = read(fd, general_buffer, GBLEN); close(fd); if(readlen == GBLEN){ printf(RED("Buffer Length of %d bytes Inadequate for File %s\n").c_str(), GBLEN, filename); return 0; } general_buffer[readlen] = 0; printf(DGREEN("Read shader in file %s (%d bytes)\n").c_str(), filename, readlen); puts(general_buffer); unsigned int s_reference = glCreateShader(shaderType); char *gbc = general_buffer; glShaderSource(s_reference, 1, (const char**)&gbc, 0); glCompileShader(s_reference); glGetShaderInfoLog(s_reference, GBLEN, NULL, general_buffer); puts(general_buffer); GLint compile_ok; glGetShaderiv(s_reference, GL_COMPILE_STATUS, &compile_ok); if(compile_ok){ puts(GREEN("Compile Success").c_str()); return s_reference; } puts(RED("Compile Failed\n").c_str()); return 0; } GLuint make_program(const char* v_file, const char* tcs_file, const char* tes_file, const char* g_file, const char* f_file){ unsigned int vs_reference = make_shader(v_file, GL_VERTEX_SHADER); unsigned int tcs_reference = 0, tes_reference = 0; if(tcs_file) if(!(tcs_reference = make_shader(tcs_file, GL_TESS_CONTROL_SHADER))) return 0; if(tes_file) if(!(tes_reference = make_shader(tes_file, GL_TESS_EVALUATION_SHADER))) return 0; unsigned int gs_reference = 0; if(g_file) gs_reference = make_shader(g_file, GL_GEOMETRY_SHADER); unsigned int fs_reference = make_shader(f_file, GL_FRAGMENT_SHADER); if(!(vs_reference && fs_reference)) return 0; if(g_file && !gs_reference) return 0; unsigned int program = glCreateProgram(); glAttachShader(program, vs_reference); if(g_file) glAttachShader(program, gs_reference); if(tcs_file) glAttachShader(program, tcs_reference); if(tes_file) glAttachShader(program, tes_reference); glAttachShader(program, fs_reference); glLinkProgram(program); GLint link_ok; glGetProgramiv(program, GL_LINK_STATUS, &link_ok); if(!link_ok){ glGetProgramInfoLog(program, GBLEN, NULL, general_buffer); puts(general_buffer); puts(RED("Link Failed").c_str()); return 0; } return program; }