X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fshader.cc;h=f8f1c15f406b40f73c7809f4a6484923f5971fb7;hb=fcd6773bc770425ede4b47a84eef7cc78342542c;hp=bd80cfe2f583fe97ce9319360013c249e0a622e5;hpb=46cc932f7ddb0c81f352bc847973dae6b327ebeb;p=demo diff --git a/src/shader.cc b/src/shader.cc index bd80cfe..f8f1c15 100644 --- a/src/shader.cc +++ b/src/shader.cc @@ -1,31 +1,72 @@ +#include #include #include "shader.h" Shader::Shader() {} -Shader::~Shader() {} +Shader::~Shader() +{ + type = SDR_UNKNOWN; +} bool Shader::load(const char *fname, SType type) { switch(type) { case SDR_VERTEX: case SDR_FRAGMENT: + this->type = type; break; default: fprintf(stderr, "Invalid shader type used in loading.\n"); return false; } + + FILE *fp; + unsigned int fsz; + + if(!(fp = fopen(fname, "rb"))) { + fprintf(stderr, "Failed to open shader: %s.\n", fname); + + return false; + } + fseek(fp, 0, SEEK_END); + fsz = ftell(fp); + rewind(fp); + + char *buf; + if(!(buf = new char[fsz + 1])) { + fprintf(stderr, "Failed to allocate %u buffers.\n", fsz + 1); + fclose(fp); + + return false; + } + + if(fread(buf, 1, fsz, fp) < fsz) { + fprintf(stderr, "Failed to read shader: %s.\n", fname); + delete buf; + fclose(fp); + + return false; + } + buf[fsz] = '\0'; + fclose(fp); + + create(buf, fsz, fname); return true; } ShaderProgram::ShaderProgram() { + int len = sizeof shaders / sizeof *shaders; + for(int i=0; i