8fa50ae0080463f312931a629bb3f13f336c3d5d
[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
29                 return false;
30         }
31         fseek(fp, 0, SEEK_END);
32         fsz = ftell(fp);
33         rewind(fp);
34
35         char *buf;
36         if(!(buf = new char[fsz + 1])) {
37                 fprintf(stderr, "Failed to allocate %u buffers.\n", fsz + 1);
38                 fclose(fp);
39
40                 return false;
41         }
42
43         if(fread(buf, 1, fsz, fp) < fsz) {
44                 fprintf(stderr, "Failed to read shader: %s.\n", fname);
45                 delete buf;
46                 fclose(fp);
47
48                 return false;
49         }
50         buf[fsz] = '\0';
51         fclose(fp);
52
53         create(buf, fsz, fname);
54         return true;
55 }
56
57 ShaderProgram::ShaderProgram()
58 {
59         int len = sizeof shaders / sizeof *shaders;
60         for(int i=0; i<len; ++i) {
61                 shaders[i] = 0;
62         }
63 }
64
65 ShaderProgram::~ShaderProgram()
66 {
67         int len = sizeof shaders / sizeof *shaders;
68
69         for(int i=0; i<len; ++i) {
70                 delete shaders[i];
71         }
72 }
73
74 void ShaderProgram::add_shader(Shader *sdr)
75 {
76         assert(sdr->type < sizeof shaders / sizeof *shaders);
77         shaders[sdr->type] = sdr;
78 }