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

Revision 12292, 8.4 kB (checked in by robert, 4 years ago)

Ran svn propset -R svn:eol-style native . on the OpenSceneGraph

  • Property svn:eol-style set to native
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(osg)
42USE_OSGPLUGIN(osg2)
43USE_OSGPLUGIN(rgb)
44USE_OSGPLUGIN(OpenFlight)
45
46#ifdef USE_FREETYPE
47    USE_OSGPLUGIN(freetype)
48#endif
49
50USE_DOTOSGWRAPPER_LIBRARY(osg)
51USE_DOTOSGWRAPPER_LIBRARY(osgFX)
52USE_DOTOSGWRAPPER_LIBRARY(osgParticle)
53USE_DOTOSGWRAPPER_LIBRARY(osgShadow)
54USE_DOTOSGWRAPPER_LIBRARY(osgSim)
55USE_DOTOSGWRAPPER_LIBRARY(osgTerrain)
56USE_DOTOSGWRAPPER_LIBRARY(osgText)
57USE_DOTOSGWRAPPER_LIBRARY(osgViewer)
58USE_DOTOSGWRAPPER_LIBRARY(osgVolume)
59USE_DOTOSGWRAPPER_LIBRARY(osgWidget)
60
61USE_SERIALIZER_WRAPPER_LIBRARY(osg)
62USE_SERIALIZER_WRAPPER_LIBRARY(osgAnimation)
63USE_SERIALIZER_WRAPPER_LIBRARY(osgFX)
64USE_SERIALIZER_WRAPPER_LIBRARY(osgManipulator)
65USE_SERIALIZER_WRAPPER_LIBRARY(osgParticle)
66USE_SERIALIZER_WRAPPER_LIBRARY(osgShadow)
67USE_SERIALIZER_WRAPPER_LIBRARY(osgSim)
68USE_SERIALIZER_WRAPPER_LIBRARY(osgTerrain)
69USE_SERIALIZER_WRAPPER_LIBRARY(osgText)
70USE_SERIALIZER_WRAPPER_LIBRARY(osgVolume)
71
72// include the platform specific GraphicsWindow implementation.
73USE_GRAPHICSWINDOW()
74
75int main(int argc, char** argv)
76{
77    // use an ArgumentParser object to manage the program arguments.
78    osg::ArgumentParser arguments(&argc,argv);
79
80    arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
81    arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the standard OpenSceneGraph example which loads and visualises 3d models.");
82    arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...");
83    arguments.getApplicationUsage()->addCommandLineOption("--image <filename>","Load an image and render it on a quad");
84    arguments.getApplicationUsage()->addCommandLineOption("--dem <filename>","Load an image/DEM and render it on a HeightField");
85    arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display command line parameters");
86    arguments.getApplicationUsage()->addCommandLineOption("--help-env","Display environmental variables available");
87    arguments.getApplicationUsage()->addCommandLineOption("--help-keys","Display keyboard & mouse bindings available");
88    arguments.getApplicationUsage()->addCommandLineOption("--help-all","Display all command line, env vars and keyboard & mouse bindings.");
89    arguments.getApplicationUsage()->addCommandLineOption("--SingleThreaded","Select SingleThreaded threading model for viewer.");
90    arguments.getApplicationUsage()->addCommandLineOption("--CullDrawThreadPerContext","Select CullDrawThreadPerContext threading model for viewer.");
91    arguments.getApplicationUsage()->addCommandLineOption("--DrawThreadPerContext","Select DrawThreadPerContext threading model for viewer.");
92    arguments.getApplicationUsage()->addCommandLineOption("--CullThreadPerCameraDrawThreadPerContext","Select CullThreadPerCameraDrawThreadPerContext threading model for viewer.");
93
94    // if user request help write it out to cout.
95    bool helpAll = arguments.read("--help-all");
96    unsigned int helpType = ((helpAll || arguments.read("-h") || arguments.read("--help"))? osg::ApplicationUsage::COMMAND_LINE_OPTION : 0 ) |
97                            ((helpAll ||  arguments.read("--help-env"))? osg::ApplicationUsage::ENVIRONMENTAL_VARIABLE : 0 ) |
98                            ((helpAll ||  arguments.read("--help-keys"))? osg::ApplicationUsage::KEYBOARD_MOUSE_BINDING : 0 );
99    if (helpType)
100    {
101        arguments.getApplicationUsage()->write(std::cout, helpType);
102        return 1;
103    }
104
105    // report any errors if they have occurred when parsing the program arguments.
106    if (arguments.errors())
107    {
108        arguments.writeErrorMessages(std::cout);
109        return 1;
110    }
111   
112    if (arguments.argc()<=1)
113    {
114        arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
115        return 1;
116    }
117
118    osgViewer::Viewer viewer;
119   
120    // set up the camera manipulators.
121    {
122        osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator;
123
124        keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() );
125        keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() );
126        keyswitchManipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() );
127        keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() );
128
129        std::string pathfile;
130        char keyForAnimationPath = '5';
131        while (arguments.read("-p",pathfile))
132        {
133            osgGA::AnimationPathManipulator* apm = new osgGA::AnimationPathManipulator(pathfile);
134            if (apm || !apm->valid())
135            {
136                unsigned int num = keyswitchManipulator->getNumMatrixManipulators();
137                keyswitchManipulator->addMatrixManipulator( keyForAnimationPath, "Path", apm );
138                keyswitchManipulator->selectMatrixManipulator(num);
139                ++keyForAnimationPath;
140            }
141        }
142
143        viewer.setCameraManipulator( keyswitchManipulator.get() );
144    }
145
146    // add the state manipulator
147    viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
148   
149    // add the thread model handler
150    viewer.addEventHandler(new osgViewer::ThreadingHandler);
151
152    // add the window size toggle handler
153    viewer.addEventHandler(new osgViewer::WindowSizeHandler);
154       
155    // add the stats handler
156    viewer.addEventHandler(new osgViewer::StatsHandler);
157
158    // add the help handler
159    viewer.addEventHandler(new osgViewer::HelpHandler(arguments.getApplicationUsage()));
160
161    while (arguments.read("--SingleThreaded")) viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
162    while (arguments.read("--CullDrawThreadPerContext")) viewer.setThreadingModel(osgViewer::Viewer::CullDrawThreadPerContext);
163    while (arguments.read("--DrawThreadPerContext")) viewer.setThreadingModel(osgViewer::Viewer::DrawThreadPerContext);
164    while (arguments.read("--CullThreadPerCameraDrawThreadPerContext")) viewer.setThreadingModel(osgViewer::Viewer::CullThreadPerCameraDrawThreadPerContext);
165
166    unsigned int screenNum;
167    while (arguments.read("--screen",screenNum))
168    {
169        viewer.setUpViewOnSingleScreen(screenNum);
170    }
171
172    // load the data
173    osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
174    if (!loadedModel)
175    {
176        std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl;
177        return 1;
178    }
179
180    // any option left unread are converted into errors to write out later.
181    arguments.reportRemainingOptionsAsUnrecognized();
182
183    // report any errors if they have occurred when parsing the program arguments.
184    if (arguments.errors())
185    {
186        arguments.writeErrorMessages(std::cout);
187        return 1;
188    }
189
190
191    // optimize the scene graph, remove redundant nodes and state etc.
192    osgUtil::Optimizer optimizer;
193    optimizer.optimize(loadedModel.get());
194
195    viewer.setSceneData( loadedModel.get() );
196
197    return viewer.run();
198}
Note: See TracBrowser for help on using the browser.