void MPTerrainEngineNode::createTerrain() { // scrub the heightfield cache. if (_tileModelFactory) _tileModelFactory->getHeightFieldCache()->clear(); // New terrain _terrain = new TerrainNode( _deadTiles.get() ); this->addChild( _terrain ); // Enable blending on the terrain node; this will result in the underlying // "empty" globe being transparent instead of white. if (_terrainOptions.enableBlending().value()) { _terrain->getOrCreateStateSet()->setMode(GL_BLEND , osg::StateAttribute::ON); } // Factory to create the root keys: KeyNodeFactory* factory = getKeyNodeFactory(); // Build the first level of the terrain. // Collect the tile keys comprising the root tiles of the terrain. std::vector< TileKey > keys; _update_mapf->getProfile()->getAllKeysAtLOD( *_terrainOptions.firstLOD(), keys ); // create a root node for each root tile key. OE_INFO << LC << "Creating " << keys.size() << " root keys.." << std::endl; RootTileGroup* root = new RootTileGroup(); _terrain->addChild( root ); osg::ref_ptr<osgDB::Options> dbOptions = Registry::instance()->cloneOrCreateOptions(); for( unsigned i=0; i<keys.size(); ++i ) { osg::ref_ptr<osg::Node> node = factory->createRootNode( keys[i] ); if ( node.valid() ) { root->addRootKey( keys[i], node.get(), _uid, _liveTiles.get(), _deadTiles.get(), dbOptions.get() ); } else { OE_WARN << LC << "Couldn't make tile for root key: " << keys[i].str() << std::endl; } } _rootTilesRegistered = false; updateShaders(); }
void MPTerrainEngineNode::createTerrain() { // scrub the heightfield cache. if (_tileModelFactory) _tileModelFactory->getHeightFieldCache()->clear(); // New terrain _terrain = new TerrainNode( _deadTiles.get() ); this->addChild( _terrain ); // Enable blending on the terrain node; this will result in the underlying // "empty" globe being transparent instead of white. if (_terrainOptions.enableBlending().value()) { _terrain->getOrCreateStateSet()->setMode(GL_BLEND , osg::StateAttribute::ON); } // Factory to create the root keys: KeyNodeFactory* factory = getKeyNodeFactory(); // Build the first level of the terrain. // Collect the tile keys comprising the root tiles of the terrain. std::vector< TileKey > keys; _update_mapf->getProfile()->getAllKeysAtLOD( *_terrainOptions.firstLOD(), keys ); // create a root node for each root tile key. OE_INFO << LC << "Creating root keys (" << keys.size() << ")" << std::flush; for( unsigned i=0; i<keys.size(); ++i ) { osg::Node* node = factory->createRootNode( keys[i] ); OE_INFO_CONTINUE << "." << std::flush; if ( node ) { _terrain->addChild( node ); TileNode* tilenode = osgEarth::findTopMostNodeOfType<TileNode>(node); if ( tilenode ) _liveTiles->add( tilenode ); } else { OE_WARN << LC << "Couldn't make tile for root key: " << keys[i].str() << std::endl; } } OE_INFO_CONTINUE << "done." << std::endl; updateShaders(); }