Встраивать OSG в QGraphicsView, QGraphicsScene не показывать - PullRequest
0 голосов
/ 23 мая 2018

По некоторым причинам элементы нашего программного обеспечения QWidget помещаются в QGraphicsScene и визуализируются QGraphicsView.Теперь я пытаюсь встроить открытый сценограф в этот QFraphicsView, переопределил функцию отрисовки фона QGraphicsView, как это

void OsgQGraphicsView::drawBackground(QPainter *painter, const QRectF &rect)
{
    if(painter->paintEngine()->type() != QPaintEgin::OpenGL2)
    {
         // error manage
    }
    painter->save();
    painter->beginNativePainting();
    viewer_->frame();
    painter->endNativePainting();
    painter->restore();
}

, когда данные сцены osg не пусты, элементы в QGraphicsScene не могут отображаться.

1 Ответ

0 голосов
/ 23 мая 2018

OSG использует ленивые обновления состояния, что OSG не будет сбрасывать состояние opengl после фрейма.см. этот форум http://forum.openscenegraph.org/viewtopic.php?t=6976, чтобы мы могли выдвигать и открывать состояние opengl между viewer->frame().Но решение состоит в том, чтобы использовать glPushClientAttrib вместо glPushAttrib, поскольку opengl использует режим клиент / сервер, клиент и сервер поддерживают различные типы состояний, см. Этот форум: http://www.glprogramming.com/red/chapter07.html. Код теперь стал таким

    void OsgQGraphicsView::drawBackground(QPainter *painter, const QRectF &rect)
    {
       if(painter->paintEngine()->type() != QPaintEgin::OpenGL2)
       {
           // error manage
       }
       painter->save();
       painter->beginNativePainting();
       glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
       viewer_->frame();
       glPopClientAttrib();
       painter->endNativePainting();
       painter->restore();
   }

но этого недостаточно, поскольку мы восстанавливаем состояние opengl для qt, чтобы рисовать графические элементы, но состояние opengl для osg грязное после отрисовки элементов qt.Таким образом, мы все еще должны сбросить состояние opengl для osg, так что Thaks на Sean Spicer http://forum.openscenegraph.org/viewtopic.php?t=2308 дать решение (работает на osg3.4 с qt5.6.3. Я пробовал osg3.6, он вылетает):

void OsgQGraphicsView::drawBackground(QPainter *painter, const QRectF &rect)
    {
       if(painter->paintEngine()->type() != QPaintEgin::OpenGL2)
       {
           // error manage
       }
       painter->save();
       painter->beginNativePainting();
       glPushAttrib(GL_ALL_ATTRIB_BITS); 
       glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
       glMatrixMode(GL_TEXTURE); 
       glPushMatrix(); 
       glLoadIdentity(); 

       glMatrixMode(GL_PROJECTION);
       glPushMatrix(); 
       glLoadIdentity();

       glMatrixMode(GL_MODELVIEW); 
       glPushMatrix(); 
       glLoadIdentity();
       osg::State *state = viewer_->getCamera()->getGraphicsContext()->getState(); 
       state->reset();
       state->apply(last_stateset);
       viewer_->frame();
       viewer_->getCamera()->getGraphicsContext()->getState()->captureCurrentState(*last_stateset);
       // Pop matricies. 
       glMatrixMode(GL_PROJECTION); 
       glPopMatrix(); 
       glMatrixMode(GL_TEXTURE); 
       glPopMatrix(); 
       glMatrixMode(GL_MODELVIEW); 
       glPopMatrix();
       glPopAttrib();
       glPopClientAttrib();
       painter->endNativePainting(); // reset opengl state for qt
       painter->restore();
   }
...