diff --git a/src/osgUtil/Simplifier.cpp b/src/osgUtil/Simplifier.cpp index d76150a42..7b12400f9 100644 --- a/src/osgUtil/Simplifier.cpp +++ b/src/osgUtil/Simplifier.cpp @@ -33,6 +33,15 @@ struct dereference_less } }; +template +bool dereference_check_less(const T& lhs,const T& rhs) +{ + if (lhs==rhs) return false; + if (!lhs) return true; + if (!rhs) return false; + return *lhs < *rhs; +} + struct dereference_clear { template @@ -238,12 +247,12 @@ public: void copyBackToGeometry(); - typedef std::vector FloatList; - typedef std::set,dereference_less > EdgeSet; - typedef std::set< osg::ref_ptr,dereference_less > PointSet; - typedef std::vector< osg::ref_ptr > PointList; - typedef std::list< osg::ref_ptr > TriangleList; - typedef std::set< osg::ref_ptr > TriangleSet; + typedef std::vector FloatList; + typedef std::set,dereference_less > EdgeSet; + typedef std::set< osg::ref_ptr,dereference_less > PointSet; + typedef std::vector< osg::ref_ptr > PointList; + typedef std::list< osg::ref_ptr > TriangleList; + typedef std::set< osg::ref_ptr > TriangleSet; typedef std::map< osg::ref_ptr, unsigned int, dereference_less > TriangleMap; struct Point : public osg::Referenced @@ -321,11 +330,11 @@ public: // both error metrics are computed if (getErrorMetric()_p1 = points[lowest]; triangle->_p2 = points[(lowest+1)%3]; @@ -549,9 +556,8 @@ public: // find the lowest value point in the list. unsigned int lowest = 0; - if (points[1]_p1 = points[lowest]; triangle->_p2 = points[(lowest+1)%3]; @@ -677,7 +683,7 @@ public: { // osg::notify(osg::NOTICE)<<" addEdge("< edge = new Edge; - if (p1_p1 = p1; edge->_p2 = p2; @@ -740,7 +746,7 @@ public: if (edge->_p1==pOriginal) edge->_p1=pNew; if (edge->_p2==pOriginal) edge->_p2=pNew; - if (edge->_p2 < edge->_p1) + if (dereference_check_less(edge->_p2,edge->_p1)) { edge->_p1.swap(edge->_p2); } @@ -1653,10 +1659,19 @@ void EdgeCollapse::copyBackToGeometry() _geometry->getVertexAttribArray(vi)->accept(copyArrayToPoints); } - osg::DrawElementsUInt* primitives = new osg::DrawElementsUInt(GL_TRIANGLES,_triangleSet.size()*3); + typedef std::set< osg::ref_ptr, dereference_less > TrianglesSorted; + TrianglesSorted trianglesSorted; + for(TriangleSet::iterator itr = _triangleSet.begin(); + itr != _triangleSet.end(); + ++itr) + { + trianglesSorted.insert(*itr); + } + + osg::DrawElementsUInt* primitives = new osg::DrawElementsUInt(GL_TRIANGLES,trianglesSorted.size()*3); unsigned int pos = 0; - for(TriangleSet::iterator titr=_triangleSet.begin(); - titr!=_triangleSet.end(); + for(TrianglesSorted::iterator titr=trianglesSorted.begin(); + titr!=trianglesSorted.end(); ++titr) { const Triangle* triangle = (*titr).get();