-
Notifications
You must be signed in to change notification settings - Fork 0
/
ShaderPool.hpp
112 lines (100 loc) · 2.48 KB
/
ShaderPool.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#pragma once
#include <vector>
#include <unordered_map>
#include <memory>
#include <string>
namespace akj{
class cGLShader;
}
class cShaderDescription{
public:
cShaderDescription(const char* shader_name)
:mShaderName(shader_name)
{}
~cShaderDescription(){}
std::string GetShaderName() const {
return mShaderName;
}
const char** GetFragmentFiles() {
if(!mFragmentStrings.empty()){
return &mFragmentStrings.at(0);
}
return NULL;
}
int GetNumFragmentStrings() const {
return static_cast<int>(mFragmentStrings.size());
}
const char** GetVertexFiles() {
if(!mVertexStrings.empty()){
return &mVertexStrings.at(0);
}
return NULL;
}
int GetNumVertexStrings() const {
return static_cast<int>(mVertexStrings.size());
}
const char** GetGeometryFiles() {
if(!mGeometryStrings.empty()){
return &mGeometryStrings.at(0);
}
return NULL;
}
int GetNumGeometryStrings() const {
return static_cast<int>(mGeometryStrings.size());
}
cShaderDescription& AddFragmentFile(const char* fileName){
mFragmentFiles.push_back(std::string(fileName));
mFragmentStrings.clear();
for (std::string& s: mFragmentFiles)
{
mFragmentStrings.push_back(s.c_str());
}
return *this;
}
cShaderDescription& AddVertexFile(const char* fileName){
mVertexFiles.push_back(std::string(fileName));
mVertexStrings.clear();
for (std::string& s: mVertexFiles)
{
mVertexStrings.push_back(s.c_str());
}
return *this;
}
cShaderDescription& AddGeometryFile(const char* fileName){
mGeometryFiles.push_back(std::string(fileName));
mGeometryStrings.clear();
for (std::string& s: mGeometryFiles)
{
mGeometryStrings.push_back(s.c_str());
}
return *this;
}
cShaderDescription& Reset(const char* shader_name){
mShaderName = shader_name;
mFragmentFiles.clear();
mVertexFiles.clear();
mGeometryFiles.clear();
mFragmentStrings.clear();
mVertexStrings.clear();
mGeometryStrings.clear();
return *this;
}
private:
std::string mShaderName;
std::vector<std::string> mFragmentFiles;
std::vector<std::string> mVertexFiles;
std::vector<std::string> mGeometryFiles;
std::vector<const char*> mFragmentStrings;
std::vector<const char*> mVertexStrings;
std::vector<const char*> mGeometryStrings;
};
class cShaderPool
{
public:
cShaderPool(void);
~cShaderPool(void);
akj::cGLShader* LoadShader(cShaderDescription shader_desc);
akj::cGLShader* GetShader(const char* shader_name) const;
private:
std::unordered_map<std::string, std::unique_ptr<akj::cGLShader> > mShaders;
};