Hi,
I set up multiple views in a sence.I need to use keyboarding to remove one of 
them.
Please,how to achieve it in Visual Studio 2008 .

Thank you!

Cheers,
Andy

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



/**********************************************************
*Write by FlySky
*zz...@163.com  http://www.OsgChina.org   
**********************************************************/

#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/CompositeViewer>

#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/Geometry>
#include <osg/Camera>
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>

#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

#include <osgGA/TrackballManipulator>

#include <osgUtil/Optimizer>

#include <iostream>
//¶¯Ì¬É¾³ýÊÓͼ´°¿Ú
class DeletSlaveView:public osgGA::GUIEventHandler
{
public:
        bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&aa 
)
        {
                osg::ref_ptr<osgViewer::View> view = 
dynamic_cast<osgViewer::View*>(&aa);
                osg::ref_ptr<osgViewer::CompositeViewer> viewer = 
dynamic_cast<osgViewer::CompositeViewer*>(view->getViewerBase());
                switch(ea.getEventType())
                {
                case osgGA::GUIEventAdapter::KEYDOWN:
                        {
                                if (ea.getKey()=='q')
                                {
                                        //viewer->stopThreading();
                                        viewer->removeView(view);
                                        //viewer->startThreading();
                                }
                        }
                        break;
                default:
                        break;
                }
                return false;
        }
};
int main()
{
        //´´½¨CompositeViewer¶ÔÏó
        osg::ref_ptr<osgViewer::CompositeViewer> viewer = new 
osgViewer::CompositeViewer() ;

        //¶ÁÈ¡Å£µÄÄ£ÐÍ
        osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("cow.osg") ;

        //¶ÁÈ¡·É»úÄ£ÐÍ
        osg::ref_ptr<osg::Node> cessna = osgDB::readNodeFile("cessna.osg");

        //ÓÅ»¯³¡¾°Êý¾Ý
        osgUtil::Optimizer optimizer ;
        optimizer.optimize(cow.get());
        optimizer.optimize(cessna.get());

        //ÉèÖÃͼÐλ·¾³ÌØÐÔ
        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new 
osg::GraphicsContext::Traits();
        traits->x = 100;
        traits->y = 100;
        traits->width = 900;
        traits->height = 700;
        traits->windowDecoration = true;
        traits->doubleBuffer = true;
        traits->sharedContext = 0;

        //´´½¨Í¼Ðλ·¾³ÌØÐÔ
        osg::ref_ptr<osg::GraphicsContext> gc = 
osg::GraphicsContext::createGraphicsContext(traits.get());
        if (gc->valid())
        {
                osg::notify(osg::INFO)<<"  GraphicsWindow has been created 
successfully."<<std::endl;

                //Çå³ý´°¿ÚÑÕÉ«¼°Çå³ýÑÕÉ«ºÍÉî¶È»º³å
                gc->setClearColor(osg::Vec4f(0.2f,0.2f,0.6f,1.0f));
                gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        }
        else
        {
                osg::notify(osg::NOTICE)<<"  GraphicsWindow has not been 
created successfully."<<std::endl;
        }

        //ÊÓͼһ
        {
                //´´½¨ÊÓͼһ
                osg::ref_ptr<osgViewer::View> view = new osgViewer::View;
                viewer->addView(view.get());

                //ÉèÖÃÊÓͼ³¡¾°Êý¾Ý
                view->setSceneData(cow.get());

                //ÉèÖÃÏà»úÊÓ¿Ú¼°Í¼Ðλ·¾³
                view->getCamera()->setViewport(new osg::Viewport(0,0, 
traits->width/2, traits->height/2));
                view->getCamera()->setGraphicsContext(gc.get());

                //ÉèÖòÙ×÷Æ÷
                view->setCameraManipulator(new osgGA::TrackballManipulator);

                //Ìí¼Óʼþ´¦Àí
                view->addEventHandler( new osgViewer::StatsHandler );
                view->addEventHandler( new osgViewer::WindowSizeHandler );
                view->addEventHandler( new osgViewer::ThreadingHandler );
                view->addEventHandler( new osgViewer::RecordCameraPathHandler );
        }

        //ÊÓͼ¶þ
        {
                osg::ref_ptr<osgViewer::View> view = new osgViewer::View;
                viewer->addView(view.get());

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

                view->getCamera()->setViewport(new 
osg::Viewport(traits->width/2,0, traits->width/2, traits->height/2));
                view->getCamera()->setGraphicsContext(gc.get());

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

        //ÊÓͼÈý
        {
                osg::ref_ptr<osgViewer::View> view = new osgViewer::View;
                viewer->addView(view.get());

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

                //¸ù¾Ý·Ö±æÂÊÀ´È·¶¨ºÏÊʵÄͶӰÀ´±£Ö¤ÏÔʾµÄͼÐβ»±äÐÎ
                double fovy, aspectRatio, zNear, zFar;
                view->getCamera()->getProjectionMatrixAsPerspective(fovy, 
aspectRatio, zNear, zFar);
                double newAspectRatio = double(traits->width) / 
double(traits->height/2);
                double aspectRatioChange = newAspectRatio / aspectRatio;
                if (aspectRatioChange != 1.0)
                {
                        view->getCamera()->getProjectionMatrix() *= 
osg::Matrix::scale(1.0/aspectRatioChange,1.0,1.0);
                }

                view->getCamera()->setViewport(new 
osg::Viewport(0,traits->height/2, traits->width, traits->height/2));
                view->getCamera()->setGraphicsContext(gc.get());

                view->setCameraManipulator(new osgGA::TrackballManipulator);
                view->addEventHandler(new DeletSlaveView);
        }

        viewer->realize() ;

        viewer->run() ;

        return 0 ;

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

Reply via email to