20 #ifndef _STELQGLVIEWPORT_HPP_
21 #define _STELQGLVIEWPORT_HPP_
23 #include <QGLFramebufferObject>
25 #include <QGraphicsView>
29 #include "StelUtils.hpp"
37 StelQGLWidget(QGLContext* ctx, QWidget* parent) : QGLWidget(ctx, parent)
39 setAttribute(Qt::WA_PaintOnScreen);
40 setAttribute(Qt::WA_NoSystemBackground);
41 setAttribute(Qt::WA_OpaquePaintEvent);
43 setBackgroundRole(QPalette::Window);
53 virtual void initializeGL()
55 qDebug() <<
"OpenGL supported version: " << QString((
char*)glGetString(GL_VERSION));
57 QGLWidget::initializeGL();
59 if (!format().stencil())
60 qWarning(
"Could not get stencil buffer; results will be suboptimal");
61 if (!format().depth())
62 qWarning(
"Could not get depth buffer; results will be suboptimal");
63 if (!format().doubleBuffer())
64 qWarning(
"Could not get double buffer; results will be suboptimal");
66 QString paintEngineStr;
70 case QPaintEngine::OpenGL: paintEngineStr =
"OpenGL";
break;
71 case QPaintEngine::OpenGL2: paintEngineStr =
"OpenGL2";
break;
72 default: paintEngineStr =
"Other";
74 qDebug() <<
"Qt GL paint engine is: " << paintEngineStr;
92 : viewportSize(QSize())
95 , defaultPainter(NULL)
96 , backBufferPainter(NULL)
100 , usingGLWidgetPainter(false)
101 , fboSupported(false)
103 , nonPowerOfTwoTexturesSupported(false)
106 glWidget->updateGL();
122 parent->setViewport(glWidget);
130 Q_ASSERT_X(NULL == this->painter, Q_FUNC_INFO,
131 "Painting is not disabled at destruction");
143 void init(
const bool npot,
const QString& glVendor,
const QString& glRenderer)
146 this->nonPowerOfTwoTexturesSupported = npot;
148 glWidget->setAutoFillBackground(
false);
152 if(glRenderer ==
"Chromium")
156 if(glVendor ==
"Tungsten Graphics, Inc")
158 if(glRenderer.contains(
"945") ||
159 glRenderer.contains(
"810") ||
160 glRenderer.contains(
"845") ||
161 glRenderer.contains(
"855") ||
162 glRenderer.contains(
"865") ||
163 glRenderer.contains(
"915") ||
164 glRenderer.contains(
"946") ||
165 glRenderer.contains(
"500") ||
166 glRenderer.contains(
"965") ||
167 glRenderer.contains(
"950") ||
168 glRenderer.contains(
"X3100") ||
169 glRenderer.contains(
"GM45") ||
170 glRenderer.contains(
"Ironlake") ||
171 glRenderer.contains(
"G33") ||
172 glRenderer.contains(
"G41") ||
173 glRenderer.contains(
"IGD"))
179 fboSupported = QGLFramebufferObject::hasOpenGLFramebufferObjects();
195 Q_ASSERT_X(newSize.isValid(), Q_FUNC_INFO,
"Invalid scene size");
196 viewportSize = newSize;
216 Q_ASSERT_X(painter->paintEngine()->type() == QPaintEngine::OpenGL ||
217 painter->paintEngine()->type() == QPaintEngine::OpenGL2,
219 "QGL StelRenderer backends need a QGLWidget to be set as the "
220 "viewport on the graphics view");
221 QGLWidget* widget =
dynamic_cast<QGLWidget*
>(painter->device());
222 Q_ASSERT_X(NULL != widget && widget->context() == context, Q_FUNC_INFO,
223 "Painter used with QGL StelRenderer backends needs to paint on a QGLWidget "
224 "with the same GL context as the one used by the renderer");
230 defaultPainter = painter;
238 return glWidget->grabFrameBuffer();
255 return fboSupported && !fboDisabled;
263 Q_ASSERT_X(NULL != painter, Q_FUNC_INFO,
264 "Trying to set text (painting) font but painting is disabled");
265 painter->setFont(font);
277 backBufferPainter =
new QPainter(backBuffer);
294 Q_ASSERT_X(
useFBO(), Q_FUNC_INFO,
"Partial rendering only works with FBOs");
309 delete backBufferPainter;
310 backBufferPainter = NULL;
312 backBuffer->release();
314 if(swapBuffers){swapFBOs();}
326 Q_ASSERT_X(!backBuffer->isBound() && !frontBuffer->isBound(), Q_FUNC_INFO,
327 "Framebuffer objects weren't released before drawing the result");
336 if(usingGLWidgetPainter)
339 usingGLWidgetPainter =
false;
368 QPainter* defaultPainter;
370 QPainter* backBufferPainter;
373 QGLFramebufferObject* frontBuffer;
375 QGLFramebufferObject* backBuffer;
381 bool usingGLWidgetPainter;
392 bool nonPowerOfTwoTexturesSupported;
395 void invariant()
const
398 Q_ASSERT_X(NULL != glWidget, Q_FUNC_INFO,
"Destroyed StelQGLViewport");
399 Q_ASSERT_X(glWidget->isValid(), Q_FUNC_INFO,
400 "Invalid glWidget (maybe there is no OpenGL support?)");
402 const bool fbo =
useFBO();
403 Q_ASSERT_X(NULL == backBufferPainter || fbo, Q_FUNC_INFO,
404 "We have a backbuffer painter even though we're not using FBO");
405 Q_ASSERT_X(drawing && fbo ? backBufferPainter != NULL :
true, Q_FUNC_INFO,
406 "We're drawing and using FBOs, but the backBufferPainter is NULL");
407 Q_ASSERT_X(NULL == backBuffer || fbo, Q_FUNC_INFO,
408 "We have a backbuffer even though we're not using FBO");
409 Q_ASSERT_X(NULL == frontBuffer || fbo, Q_FUNC_INFO,
410 "We have a frontbuffer even though we're not using FBO");
411 Q_ASSERT_X(drawing && fbo ? backBuffer != NULL :
true, Q_FUNC_INFO,
412 "We're drawing and using FBOs, but the backBuffer is NULL");
413 Q_ASSERT_X(drawing && fbo ? frontBuffer != NULL :
true, Q_FUNC_INFO,
414 "We're drawing and using FBOs, but the frontBuffer is NULL");
426 this->painter =
new QPainter(glWidget);
427 usingGLWidgetPainter =
true;
430 this->painter = painter;
438 Q_ASSERT_X(
useFBO(), Q_FUNC_INFO,
"We're not using FBO");
439 if (NULL == backBuffer)
441 Q_ASSERT_X(NULL == frontBuffer, Q_FUNC_INFO,
442 "frontBuffer is not null even though backBuffer is");
446 const QSize bufferSize = nonPowerOfTwoTexturesSupported
451 const QGLFramebufferObject::Attachment attachment =
452 QGLFramebufferObject::CombinedDepthStencil;
453 backBuffer =
new QGLFramebufferObject(bufferSize, attachment);
454 frontBuffer =
new QGLFramebufferObject(bufferSize, attachment);
456 Q_ASSERT_X(backBuffer->isValid() && frontBuffer->isValid(),
457 Q_FUNC_INFO,
"Framebuffer objects failed to initialize");
466 Q_ASSERT_X(
useFBO(), Q_FUNC_INFO,
"We're not using FBO");
467 QGLFramebufferObject* tmp = backBuffer;
468 backBuffer = frontBuffer;
478 if(NULL != frontBuffer)
483 if(NULL != backBuffer)
492 #endif // _STELQGLVIEWPORT_HPP_