Show
Ignore:
Timestamp:
07/14/05 23:04:40 (9 years ago)
Author:
robert
Message:

Updates

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgpagedlod/osgpagedlod.cpp

    r4380 r4385  
    1111#include <osgDB/ReadFile> 
    1212#include <osgDB/WriteFile> 
     13#include <osgDB/FileNameUtils> 
    1314 
    1415#include <osgUtil/Optimizer> 
     
    1617#include <iostream> 
    1718#include <sstream> 
     19 
     20class NameVistor : public osg::NodeVisitor 
     21{ 
     22public: 
     23    NameVistor(): 
     24        osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), 
     25        _count(0) 
     26    { 
     27    } 
     28     
     29    virtual void apply(osg::Node& node) 
     30    { 
     31        std::ostringstream os; 
     32        os << node.className() << "_"<<_count++; 
     33 
     34        node.setName(os.str()); 
     35     
     36        traverse(node); 
     37    }     
     38     
     39    unsigned int _count; 
     40}; 
     41 
     42class CheckVisitor : public osg::NodeVisitor 
     43{ 
     44public: 
     45    CheckVisitor(): 
     46        osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) 
     47    { 
     48    } 
     49     
     50    virtual void apply(osg::PagedLOD& plod) 
     51    { 
     52        std::cout<<"PagedLOD "<<plod.getName()<<"  numRanges = "<< plod.getNumRanges()<<"  numFiles = "<<plod.getNumFileNames()<<std::endl; 
     53        for(unsigned int i=0;i<plod.getNumFileNames();++i) 
     54        { 
     55            std::cout<<"  files = '"<<plod.getFileName(i)<<"'"<<std::endl; 
     56        } 
     57    }     
     58}; 
     59 
    1860 
    1961class WriteOutPagedLODSubgraphsVistor : public osg::NodeVisitor 
     
    4789{ 
    4890public: 
    49     ConvertToPageLODVistor(const std::string& basename, const std::string& extension): 
     91    ConvertToPageLODVistor(const std::string& basename, const std::string& extension, bool makeAllChildrenPaged): 
    5092        osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), 
    5193        _basename(basename), 
    52         _extension(extension) 
     94        _extension(extension), 
     95        _makeAllChildrenPaged(makeAllChildrenPaged) 
    5396    { 
    5497    } 
     
    86129            } 
    87130 
    88             osg::notify(osg::NOTICE)<<"Converting LOD to PagedLOD"<<std::endl; 
     131            if (!_makeAllChildrenPaged && lod->getNumRanges()<2) 
     132            { 
     133                osg::notify(osg::NOTICE)<<"Leaving LOD with one child as is."<<std::endl; 
     134                break; 
     135            } 
     136 
     137            osg::notify(osg::NOTICE)<<"Converting LOD to PagedLOD."<<std::endl; 
    89138             
    90139            osg::PagedLOD* plod = new osg::PagedLOD; 
    91140             
    92141            const osg::LOD::RangeList& originalRangeList = lod->getRangeList(); 
    93             typedef std::map< osg::LOD::MinMaxPair , unsigned int > MinMaxPairMap; 
     142            typedef std::multimap< osg::LOD::MinMaxPair , unsigned int > MinMaxPairMap; 
    94143            MinMaxPairMap rangeMap; 
    95144            unsigned int pos = 0; 
     
    98147                ++ritr, ++pos) 
    99148            { 
    100                 rangeMap[*ritr] = pos; 
     149                rangeMap.insert(std::multimap< osg::LOD::MinMaxPair , unsigned int >::value_type(*ritr, pos)); 
    101150            } 
    102151             
     
    106155                ++mitr, ++pos) 
    107156            { 
    108                 if (pos==0) 
     157                if (pos==0 && !_makeAllChildrenPaged) 
    109158                { 
    110159                    plod->addChild(lod->getChild(mitr->second), mitr->first.first, mitr->first.second); 
    111                    osg::notify(osg::NOTICE)<<"  adding staight child"<<std::endl; 
    112160                } 
    113161                else 
     
    118166                     
    119167                    plod->addChild(lod->getChild(mitr->second), mitr->first.first, mitr->first.second, os.str()); 
    120                    osg::notify(osg::NOTICE)<<"  adding tiled subgraph"<<os.str()<<std::endl; 
    121168                } 
    122169            } 
     
    131178 
    132179            plod->setCenter(plod->getBound().center()); 
    133             plod->setCenter(plod->getBound().center()); 
     180             
    134181 
    135182        } 
     
    141188    std::string _basename; 
    142189    std::string _extension; 
    143  
     190    bool _makeAllChildrenPaged; 
    144191}; 
    145192 
     
    156203    arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ..."); 
    157204    arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information"); 
     205    arguments.getApplicationUsage()->addCommandLineOption("-o","set the output file (defaults to output.ive)"); 
     206    arguments.getApplicationUsage()->addCommandLineOption("--makeAllChildrenPaged","Force all children of LOD to be written out as external PagedLOD children"); 
    158207 
    159208    // if user request help write it out to cout. 
     
    163212        return 1; 
    164213    } 
     214 
     215    std::string outputfile("output.ive"); 
     216    while (arguments.read("-o",outputfile)) {} 
     217     
     218     
     219    bool makeAllChildrenPaged = false; 
     220    while (arguments.read("--makeAllChildrenPaged")) { makeAllChildrenPaged = true; } 
    165221 
    166222    // any option left unread are converted into errors to write out later. 
     
    189245    } 
    190246     
    191     ConvertToPageLODVistor converter("tile",".ive"); 
     247    std::string basename( osgDB::getNameLessExtension(outputfile) ); 
     248    std::string ext = '.'+ osgDB::getFileExtension(outputfile); 
     249     
     250    ConvertToPageLODVistor converter(basename,ext, makeAllChildrenPaged); 
    192251    model->accept(converter); 
    193252    converter.convert(); 
    194253     
     254    NameVistor nameNodes; 
     255    model->accept(nameNodes); 
     256 
     257    //CheckVisitor checkNodes; 
     258    //model->accept(checkNodes); 
     259 
    195260    if (model.valid()) 
    196261    { 
    197         osgDB::writeNodeFile(*model,"tile.ive"); 
     262        osgDB::writeNodeFile(*model,outputfile); 
    198263         
    199264        WriteOutPagedLODSubgraphsVistor woplsv;