Hello,Robert.
Thanks for your reversion.I'm so happy that I can add a new window in
realtime.But there is a new problem :how to destroy the new window.I find that
stopThreading can't destroy the window.Thanks.
Waiting for you good news.
//
//
#include osgDB/ReadFile
#include osgUtil/Optimizer
#include osgViewer/Viewer
#include osgGA/MatrixManipulator
#include osgGA/TrackballManipulator
#include osgGA/StateSetManipulator
#include iostream
#include osg/Node
#include osg/Geode
#include osg/Geometry
#include osgViewer/Viewer
class MyWindowHandler:public osgGA::GUIEventHandler
{
public:
MyWindowHandler():
OneOrTwo(false)
{}
~MyWindowHandler(){}
bool handle(const osgGA::GUIEventAdapter ea, osgGA::GUIActionAdapter aa)
{
osgViewer::Viewer* viewer = dynamic_castosgViewer::Viewer*(aa) ;
switch(ea.getEventType())
{
case(osgGA::GUIEventAdapter::KEYDOWN):
{
if(ea.getKey()==osgGA::GUIEventAdapter::KEY_F1)
{
OneOrTwo = !OneOrTwo ;
viewer-stopThreading();
if(OneOrTwo)
{
int xoffset = 40;
int yoffset = 40;
viewer-stopThreading() ;
viewer-startThreading() ;
//{
// osg::ref_ptrosg::GraphicsContext::Traits traits = new
osg::GraphicsContext::Traits;
// traits-x = xoffset + 0;
// traits-y = yoffset + 0;
// traits-width = 600;
// traits-height = 480;
// traits-windowDecoration = true;
// traits-doubleBuffer = true;
// traits-sharedContext = 0;
// osg::ref_ptrosg::GraphicsContext gc =
osg::GraphicsContext::createGraphicsContext(traits.get());
// osg::ref_ptrosg::Camera camera = new osg::Camera;
// camera-setGraphicsContext(gc.get());
// camera-setViewport(new osg::Viewport(0,0, traits-width,
traits-height));
// GLenum buffer = traits-doubleBuffer ? GL_BACK : GL_FRONT;
// camera-setDrawBuffer(buffer);
// camera-setReadBuffer(buffer);
// viewer-addSlave(camera.get(), osg::Matrixd::translate(1.0,0.0,0.0),
osg::Matrixd());
//}
{
osg::ref_ptrosg::GraphicsContext::Traits traits = new
osg::GraphicsContext::Traits;
traits-x = xoffset + 600;
traits-y = yoffset + 0;
traits-width = 600;
traits-height = 480;
traits-windowDecoration = true;
traits-doubleBuffer = true;
traits-sharedContext = 0;
osg::ref_ptrosg::GraphicsContext gc =
osg::GraphicsContext::createGraphicsContext(traits.get());
osg::ref_ptrosg::Camera camera = new osg::Camera;
camera-setGraphicsContext(gc.get());
camera-setViewport(new osg::Viewport(0,0, traits-width,
traits-height));
GLenum buffer = traits-doubleBuffer ? GL_BACK : GL_FRONT;
camera-setDrawBuffer(buffer);
camera-setReadBuffer(buffer);
viewer-addSlave(camera.get(), osg::Matrixd::translate(-1.0,0.0,0.0),
osg::Matrixd());
}
//viewer-setSceneData(osgDB::readNodeFile(cow.osg));
viewer-realize() ;
}
return true ;
}
return false ;
}
break ;
default:
return false ;
}
}
public:
bool OneOrTwo ;
};
int main( int argc, char **argv )
{
osg::ArgumentParser arguments(argc,argv);
osg::ref_ptrosg::Node loadedModel = osgDB::readNodeFiles(arguments);
if (!loadedModel) loadedModel = osgDB::readNodeFile(cow.osg);
if (!loadedModel)
{
std::cout arguments.getApplicationName() : No data loaded std::endl;
return 1;
}
osgViewer::Viewer viewer;
int xoffset = 40;
int yoffset = 40;
//viewer.stopThreading() ;
//viewer.startThreading() ;
viewer.addEventHandler(new MyWindowHandler()) ;
{
osg::ref_ptrosg::GraphicsContext::Traits traits = new
osg::GraphicsContext::Traits;
traits-x = xoffset + 0;
traits-y = yoffset + 0;
traits-width = 600;
traits-height = 480;
traits-windowDecoration = true;
traits-doubleBuffer = true;
traits-sharedContext = 0;
osg::ref_ptrosg::GraphicsContext gc =
osg::GraphicsContext::createGraphicsContext(traits.get());
osg::ref_ptrosg::Camera camera = new osg::Camera;
camera-setGraphicsContext(gc.get());
camera-setViewport(new osg::Viewport(0,0, traits-width, traits-height));
GLenum buffer = traits-doubleBuffer ? GL_BACK : GL_FRONT;
camera-setDrawBuffer(buffer);
camera-setReadBuffer(buffer);
viewer.addSlave(camera.get(), osg::Matrixd::translate(1.0,0.0,0.0),
osg::Matrixd());
}
viewer.setSceneData(loadedModel.get());
viewer.realize();
//}
return viewer.run();
}
Hi GuiYe,
At present the addSlave doesn't automatically tell the viewer to
realize windows, reset up threading and rendering support, which is
why you code isn't working.
What you need to do in you event handling is to call
viewer.stopThreading() first, create you new window/associated
view/camera then realize the new window and then call startTheading().
Robert.
___