no clue :) just to push it
[demo] / src / shader_manager.cc
1 #include <map>
2
3 #include "gfxapi.h"
4
5 #include "shader_manager.h"
6 #include "opengl/shader-gl.h"
7
8 ShaderManager::ShaderManager() {}
9 ShaderManager::~ShaderManager() {}
10
11 void ShaderManager::add_shader(Shader *sdr, const char *name)
12 {
13         shaders[name] = sdr;
14 }
15
16 Shader *ShaderManager::load_shader(const char *name, ShaderType type)
17 {
18         std::map<std::string, Shader *>::const_iterator it;
19         it = shaders.find(name);
20
21         if(it != shaders.end()) {
22                 return it->second;
23         }
24
25         Shader *sdr = gfx_create_shader();
26
27         std::string fname = path.empty() ? std::string(name) : path + "/" + std::string(name);
28
29         if(!sdr->load(fname.c_str(), type)) {
30                 delete sdr;
31                 return 0;
32         }
33
34         add_shader(sdr, name);
35         return sdr;
36 }
37
38 void ShaderManager::delete_shaders()
39 {
40         std::map<std::string, Shader *>::iterator it;
41         for(it=shaders.begin(); it != shaders.end(); it++) {
42                 delete it->second;
43         }
44 }
45
46 ShaderProgram *ShaderManager::create_shader_program(const char *vname, const char *fname)
47 {
48         path = std::string(gfx_get_shader_path());
49
50         if(!vname || !fname)
51                 return 0;
52
53         Shader *vsdr = load_shader(vname, SDR_VERTEX);
54         if(!vsdr)
55                 return 0;
56
57         Shader *fsdr = load_shader(fname, SDR_FRAGMENT);
58         if(!fsdr)
59                 return 0;
60
61         ShaderProgram *sprog = gfx_create_shader_program();
62
63         if(!sprog->create()) {
64                 return 0;
65         }
66
67         sprog->attach_shader(vsdr);
68         sprog->attach_shader(fsdr);
69
70         if(!sprog->link()) {
71                 delete sprog;
72                 return 0;
73         }
74
75         return sprog;
76 }
77
78 void ShaderManager::set_path(const char *path)
79 {
80         if(!path)
81                 this->path.clear();
82         else
83                 this->path = std::string(path);
84 }