Hi,
first off all sorry if is not easy to understand me because I can“t speak 
English. I'm new to these issues and I have not much experience programming :)
I'm trying to run a sample of OpenScenGraph Cookbook 3.

It only works in release mode running it from Visual C + + 2008. In debug mode 
or running it from outside VC++ doesn't work. I get an exception: access 
violation ... blabla in subprocess RenderThread::run.

It's strange because the other day it runs ok sometimes.

The code is:
_____________________________________________________________

/* -*-c++-*- OpenSceneGraph Cookbook
 * Chapter 9 Recipe 2
 * Author: Wang Rui <wangray84 at gmail dot com>
*/

#include <QtCore/QtCore>
#include <QtGui/QtGui>
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/Viewer>
#include <osgQt/GraphicsWindowQt>


osg::Camera* createCamera( int x, int y, int w, int h )
{
    osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new 
osg::GraphicsContext::Traits;
    traits->windowDecoration = false;
    traits->x = x;
    traits->y = y;
    traits->width = w;
    traits->height = h;
    traits->doubleBuffer = true;
    
    osg::ref_ptr<osg::Camera> camera = new osg::Camera;
    camera->setGraphicsContext( new osgQt::GraphicsWindowQt(traits.get()) );
    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();
}

class RenderThread : public QThread
{
public:
    RenderThread() : QThread(), viewerPtr(0) {}
    
    virtual ~RenderThread()
    { if (viewerPtr) viewerPtr->setDone(true); wait(); }
    
    osgViewer::Viewer* viewerPtr;
    
protected:
   virtual void run() { if (viewerPtr) viewerPtr->run(); }
};

class ViewerWidget : public QWidget
{
public:
    ViewerWidget( osg::Camera* camera, osg::Node* scene )
    :   QWidget()
    {
        _viewer.setCamera( camera );
        _viewer.setSceneData( scene );
        _viewer.addEventHandler( new osgViewer::StatsHandler );
        _viewer.setCameraManipulator( new osgGA::TrackballManipulator );
        _viewer.setThreadingModel( osgViewer::Viewer::SingleThreaded );
        
        osgQt::GraphicsWindowQt* gw = dynamic_cast<osgQt::GraphicsWindowQt*>( 
camera->getGraphicsContext() );
        if ( gw )
        {
            QVBoxLayout* layout = new QVBoxLayout;
            layout->addWidget( gw->getGLWidget() );
            setLayout( layout );
        }
        
        _thread.viewerPtr = &_viewer;
        _thread.start();
    }
    
protected:
    osgViewer::Viewer _viewer;
    RenderThread _thread;
};

int main( int argc, char** argv )
{
    QApplication app( argc, argv );
    osg::Camera* camera = createCamera( 50, 50, 640, 480 );
        //osg::Node* scene = 
osgDB::readNodeFile("C:/datosVSS/modelos/base.obj");
        osg::Node* scene = osgDB::readNodeFile("cow.osg");
    
    ViewerWidget* widget = new ViewerWidget(camera, scene);
    widget->setGeometry( 100, 100, 800, 600 );
    widget->show();
    return app.exec();
}
_____________________________________________________________


Thank you!

Cheers,
Francisco

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=49899#49899





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

Reply via email to