From d8d0ac60a7262f20c71f2a9aa875a9fd133ca45a Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 19 Jul 2002 13:49:54 +0000 Subject: [PATCH] Added primitve merging into the osg::Geometry optimizer. --- src/osgUtil/Optimizer.cpp | 140 +++++++++++++++++++++++++++++++++++++- 1 file changed, 138 insertions(+), 2 deletions(-) diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 6b30ff04b..8a5cc537a 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -11,6 +11,7 @@ #include #include +#include using namespace osgUtil; @@ -1213,6 +1214,28 @@ struct LessGeometry } }; +struct LessGeometryPrimitiveType +{ + bool operator() (const osg::Geometry* lhs,const osg::Geometry* rhs) const + { + if (lhs->getNumPrimitives()>0) + { + if (rhs->getNumPrimitives()>0) + { + if (lhs->getPrimitive(0)->getType()getPrimitive(0)->getType()) return true; + else if (rhs->getPrimitive(0)->getType()getPrimitive(0)->getType()) return false; + + if (lhs->getPrimitive(0)->getMode()getPrimitive(0)->getMode()) return true; + else if (rhs->getPrimitive(0)->getMode()getPrimitive(0)->getMode()) return false; + + } + return false; + } + else if (rhs->getNumPrimitives()>0) return true; + return false; + } +}; + bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) { if (geode.getNumDrawables()<2) return false; @@ -1222,7 +1245,8 @@ bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) GeometryDuplicateMap geometryDuplicateMap; - for(unsigned int i=0;i(geode.getDrawable(i)); if (geom) @@ -1239,6 +1263,7 @@ bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) { if (itr->second.size()>1) { + std::sort(itr->second.begin(),itr->second.end(),LessGeometryPrimitiveType()); osg::Geometry* lhs = itr->second[0]; for(DuplicateList::iterator dupItr=itr->second.begin()+1; dupItr!=itr->second.end(); @@ -1256,6 +1281,78 @@ bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) } } + // now merge any compatible primtives. + for(i=0;i(geode.getDrawable(i)); + if (geom) + { + if (geom->getNumPrimitives()>0) + { + osg::Geometry::PrimitiveList& primitives = geom->getPrimitiveList(); + unsigned int primNo=0; + while(primNo+1getType()==rhs->getType() && + lhs->getMode()==rhs->getMode()) + { + + switch(lhs->getMode()) + { + case(osg::Primitive::POINTS): + case(osg::Primitive::LINES): + case(osg::Primitive::TRIANGLES): + case(osg::Primitive::QUADS): + combine = true; + break; + } + + } + + if (combine) + { + switch(lhs->getType()) + { + case(osg::Primitive::DrawArraysPrimitiveType): + combine = mergePrimitive(*(static_cast(lhs)),*(static_cast(rhs))); + break; + case(osg::Primitive::DrawArrayLengthsPrimitiveType): + combine = mergePrimitive(*(static_cast(lhs)),*(static_cast(rhs))); + break; + case(osg::Primitive::DrawElementsUBytePrimitiveType): + combine = mergePrimitive(*(static_cast(lhs)),*(static_cast(rhs))); + break; + case(osg::Primitive::DrawElementsUShortPrimitiveType): + combine = mergePrimitive(*(static_cast(lhs)),*(static_cast(rhs))); + break; + case(osg::Primitive::DrawElementsUIntPrimitiveType): + combine = mergePrimitive(*(static_cast(lhs)),*(static_cast(rhs))); + break; + default: + break; + } + } + if (combine) + { + cout << "found compatible"<