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

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

From Wang Rui, "I've finally completed the static build support for dotosg wrapper and
serialization libraries. My submission mainly includes:
1. Add two new macros USE_DOTOSGWRAPPER_LIBRARY and
USE_SERIALIZER_WRAPPER_LIBRARY. Applications using static OSG must
include corresponding static-link libraries and use these two macros
to predefine native format wrappers. Please see osgstaticviewer and
present3D in the attachment for details.

2. Add a LibraryWrapper?.cpp file in each
osgWrappers/deprecated-dotosg/... and osgWrappers/serializers/...
subfolder, which calls all USE_...WRAPPERS macros inside. The
LibraryWrapper? file is automatically generated by the
wrapper_includer.cpp (with some slight fixes), which is also attached
for your reference. The deprecated-dotosg/osgAnimation is not included
because it doesn't us REGISTER_DOTOSGWRAPPER to define its wrappers.

3. Modify the ReaderWriterOSG.cpp to prevent calling loadWrappers()
when static build.

4. An uncorrelated fix to Serializer and ObjectWrapper?.cpp, which
ensures version variables of serialziers are initialized, and
serializers out-of-version are not written to model files.
"

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.