diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index a64167ae3..b196127d3 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -120,7 +121,7 @@ void Optimizer::optimize(osg::Node* node, unsigned int options) osg::notify(osg::NOTICE)<tick(); + MergeGeodesVisitor visitor; node->accept(visitor); + + osg::Timer_t endTick = osg::Timer::instance()->tick(); + + osg::notify(osg::INFO)<<"MERGE_GEODES took "<delta_s(startTick,endTick)<tick(); + MergeGeometryVisitor mgv(this); mgv.setTargetMaximumNumberOfVertices(10000); node->accept(mgv); + + osg::Timer_t endTick = osg::Timer::instance()->tick(); + + osg::notify(osg::INFO)<<"MERGE_GEOMETRY took "<delta_s(startTick,endTick)< DuplicateList; - typedef std::map GeodeDuplicateMap; + typedef std::vector< osg::Geode* > DuplicateList; + typedef std::map GeodeDuplicateMap; + + unsigned int i; + osg::NodeList children; + children.resize(group.getNumChildren()); + for (i=0; i(child); geodeDuplicateMap[geode].push_back(geode); } + else + { + // not a geode so just add back into group as its a normal child + group.addChild(child); + } } + // if no geodes then just return. if (geodeDuplicateMap.empty()) return false; - // osg::notify(osg::NOTICE)<<"mergeGeodes in group '"<second.size()<second.size()>1) { osg::Geode* lhs = itr->second[0]; + + // add geode back into group + group.addChild(lhs); + for(DuplicateList::iterator dupItr=itr->second.begin()+1; dupItr!=itr->second.end(); ++dupItr) { osg::Geode* rhs = *dupItr; - - if (mergeGeode(*lhs,*rhs)) - { - group.removeChild(rhs); - - static int co = 0; - osg::notify(osg::INFO)<<"merged and removed Geode "<<++co<second[0]; + + // add geode back into group + group.addChild(lhs); } }