From 7409820a8f7d51bfdedd11f852beac2212d7565b Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 18 Jan 2016 11:50:07 +0000 Subject: [PATCH] Added Simplifier::requiresDownSampling()/requiresDownSamplingImplementation() to make it possible for the Simplfifer::ContinueSimplificationCallback to be able to decide whether up or downsampling is required, removing the previous hardwards reliance on getSampleRatio<1.0. --- include/osgUtil/Simplifier | 15 +++++++++++++++ src/osgUtil/Simplifier.cpp | 7 +++++-- 2 files changed, 20 insertions(+), 2 deletions(-) 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()) &&