From 0bce843960540147cdca2429a8a9dad9e4851187 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 16 Oct 2001 14:24:38 +0000 Subject: [PATCH] Completed implementation of a the new CombineLODsVisitor, ideal for use with the .flt loader. Code is stuff currently in sgv, but will be moved out once more testing has been done. --- src/Demos/sgv/sgv.cpp | 109 +++++++++++++++++++++++++++++------------- 1 file changed, 76 insertions(+), 33 deletions(-) diff --git a/src/Demos/sgv/sgv.cpp b/src/Demos/sgv/sgv.cpp index 172c4fe2a..a99c772c4 100644 --- a/src/Demos/sgv/sgv.cpp +++ b/src/Demos/sgv/sgv.cpp @@ -227,7 +227,10 @@ class CombineLODsVisitor : public osg::NodeVisitor { for(int i=0;i RangeLODMap; + typedef std::set LODSet; - typedef std::multimap CenterLODMap; - typedef std::set NodeSet; - CenterLODMap centerLODMap; - NodeSet otherChildren; + LODSet lodChildren; for(int i=0;igetNumChildren();++i) { @@ -255,33 +254,76 @@ class CombineLODsVisitor : public osg::NodeVisitor osg::LOD* lod = dynamic_cast(child); if (lod) { - centerLODMap.insert(std::pair(lod->getCenter(),lod)); - } - else - { - otherChildren.insert(child); + if (lod->getNumRanges()-1==lod->getNumChildren()) + { + lodChildren.insert(lod); + } + else + { + // wonky LOD, numRanges should = numChildren+1 + } } } - cout << "Group "<=2) { - cout << " center ("<first<<")"; - osg::LOD* lod = clod_itr->second; - for(int i=0;igetNumRanges();++i) + osg::BoundingBox bb; + LODSet::iterator lod_itr; + for(lod_itr=lodChildren.begin(); + lod_itr!=lodChildren.end(); + ++lod_itr) { - cout << ", "<< lod->getRange(i); - } - cout <getCenter()); + } + if (bb.radius()<1e-2) + { + typedef std::pair RangePair; + typedef std::multimap RangeMap; + RangeMap rangeMap; + float maxRange = 0.0f; + for(lod_itr=lodChildren.begin(); + lod_itr!=lodChildren.end(); + ++lod_itr) + { + + osg::LOD* lod = *lod_itr; + for(int i=0;igetNumRanges()-1;++i) + { + if (maxRangegetRange(i+1)) maxRange = lod->getRange(i+1); + rangeMap.insert(RangeMap::value_type(RangePair(lod->getRange(i),lod->getRange(i+1)),lod->getChild(i))); + } + + } + + // create new LOD containing all other LOD's children. + osg::LOD* newLOD = new osg::LOD; + newLOD->setName("newLOD"); + newLOD->setCenter(bb.center()); + + int i=0; + for(RangeMap::iterator c_itr=rangeMap.begin(); + c_itr!=rangeMap.end(); + ++c_itr,++i) + { + newLOD->setRange(i,c_itr->first.first); + newLOD->addChild(c_itr->second); + } + newLOD->setRange(i,maxRange); + + // add LOD into parent. + group->addChild(newLOD); + + // remove all the old LOD's from group. + for(lod_itr=lodChildren.begin(); + lod_itr!=lodChildren.end(); + ++lod_itr) + { + group->removeChild(*lod_itr); + } + + } + } } _groupList.clear(); @@ -419,7 +461,11 @@ int main( int argc, char **argv ) rootnode->accept(osv); osv.optimize(); #endif -/* + + CombineLODsVisitor clv; + rootnode->accept(clv); + clv.combineLODs(); + FlattenStaticTransformsVisitor fstv; rootnode->accept(fstv); fstv.removeTransforms(); @@ -428,10 +474,7 @@ int main( int argc, char **argv ) rootnode->accept(rrnv); rrnv.removeRedundentNodes(); - CombineLODsVisitor clv; - rootnode->accept(clv); - clv.combineLODs(); -*/ + // initialize the viewer. osgGLUT::Viewer viewer; viewer.addViewport( rootnode );