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

Reply via email to