int main(int argc, char** argv) { osg::ArgumentParser arguments(&argc,argv); if (arguments.read("--help") || argc==1) { OE_WARN << "Usage: " << argv[0] << " [earthFile] [--model modelToLoad]" << std::endl; return 0; } osgViewer::Viewer viewer(arguments); // install the programmable manipulator. EarthManipulator* manip = new EarthManipulator(); viewer.setCameraManipulator( manip ); // UI: Control* help = createHelp(&viewer); osg::Node* earthNode = MapNodeHelper().load( arguments, &viewer, help ); if (!earthNode) { OE_WARN << "Unable to load earth model." << std::endl; return -1; } osg::Group* root = new osg::Group(); root->addChild( earthNode ); osgEarth::MapNode* mapNode = osgEarth::MapNode::findMapNode( earthNode ); if ( mapNode ) { if ( mapNode ) manip->setNode( mapNode->getTerrainEngine() ); if ( mapNode->getMap()->isGeocentric() ) { manip->setHomeViewpoint( Viewpoint( osg::Vec3d( -90, 0, 0 ), 0.0, -90.0, 5e7 ) ); } } // user model? osg::Node* model = 0L; std::string modelFile; if (arguments.read("--model", modelFile)) model = osgDB::readNodeFile(modelFile); // Simulator for tethering: viewer.addEventHandler( new Simulator(root, manip, mapNode, model) ); manip->getSettings()->getBreakTetherActions().push_back( EarthManipulator::ACTION_PAN ); manip->getSettings()->getBreakTetherActions().push_back( EarthManipulator::ACTION_GOTO ); viewer.setSceneData( root ); manip->getSettings()->bindMouse( EarthManipulator::ACTION_EARTH_DRAG, osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON, osgGA::GUIEventAdapter::MODKEY_SHIFT ); manip->getSettings()->setArcViewpointTransitions( true ); viewer.addEventHandler(new FlyToViewpointHandler( manip )); viewer.addEventHandler(new LockAzimuthHandler('u', manip)); viewer.addEventHandler(new ToggleProjectionHandler('c', manip)); viewer.addEventHandler(new ToggleArcViewpointTransitionsHandler('a', manip)); viewer.addEventHandler(new ToggleThrowingHandler('z', manip)); while(!viewer.done()) { viewer.frame(); // simulate slow frame rate //OpenThreads::Thread::microSleep(1000*1000); } return 0; }
int main(int argc, char** argv) { osg::ArgumentParser arguments(&argc,argv); osg::DisplaySettings::instance()->setMinimumNumStencilBits( 8 ); // install the programmable manipulator. EarthManipulator* manip = new EarthManipulator(); osg::Node* earthNode = osgDB::readNodeFiles( arguments ); if (!earthNode) { OE_WARN << "Unable to load earth model." << std::endl; return -1; } osgViewer::Viewer viewer(arguments); osg::Group* root = new osg::Group(); root->addChild( earthNode ); root->addChild( createHelp(&viewer) ); osgEarth::MapNode* mapNode = osgEarth::MapNode::findMapNode( earthNode ); if ( mapNode ) { if ( mapNode ) manip->setNode( mapNode->getTerrainEngine() ); if ( mapNode->getMap()->isGeocentric() ) { manip->setHomeViewpoint( Viewpoint( osg::Vec3d( -90, 0, 0 ), 0.0, -90.0, 5e7 ) ); // add a handler that will automatically calculate good clipping planes viewer.addEventHandler( new AutoClipPlaneHandler() ); } } viewer.setSceneData( root ); viewer.setCameraManipulator( manip ); manip->getSettings()->bindMouse( EarthManipulator::ACTION_EARTH_DRAG, osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON, osgGA::GUIEventAdapter::MODKEY_SHIFT ); manip->getSettings()->setArcViewpointTransitions( true ); viewer.addEventHandler(new FlyToViewpointHandler( manip )); viewer.addEventHandler(new LockAzimuthHandler('u', manip)); // add some stock OSG handlers: viewer.addEventHandler(new osgViewer::StatsHandler()); viewer.addEventHandler(new osgViewer::WindowSizeHandler()); viewer.addEventHandler(new osgViewer::ThreadingHandler()); viewer.addEventHandler(new osgViewer::LODScaleHandler()); viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet())); viewer.addEventHandler(new osgViewer::HelpHandler(arguments.getApplicationUsage())); //viewer.addEventHandler(new osgViewer::RecordCameraPathHandler()); return viewer.run(); }