/*! Overridden from QGLWidget to render the scenegraph */ void QuarterWidget::paintEvent(QPaintEvent* event) { std::clock_t begin = std::clock(); if(!initialized) { glEnable(GL_DEPTH_TEST); this->getSoRenderManager()->reinitialize(); initialized = true; } getSoRenderManager()->activate(); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); QGLWidget* w = static_cast<QGLWidget*>(this->viewport()); assert(w->isValid() && "No valid GL context found!"); // We might have to process the delay queue here since we don't know // if paintGL() is called from Qt, and we might have some sensors // waiting to trigger (the redraw sensor has a lower priority than a // normal field sensor to guarantee that your sensor is processed // before the next redraw). Disable autorendering while we do this // to avoid recursive redraws. // We set the PRIVATE(this)->processdelayqueue = false in redraw() // to avoid processing the delay queue when paintGL() is triggered // by us, and we don't want to process the delay queue in those // cases PRIVATE(this)->autoredrawenabled = false; if(PRIVATE(this)->processdelayqueue && SoDB::getSensorManager()->isDelaySensorPending()) { // processing the sensors might trigger a redraw in another // context. Release this context temporarily w->doneCurrent(); SoDB::getSensorManager()->processDelayQueue(false); w->makeCurrent(); } assert(w->isValid() && "No valid GL context found!"); glDrawBuffer(w->doubleBuffer() ? GL_BACK : GL_FRONT); w->makeCurrent(); this->actualRedraw(); //start the standard graphics view processing for all widgets and graphic items. As //QGraphicsView initaliizes a QPainter which changes the Opengl context in an unpredictable //manner we need to store the context and recreate it after Qt is done. glPushAttrib(GL_MULTISAMPLE_BIT_EXT); inherited::paintEvent(event); glPopAttrib(); if (w->doubleBuffer()) { w->swapBuffers(); } PRIVATE(this)->autoredrawenabled = true; // process the delay queue the next time we enter this function, // unless we get here after a call to redraw(). PRIVATE(this)->processdelayqueue = true; std::clock_t end = std::clock(); renderTime = double(double(end-begin)/CLOCKS_PER_SEC)*1000.0; }
void DCPUToolchain_SwapBuffers(void* context) { QGLWidget* w = static_cast<QGLWidget*>(context); w->swapBuffers(); }