quick backup
[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                 fprintf(stderr, "Failed to load shader: %s.\n", fname.c_str());
37                 delete sdr;
38                 return 0;
39         }
40
41         add_shader(sdr, name);
42         return sdr;
43 }
44
45 void ShaderManager::delete_shaders()
46 {
47         std::map<std::string, Shader *>::iterator it;
48         for(it=shaders.begin(); it != shaders.end(); it++) {
49                 delete it->second;
50         }
51 }
52
53 ShaderProgram *ShaderManager::create_shader_program(const char *vname, const char *fname)
54 {
55         path = use_vulkan ? "vk_shaders" : "gl_shaders";
56
57         Shader *vsdr = load_shader(vname, SDR_VERTEX);
58         if(!vsdr)
59                 return 0;
60
61         Shader *fsdr = load_shader(fname, SDR_FRAGMENT);
62         if(!fsdr)
63                 return 0;
64
65         ShaderProgram *sprog;
66
67         if(use_vulkan) {
68                 // TODO
69                 return 0;
70         }
71         else {
72                 sprog = new ShaderProgramGL;
73         }
74
75         if(!sprog->create()) {
76                 return 0;
77         }
78
79         sprog->attach_shader(vsdr);
80         sprog->attach_shader(fsdr);
81
82         if(!sprog->link()) {
83                 delete sprog;
84                 return 0;
85         }
86
87         return sprog;
88 }
89
90 void ShaderManager::set_path(const char *path)
91 {
92         if(!path)
93                 this->path.clear();
94         else
95                 this->path = std::string(path);
96 }