#include "ReaderWriterTerrainMod.h" ReaderWriterTerrainMod::ReaderWriterTerrainMod() { supportsExtension( "terrainmod", "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; // 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, check for PagedLOD and modify all filenames of external references // This ensures ensures that higher LODs are loaded via terrainmod pseudo loader as well. ModificationVisitor modVisitor(extensionToAdd); node->accept( modVisitor ); // Modify loaded terrain ReaderWriterTerrainMod* this_unconst = const_cast < ReaderWriterTerrainMod* > (this); this_unconst->modifyTerrain(); return node; } void ReaderWriterTerrainMod::modifyTerrain() { OSG_NOTIFY( osg::ALWAYS ) << "ReaderWriterTerrainMod::modifyTerrain()" << std::endl; // OpenThreads::Thread::microSleep( 500000 ); } // Add ourself to the Registry to instantiate the reader/writer. REGISTER_OSGPLUGIN(terrainmod, ReaderWriterTerrainMod)