XmlElement::XmlElement( const Config& conf ) { name = conf.key(); for( Properties::const_iterator i = conf.attrs().begin(); i != conf.attrs().end(); i++ ) attrs[i->first] = i->second; for( ConfigSet::const_iterator j = conf.children().begin(); j != conf.children().end(); j++ ) { if (!j->children().empty()) { children.push_back( new XmlElement( *j ) ); } else { addSubElement(j->key(), j->attrs(), j->value()); } } }
XmlElement::XmlElement( const Config& conf ) { name = conf.key(); if ( !conf.value().empty() ) { children.push_back( new XmlText(conf.value()) ); } for( ConfigSet::const_iterator j = conf.children().begin(); j != conf.children().end(); j++ ) { if ( j->isSimple() ) { attrs[j->key()] = j->value(); } else if ( j->children().size() > 0 ) { children.push_back( new XmlElement(*j) ); } } }
osg::Node* EarthFileSerializer2::deserialize( const Config& conf, const std::string& referrer ) const { // First, pre-load any extension DLLs. preloadExtensionLibs(conf); preloadExtensionLibs(conf.child("extensions")); preloadExtensionLibs(conf.child("external")); MapOptions mapOptions( conf.child( "options" ) ); // legacy: check for name/type in top-level attrs: if ( conf.hasValue( "name" ) || conf.hasValue( "type" ) ) { Config legacy; if ( conf.hasValue("name") ) legacy.add( "name", conf.value("name") ); if ( conf.hasValue("type") ) legacy.add( "type", conf.value("type") ); mapOptions.mergeConfig( legacy ); } Map* map = new Map( mapOptions ); // Yes, MapOptions and MapNodeOptions share the same Config node. Weird but true. MapNodeOptions mapNodeOptions( conf.child( "options" ) ); // Create a map node. osg::ref_ptr<MapNode> mapNode = new MapNode( map, mapNodeOptions ); // Read all the elevation layers in FIRST so other layers can access them for things like clamping. for(ConfigSet::const_iterator i = conf.children().begin(); i != conf.children().end(); ++i) { if ( i->key() == "elevation" || i->key() == "heightfield" ) { addElevationLayer( *i, map ); } } // Read the layers in LAST (otherwise they will not benefit from the cache/profile configuration) for(ConfigSet::const_iterator i = conf.children().begin(); i != conf.children().end(); ++i) { if (i->key() == "options" || i->key() == "name" || i->key() == "type" || i->key() == "version") { // nop - handled earlier } else if ( i->key() == "image" ) { addImageLayer( *i, map ); } else if ( i->key() == "model" ) { addModelLayer( *i, map ); } else if ( i->key() == "mask" ) { addMaskLayer( *i, map ); } else if ( i->key() == "external" || i->key() == "extensions" ) { mapNode->externalConfig() = *i; for(ConfigSet::const_iterator e = i->children().begin(); e != i->children().end(); ++e) { addExtension( *e, mapNode.get() ); } } else if ( !isReservedWord(i->key()) ) // plugins/extensions. { addExtension( *i, mapNode.get() ); } } // return the topmost parent of the mapnode. It's possible that // an extension added parents! osg::Node* top = mapNode.release(); while( top->getNumParents() > 0 ) top = top->getParent(0); return top; }
osg::Node* EarthFileSerializer2::deserialize( const Config& conf, const std::string& referrer ) const { // First, pre-load any extension DLLs. preloadExtensionLibs(conf); preloadExtensionLibs(conf.child("extensions")); preloadExtensionLibs(conf.child("external")); MapOptions mapOptions( conf.child( "options" ) ); // legacy: check for name/type in top-level attrs: if ( conf.hasValue( "name" ) || conf.hasValue( "type" ) ) { Config legacy; if ( conf.hasValue("name") ) legacy.add( "name", conf.value("name") ); if ( conf.hasValue("type") ) legacy.add( "type", conf.value("type") ); mapOptions.mergeConfig( legacy ); } osg::ref_ptr< Map > map = new Map( mapOptions ); // Start a batch update of the map: map->beginUpdate(); // Read all the elevation layers in FIRST so other layers can access them for things like clamping. // TODO: revisit this since we should really be listening for elevation data changes and // re-clamping based on that.. for(ConfigSet::const_iterator i = conf.children().begin(); i != conf.children().end(); ++i) { // for backwards compatibility: if (i->key() == "heightfield") { Config temp = *i; temp.key() = "elevation"; addLayer(temp, map); } else if ( i->key() == "elevation" ) // || i->key() == "heightfield" ) { addLayer(*i, map); } } Config externalConfig; std::vector<osg::ref_ptr<Extension> > extensions; // Read the layers in LAST (otherwise they will not benefit from the cache/profile configuration) for(ConfigSet::const_iterator i = conf.children().begin(); i != conf.children().end(); ++i) { if (i->key() == "options" || i->key() == "name" || i->key() == "type" || i->key() == "version") { // nop - handled earlier } #if 0 else if ( i->key() == "image" ) { addImageLayer( *i, map ); } else */if ( i->key() == "model" ) { addModelLayer( *i, map ); } else if ( i->key() == "mask" ) { addMaskLayer( *i, map ); } #endif else if ( i->key() == "external" || i->key() == "extensions" ) { externalConfig = *i; for(ConfigSet::const_iterator e = i->children().begin(); e != i->children().end(); ++e) { Extension* extension = loadExtension(*e); if (extension) extensions.push_back(extension); //addExtension( *e, mapNode.get() ); } } else if ( !isReservedWord(i->key()) ) // plugins/extensions. { // try to add as a plugin Layer first: bool addedLayer = addLayer(*i, map); // failing that, try to load as an extension: if ( !addedLayer ) { Extension* extension = loadExtension(*i); if (extension) extensions.push_back(extension); } } } // Complete the batch update of the map map->endUpdate(); // If any errors occurred, report them now. reportErrors(map); // Yes, MapOptions and MapNodeOptions share the same Config node. Weird but true. MapNodeOptions mapNodeOptions( conf.child("options") ); // Create a map node. osg::ref_ptr<MapNode> mapNode = new MapNode( map, mapNodeOptions ); // Apply the external conf if there is one. if (!externalConfig.empty()) { mapNode->externalConfig() = externalConfig; } // Install the extensions for (unsigned i = 0; i < extensions.size(); ++i) { mapNode->addExtension(extensions[i].get()); } // return the topmost parent of the mapnode. It's possible that // an extension added parents! osg::Node* top = mapNode.release(); while( top->getNumParents() > 0 ) top = top->getParent(0); return top; }