Hi Robert,
We've recently upgraded to a QT5/VS2012/Windows7 environment.
We use an application that uses osgviewerQt model for Qt/OpenSceneGraph
integration.
With the new environment, the application hang each time a widget partially
covers the QGLWidget.
Some investigation showed that it was related to QTimer used to refresh the
widget.
The problem is similar to this thread :
https://bugreports.qt-project.org/browse/QTBUG-27266
A solution is to fire the timer only once and repeat once called.
This problem only appear on windows, with VS2012, QT up to 5.3, but the new
behavior shouldn't affect negatively other platforms.
Regards,
Luc Frauciel
Responsable R&D
R&D Manager
[X]<http://www.1spatial.com>
[http://www.1spatial.com/wp-content/themes/1spatial/images/youtube.png]<http://www.youtube.com/user/1SpatialGroup>
[http://www.1spatial.com/wp-content/themes/1spatial/images/facebook.png]
<https://www.facebook.com/1Spatial>
[http://www.1spatial.com/wp-content/themes/1spatial/images/linkedIn.png]
<http://www.linkedin.com/company/1spatial>
[http://www.1spatial.com/wp-content/themes/1spatial/images/twitter.png]
<http://www.twitter.com/1spatial>
________________________________
1Spatial France SAS
Les informations contenues dans cet e-mail sont confidentielles et uniquement
adress?es au destinataire. Les opinions qui y sont exprim?es peuvent ?tre
celles de l'auteur et ne repr?sentent pas n?cessairement celles du Groupe
1Spatial. Cet e-mail a ?t? scann? et est garanti sans aucun virus. 1Spatial
France SAS est une soci?t? de droit fran?ais, membre du Groupe 1Spatial. Si?ge
Social : Immeuble AXEO2, 23-25 Avenue Aristide Briand, 94110 Arcueil, France.
RCS CRETEIL 334 416 336
#include <QTimer>
#include <QApplication>
#include <QGridLayout>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/MultiTouchTrackballManipulator>
#include <osgDB/ReadFile>
#include <osgQt/GraphicsWindowQt>
#include <iostream>
class ViewerWidget : public QWidget, public osgViewer::CompositeViewer
{
public:
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( 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;
grid->addWidget( widget1, 0, 0 );
grid->addWidget( widget2, 0, 1 );
grid->addWidget( widget3, 1, 0 );
grid->addWidget( widget4, 1, 1 );
setLayout( grid );
connect( &_timer, SIGNAL(timeout()), this, SLOT(update()) );
_timer.setSingleShot(true);
_timer.start( 10 );
}
QWidget* addViewWidget( osgQt::GraphicsWindowQt* gw, osg::Node* scene )
{
osgViewer::View* view = new osgViewer::View;
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::MultiTouchTrackballManipulator );
gw->setTouchEventsEnabled( true );
return gw->getGLWidget();
}
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;
traits->windowName = name;
traits->windowDecoration = windowDecoration;
traits->x = x;
traits->y = y;
traits->width = w;
traits->height = h;
traits->doubleBuffer = true;
traits->alpha = ds->getMinimumNumAlphaBits();
traits->stencil = ds->getMinimumNumStencilBits();
traits->sampleBuffers = ds->getMultiSamples();
traits->samples = ds->getNumMultiSamples();
return new osgQt::GraphicsWindowQt(traits.get());
}
virtual void paintEvent( QPaintEvent* event )
{
frame();
_timer.start( 10 );
}
protected:
QTimer _timer;
};
int main( int argc, char** argv )
{
osg::ArgumentParser arguments(&argc, argv);
#if QT_VERSION >= 0x050000
// Qt5 is currently crashing and reporting "Cannot make QOpenGLContext
current in a different thread" when the viewer is run multi-threaded, this is
regression from Qt4
osgViewer::ViewerBase::ThreadingModel threadingModel =
osgViewer::ViewerBase::SingleThreaded;
#else
osgViewer::ViewerBase::ThreadingModel threadingModel =
osgViewer::ViewerBase::CullDrawThreadPerContext;
#endif
while (arguments.read("--SingleThreaded")) threadingModel =
osgViewer::ViewerBase::SingleThreaded;
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 );
viewWidget->show();
return app.exec();
}
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org