My Project
GLProgram.h
1 #pragma once
2 #include <unordered_map>
3 #include "GLType.h"
4 
5 
6 namespace ParaEngine
7 {
8 
14  struct _hashUniformEntry;
15  class GLProgram;
16 
17  typedef void(*GLInfoFunction)(GLuint program, GLenum pname, GLint* params);
18  typedef void(*GLLogFunction) (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
19 
20 
21  struct VertexAttrib
22  {
23  GLuint index;
24  GLint size;
25  GLenum type;
26  std::string name;
27  };
28 
29  struct Uniform
30  {
31  GLint location;
32  GLint size;
33  GLenum type;
34  std::string name;
35  };
36 
43  class GLProgram : public CRefCountedOne
44  {
45  friend class GLProgramState;
46 
47  public:
48  enum
49  {
50  VERTEX_ATTRIB_POSITION,
51  VERTEX_ATTRIB_COLOR,
52  VERTEX_ATTRIB_TEX_COORD,
53  VERTEX_ATTRIB_NORMAL,
54  VERTEX_ATTRIB_BLEND_WEIGHT,
55  VERTEX_ATTRIB_BLEND_INDEX,
56 
57  VERTEX_ATTRIB_MAX,
58 
59  // backward compatibility
60  VERTEX_ATTRIB_TEX_COORDS = VERTEX_ATTRIB_TEX_COORD,
61  };
62 
63  enum
64  {
65  UNIFORM_P_MATRIX,
66  UNIFORM_MV_MATRIX,
67  UNIFORM_MVP_MATRIX,
68  UNIFORM_TIME,
69  UNIFORM_SIN_TIME,
70  UNIFORM_COS_TIME,
71  UNIFORM_RANDOM01,
72  UNIFORM_SAMPLER0,
73  UNIFORM_SAMPLER1,
74  UNIFORM_SAMPLER2,
75  UNIFORM_SAMPLER3,
76 
77  UNIFORM_MAX,
78  };
79 
80  static const char* SHADER_NAME_POSITION_TEXTURE_COLOR;
81  static const char* SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP;
82  static const char* SHADER_NAME_POSITION_TEXTURE_ALPHA_TEST;
83  static const char* SHADER_NAME_POSITION_TEXTURE_ALPHA_TEST_NO_MV;
84  static const char* SHADER_NAME_POSITION_COLOR;
85  static const char* SHADER_NAME_POSITION_COLOR_NO_MVP;
86  static const char* SHADER_NAME_POSITION_TEXTURE;
87  static const char* SHADER_NAME_POSITION_TEXTURE_U_COLOR;
88  static const char* SHADER_NAME_POSITION_TEXTURE_A8_COLOR;
89  static const char* SHADER_NAME_POSITION_U_COLOR;
90  static const char* SHADER_NAME_POSITION_LENGTH_TEXTURE_COLOR;
91 
92  static const char* SHADER_NAME_LABEL_NORMAL;
93  static const char* SHADER_NAME_LABEL_OUTLINE;
94 
95  static const char* SHADER_NAME_LABEL_DISTANCEFIELD_NORMAL;
96  static const char* SHADER_NAME_LABEL_DISTANCEFIELD_GLOW;
97 
98  //3D
99  static const char* SHADER_3D_POSITION;
100  static const char* SHADER_3D_POSITION_TEXTURE;
101  static const char* SHADER_3D_SKINPOSITION_TEXTURE;
102 
103  // uniform names
104  static const char* UNIFORM_NAME_P_MATRIX;
105  static const char* UNIFORM_NAME_MV_MATRIX;
106  static const char* UNIFORM_NAME_MVP_MATRIX;
107  static const char* UNIFORM_NAME_TIME;
108  static const char* UNIFORM_NAME_SIN_TIME;
109  static const char* UNIFORM_NAME_COS_TIME;
110  static const char* UNIFORM_NAME_RANDOM01;
111  static const char* UNIFORM_NAME_SAMPLER0;
112  static const char* UNIFORM_NAME_SAMPLER1;
113  static const char* UNIFORM_NAME_SAMPLER2;
114  static const char* UNIFORM_NAME_SAMPLER3;
115  static const char* UNIFORM_NAME_ALPHA_TEST_VALUE;
116 
117  // Attribute names
118  static const char* ATTRIBUTE_NAME_COLOR;
119  static const char* ATTRIBUTE_NAME_POSITION;
120  static const char* ATTRIBUTE_NAME_TEX_COORD;
121  static const char* ATTRIBUTE_NAME_NORMAL;
122  static const char* ATTRIBUTE_NAME_BLEND_WEIGHT;
123  static const char* ATTRIBUTE_NAME_BLEND_INDEX;
124 
125  GLProgram();
126  virtual ~GLProgram();
138  static GLProgram* createWithByteArrays(const GLchar* vShaderByteArray, const GLchar* fShaderByteArray);
139  bool initWithByteArrays(const GLchar* vShaderByteArray, const GLchar* fShaderByteArray);
140 
145  static GLProgram* createWithFilenames(const std::string& vShaderFilename, const std::string& fShaderFilename);
146  bool initWithFilenames(const std::string& vShaderFilename, const std::string& fShaderFilename);
147 
148  //void bindUniform(std::string uniformName, int value);
149  Uniform* getUniform(const std::string& name);
150  VertexAttrib* getVertexAttrib(const std::string& name);
151 
153  void bindAttribLocation(const std::string& attributeName, GLuint index) const;
154 
156  GLint getAttribLocation(const std::string& attributeName) const;
157 
159  GLint getUniformLocation(const std::string& attributeName) const;
160 
162  bool link();
164  void use();
174  void updateUniforms();
175 
177  GLint getUniformLocationForName(const char* name) const;
178 
183  void setUniformLocationWith1i(GLint location, GLint i1);
184 
186  void setUniformLocationWith2i(GLint location, GLint i1, GLint i2);
187 
189  void setUniformLocationWith3i(GLint location, GLint i1, GLint i2, GLint i3);
190 
192  void setUniformLocationWith4i(GLint location, GLint i1, GLint i2, GLint i3, GLint i4);
193 
195  void setUniformLocationWith2iv(GLint location, GLint* ints, unsigned int numberOfArrays);
196 
198  void setUniformLocationWith3iv(GLint location, GLint* ints, unsigned int numberOfArrays);
199 
202  void setUniformLocationWith4iv(GLint location, GLint* ints, unsigned int numberOfArrays);
203 
208  void setUniformLocationWith1f(GLint location, GLfloat f1);
209 
214  void setUniformLocationWith2f(GLint location, GLfloat f1, GLfloat f2);
215 
220  void setUniformLocationWith3f(GLint location, GLfloat f1, GLfloat f2, GLfloat f3);
221 
226  void setUniformLocationWith4f(GLint location, GLfloat f1, GLfloat f2, GLfloat f3, GLfloat f4);
227 
229  void setUniformLocationWith2fv(GLint location, const GLfloat* floats, unsigned int numberOfArrays);
230 
232  void setUniformLocationWith3fv(GLint location, const GLfloat* floats, unsigned int numberOfArrays);
233 
235  void setUniformLocationWith4fv(GLint location, const GLfloat* floats, unsigned int numberOfArrays);
236 
238  void setUniformLocationWithMatrix2fv(GLint location, const GLfloat* matrixArray, unsigned int numberOfMatrices);
239 
241  void setUniformLocationWithMatrix3fv(GLint location, const GLfloat* matrixArray, unsigned int numberOfMatrices);
242 
244  void setUniformLocationWithMatrix4fv(GLint location, const GLfloat* matrixArray, unsigned int numberOfMatrices);
245 
246 
247 
248  // Attribute
249 
251  std::string getVertexShaderLog() const;
252 
254  std::string getFragmentShaderLog() const;
255 
257  std::string getProgramLog() const;
258 
259  // reload all shaders, this function is designed for android
260  // when opengl context lost, so don't call it.
261  void reset();
262 
263  inline const GLuint getProgram() const { return _program; }
264 
265  // DEPRECATED
266  bool initWithVertexShaderByteArray(const GLchar* vertexByteArray, const GLchar* fragByteArray)
267  {
268  return initWithByteArrays(vertexByteArray, fragByteArray);
269  }
270  bool initWithVertexShaderFilename(const std::string &vertexFilename, const std::string& fragFilename)
271  {
272  return initWithFilenames(vertexFilename, fragFilename);
273  }
274  void addAttribute(const std::string &attributeName, GLuint index) const { return bindAttribLocation(attributeName, index); }
275 
276 
277  protected:
278  bool updateUniformLocation(GLint location, const GLvoid* data, unsigned int bytes);
279 
280 
281  void bindPredefinedVertexAttribs();
282  void parseVertexAttribs();
283  void parseUniforms();
284 
285  bool compileShader(GLuint * shader, GLenum type, const GLchar* source);
286  std::string logForOpenGLObject(GLuint object, GLInfoFunction infoFunc, GLLogFunction logFunc) const;
287 
288  GLuint _program;
289  GLuint _vertShader;
290  GLuint _fragShader;
291  GLint _builtInUniforms[UNIFORM_MAX];
292  struct _hashUniformEntry* _hashForUniforms;
293  bool _hasShaderCompiler;
294 
295 
296 
297  struct flag_struct {
298  unsigned int usesTime : 1;
299  unsigned int usesMVP : 1;
300  unsigned int usesMV : 1;
301  unsigned int usesP : 1;
302  unsigned int usesRandom : 1;
303 
304  // handy way to initialize the bitfield
305  flag_struct() { memset(this, 0, sizeof(*this)); }
306  } _flags;
307 
308  std::unordered_map<std::string, Uniform> _userUniforms;
309  std::unordered_map<std::string, VertexAttrib> _vertexAttribs;
310  };
311 }
Definition: GLProgram.cpp:24
Base class for a reference counted asset.
Definition: PERef.h:55
different physics engine has different winding order.
Definition: EventBinding.h:32
Definition: GLProgram.h:21
Definition: GLProgram.h:29
Definition: GLProgram.h:297
GLProgram Class that implements a glProgram.
Definition: GLProgram.h:43