diff --git a/components/sceneutil/optimizer.cpp b/components/sceneutil/optimizer.cpp index 812a5ae6a..7b37564eb 100644 --- a/components/sceneutil/optimizer.cpp +++ b/components/sceneutil/optimizer.cpp @@ -1031,15 +1031,14 @@ bool isAbleToMerge(const osg::Geometry& g1, const osg::Geometry& g2) return true; } -bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) + +bool Optimizer::MergeGeometryVisitor::mergeGroup(osg::Group& group) { - if (!isOperationPermissibleForObject(&geode)) return false; + if (!isOperationPermissibleForObject(&group)) return false; - if (geode.getNumDrawables()>=2) + if (group.getNumChildren()>=2) { - // OSG_NOTICE<<"Before "< DuplicateList; typedef std::vector< osg::ref_ptr > DrawableList; typedef std::map GeometryDuplicateMap; @@ -1050,9 +1049,9 @@ bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) DrawableList standardDrawables; unsigned int i; - for(i=0;iasDrawable(); if (drawable) { osg::Geometry* geom = drawable->asGeometry(); @@ -1194,27 +1193,6 @@ bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) if (needToDoMerge) { - // first take a reference to all the drawables to prevent them being deleted prematurely - typedef std::vector< osg::ref_ptr > DrawableList; - DrawableList keepDrawables; - keepDrawables.resize(geode.getNumDrawables()); - for(i=0; iget()); - } - // now do the merging of geometries for(MergeList::iterator mitr = mergeList.begin(); mitr != mergeList.end(); @@ -1224,18 +1202,15 @@ bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) if (duplicateList.size()>1) { osg::Geometry* lhs = duplicateList.front(); - geode.addDrawable(lhs); for(DuplicateList::iterator ditr = duplicateList.begin()+1; ditr != duplicateList.end(); ++ditr) { mergeGeometry(*lhs,**ditr); + + group.removeChild(*ditr); } } - else if (duplicateList.size()>0) - { - geode.addDrawable(duplicateList.front()); - } } } @@ -1285,16 +1260,17 @@ bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) } #endif - // OSG_NOTICE<<"After "<asGeometry(); + osg::Drawable* drawable = group.getChild(i)->asDrawable(); + if (!drawable) + continue; + osg::Geometry* geom = drawable->asGeometry(); if (geom) { osg::Geometry::PrimitiveSetList& primitives = geom->getPrimitiveSetList(); @@ -1319,9 +1295,12 @@ bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) } // now merge any compatible primitives. - for(i=0;iasGeometry(); + osg::Drawable* drawable = group.getChild(i)->asDrawable(); + if (!drawable) + continue; + osg::Geometry* geom = drawable->asGeometry(); if (geom) { if (geom->getNumPrimitiveSets()>0 && diff --git a/components/sceneutil/optimizer.hpp b/components/sceneutil/optimizer.hpp index b43a339ca..e6ae6768b 100644 --- a/components/sceneutil/optimizer.hpp +++ b/components/sceneutil/optimizer.hpp @@ -379,10 +379,10 @@ class Optimizer return _targetMaximumNumberOfVertices; } - virtual void apply(osg::Geode& geode) { mergeGeode(geode); } + virtual void apply(osg::Group& group) { mergeGroup(group); traverse(group); } virtual void apply(osg::Billboard&) { /* don't do anything*/ } - bool mergeGeode(osg::Geode& geode); + bool mergeGroup(osg::Group& group); static bool geometryContainsSharedArrays(osg::Geometry& geom);