osg::Node* FeatureModelSource::createNodeImplementation(const Map* map, ProgressCallback* progress ) { // trivial bailout. if (!getStatus().isOK()) return 0L; // user must provide a valid map. if ( !map ) { OE_WARN << LC << "NULL Map is illegal when building feature data." << std::endl; return 0L; } // make sure the feature source initialized properly: if ( !_features.valid() || !_features->getFeatureProfile() ) { return 0L; } // create a feature node factory: FeatureNodeFactory* factory = createFeatureNodeFactory(); if ( !factory ) { OE_WARN << LC << "Unable to create a feature node factory!" << std::endl; setStatus(Status::Error(Status::ServiceUnavailable, "Failed to create a feature node factory")); return 0L; } // Session holds data that's shared across the life of the FMG Session* session = new Session( map, _options.styles().get(), _features.get(), _readOptions.get() ); // Name the session (for debugging purposes) session->setName( this->getName() ); // Graph that will render feature models. May included paged data. FeatureModelGraph* graph = new FeatureModelGraph( session, _options, factory, this, _preMergeOps.get(), _postMergeOps.get() ); graph->setName( session->getName() ); // then run the ops on the staring graph: firePostProcessors( graph ); return graph; }
ReadResult readNode(const std::string& uri, const Options* options) const { if ( !acceptsExtension( osgDB::getLowerCaseFileExtension(uri) ) ) return ReadResult::FILE_NOT_HANDLED; UID uid; unsigned lod, x, y; sscanf( uri.c_str(), "%u.%d_%d_%d.%*s", &uid, &lod, &x, &y ); FeatureModelGraph* graph = getGraph(uid); if ( graph ) return ReadResult( graph->load( lod, x, y, uri ) ); else return ReadResult::ERROR_IN_READING_FILE; }
osg::Node* FeatureModelSource::createNodeImplementation(const Map* map, const osgDB::Options* dbOptions, ProgressCallback* progress ) { // user must provide a valid map. if ( !map ) { OE_WARN << LC << "NULL Map is illegal when building feature data." << std::endl; return 0L; } // make sure the feature source initialized properly: if ( !_features.valid() || !_features->getFeatureProfile() ) { OE_WARN << LC << "Invalid feature source" << std::endl; return 0L; } // create a feature node factory: FeatureNodeFactory* factory = createFeatureNodeFactory(); if ( !factory ) { OE_WARN << LC << "Unable to create a feature node factory!" << std::endl; return 0L; } // Session holds data that's shared across the life of the FMG Session* session = new Session( map, _options.styles().get(), _features.get(), dbOptions ); // Graph that will render feature models. May included paged data. FeatureModelGraph* graph = new FeatureModelGraph( session, _options, factory ); // install any post-merge operations on the FMG so it can call them during paging: const NodeOperationVector& ops = postProcessors(); for( NodeOperationVector::const_iterator i = ops.begin(); i != ops.end(); ++i ) { graph->addPostMergeOperation( i->get() ); } // then run the ops on the staring graph: firePostProcessors( graph ); return graph; }
osg::Node* FeatureModelSource::createNode( ProgressCallback* progress ) { if ( !_factory.valid() ) _factory = createFeatureNodeFactory(); if ( !_factory.valid() ) return 0L; if ( !_map.valid() ) return 0L; if ( !_features.valid() || !_features->getFeatureProfile() ) { OE_WARN << LC << "Invalid feature source" << std::endl; return 0L; } // Session holds data that's shared across the life of the FMG Session* session = new Session( _map.get(), _options.styles().get(), _features.get(), _dbOptions.get() ); // Graph that will render feature models. May included paged data. FeatureModelGraph* graph = new FeatureModelGraph( session, _options, _factory.get() ); // install any post-merge operations on the FMG so it can call them during paging: const NodeOperationVector& ops = postProcessors(); for( NodeOperationVector::const_iterator i = ops.begin(); i != ops.end(); ++i ) graph->addPostMergeOperation( i->get() ); // then run the ops on the staring graph: firePostProcessors( graph ); return graph; }
// // NOTE: run this sample from the repo/tests directory. // int main(int argc, char** argv) { osg::ArgumentParser arguments(&argc,argv); osgViewer::Viewer viewer(arguments); s_viewer = &viewer; // Start by creating the map: s_mapNode = MapNode::load(arguments); if ( !s_mapNode ) { Map* map = new Map(); // Start with a basemap imagery layer; we'll be using the GDAL driver // to load a local GeoTIFF file: GDALOptions basemapOpt; basemapOpt.url() = "../data/world.tif"; map->addImageLayer( new ImageLayer( ImageLayerOptions("basemap", basemapOpt) ) ); // That's it, the map is ready; now create a MapNode to render the Map: MapNodeOptions mapNodeOptions; mapNodeOptions.enableLighting() = false; s_mapNode = new MapNode( map, mapNodeOptions ); } s_mapNode->setNodeMask( 0x01 ); // Define a style for the feature data. Since we are going to render the // vectors as lines, configure the line symbolizer: StyleSheet* styleSheet = buildStyleSheet( Color::Yellow, 2.0f ); s_source = new FeatureListSource(); LineString* line = new LineString(); line->push_back( osg::Vec3d(-60, 20, 0) ); line->push_back( osg::Vec3d(-120, 20, 0) ); line->push_back( osg::Vec3d(-120, 60, 0) ); line->push_back( osg::Vec3d(-60, 60, 0) ); Feature *feature = new Feature(line, s_mapNode->getMapSRS(), Style(), s_fid++); s_source->insertFeature( feature ); s_activeFeature = feature; s_root = new osg::Group; s_root->addChild( s_mapNode.get() ); Session* session = new Session(s_mapNode->getMap(), styleSheet, s_source.get()); FeatureModelGraph* graph = new FeatureModelGraph( session, FeatureModelSourceOptions(), new GeomFeatureNodeFactory() ); graph->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); graph->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF); s_root->addChild( graph ); //Setup the controls ControlCanvas* canvas = ControlCanvas::get( &viewer ); s_root->addChild( canvas ); Grid *toolbar = createToolBar( ); canvas->addControl( toolbar ); canvas->setNodeMask( 0x1 << 1 ); int col = 0; LabelControl* addVerts = new LabelControl("Add Verts"); toolbar->setControl(col++, 0, addVerts ); addVerts->addEventHandler( new AddVertsModeHandler( graph )); LabelControl* edit = new LabelControl("Edit"); toolbar->setControl(col++, 0, edit ); edit->addEventHandler(new EditModeHandler( graph )); unsigned int row = 0; Grid *styleBar = createToolBar( ); styleBar->setPosition(0, 50); canvas->addControl( styleBar ); //Make a list of styles styleBar->setControl(0, row++, new LabelControl("Styles") ); unsigned int numStyles = 8; for (unsigned int i = 0; i < numStyles; ++i) { float w = 50; osg::Vec4 color = randomColor(); float widths[3] = {2, 4, 8}; unsigned int r = row++; for (unsigned int j = 0; j < 3; j++) { Control* l = new Control(); l->setBackColor( color ); l->addEventHandler(new ChangeStyleHandler(graph, buildStyleSheet( color, widths[j] ) )); l->setSize(w,5 * widths[j]); styleBar->setControl(j, r, l); } } viewer.setSceneData( s_root.get() ); viewer.setCameraManipulator( new EarthManipulator() ); if ( s_mapNode ) viewer.getCamera()->addCullCallback( new osgEarth::Util::AutoClipPlaneCullCallback(s_mapNode) ); // add some stock OSG handlers: viewer.addEventHandler(new osgViewer::StatsHandler()); viewer.addEventHandler(new osgViewer::WindowSizeHandler()); viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet())); return viewer.run(); }