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 QGL_H
00043 #define QGL_H
00044
00045 #include <QtGui/qwidget.h>
00046 #include <QtGui/qpaintengine.h>
00047 #include <QtOpenGL/qglcolormap.h>
00048 #include <QtCore/qmap.h>
00049 #include <QtCore/qscopedpointer.h>
00050
00051 QT_BEGIN_HEADER
00052
00053 #if defined(Q_WS_WIN)
00054 # include <QtCore/qt_windows.h>
00055 #endif
00056
00057 #if defined(Q_WS_MAC)
00058 # include <OpenGL/gl.h>
00059 # include <OpenGL/glu.h>
00060 #elif defined(QT_OPENGL_ES_1)
00061 # include <GLES/gl.h>
00062 #ifndef GL_DOUBLE
00063 # define GL_DOUBLE GL_FLOAT
00064 #endif
00065 #ifndef GLdouble
00066 typedef GLfloat GLdouble;
00067 #endif
00068 #elif defined(QT_OPENGL_ES_2)
00069 # include <GLES2/gl2.h>
00070 #ifndef GL_DOUBLE
00071 # define GL_DOUBLE GL_FLOAT
00072 #endif
00073 #ifndef GLdouble
00074 typedef GLfloat GLdouble;
00075 #endif
00076 #else
00077 # include <GL/gl.h>
00078 # ifndef QT_LINUXBASE
00079 # include <GL/glu.h>
00080 # endif
00081 #endif
00082
00083 QT_BEGIN_NAMESPACE
00084
00085 QT_MODULE(OpenGL)
00086
00087 #if defined(Q_WS_MAC) && defined (QT_BUILD_OPENGL_LIB) && !defined(QT_MAC_USE_COCOA) && !defined(QDOC)
00088 #define Q_MAC_COMPAT_GL_FUNCTIONS
00089
00090 template <typename T>
00091 struct QMacGLCompatTypes
00092 {
00093 typedef long CompatGLint;
00094 typedef unsigned long CompatGLuint;
00095 typedef unsigned long CompatGLenum;
00096 };
00097
00098 template <>
00099 struct QMacGLCompatTypes<long>
00100 {
00101 typedef int CompatGLint;
00102 typedef unsigned int CompatGLuint;
00103 typedef unsigned int CompatGLenum;
00104 };
00105
00106 typedef QMacGLCompatTypes<GLint>::CompatGLint QMacCompatGLint;
00107 typedef QMacGLCompatTypes<GLint>::CompatGLuint QMacCompatGLuint;
00108 typedef QMacGLCompatTypes<GLint>::CompatGLenum QMacCompatGLenum;
00109
00110 #endif
00111
00112 #ifdef QT3_SUPPORT
00113 #define QGL_VERSION 460
00114 #define QGL_VERSION_STR "4.6"
00115 inline QT3_SUPPORT const char *qGLVersion() {
00116 return QGL_VERSION_STR;
00117 }
00118 #endif
00119
00120 #if defined(Q_WS_WIN) || defined(Q_WS_MAC)
00121 class QGLCmap;
00122 #endif
00123
00124 class QPixmap;
00125 #if defined(Q_WS_X11) && !defined(QT_OPENGL_ES)
00126 class QGLOverlayWidget;
00127 #endif
00128 class QGLWidgetPrivate;
00129 class QGLContextPrivate;
00130
00131
00132 namespace QGL
00133 {
00134 Q_OPENGL_EXPORT void setPreferredPaintEngine(QPaintEngine::Type engineType);
00135
00136 enum FormatOption {
00137 DoubleBuffer = 0x0001,
00138 DepthBuffer = 0x0002,
00139 Rgba = 0x0004,
00140 AlphaChannel = 0x0008,
00141 AccumBuffer = 0x0010,
00142 StencilBuffer = 0x0020,
00143 StereoBuffers = 0x0040,
00144 DirectRendering = 0x0080,
00145 HasOverlay = 0x0100,
00146 SampleBuffers = 0x0200,
00147 DeprecatedFunctions = 0x0400,
00148 SingleBuffer = DoubleBuffer << 16,
00149 NoDepthBuffer = DepthBuffer << 16,
00150 ColorIndex = Rgba << 16,
00151 NoAlphaChannel = AlphaChannel << 16,
00152 NoAccumBuffer = AccumBuffer << 16,
00153 NoStencilBuffer = StencilBuffer << 16,
00154 NoStereoBuffers = StereoBuffers << 16,
00155 IndirectRendering = DirectRendering << 16,
00156 NoOverlay = HasOverlay << 16,
00157 NoSampleBuffers = SampleBuffers << 16,
00158 NoDeprecatedFunctions = DeprecatedFunctions << 16
00159 };
00160 Q_DECLARE_FLAGS(FormatOptions, FormatOption)
00161 }
00162
00163 Q_DECLARE_OPERATORS_FOR_FLAGS(QGL::FormatOptions)
00164
00165 class QGLFormatPrivate;
00166
00167 class Q_OPENGL_EXPORT QGLFormat
00168 {
00169 public:
00170 QGLFormat();
00171 QGLFormat(QGL::FormatOptions options, int plane = 0);
00172 QGLFormat(const QGLFormat &other);
00173 QGLFormat &operator=(const QGLFormat &other);
00174 ~QGLFormat();
00175
00176 void setDepthBufferSize(int size);
00177 int depthBufferSize() const;
00178
00179 void setAccumBufferSize(int size);
00180 int accumBufferSize() const;
00181
00182 void setRedBufferSize(int size);
00183 int redBufferSize() const;
00184
00185 void setGreenBufferSize(int size);
00186 int greenBufferSize() const;
00187
00188 void setBlueBufferSize(int size);
00189 int blueBufferSize() const;
00190
00191 void setAlphaBufferSize(int size);
00192 int alphaBufferSize() const;
00193
00194 void setStencilBufferSize(int size);
00195 int stencilBufferSize() const;
00196
00197 void setSampleBuffers(bool enable);
00198 bool sampleBuffers() const;
00199
00200 void setSamples(int numSamples);
00201 int samples() const;
00202
00203 void setSwapInterval(int interval);
00204 int swapInterval() const;
00205
00206 bool doubleBuffer() const;
00207 void setDoubleBuffer(bool enable);
00208 bool depth() const;
00209 void setDepth(bool enable);
00210 bool rgba() const;
00211 void setRgba(bool enable);
00212 bool alpha() const;
00213 void setAlpha(bool enable);
00214 bool accum() const;
00215 void setAccum(bool enable);
00216 bool stencil() const;
00217 void setStencil(bool enable);
00218 bool stereo() const;
00219 void setStereo(bool enable);
00220 bool directRendering() const;
00221 void setDirectRendering(bool enable);
00222 bool hasOverlay() const;
00223 void setOverlay(bool enable);
00224
00225 int plane() const;
00226 void setPlane(int plane);
00227
00228 void setOption(QGL::FormatOptions opt);
00229 bool testOption(QGL::FormatOptions opt) const;
00230
00231 static QGLFormat defaultFormat();
00232 static void setDefaultFormat(const QGLFormat& f);
00233
00234 static QGLFormat defaultOverlayFormat();
00235 static void setDefaultOverlayFormat(const QGLFormat& f);
00236
00237 static bool hasOpenGL();
00238 static bool hasOpenGLOverlays();
00239
00240 void setVersion(int major, int minor);
00241 int majorVersion() const;
00242 int minorVersion() const;
00243
00244 enum OpenGLContextProfile {
00245 NoProfile,
00246 CoreProfile,
00247 CompatibilityProfile
00248 };
00249
00250 void setProfile(OpenGLContextProfile profile);
00251 OpenGLContextProfile profile() const;
00252
00253 enum OpenGLVersionFlag {
00254 OpenGL_Version_None = 0x00000000,
00255 OpenGL_Version_1_1 = 0x00000001,
00256 OpenGL_Version_1_2 = 0x00000002,
00257 OpenGL_Version_1_3 = 0x00000004,
00258 OpenGL_Version_1_4 = 0x00000008,
00259 OpenGL_Version_1_5 = 0x00000010,
00260 OpenGL_Version_2_0 = 0x00000020,
00261 OpenGL_Version_2_1 = 0x00000040,
00262 OpenGL_ES_Common_Version_1_0 = 0x00000080,
00263 OpenGL_ES_CommonLite_Version_1_0 = 0x00000100,
00264 OpenGL_ES_Common_Version_1_1 = 0x00000200,
00265 OpenGL_ES_CommonLite_Version_1_1 = 0x00000400,
00266 OpenGL_ES_Version_2_0 = 0x00000800,
00267 OpenGL_Version_3_0 = 0x00001000,
00268 OpenGL_Version_3_1 = 0x00002000,
00269 OpenGL_Version_3_2 = 0x00004000,
00270 OpenGL_Version_3_3 = 0x00008000,
00271 OpenGL_Version_4_0 = 0x00010000
00272 };
00273 Q_DECLARE_FLAGS(OpenGLVersionFlags, OpenGLVersionFlag)
00274
00275 static OpenGLVersionFlags openGLVersionFlags();
00276
00277 private:
00278 QGLFormatPrivate *d;
00279
00280 void detach();
00281
00282 friend Q_OPENGL_EXPORT bool operator==(const QGLFormat&, const QGLFormat&);
00283 friend Q_OPENGL_EXPORT bool operator!=(const QGLFormat&, const QGLFormat&);
00284 #ifndef QT_NO_DEBUG_STREAM
00285 friend Q_OPENGL_EXPORT QDebug operator<<(QDebug, const QGLFormat &);
00286 #endif
00287 };
00288
00289 Q_DECLARE_OPERATORS_FOR_FLAGS(QGLFormat::OpenGLVersionFlags)
00290
00291 Q_OPENGL_EXPORT bool operator==(const QGLFormat&, const QGLFormat&);
00292 Q_OPENGL_EXPORT bool operator!=(const QGLFormat&, const QGLFormat&);
00293
00294 #ifndef QT_NO_DEBUG_STREAM
00295 Q_OPENGL_EXPORT QDebug operator<<(QDebug, const QGLFormat &);
00296 #endif
00297
00298 class Q_OPENGL_EXPORT QGLContext
00299 {
00300 Q_DECLARE_PRIVATE(QGLContext)
00301 public:
00302 QGLContext(const QGLFormat& format, QPaintDevice* device);
00303 QGLContext(const QGLFormat& format);
00304 virtual ~QGLContext();
00305
00306 virtual bool create(const QGLContext* shareContext = 0);
00307 bool isValid() const;
00308 bool isSharing() const;
00309 void reset();
00310
00311 static bool areSharing(const QGLContext *context1, const QGLContext *context2);
00312
00313 QGLFormat format() const;
00314 QGLFormat requestedFormat() const;
00315 void setFormat(const QGLFormat& format);
00316
00317
00318 virtual void makeCurrent();
00319 virtual void doneCurrent();
00320
00321 virtual void swapBuffers() const;
00322
00323 enum BindOption {
00324 NoBindOption = 0x0000,
00325 InvertedYBindOption = 0x0001,
00326 MipmapBindOption = 0x0002,
00327 PremultipliedAlphaBindOption = 0x0004,
00328 LinearFilteringBindOption = 0x0008,
00329
00330 MemoryManagedBindOption = 0x0010,
00331 CanFlipNativePixmapBindOption = 0x0020,
00332
00333 DefaultBindOption = LinearFilteringBindOption
00334 | InvertedYBindOption
00335 | MipmapBindOption,
00336 InternalBindOption = MemoryManagedBindOption
00337 | PremultipliedAlphaBindOption
00338 };
00339 Q_DECLARE_FLAGS(BindOptions, BindOption)
00340
00341 GLuint bindTexture(const QImage &image, GLenum target, GLint format,
00342 BindOptions options);
00343 GLuint bindTexture(const QPixmap &pixmap, GLenum target, GLint format,
00344 BindOptions options);
00345
00346 GLuint bindTexture(const QImage &image, GLenum target = GL_TEXTURE_2D,
00347 GLint format = GL_RGBA);
00348 GLuint bindTexture(const QPixmap &pixmap, GLenum target = GL_TEXTURE_2D,
00349 GLint format = GL_RGBA);
00350 GLuint bindTexture(const QString &fileName);
00351
00352 void deleteTexture(GLuint tx_id);
00353
00354 void drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
00355 void drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
00356
00357 #ifdef Q_MAC_COMPAT_GL_FUNCTIONS
00358 GLuint bindTexture(const QImage &image, QMacCompatGLenum = GL_TEXTURE_2D,
00359 QMacCompatGLint format = GL_RGBA);
00360 GLuint bindTexture(const QPixmap &pixmap, QMacCompatGLenum = GL_TEXTURE_2D,
00361 QMacCompatGLint format = GL_RGBA);
00362 GLuint bindTexture(const QImage &image, QMacCompatGLenum, QMacCompatGLint format,
00363 BindOptions);
00364 GLuint bindTexture(const QPixmap &pixmap, QMacCompatGLenum, QMacCompatGLint format,
00365 BindOptions);
00366
00367 void deleteTexture(QMacCompatGLuint tx_id);
00368
00369 void drawTexture(const QRectF &target, QMacCompatGLuint textureId, QMacCompatGLenum textureTarget = GL_TEXTURE_2D);
00370 void drawTexture(const QPointF &point, QMacCompatGLuint textureId, QMacCompatGLenum textureTarget = GL_TEXTURE_2D);
00371 #endif
00372
00373 static void setTextureCacheLimit(int size);
00374 static int textureCacheLimit();
00375
00376 void *getProcAddress(const QString &proc) const;
00377 QPaintDevice* device() const;
00378 QColor overlayTransparentColor() const;
00379
00380 static const QGLContext* currentContext();
00381
00382 protected:
00383 virtual bool chooseContext(const QGLContext* shareContext = 0);
00384
00385 #if defined(Q_WS_WIN)
00386 virtual int choosePixelFormat(void* pfd, HDC pdc);
00387 #endif
00388 #if defined(Q_WS_X11) && defined(QT_NO_EGL)
00389 virtual void* tryVisual(const QGLFormat& f, int bufDepth = 1);
00390 virtual void* chooseVisual();
00391 #endif
00392 #if defined(Q_WS_MAC)
00393 virtual void* chooseMacVisual(GDHandle);
00394 #endif
00395
00396 bool deviceIsPixmap() const;
00397 bool windowCreated() const;
00398 void setWindowCreated(bool on);
00399 bool initialized() const;
00400 void setInitialized(bool on);
00401 void generateFontDisplayLists(const QFont & fnt, int listBase);
00402
00403 uint colorIndex(const QColor& c) const;
00404 void setValid(bool valid);
00405 void setDevice(QPaintDevice *pDev);
00406
00407 protected:
00408 static QGLContext* currentCtx;
00409
00410 private:
00411 QScopedPointer<QGLContextPrivate> d_ptr;
00412
00413 friend class QGLPixelBuffer;
00414 friend class QGLPixelBufferPrivate;
00415 friend class QGLWidget;
00416 friend class QGLWidgetPrivate;
00417 friend class QGLGlyphCache;
00418 friend class QOpenGLPaintEngine;
00419 friend class QOpenGLPaintEnginePrivate;
00420 friend class QGL2PaintEngineEx;
00421 friend class QGL2PaintEngineExPrivate;
00422 friend class QGLEngineShaderManager;
00423 friend class QGLWindowSurface;
00424 friend class QGLPixmapData;
00425 friend class QGLPixmapFilterBase;
00426 friend class QGLTextureGlyphCache;
00427 friend class QGLContextGroup;
00428 friend class QGLSharedResourceGuard;
00429 friend class QGLPixmapBlurFilter;
00430 friend class QGLExtensions;
00431 friend QGLFormat::OpenGLVersionFlags QGLFormat::openGLVersionFlags();
00432 #ifdef Q_WS_MAC
00433 public:
00434 void updatePaintDevice();
00435 private:
00436 friend class QMacGLWindowChangeEvent;
00437 friend QGLContextPrivate *qt_phonon_get_dptr(const QGLContext *);
00438 #endif
00439 friend class QGLFramebufferObject;
00440 friend class QGLFramebufferObjectPrivate;
00441 friend class QGLFBOGLPaintDevice;
00442 friend class QGLPaintDevice;
00443 friend class QGLWidgetGLPaintDevice;
00444 friend class QX11GLPixmapData;
00445 friend class QX11GLSharedContexts;
00446 private:
00447 Q_DISABLE_COPY(QGLContext)
00448 };
00449
00450 Q_DECLARE_OPERATORS_FOR_FLAGS(QGLContext::BindOptions)
00451
00452 class Q_OPENGL_EXPORT QGLWidget : public QWidget
00453 {
00454 Q_OBJECT
00455 Q_DECLARE_PRIVATE(QGLWidget)
00456 public:
00457 explicit QGLWidget(QWidget* parent=0,
00458 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
00459 explicit QGLWidget(QGLContext *context, QWidget* parent=0,
00460 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
00461 explicit QGLWidget(const QGLFormat& format, QWidget* parent=0,
00462 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
00463 #ifdef QT3_SUPPORT
00464 QT3_SUPPORT_CONSTRUCTOR QGLWidget(QWidget* parent, const char* name,
00465 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
00466 QT3_SUPPORT_CONSTRUCTOR QGLWidget(QGLContext *context, QWidget* parent, const char* name,
00467 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
00468 QT3_SUPPORT_CONSTRUCTOR QGLWidget(const QGLFormat& format, QWidget* parent, const char* name,
00469 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
00470 #endif
00471 ~QGLWidget();
00472
00473 void qglColor(const QColor& c) const;
00474 void qglClearColor(const QColor& c) const;
00475
00476 bool isValid() const;
00477 bool isSharing() const;
00478
00479
00480 void makeCurrent();
00481 void doneCurrent();
00482
00483 bool doubleBuffer() const;
00484 void swapBuffers();
00485
00486 QGLFormat format() const;
00487 void setFormat(const QGLFormat& format);
00488
00489 const QGLContext* context() const;
00490 void setContext(QGLContext* context, const QGLContext* shareContext = 0,
00491 bool deleteOldContext = true);
00492
00493 QPixmap renderPixmap(int w = 0, int h = 0, bool useContext = false);
00494 QImage grabFrameBuffer(bool withAlpha = false);
00495
00496 void makeOverlayCurrent();
00497 const QGLContext* overlayContext() const;
00498
00499 static QImage convertToGLFormat(const QImage& img);
00500
00501 void setMouseTracking(bool enable);
00502
00503 const QGLColormap & colormap() const;
00504 void setColormap(const QGLColormap & map);
00505
00506 void renderText(int x, int y, const QString & str,
00507 const QFont & fnt = QFont(), int listBase = 2000);
00508 void renderText(double x, double y, double z, const QString & str,
00509 const QFont & fnt = QFont(), int listBase = 2000);
00510 QPaintEngine *paintEngine() const;
00511
00512 GLuint bindTexture(const QImage &image, GLenum target, GLint format,
00513 QGLContext::BindOptions options);
00514 GLuint bindTexture(const QPixmap &pixmap, GLenum target, GLint format,
00515 QGLContext::BindOptions options);
00516
00517 GLuint bindTexture(const QImage &image, GLenum target = GL_TEXTURE_2D,
00518 GLint format = GL_RGBA);
00519 GLuint bindTexture(const QPixmap &pixmap, GLenum target = GL_TEXTURE_2D,
00520 GLint format = GL_RGBA);
00521
00522 GLuint bindTexture(const QString &fileName);
00523
00524 void deleteTexture(GLuint tx_id);
00525
00526 void drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
00527 void drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
00528
00529 #ifdef Q_MAC_COMPAT_GL_FUNCTIONS
00530 GLuint bindTexture(const QImage &image, QMacCompatGLenum = GL_TEXTURE_2D,
00531 QMacCompatGLint format = GL_RGBA);
00532 GLuint bindTexture(const QPixmap &pixmap, QMacCompatGLenum = GL_TEXTURE_2D,
00533 QMacCompatGLint format = GL_RGBA);
00534 GLuint bindTexture(const QImage &image, QMacCompatGLenum, QMacCompatGLint format,
00535 QGLContext::BindOptions);
00536 GLuint bindTexture(const QPixmap &pixmap, QMacCompatGLenum, QMacCompatGLint format,
00537 QGLContext::BindOptions);
00538
00539 void deleteTexture(QMacCompatGLuint tx_id);
00540
00541 void drawTexture(const QRectF &target, QMacCompatGLuint textureId, QMacCompatGLenum textureTarget = GL_TEXTURE_2D);
00542 void drawTexture(const QPointF &point, QMacCompatGLuint textureId, QMacCompatGLenum textureTarget = GL_TEXTURE_2D);
00543 #endif
00544
00545 public Q_SLOTS:
00546 virtual void updateGL();
00547 virtual void updateOverlayGL();
00548
00549 protected:
00550 bool event(QEvent *);
00551 virtual void initializeGL();
00552 virtual void resizeGL(int w, int h);
00553 virtual void paintGL();
00554
00555 virtual void initializeOverlayGL();
00556 virtual void resizeOverlayGL(int w, int h);
00557 virtual void paintOverlayGL();
00558
00559 void setAutoBufferSwap(bool on);
00560 bool autoBufferSwap() const;
00561
00562 void paintEvent(QPaintEvent*);
00563 void resizeEvent(QResizeEvent*);
00564
00565 virtual void glInit();
00566 virtual void glDraw();
00567 int fontDisplayListBase(const QFont & fnt, int listBase = 2000);
00568
00569 private:
00570 Q_DISABLE_COPY(QGLWidget)
00571
00572 #ifdef Q_WS_MAC
00573 friend class QMacGLWindowChangeEvent;
00574 #endif
00575 friend class QGLDrawable;
00576 friend class QGLPixelBuffer;
00577 friend class QGLPixelBufferPrivate;
00578 friend class QGLContext;
00579 friend class QGLContextPrivate;
00580 friend class QGLOverlayWidget;
00581 friend class QOpenGLPaintEngine;
00582 friend class QGLPaintDevice;
00583 friend class QGLWidgetGLPaintDevice;
00584 };
00585
00586
00587
00588
00589
00590
00591 inline bool QGLFormat::doubleBuffer() const
00592 {
00593 return testOption(QGL::DoubleBuffer);
00594 }
00595
00596 inline bool QGLFormat::depth() const
00597 {
00598 return testOption(QGL::DepthBuffer);
00599 }
00600
00601 inline bool QGLFormat::rgba() const
00602 {
00603 return testOption(QGL::Rgba);
00604 }
00605
00606 inline bool QGLFormat::alpha() const
00607 {
00608 return testOption(QGL::AlphaChannel);
00609 }
00610
00611 inline bool QGLFormat::accum() const
00612 {
00613 return testOption(QGL::AccumBuffer);
00614 }
00615
00616 inline bool QGLFormat::stencil() const
00617 {
00618 return testOption(QGL::StencilBuffer);
00619 }
00620
00621 inline bool QGLFormat::stereo() const
00622 {
00623 return testOption(QGL::StereoBuffers);
00624 }
00625
00626 inline bool QGLFormat::directRendering() const
00627 {
00628 return testOption(QGL::DirectRendering);
00629 }
00630
00631 inline bool QGLFormat::hasOverlay() const
00632 {
00633 return testOption(QGL::HasOverlay);
00634 }
00635
00636 inline bool QGLFormat::sampleBuffers() const
00637 {
00638 return testOption(QGL::SampleBuffers);
00639 }
00640
00641 QT_END_NAMESPACE
00642
00643 QT_END_HEADER
00644
00645 #endif // QGL_H