scg3  0.6
ShaderCore.h
Go to the documentation of this file.
1 
12 /*
13  * Copyright 2014 Volker Ahlers
14  *
15  * Licensed under the Apache License, Version 2.0 (the "License");
16  * you may not use this file except in compliance with the License.
17  * You may obtain a copy of the License at
18  *
19  * http://www.apache.org/licenses/LICENSE-2.0
20  *
21  * Unless required by applicable law or agreed to in writing, software
22  * distributed under the License is distributed on an "AS IS" BASIS,
23  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24  * See the License for the specific language governing permissions and
25  * limitations under the License.
26  */
27 
28 #ifndef SHADERCORE_H_
29 #define SHADERCORE_H_
30 
31 #include <cassert>
32 #include <string>
33 #include <unordered_map>
34 #include <vector>
35 #include "scg_glew.h"
36 #include "Core.h"
37 #include "scg_internals.h"
38 
39 namespace scg {
40 
41 
46 struct ShaderID {
47 
49  : shader(0) {
50  }
51 
52  ShaderID(GLuint shader0, const std::string& name0)
53  : shader(shader0), name(name0) {
54  }
55 
56  GLuint shader;
57  std::string name;
58 
59 };
60 
61 
69 class ShaderCore: public Core {
70 
71 public:
72 
76  ShaderCore(GLuint program, const std::vector<ShaderID>& shaderIDs);
77 
81  virtual ~ShaderCore();
82 
86  void clear();
87 
91  static ShaderCoreSP create(GLuint program, const std::vector<ShaderID>& shaderIDs);
92 
98  void init() const;
99 
103  GLuint getProgram() const;
104 
108  GLint getUniformLoc(const std::string& name) const {
109  assert(program_ != 0);
110  auto it = uniformLocMap_.find(name);
111  if (it == uniformLocMap_.end()) {
112  it = uniformLocMap_.insert(it,
113  std::make_pair(name, glGetUniformLocation(program_, name.c_str())));
114  }
115  return it->second;
116  }
117 
121  void setUniform1i(const std::string& name, GLint value) const {
122  // glProgramUniform() is not used in order to keep OpenGL 3.2 compatibility
124  glUniform1i(getUniformLoc(name), value);
125  SCG_RESTORE_PROGRAM(program_, programOld);
126  }
127 
131  void setUniform1iv(const std::string& name, GLsizei count, const GLint* value) const {
132  // glProgramUniform() is not used in order to keep OpenGL 3.2 compatibility
134  glUniform1iv(getUniformLoc(name), count, value);
135  SCG_RESTORE_PROGRAM(program_, programOld);
136  }
137 
141  void setUniform1f(const std::string& name, GLfloat value) const {
142  // glProgramUniform() is not used in order to keep OpenGL 3.2 compatibility
144  glUniform1f(getUniformLoc(name), value);
145  SCG_RESTORE_PROGRAM(program_, programOld);
146  }
147 
151  void setUniform1fv(const std::string& name, GLsizei count, const GLfloat* value) const {
152  // glProgramUniform() is not used in order to keep OpenGL 3.2 compatibility
154  glUniform1fv(getUniformLoc(name), count, value);
155  SCG_RESTORE_PROGRAM(program_, programOld);
156  }
157 
161  void setUniform2fv(const std::string& name, GLsizei count, const GLfloat* value) const {
162  // glProgramUniform() is not used in order to keep OpenGL 3.2 compatibility
164  glUniform2fv(getUniformLoc(name), count, value);
165  SCG_RESTORE_PROGRAM(program_, programOld);
166  }
167 
171  void setUniform3fv(const std::string& name, GLsizei count, const GLfloat* value) const {
172  // glProgramUniform() is not used in order to keep OpenGL 3.2 compatibility
174  glUniform3fv(getUniformLoc(name), count, value);
175  SCG_RESTORE_PROGRAM(program_, programOld);
176  }
177 
181  void setUniform4fv(const std::string& name, GLsizei count, const GLfloat* value) const {
182  // glProgramUniform() is not used in order to keep OpenGL 3.2 compatibility
184  glUniform4fv(getUniformLoc(name), count, value);
185  SCG_RESTORE_PROGRAM(program_, programOld);
186  }
187 
191  void setUniformMatrix2fv(const std::string& name, GLsizei count, const GLfloat* value) const {
192  // glProgramUniform() is not used in order to keep OpenGL 3.2 compatibility
194  glUniformMatrix2fv(getUniformLoc(name), count, GL_FALSE, value);
195  SCG_RESTORE_PROGRAM(program_, programOld);
196  }
197 
201  void setUniformMatrix3fv(const std::string& name, GLsizei count, const GLfloat* value) const {
202  // glProgramUniform() is not used in order to keep OpenGL 3.2 compatibility
204  glUniformMatrix3fv(getUniformLoc(name), count, GL_FALSE, value);
205  SCG_RESTORE_PROGRAM(program_, programOld);
206  }
207 
211  void setUniformMatrix4fv(const std::string& name, GLsizei count, const GLfloat* value) const {
212  // glProgramUniform() is not used in order to keep OpenGL 3.2 compatibility
214  glUniformMatrix4fv(getUniformLoc(name), count, GL_FALSE, value);
215  SCG_RESTORE_PROGRAM(program_, programOld);
216  }
217 
221  virtual void render(RenderState* renderState);
222 
226  virtual void renderPost(RenderState* renderState);
227 
228 protected:
229 
233  void checkCompileError_(const ShaderID& shaderID) const;
234 
238  void checkLinkError_(GLuint program) const;
239 
240 protected:
241 
242  GLuint program_;
243  std::vector<ShaderID> shaderIDs_;
245  mutable std::unordered_map<std::string, GLint> uniformLocMap_;
246 
247 };
248 
249 
250 } /* namespace scg */
251 
252 #endif /* SHADERCORE_H_ */
A core to set a shader program to be applied to subsequent nodes.
Definition: ShaderCore.h:69
void setUniform4fv(const std::string &name, GLsizei count, const GLfloat *value) const
Definition: ShaderCore.h:181
std::unordered_map< std::string, GLint > uniformLocMap_
Definition: ShaderCore.h:245
GLint getUniformLoc(const std::string &name) const
Definition: ShaderCore.h:108
GLuint getProgram() const
virtual void render(RenderState *renderState)
void init() const
virtual ~ShaderCore()
void setUniformMatrix4fv(const std::string &name, GLsizei count, const GLfloat *value) const
Definition: ShaderCore.h:211
ShaderID(GLuint shader0, const std::string &name0)
Definition: ShaderCore.h:52
void setUniformMatrix2fv(const std::string &name, GLsizei count, const GLfloat *value) const
Definition: ShaderCore.h:191
Base class for all cores (abstract).
Definition: Core.h:36
GLuint shader
Definition: ShaderCore.h:56
std::string name
Definition: ShaderCore.h:57
void setUniformMatrix3fv(const std::string &name, GLsizei count, const GLfloat *value) const
Definition: ShaderCore.h:201
void setUniform1iv(const std::string &name, GLsizei count, const GLint *value) const
Definition: ShaderCore.h:131
ShaderCore * shaderCoreOld_
Definition: ShaderCore.h:244
Local header file for GLEW library.
void setUniform1f(const std::string &name, GLfloat value) const
Definition: ShaderCore.h:141
void setUniform1i(const std::string &name, GLint value) const
Definition: ShaderCore.h:121
ShaderCore(GLuint program, const std::vector< ShaderID > &shaderIDs)
std::vector< ShaderID > shaderIDs_
Definition: ShaderCore.h:243
#define SCG_SAVE_AND_SWITCH_PROGRAM(_program, _programOld)
#define SCG_RESTORE_PROGRAM(_program, _programOld)
virtual void renderPost(RenderState *renderState)
void setUniform3fv(const std::string &name, GLsizei count, const GLfloat *value) const
Definition: ShaderCore.h:171
The central render state that collects information about the current shader, transformations,...
Definition: RenderState.h:107
void setUniform1fv(const std::string &name, GLsizei count, const GLfloat *value) const
Definition: ShaderCore.h:151
Definition: Animation.h:28
Internal definitions required by most classes.
void setUniform2fv(const std::string &name, GLsizei count, const GLfloat *value) const
Definition: ShaderCore.h:161
Base class for all cores (abstract).
void checkCompileError_(const ShaderID &shaderID) const
static ShaderCoreSP create(GLuint program, const std::vector< ShaderID > &shaderIDs)
A shader ID to identify shaders in error messages. An arbitrary name can be added to the OpnGL shader...
Definition: ShaderCore.h:46
void checkLinkError_(GLuint program) const