Hi GuiYe,

Destroying the osg::Camera that has the window or doing a
Camera::setGraphicsContext() should automatically destruct the window.
 Calling close() on the window should also close it, albeit without
destructing the actual OSG object.

Robert.

2008/6/8 GuiYe <[EMAIL PROTECTED]>:
>
>
> 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_cast<osgViewer::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_ptr<osg::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_ptr<osg::GraphicsContext> gc =
> osg::GraphicsContext::createGraphicsContext(traits.get());
>         // osg::ref_ptr<osg::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_ptr<osg::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_ptr<osg::GraphicsContext> gc =
> osg::GraphicsContext::createGraphicsContext(traits.get());
>          osg::ref_ptr<osg::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_ptr<osg::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_ptr<osg::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_ptr<osg::GraphicsContext> gc =
> osg::GraphicsContext::createGraphicsContext(traits.get());
>   osg::ref_ptr<osg::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.
>
>
> ________________________________
> 上房老大买二手房,看实景照片,挑专业经纪人
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to