929d57abbe69258a18aef581f3dfe6a21daecca4
[demo] / src / shader_manager.cc
1 #include <map>
2
3 #include "shader_manager.h"
4 #include "opengl/shader-gl.h"
5
6 extern bool use_vulkan;
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, SType 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;
26         if(use_vulkan) {
27                 //      sdr = new ShaderVK;
28         }
29         else {
30                 sdr = new ShaderGL;
31         }
32
33         std::string fname = path.empty() ? std::string(name) : path + "/" + std::string(name);
34
35         if(!sdr->load(fname.c_str(), type)) {
36                 delete sdr;
37                 return 0;
38         }
39
40         add_shader(sdr, name);
41         return sdr;
42 }
43
44 void ShaderManager::delete_shaders()
45 {
46         std::map<std::string, Shader *>::iterator it;
47         for(it=shaders.begin(); it != shaders.end(); it++) {
48                 delete it->second;
49         }
50 }
51
52 ShaderProgram *ShaderManager::create_shader_program(const char *vname, const char *fname)
53 {
54         Shader *vsdr = load_shader(vname, SDR_VERTEX);
55         if(!vsdr)
56                 return 0;
57
58         Shader *fsdr = load_shader(fname, SDR_FRAGMENT);
59         if(!fsdr)
60                 return 0;
61
62         ShaderProgram *sprog;
63
64         if(use_vulkan) {
65                 // TODO
66                 return 0;
67         }
68         else {
69                 sprog = new ShaderProgramGL;
70         }
71
72         sprog->attach_shader(vsdr);
73         sprog->attach_shader(fsdr);
74         
75         if(!sprog->link()) {
76                 delete sprog;
77                 return 0;
78         }
79
80         return sprog;
81 }
82
83 void ShaderManager::set_path(const char *path)
84 {
85         if(!path)
86                 this->path.clear();
87         else
88                 this->path = std::string(path);
89 }