Changed the OpenGL part and the GLSL shaders to use UBO and
[demo] / src / shader.cc
1 #include <assert.h>
2 #include <stdio.h>
3 #include "shader.h"
4
5 Shader::Shader() {}
6 Shader::~Shader()
7 {
8         type = SDR_UNKNOWN;
9 }
10
11 bool Shader::load(const char *fname, SType type)
12 {
13         switch(type) {
14         case SDR_VERTEX:
15         case SDR_FRAGMENT:
16                 this->type = type;
17                 break;
18         default:
19                 fprintf(stderr, "Invalid shader type used in loading.\n");
20                 return false;
21         }
22
23         FILE *fp;
24         unsigned int fsz;
25
26         if(!(fp = fopen(fname, "rb"))) {
27                 fprintf(stderr, "Failed to open shader: %s\n", fname);
28                 return false;
29         }
30         fseek(fp, 0, SEEK_END);
31         fsz = ftell(fp);
32         rewind(fp);
33
34         char *buf = new char[fsz + 1];
35
36         if(fread(buf, 1, fsz, fp) < fsz) {
37                 fprintf(stderr, "Failed to read shader: %s\n", fname);
38                 delete buf;
39                 fclose(fp);
40
41                 return false;
42         }
43         buf[fsz] = '\0';
44         fclose(fp);
45
46         return create(buf, fsz, fname);
47 }
48
49 SType Shader::get_type()
50 {
51         return type;
52 }
53
54 ShaderProgram::ShaderProgram()
55 {
56         int len = sizeof shaders / sizeof *shaders;
57         for(int i=0; i<len; ++i) {
58                 shaders[i] = 0;
59         }
60 }
61
62 ShaderProgram::~ShaderProgram()
63 {
64         int len = sizeof shaders / sizeof *shaders;
65
66         for(int i=0; i<len; ++i) {
67                 delete shaders[i];
68         }
69 }