root/OpenSceneGraph/trunk/examples/osgcamera/osgcamera.cpp @ 5991

Revision 5991, 10.2 kB (checked in by robert, 8 years ago)

Work on CompositeViewer? and related calsses to implement viewers with multiple views

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#if 1
2
3#include <osgDB/ReadFile>
4#include <osgViewer/Viewer>
5#include <osgGA/TrackballManipulator>
6#include <osgGA/AnimationPathManipulator>
7#include <iostream>
8
9class ThreadingHandler : public osgGA::GUIEventHandler
10{
11public:
12
13    ThreadingHandler() {}
14       
15    bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
16    {
17        osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
18        if (!viewer) return false;
19   
20        switch(ea.getEventType())
21        {
22            case(osgGA::GUIEventAdapter::KEYUP):
23            {
24                if (ea.getKey()=='m')
25                {
26                    switch(viewer->getThreadingModel())
27                    {
28                        case(osgViewer::Viewer::SingleThreaded):
29                            viewer->setThreadingModel(osgViewer::Viewer::ThreadPerContext);
30                            osg::notify(osg::NOTICE)<<"Threading model 'ThreadPerContext' selected."<<std::endl;
31                            break;
32                        case(osgViewer::Viewer::ThreadPerContext):
33                            viewer->setThreadingModel(osgViewer::Viewer::ThreadPerCamera);
34                            osg::notify(osg::NOTICE)<<"Threading model 'ThreadPerCamera' selected."<<std::endl;
35                            break;
36                        case(osgViewer::Viewer::ThreadPerCamera):
37                            viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
38                            osg::notify(osg::NOTICE)<<"Threading model 'SingleTheaded' selected."<<std::endl;
39                            break;
40                    }
41                    return true;
42                }
43                if (ea.getKey()=='e')
44                {
45                    switch(viewer->getEndBarrierPosition())
46                    {
47                        case(osgViewer::Viewer::BeforeSwapBuffers):
48                            viewer->setEndBarrierPosition(osgViewer::Viewer::AfterSwapBuffers);
49                            osg::notify(osg::NOTICE)<<"Threading model 'AfterSwapBuffers' selected."<<std::endl;
50                            break;
51                        case(osgViewer::Viewer::AfterSwapBuffers):
52                            viewer->setEndBarrierPosition(osgViewer::Viewer::BeforeSwapBuffers);
53                            osg::notify(osg::NOTICE)<<"Threading model 'BeforeSwapBuffers' selected."<<std::endl;
54                            break;
55                    }
56                    return true;
57                }
58            }
59            default: break;
60        }
61       
62        return false;
63    }
64   
65    bool _done;
66};
67
68
69class ModelHandler : public osgGA::GUIEventHandler
70{
71public:
72
73    ModelHandler():
74        _position(0) {}
75   
76    typedef std::vector<std::string> Filenames;
77    Filenames _filenames;
78    unsigned int _position;
79   
80    void add(const std::string& filename) { _filenames.push_back(filename); }
81       
82    bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
83    {
84        osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
85        if (!viewer) return false;
86   
87        if (_filenames.empty()) return false;
88   
89        switch(ea.getEventType())
90        {
91            case(osgGA::GUIEventAdapter::KEYUP):
92            {
93                if (ea.getKey()=='l')
94                {                   
95                    osg::ref_ptr<osg::Node> model = osgDB::readNodeFile( _filenames[_position] );
96                    ++_position;
97                    if (_position>=_filenames.size()) _position = 0;
98                   
99                    if (model.valid())
100                    {
101                        viewer->setSceneData(model.get());
102                    }
103                   
104                    return true;
105                }
106            }
107            default: break;
108        }
109       
110        return false;
111    }
112   
113    bool _done;
114};
115
116
117void singleWindowMultipleCameras(osgViewer::Viewer& viewer)
118{
119    osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
120    if (!wsi)
121    {
122        osg::notify(osg::NOTICE)<<"Error, no WindowSystemInterface available, cannot create windows."<<std::endl;
123        return;
124    }
125   
126    unsigned int width, height;
127    wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
128
129    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
130    traits->x = 0;
131    traits->y = 0;
132    traits->width = width;
133    traits->height = height;
134    traits->windowDecoration = true;
135    traits->doubleBuffer = true;
136    traits->sharedContext = 0;
137
138    osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
139    if (gc.valid())
140    {
141        osg::notify(osg::INFO)<<"  GraphicsWindow has been created successfully."<<std::endl;
142
143        // need to ensure that the window is cleared make sure that the complete window is set the correct colour
144        // rather than just the parts of the window that are under the camera's viewports
145        gc->setClearColor(osg::Vec4f(0.2f,0.2f,0.6f,1.0f));
146        gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
147    }
148    else
149    {
150        osg::notify(osg::NOTICE)<<"  GraphicsWindow has not been created successfully."<<std::endl;
151    }
152
153    unsigned int numCameras = 2;
154    double aspectRatioScale = 1.0;///(double)numCameras;
155    for(unsigned int i=0; i<numCameras;++i)
156    {
157        osg::ref_ptr<osg::Camera> camera = new osg::Camera;
158        camera->setGraphicsContext(gc.get());
159        camera->setViewport(new osg::Viewport((i*width)/numCameras,(i*height)/numCameras, width/numCameras, height/numCameras));
160        GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
161        camera->setDrawBuffer(buffer);
162        camera->setReadBuffer(buffer);
163
164        viewer.addSlave(camera.get(), osg::Matrixd(), osg::Matrixd::scale(aspectRatioScale,1.0,1.0));
165    }
166}
167
168void multipleWindowMultipleCameras(osgViewer::Viewer& viewer)
169{
170    osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
171    if (!wsi)
172    {
173        osg::notify(osg::NOTICE)<<"Error, no WindowSystemInterface available, cannot create windows."<<std::endl;
174        return;
175    }
176   
177    unsigned int width, height;
178    wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
179
180
181    unsigned int numCameras = 6;
182    double aspectRatioScale = (double)numCameras;
183    double translate_x = double(numCameras)-1;
184    for(unsigned int i=0; i<numCameras;++i, translate_x -= 2.0)
185    {
186        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
187        traits->screenNum = i / 3;
188        traits->x = (i*width)/numCameras;
189        traits->y = 0;
190        traits->width = width/numCameras-1;
191        traits->height = height;
192        traits->windowDecoration = true;
193        traits->doubleBuffer = true;
194        traits->sharedContext = 0;
195
196        osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
197        if (gc.valid())
198        {
199            osg::notify(osg::INFO)<<"  GraphicsWindow has been created successfully."<<std::endl;
200        }
201        else
202        {
203            osg::notify(osg::NOTICE)<<"  GraphicsWindow has not been created successfully."<<std::endl;
204        }
205
206        osg::ref_ptr<osg::Camera> camera = new osg::Camera;
207        camera->setGraphicsContext(gc.get());
208        camera->setViewport(new osg::Viewport(0,0, width/numCameras, height));
209        GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
210        camera->setDrawBuffer(buffer);
211        camera->setReadBuffer(buffer);
212
213        viewer.addSlave(camera.get(), osg::Matrix::scale(aspectRatioScale, 1.0, 1.0)*osg::Matrix::translate(translate_x, 0.0, 0.0), osg::Matrix() );
214    }
215}
216
217int main( int argc, char **argv )
218{
219    // use an ArgumentParser object to manage the program arguments.
220    osg::ArgumentParser arguments(&argc,argv);
221
222    if (argc<2)
223    {
224        std::cout << argv[0] <<": requires filename argument." << std::endl;
225        return 1;
226    }
227
228
229    std::string pathfile;
230    osg::ref_ptr<osgGA::AnimationPathManipulator> apm = 0;
231    while (arguments.read("-p",pathfile))
232    {
233        apm = new osgGA::AnimationPathManipulator(pathfile);
234        if (!apm.valid() || !(apm->valid()) )
235        {
236            apm = 0;
237        }
238    }
239
240    osgViewer::Viewer viewer;
241   
242    while (arguments.read("-s")) { viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded); }
243    while (arguments.read("-g")) { viewer.setThreadingModel(osgViewer::Viewer::ThreadPerContext); }
244    while (arguments.read("-c")) { viewer.setThreadingModel(osgViewer::Viewer::ThreadPerCamera); }
245   
246    bool limitNumberOfFrames = false;
247    unsigned int maxFrames = 10;
248    while (arguments.read("--run-till-frame-number",maxFrames)) { limitNumberOfFrames = true; }
249
250    // alternative viewer window setups.
251    while (arguments.read("-1")) { singleWindowMultipleCameras(viewer); }
252    while (arguments.read("-2")) { multipleWindowMultipleCameras(viewer); }
253
254
255    if (apm.valid()) viewer.setCameraManipulator(apm.get());
256    else viewer.setCameraManipulator( new osgGA::TrackballManipulator() );
257
258#if 0
259
260    ModelHandler* modelHandler = new ModelHandler;
261    for(int i=1; i<arguments.argc();++i)
262    {
263        modelHandler->add(arguments[i]);
264    }
265   
266    viewer.addEventHandler(modelHandler);
267
268#else
269
270    // load the scene.
271    osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
272    if (!loadedModel)
273    {
274        std::cout << argv[0] <<": No data loaded." << std::endl;
275        return 1;
276    }
277
278    viewer.setSceneData(loadedModel.get());
279#endif
280
281    viewer.realize();
282
283    unsigned int numFrames = 0;
284    while(!viewer.done() && !(limitNumberOfFrames && numFrames>=maxFrames))
285    {
286        viewer.frame();
287        ++numFrames;
288    }
289
290    return 0;
291}
292#else
293
294#include <osgViewer/Viewer>
295#include <osgDB/ReadFile>
296#include <osgDB/WriteFile>
297
298int main( int, char **)
299{
300    osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cow.osg");
301
302    for(unsigned int i=0; i<5; ++i)
303    {
304        osg::notify(osg::NOTICE)<<"New frame *******************************"<<std::endl;
305
306        osgViewer::Viewer viewer;
307        viewer.setSceneData(model.get());
308        viewer.run();
309        osg::notify(osg::NOTICE)<<std::endl<<std::endl;
310    }
311    return 0;
312}
313
314#endif
Note: See TracBrowser for help on using the browser.