#include "ReaderWriterTerrainMod.h" #include ReaderWriterTerrainMod::ReaderWriterTerrainMod() { supportsExtension( "terrainmod", "Terrain modification pseudo loader"); //supportsExtension( "*", "Terrain modification pseudo loader"); extensionToAdd = ".terrainmod"; } ReaderWriterTerrainMod::ReadResult ReaderWriterTerrainMod::readNode( const std::string& file, const osgDB::ReaderWriter::Options* options) const { // Check if its a valid file for this pseudo loader std::string ext = osgDB::getLowerCaseFileExtension( file ); if( !acceptsExtension(ext) ) return ReadResult::FILE_NOT_HANDLED; // Strip the pseudo-loader extension std::string realName = osgDB::getNameLessExtension( file ); // check if stripped file exists std::string fileName = osgDB::findDataFile( realName, options ); if( fileName.empty() ) return ReadResult::FILE_NOT_FOUND; // Check and postphone KdTree creation bool doKdTreeBuilder = (options && options->getBuildKdTreesHint()!=Options::NO_PREFERENCE) ? options->getBuildKdTreesHint() == Options::BUILD_KDTREES : osgDB::Registry::instance()->getBuildKdTreesHint() == Options::BUILD_KDTREES; // If options are available: Save it'S original KdTree Hint. Options::BuildKdTreesHint originalHint = Options::NO_PREFERENCE; if(options) { originalHint = options->getBuildKdTreesHint(); const_cast(options)->setBuildKdTreesHint(Options::DO_NOT_BUILD_KDTREES); } // Load real file osg::Node *node = osgDB::readNodeFile( fileName, options ); if( !node ) { // propagate the read failure upwards OSG_WARN << "Subfile \"" << fileName << "\" could not be loaded" << std::endl; return ReadResult::FILE_NOT_HANDLED; } // Traverse through loaded graph and // a) check for PagedLOD and modify all filenames of external references // b) modify tile if it is inside a modification ROI // This ensures ensures that higher LODs are loaded via terrainmod pseudo loader as well. ModificationVisitor modVisitor(extensionToAdd); node->accept( modVisitor ); // Finally create KdTree and restore options if(doKdTreeBuilder) { osg::ref_ptr builder = osgDB::Registry::instance()->getKdTreeBuilder(); node->accept(*builder); } // Restore original KdTree Hint if(options) const_cast(options)->setBuildKdTreesHint(originalHint); return node; } // Add ourself to the Registry to instantiate the reader/writer. REGISTER_OSGPLUGIN(terrainmod, ReaderWriterTerrainMod)