bool CacheSeed::cacheTile(const MapFrame& mapf, const TileKey& key ) const { bool gotData = false; for( ImageLayerVector::const_iterator i = mapf.imageLayers().begin(); i != mapf.imageLayers().end(); i++ ) { ImageLayer* layer = i->get(); if ( layer->isKeyValid( key ) ) { GeoImage image = layer->createImage( key ); if ( image.valid() ) gotData = true; } } if ( mapf.elevationLayers().size() > 0 ) { osg::ref_ptr<osg::HeightField> hf; mapf.getHeightField( key, false, hf ); if ( hf.valid() ) gotData = true; } return gotData; }
void StreamingTerrainNode::updateTaskServiceThreads( const MapFrame& mapf ) { //Get the maximum elevation weight float elevationWeight = 0.0f; for (ElevationLayerVector::const_iterator itr = mapf.elevationLayers().begin(); itr != mapf.elevationLayers().end(); ++itr) { ElevationLayer* layer = itr->get(); float w = layer->getElevationLayerOptions().loadingWeight().value(); if (w > elevationWeight) elevationWeight = w; } float totalImageWeight = 0.0f; for (ImageLayerVector::const_iterator itr = mapf.imageLayers().begin(); itr != mapf.imageLayers().end(); ++itr) { totalImageWeight += itr->get()->getImageLayerOptions().loadingWeight().value(); } float totalWeight = elevationWeight + totalImageWeight; if (elevationWeight > 0.0f) { //Determine how many threads each layer gets int numElevationThreads = (int)osg::round((float)_numLoadingThreads * (elevationWeight / totalWeight )); OE_INFO << LC << "Elevation Threads = " << numElevationThreads << std::endl; getElevationTaskService()->setNumThreads( numElevationThreads ); } for (ImageLayerVector::const_iterator itr = mapf.imageLayers().begin(); itr != mapf.imageLayers().end(); ++itr) { const TerrainLayerOptions& opt = itr->get()->getImageLayerOptions(); int imageThreads = (int)osg::round((float)_numLoadingThreads * (opt.loadingWeight().value() / totalWeight )); OE_INFO << LC << "Image Threads for " << itr->get()->getName() << " = " << imageThreads << std::endl; getImageryTaskService( itr->get()->getUID() )->setNumThreads( imageThreads ); } }