fixed shader manager, added it
[demo] / src / shader.cc
index 703c2dc..b8ca8ef 100644 (file)
@@ -1,18 +1,87 @@
+#include <assert.h>
 #include <stdio.h>
 #include "shader.h"
 
+ShaderProgram *current_program;
+
 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()
 {
+       current_program = 0;
+
+       int len = sizeof shaders / sizeof *shaders;
+       for(int i=0; i<len; ++i) {
+               shaders[i] = 0;
+       }
 }
 
 ShaderProgram::~ShaderProgram()
 {
+       int len = sizeof shaders / sizeof *shaders;
+
+       for(int i=0; i<len; ++i) {
+               delete shaders[i];
+       }
 }
 
-void ShaderProgram::set_shader(Shader *sdr, SType type)
+// void ShaderProgram::add_shader(Shader *sdr)
+// {
+//     assert(sdr->type < sizeof shaders / sizeof *shaders);
+//     shaders[sdr->type] = sdr;
+// }
+
+ShaderProgram *get_current_program()
 {
-       shaders[type] = sdr;
+       return current_program;
 }
\ No newline at end of file