Hi Robert,

As I expected, the problem lies with using a GraphicsWindowEmbedded.
I was able to reproduce the bug in oagviewerQt by adding

        
viewerWindow->getGraphicsWindow()->setClearColor(osg::Vec4f(0.0f,1.0f,0.0f,1.0f));
        viewerWindow->getGraphicsWindow()->setClearMask(
GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

to the composite viewer. Attached is the example recreating the bug.

Cheers,
Morne

On Tue, Jan 27, 2009 at 12:44 PM, Morné Pistorius
<mpistorius....@googlemail.com> wrote:
> Hello again Robert,
>
> I modified the osgcompositeviewer example and setClearMask() works as
> expected when creating a new graphics context with proper traits, etc.
>
> I suspect my problem comes from using the graphics context created by
> osgViewer::GraphicsWindowEmbedded (this is the graphics context I pass
> to my cameras) in our Qt app.  It will take a bit of time to test my
> theory, because I didn't build OSG with Qt support and need a proper
> Qt install.  I will do this now and see if I can reproduce the error
> in osgviewerQt.  I just thought I would mention it, maybe this hint
> could shed some light on the problem.
>
> Cheers,
> Morne
>
>
>
>
> On Tue, Jan 27, 2009 at 11:43 AM, Morné Pistorius
> <mpistorius....@googlemail.com> wrote:
>> Not intentionally, no.  I added
>>
>>  pCamera->setClearMask( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
>>
>> to the camera attached to the view just to make sure, but it didn't
>> change anything.  It sounds like a bug then, I will try and recreate
>> it in a simple example.
>>
>> Cheers,
>> Morne
>>
>>
>> On Tue, Jan 27, 2009 at 11:36 AM, Robert Osfield
>> <robert.osfi...@gmail.com> wrote:
>>> Hi Morne,
>>>
>>> I'm rather perplexed that it didn't just work.  The clear of the
>>> graphics context/window should be done before everything else runs,
>>> the construction order should have no effect on this as it's a feature
>>> hard-wired into GraphicsContext. Is there a chance that you've
>>> disabled the clear of the colour and depth buffer for the cameras?
>>>
>>> Robert.
>>>
>>> On Tue, Jan 27, 2009 at 11:18 AM, Morné Pistorius
>>> <mpistorius....@googlemail.com> wrote:
>>>> Hi Robert,
>>>>
>>>> Thanks for the info.  I had a look at the osgcamera example and
>>>> changed my code to call
>>>>
>>>> getGraphicsWindow()->setClearColor(osg::Vec4f(0.0f,1.0f,0.0f,1.0f));
>>>> getGraphicsWindow()->setClearMask( GL_COLOR_BUFFER_BIT | 
>>>> GL_DEPTH_BUFFER_BIT)
>>>>
>>>> in the constructor of my derived osgViewer::CompositeViewer.  This
>>>> clears the viewer to green, but now none of my views show up inside
>>>> the composite viewer, the whole viewer is just green.  When I add a
>>>> view, it is created like this:
>>>>
>>>>  osgViewer::View * pView = new osgViewer::View;
>>>>  osg::Camera * pCamera = pView->getCamera();
>>>>
>>>>  pCamera->setGraphicsContext( getGraphicsWindow() );
>>>>  pCamera->setClearColor( osg::Vec4( 0.05, 0.05, 0.2, 1.0 ) ) ;
>>>>
>>>>  addView( pView );
>>>>
>>>>  ...compute viewport dimentions, etc...
>>>>
>>>>  pCamera->setViewport( new osg::Viewport( Left, Bottom ,
>>>> BestWindowWidth, BestWindowHeight ) );
>>>>  pCamera->setProjectionMatrixAsPerspective( 30.0f, double(
>>>> BestWindowWidth ) / double( BestWindowHeight ), 1.0f, 10000.0f );
>>>>
>>>> It is as if the call to clear the viewer comes after the call to
>>>> render the views and I just see the cleared result.  Removing the
>>>> setClearColor/setClearMask in the constructor shows my views again.
>>>>
>>>> Is it necessary to create a new GraphicsContexts for the cameras as in
>>>> the osgcameras example? I tried that, without success, so I guess I
>>>> must be missing something else. Attached is what I see.
>>>>
>>>> Thanks again for the help!
>>>>
>>>> Regards,
>>>> Morne
>>>>
>>>>
>>>> On Mon, Jan 26, 2009 at 4:30 PM, Robert Osfield
>>>> <robert.osfi...@gmail.com> wrote:
>>>>> Hi Morne,
>>>>>
>>>>> This isn't a bug, rather a limitation of using camera's to clear the
>>>>> background colour of the graphics context.  If your camera's don't
>>>>> cover the whole window then you have tell the GraphicsContext to do a
>>>>> clear - something it doesn't do by default for efficiency reasons - as
>>>>> the vast majority of apps have camera's covering the whole graphics
>>>>> context.
>>>>>
>>>>> The osgcamera example has an example of enabling the clear of the
>>>>> GraphicsContext.  It's simply a case of doing  a
>>>>> window->setClearMask(..) and window->setClearColor(..);
>>>>>
>>>>> Robert.
>>>>>
>>>>> On Mon, Jan 26, 2009 at 4:20 PM, Morné Pistorius
>>>>> <mpistorius....@googlemail.com> wrote:
>>>>>> Hi guys,
>>>>>>
>>>>>> I am having trouble clearing the background on a composite viewer.  I
>>>>>> have a composite viewer derived from QGLWidget to which I add and
>>>>>> remove views dynamically. The viewports are automatically tiled into a
>>>>>> number of rows and columns inside the viewer window to make the best
>>>>>> use of the available space, with a small gap between each view.
>>>>>>
>>>>>> My problem is that I can't clear the background of the composite
>>>>>> viewer when I add/remove views.  For example, if I had 4 views tiled
>>>>>> in a 2x2 matrix, and remove one view, I my tiler keeps two views in
>>>>>> the top row and 1 in the bottom row with an empty square where the
>>>>>> fourth view was.  Although the fourth view was removed, I still see
>>>>>> some data drawn from the last frame that the removed viewer displayed.
>>>>>>  Also, the gaps between the views shows garbage.  I attached two
>>>>>> screenshots showing the problem.
>>>>>>
>>>>>> Is there something that I could call on the composite viewer to clear
>>>>>> the entire window?  It could also be a Qt problem, since the composite
>>>>>> viewer is derived from QGLWidget.  If I resize the window after
>>>>>> removing the fourth view, then the background is cleared. I tried
>>>>>> calling repaint()/paintGL() on the QtWidget, but that didn't help.
>>>>>>
>>>>>> I would appreciate pointers from people who have successfully used
>>>>>> composite viewers with Qt before.
>>>>>>
>>>>>> Thanks a lot!
>>>>>>
>>>>>> Morne
>>>>>>
>>>>>> _______________________________________________
>>>>>> osg-users mailing list
>>>>>> osg-users@lists.openscenegraph.org
>>>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>>>>
>>>>>>
>>>>> _______________________________________________
>>>>> osg-users mailing list
>>>>> osg-users@lists.openscenegraph.org
>>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>>>
>>>>
>>>> _______________________________________________
>>>> osg-users mailing list
>>>> osg-users@lists.openscenegraph.org
>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>>
>>>>
>>> _______________________________________________
>>> osg-users mailing list
>>> osg-users@lists.openscenegraph.org
>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>
>>
>
/* OpenSceneGraph example, osganimate.
*
*  Permission is hereby granted, free of charge, to any person obtaining a copy
*  of this software and associated documentation files (the "Software"), to deal
*  in the Software without restriction, including without limitation the rights
*  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
*  copies of the Software, and to permit persons to whom the Software is
*  furnished to do so, subject to the following conditions:
*
*  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
*  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
*  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
*  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
*  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
*  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
*  THE SOFTWARE.
*/

#include <osgViewer/Viewer>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator>
#include <osgDB/ReadFile>

#if USE_QT4

    #include <QtCore/QString>
    #include <QtCore/QTimer>
    #include <QtGui/QKeyEvent>
    #include <QtGui/QApplication>
    #include <QtOpenGL/QGLWidget>
    #include <QtGui/QMainWindow>
    #include <QtGui/QMdiSubWindow>
    #include <QtGui/QMdiArea>
    
    using Qt::WindowFlags;

#else

    class QWidget;
    #include <qtimer.h>
    #include <qgl.h>
    #include <qapplication.h>

    #define WindowFlags WFlags

#endif

#include <iostream>

class AdapterWidget : public QGLWidget
{
    public:

        AdapterWidget( QWidget * parent = 0, const char * name = 0, const 
QGLWidget * shareWidget = 0, WindowFlags f = 0 );

        virtual ~AdapterWidget() {}

        osgViewer::GraphicsWindow* getGraphicsWindow() { return _gw.get(); }
        const osgViewer::GraphicsWindow* getGraphicsWindow() const { return 
_gw.get(); }

    protected:

        void init();

        virtual void resizeGL( int width, int height );
        virtual void keyPressEvent( QKeyEvent* event );
        virtual void keyReleaseEvent( QKeyEvent* event );
        virtual void mousePressEvent( QMouseEvent* event );
        virtual void mouseReleaseEvent( QMouseEvent* event );
        virtual void mouseMoveEvent( QMouseEvent* event );

        osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> _gw;
};

AdapterWidget::AdapterWidget( QWidget * parent, const char * name, const 
QGLWidget * shareWidget, WindowFlags f):
#if USE_QT4
    QGLWidget(parent, shareWidget, f)
#else
    QGLWidget(parent, name, shareWidget, f)
#endif
{
    _gw = new osgViewer::GraphicsWindowEmbedded(0,0,width(),height());
#if USE_QT4
    setFocusPolicy(Qt::ClickFocus);
#else
    setFocusPolicy(QWidget::ClickFocus);
#endif
}

void AdapterWidget::resizeGL( int width, int height )
{
    _gw->getEventQueue()->windowResize(0, 0, width, height );
    _gw->resized(0,0,width,height);
}

void AdapterWidget::keyPressEvent( QKeyEvent* event )
{
#if USE_QT4
    _gw->getEventQueue()->keyPress( (osgGA::GUIEventAdapter::KeySymbol) 
*(event->text().toAscii().data() ) );
#else
    _gw->getEventQueue()->keyPress( (osgGA::GUIEventAdapter::KeySymbol) 
event->ascii() );
#endif
}

void AdapterWidget::keyReleaseEvent( QKeyEvent* event )
{
#if USE_QT4
    _gw->getEventQueue()->keyRelease( (osgGA::GUIEventAdapter::KeySymbol) 
*(event->text().toAscii().data() ) );
#else
    _gw->getEventQueue()->keyRelease( (osgGA::GUIEventAdapter::KeySymbol) 
event->ascii() );
#endif
}

void AdapterWidget::mousePressEvent( QMouseEvent* event )
{
    int button = 0;
    switch(event->button())
    {
        case(Qt::LeftButton): button = 1; break;
        case(Qt::MidButton): button = 2; break;
        case(Qt::RightButton): button = 3; break;
        case(Qt::NoButton): button = 0; break;
        default: button = 0; break;
    }
    _gw->getEventQueue()->mouseButtonPress(event->x(), event->y(), button);
}

void AdapterWidget::mouseReleaseEvent( QMouseEvent* event )
{
    int button = 0;
    switch(event->button())
    {
        case(Qt::LeftButton): button = 1; break;
        case(Qt::MidButton): button = 2; break;
        case(Qt::RightButton): button = 3; break;
        case(Qt::NoButton): button = 0; break;
        default: button = 0; break;
    }
    _gw->getEventQueue()->mouseButtonRelease(event->x(), event->y(), button);
}

void AdapterWidget::mouseMoveEvent( QMouseEvent* event )
{
    _gw->getEventQueue()->mouseMotion(event->x(), event->y());
}


class ViewerQT : public osgViewer::Viewer, public AdapterWidget
{
    public:

        ViewerQT(QWidget * parent = 0, const char * name = 0, const QGLWidget * 
shareWidget = 0, WindowFlags f = 0):
            AdapterWidget( parent, name, shareWidget, f )
        {
            getCamera()->setViewport(new osg::Viewport(0,0,width(),height()));
            getCamera()->setProjectionMatrixAsPerspective(30.0f, 
static_cast<double>(width())/static_cast<double>(height()), 1.0f, 10000.0f);
            getCamera()->setGraphicsContext(getGraphicsWindow());

            setThreadingModel(osgViewer::Viewer::SingleThreaded);

            connect(&_timer, SIGNAL(timeout()), this, SLOT(updateGL()));
            _timer.start(10);
        }

        virtual void paintGL()
        {
            frame();
        }
    
    protected:

        QTimer _timer;
};

class CompositeViewerQT : public osgViewer::CompositeViewer, public 
AdapterWidget
{
    public:

        CompositeViewerQT(QWidget * parent = 0, const char * name = 0, const 
QGLWidget * shareWidget = 0, WindowFlags f = 0):
            AdapterWidget( parent, name, shareWidget, f )
        {
            setThreadingModel(osgViewer::CompositeViewer::SingleThreaded);

            connect(&_timer, SIGNAL(timeout()), this, SLOT(updateGL()));
            _timer.start(10);
        }

        virtual void paintGL()
        {
            frame();
        }
    
    protected:

        QTimer _timer;
};

int mainAdapterWidget(QApplication& a, osg::ArgumentParser& arguments)
{
    // load the scene.
    osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
    if (!loadedModel)
    {
        std::cout << arguments[0] <<": No data loaded." << std::endl;
        return 1;
    }
    
    std::cout<<"Using AdapterWidget - QGLWidget subclassed to integrate with 
osgViewer using its embedded graphics window support."<<std::endl;
    
    if (arguments.read("--CompositeViewer"))
    {
        CompositeViewerQT* viewerWindow = new CompositeViewerQT;

        unsigned int width = viewerWindow->width();
        unsigned int height = viewerWindow->height();
        
        
viewerWindow->getGraphicsWindow()->setClearColor(osg::Vec4f(0.0f,1.0f,0.0f,1.0f));
        viewerWindow->getGraphicsWindow()->setClearMask( GL_COLOR_BUFFER_BIT | 
GL_DEPTH_BUFFER_BIT );  

        {
            osgViewer::View* view1 = new osgViewer::View;
            
view1->getCamera()->setGraphicsContext(viewerWindow->getGraphicsWindow());
            view1->getCamera()->setProjectionMatrixAsPerspective(30.0f, 
static_cast<double>(width)/static_cast<double>(height/3), 1.0, 1000.0);
            view1->getCamera()->setViewport(new 
osg::Viewport(0,0,width,height/3));
            view1->setCameraManipulator(new osgGA::TrackballManipulator);
            view1->setSceneData(loadedModel.get());
            
            viewerWindow->addView(view1);
        }
        
        {
            osgViewer::View* view2 = new osgViewer::View;
            
view2->getCamera()->setGraphicsContext(viewerWindow->getGraphicsWindow());
            view2->getCamera()->setProjectionMatrixAsPerspective(30.0f, 
static_cast<double>(width)/static_cast<double>(height/3), 1.0, 1000.0);
            view2->getCamera()->setViewport(new 
osg::Viewport(0,height/2,width,height/3));
            view2->setCameraManipulator(new osgGA::TrackballManipulator);
            view2->setSceneData(loadedModel.get());
            
            viewerWindow->addView(view2);
        }

        viewerWindow->show();
#if USE_QT4
    }
    else if (arguments.read("--mdi")) {
          std::cout<<"Using ViewetQT MDI version"<<std::endl;
         /*
         Following problems are found here:
         - miminize causes loaded model to disappear (some problem with Camera 
matrix? - clampProjectionMatrix is invalid)
         */
         ViewerQT* viewerWindow = new ViewerQT;
         viewerWindow->setCameraManipulator(new osgGA::TrackballManipulator);
         viewerWindow->setSceneData(loadedModel.get());
 
         QMainWindow* mw = new QMainWindow();
         QMdiArea* mdiArea = new QMdiArea(mw);
         mw->setCentralWidget(mdiArea);

         QMdiSubWindow *subWindow = mdiArea->addSubWindow(viewerWindow);
         subWindow->showMaximized();
         subWindow->setWindowTitle("New Window");
         mw->show();
#endif // USE_QT4
    } else {
        ViewerQT* viewerWindow = new ViewerQT;

        viewerWindow->setCameraManipulator(new osgGA::TrackballManipulator);
        viewerWindow->setSceneData(loadedModel.get());

        viewerWindow->show();
    }    
    
    
    a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) );
   
    return a.exec();
}

/*EOF*/
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to