00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef QGLSHADERPROGRAM_H
00043 #define QGLSHADERPROGRAM_H
00044
00045 #include <QtOpenGL/qgl.h>
00046 #include <QtGui/qvector2d.h>
00047 #include <QtGui/qvector3d.h>
00048 #include <QtGui/qvector4d.h>
00049 #include <QtGui/qmatrix4x4.h>
00050
00051 QT_BEGIN_HEADER
00052
00053 QT_BEGIN_NAMESPACE
00054
00055 QT_MODULE(OpenGL)
00056
00057 #if !defined(QT_OPENGL_ES_1)
00058
00059 class QGLShaderProgram;
00060 class QGLShaderPrivate;
00061
00062 class Q_OPENGL_EXPORT QGLShader : public QObject
00063 {
00064 Q_OBJECT
00065 public:
00066 enum ShaderTypeBit
00067 {
00068 Vertex = 0x0001,
00069 Fragment = 0x0002,
00070 Geometry = 0x0004
00071 };
00072 Q_DECLARE_FLAGS(ShaderType, ShaderTypeBit)
00073
00074 explicit QGLShader(QGLShader::ShaderType type, QObject *parent = 0);
00075 QGLShader(QGLShader::ShaderType type, const QGLContext *context, QObject *parent = 0);
00076 virtual ~QGLShader();
00077
00078 QGLShader::ShaderType shaderType() const;
00079
00080 bool compileSourceCode(const char *source);
00081 bool compileSourceCode(const QByteArray& source);
00082 bool compileSourceCode(const QString& source);
00083 bool compileSourceFile(const QString& fileName);
00084
00085 QByteArray sourceCode() const;
00086
00087 bool isCompiled() const;
00088 QString log() const;
00089
00090 GLuint shaderId() const;
00091
00092 static bool hasOpenGLShaders(ShaderType type, const QGLContext *context = 0);
00093
00094 private:
00095 friend class QGLShaderProgram;
00096
00097 Q_DISABLE_COPY(QGLShader)
00098 Q_DECLARE_PRIVATE(QGLShader)
00099 };
00100
00101 Q_DECLARE_OPERATORS_FOR_FLAGS(QGLShader::ShaderType)
00102
00103
00104 class QGLShaderProgramPrivate;
00105
00106 #ifndef GL_EXT_geometry_shader4
00107 # define GL_LINES_ADJACENCY_EXT 0xA
00108 # define GL_LINE_STRIP_ADJACENCY_EXT 0xB
00109 # define GL_TRIANGLES_ADJACENCY_EXT 0xC
00110 # define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD
00111 #endif
00112
00113
00114 class Q_OPENGL_EXPORT QGLShaderProgram : public QObject
00115 {
00116 Q_OBJECT
00117 public:
00118 explicit QGLShaderProgram(QObject *parent = 0);
00119 explicit QGLShaderProgram(const QGLContext *context, QObject *parent = 0);
00120 virtual ~QGLShaderProgram();
00121
00122 bool addShader(QGLShader *shader);
00123 void removeShader(QGLShader *shader);
00124 QList<QGLShader *> shaders() const;
00125
00126 bool addShaderFromSourceCode(QGLShader::ShaderType type, const char *source);
00127 bool addShaderFromSourceCode(QGLShader::ShaderType type, const QByteArray& source);
00128 bool addShaderFromSourceCode(QGLShader::ShaderType type, const QString& source);
00129 bool addShaderFromSourceFile(QGLShader::ShaderType type, const QString& fileName);
00130
00131 void removeAllShaders();
00132
00133 virtual bool link();
00134 bool isLinked() const;
00135 QString log() const;
00136
00137 bool bind();
00138 void release();
00139
00140 GLuint programId() const;
00141
00142 int maxGeometryOutputVertices() const;
00143
00144 void setGeometryOutputVertexCount(int count);
00145 int geometryOutputVertexCount() const;
00146
00147 void setGeometryInputType(GLenum inputType);
00148 GLenum geometryInputType() const;
00149
00150 void setGeometryOutputType(GLenum outputType);
00151 GLenum geometryOutputType() const;
00152
00153 void bindAttributeLocation(const char *name, int location);
00154 void bindAttributeLocation(const QByteArray& name, int location);
00155 void bindAttributeLocation(const QString& name, int location);
00156
00157 int attributeLocation(const char *name) const;
00158 int attributeLocation(const QByteArray& name) const;
00159 int attributeLocation(const QString& name) const;
00160
00161 void setAttributeValue(int location, GLfloat value);
00162 void setAttributeValue(int location, GLfloat x, GLfloat y);
00163 void setAttributeValue(int location, GLfloat x, GLfloat y, GLfloat z);
00164 void setAttributeValue(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
00165 void setAttributeValue(int location, const QVector2D& value);
00166 void setAttributeValue(int location, const QVector3D& value);
00167 void setAttributeValue(int location, const QVector4D& value);
00168 void setAttributeValue(int location, const QColor& value);
00169 void setAttributeValue(int location, const GLfloat *values, int columns, int rows);
00170
00171 void setAttributeValue(const char *name, GLfloat value);
00172 void setAttributeValue(const char *name, GLfloat x, GLfloat y);
00173 void setAttributeValue(const char *name, GLfloat x, GLfloat y, GLfloat z);
00174 void setAttributeValue(const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
00175 void setAttributeValue(const char *name, const QVector2D& value);
00176 void setAttributeValue(const char *name, const QVector3D& value);
00177 void setAttributeValue(const char *name, const QVector4D& value);
00178 void setAttributeValue(const char *name, const QColor& value);
00179 void setAttributeValue(const char *name, const GLfloat *values, int columns, int rows);
00180
00181 void setAttributeArray
00182 (int location, const GLfloat *values, int tupleSize, int stride = 0);
00183 void setAttributeArray
00184 (int location, const QVector2D *values, int stride = 0);
00185 void setAttributeArray
00186 (int location, const QVector3D *values, int stride = 0);
00187 void setAttributeArray
00188 (int location, const QVector4D *values, int stride = 0);
00189 void setAttributeArray
00190 (int location, GLenum type, const void *values, int tupleSize, int stride = 0);
00191 void setAttributeArray
00192 (const char *name, const GLfloat *values, int tupleSize, int stride = 0);
00193 void setAttributeArray
00194 (const char *name, const QVector2D *values, int stride = 0);
00195 void setAttributeArray
00196 (const char *name, const QVector3D *values, int stride = 0);
00197 void setAttributeArray
00198 (const char *name, const QVector4D *values, int stride = 0);
00199 void setAttributeArray
00200 (const char *name, GLenum type, const void *values, int tupleSize, int stride = 0);
00201
00202 void setAttributeBuffer
00203 (int location, GLenum type, int offset, int tupleSize, int stride = 0);
00204 void setAttributeBuffer
00205 (const char *name, GLenum type, int offset, int tupleSize, int stride = 0);
00206
00207 #ifdef Q_MAC_COMPAT_GL_FUNCTIONS
00208 void setAttributeArray
00209 (int location, QMacCompatGLenum type, const void *values, int tupleSize, int stride = 0);
00210 void setAttributeArray
00211 (const char *name, QMacCompatGLenum type, const void *values, int tupleSize, int stride = 0);
00212 void setAttributeBuffer
00213 (int location, QMacCompatGLenum type, int offset, int tupleSize, int stride = 0);
00214 void setAttributeBuffer
00215 (const char *name, QMacCompatGLenum type, int offset, int tupleSize, int stride = 0);
00216 #endif
00217
00218 void enableAttributeArray(int location);
00219 void enableAttributeArray(const char *name);
00220 void disableAttributeArray(int location);
00221 void disableAttributeArray(const char *name);
00222
00223 int uniformLocation(const char *name) const;
00224 int uniformLocation(const QByteArray& name) const;
00225 int uniformLocation(const QString& name) const;
00226
00227 #ifdef Q_MAC_COMPAT_GL_FUNCTIONS
00228 void setUniformValue(int location, QMacCompatGLint value);
00229 void setUniformValue(int location, QMacCompatGLuint value);
00230 void setUniformValue(const char *name, QMacCompatGLint value);
00231 void setUniformValue(const char *name, QMacCompatGLuint value);
00232 void setUniformValueArray(int location, const QMacCompatGLint *values, int count);
00233 void setUniformValueArray(int location, const QMacCompatGLuint *values, int count);
00234 void setUniformValueArray(const char *name, const QMacCompatGLint *values, int count);
00235 void setUniformValueArray(const char *name, const QMacCompatGLuint *values, int count);
00236 #endif
00237
00238 void setUniformValue(int location, GLfloat value);
00239 void setUniformValue(int location, GLint value);
00240 void setUniformValue(int location, GLuint value);
00241 void setUniformValue(int location, GLfloat x, GLfloat y);
00242 void setUniformValue(int location, GLfloat x, GLfloat y, GLfloat z);
00243 void setUniformValue(int location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
00244 void setUniformValue(int location, const QVector2D& value);
00245 void setUniformValue(int location, const QVector3D& value);
00246 void setUniformValue(int location, const QVector4D& value);
00247 void setUniformValue(int location, const QColor& color);
00248 void setUniformValue(int location, const QPoint& point);
00249 void setUniformValue(int location, const QPointF& point);
00250 void setUniformValue(int location, const QSize& size);
00251 void setUniformValue(int location, const QSizeF& size);
00252 void setUniformValue(int location, const QMatrix2x2& value);
00253 void setUniformValue(int location, const QMatrix2x3& value);
00254 void setUniformValue(int location, const QMatrix2x4& value);
00255 void setUniformValue(int location, const QMatrix3x2& value);
00256 void setUniformValue(int location, const QMatrix3x3& value);
00257 void setUniformValue(int location, const QMatrix3x4& value);
00258 void setUniformValue(int location, const QMatrix4x2& value);
00259 void setUniformValue(int location, const QMatrix4x3& value);
00260 void setUniformValue(int location, const QMatrix4x4& value);
00261 void setUniformValue(int location, const GLfloat value[2][2]);
00262 void setUniformValue(int location, const GLfloat value[3][3]);
00263 void setUniformValue(int location, const GLfloat value[4][4]);
00264 void setUniformValue(int location, const QTransform& value);
00265
00266 void setUniformValue(const char *name, GLfloat value);
00267 void setUniformValue(const char *name, GLint value);
00268 void setUniformValue(const char *name, GLuint value);
00269 void setUniformValue(const char *name, GLfloat x, GLfloat y);
00270 void setUniformValue(const char *name, GLfloat x, GLfloat y, GLfloat z);
00271 void setUniformValue(const char *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
00272 void setUniformValue(const char *name, const QVector2D& value);
00273 void setUniformValue(const char *name, const QVector3D& value);
00274 void setUniformValue(const char *name, const QVector4D& value);
00275 void setUniformValue(const char *name, const QColor& color);
00276 void setUniformValue(const char *name, const QPoint& point);
00277 void setUniformValue(const char *name, const QPointF& point);
00278 void setUniformValue(const char *name, const QSize& size);
00279 void setUniformValue(const char *name, const QSizeF& size);
00280 void setUniformValue(const char *name, const QMatrix2x2& value);
00281 void setUniformValue(const char *name, const QMatrix2x3& value);
00282 void setUniformValue(const char *name, const QMatrix2x4& value);
00283 void setUniformValue(const char *name, const QMatrix3x2& value);
00284 void setUniformValue(const char *name, const QMatrix3x3& value);
00285 void setUniformValue(const char *name, const QMatrix3x4& value);
00286 void setUniformValue(const char *name, const QMatrix4x2& value);
00287 void setUniformValue(const char *name, const QMatrix4x3& value);
00288 void setUniformValue(const char *name, const QMatrix4x4& value);
00289 void setUniformValue(const char *name, const GLfloat value[2][2]);
00290 void setUniformValue(const char *name, const GLfloat value[3][3]);
00291 void setUniformValue(const char *name, const GLfloat value[4][4]);
00292 void setUniformValue(const char *name, const QTransform& value);
00293
00294 void setUniformValueArray(int location, const GLfloat *values, int count, int tupleSize);
00295 void setUniformValueArray(int location, const GLint *values, int count);
00296 void setUniformValueArray(int location, const GLuint *values, int count);
00297 void setUniformValueArray(int location, const QVector2D *values, int count);
00298 void setUniformValueArray(int location, const QVector3D *values, int count);
00299 void setUniformValueArray(int location, const QVector4D *values, int count);
00300 void setUniformValueArray(int location, const QMatrix2x2 *values, int count);
00301 void setUniformValueArray(int location, const QMatrix2x3 *values, int count);
00302 void setUniformValueArray(int location, const QMatrix2x4 *values, int count);
00303 void setUniformValueArray(int location, const QMatrix3x2 *values, int count);
00304 void setUniformValueArray(int location, const QMatrix3x3 *values, int count);
00305 void setUniformValueArray(int location, const QMatrix3x4 *values, int count);
00306 void setUniformValueArray(int location, const QMatrix4x2 *values, int count);
00307 void setUniformValueArray(int location, const QMatrix4x3 *values, int count);
00308 void setUniformValueArray(int location, const QMatrix4x4 *values, int count);
00309
00310 void setUniformValueArray(const char *name, const GLfloat *values, int count, int tupleSize);
00311 void setUniformValueArray(const char *name, const GLint *values, int count);
00312 void setUniformValueArray(const char *name, const GLuint *values, int count);
00313 void setUniformValueArray(const char *name, const QVector2D *values, int count);
00314 void setUniformValueArray(const char *name, const QVector3D *values, int count);
00315 void setUniformValueArray(const char *name, const QVector4D *values, int count);
00316 void setUniformValueArray(const char *name, const QMatrix2x2 *values, int count);
00317 void setUniformValueArray(const char *name, const QMatrix2x3 *values, int count);
00318 void setUniformValueArray(const char *name, const QMatrix2x4 *values, int count);
00319 void setUniformValueArray(const char *name, const QMatrix3x2 *values, int count);
00320 void setUniformValueArray(const char *name, const QMatrix3x3 *values, int count);
00321 void setUniformValueArray(const char *name, const QMatrix3x4 *values, int count);
00322 void setUniformValueArray(const char *name, const QMatrix4x2 *values, int count);
00323 void setUniformValueArray(const char *name, const QMatrix4x3 *values, int count);
00324 void setUniformValueArray(const char *name, const QMatrix4x4 *values, int count);
00325
00326 static bool hasOpenGLShaderPrograms(const QGLContext *context = 0);
00327
00328 private Q_SLOTS:
00329 void shaderDestroyed();
00330
00331 private:
00332 Q_DISABLE_COPY(QGLShaderProgram)
00333 Q_DECLARE_PRIVATE(QGLShaderProgram)
00334
00335 bool init();
00336 };
00337
00338 #endif
00339
00340 QT_END_NAMESPACE
00341
00342 QT_END_HEADER
00343
00344 #endif