Control* OceanControlFactory::create(OceanNode* ocean) const { VBox* main = new VBox(); HBox* sealLevelBox = main->addControl(new HBox()); sealLevelBox->setChildVertAlign( Control::ALIGN_CENTER ); sealLevelBox->setChildSpacing( 10 ); sealLevelBox->setHorizFill( true ); sealLevelBox->addControl( new LabelControl("Sea Level: ", 16) ); HSliderControl* mslSlider = sealLevelBox->addControl(new HSliderControl( -250.0f, 250.0f, 0.0f )); mslSlider->setBackColor( Color::Gray ); mslSlider->setHeight( 12 ); mslSlider->setHorizFill( true, 200 ); mslSlider->addEventHandler( new ChangeSeaLevel(ocean) ); HBox* alphaBox = main->addControl(new HBox()); alphaBox->setChildVertAlign( Control::ALIGN_CENTER ); alphaBox->setChildSpacing( 10 ); alphaBox->setHorizFill( true ); alphaBox->addControl( new LabelControl("Sea Alpha: ", 16) ); HSliderControl* alphaSlider = alphaBox->addControl(new HSliderControl( 0.0, 1.0, 1.0)); alphaSlider->setBackColor( Color::Gray ); alphaSlider->setHeight( 12 ); alphaSlider->setHorizFill( true, 200 ); alphaSlider->addEventHandler( new ChangeSeaAlpha(ocean) ); return main; }
void setupOverlayView( osgViewer::View* view, osg::Group* parent, MapNode* mapNode ) { ControlCanvas* canvas = ControlCanvas::getOrCreate(view); VBox* v = canvas->addControl(new VBox()); v->setBackColor( Color(Color::Black,0.75) ); { HBox* camBox = v->addControl(new HBox()); { camBox->addControl(s_cameraCheck = new CheckBoxControl(true, new Toggle(parent,"camera"))); camBox->addControl(new LabelControl("Camera", Color("#00ff00"))); } //HBox* overlayBox = v->addControl(new HBox()); //{ // overlayBox->addControl(s_overlayCheck = new CheckBoxControl(false, new Toggle(parent,"overlay"))); // overlayBox->addControl(new LabelControl("Overlay", Color("#00ffff"))); //} HBox* isectBox = v->addControl(new HBox()); { isectBox->addControl(s_intersectionCheck = new CheckBoxControl(true, new Toggle(parent,"intersection"))); isectBox->addControl(new LabelControl("Intersection",Color("#ff7f00"))); } HBox* rttBox = v->addControl(new HBox()); { rttBox->addControl(s_rttCheck = new CheckBoxControl(true, new Toggle(parent,"rtt"))); rttBox->addControl(new LabelControl("RTT", Color("#ffff00"))); } } view->addEventHandler( new PHDumper(mapNode, parent) ); }
/** * Creates a simple user interface for the demo. */ Container* createUI() { VBox* vbox = new VBox(); vbox->setVertAlign( Control::ALIGN_TOP ); vbox->setHorizAlign( Control::ALIGN_RIGHT ); vbox->addControl( new LabelControl("Feature Query Demo", Color::Yellow) ); vbox->addControl( new LabelControl("Click on a feature to see its attributes.") ); return vbox; }
Container* createUI() { VBox* box = new VBox(); box->setBackColor(0,0,0,0.5); Grid* grid = box->addControl(new Grid()); int r=0; //grid->setControl(0, r, new LabelControl("Visibility")); //HSliderControl* vis = grid->setControl(1, r, new HSliderControl(100.0f, 1000000.0f, 1000000.0f, new Set<double>(s_settings.visibility))); //vis->setHorizFill(true, 175); //grid->setControl(2, r, new LabelControl(vis)); //++r; grid->setControl(0, r, new LabelControl("Rain")); grid->setControl(1, r, new HSliderControl(0, 100, 0, new Set<double>(s_settings.rain))); ++r; grid->setControl(0, r, new LabelControl("Snow")); grid->setControl(1, r, new HSliderControl(0, 100, 0, new Set<double>(s_settings.snow))); ++r; grid->setControl(0, r, new LabelControl("Time")); grid->setControl(1, r, new HSliderControl(0, 24, 0, new SetDateTime())); ++r; grid->setControl(0, r, new LabelControl("Lighting")); grid->setControl(1, r, new CheckBoxControl(false, new Set<bool>(s_settings.lighting))); ++r; grid->getControl(1, r-1)->setHorizFill(true,200); return box; }
Control* OceanControlFactory::create(OceanSurfaceNode* ocean, osgViewer::View* view ) const { VBox* main = new VBox(); HBox* oceanBox1 = main->addControl(new HBox()); oceanBox1->setChildVertAlign( Control::ALIGN_CENTER ); oceanBox1->setChildSpacing( 10 ); oceanBox1->setHorizFill( true ); oceanBox1->addControl( new LabelControl("Sea Level: ", 16) ); HSliderControl* mslSlider = oceanBox1->addControl(new HSliderControl( -250.0f, 250.0f, 0.0f )); mslSlider->setBackColor( Color::Gray ); mslSlider->setHeight( 12 ); mslSlider->setHorizFill( true, 200 ); mslSlider->addEventHandler( new ChangeSeaLevel(ocean) ); HBox* oceanBox2 = main->addControl(new HBox()); oceanBox2->setChildVertAlign( Control::ALIGN_CENTER ); oceanBox2->setChildSpacing( 10 ); oceanBox2->setHorizFill( true ); oceanBox2->addControl( new LabelControl("Low Feather: ", 16) ); HSliderControl* lfSlider = oceanBox2->addControl(new HSliderControl( -1000.0, 250.0f, -100.0f )); lfSlider->setBackColor( Color::Gray ); lfSlider->setHeight( 12 ); lfSlider->setHorizFill( true, 200 ); lfSlider->addEventHandler( new ChangeLowFeather(ocean) ); HBox* oceanBox3 = main->addControl(new HBox()); oceanBox3->setChildVertAlign( Control::ALIGN_CENTER ); oceanBox3->setChildSpacing( 10 ); oceanBox3->setHorizFill( true ); oceanBox3->addControl( new LabelControl("High Feather: ", 16) ); HSliderControl* hfSlider = oceanBox3->addControl(new HSliderControl( -500.0f, 500.0f, -10.0f )); hfSlider->setBackColor( Color::Gray ); hfSlider->setHeight( 12 ); hfSlider->setHorizFill( true, 200 ); hfSlider->addEventHandler( new ChangeHighFeather(ocean) ); return main; }
void MapNodeHelper::parse(MapNode* mapNode, osg::ArgumentParser& args, osgViewer::View* view, osg::Group* root, LabelControl* userLabel ) const { VBox* vbox = new VBox(); vbox->setAbsorbEvents( true ); vbox->setBackColor( Color(Color::Black, 0.8) ); vbox->setHorizAlign( Control::ALIGN_LEFT ); vbox->setVertAlign( Control::ALIGN_BOTTOM ); vbox->addControl( userLabel ); parse(mapNode, args, view, root, vbox); }
Container* createUI() { VBox* box = new VBox(); box->setBackColor(0,0,0,0.5); Grid* grid = box->addControl(new Grid()); int r=0; grid->setControl(0, r, new LabelControl("Chop")); grid->setControl(1, r, new HSliderControl(0, 3, 0, new Set<double>(s_app.settings.chop))); ++r; grid->setControl(0, r, new LabelControl("Sea State")); grid->setControl(1, r, new HSliderControl(0, 12, 5, new Set<double>(s_app.settings.seaState))); ++r; grid->setControl(0, r, new LabelControl("Alpha")); grid->setControl(1, r, new HSliderControl(0, 1.0, 1.0, new Set<float>(s_app.settings.alpha))); ++r; grid->setControl(0, r, new LabelControl("Toggle")); grid->setControl(1, r, new CheckBoxControl(true, new Toggle())); grid->getControl(1, r-1)->setHorizFill(true,200); return box; }
void createControls( ControlCanvas* cs ) { // a container centered on the screen, containing an image and a text label. { VBox* center = new VBox(); center->setFrame( new RoundedFrame() ); center->getFrame()->setBackColor( 1,1,1,0.5 ); center->setPadding( 10 ); center->setHorizAlign( Control::ALIGN_CENTER ); center->setVertAlign( Control::ALIGN_CENTER ); // Add an image: osg::ref_ptr<osg::Image> image = osgDB::readImageFile("http://demo.pelicanmapping.com/rmweb/readymap_logo.png"); if ( image.valid() ) { s_imageControl = new ImageControl( image.get() ); s_imageControl->setHorizAlign( Control::ALIGN_CENTER ); s_imageControl->setFixSizeForRotation( true ); //imageCon->addEventHandler( new ImageRotationHandler ); center->addControl( s_imageControl ); center->setHorizAlign( Control::ALIGN_CENTER ); } // Add a text label: LabelControl* label = new LabelControl( "osgEarth Controls Toolkit" ); label->setFont( osgEarth::Registry::instance()->getDefaultFont() ); label->setFontSize( 24.0f ); label->setHorizAlign( Control::ALIGN_CENTER ); label->setMargin( 5 ); center->addControl( label ); // Rotation slider HBox* rotateBox = new HBox(); rotateBox->setChildVertAlign( Control::ALIGN_CENTER ); rotateBox->setHorizFill( true ); rotateBox->setBackColor( Color::Blue ); { rotateBox->addControl( new LabelControl("Rotate: ") ); HSliderControl* rotateSlider = new HSliderControl( -180.0, 180.0, 0.0 ); rotateSlider->addEventHandler( new RotateImage() ); rotateSlider->setHeight( 8.0f ); rotateSlider->setHorizFill( true ); rotateBox->addControl( rotateSlider ); } center->addControl( rotateBox ); cs->addControl( center ); } // a simple vbox with absolute positioning in the upper left with two text labels. { VBox* ul = new VBox(); ul->setPosition( 20, 20 ); ul->setPadding( 10 ); { LabelControl* title = new LabelControl( "Upper left control", 22, osg::Vec4f(1,1,0,1) ); ul->addControl( title ); LabelControl* content = new LabelControl( "Here is some text in the upper left control" ); ul->addControl( content ); HBox* c2 = new HBox(); c2->setChildSpacing( 10 ); { HSliderControl* slider = new HSliderControl( 0, 100 ); slider->setBackColor( .6,0,0,1 ); slider->setHeight( 25 ); slider->setWidth( 300 ); slider->addEventHandler( new MySliderHandler() ); c2->addControl( slider ); s_sliderLabel = new LabelControl(); s_sliderLabel->setVertAlign( Control::ALIGN_CENTER ); c2->addControl( s_sliderLabel ); } ul->addControl( c2 ); HBox* c3 = new HBox(); c3->setHorizAlign( Control::ALIGN_CENTER ); c3->setChildSpacing( 10 ); { HBox* c4 = new HBox(); c4->setChildSpacing( 5 ); { c4->addControl( new CheckBoxControl( true ) ); c4->addControl( new LabelControl( "Checkbox 1" ) ); } c3->addControl( c4 ); HBox* c5 = new HBox(); c5->setChildSpacing( 5 ); { c5->addControl( new CheckBoxControl( false ) ); c5->addControl( new LabelControl( "Checkbox 2" ) ); } c3->addControl( c5 ); } ul->addControl( c3 ); } cs->addControl( ul ); ul->addEventHandler( new MyClickHandler ); } // a centered hbox container along the bottom on the screen. { HBox* bottom = new HBox(); bottom->setFrame( new RoundedFrame() ); bottom->getFrame()->setBackColor(0,0,0,0.5); bottom->setMargin( 10 ); bottom->setChildSpacing( 145 ); bottom->setVertAlign( Control::ALIGN_BOTTOM ); bottom->setHorizAlign( Control::ALIGN_CENTER ); for( int i=0; i<4; ++i ) { LabelControl* label = new LabelControl(); std::stringstream buf; buf << "Label_" << i; std::string str; str = buf.str(); label->setText( str ); label->setMargin( 10 ); label->setBackColor( 1,1,1,0.4 ); bottom->addControl( label ); label->setActiveColor(1,.3,.3,1); label->addEventHandler( new MyClickHandler ); } cs->addControl( bottom ); } }
void createControls( ControlCanvas* cs ) { // a container centered on the screen, containing an image and a text label. { VBox* center = new VBox(); center->setFrame( new RoundedFrame() ); center->getFrame()->setBackColor( 1,1,1,0.5 ); center->setPadding( 10 ); center->setHorizAlign( Control::ALIGN_CENTER ); center->setVertAlign( Control::ALIGN_CENTER ); // Add an image: osg::Image* image = osgDB::readImageFile( "http://osgearth.org/chrome/site/osgearth.gif" ); if ( image ) { ImageControl* imageCon = new ImageControl( image ); imageCon->setHorizAlign( Control::ALIGN_CENTER ); imageCon->setFixSizeForRotation( true ); imageCon->addEventHandler( new ImageRotationHandler ); center->addControl( imageCon ); center->setHorizAlign( Control::ALIGN_CENTER ); } // Add a text label: LabelControl* label = new LabelControl( "osgEarth Controls Toolkit" ); label->setFont( osgText::readFontFile( "arialbd.ttf" ) ); label->setFontSize( 24.0f ); label->setHorizAlign( Control::ALIGN_CENTER ); label->setMargin( 5 ); center->addControl( label ); // Add another LabelControl* label2 = new LabelControl( "(Click the osgEarth logo to rotate it)" ); label2->setHorizAlign( Control::ALIGN_CENTER ); center->addControl( label2 ); cs->addControl( center ); } // a simple vbox with absolute positioning in the upper left with two text labels. { VBox* ul = new VBox(); ul->setFrame( new Frame() ); ul->setPosition( 20, 20 ); ul->setPadding( 10 ); { LabelControl* title = new LabelControl( "Upper left control", 22, osg::Vec4f(1,1,0,1) ); ul->addControl( title ); LabelControl* content = new LabelControl( "Here is some text in the upper left control" ); ul->addControl( content ); HBox* c2 = new HBox(); c2->setSpacing( 10 ); { HSliderControl* slider = new HSliderControl( 0, 100 ); slider->setBackColor( .6,0,0,1 ); slider->setHeight( 25 ); slider->setWidth( 300 ); slider->addEventHandler( new MySliderHandler() ); c2->addControl( slider ); s_sliderLabel = new LabelControl(); s_sliderLabel->setVertAlign( Control::ALIGN_CENTER ); c2->addControl( s_sliderLabel ); } ul->addControl( c2 ); HBox* c3 = new HBox(); c3->setHorizAlign( Control::ALIGN_CENTER ); c3->setSpacing( 10 ); { HBox* c4 = new HBox(); c4->setSpacing( 5 ); { c4->addControl( new CheckBoxControl( true ) ); c4->addControl( new LabelControl( "Checkbox 1" ) ); } c3->addControl( c4 ); HBox* c5 = new HBox(); c5->setSpacing( 5 ); { c5->addControl( new CheckBoxControl( false ) ); c5->addControl( new LabelControl( "Checkbox 2" ) ); } c3->addControl( c5 ); } ul->addControl( c3 ); } cs->addControl( ul ); ul->addEventHandler( new MyClickHandler ); } // a centered hbox container along the bottom on the screen. { HBox* bottom = new HBox(); bottom->setFrame( new RoundedFrame() ); bottom->getFrame()->setBackColor(0,0,0,0.5); bottom->setMargin( 10 ); bottom->setSpacing( 145 ); bottom->setVertAlign( Control::ALIGN_BOTTOM ); bottom->setHorizAlign( Control::ALIGN_CENTER ); for( int i=0; i<4; ++i ) { LabelControl* label = new LabelControl(); std::stringstream buf; buf << "Label_" << i; label->setText( buf.str() ); label->setMargin( 10 ); label->setBackColor( 1,1,1,0.4 ); bottom->addControl( label ); label->setActiveColor(1,.3,.3,1); label->addEventHandler( new MyClickHandler ); } cs->addControl( bottom ); } }
void MapNodeHelper::parse(MapNode* mapNode, osg::ArgumentParser& args, osgViewer::View* view, osg::Group* root, Control* userControl ) const { if ( !root ) root = mapNode; // options to use for the load osg::ref_ptr<osgDB::Options> dbOptions = Registry::instance()->cloneOrCreateOptions(); // parse out custom example arguments first: bool useSky = args.read("--sky"); bool useOcean = args.read("--ocean"); bool useMGRS = args.read("--mgrs"); bool useDMS = args.read("--dms"); bool useDD = args.read("--dd"); bool useCoords = args.read("--coords") || useMGRS || useDMS || useDD; bool useOrtho = args.read("--ortho"); bool useAutoClip = args.read("--autoclip"); bool useShadows = args.read("--shadows"); bool animateSky = args.read("--animate-sky"); bool showActivity = args.read("--activity"); bool useLogDepth = args.read("--logdepth"); bool useLogDepth2 = args.read("--logdepth2"); bool kmlUI = args.read("--kmlui"); if (args.read("--verbose")) osgEarth::setNotifyLevel(osg::INFO); if (args.read("--quiet")) osgEarth::setNotifyLevel(osg::FATAL); float ambientBrightness = 0.2f; args.read("--ambientBrightness", ambientBrightness); std::string kmlFile; args.read( "--kml", kmlFile ); std::string imageFolder; args.read( "--images", imageFolder ); std::string imageExtensions; args.read("--image-extensions", imageExtensions); // animation path: std::string animpath; if ( args.read("--path", animpath) ) { view->setCameraManipulator( new osgGA::AnimationPathManipulator(animpath) ); } // Install a new Canvas for our UI controls, or use one that already exists. ControlCanvas* canvas = ControlCanvas::getOrCreate( view ); Container* mainContainer = canvas->addControl( new VBox() ); mainContainer->setAbsorbEvents( true ); mainContainer->setBackColor( Color(Color::Black, 0.8) ); mainContainer->setHorizAlign( Control::ALIGN_LEFT ); mainContainer->setVertAlign( Control::ALIGN_BOTTOM ); // install the user control: if ( userControl ) mainContainer->addControl( userControl ); // look for external data in the map node: const Config& externals = mapNode->externalConfig(); const Config& skyConf = externals.child("sky"); const Config& oceanConf = externals.child("ocean"); const Config& annoConf = externals.child("annotations"); const Config& declutterConf = externals.child("decluttering"); // some terrain effects. // TODO: Most of these are likely to move into extensions. const Config& lodBlendingConf = externals.child("lod_blending"); const Config& vertScaleConf = externals.child("vertical_scale"); const Config& contourMapConf = externals.child("contour_map"); // Adding a sky model: if ( useSky || !skyConf.empty() ) { SkyOptions options(skyConf); if ( options.getDriver().empty() ) { if ( mapNode->getMapSRS()->isGeographic() ) options.setDriver("simple"); else options.setDriver("gl"); } SkyNode* sky = SkyNode::create(options, mapNode); if ( sky ) { sky->attach( view, 0 ); if ( mapNode->getNumParents() > 0 ) { osgEarth::insertGroup(sky, mapNode->getParent(0)); } else { sky->addChild( mapNode ); root = sky; } Control* c = SkyControlFactory().create(sky, view); if ( c ) mainContainer->addControl( c ); if (animateSky) { sky->setUpdateCallback( new AnimateSkyUpdateCallback() ); } } } // Adding an ocean model: if ( useOcean || !oceanConf.empty() ) { OceanNode* ocean = OceanNode::create(OceanOptions(oceanConf), mapNode); if ( ocean ) { // if there's a sky, we want to ocean under it osg::Group* parent = osgEarth::findTopMostNodeOfType<SkyNode>(root); if ( !parent ) parent = root; parent->addChild( ocean ); Control* c = OceanControlFactory().create(ocean); if ( c ) mainContainer->addControl(c); } } // Shadowing. if ( useShadows ) { ShadowCaster* caster = new ShadowCaster(); caster->setLight( view->getLight() ); caster->getShadowCastingGroup()->addChild( mapNode->getModelLayerGroup() ); if ( mapNode->getNumParents() > 0 ) { insertGroup(caster, mapNode->getParent(0)); } else { caster->addChild(mapNode); root = caster; } } // Loading KML from the command line: if ( !kmlFile.empty() ) { KMLOptions kml_options; kml_options.declutter() = true; // set up a default icon for point placemarks: IconSymbol* defaultIcon = new IconSymbol(); defaultIcon->url()->setLiteral(KML_PUSHPIN_URL); kml_options.defaultIconSymbol() = defaultIcon; osg::Node* kml = KML::load( URI(kmlFile), mapNode, kml_options ); if ( kml ) { if (kmlUI) { Control* c = AnnotationGraphControlFactory().create(kml, view); if ( c ) { c->setVertAlign( Control::ALIGN_TOP ); canvas->addControl( c ); } } root->addChild( kml ); } else { OE_NOTICE << "Failed to load " << kmlFile << std::endl; } } // Annotations in the map node externals: if ( !annoConf.empty() ) { osg::Group* annotations = 0L; AnnotationRegistry::instance()->create( mapNode, annoConf, dbOptions.get(), annotations ); if ( annotations ) { root->addChild( annotations ); } } // Configure the de-cluttering engine for labels and annotations: if ( !declutterConf.empty() ) { Decluttering::setOptions( DeclutteringOptions(declutterConf) ); } // Configure the mouse coordinate readout: if ( useCoords ) { LabelControl* readout = new LabelControl(); readout->setBackColor( Color(Color::Black, 0.8) ); readout->setHorizAlign( Control::ALIGN_RIGHT ); readout->setVertAlign( Control::ALIGN_BOTTOM ); Formatter* formatter = useMGRS ? (Formatter*)new MGRSFormatter(MGRSFormatter::PRECISION_1M, 0L, MGRSFormatter::USE_SPACES) : useDMS ? (Formatter*)new LatLongFormatter(LatLongFormatter::FORMAT_DEGREES_MINUTES_SECONDS) : useDD ? (Formatter*)new LatLongFormatter(LatLongFormatter::FORMAT_DECIMAL_DEGREES) : 0L; MouseCoordsTool* mcTool = new MouseCoordsTool( mapNode ); mcTool->addCallback( new MouseCoordsLabelCallback(readout, formatter) ); view->addEventHandler( mcTool ); canvas->addControl( readout ); } // Configure for an ortho camera: if ( useOrtho ) { EarthManipulator* manip = dynamic_cast<EarthManipulator*>(view->getCameraManipulator()); if ( manip ) { manip->getSettings()->setCameraProjection( EarthManipulator::PROJ_ORTHOGRAPHIC ); } } // activity monitor (debugging) if ( showActivity ) { VBox* vbox = new VBox(); vbox->setBackColor( Color(Color::Black, 0.8) ); vbox->setHorizAlign( Control::ALIGN_RIGHT ); vbox->setVertAlign( Control::ALIGN_BOTTOM ); view->addEventHandler( new ActivityMonitorTool(vbox) ); canvas->addControl( vbox ); } // Install an auto clip plane clamper if ( useAutoClip ) { mapNode->addCullCallback( new AutoClipPlaneCullCallback(mapNode) ); } // Install logarithmic depth buffer on main camera if ( useLogDepth ) { OE_INFO << LC << "Activating logarithmic depth buffer on main camera" << std::endl; osgEarth::Util::LogarithmicDepthBuffer logDepth; logDepth.setUseFragDepth( true ); logDepth.install( view->getCamera() ); } else if ( useLogDepth2 ) { OE_INFO << LC << "Activating logarithmic depth buffer (vertex-only) on main camera" << std::endl; osgEarth::Util::LogarithmicDepthBuffer logDepth; logDepth.setUseFragDepth( false ); logDepth.install( view->getCamera() ); } // Scan for images if necessary. if ( !imageFolder.empty() ) { std::vector<std::string> extensions; if ( !imageExtensions.empty() ) StringTokenizer( imageExtensions, extensions, ",;", "", false, true ); if ( extensions.empty() ) extensions.push_back( "tif" ); OE_INFO << LC << "Loading images from " << imageFolder << "..." << std::endl; ImageLayerVector imageLayers; DataScanner scanner; scanner.findImageLayers( imageFolder, extensions, imageLayers ); if ( imageLayers.size() > 0 ) { mapNode->getMap()->beginUpdate(); for( ImageLayerVector::iterator i = imageLayers.begin(); i != imageLayers.end(); ++i ) { mapNode->getMap()->addImageLayer( i->get() ); } mapNode->getMap()->endUpdate(); } OE_INFO << LC << "...found " << imageLayers.size() << " image layers." << std::endl; } // Install elevation morphing if ( !lodBlendingConf.empty() ) { mapNode->getTerrainEngine()->addEffect( new LODBlending(lodBlendingConf) ); } // Install vertical scaler if ( !vertScaleConf.empty() ) { mapNode->getTerrainEngine()->addEffect( new VerticalScale(vertScaleConf) ); } // Install a contour map effect. if ( !contourMapConf.empty() ) { mapNode->getTerrainEngine()->addEffect( new ContourMap(contourMapConf) ); } // Generic named value uniform with min/max. VBox* uniformBox = 0L; while( args.find( "--uniform" ) >= 0 ) { std::string name; float minval, maxval; if ( args.read( "--uniform", name, minval, maxval ) ) { if ( uniformBox == 0L ) { uniformBox = new VBox(); uniformBox->setBackColor(0,0,0,0.5); uniformBox->setAbsorbEvents( true ); canvas->addControl( uniformBox ); } osg::Uniform* uniform = new osg::Uniform(osg::Uniform::FLOAT, name); uniform->set( minval ); root->getOrCreateStateSet()->addUniform( uniform, osg::StateAttribute::OVERRIDE ); HBox* box = new HBox(); box->addControl( new LabelControl(name) ); HSliderControl* hs = box->addControl( new HSliderControl(minval, maxval, minval, new ApplyValueUniform(uniform))); hs->setHorizFill(true, 200); box->addControl( new LabelControl(hs) ); uniformBox->addControl( box ); OE_INFO << LC << "Installed uniform controller for " << name << std::endl; } } // Process extensions. for(std::vector<osg::ref_ptr<Extension> >::const_iterator eiter = mapNode->getExtensions().begin(); eiter != mapNode->getExtensions().end(); ++eiter) { Extension* e = eiter->get(); // Check for a View interface: ExtensionInterface<osg::View>* viewIF = ExtensionInterface<osg::View>::get( e ); if ( viewIF ) viewIF->connect( view ); // Check for a Control interface: ExtensionInterface<Control>* controlIF = ExtensionInterface<Control>::get( e ); if ( controlIF ) controlIF->connect( mainContainer ); } root->addChild( canvas ); }
void MapNodeHelper::parse(MapNode* mapNode, osg::ArgumentParser& args, osgViewer::View* view, osg::Group* root, Control* userControl ) const { // this is a dubious move. if ( !root ) root = mapNode; // options to use for the load osg::ref_ptr<osgDB::Options> dbOptions = Registry::instance()->cloneOrCreateOptions(); // parse out custom example arguments first: bool useSky = args.read("--sky"); bool useOcean = args.read("--ocean"); bool useMGRS = args.read("--mgrs"); bool useDMS = args.read("--dms"); bool useDD = args.read("--dd"); bool useCoords = args.read("--coords") || useMGRS || useDMS || useDD; bool useOrtho = args.read("--ortho"); bool useAutoClip = args.read("--autoclip"); float ambientBrightness = 0.2f; args.read("--ambientBrightness", ambientBrightness); std::string kmlFile; args.read( "--kml", kmlFile ); std::string imageFolder; args.read( "--images", imageFolder ); std::string imageExtensions; args.read("--image-extensions", imageExtensions); // install a canvas for any UI controls we plan to create: ControlCanvas* canvas = ControlCanvas::get(view, false); Container* mainContainer = canvas->addControl( new VBox() ); mainContainer->setAbsorbEvents( true ); mainContainer->setBackColor( Color(Color::Black, 0.8) ); mainContainer->setHorizAlign( Control::ALIGN_LEFT ); mainContainer->setVertAlign( Control::ALIGN_BOTTOM ); // install the user control: if ( userControl ) mainContainer->addControl( userControl ); // look for external data in the map node: const Config& externals = mapNode->externalConfig(); const Config& skyConf = externals.child("sky"); const Config& oceanConf = externals.child("ocean"); const Config& annoConf = externals.child("annotations"); const Config& declutterConf = externals.child("decluttering"); Config viewpointsConf = externals.child("viewpoints"); // some terrain effects. const Config& normalMapConf = externals.child("normal_map"); const Config& detailTexConf = externals.child("detail_texture"); const Config& lodBlendingConf = externals.child("lod_blending"); const Config& vertScaleConf = externals.child("vertical_scale"); const Config& contourMapConf = externals.child("contour_map"); // backwards-compatibility: read viewpoints at the top level: const ConfigSet& old_viewpoints = externals.children("viewpoint"); for( ConfigSet::const_iterator i = old_viewpoints.begin(); i != old_viewpoints.end(); ++i ) viewpointsConf.add( *i ); // Loading a viewpoint list from the earth file: if ( !viewpointsConf.empty() ) { std::vector<Viewpoint> viewpoints; const ConfigSet& children = viewpointsConf.children(); if ( children.size() > 0 ) { for( ConfigSet::const_iterator i = children.begin(); i != children.end(); ++i ) { viewpoints.push_back( Viewpoint(*i) ); } } if ( viewpoints.size() > 0 ) { Control* c = ViewpointControlFactory().create(viewpoints, view); if ( c ) mainContainer->addControl( c ); } } // Adding a sky model: if ( useSky || !skyConf.empty() ) { double hours = skyConf.value( "hours", 12.0 ); SkyNode* sky = new SkyNode( mapNode->getMap() ); sky->setAmbientBrightness( ambientBrightness ); sky->setDateTime( DateTime(2011, 3, 6, hours) ); sky->attach( view ); root->addChild( sky ); Control* c = SkyControlFactory().create(sky, view); if ( c ) mainContainer->addControl( c ); } // Adding an ocean model: if ( useOcean || !oceanConf.empty() ) { OceanSurfaceNode* ocean = new OceanSurfaceNode( mapNode, oceanConf ); if ( ocean ) { root->addChild( ocean ); Control* c = OceanControlFactory().create(ocean, view); if ( c ) mainContainer->addControl(c); } } // Loading KML from the command line: if ( !kmlFile.empty() ) { KMLOptions kml_options; kml_options.declutter() = true; // set up a default icon for point placemarks: IconSymbol* defaultIcon = new IconSymbol(); defaultIcon->url()->setLiteral(KML_PUSHPIN_URL); kml_options.defaultIconSymbol() = defaultIcon; osg::Node* kml = KML::load( URI(kmlFile), mapNode, kml_options ); if ( kml ) { Control* c = AnnotationGraphControlFactory().create(kml, view); if ( c ) { c->setVertAlign( Control::ALIGN_TOP ); canvas->addControl( c ); } root->addChild( kml ); } } // Annotations in the map node externals: if ( !annoConf.empty() ) { osg::Group* annotations = 0L; AnnotationRegistry::instance()->create( mapNode, annoConf, dbOptions.get(), annotations ); if ( annotations ) { root->addChild( annotations ); } } // Configure the de-cluttering engine for labels and annotations: if ( !declutterConf.empty() ) { Decluttering::setOptions( DeclutteringOptions(declutterConf) ); } // Configure the mouse coordinate readout: if ( useCoords ) { LabelControl* readout = new LabelControl(); readout->setBackColor( Color(Color::Black, 0.8) ); readout->setHorizAlign( Control::ALIGN_RIGHT ); readout->setVertAlign( Control::ALIGN_BOTTOM ); Formatter* formatter = useMGRS ? (Formatter*)new MGRSFormatter(MGRSFormatter::PRECISION_1M, 0L, MGRSFormatter::USE_SPACES) : useDMS ? (Formatter*)new LatLongFormatter(LatLongFormatter::FORMAT_DEGREES_MINUTES_SECONDS) : useDD ? (Formatter*)new LatLongFormatter(LatLongFormatter::FORMAT_DECIMAL_DEGREES) : 0L; MouseCoordsTool* mcTool = new MouseCoordsTool( mapNode ); mcTool->addCallback( new MouseCoordsLabelCallback(readout, formatter) ); view->addEventHandler( mcTool ); canvas->addControl( readout ); } // Configure for an ortho camera: if ( useOrtho ) { EarthManipulator* manip = dynamic_cast<EarthManipulator*>(view->getCameraManipulator()); if ( manip ) { manip->getSettings()->setCameraProjection( EarthManipulator::PROJ_ORTHOGRAPHIC ); } } // Install an auto clip plane clamper if ( useAutoClip ) { mapNode->addCullCallback( new AutoClipPlaneCullCallback(mapNode) ); } // Scan for images if necessary. if ( !imageFolder.empty() ) { std::vector<std::string> extensions; if ( !imageExtensions.empty() ) StringTokenizer( imageExtensions, extensions, ",;", "", false, true ); if ( extensions.empty() ) extensions.push_back( "tif" ); OE_INFO << LC << "Loading images from " << imageFolder << "..." << std::endl; ImageLayerVector imageLayers; DataScanner scanner; scanner.findImageLayers( imageFolder, extensions, imageLayers ); if ( imageLayers.size() > 0 ) { mapNode->getMap()->beginUpdate(); for( ImageLayerVector::iterator i = imageLayers.begin(); i != imageLayers.end(); ++i ) { mapNode->getMap()->addImageLayer( i->get() ); } mapNode->getMap()->endUpdate(); } OE_INFO << LC << "...found " << imageLayers.size() << " image layers." << std::endl; } // Install a normal map layer. if ( !normalMapConf.empty() ) { osg::ref_ptr<NormalMap> effect = new NormalMap(normalMapConf, mapNode->getMap()); if ( effect->getNormalMapLayer() ) { mapNode->getTerrainEngine()->addEffect( effect.get() ); } } // Install a detail texturer if ( !detailTexConf.empty() ) { osg::ref_ptr<DetailTexture> effect = new DetailTexture(detailTexConf); if ( effect->getImage() ) { mapNode->getTerrainEngine()->addEffect( effect.get() ); } } // Install elevation morphing if ( !lodBlendingConf.empty() ) { mapNode->getTerrainEngine()->addEffect( new LODBlending(lodBlendingConf) ); } // Install vertical scaler if ( !vertScaleConf.empty() ) { mapNode->getTerrainEngine()->addEffect( new VerticalScale(vertScaleConf) ); } // Install a contour map effect. if ( !contourMapConf.empty() ) { mapNode->getTerrainEngine()->addEffect( new ContourMap(contourMapConf) ); } // Generic named value uniform with min/max. VBox* uniformBox = 0L; while( args.find( "--uniform" ) >= 0 ) { std::string name; float minval, maxval; if ( args.read( "--uniform", name, minval, maxval ) ) { if ( uniformBox == 0L ) { uniformBox = new VBox(); uniformBox->setBackColor(0,0,0,0.5); uniformBox->setAbsorbEvents( true ); canvas->addControl( uniformBox ); } osg::Uniform* uniform = new osg::Uniform(osg::Uniform::FLOAT, name); uniform->set( minval ); root->getOrCreateStateSet()->addUniform( uniform, osg::StateAttribute::OVERRIDE ); HBox* box = new HBox(); box->addControl( new LabelControl(name) ); HSliderControl* hs = box->addControl( new HSliderControl(minval, maxval, minval, new ApplyValueUniform(uniform))); hs->setHorizFill(true, 200); box->addControl( new LabelControl(hs) ); uniformBox->addControl( box ); OE_INFO << LC << "Installed uniform controller for " << name << std::endl; } } root->addChild( canvas ); }
void MapNodeHelper::parse(MapNode* mapNode, osg::ArgumentParser& args, osgViewer::View* view, osg::Group* root, Container* userContainer ) const { if ( !root ) root = mapNode; // options to use for the load osg::ref_ptr<osgDB::Options> dbOptions = Registry::instance()->cloneOrCreateOptions(); // parse out custom example arguments first: bool useMGRS = args.read("--mgrs"); bool useDMS = args.read("--dms"); bool useDD = args.read("--dd"); bool useCoords = args.read("--coords") || useMGRS || useDMS || useDD; bool useAutoClip = args.read("--autoclip"); bool animateSky = args.read("--animate-sky"); bool showActivity = args.read("--activity"); bool useLogDepth = args.read("--logdepth"); bool useLogDepth2 = args.read("--logdepth2"); bool kmlUI = args.read("--kmlui"); if (args.read("--verbose")) osgEarth::setNotifyLevel(osg::INFO); if (args.read("--quiet")) osgEarth::setNotifyLevel(osg::FATAL); float ambientBrightness = 0.2f; args.read("--ambientBrightness", ambientBrightness); std::string kmlFile; args.read( "--kml", kmlFile ); std::string imageFolder; args.read( "--images", imageFolder ); std::string imageExtensions; args.read("--image-extensions", imageExtensions); // animation path: std::string animpath; if ( args.read("--path", animpath) ) { view->setCameraManipulator( new osgGA::AnimationPathManipulator(animpath) ); } // Install a new Canvas for our UI controls, or use one that already exists. ControlCanvas* canvas = ControlCanvas::getOrCreate( view ); Container* mainContainer; if ( userContainer ) { mainContainer = userContainer; } else { mainContainer = new VBox(); mainContainer->setAbsorbEvents( true ); mainContainer->setBackColor( Color(Color::Black, 0.8) ); mainContainer->setHorizAlign( Control::ALIGN_LEFT ); mainContainer->setVertAlign( Control::ALIGN_BOTTOM ); } canvas->addControl( mainContainer ); // Add an event handler to toggle the canvas with a key press; view->addEventHandler(new ToggleCanvasEventHandler(canvas) ); // look for external data in the map node: const Config& externals = mapNode->externalConfig(); //const Config& screenSpaceLayoutConf = // externals.hasChild("screen_space_layout") ? externals.child("screen_space_layout") : // externals.child("decluttering"); // backwards-compatibility // some terrain effects. // TODO: Most of these are likely to move into extensions. const Config& lodBlendingConf = externals.child("lod_blending"); const Config& vertScaleConf = externals.child("vertical_scale"); // Shadowing. if (args.read("--shadows")) { int unit; if ( mapNode->getTerrainEngine()->getResources()->reserveTextureImageUnit(unit, "ShadowCaster") ) { ShadowCaster* caster = new ShadowCaster(); caster->setTextureImageUnit( unit ); caster->setLight( view->getLight() ); caster->getShadowCastingGroup()->addChild( mapNode ); if ( mapNode->getNumParents() > 0 ) { insertGroup(caster, mapNode->getParent(0)); } else { caster->addChild(mapNode); root = caster; } } } // Loading KML from the command line: if ( !kmlFile.empty() ) { KMLOptions kml_options; kml_options.declutter() = true; // set up a default icon for point placemarks: IconSymbol* defaultIcon = new IconSymbol(); defaultIcon->url()->setLiteral(KML_PUSHPIN_URL); kml_options.defaultIconSymbol() = defaultIcon; TextSymbol* defaultText = new TextSymbol(); defaultText->halo() = Stroke(0.3,0.3,0.3,1.0); kml_options.defaultTextSymbol() = defaultText; osg::Node* kml = KML::load( URI(kmlFile), mapNode, kml_options ); if ( kml ) { if (kmlUI) { Control* c = AnnotationGraphControlFactory().create(kml, view); if ( c ) { c->setVertAlign( Control::ALIGN_TOP ); canvas->addControl( c ); } } root->addChild( kml ); } else { OE_NOTICE << "Failed to load " << kmlFile << std::endl; } } //// Configure the de-cluttering engine for labels and annotations: //if ( !screenSpaceLayoutConf.empty() ) //{ // ScreenSpaceLayout::setOptions( ScreenSpaceLayoutOptions(screenSpaceLayoutConf) ); //} // Configure the mouse coordinate readout: if ( useCoords ) { LabelControl* readout = new LabelControl(); readout->setBackColor( Color(Color::Black, 0.8) ); readout->setHorizAlign( Control::ALIGN_RIGHT ); readout->setVertAlign( Control::ALIGN_BOTTOM ); Formatter* formatter = useMGRS ? (Formatter*)new MGRSFormatter(MGRSFormatter::PRECISION_1M, 0L, MGRSFormatter::USE_SPACES) : useDMS ? (Formatter*)new LatLongFormatter(LatLongFormatter::FORMAT_DEGREES_MINUTES_SECONDS) : useDD ? (Formatter*)new LatLongFormatter(LatLongFormatter::FORMAT_DECIMAL_DEGREES) : 0L; MouseCoordsTool* mcTool = new MouseCoordsTool( mapNode ); mcTool->addCallback( new MouseCoordsLabelCallback(readout, formatter) ); view->addEventHandler( mcTool ); canvas->addControl( readout ); } // Configure for an ortho camera: if ( args.read("--ortho") ) { view->getCamera()->setProjectionMatrixAsOrtho(-1, 1, -1, 1, 0, 1); } // activity monitor (debugging) if ( showActivity ) { VBox* vbox = new VBox(); vbox->setBackColor( Color(Color::Black, 0.8) ); vbox->setHorizAlign( Control::ALIGN_RIGHT ); vbox->setVertAlign( Control::ALIGN_BOTTOM ); view->addEventHandler( new ActivityMonitorTool(vbox) ); canvas->addControl( vbox ); } // Install an auto clip plane clamper if ( useAutoClip ) { mapNode->addCullCallback( new AutoClipPlaneCullCallback(mapNode) ); } // Install logarithmic depth buffer on main camera if ( useLogDepth ) { OE_INFO << LC << "Activating logarithmic depth buffer (vertex-only) on main camera" << std::endl; osgEarth::Util::LogarithmicDepthBuffer logDepth; logDepth.setUseFragDepth( false ); logDepth.install( view->getCamera() ); } else if ( useLogDepth2 ) { OE_INFO << LC << "Activating logarithmic depth buffer (precise) on main camera" << std::endl; osgEarth::Util::LogarithmicDepthBuffer logDepth; logDepth.setUseFragDepth( true ); logDepth.install( view->getCamera() ); } // Scan for images if necessary. if ( !imageFolder.empty() ) { std::vector<std::string> extensions; if ( !imageExtensions.empty() ) StringTokenizer( imageExtensions, extensions, ",;", "", false, true ); if ( extensions.empty() ) extensions.push_back( "tif" ); OE_INFO << LC << "Loading images from " << imageFolder << "..." << std::endl; ImageLayerVector imageLayers; DataScanner scanner; scanner.findImageLayers( imageFolder, extensions, imageLayers ); if ( imageLayers.size() > 0 ) { mapNode->getMap()->beginUpdate(); for( ImageLayerVector::iterator i = imageLayers.begin(); i != imageLayers.end(); ++i ) { mapNode->getMap()->addImageLayer( i->get() ); } mapNode->getMap()->endUpdate(); } OE_INFO << LC << "...found " << imageLayers.size() << " image layers." << std::endl; } // Install elevation morphing if ( !lodBlendingConf.empty() ) { mapNode->getTerrainEngine()->addEffect( new LODBlending(lodBlendingConf) ); } // Install vertical scaler if ( !vertScaleConf.empty() ) { mapNode->getTerrainEngine()->addEffect( new VerticalScale(vertScaleConf) ); } // Install a contour map effect. if (args.read("--contourmap")) { mapNode->addExtension(Extension::create("contourmap", ConfigOptions())); // with the cmdline switch, hids all the image layer so we can see the contour map. for (unsigned i = 0; i < mapNode->getMap()->getNumImageLayers(); ++i) { mapNode->getMap()->getImageLayerAt(i)->setVisible(false); } } // Generic named value uniform with min/max. VBox* uniformBox = 0L; while( args.find( "--uniform" ) >= 0 ) { std::string name; float minval, maxval; if ( args.read( "--uniform", name, minval, maxval ) ) { if ( uniformBox == 0L ) { uniformBox = new VBox(); uniformBox->setBackColor(0,0,0,0.5); uniformBox->setAbsorbEvents( true ); canvas->addControl( uniformBox ); } osg::Uniform* uniform = new osg::Uniform(osg::Uniform::FLOAT, name); uniform->set( minval ); root->getOrCreateStateSet()->addUniform( uniform, osg::StateAttribute::OVERRIDE ); HBox* box = new HBox(); box->addControl( new LabelControl(name) ); HSliderControl* hs = box->addControl( new HSliderControl(minval, maxval, minval, new ApplyValueUniform(uniform))); hs->setHorizFill(true, 200); box->addControl( new LabelControl(hs) ); uniformBox->addControl( box ); OE_INFO << LC << "Installed uniform controller for " << name << std::endl; } } // Map inspector: if (args.read("--inspect")) { mapNode->addExtension( Extension::create("mapinspector", ConfigOptions()) ); } // Memory monitor: if (args.read("--monitor")) { mapNode->addExtension(Extension::create("monitor", ConfigOptions()) ); } // Simple sky model: if (args.read("--sky")) { mapNode->addExtension(Extension::create("sky_simple", ConfigOptions()) ); } // Simple ocean model: if (args.read("--ocean")) { mapNode->addExtension(Extension::create("ocean_simple", ConfigOptions())); } // Hook up the extensions! for(std::vector<osg::ref_ptr<Extension> >::const_iterator eiter = mapNode->getExtensions().begin(); eiter != mapNode->getExtensions().end(); ++eiter) { Extension* e = eiter->get(); // Check for a View interface: ExtensionInterface<osg::View>* viewIF = ExtensionInterface<osg::View>::get( e ); if ( viewIF ) viewIF->connect( view ); // Check for a Control interface: ExtensionInterface<Control>* controlIF = ExtensionInterface<Control>::get( e ); if ( controlIF ) controlIF->connect( mainContainer ); } root->addChild( canvas ); }
void GlobePlugin::setupControls() { std::string imgDir = QDir::cleanPath( QgsApplication::pkgDataPath() + "/globe/gui" ).toStdString(); //MOVE CONTROLS //Horizontal container HBox* moveHControls = new HBox(); moveHControls->setFrame( new RoundedFrame() ); moveHControls->getFrame()->setBackColor( 1, 1, 1, 0.5 ); moveHControls->setMargin( 0 ); //moveHControls->setChildSpacing( 47 ); moveHControls->setVertAlign( Control::ALIGN_CENTER ); moveHControls->setHorizAlign( Control::ALIGN_CENTER ); moveHControls->setPosition( 5, 30 ); moveHControls->setPadding( 6 ); osgEarth::Util::EarthManipulator* manip = dynamic_cast<osgEarth::Util::EarthManipulator*>( viewer.getCameraManipulator() ); //Move Left osg::Image* moveLeftImg = osgDB::readImageFile( imgDir + "/move-left.png" ); ImageControl* moveLeft = new NavigationControl( moveLeftImg ); moveLeft->addEventHandler( new PanControlHandler( manip, -MOVE_OFFSET, 0 ) ); //Move Right osg::Image* moveRightImg = osgDB::readImageFile( imgDir + "/move-right.png" ); ImageControl* moveRight = new NavigationControl( moveRightImg ); moveRight->addEventHandler( new PanControlHandler( manip, MOVE_OFFSET, 0 ) ); //Vertical container VBox* moveVControls = new VBox(); moveVControls->setFrame( new RoundedFrame() ); moveVControls->getFrame()->setBackColor( 1, 1, 1, 0.5 ); moveVControls->setMargin( 0 ); //moveVControls->setChildSpacing( 36 ); moveVControls->setVertAlign( Control::ALIGN_CENTER ); moveVControls->setHorizAlign( Control::ALIGN_CENTER ); moveVControls->setPosition( 35, 5 ); moveVControls->setPadding( 6 ); //Move Up osg::Image* moveUpImg = osgDB::readImageFile( imgDir + "/move-up.png" ); ImageControl* moveUp = new NavigationControl( moveUpImg ); moveUp->addEventHandler( new PanControlHandler( manip, 0, MOVE_OFFSET ) ); //Move Down osg::Image* moveDownImg = osgDB::readImageFile( imgDir + "/move-down.png" ); ImageControl* moveDown = new NavigationControl( moveDownImg ); moveDown->addEventHandler( new PanControlHandler( manip, 0, -MOVE_OFFSET ) ); //add controls to moveControls group moveHControls->addControl( moveLeft ); moveHControls->addControl( moveRight ); moveVControls->addControl( moveUp ); moveVControls->addControl( moveDown ); //END MOVE CONTROLS //ROTATE CONTROLS //Horizontal container HBox* rotateControls = new HBox(); rotateControls->setFrame( new RoundedFrame() ); rotateControls->getFrame()->setBackColor( 1, 1, 1, 0.5 ); rotateControls->setMargin( 0 ); //rotateControls->setChildSpacing( 10 ); rotateControls->setVertAlign( Control::ALIGN_CENTER ); rotateControls->setHorizAlign( Control::ALIGN_CENTER ); rotateControls->setPosition( 5, 113 ); rotateControls->setPadding( 6 ); //Rotate CCW osg::Image* rotateCCWImg = osgDB::readImageFile( imgDir + "/rotate-ccw.png" ); ImageControl* rotateCCW = new NavigationControl( rotateCCWImg ); rotateCCW->addEventHandler( new RotateControlHandler( manip, MOVE_OFFSET, 0 ) ); //Rotate CW osg::Image* rotateCWImg = osgDB::readImageFile( imgDir + "/rotate-cw.png" ); ImageControl* rotateCW = new NavigationControl( rotateCWImg ); rotateCW->addEventHandler( new RotateControlHandler( manip, -MOVE_OFFSET , 0 ) ); //Rotate Reset osg::Image* rotateResetImg = osgDB::readImageFile( imgDir + "/rotate-reset.png" ); ImageControl* rotateReset = new NavigationControl( rotateResetImg ); rotateReset->addEventHandler( new RotateControlHandler( manip, 0, 0 ) ); //add controls to rotateControls group rotateControls->addControl( rotateCCW ); rotateControls->addControl( rotateReset ); rotateControls->addControl( rotateCW ); //END ROTATE CONTROLS //TILT CONTROLS //Vertical container VBox* tiltControls = new VBox(); tiltControls->setFrame( new RoundedFrame() ); tiltControls->getFrame()->setBackColor( 1, 1, 1, 0.5 ); tiltControls->setMargin( 0 ); //tiltControls->setChildSpacing( 30 ); tiltControls->setVertAlign( Control::ALIGN_CENTER ); tiltControls->setHorizAlign( Control::ALIGN_CENTER ); tiltControls->setPosition( 35, 90 ); tiltControls->setPadding( 6 ); //tilt Up osg::Image* tiltUpImg = osgDB::readImageFile( imgDir + "/tilt-up.png" ); ImageControl* tiltUp = new NavigationControl( tiltUpImg ); tiltUp->addEventHandler( new RotateControlHandler( manip, 0, MOVE_OFFSET ) ); //tilt Down osg::Image* tiltDownImg = osgDB::readImageFile( imgDir + "/tilt-down.png" ); ImageControl* tiltDown = new NavigationControl( tiltDownImg ); tiltDown->addEventHandler( new RotateControlHandler( manip, 0, -MOVE_OFFSET ) ); //add controls to tiltControls group tiltControls->addControl( tiltUp ); tiltControls->addControl( tiltDown ); //END TILT CONTROLS //ZOOM CONTROLS //Vertical container VBox* zoomControls = new VBox(); zoomControls->setFrame( new RoundedFrame() ); zoomControls->getFrame()->setBackColor( 1, 1, 1, 0.5 ); zoomControls->setMargin( 0 ); //zoomControls->setChildSpacing( 5 ); zoomControls->setVertAlign( Control::ALIGN_CENTER ); zoomControls->setHorizAlign( Control::ALIGN_CENTER ); zoomControls->setPosition( 35, 170 ); zoomControls->setPadding( 6 ); //Zoom In osg::Image* zoomInImg = osgDB::readImageFile( imgDir + "/zoom-in.png" ); ImageControl* zoomIn = new NavigationControl( zoomInImg ); zoomIn->addEventHandler( new ZoomControlHandler( manip, 0, -MOVE_OFFSET ) ); //Zoom Out osg::Image* zoomOutImg = osgDB::readImageFile( imgDir + "/zoom-out.png" ); ImageControl* zoomOut = new NavigationControl( zoomOutImg ); zoomOut->addEventHandler( new ZoomControlHandler( manip, 0, MOVE_OFFSET ) ); //add controls to zoomControls group zoomControls->addControl( zoomIn ); zoomControls->addControl( zoomOut ); //END ZOOM CONTROLS //EXTRA CONTROLS //Horizontal container HBox* extraControls = new HBox(); extraControls->setFrame( new RoundedFrame() ); extraControls->getFrame()->setBackColor( 1, 1, 1, 0.5 ); extraControls->setMargin( 0 ); //extraControls->setChildSpacing( 10 ); extraControls->setVertAlign( Control::ALIGN_CENTER ); extraControls->setHorizAlign( Control::ALIGN_CENTER ); extraControls->setPosition( 5, 220 ); extraControls->setPadding( 6 ); //Sync Extent osg::Image* extraSyncImg = osgDB::readImageFile( imgDir + "/sync-extent.png" ); ImageControl* extraSync = new NavigationControl( extraSyncImg ); extraSync->addEventHandler( new SyncExtentControlHandler( this ) ); //Zoom Reset osg::Image* extraHomeImg = osgDB::readImageFile( imgDir + "/zoom-home.png" ); ImageControl* extraHome = new NavigationControl( extraHomeImg ); extraHome->addEventHandler( new HomeControlHandler( manip ) ); //refresh layers osg::Image* extraRefreshImg = osgDB::readImageFile( imgDir + "/refresh-view.png" ); ImageControl* extraRefresh = new NavigationControl( extraRefreshImg ); extraRefresh->addEventHandler( new RefreshControlHandler( this ) ); //add controls to extraControls group extraControls->addControl( extraSync ); extraControls->addControl( extraHome ); extraControls->addControl( extraRefresh ); //END EXTRA CONTROLS //add controls groups to canavas mControlCanvas->addControl( moveHControls ); mControlCanvas->addControl( moveVControls ); mControlCanvas->addControl( tiltControls ); mControlCanvas->addControl( rotateControls ); mControlCanvas->addControl( zoomControls ); mControlCanvas->addControl( extraControls ); }
int main(int argc, char** argv) { osg::ArgumentParser arguments(&argc,argv); osgViewer::Viewer viewer(arguments); // parse command line: bool isUTM = arguments.read("--utm"); bool isMGRS = arguments.read("--mgrs"); bool isGeodetic = arguments.read("--geodetic"); bool isGARS = arguments.read("--gars"); // load the .earth file from the command line. MapNode* mapNode = MapNode::load( arguments ); if ( !mapNode ) return usage( "Failed to load a map from the .earth file" ); // install our manipulator: viewer.setCameraManipulator( new EarthManipulator() ); // root scene graph: osg::Group* root = new osg::Group(); root->addChild( mapNode ); Formatter* formatter = 0L; if ( isUTM ) { UTMGraticule* gr = new UTMGraticule(); mapNode->getMap()->addLayer(gr); formatter = new MGRSFormatter(); } else if ( isMGRS ) { MGRSGraticule* gr = new MGRSGraticule(); mapNode->getMap()->addLayer(gr); formatter = new MGRSFormatter(); } else if ( isGARS ) { GARSGraticule* gr = new GARSGraticule(); mapNode->getMap()->addLayer(gr); formatter = new LatLongFormatter(); } else // if ( isGeodetic ) { GeodeticGraticule* gr = new GeodeticGraticule(); mapNode->getMap()->addLayer(gr); formatter = new LatLongFormatter(); } // mouse coordinate readout: ControlCanvas* canvas = new ControlCanvas(); root->addChild( canvas ); VBox* vbox = new VBox(); canvas->addControl( vbox ); LabelControl* readout = new LabelControl(); vbox->addControl( readout ); MouseCoordsTool* tool = new MouseCoordsTool( mapNode ); tool->addCallback( new MouseCoordsLabelCallback(readout, formatter) ); viewer.addEventHandler( tool ); // finalize setup and run. viewer.setSceneData( root ); viewer.addEventHandler(new osgViewer::StatsHandler()); viewer.addEventHandler(new osgViewer::WindowSizeHandler()); viewer.addEventHandler(new osgViewer::ThreadingHandler()); viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet())); return viewer.run(); }
/** creates some UI controls for adjusting the decluttering parameters. */ Container* createControls( osgViewer::View* view ) { //ControlCanvas* canvas = ControlCanvas::getOrCreate(view); // title bar VBox* vbox = new VBox(Control::ALIGN_NONE, Control::ALIGN_BOTTOM, 2, 1 ); vbox->setBackColor( Color(Color::Black, 0.5) ); vbox->addControl( new LabelControl("osgEarth Tracks Demo", Color::Yellow) ); // checkbox that toggles decluttering of tracks struct ToggleDecluttering : public ControlEventHandler { void onValueChanged( Control* c, bool on ) { ScreenSpaceLayout::setDeclutteringEnabled( on ); } }; HBox* dcToggle = vbox->addControl( new HBox() ); dcToggle->addControl( new CheckBoxControl(true, new ToggleDecluttering()) ); dcToggle->addControl( new LabelControl("Declutter") ); // checkbox that toggles the coordinate display struct ToggleCoords : public ControlEventHandler { void onValueChanged( Control* c, bool on ) { g_showCoords = on; } }; HBox* coordsToggle = vbox->addControl( new HBox() ); coordsToggle->addControl( new CheckBoxControl(true, new ToggleCoords()) ); coordsToggle->addControl( new LabelControl("Show locations") ); // grid for the slider controls so they look nice Grid* grid = vbox->addControl( new Grid() ); grid->setHorizFill( true ); grid->setChildHorizAlign( Control::ALIGN_LEFT ); grid->setChildSpacing( 6 ); unsigned r=0; // event handler for changing decluttering options struct ChangeFloatOption : public ControlEventHandler { optional<float>& _param; LabelControl* _label; ChangeFloatOption( optional<float>& param, LabelControl* label ) : _param(param), _label(label) { } void onValueChanged( Control* c, float value ) { _param = value; _label->setText( Stringify() << std::fixed << std::setprecision(1) << value ); ScreenSpaceLayout::setOptions( g_dcOptions ); } }; grid->setControl( 0, r, new LabelControl("Sim loop duration:") ); LabelControl* speedLabel = grid->setControl( 2, r, new LabelControl(Stringify() << std::fixed << std::setprecision(1) << *g_duration) ); HSliderControl* speedSlider = grid->setControl( 1, r, new HSliderControl( 600.0, 30.0, *g_duration, new ChangeFloatOption(g_duration, speedLabel) ) ); speedSlider->setHorizFill( true, 200 ); grid->setControl( 0, ++r, new LabelControl("Min scale:") ); LabelControl* minAnimationScaleLabel = grid->setControl( 2, r, new LabelControl(Stringify() << std::fixed << std::setprecision(1) << *g_dcOptions.minAnimationScale()) ); grid->setControl( 1, r, new HSliderControl( 0.0, 1.0, *g_dcOptions.minAnimationScale(), new ChangeFloatOption(g_dcOptions.minAnimationScale(), minAnimationScaleLabel) ) ); grid->setControl( 0, ++r, new LabelControl("Min alpha:") ); LabelControl* alphaLabel = grid->setControl( 2, r, new LabelControl(Stringify() << std::fixed << std::setprecision(1) << *g_dcOptions.minAnimationAlpha()) ); grid->setControl( 1, r, new HSliderControl( 0.0, 1.0, *g_dcOptions.minAnimationAlpha(), new ChangeFloatOption(g_dcOptions.minAnimationAlpha(), alphaLabel) ) ); grid->setControl( 0, ++r, new LabelControl("Activate time (s):") ); LabelControl* actLabel = grid->setControl( 2, r, new LabelControl(Stringify() << std::fixed << std::setprecision(1) << *g_dcOptions.inAnimationTime()) ); grid->setControl( 1, r, new HSliderControl( 0.0, 2.0, *g_dcOptions.inAnimationTime(), new ChangeFloatOption(g_dcOptions.inAnimationTime(), actLabel) ) ); grid->setControl( 0, ++r, new LabelControl("Deactivate time (s):") ); LabelControl* deactLabel = grid->setControl( 2, r, new LabelControl(Stringify() << std::fixed << std::setprecision(1) << *g_dcOptions.outAnimationTime()) ); grid->setControl( 1, r, new HSliderControl( 0.0, 2.0, *g_dcOptions.outAnimationTime(), new ChangeFloatOption(g_dcOptions.outAnimationTime(), deactLabel) ) ); return vbox; }
int main(int argc, char** argv) { // allocate pager threads based on CPU configuration. int cores = Registry::capabilities().getNumProcessors(); osg::DisplaySettings::instance()->setNumOfDatabaseThreadsHint( osg::clampAbove(cores, 2) ); osg::DisplaySettings::instance()->setNumOfHttpDatabaseThreadsHint( osg::clampAbove(cores/2, 1) ); // parse the command line. osg::ArgumentParser arguments(&argc,argv); osgViewer::Viewer viewer(arguments); // set up the motion model. viewer.setCameraManipulator( new EarthManipulator() ); // simple UI. VBox* vbox = new VBox(); vbox->setMargin( 3 ); vbox->setChildSpacing( 5 ); vbox->setAbsorbEvents( true ); vbox->setHorizAlign( Control::ALIGN_RIGHT ); vbox->setVertAlign ( Control::ALIGN_BOTTOM ); // Control instructions: Grid* grid = vbox->addControl( new Grid() ); grid->setControl( 0, 0, new LabelControl("Pan:")); grid->setControl( 1, 0, new LabelControl("Left mouse")); grid->setControl( 0, 1, new LabelControl("Zoom:")); grid->setControl( 1, 1, new LabelControl("Right mouse / scroll")); grid->setControl( 0, 2, new LabelControl("Rotate:") ); grid->setControl( 1, 2, new LabelControl("Middle mouse")); grid->setControl( 0, 3, new LabelControl("Go to:")); grid->setControl( 1, 3, new LabelControl("Double-click")); ControlCanvas::getOrCreate(&viewer)->addControl(vbox); // Load an earth file osg::Node* node = MapNodeHelper().load(arguments, &viewer); if ( !node ) return usage( "Failed to load earth file." ); viewer.setSceneData( node ); #ifdef Q_WS_X11 // required for multi-threaded viewer on linux: XInitThreads(); #endif QApplication app(argc, argv); QWidget* viewerWidget = new ViewerWidget( &viewer ); QMainWindow win; win.setWindowTitle( "osgEarth -- The #1 Open Source Terrain SDK for Mission-Critical Applications" ); win.setCentralWidget( viewerWidget ); win.setGeometry(100, 100, 1024, 800); win.statusBar()->showMessage(QString("osgEarth. Copyright 2014 Pelican Mapping. Please visit http://osgearth.org")); win.show(); app.exec(); }