root/OpenSceneGraph/trunk/examples/osgstaticviewer/osgstaticviewer.cpp @ 6941

Revision 6941, 7.6 kB (checked in by robert, 7 years ago)

From Martin Lavery and Robert Osfield, Updated examples to use a variation of the MIT License

Line 
1/* OpenSceneGraph example, osgstaticviewer.
2*
3*  Permission is hereby granted, free of charge, to any person obtaining a copy
4*  of this software and associated documentation files (the "Software"), to deal
5*  in the Software without restriction, including without limitation the rights
6*  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7*  copies of the Software, and to permit persons to whom the Software is
8*  furnished to do so, subject to the following conditions:
9*
10*  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
11*  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12*  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
13*  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
14*  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
15*  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
16*  THE SOFTWARE.
17*/
18
19#include <osgDB/ReadFile>
20#include <osgUtil/Optimizer>
21#include <osg/CoordinateSystemNode>
22
23#include <osg/Switch>
24#include <osgText/Text>
25
26#include <osgViewer/Viewer>
27#include <osgViewer/ViewerEventHandlers>
28
29#include <osgGA/TrackballManipulator>
30#include <osgGA/FlightManipulator>
31#include <osgGA/DriveManipulator>
32#include <osgGA/KeySwitchMatrixManipulator>
33#include <osgGA/StateSetManipulator>
34#include <osgGA/AnimationPathManipulator>
35#include <osgGA/TerrainManipulator>
36
37#include <iostream>
38
39// include the plugins we need
40USE_OSGPLUGIN(ive);
41USE_OSGPLUGIN(freetype);
42
43// include the platform specific GraphicsWindow implementation.
44USE_GRAPHICSWINDOW();
45
46int main(int argc, char** argv)
47{
48    // use an ArgumentParser object to manage the program arguments.
49    osg::ArgumentParser arguments(&argc,argv);
50
51    arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
52    arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the standard OpenSceneGraph example which loads and visualises 3d models.");
53    arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...");
54    arguments.getApplicationUsage()->addCommandLineOption("--image <filename>","Load an image and render it on a quad");
55    arguments.getApplicationUsage()->addCommandLineOption("--dem <filename>","Load an image/DEM and render it on a HeightField");
56    arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display command line parameters");
57    arguments.getApplicationUsage()->addCommandLineOption("--help-env","Display environmental variables available");
58    arguments.getApplicationUsage()->addCommandLineOption("--help-keys","Display keyboard & mouse bindings available");
59    arguments.getApplicationUsage()->addCommandLineOption("--help-all","Display all command line, env vars and keyboard & mouse bindings.");
60    arguments.getApplicationUsage()->addCommandLineOption("--SingleThreaded","Select SingleThreaded threading model for viewer.");
61    arguments.getApplicationUsage()->addCommandLineOption("--CullDrawThreadPerContext","Select CullDrawThreadPerContext threading model for viewer.");
62    arguments.getApplicationUsage()->addCommandLineOption("--DrawThreadPerContext","Select DrawThreadPerContext threading model for viewer.");
63    arguments.getApplicationUsage()->addCommandLineOption("--CullThreadPerCameraDrawThreadPerContext","Select CullThreadPerCameraDrawThreadPerContext threading model for viewer.");
64
65    // if user request help write it out to cout.
66    bool helpAll = arguments.read("--help-all");
67    unsigned int helpType = ((helpAll || arguments.read("-h") || arguments.read("--help"))? osg::ApplicationUsage::COMMAND_LINE_OPTION : 0 ) |
68                            ((helpAll ||  arguments.read("--help-env"))? osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE : 0 ) |
69                            ((helpAll ||  arguments.read("--help-keys"))? osg::ApplicationUsage::KEYBOARD_MOUSE_BINDING : 0 );
70    if (helpType)
71    {
72        arguments.getApplicationUsage()->write(std::cout, helpType);
73        return 1;
74    }
75
76    // report any errors if they have occurred when parsing the program arguments.
77    if (arguments.errors())
78    {
79        arguments.writeErrorMessages(std::cout);
80        return 1;
81    }
82   
83    if (arguments.argc()<=1)
84    {
85        arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
86        return 1;
87    }
88
89    osgViewer::Viewer viewer;
90   
91    // set up the camera manipulators.
92    {
93        osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator;
94
95        keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() );
96        keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() );
97        keyswitchManipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() );
98        keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() );
99
100        std::string pathfile;
101        char keyForAnimationPath = '5';
102        while (arguments.read("-p",pathfile))
103        {
104            osgGA::AnimationPathManipulator* apm = new osgGA::AnimationPathManipulator(pathfile);
105            if (apm || !apm->valid())
106            {
107                unsigned int num = keyswitchManipulator->getNumMatrixManipulators();
108                keyswitchManipulator->addMatrixManipulator( keyForAnimationPath, "Path", apm );
109                keyswitchManipulator->selectMatrixManipulator(num);
110                ++keyForAnimationPath;
111            }
112        }
113
114        viewer.setCameraManipulator( keyswitchManipulator.get() );
115    }
116
117    // add the state manipulator
118    viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
119   
120    // add the thread model handler
121    viewer.addEventHandler(new osgViewer::ThreadingHandler);
122
123    // add the window size toggle handler
124    viewer.addEventHandler(new osgViewer::WindowSizeHandler);
125       
126    // add the stats handler
127    viewer.addEventHandler(new osgViewer::StatsHandler);
128
129    // add the help handler
130    viewer.addEventHandler(new osgViewer::HelpHandler(arguments.getApplicationUsage()));
131
132    while (arguments.read("--SingleThreaded")) viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
133    while (arguments.read("--CullDrawThreadPerContext")) viewer.setThreadingModel(osgViewer::Viewer::CullDrawThreadPerContext);
134    while (arguments.read("--DrawThreadPerContext")) viewer.setThreadingModel(osgViewer::Viewer::DrawThreadPerContext);
135    while (arguments.read("--CullThreadPerCameraDrawThreadPerContext")) viewer.setThreadingModel(osgViewer::Viewer::CullThreadPerCameraDrawThreadPerContext);
136
137    unsigned int screenNum;
138    while (arguments.read("--screen",screenNum))
139    {
140        viewer.setUpViewOnSingleScreen(screenNum);
141    }
142
143    // load the data
144    osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
145    if (!loadedModel)
146    {
147        std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl;
148        return 1;
149    }
150
151    // any option left unread are converted into errors to write out later.
152    arguments.reportRemainingOptionsAsUnrecognized();
153
154    // report any errors if they have occurred when parsing the program arguments.
155    if (arguments.errors())
156    {
157        arguments.writeErrorMessages(std::cout);
158        return 1;
159    }
160
161
162    // optimize the scene graph, remove redundant nodes and state etc.
163    osgUtil::Optimizer optimizer;
164    optimizer.optimize(loadedModel.get());
165
166    viewer.setSceneData( loadedModel.get() );
167
168    return viewer.run();
169}
Note: See TracBrowser for help on using the browser.