diff --git a/src/osgUtil/Simplifier.cpp b/src/osgUtil/Simplifier.cpp index 992211479..caaf3eaaa 100644 --- a/src/osgUtil/Simplifier.cpp +++ b/src/osgUtil/Simplifier.cpp @@ -20,7 +20,6 @@ #include #include -#include using namespace osgUtil; @@ -34,6 +33,16 @@ struct dereference_less } }; +struct dereference_clear +{ + template + inline void operator() (const T& t) + { + T& non_const_t = const_cast(t); + return non_const_t->clear(); + } +}; + class EdgeCollapse { public: @@ -45,7 +54,7 @@ public: EdgeCollapse() {} - ~EdgeCollapse() {} + ~EdgeCollapse(); void setGeometry(osg::Geometry* geometry); osg::Geometry* getGeometry() { return _geometry; } @@ -62,7 +71,7 @@ public: if (p1==0 || p2==0) { - std::cout<<"Error computeInterpolatedPoint("<_p1 || !edge->_p2) { - std::cout<<"Error updateErrorMetricForEdge("<(itr->get()); + Edge* edge = const_cast(_edgeSet.begin()->get()); - // if (!edge->isAdjacentToBoundary()) - { - osg::ref_ptr pNew = edge->_proposedPoint.valid()? edge->_proposedPoint : computeInterpolatedPoint(edge,0.5f); - if (collapseEdge(edge,pNew.get())) return true; - } - } + if (edge->getErrorMetric()==FLT_MAX) return false; + + osg::ref_ptr pNew = edge->_proposedPoint.valid()? edge->_proposedPoint : computeInterpolatedPoint(edge,0.5f); + return (collapseEdge(edge,pNew.get())); } return false; } @@ -199,6 +202,12 @@ public: FloatList _attributes; TriangleSet _triangles; + void clear() + { + _attributes.clear(); + _triangles.clear(); + } + bool operator < ( const Point& rhs) const { if (_vertex < rhs._vertex) return true; @@ -229,6 +238,13 @@ public: { Edge(): _errorMetric(0.0f), _maximumDeviation(1.0f) {} + void clear() + { + _p1 = 0; + _p2 = 0; + _triangles.clear(); + } + osg::ref_ptr _p1; osg::ref_ptr _p2; @@ -289,7 +305,7 @@ public: void updateMaxNormalDeviationOnEdgeCollapse() { - //std::cout<<"updateMaxNormalDeviationOnEdgeCollapse()"<_triangles.begin(); itr1!=_p1->_triangles.end(); @@ -319,6 +335,17 @@ public: { Triangle() {} + void clear() + { + _p1 = 0; + _p2 = 0; + _p3 = 0; + + _e1 = 0; + _e2 = 0; + _e3 = 0; + } + inline bool operator < (const Triangle& rhs) const { if (_p1 < rhs._p1) return true; @@ -411,7 +438,7 @@ public: Triangle* addTriangle(unsigned int p1, unsigned int p2, unsigned int p3) { - //std::cout<<"addTriangle("<_p1)) { - std::cout<<"testTriangle("<_p1->_triangles.count(triangle)==0) { - std::cout<<"testTriangle("<_triangles does not contain triangle"<_triangles does not contain triangle"<_p2)) { - std::cout<<"testTriangle("<_p2->_triangles.count(triangle)==0) { - std::cout<<"testTriangle("<_triangles does not contain triangle"<_triangles does not contain triangle"<_p3)) { - std::cout<<"testTriangle("<_p3->_triangles.count(triangle)==0) { - std::cout<<"testTriangle("<_triangles does not contain triangle"<_triangles does not contain triangle"<_e1.get())) { ++result; - std::cout<<"testTriangle("<_e2.get())) { ++result; - std::cout<<"testTriangle("<_e3.get())) { - std::cout<<"testTriangle("< edge = new Edge; if (p1_p1="<_p1.get()<<" _p2="<_p2.get()<_p1="<_p1.get()<<" _p2="<_p2.get()<_p1="<_p1.get()<<" _p2="<_p2.get()<_p1="<_p1.get()<<" _p2="<_p2.get()<getMaxNormalDeviationOnEdgeCollapse()>1.0) { -// std::cout<<"collapseEdge("<getMaxNormalDeviationOnEdgeCollapse() = "<getMaxNormalDeviationOnEdgeCollapse()<getMaxNormalDeviationOnEdgeCollapse() = "<getMaxNormalDeviationOnEdgeCollapse()<getMaxNormalDeviationOnEdgeCollapse() = "<getMaxNormalDeviationOnEdgeCollapse()<getMaxNormalDeviationOnEdgeCollapse() = "<getMaxNormalDeviationOnEdgeCollapse()<(titr_p2->get())); } - //std::cout<<" pNew="<_triangles.begin(); teitr!=edge->_triangles.end(); ++teitr) { Triangle* triangle = const_cast(teitr->get()); - //std::cout<<" edge removed T("<_p1.get()<<"\t"<_p2.get()<<"\t"<_p3.get()<<")"<_p1.get()<<"\t"<_p2.get()<<"\t"<_p3.get()<<")"<get()<<")"<get()<<")"<(itr->get())); } @@ -849,17 +876,17 @@ public: Triangle* triangle = const_cast(teitr->get()); if (!(triangle->_e1 == edge || triangle->_e2 == edge || triangle->_e3 == edge)) { - std::cout<<"testEdge("<_e1=="<_e1.get()<_e2=="<_e2.get()<_e3=="<_e3.get()<_e1=="<_e1.get()<_e2=="<_e2.get()<_e3=="<_e3.get()<_triangles.empty()) { - std::cout<<"testEdge("<(itr->get()); - //std::cout<<" reusePoint("<_triangles.insert(triangle); @@ -942,10 +969,10 @@ public: Triangle* triangle = const_cast(itr->get()); if (!(triangle->_p1 == point || triangle->_p2 == point || triangle->_p3 == point)) { - std::cout<<"testPoint("<_p1 "<_p1.get()<_p2 "<_p2.get()<_p3 "<_p3.get()<_p1 "<_p1.get()<_p2 "<_p2.get()<_p3 "<_p3.get()< > ArrayList; osg::Geometry* _geometry; - ArrayList _arrayList; EdgeSet _edgeSet; TriangleSet _triangleSet; @@ -996,6 +1022,16 @@ struct CollectTriangleOperator }; +EdgeCollapse::~EdgeCollapse() +{ + for_each(_edgeSet.begin(),_edgeSet.end(),dereference_clear()); + + for_each(_triangleSet.begin(),_triangleSet.end(),dereference_clear()); + for_each(_pointSet.begin(),_pointSet.end(),dereference_clear()); + for_each(_originalPointList.begin(),_originalPointList.end(),dereference_clear()); +} + + typedef osg::TriangleIndexFunctor CollectTriangleIndexFunctor; class CopyArrayToPointsVisitor : public osg::ArrayVisitor @@ -1421,7 +1457,7 @@ Simplifier::Simplifier(float sampleRatio, float maximumError): void Simplifier::simplify(osg::Geometry& geometry) { - std::cout<<"++++++++++++++simplifier************"<getErrorMetric() , numOriginalPrimitives, ec._triangleSet.size()) && ec.collapseMinimumErrorEdge()) { - std::cout<<"Collapsed edge ec._triangleSet.size()="<