diff --git a/include/osgUtil/Simplifier b/include/osgUtil/Simplifier index ea7a14038..4b19ec81a 100644 --- a/include/osgUtil/Simplifier +++ b/include/osgUtil/Simplifier @@ -59,6 +59,11 @@ class OSGUTIL_EXPORT Simplifier : public osg::NodeVisitor { return simplifier.continueSimplificationImplementation(nextError, numOriginalPrimitives, numRemainingPrimitives); } + + virtual bool requiresDownSampling(const Simplifier& simplifier) const + { + return simplifier.requiresDownSamplingImplementation(); + } protected: virtual ~ContinueSimplificationCallback() {} @@ -80,7 +85,17 @@ class OSGUTIL_EXPORT Simplifier : public osg::NodeVisitor if (getSampleRatio()<1.0) return ((float)numRemainingPrimitives > ((float)numOriginalPrimitives) * getSampleRatio()) && nextError<=getMaximumError(); else return ((float)numRemainingPrimitives < ((float)numOriginalPrimitives) * getSampleRatio()) && nextError>getMaximumLength(); } + + bool requiresDownSampling() const + { + if (_continueSimplificationCallback.valid()) return _continueSimplificationCallback->requiresDownSampling(*this); + else return requiresDownSamplingImplementation(); + } + virtual bool requiresDownSamplingImplementation() const + { + return getSampleRatio()<1.0; + } virtual void apply(osg::Geode& geode) { diff --git a/src/osgUtil/Simplifier.cpp b/src/osgUtil/Simplifier.cpp index ec2a98b7f..8e883ef99 100644 --- a/src/osgUtil/Simplifier.cpp +++ b/src/osgUtil/Simplifier.cpp @@ -1744,14 +1744,17 @@ void Simplifier::simplify(osg::Geometry& geometry, const IndexList& protectedPoi { OSG_INFO<<"++++++++++++++simplifier************"<=1.0); + ec.setComputeErrorMetricUsingLength(!downSample); ec.setGeometry(&geometry, protectedPoints); ec.updateErrorMetricForAllEdges(); unsigned int numOriginalPrimitives = ec._triangleSet.size(); - if (getSampleRatio()<1.0) + + if (downSample) { while (!ec._edgeSet.empty() && continueSimplification((*ec._edgeSet.begin())->getErrorMetric() , numOriginalPrimitives, ec._triangleSet.size()) &&