MorphoGraphX  2.0-1-227
Shader.hpp
Go to the documentation of this file.
1 //
2 // This file is part of MorphoGraphX - http://www.MorphoGraphX.org
3 // Copyright (C) 2012-2015 Richard S. Smith and collaborators.
4 //
5 // If you use MorphoGraphX in your work, please cite:
6 // http://dx.doi.org/10.7554/eLife.05864
7 //
8 // MorphoGraphX is free software, and is licensed under under the terms of the
9 // GNU General (GPL) Public License version 2.0, http://www.gnu.org/licenses.
10 //
11 #ifndef SHADER_H
12 #define SHADER_H
13 
14 #include <Config.hpp>
15 #include <GL.hpp>
16 
17 #include <Assert.hpp>
18 #include <Matrix.hpp>
19 #include <Parms.hpp>
20 #include <Vector.hpp>
21 
22 #include <iostream>
23 #include <QHash>
24 #include <QString>
25 #include <string>
26 #include <vector>
27 
28 class QString;
29 
30 namespace mgx
31 {
43 
44  enum UNIFORM_TYPE {
56  };
57 
58  class mgx_EXPORT GLSLValue {
59  class Value {
60  public:
61  virtual ~Value() {
62  }
63  virtual void setUniform(GLint location) const = 0;
64  virtual void setAttrib(GLuint location) const = 0;
65  virtual QTextStream& read(QTextStream& s) = 0;
66  virtual QTextStream& write(QTextStream& s) const = 0;
67  virtual std::istream& read(std::istream& s) = 0;
68  virtual std::ostream& write(std::ostream& s) const = 0;
69  virtual Value* copy() = 0;
70  }* value;
71 
72  template <typename T> class ValueImpl : public Value {
73  public:
74  typedef typename T::value_type value_type;
75  typedef void (*uniform_fct)(GLint, GLsizei, const value_type*);
76  typedef void (*attrib_fct)(GLuint, const value_type*);
77 
78  ValueImpl(uniform_fct ufct, attrib_fct afct, const T* v, int count)
79  : Value()
80  , value(v, v + count)
81  , glUniform(ufct)
82  , glVertexAttrib(afct)
83  {
84  }
85 
86  ValueImpl(uniform_fct ufct, attrib_fct afct)
87  : Value()
88  , glUniform(ufct)
89  , glVertexAttrib(afct)
90  {
91  }
92 
93  ValueImpl(const ValueImpl& copy)
94  : Value()
95  , value(copy.value)
96  , glUniform(copy.glUniform)
97  , glVertexAttrib(copy.glVertexAttrib)
98  {
99  }
100 
101  virtual Value* copy() {
102  return new ValueImpl(*this);
103  }
104 
105  virtual void setUniform(GLint location) const {
106  glUniform(location, (GLint)value.size(), value[0].c_data());
107  }
108  virtual void setAttrib(GLuint location) const {
109  glVertexAttrib(location, value[0].c_data());
110  }
111  virtual QTextStream& read(QTextStream& s)
112  {
113  value.resize(1);
114  s >> value[0];
115  return s;
116  }
117  virtual QTextStream& write(QTextStream& s) const
118  {
119  s << value[0];
120  return s;
121  }
122  virtual std::istream& read(std::istream& s)
123  {
124  value.resize(1);
125  s >> value[0];
126  return s;
127  }
128  virtual std::ostream& write(std::ostream& s) const
129  {
130  s << value[0];
131  return s;
132  }
133  std::vector<T> value;
134  uniform_fct glUniform;
135  attrib_fct glVertexAttrib;
136  };
137 
138  UNIFORM_TYPE type;
139 
140  public:
142  : value(0)
143  , type(UNIFORM_INT)
144  {
145  }
146 
147  GLSLValue(const GLSLValue& copy)
148  : value(0)
149  , type(copy.type)
150  {
151  if(copy.value)
152  value = copy.value->copy();
153  }
154 
155  template <typename T>
156  explicit GLSLValue(const T& val)
157  : value(0)
158  {
159  setValue(val);
160  }
161 
162  template <typename T>
163  explicit GLSLValue(const std::vector<T>& val)
164  : value(0)
165  {
166  setValue(val);
167  }
168 
169  template <typename T>
170  explicit GLSLValue(const T* val, int count)
171  : value(0)
172  {
173  setValue(val, count);
174  }
175 
177  delete value;
178  }
180  {
181  delete value;
182  value = 0;
183  if(copy.value)
184  value = copy.value->copy();
185  type = copy.type;
186  return *this;
187  }
188  void setUniform(GLint location) const {
189  value->setUniform(location);
190  }
191  void setAttrib(GLuint location) const {
192  value->setAttrib(location);
193  }
194  std::istream& read(std::istream& s);
195  std::ostream& write(std::ostream& s) const;
196  QTextStream& read(QTextStream& s);
197  QTextStream& write(QTextStream& s) const;
198 
199  void setValue(const GLint* value, int count);
200  void setValue(const ivec1* value, int count);
201  void setValue(const ivec2* value, int count);
202  void setValue(const ivec3* value, int count);
203  void setValue(const ivec4* value, int count);
204  void setValue(const GLfloat* value, int count);
205  void setValue(const vec1* value, int count);
206  void setValue(const vec2* value, int count);
207  void setValue(const vec3* value, int count);
208  void setValue(const vec4* value, int count);
209  void setValue(const mat2* value, int count);
210  void setValue(const mat3* value, int count);
211  void setValue(const mat4* value, int count);
212 
213  void setValue(const GLint& value) {
214  setValue(&value, 1);
215  }
216  void setValue(const ivec1& value) {
217  setValue(&value, 1);
218  }
219  void setValue(const ivec2& value) {
220  setValue(&value, 1);
221  }
222  void setValue(const ivec3& value) {
223  setValue(&value, 1);
224  }
225  void setValue(const ivec4& value) {
226  setValue(&value, 1);
227  }
228  void setValue(const GLfloat& value) {
229  setValue(&value, 1);
230  }
231  void setValue(const vec1& value) {
232  setValue(&value, 1);
233  }
234  void setValue(const vec2& value) {
235  setValue(&value, 1);
236  }
237  void setValue(const vec3& value) {
238  setValue(&value, 1);
239  }
240  void setValue(const vec4& value) {
241  setValue(&value, 1);
242  }
243  void setValue(const mat2& value) {
244  setValue(&value, 1);
245  }
246  void setValue(const mat3& value) {
247  setValue(&value, 1);
248  }
249  void setValue(const mat4& value) {
250  setValue(&value, 1);
251  }
252 
253  bool valid() const {
254  return value != 0;
255  }
256  };
257 
258  inline QTextStream& operator<<(QTextStream& s, const GLSLValue& ut) {
259  return ut.write(s);
260  }
261 
262  inline QTextStream& operator>>(QTextStream& s, GLSLValue& ut) {
263  return ut.read(s);
264  }
265 
266  inline std::ostream& operator<<(std::ostream& s, const GLSLValue& ut) {
267  return ut.write(s);
268  }
269 
270  inline std::istream& operator>>(std::istream& s, GLSLValue& ut) {
271  return ut.read(s);
272  }
273 
274  class mgx_EXPORT Shader {
275  public:
277  AT_NONE = 0,
293  AT_END
294  };
295  Shader(int verbosity = 1);
296 
297  static void activeTexture(ActiveTextures at) {
298  glfuncs->glActiveTexture(at + GL_TEXTURE0);
299  }
300 
301  static void activeTexture(int at) {
302  glfuncs->glActiveTexture(at + GL_TEXTURE0);
303  }
304 
305  bool init();
306  void invalidate() {
307  _initialized = false;
308  }
309 
310  // void readParms(Parms& parms, QString shaders_section, QString uniforms_section);
311 
312  bool setupShaders();
313  bool useShaders();
314  static bool stopUsingShaders();
315 
316  bool isVertexShaderCode(unsigned int pos) const {
317  return vertex_shaders_code[pos].second;
318  }
319 
320  bool isFragmentShaderCode(unsigned int pos) const {
321  return fragment_shaders_code[pos].second;
322  }
323 
324  const QString& getVertexShader(unsigned int pos) const {
325  return vertex_shaders_code[pos].first;
326  }
327 
328  const QString& getFragmentShader(unsigned int pos) const {
329  return fragment_shaders_code[pos].first;
330  }
331 
332  void addVertexShaderCode(const QString& code);
333  bool changeVertexShaderCode(int pos, const QString& code);
334  void removeVertexShaderCode(const QString& code);
335  void addFragmentShaderCode(const QString& code);
336  bool changeFragmentShaderCode(int pos, const QString& code);
337  void removeFragmentShaderCode(const QString& code);
338 
339  void addVertexShader(const QString& filename);
340  bool changeVertexShader(int pos, const QString& filename);
341  void removeVertexShader(const QString& filename);
342  void addFragmentShader(const QString& filename);
343  bool changeFragmentShader(int pos, const QString& filename);
344  void removeFragmentShader(const QString& filename);
345  void setVerbosity(int verb) {
346  verbosity = verb;
347  }
348 
349  QString shaderTypeName(GLenum shader_type);
350 
351  GLuint compileShaderFile(GLenum shader_type, QString filename);
352  GLuint compileShader(GLenum shader_type, QString content);
353 
354  void printProgramInfoLog(GLuint object);
355  void printShaderInfoLog(GLuint object);
356  void cleanShaders();
357 
358  bool hasShaders() const {
359  return has_shaders;
360  }
361 
362  GLuint program() const {
363  return _program;
364  }
365 
366  void setupUniforms();
367 
368  GLuint attribLocation(const QString& name);
369 
370  void setAttrib(const QString& name, const GLSLValue& value);
371  void setAttrib(GLuint loc, const GLSLValue& value);
372 
373  bool setUniform(const QString& name, const GLSLValue& value);
374  void setUniform_instant(const QString& name, const GLSLValue& value);
375 
376  bool initialized() const {
377  return _initialized;
378  }
379 
380  protected:
381  void loadUniform(GLint program, const QString& name, const GLSLValue& value);
382 
384 
385  // if bool is true, then it's really code, otherwise, it's a file
386  typedef std::pair<QString, bool> code_t;
387  std::vector<code_t> vertex_shaders_code, fragment_shaders_code;
388 
389  std::vector<GLuint> vertex_shaders, fragment_shaders;
390 
391  std::vector<QString> uniform_names, model_uniform_names;
392  std::vector<GLSLValue> uniform_values, model_uniform_values;
393 
395 
396  GLuint _program;
397 
399  };
400 }
401 #endif
mgx::Shader::AT_FRONT_TEX
@ AT_FRONT_TEX
Definition: Shader.hpp:289
mgx::Shader::AT_SURF_RENDER_TEX
@ AT_SURF_RENDER_TEX
Definition: Shader.hpp:287
mgx::operator<<
std::ostream & operator<<(std::ostream &s, const Colorbar::Position &pos)
mgx::Shader::AT_TEX2D
@ AT_TEX2D
Definition: Shader.hpp:280
mgx::Shader::invalidate
void invalidate()
Definition: Shader.hpp:306
mgx::vec4
Vector< 4, GLfloat > vec4
Definition: Shader.hpp:39
mgx::Shader::AT_SECOND_CMAP_TEX
@ AT_SECOND_CMAP_TEX
Definition: Shader.hpp:286
mgx::GLSLValue::~GLSLValue
~GLSLValue()
Definition: Shader.hpp:176
mgx::GLSLValue::write
std::ostream & write(std::ostream &s) const
mgx::Shader::program
GLuint program() const
Definition: Shader.hpp:362
mgx::GLSLValue::setValue
void setValue(const vec1 &value)
Definition: Shader.hpp:231
mgx::Shader::AT_HEAT_TEX
@ AT_HEAT_TEX
Definition: Shader.hpp:283
Vector.hpp
GL.hpp
mgx::Shader::_program
GLuint _program
Definition: Shader.hpp:396
mgx::GLSLValue::setValue
void setValue(const GLfloat &value)
Definition: Shader.hpp:228
mgx::Shader::initialized
bool initialized() const
Definition: Shader.hpp:376
mgx::GLSLValue::setValue
void setValue(const ivec2 &value)
Definition: Shader.hpp:219
mgx::Shader::uniform_values
std::vector< GLSLValue > uniform_values
Definition: Shader.hpp:392
mgx::Shader::AT_SECOND_TEX3D
@ AT_SECOND_TEX3D
Definition: Shader.hpp:279
mgx::ivec4
Vector< 4, GLint > ivec4
Definition: Shader.hpp:35
mgx::UNIFORM_FLOAT
@ UNIFORM_FLOAT
Definition: Shader.hpp:49
mgx::glfuncs
mgx_EXPORT MGXOpenGLFunctions * glfuncs
mgx::GLSLValue::setUniform
void setUniform(GLint location) const
Definition: Shader.hpp:188
mgx::GLSLValue::setValue
void setValue(const vec4 &value)
Definition: Shader.hpp:240
mgx::operator>>
std::istream & operator>>(std::istream &s, Colorbar::Position &pos)
mgx::UNIFORM_INT
@ UNIFORM_INT
Definition: Shader.hpp:45
mgx::Shader::isFragmentShaderCode
bool isFragmentShaderCode(unsigned int pos) const
Definition: Shader.hpp:320
mgx::UNIFORM_INT4
@ UNIFORM_INT4
Definition: Shader.hpp:48
mgx::Shader::AT_FINAL_VOLUME_TEX
@ AT_FINAL_VOLUME_TEX
Definition: Shader.hpp:288
mgx::GLSLValue::operator=
GLSLValue & operator=(const GLSLValue &copy)
Definition: Shader.hpp:179
mgx::UNIFORM_FLOAT3
@ UNIFORM_FLOAT3
Definition: Shader.hpp:51
mgx::vec1
Vector< 1, GLfloat > vec1
Definition: Shader.hpp:36
mgx::UNIFORM_FLOAT4
@ UNIFORM_FLOAT4
Definition: Shader.hpp:52
mgx::GLSLValue::GLSLValue
GLSLValue(const T *val, int count)
Definition: Shader.hpp:170
mgx::Shader
Definition: Shader.hpp:274
Assert.hpp
mgx::GLSLValue::setValue
void setValue(const ivec3 &value)
Definition: Shader.hpp:222
mgx::GLSLValue::setValue
void setValue(const GLint &value)
Definition: Shader.hpp:213
mgx::Shader::has_shaders
bool has_shaders
Definition: Shader.hpp:383
mgx::Information::init
mgx_EXPORT void init(QMainWindow *wnd)
mgx
Distributed matrix library.
Definition: Assert.hpp:26
mgx::Shader::getFragmentShader
const QString & getFragmentShader(unsigned int pos) const
Definition: Shader.hpp:328
mgx::Shader::ActiveTextures
ActiveTextures
Definition: Shader.hpp:276
mgx::vec3
Vector< 3, GLfloat > vec3
Definition: Shader.hpp:38
mgx::UNIFORM_INT2
@ UNIFORM_INT2
Definition: Shader.hpp:46
mgx::GLSLValue::GLSLValue
GLSLValue(const T &val)
Definition: Shader.hpp:156
mgx::GLSLValue::GLSLValue
GLSLValue(const std::vector< T > &val)
Definition: Shader.hpp:163
mgx::Shader::activeTexture
static void activeTexture(int at)
Definition: Shader.hpp:301
mgx::Shader::verbosity
int verbosity
Definition: Shader.hpp:394
mgx::GLSLValue::read
std::istream & read(std::istream &s)
mgx::ivec1
Vector< 1, GLint > ivec1
Definition: Shader.hpp:32
mgx::GLSLValue::setValue
void setValue(const ivec1 &value)
Definition: Shader.hpp:216
mgx::Shader::isVertexShaderCode
bool isVertexShaderCode(unsigned int pos) const
Definition: Shader.hpp:316
mgx::GLSLValue::setValue
void setValue(const mat3 &value)
Definition: Shader.hpp:246
mgx::mat3
Matrix< 3, 3, GLfloat > mat3
Definition: Shader.hpp:41
Parms.hpp
mgx::UNIFORM_TYPE
UNIFORM_TYPE
Definition: Shader.hpp:44
mgx::Shader::AT_TEX3D
@ AT_TEX3D
Definition: Shader.hpp:278
mgx::Shader::vertex_shaders
std::vector< GLuint > vertex_shaders
Definition: Shader.hpp:389
mgx::Shader::setVerbosity
void setVerbosity(int verb)
Definition: Shader.hpp:345
mgx::Shader::getVertexShader
const QString & getVertexShader(unsigned int pos) const
Definition: Shader.hpp:324
mgx::Shader::AT_DEPTH_TEX
@ AT_DEPTH_TEX
Definition: Shader.hpp:284
mgx::UNIFORM_INT3
@ UNIFORM_INT3
Definition: Shader.hpp:47
mgx::GLSLValue::setValue
void setValue(const mat4 &value)
Definition: Shader.hpp:249
mgx::GLSLValue::setValue
void setValue(const vec3 &value)
Definition: Shader.hpp:237
mgx::ivec3
Vector< 3, GLint > ivec3
Definition: Shader.hpp:34
mgx::Shader::uniform_names
std::vector< QString > uniform_names
Definition: Shader.hpp:391
mgx::Shader::activeTexture
static void activeTexture(ActiveTextures at)
Definition: Shader.hpp:297
mgx::Shader::_initialized
bool _initialized
Definition: Shader.hpp:398
mgx::Shader::AT_FRONT_COLOR_TEX
@ AT_FRONT_COLOR_TEX
Definition: Shader.hpp:291
mgx::UNIFORM_FLOAT2
@ UNIFORM_FLOAT2
Definition: Shader.hpp:50
mgx::Shader::AT_LABEL_TEX
@ AT_LABEL_TEX
Definition: Shader.hpp:281
mgx::GLSLValue::setValue
void setValue(const mat2 &value)
Definition: Shader.hpp:243
mgx::UNIFORM_MATRIX4
@ UNIFORM_MATRIX4
Definition: Shader.hpp:55
mgx::Vector
Namespace containing all the utility classes.
Definition: Vector.hpp:48
Matrix.hpp
mgx::vec2
Vector< 2, GLfloat > vec2
Definition: Shader.hpp:37
mgx::Shader::AT_CMAP_TEX
@ AT_CMAP_TEX
Definition: Shader.hpp:285
mgx::ivec2
Vector< 2, GLint > ivec2
Definition: Shader.hpp:33
mgx::GLSLValue::valid
bool valid() const
Definition: Shader.hpp:253
mgx::Shader::AT_OCCLUSION_TEX
@ AT_OCCLUSION_TEX
Definition: Shader.hpp:292
mgx::UNIFORM_MATRIX3
@ UNIFORM_MATRIX3
Definition: Shader.hpp:54
mgx::Shader::vertex_shaders_code
std::vector< code_t > vertex_shaders_code
Definition: Shader.hpp:387
mgx::GLSLValue::setValue
void setValue(const vec2 &value)
Definition: Shader.hpp:234
mgx::mat2
Matrix< 2, 2, GLfloat > mat2
Definition: Shader.hpp:40
mgx::GLSLValue::GLSLValue
GLSLValue()
Definition: Shader.hpp:141
mgx::mat4
Matrix< 4, 4, GLfloat > mat4
Definition: Shader.hpp:42
mgx::Matrix
Definition: Matrix.hpp:39
mgx::Shader::AT_BACK_TEX
@ AT_BACK_TEX
Definition: Shader.hpp:290
mgx::Shader::AT_SURF_TEX
@ AT_SURF_TEX
Definition: Shader.hpp:282
mgx::GLSLValue::setValue
void setValue(const ivec4 &value)
Definition: Shader.hpp:225
mgx::GLSLValue::setAttrib
void setAttrib(GLuint location) const
Definition: Shader.hpp:191
mgx::Shader::code_t
std::pair< QString, bool > code_t
Definition: Shader.hpp:386
mgx::Shader::hasShaders
bool hasShaders() const
Definition: Shader.hpp:358
mgx::GLSLValue
Definition: Shader.hpp:58
mgx::UNIFORM_MATRIX2
@ UNIFORM_MATRIX2
Definition: Shader.hpp:53
mgx::GLSLValue::GLSLValue
GLSLValue(const GLSLValue &copy)
Definition: Shader.hpp:147