Hi,

i'm still trying to enable or disable stereo during runtime. I created a small 
app, which simply recreates the graphic context when you press g.
It does not enable or disable stereo at all (due to lack of stereo hw at the 
moment), but i think the actual stereo on/off can be easily added when this app 
is working properly.


Code:

#include "stdafx.h"
#include <osgDB/ReadFile>
#include <osgViewer/CompositeViewer>
#include <osgGA/TrackballManipulator>

class GCEventHandler : public osgGA::GUIEventHandler
{
public:
    GCEventHandler(osgViewer::CompositeViewer * viewer, osgViewer::View * view)
        : m_viewer(viewer)
        , m_view(view)
        , m_x(200)
        , m_y(200)
        , m_width(800)
        , m_height(600)
        , m_recreateContext(false)
    {
    }

    void preFrame()
    {
        if(m_recreateContext)
        {
            m_recreateContext = false;
            destroyCamera();
            recreateContext();
            createCamera();
        }
    }

    bool createContext()
    {
        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new 
osg::GraphicsContext::Traits;

        traits->readDISPLAY();
        if (traits->displayNum<0)
            traits->displayNum = 0;

        traits->screenNum = 0;
        traits->x = m_x;
        traits->y = m_y;
        traits->width = m_width;
        traits->height = m_height;
        traits->alpha = 0;
        traits->stencil = 0;
        traits->windowDecoration = true;
        traits->doubleBuffer = true;
        traits->sharedContext = 0;

        osg::ref_ptr<osg::GraphicsContext> gc = 
osg::GraphicsContext::createGraphicsContext(traits.get());
        if(gc.valid())
        {
            m_gw = dynamic_cast<osgViewer::GraphicsWindow*>(gc.get());
            m_viewer->addView(m_view);
        }
        return gc.valid();
    }

    void destroyContext()
    {
        m_viewer->removeView(m_view);
        m_viewer->stopThreading();
        if(m_gw.valid())
        {
            m_gw->close();
            m_gw = NULL;
        }
        
    }

    bool recreateContext()
    {
        destroyContext();
        return createContext();
    }
    void destroyCamera()
    {
        osg::Camera * camera = m_view->getCamera();
        osg::ref_ptr<osg::GraphicsContext> gc = camera->getGraphicsContext();
        if(gc.valid())
        {
            m_gw = dynamic_cast<osgViewer::GraphicsWindow*>(gc.get());
        }
        camera->setGraphicsContext(NULL);
    }

    void createCamera()
    {
        osg::Camera * camera = m_view->getCamera();

        camera->setGraphicsContext( m_gw.get() );
        camera->setProjectionMatrixAsPerspective( 30.0f, 
static_cast<double>(m_width) / static_cast<double>(m_height), 1.0, 1000.0);
        camera->setViewport( new osg::Viewport( 0, 0, m_width, m_height));
    }


    virtual bool handle(const osgGA::GUIEventAdapter& 
ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*)
    {
        switch(ea.getEventType())
        {
        case osgGA::GUIEventAdapter::KEYUP:
            {
                switch(ea.getKey())
                {
                case 'g':
                    m_recreateContext = true;
                    break;
                }
            }
            break;
        }
        return osgGA::GUIEventHandler::handle(ea,aa);
    }

private:
    osgViewer::CompositeViewer * m_viewer;
    osgViewer::View * m_view;
    osg::ref_ptr<osgViewer::GraphicsWindow> m_gw;
    int m_x;
    int m_y;
    int m_width;
    int m_height;
    bool m_recreateContext;
};

int main(int argc, char** argv)
{
    // use an ArgumentParser object to manage the program arguments.
    osg::ArgumentParser arguments(&argc,argv);

    osgViewer::CompositeViewer viewer(arguments);

    // report any errors if they have occurred when parsing the program 
arguments.
    if (arguments.errors())
    {
        arguments.writeErrorMessages(std::cout);
        return 1;
    }

    if (arguments.argc()<=1)
    {
        
arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
        return 1;
    }

    osg::ref_ptr<osgViewer::View> view = new osgViewer::View();
    viewer.addView(view);

    view->setCameraManipulator( new osgGA::TrackballManipulator );

    // add the GC handler
    osg::ref_ptr<GCEventHandler> gchandler = new GCEventHandler(&viewer, view);
    view->addEventHandler(gchandler);

    gchandler->createContext();
    gchandler->createCamera();

    // load the data
    osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
    if (!loadedModel) 
    {
        std::cout << arguments.getApplicationName() <<": No data loaded" << 
std::endl;
        return 1;
    }

    // any option left unread are converted into errors to write out later.
    arguments.reportRemainingOptionsAsUnrecognized();

    // report any errors if they have occurred when parsing the program 
arguments.
    if (arguments.errors())
    {
        arguments.writeErrorMessages(std::cout);
        return 1;
    }

    view->setSceneData(loadedModel.get());

    viewer.realize();

    while(!viewer.done())
    {
        gchandler->preFrame();

        if(!viewer.isRealized())
        {
            view->setSceneData(NULL);
            view->setSceneData(loadedModel.get());
            viewer.realize();
        }
        viewer.frame();
    }

    return 0;
}








The application recreates the graphic context, but with the second graphic 
context all textures are gone. Any ideas?


Regards,
Andreas[/code]

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





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to