22 #ifndef GL_SHADER_PROGRAM 23 #define GL_SHADER_PROGRAM 25 #include <tulip/OpenGlIncludes.h> 30 #include <tulip/tulipconf.h> 31 #include <tulip/Matrix.h> 32 #include <tulip/Color.h> 36 enum ShaderType {Vertex, Fragment, Geometry};
58 class TLP_GL_SCOPE GlShader {
60 friend class GlShaderProgram;
71 GlShader(ShaderType shaderType);
84 GlShader(GLenum inputPrimitiveType, GLenum outputPrimitiveType);
94 GLuint getShaderId()
const {
95 return shaderObjectId;
101 ShaderType getShaderType()
const {
109 GLenum getInputPrimitiveType()
const {
110 return inputPrimitiveType;
116 GLenum getOutputPrimitiveType()
const {
117 return outputPrimitiveType;
128 void setInputPrimitiveType(
const GLenum inputPrimitiveType) {
129 this->inputPrimitiveType = inputPrimitiveType;
140 void setOutputPrimitiveType(
const GLenum outputPrimitiveType) {
141 this->outputPrimitiveType = outputPrimitiveType;
149 void compileFromSourceCode(
const char *shaderSrc);
156 void compileFromSourceCode(
const std::string &shaderSrc);
163 void compileFromSourceFile(
const std::string &shaderSrcFilename);
168 bool isCompiled()
const {
169 return shaderCompiled;
175 std::string getCompilationLog()
const {
176 return compilationLog;
181 void setAnonymousCreation(
const bool anonymousCreation) {
182 this->anonymousCreation = anonymousCreation;
184 bool anonymouslyCreated()
const {
185 return anonymousCreation;
188 void compileShaderObject(
const char *shaderSrc);
190 ShaderType shaderType;
191 GLuint shaderObjectId;
192 GLenum inputPrimitiveType, outputPrimitiveType;
194 std::string compilationLog;
195 bool anonymousCreation;
209 class TLP_GL_SCOPE GlShaderProgram {
218 GlShaderProgram(
const std::string &name =
"");
228 static bool shaderProgramsSupported();
233 static bool geometryShaderSupported();
238 static GlShaderProgram *getCurrentActiveShader();
243 std::string getName()
const {
250 GLuint getShaderProgramId()
const {
251 return programObjectId;
259 void addShader(GlShader *shader);
267 void removeShader(GlShader *shader);
272 void removeAllShaders();
282 void addShaderFromSourceCode(
const ShaderType shaderType,
const char *shaderSrc);
292 void addShaderFromSourceCode(
const ShaderType shaderType,
const std::string &shaderSrc);
302 void addShaderFromSourceFile(
const ShaderType shaderType,
const std::string &shaderSrcFilename);
316 void addGeometryShaderFromSourceCode(
const char *geometryShaderSrc, GLenum inputPrimitiveType, GLenum outputPrimitiveType);
330 void addGeometryShaderFromSourceCode(
const std::string &geometryShaderSrc, GLenum inputPrimitiveType, GLenum outputPrimitiveType);
344 void addGeometryShaderFromSourceFile(
const std::string &geometryShaderSrcFilename, GLenum inputPrimitiveType, GLenum outputPrimitiveType);
354 bool isLinked()
const {
355 return programLinked;
373 void setUniformFloat(
const std::string &variateName,
const float f);
374 void setUniformVec2Float(
const std::string &variableName,
const Vector<float, 2> &vec2f);
375 void setUniformVec2Float(
const std::string &variableName,
const float f1,
const float f2);
376 void setUniformVec3Float(
const std::string &variableName,
const Vector<float, 3> &vec3f);
377 void setUniformVec3Float(
const std::string &variableName,
const float f1,
const float f2,
const float f3);
378 void setUniformVec4Float(
const std::string &variableName,
const Vector<float, 4> &vec4f);
379 void setUniformVec4Float(
const std::string &variableName,
const float f1,
const float f2,
const float f3,
const float f4);
380 void setUniformMat2Float(
const std::string &variableName,
const Matrix<float, 2> &mat2f,
const bool transpose =
false);
381 void setUniformMat2Float(
const std::string &variableName,
const float *f,
const bool transpose =
false);
382 void setUniformMat3Float(
const std::string &variableName,
const Matrix<float, 3> &mat3f,
const bool transpose =
false);
383 void setUniformMat3Float(
const std::string &variableName,
const float *f,
const bool transpose =
false);
384 void setUniformMat4Float(
const std::string &variableName,
const Matrix<float, 4> &mat4f,
const bool transpose =
false);
385 void setUniformMat4Float(
const std::string &variableName,
const float *f,
const bool transpose =
false);
387 void setUniformInt(
const std::string &variableName,
const int f);
388 void setUniformVec2Int(
const std::string &variableName,
const Vector<int, 2> &vec2i);
389 void setUniformVec2Int(
const std::string &variableName,
const int i1,
const int i2);
390 void setUniformVec3Int(
const std::string &variableName,
const Vector<int, 3> &vec3i);
391 void setUniformVec3Int(
const std::string &variableName,
const int i1,
const int i2,
const int i3);
392 void setUniformVec4Int(
const std::string &variableName,
const Vector<int, 4> &vec4i);
393 void setUniformVec4Int(
const std::string &variableName,
const int i1,
const int i2,
const int i3,
const int i4);
395 void setUniformBool(
const std::string &variableName,
const bool b);
396 void setUniformVec2Bool(
const std::string &variableName,
const Array<bool, 2> &vec2b);
397 void setUniformVec2Bool(
const std::string &variableName,
const bool b1,
const bool b2);
398 void setUniformVec3Bool(
const std::string &variableName,
const Array<bool, 3> &vec3b);
399 void setUniformVec3Bool(
const std::string &variableName,
const bool b1,
const bool b2,
const bool b3);
400 void setUniformVec4Bool(
const std::string &variableName,
const Array<bool, 4> &vec4b);
401 void setUniformVec4Bool(
const std::string &variableName,
const bool i1,
const bool i2,
const bool i3,
const bool i4);
403 void setAttributeFloat(
const std::string &variableName,
const float f);
404 void setAttributeVec2Float(
const std::string &variableName,
const Vector<float, 2> &vec2f);
405 void setAttributeVec2Float(
const std::string &variableName,
const float f1,
const float f2);
406 void setAttributeVec3Float(
const std::string &variableName,
const Vector<float, 3> &vec3f);
407 void setAttributeVec3Float(
const std::string &variableName,
const float f1,
const float f2,
const float f3);
408 void setAttributeVec4Float(
const std::string &variableName,
const Vector<float, 4> &vec4f);
409 void setAttributeVec4Float(
const std::string &variableName,
const float f1,
const float f2,
const float f3,
const float f4);
411 void setAttributeInt(
const std::string &variableName,
const int f);
412 void setAttributeVec2Int(
const std::string &variableName,
const Vector<int, 2> &vec2i);
413 void setAttributeVec2Int(
const std::string &variableName,
const int i1,
const int i2);
414 void setAttributeVec3Int(
const std::string &variableName,
const Vector<int, 3> &vec3i);
415 void setAttributeVec3Int(
const std::string &variableName,
const int i1,
const int i2,
const int i3);
416 void setAttributeVec4Int(
const std::string &variableName,
const Vector<int, 4> &vec4i);
417 void setAttributeVec4Int(
const std::string &variableName,
const int i1,
const int i2,
const int i3,
const int i4);
419 void setAttributeBool(
const std::string &variableName,
const bool b);
420 void setAttributeVec2Bool(
const std::string &variableName,
const Array<bool, 2> &vec2b);
421 void setAttributeVec2Bool(
const std::string &variableName,
const bool b1,
const bool b2);
422 void setAttributeVec3Bool(
const std::string &variableName,
const Array<bool, 3> &vec3b);
423 void setAttributeVec3Bool(
const std::string &variableName,
const bool b1,
const bool b2,
const bool b3);
424 void setAttributeVec4Bool(
const std::string &variableName,
const Array<bool, 4> &vec4b);
425 void setAttributeVec4Bool(
const std::string &variableName,
const bool b1,
const bool b2,
const bool b3,
const bool b4);
427 void setUniformTextureSampler(
const std::string &samplerVariateName,
const int samplerId);
428 void setUniformColor(
const std::string &variableName,
const Color &color);
429 void setAttributeColor(
const std::string &variableName,
const Color &color);
431 template <
unsigned int SIZE>
432 void setUniformFloatArray(
const std::string &variableName,
const Vector<float, SIZE> &vecf);
433 void setUniformFloatArray(
const std::string &variableName,
const unsigned int fCount,
const float *f);
435 template <
unsigned int SIZE>
436 void setUniformVec2FloatArray(
const std::string &variableName,
const Array<Vector<float, 2>, SIZE> &vecvec2f);
437 void setUniformVec2FloatArray(
const std::string &variableName,
const unsigned int vec2fCount,
const float *f);
439 template <
unsigned int SIZE>
440 void setUniformVec3FloatArray(
const std::string &variableName,
const Array<Vector<float, 3>, SIZE> &vecvec3f);
441 void setUniformVec3FloatArray(
const std::string &variableName,
const unsigned int vec3fCount,
const float *f);
443 template <
unsigned int SIZE>
444 void setUniformVec4FloatArray(
const std::string &variableName,
const Array<Vector<float, 4>, SIZE> &vecvec4f);
445 void setUniformVec4FloatArray(
const std::string &variableName,
const unsigned int vec4fCount,
const float *f);
447 template <
unsigned int SIZE>
448 void setUniformMat2FloatArray(
const std::string &variableName,
const Vector<Matrix<float, 2>, SIZE> &vecmat2f,
const bool transpose =
false);
449 void setUniformMat2FloatArray(
const std::string &variableName,
const unsigned int mat2fCount,
const float *f,
const bool transpose =
false);
451 template <
unsigned int SIZE>
452 void setUniformMat3FloatArray(
const std::string &variableName,
const Vector<Matrix<float, 3>, SIZE> &vecmat3f,
const bool transpose =
false);
453 void setUniformMat3FloatArray(
const std::string &variableName,
const unsigned int mat3fCount,
const float *f,
const bool transpose =
false);
455 template <
unsigned int SIZE>
456 void setUniformMat4FloatArray(
const std::string &variableName,
const Vector<Matrix<float, 4>, SIZE> &vecmat4f,
const bool transpose =
false);
457 void setUniformMat4FloatArray(
const std::string &variableName,
const unsigned int mat4fCount,
const float *f,
const bool transpose =
false);
459 template <
unsigned int SIZE>
460 void setUniformIntArray(
const std::string &variableName,
const Vector<int, SIZE> &veci);
461 void setUniformIntArray(
const std::string &variableName,
const unsigned int iCount,
const int *i);
463 template <
unsigned int SIZE>
464 void setUniformVec2IntArray(
const std::string &variableName,
const Array<Vector<int, 2>, SIZE> &vecvec2i);
465 void setUniformVec2IntArray(
const std::string &variableName,
const unsigned int vec2iCount,
const int *i);
467 template <
unsigned int SIZE>
468 void setUniformVec3IntArray(
const std::string &variableName,
const Array<Vector<int, 3>, SIZE> &vecvec3i);
469 void setUniformVec3IntArray(
const std::string &variableName,
const unsigned int vec3iCount,
const int *i);
471 template <
unsigned int SIZE>
472 void setUniformVec4IntArray(
const std::string &variableName,
const Array<Vector<int, 4>, SIZE> &vecvec4i);
473 void setUniformVec4IntArray(
const std::string &variableName,
const unsigned int vec4iCount,
const int *i);
475 template <
unsigned int SIZE>
476 void setUniformBoolArray(
const std::string &variableName,
const Array<bool, SIZE> &vecb);
477 void setUniformBoolArray(
const std::string &variableName,
const unsigned int bCount,
const bool *b);
479 template <
unsigned int SIZE>
480 void setUniformVec2BoolArray(
const std::string &variableName,
const Array<Array<bool, 2>, SIZE> &vecvec2b);
481 void setUniformVec2BoolArray(
const std::string &variableName,
const unsigned int vec2bCount,
const bool *b);
483 template <
unsigned int SIZE>
484 void setUniformVec3BoolArray(
const std::string &variableName,
const Array<Array<bool, 3>, SIZE> &vecvec3b);
485 void setUniformVec3BoolArray(
const std::string &variableName,
const unsigned int vec3bCount,
const bool *b);
487 template <
unsigned int SIZE>
488 void setUniformVec4BoolArray(
const std::string &variableName,
const Array<Array<bool, 4>, SIZE> &vecvec4b);
489 void setUniformVec4BoolArray(
const std::string &variableName,
const unsigned int vec4bCount,
const bool *b);
491 void getUniformFloatVariableValue(
const std::string &variableName,
float *value);
492 void getUniformIntVariableValue(
const std::string &variableName,
int *value);
493 void getUniformBoolVariableValue(
const std::string &variableName,
bool *value);
494 void getUniformVec2BoolVariableValue(
const std::string &variableName,
bool *value);
495 void getUniformVec3BoolVariableValue(
const std::string &variableName,
bool *value);
496 void getUniformVec4BoolVariableValue(
const std::string &variableName,
bool *value);
501 void setMaxGeometryShaderOutputVertices(
const int maxOutputVertices);
505 GLint getUniformVariableLocation(
const std::string &variableName);
506 GLint getAttributeVariableLocation(
const std::string &variableName);
508 std::string programName;
509 GLuint programObjectId;
511 std::string programLinkLog;
514 std::vector<GlShader *> attachedShaders;
515 int maxGeometryShaderOutputVertices;
517 static GlShaderProgram *currentActiveShaderProgram;
525 #endif // GL_SHADER_PROGRAM