source: experimental/TerrainTest/ReaderWriterTerrainMod.cpp @ 284

Last change on this file since 284 was 284, checked in by Torben Dannhauer, 13 years ago
File size: 2.4 KB
Line 
1#include "ReaderWriterTerrainMod.h"
2#include <osg/KdTree>
3
4ReaderWriterTerrainMod::ReaderWriterTerrainMod()
5{
6        supportsExtension( "terrainmod", "Terrain modification pseudo loader");
7
8        extensionToAdd = ".terrainmod";
9}
10
11ReaderWriterTerrainMod::ReadResult ReaderWriterTerrainMod::readNode( const std::string& file, const osgDB::ReaderWriter::Options* options) const
12{
13        // Check if its a valid file for this pseudo loader
14        std::string ext = osgDB::getLowerCaseFileExtension( file );
15        if( !acceptsExtension(ext) )
16                return ReadResult::FILE_NOT_HANDLED;
17
18        // Strip the pseudo-loader extension
19    std::string realName = osgDB::getNameLessExtension( file );
20
21        // check if stripped file exists
22        std::string fileName = osgDB::findDataFile( realName, options );
23        if( fileName.empty() )
24                return ReadResult::FILE_NOT_FOUND;
25
26        // Check and postphone KdTree creation
27        bool doKdTreeBuilder = (options && options->getBuildKdTreesHint()!=Options::NO_PREFERENCE) ?
28                options->getBuildKdTreesHint() == Options::BUILD_KDTREES :
29                                osgDB::Registry::instance()->getBuildKdTreesHint() == Options::BUILD_KDTREES;
30        // TODO: Modify passed option or create option with Options::DO_NOT_BUILD_KDTREES
31        if(!options)
32                options = new osgDB::ReaderWriter::Options();
33        options->setBuildKdTreesHint(Options::DO_NOT_BUILD_KDTREES);
34         
35
36
37        // Load real file
38        osg::Node *node = osgDB::readNodeFile( fileName, options );
39    if( !node )
40    {
41        // propagate the read failure upwards
42        OSG_WARN << "Subfile \"" << fileName << "\" could not be loaded" << std::endl;
43        return ReadResult::FILE_NOT_HANDLED;
44    }
45
46        // Traverse through loaded graph and
47        // a) check for PagedLOD and modify all filenames of external references
48        // b) modify tile if it is inside a modification ROI
49        // This ensures ensures that higher LODs are loaded via terrainmod pseudo loader as well.
50        ModificationVisitor modVisitor(extensionToAdd);
51        node->accept( modVisitor );
52
53        // Finally create KdTree
54        if(doKdTreeBuilder)
55        {
56                OSG_WARN << "Building KdTree" << std::endl;
57                osg::ref_ptr<osg::KdTreeBuilder> builder = osgDB::Registry::instance()->getKdTreeBuilder();
58                node->accept(*builder);
59        }
60        else OSG_WARN << "No KdTree" << std::endl;
61
62
63        return node;
64}
65
66// Add ourself to the Registry to instantiate the reader/writer.
67REGISTER_OSGPLUGIN(terrainmod, ReaderWriterTerrainMod)
Note: See TracBrowser for help on using the repository browser.