Gorgon Game Engine
Shaders.h
Go to the documentation of this file.
1 /*
2  Actual shader implementations of ShaderBase go here.
3 */
4 
5 #pragma once
6 
7 #include <map>
8 #include <string>
9 
10 #include "../GL/Shader.h"
11 
12 #include "../GL/OpenGL.h"
13 #include "Color.h"
14 
15 
16 namespace Gorgon { namespace Graphics {
17  enum class ShaderMode {
18  Normal,
19  ToMask
20  };
21 
22  class SimpleShader : private GL::Shader
23  {
24  public:
26  static SimpleShader
27  normal(ShaderMode::Normal),
28  tomask(ShaderMode::ToMask)
29  ;
30 
31  switch(mode) {
32  case ShaderMode::Normal:
33  normal.Shader::Use();
34  return normal;
35  case ShaderMode::ToMask:
36  tomask.Shader::Use();
37  return tomask;
38  default:
39  throw std::runtime_error("Unknown simple shader mode");
40  }
41  }
42 
44  static int id = LocateUniform("vertex_coords");
45  UpdateUniform(id, value);
46 
47  return *this;
48  }
49 
52  static int id = LocateUniform("tex_coords");
53  UpdateUniform(id, value);
54 
55  return *this;
56  }
57 
59  SimpleShader &SetDiffuse(GL::Texture value) {
60  glActiveTexture(GL_TEXTURE0);
61  glBindTexture(GL_TEXTURE_2D, value);
62 
63  return *this;
64  }
65 
67  static int id = LocateUniform("tint");
68  UpdateUniform(id, value);
69 
70  return *this;
71  }
72 
73  private:
75  };
76 
77  class MaskedShader : private GL::Shader
78  {
79  public:
80  static MaskedShader &Use() {
81  static MaskedShader me;
82 
83  me.Shader::Use();
84  return me;
85  }
86 
88  static int id = LocateUniform("vertex_coords");
89  UpdateUniform(id, value);
90 
91  return *this;
92  }
93 
96  static int id = LocateUniform("tex_coords");
97  UpdateUniform(id, value);
98 
99  return *this;
100  }
101 
103  MaskedShader &SetDiffuse(GL::Texture value) {
104  glActiveTexture(GL_TEXTURE0);
105  glBindTexture(GL_TEXTURE_2D, value);
106 
107  return *this;
108  }
109 
111  static int id = LocateUniform("tint");
112  UpdateUniform(id, value);
113 
114  return *this;
115  }
116 
117  MaskedShader &SetMask(GL::Texture value) {
118  static int id = BindTexture("mask", 1);
119 
120  glActiveTexture(GL_TEXTURE1);
121  glBindTexture(GL_TEXTURE_2D, value);
122 
123  return *this;
124  }
125 
126  private:
127  MaskedShader();
128  };
129 
130  class AlphaShader : private GL::Shader
131  {
132  public:
133 
135  static AlphaShader
136  normal(ShaderMode::Normal),
137  tomask(ShaderMode::ToMask);
138 
139  switch(mode) {
140  case ShaderMode::Normal:
141  normal.Shader::Use();
142  return normal;
143  case ShaderMode::ToMask:
144  tomask.Shader::Use();
145  return tomask;
146  default:
147  throw std::runtime_error("Unknown alpha shader mode");
148  }
149  }
150 
152  static int id = LocateUniform("vertex_coords");
153  UpdateUniform(id, value);
154 
155  return *this;
156  }
157 
160  static int id = LocateUniform("tex_coords");
161  UpdateUniform(id, value);
162 
163  return *this;
164  }
165 
167  AlphaShader &SetAlpha(GL::Texture value) {
168  glActiveTexture(GL_TEXTURE0);
169  glBindTexture(GL_TEXTURE_2D, value);
170 
171  return *this;
172  }
173 
175  static int id = LocateUniform("tint");
176  UpdateUniform(id, value);
177 
178  return *this;
179  }
180 
181  private:
182  AlphaShader(ShaderMode mode);
183  };
184 
186  {
187  public:
188 
189  static MaskedAlphaShader &Use() {
190  static MaskedAlphaShader me;
191 
192  me.Shader::Use();
193  return me;
194  }
195 
197  static int id = LocateUniform("vertex_coords");
198  UpdateUniform(id, value);
199 
200  return *this;
201  }
202 
205  static int id = LocateUniform("tex_coords");
206  UpdateUniform(id, value);
207 
208  return *this;
209  }
210 
212  MaskedAlphaShader &SetAlpha(GL::Texture value) {
213  static int id = BindTexture("diffuse", 0);
214 
215  glActiveTexture(GL_TEXTURE0);
216  glBindTexture(GL_TEXTURE_2D, value);
217 
218  return *this;
219  }
220 
222  static int id = LocateUniform("tint");
223  UpdateUniform(id, value);
224 
225  return *this;
226  }
227 
228  MaskedAlphaShader &SetMask(GL::Texture value) {
229  static int id = BindTexture("mask", 1);
230 
231  glActiveTexture(GL_TEXTURE1);
232  glBindTexture(GL_TEXTURE_2D, value);
233 
234  return *this;
235  }
236  private:
238  };
239 
240  class FillShader : private GL::Shader {
241  public:
243  static FillShader
244  normal(ShaderMode::Normal),
245  tomask(ShaderMode::ToMask);
246 
247  switch(mode) {
248  case ShaderMode::Normal:
249  normal.Shader::Use();
250  return normal;
251  case ShaderMode::ToMask:
252  tomask.Shader::Use();
253  return tomask;
254  default:
255  throw std::runtime_error("Unknown fill shader mode");
256  }
257 
258  }
259 
261  static int id = LocateUniform("vertex_coords");
262  UpdateUniform(id, value);
263 
264  return *this;
265  }
266 
268  static int id = LocateUniform("tint");
269  UpdateUniform(id, value);
270 
271  return *this;
272  }
273 
274  private:
275  FillShader(ShaderMode mode);
276  };
277 
278  class MaskedFillShader : private GL::Shader {
279  public:
280  static MaskedFillShader &Use() {
281  static MaskedFillShader me;
282 
283  me.Shader::Use();
284  return me;
285  }
286 
288  static int id = LocateUniform("vertex_coords");
289  UpdateUniform(id, value);
290 
291  return *this;
292  }
293 
295  static int id = LocateUniform("tint");
296  UpdateUniform(id, value);
297 
298  return *this;
299  }
300 
301  MaskedFillShader &SetMask(GL::Texture value) {
302  static int id = BindTexture("mask", 1);
303 
304  glActiveTexture(GL_TEXTURE1);
305  glBindTexture(GL_TEXTURE_2D, value);
306 
307  return *this;
308  }
309 
310  private:
312  };
313 
314 
315 } }
Gorgon::Graphics::MaskedShader::SetDiffuse
MaskedShader & SetDiffuse(GL::Texture value)
Sets diffuse texture.
Definition: Shaders.h:103
Gorgon::Graphics::FillShader::Use
static FillShader & Use(ShaderMode mode=ShaderMode::Normal)
Definition: Shaders.h:242
Gorgon::Graphics::FillShader
Definition: Shaders.h:240
Gorgon::Graphics::MaskedAlphaShader::SetTextureCoords
MaskedAlphaShader & SetTextureCoords(const GL::QuadTextureCoords &value)
Sets texture coordinates.
Definition: Shaders.h:204
Gorgon::Graphics::AlphaShader::SetVertexCoords
AlphaShader & SetVertexCoords(const GL::QuadVertices &value)
Definition: Shaders.h:151
Gorgon::GL::Shader::UpdateUniform
void UpdateUniform(int name, float value)
Definition: Shader.cpp:120
Gorgon::Graphics::MaskedAlphaShader::SetAlpha
MaskedAlphaShader & SetAlpha(GL::Texture value)
Sets alpha texture.
Definition: Shaders.h:212
glActiveTexture
PFNGLACTIVETEXTUREPROC glActiveTexture
Definition: OpenGL.cpp:21
Gorgon::Graphics::ShaderMode
ShaderMode
Definition: Shaders.h:17
Gorgon::Graphics::MaskedFillShader::SetVertexCoords
MaskedFillShader & SetVertexCoords(const GL::QuadVertices &value)
Definition: Shaders.h:287
Gorgon::Graphics::SimpleShader::SetVertexCoords
SimpleShader & SetVertexCoords(const GL::QuadVertices &value)
Definition: Shaders.h:43
Gorgon::Graphics::SimpleShader::Use
static SimpleShader & Use(ShaderMode mode=ShaderMode::Normal)
Definition: Shaders.h:25
Gorgon::Graphics::MaskedShader::SetTextureCoords
MaskedShader & SetTextureCoords(const GL::QuadTextureCoords &value)
Sets texture coordinates.
Definition: Shaders.h:95
Gorgon::Graphics::RGBAf
Represents a four channel 32 bit float per channel color information.
Definition: Color.h:373
Gorgon::Graphics::AlphaShader
Definition: Shaders.h:131
Gorgon::GL::Shader::LocateUniform
int LocateUniform(const std::string &name)
Definition: Shader.cpp:108
Gorgon::Graphics::MaskedShader::SetMask
MaskedShader & SetMask(GL::Texture value)
Definition: Shaders.h:117
Gorgon::Graphics::MaskedAlphaShader::Use
static MaskedAlphaShader & Use()
Definition: Shaders.h:189
Color.h
Gorgon
Root namespace for Gorgon Game Engine.
Definition: Any.h:19
Shaders.h
Gorgon::Graphics::AlphaShader::Use
static AlphaShader & Use(ShaderMode mode=ShaderMode::Normal)
Definition: Shaders.h:134
Gorgon::GL::Shader
Definition: Shader.h:21
Gorgon::Graphics::SimpleShader::SetTint
SimpleShader & SetTint(const Graphics::RGBAf &value)
Definition: Shaders.h:66
Gorgon::Graphics::MaskedFillShader::SetTint
MaskedFillShader & SetTint(const Graphics::RGBAf &value)
Definition: Shaders.h:294
Gorgon::GL::Shader::BindTexture
int BindTexture(const std::string &name, int location)
Definition: Shader.cpp:113
Gorgon::Graphics::SimpleShader::SetTextureCoords
SimpleShader & SetTextureCoords(const GL::QuadTextureCoords &value)
Sets texture coordinates.
Definition: Shaders.h:51
Gorgon::Graphics::ShaderMode::ToMask
@ ToMask
ShaderSrc.strings.gen
Gorgon::Graphics::MaskedShader
Definition: Shaders.h:78
Gorgon::Graphics::FillShader::SetVertexCoords
FillShader & SetVertexCoords(const GL::QuadVertices &value)
Definition: Shaders.h:260
Gorgon::Graphics::MaskedAlphaShader::SetMask
MaskedAlphaShader & SetMask(GL::Texture value)
Definition: Shaders.h:228
Gorgon::Graphics::ShaderMode::Normal
@ Normal
Gorgon::Graphics::AlphaShader::SetTint
AlphaShader & SetTint(const Graphics::RGBAf &value)
Definition: Shaders.h:174
Gorgon::UI::Graphics
@ Graphics
Definition: Template.h:164
Gorgon::Graphics::MaskedFillShader
Definition: Shaders.h:278
Gorgon::Graphics::AlphaShader::SetAlpha
AlphaShader & SetAlpha(GL::Texture value)
Sets alpha texture.
Definition: Shaders.h:167
Gorgon::Graphics::MaskedFillShader::Use
static MaskedFillShader & Use()
Definition: Shaders.h:280
Gorgon::Graphics::FillShader::SetTint
FillShader & SetTint(const Graphics::RGBAf &value)
Definition: Shaders.h:267
Gorgon::Graphics::SimpleShader
Definition: Shaders.h:23
MaskedShaderSrc.strings.gen
Gorgon::Graphics::MaskedShader::SetTint
MaskedShader & SetTint(const Graphics::RGBAf &value)
Definition: Shaders.h:110
Gorgon::Graphics::MaskedShader::SetVertexCoords
MaskedShader & SetVertexCoords(const GL::QuadVertices &value)
Definition: Shaders.h:87
Gorgon::Graphics::MaskedFillShader::SetMask
MaskedFillShader & SetMask(GL::Texture value)
Definition: Shaders.h:301
Gorgon::Graphics::MaskedAlphaShader::SetVertexCoords
MaskedAlphaShader & SetVertexCoords(const GL::QuadVertices &value)
Definition: Shaders.h:196
Gorgon::GL::QuadTextureCoords
Definition: Simple.h:44
Gorgon::Graphics::MaskedAlphaShader
Definition: Shaders.h:186
Gorgon::Graphics::SimpleShader::SetDiffuse
SimpleShader & SetDiffuse(GL::Texture value)
Sets diffuse texture.
Definition: Shaders.h:59
Gorgon::Graphics::MaskedShader::Use
static MaskedShader & Use()
Definition: Shaders.h:80
Gorgon::Graphics::MaskedAlphaShader::SetTint
MaskedAlphaShader & SetTint(const Graphics::RGBAf &value)
Definition: Shaders.h:221
Gorgon::GL::TextureUnit::Normal
@ Normal
Definition: Shader.h:15
Gorgon::Graphics::AlphaShader::SetTextureCoords
AlphaShader & SetTextureCoords(const GL::QuadTextureCoords &value)
Sets texture coordinates.
Definition: Shaders.h:159
Gorgon::GL::QuadVertices
Definition: Simple.h:10