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();
109 glEnable(GL_MULTISAMPLE);
110 glEnable(GL_LINE_SMOOTH);
127 parent->setViewport(glWidget);
135 Q_ASSERT_X(NULL == this->painter, Q_FUNC_INFO,
136 "Painting is not disabled at destruction");
148 void init(
const bool npot,
const QString& glVendor,
const QString& glRenderer)
151 this->nonPowerOfTwoTexturesSupported = npot;
153 glWidget->setAutoFillBackground(
false);
157 if(glRenderer ==
"Chromium")
161 if(glVendor ==
"Tungsten Graphics, Inc")
163 if(glRenderer.contains(
"945") ||
164 glRenderer.contains(
"810") ||
165 glRenderer.contains(
"845") ||
166 glRenderer.contains(
"855") ||
167 glRenderer.contains(
"865") ||
168 glRenderer.contains(
"915") ||
169 glRenderer.contains(
"946") ||
170 glRenderer.contains(
"500") ||
171 glRenderer.contains(
"965") ||
172 glRenderer.contains(
"950") ||
173 glRenderer.contains(
"X3100") ||
174 glRenderer.contains(
"GM45") ||
175 glRenderer.contains(
"Ironlake") ||
176 glRenderer.contains(
"G33") ||
177 glRenderer.contains(
"G41") ||
178 glRenderer.contains(
"IGD"))
184 fboSupported = QGLFramebufferObject::hasOpenGLFramebufferObjects();
200 Q_ASSERT_X(newSize.isValid(), Q_FUNC_INFO,
"Invalid scene size");
201 viewportSize = newSize;
221 Q_ASSERT_X(painter->paintEngine()->type() == QPaintEngine::OpenGL ||
222 painter->paintEngine()->type() == QPaintEngine::OpenGL2,
224 "QGL StelRenderer backends need a QGLWidget to be set as the "
225 "viewport on the graphics view");
226 QGLWidget* widget =
dynamic_cast<QGLWidget*
>(painter->device());
227 Q_ASSERT_X(NULL != widget && widget->context() == context, Q_FUNC_INFO,
228 "Painter used with QGL StelRenderer backends needs to paint on a QGLWidget "
229 "with the same GL context as the one used by the renderer");
235 defaultPainter = painter;
243 return glWidget->grabFrameBuffer();
260 return fboSupported && !fboDisabled;
268 Q_ASSERT_X(NULL != painter, Q_FUNC_INFO,
269 "Trying to set text (painting) font but painting is disabled");
270 painter->setFont(font);
282 backBufferPainter =
new QPainter(backBuffer);
299 Q_ASSERT_X(
useFBO(), Q_FUNC_INFO,
"Partial rendering only works with FBOs");
314 delete backBufferPainter;
315 backBufferPainter = NULL;
317 backBuffer->release();
319 if(swapBuffers){swapFBOs();}
331 Q_ASSERT_X(!backBuffer->isBound() && !frontBuffer->isBound(), Q_FUNC_INFO,
332 "Framebuffer objects weren't released before drawing the result");
341 if(usingGLWidgetPainter)
344 usingGLWidgetPainter =
false;
373 QPainter* defaultPainter;
375 QPainter* backBufferPainter;
378 QGLFramebufferObject* frontBuffer;
380 QGLFramebufferObject* backBuffer;
386 bool usingGLWidgetPainter;
397 bool nonPowerOfTwoTexturesSupported;
400 void invariant()
const
403 Q_ASSERT_X(NULL != glWidget, Q_FUNC_INFO,
"Destroyed StelQGLViewport");
404 Q_ASSERT_X(glWidget->isValid(), Q_FUNC_INFO,
405 "Invalid glWidget (maybe there is no OpenGL support?)");
407 const bool fbo =
useFBO();
408 Q_ASSERT_X(NULL == backBufferPainter || fbo, Q_FUNC_INFO,
409 "We have a backbuffer painter even though we're not using FBO");
410 Q_ASSERT_X(drawing && fbo ? backBufferPainter != NULL :
true, Q_FUNC_INFO,
411 "We're drawing and using FBOs, but the backBufferPainter is NULL");
412 Q_ASSERT_X(NULL == backBuffer || fbo, Q_FUNC_INFO,
413 "We have a backbuffer even though we're not using FBO");
414 Q_ASSERT_X(NULL == frontBuffer || fbo, Q_FUNC_INFO,
415 "We have a frontbuffer even though we're not using FBO");
416 Q_ASSERT_X(drawing && fbo ? backBuffer != NULL :
true, Q_FUNC_INFO,
417 "We're drawing and using FBOs, but the backBuffer is NULL");
418 Q_ASSERT_X(drawing && fbo ? frontBuffer != NULL :
true, Q_FUNC_INFO,
419 "We're drawing and using FBOs, but the frontBuffer is NULL");
431 this->painter =
new QPainter(glWidget);
432 usingGLWidgetPainter =
true;
435 this->painter = painter;
443 Q_ASSERT_X(
useFBO(), Q_FUNC_INFO,
"We're not using FBO");
444 if (NULL == backBuffer)
446 Q_ASSERT_X(NULL == frontBuffer, Q_FUNC_INFO,
447 "frontBuffer is not null even though backBuffer is");
451 const QSize bufferSize = nonPowerOfTwoTexturesSupported
456 const QGLFramebufferObject::Attachment attachment =
457 QGLFramebufferObject::CombinedDepthStencil;
458 backBuffer =
new QGLFramebufferObject(bufferSize, attachment);
459 frontBuffer =
new QGLFramebufferObject(bufferSize, attachment);
461 Q_ASSERT_X(backBuffer->isValid() && frontBuffer->isValid(),
462 Q_FUNC_INFO,
"Framebuffer objects failed to initialize");
471 Q_ASSERT_X(
useFBO(), Q_FUNC_INFO,
"We're not using FBO");
472 QGLFramebufferObject* tmp = backBuffer;
473 backBuffer = frontBuffer;
483 if(NULL != frontBuffer)
488 if(NULL != backBuffer)
497 #endif // _STELQGLVIEWPORT_HPP_