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