virtual void apply(osg::PagedLOD& node) { //The PagedLOD node will contain two filenames, the first is empty and is the actual geometry of the //tile and the second is the filename of the next tile. if (node.getNumFileNames() > 1) { //Get the child filename const std::string &filename = node.getFileName(1); if (osgEarth::Registry::instance()->isBlacklisted(filename)) { //If the tile is blacklisted, we set the actual geometry, child 0, to always display //and the second child to never display node.setRange(0, 0, FLT_MAX); node.setRange(1, FLT_MAX, FLT_MAX); } else { //If the child is not blacklisted, it is possible that it could have been blacklisted previously so reset the //ranges of both the first and second children. This gives the second child another //chance to be traversed in case a layer was added that might have data. osg::ref_ptr< MapNode::TileRangeData > ranges = static_cast< MapNode::TileRangeData* >(node.getUserData()); if (ranges) { node.setRange(0, ranges->_minRange, ranges->_maxRange); node.setRange(1, 0, ranges->_minRange); } } } traverse(node); }
void ShaderGenerator::apply(osg::PagedLOD& node) { if ( !_active ) return; bool ignore; if ( node.getUserValue(SHADERGEN_HINT_IGNORE, ignore) && ignore ) return; for( unsigned i=0; i<node.getNumFileNames(); ++i ) { static Threading::Mutex s_mutex; s_mutex.lock(); const std::string& filename = node.getFileName( i ); if (!filename.empty() && osgDB::getLowerCaseFileExtension(filename).compare(SHADERGEN_PL_EXTENSION) != 0 ) { node.setFileName( i, Stringify() << filename << "." << SHADERGEN_PL_EXTENSION ); } s_mutex.unlock(); } apply( static_cast<osg::LOD&>(node) ); }
void PosterVisitor::apply(osg::PagedLOD &node) { if (!hasCullCallback(node.getCullCallback(), g_pagedCullingCallback.get())) { for (unsigned int i = 0; i < node.getNumFileNames(); ++i) { if (node.getFileName(i).empty()) continue; PagedNodeNameSet::iterator itr = _pagedNodeNames.find(node.getFileName(i)); if (itr != _pagedNodeNames.end()) { node.addCullCallback(g_pagedCullingCallback.get()); _appliedCount++; } break; } } else if (!_addingCallbacks) { node.removeCullCallback(g_pagedCullingCallback.get()); if (_appliedCount > 0) _appliedCount--; } traverse(node); }
void apply(osg::PagedLOD& plod) { if (s_ExitApplication) return; ++_currentLevel; initBound(); // first compute the bounds of this subgraph for(unsigned int i=0; i<plod.getNumFileNames(); ++i) { if (plod.getFileName(i).empty()) { traverse(plod); } } if (intersects()) { for(unsigned int i=0; i<plod.getNumFileNames(); ++i) { osg::notify(osg::INFO)<<" filename["<<i<<"] "<<plod.getFileName(i)<<std::endl; if (!plod.getFileName(i).empty()) { std::string filename; if (!plod.getDatabasePath().empty()) { filename = plod.getDatabasePath() + plod.getFileName(i); } else { filename = plod.getFileName(i); } osg::ref_ptr<osg::Node> node = readNodeFileAndWriteToCache(filename); if (!s_ExitApplication && node.valid()) node->accept(*this); } } } --_currentLevel; }
void ShaderGenerator::apply(osg::PagedLOD& node) { if ( !_active ) return; for( unsigned i=0; i<node.getNumFileNames(); ++i ) { const std::string& filename = node.getFileName( i ); if (!filename.empty() && osgDB::getLowerCaseFileExtension(filename).compare(SHADERGEN_PL_EXTENSION) != 0 ) { node.setFileName( i, Stringify() << filename << "." << SHADERGEN_PL_EXTENSION ); } } apply( static_cast<osg::LOD&>(node) ); }
void IntersectionVisitor::apply(osg::PagedLOD& plod) { if (!enter(plod)) return; if (plod.getNumFileNames()>0) { #if 1 // Identify the range value for the highest res child float targetRangeValue; if( plod.getRangeMode() == osg::LOD::DISTANCE_FROM_EYE_POINT ) targetRangeValue = 1e6; // Init high to find min value else targetRangeValue = 0; // Init low to find max value const osg::LOD::RangeList rl = plod.getRangeList(); osg::LOD::RangeList::const_iterator rit; for( rit = rl.begin(); rit != rl.end(); rit++ ) { if( plod.getRangeMode() == osg::LOD::DISTANCE_FROM_EYE_POINT ) { if( rit->first < targetRangeValue ) targetRangeValue = rit->first; } else { if( rit->first > targetRangeValue ) targetRangeValue = rit->first; } } // Perform an intersection test only on children that display // at the maximum resolution. unsigned int childIndex; for( rit = rl.begin(), childIndex = 0; rit != rl.end(); rit++, childIndex++ ) { if( rit->first != targetRangeValue ) // This is not one of the highest res children continue; osg::ref_ptr<osg::Node> child( NULL ); if( plod.getNumChildren() > childIndex ) child = plod.getChild( childIndex ); if( (!child.valid()) && (_readCallback.valid()) ) { // Child is NULL; attempt to load it, if we have a readCallback... unsigned int validIndex( childIndex ); if (plod.getNumFileNames() <= childIndex) validIndex = plod.getNumFileNames()-1; child = _readCallback->readNodeFile( plod.getDatabasePath() + plod.getFileName( validIndex ) ); } if ( !child.valid() && plod.getNumChildren()>0) { // Child is still NULL, so just use the one at the end of the list. child = plod.getChild( plod.getNumChildren()-1 ); } if (child.valid()) { child->accept(*this); } } #else // older code than above block, that assumes that the PagedLOD is ordered correctly // i.e. low res children first, no duplicate ranges. osg::ref_ptr<osg::Node> highestResChild; if (plod.getNumFileNames() != plod.getNumChildren() && _readCallback.valid()) { highestResChild = _readCallback->readNodeFile( plod.getDatabasePath() + plod.getFileName(plod.getNumFileNames()-1) ); } if ( !highestResChild.valid() && plod.getNumChildren()>0) { highestResChild = plod.getChild( plod.getNumChildren()-1 ); } if (highestResChild.valid()) { highestResChild->accept(*this); } #endif } leave(); }