[osg-users] Displaying a scene in the background of a QGraphicsView

Max Pfingsthorn max.pfingsthorn at gmail.com
Fri Sep 5 10:42:28 PDT 2008


Hello Robert,

Thank you very much for your reply.

My thoughts exactly. But how do I save and restore the opengl state in  
its entirety? I tried pushing/popping the modelview, projection and  
even the texture matrices around calling viewer->frame(). I also  
explicitly glGet'ed them and loaded them again after OSG was done in  
case push/pops were not matched properly inside OSG.

What else is there to save in the opengl state?

Best regards,
Max Pfingsthorn

On 5 Sep 2008, at 17:40, "Robert Osfield" <robert.osfield at gmail.com>  
wrote:

> Hi Max,
>
> My guess is that Qt is changing OpenGL state which is not being
> protected, and then you are mixing this with the OSG which assumes
> that it has complete control over OpenGL state so gets messed up by
> the QT changes to state, and also Qt OpenGL code is likely to be
> messed up by the OSG changing state.
>
> I don't know enough about the Qt's implementation here to really
> provide my insight.  Personally I'd rather keep Qt doing Windowing and
> the OSG doing OpenGL.  If you want to mix things then you'll need to
> start playing games with push and popping OpenGL state when entering
> the Qt OpenGl code path, and also resetting OpenGL state after leaving
> the OSG section.
>
> Robert.
>
> On Fri, Sep 5, 2008 at 4:16 PM, Max Pfingsthorn
> <max.pfingsthorn at gmail.com> wrote:
>> Dear users,
>>
>> this problem has been with me for a while. I've even tried it with  
>> other
>> graphics engines (Ogre) to no avail.
>>
>> As shown in this toy project at Trolltech Labs
>>
>> http://labs.trolltech.com/blogs/2008/06/27/accelerate-your-widgets-with-opengl/
>>
>> I would like to show a scene in the background of a QGraphicsView  
>> and I
>> was very happy that the ViewerQT class already was a QGLWidget.  
>> However,
>> there seems to be something scaled wrong after I call viewer->frame 
>> ().
>>
>> Attached are a few screenshots and the code I have so far. I'm  
>> currently
>> running Ubuntu 8.04.1 and I'm using the OSG 2.2 binaries that came  
>> with
>> it. Beware that you need at least Qt 4.4 to compile this code.
>>
>> qt-osg-1.png and -2.png show how far I am at the moment. Number 2  
>> shows
>> the problem with scaling the window. OSG shows the scene fine in the
>> background, but the widget I'd like to overlay is stretched. I  
>> believe
>> the OpenGL version of QPainter draws in some normalized coordinates  
>> and
>> the bounding box isn't properly updated. qt-osg-ok-1.png and -2.png  
>> show
>> the same window sizes without calling viewer->frame(), and the  
>> scaling
>> of the widget is ok. Just no scene in the background of course.
>>
>> I've traced the problem to osgViewer::Renderer::cull_draw(). I  
>> believe,
>> when the geometry of the view is set, something makes Qt stop drawing
>> correctly.
>>
>> In the function which calls viewer->frame() (in
>> osgGraphicsView::drawBackground), I thought I save any sort of  
>> relevant
>> OpenGL state, the projection matrix, model/view matrix, and even the
>> texture matrix. After the call the viewer->frame(), I restore them
>> again. Is there any other state that I might have overlooked which is
>> set in the renderer? Also, do you have any idea why the Qt widget  
>> is not
>> drawn entirely sometimes? Could it have something do to with buffer  
>> swaps?
>>
>> Thank you all for your help in advance!
>>
>> Best regards,
>> Max Pfingsthorn
>>
>> _______________________________________________
>> osg-users mailing list
>> osg-users at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>
>>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org



More information about the osg-users mailing list