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 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(); }