Hi Mathieu,

On 19 July 2013 07:25, Robert Osfield <[email protected]> wrote:

> Today I will look into what is different between osgviewerQt and other
> osgviewer usage to see if there what needs to change in osgviewerQt/osgQt
> or osgViewer.
>

I've tracked down the problem to the way that the osgviewerQt code creates
it's own osg::Camera then assigns this to the View, in doing this it
overrides the default View's Camera's StateSet that has the default global
state applied to it (via a StateSet::setGlobalDefaults() call).  The fix
was either to call camera->getOrCreateStateSet()->setGlobalDefaults() or
restructure the example so that it doesn't override the View::Camera by
setting it's own one.  I opted for the later as I feel it's a slightly
cleaner approach to the example, changes I made are below:

$ svn diff
Index: osgviewerQt.cpp
===================================================================
--- osgviewerQt.cpp     (revision 13610)
+++ osgviewerQt.cpp     (working copy)
@@ -19,16 +19,15 @@
     ViewerWidget(osgViewer::ViewerBase::ThreadingModel
threadingModel=osgViewer::CompositeViewer::SingleThreaded) : QWidget()
     {
         setThreadingModel(threadingModel);
-
+
         // disable the default setting of viewer.done() by pressing Escape.
         setKeyEventSetsDone(0);

-        QWidget* widget1 = addViewWidget( createCamera(0,0,100,100),
osgDB::readNodeFile("cow.osgt") );
-        QWidget* widget2 = addViewWidget( createCamera(0,0,100,100),
osgDB::readNodeFile("glider.osgt") );
-        QWidget* widget3 = addViewWidget( createCamera(0,0,100,100),
osgDB::readNodeFile("axes.osgt") );
-        QWidget* widget4 = addViewWidget( createCamera(0,0,100,100),
osgDB::readNodeFile("fountain.osgt") );
-        QWidget* popupWidget = addViewWidget(
createCamera(900,100,320,240,"Popup window",true),
-
osgDB::readNodeFile("dumptruck.osgt") );
+        QWidget* widget1 = addViewWidget(
createGraphicsWindow(0,0,100,100), osgDB::readNodeFile("cow.osgt") );
+        QWidget* widget2 = addViewWidget(
createGraphicsWindow(0,0,100,100), osgDB::readNodeFile("glider.osgt") );
+        QWidget* widget3 = addViewWidget(
createGraphicsWindow(0,0,100,100), osgDB::readNodeFile("axes.osgt") );
+        QWidget* widget4 = addViewWidget(
createGraphicsWindow(0,0,100,100), osgDB::readNodeFile("fountain.osgt") );
+        QWidget* popupWidget = addViewWidget(
createGraphicsWindow(900,100,320,240,"Popup window",true),
osgDB::readNodeFile("dumptruck.osgt") );
         popupWidget->show();

         QGridLayout* grid = new QGridLayout;
@@ -41,22 +40,29 @@
         connect( &_timer, SIGNAL(timeout()), this, SLOT(update()) );
         _timer.start( 10 );
     }
-
-    QWidget* addViewWidget( osg::Camera* camera, osg::Node* scene )
+
+    QWidget* addViewWidget( osgQt::GraphicsWindowQt* gw, osg::Node* scene )
     {
         osgViewer::View* view = new osgViewer::View;
-        view->setCamera( camera );
         addView( view );
-
+
+        osg::Camera* camera = view->getCamera();
+        camera->setGraphicsContext( gw );
+
+        const osg::GraphicsContext::Traits* traits = gw->getTraits();
+
+        camera->setClearColor( osg::Vec4(0.2, 0.2, 0.6, 1.0) );
+        camera->setViewport( new osg::Viewport(0, 0, traits->width,
traits->height) );
+        camera->setProjectionMatrixAsPerspective(30.0f,
static_cast<double>(traits->width)/static_cast<double>(traits->height),
1.0f, 10000.0f );
+
         view->setSceneData( scene );
         view->addEventHandler( new osgViewer::StatsHandler );
         view->setCameraManipulator( new osgGA::TrackballManipulator );
-
-        osgQt::GraphicsWindowQt* gw =
dynamic_cast<osgQt::GraphicsWindowQt*>( camera->getGraphicsContext() );
-        return gw ? gw->getGLWidget() : NULL;
+
+        return gw->getGLWidget();
     }
-
-    osg::Camera* createCamera( int x, int y, int w, int h, const
std::string& name="", bool windowDecoration=false )
+
+    osgQt::GraphicsWindowQt* createGraphicsWindow( int x, int y, int w,
int h, const std::string& name="", bool windowDecoration=false )
     {
         osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
         osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits;
@@ -71,22 +77,25 @@
         traits->stencil = ds->getMinimumNumStencilBits();
         traits->sampleBuffers = ds->getMultiSamples();
         traits->samples = ds->getNumMultiSamples();
-
+
+        return new osgQt::GraphicsWindowQt(traits.get());
+#if 0
         osg::ref_ptr<osg::Camera> camera = new osg::Camera;
-        camera->setGraphicsContext( new
osgQt::GraphicsWindowQt(traits.get()) );
-
+        camera->setGraphicsContext( ) );
+
         camera->setClearColor( osg::Vec4(0.2, 0.2, 0.6, 1.0) );
         camera->setViewport( new osg::Viewport(0, 0, traits->width,
traits->height) );
         camera->setProjectionMatrixAsPerspective(
             30.0f,
static_cast<double>(traits->width)/static_cast<double>(traits->height),
1.0f, 10000.0f );
         return camera.release();
+#endif
     }
-
+
     virtual void paintEvent( QPaintEvent* event )
     { frame(); }

 protected:
-
+
     QTimer _timer;
 };

@@ -99,7 +108,7 @@
     while (arguments.read("--CullDrawThreadPerContext")) threadingModel =
osgViewer::ViewerBase::CullDrawThreadPerContext;
     while (arguments.read("--DrawThreadPerContext")) threadingModel =
osgViewer::ViewerBase::DrawThreadPerContext;
     while (arguments.read("--CullThreadPerCameraDrawThreadPerContext"))
threadingModel =
osgViewer::ViewerBase::CullThreadPerCameraDrawThreadPerContext;
-
+
     QApplication app(argc, argv);
     ViewerWidget* viewWidget = new ViewerWidget(threadingModel);
     viewWidget->setGeometry( 100, 100, 800, 600 );

Robert.
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org

Reply via email to