fixed shader manager, added it
[demo] / src / shader.cc
1 #include <assert.h>
2 #include <stdio.h>
3 #include "shader.h"
4
5 ShaderProgram *current_program;
6
7 Shader::Shader() {}
8 Shader::~Shader()
9 {
10         type = SDR_UNKNOWN;
11 }
12
13 bool Shader::load(const char *fname, SType type)
14 {
15         switch(type) {
16         case SDR_VERTEX:
17         case SDR_FRAGMENT:
18                 this->type = type;
19                 break;
20         default:
21                 fprintf(stderr, "Invalid shader type used in loading.\n");
22                 return false;
23         }
24
25         FILE *fp;
26         unsigned int fsz;
27
28         if(!(fp = fopen(fname, "rb"))) {
29                 fprintf(stderr, "Failed to open shader: %s.\n", fname);
30
31                 return false;
32         }
33         fseek(fp, 0, SEEK_END);
34         fsz = ftell(fp);
35         rewind(fp);
36
37         char *buf;
38         if(!(buf = new char[fsz + 1])) {
39                 fprintf(stderr, "Failed to allocate %u buffers.\n", fsz + 1);
40                 fclose(fp);
41
42                 return false;
43         }
44
45         if(fread(buf, 1, fsz, fp) < fsz) {
46                 fprintf(stderr, "Failed to read shader: %s.\n", fname);
47                 delete buf;
48                 fclose(fp);
49
50                 return false;
51         }
52         buf[fsz] = '\0';
53         fclose(fp);
54
55         create(buf, fsz, fname);
56         return true;
57 }
58
59 ShaderProgram::ShaderProgram()
60 {
61         current_program = 0;
62
63         int len = sizeof shaders / sizeof *shaders;
64         for(int i=0; i<len; ++i) {
65                 shaders[i] = 0;
66         }
67 }
68
69 ShaderProgram::~ShaderProgram()
70 {
71         int len = sizeof shaders / sizeof *shaders;
72
73         for(int i=0; i<len; ++i) {
74                 delete shaders[i];
75         }
76 }
77
78 // void ShaderProgram::add_shader(Shader *sdr)
79 // {
80 //      assert(sdr->type < sizeof shaders / sizeof *shaders);
81 //      shaders[sdr->type] = sdr;
82 // }
83
84 ShaderProgram *get_current_program()
85 {
86         return current_program;
87 }