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