Added support for using the error metric to guide the simplficiation process
This commit is contained in:
@@ -28,11 +28,47 @@ class OSGUTIL_EXPORT Simplifier : public osg::NodeVisitor
|
||||
{
|
||||
public:
|
||||
|
||||
Simplifier(float sampleRatio=0.5f);
|
||||
Simplifier(float sampleRatio=1.0f, float maximumError=0.0f);
|
||||
|
||||
|
||||
void setSampleRatio(float sampleRatio) { _sampleRatio = sampleRatio; }
|
||||
float getSampleRatio() const { return _sampleRatio; }
|
||||
|
||||
void setMaximumError(float error) { _maximumError = error; }
|
||||
float getMaximumError() const { return _maximumError; }
|
||||
|
||||
|
||||
class ContinueSimplificationCallback : public osg::Referenced
|
||||
{
|
||||
public:
|
||||
/** return true if mesh should be continued to be simplified, return false to stop simplification.*/
|
||||
virtual bool continueSimplification(const Simplifier& simplifier, float nextError, unsigned int numOriginalPrimitives, unsigned int numRemainingPrimitives) const
|
||||
{
|
||||
return simplifier.continueSimplificationImplementation(nextError, numOriginalPrimitives, numRemainingPrimitives);
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual ~ContinueSimplificationCallback() {}
|
||||
};
|
||||
|
||||
void setContinueSimplificationCallback(ContinueSimplificationCallback* cb) { _continueSimplificationCallback = cb; }
|
||||
ContinueSimplificationCallback* getContinueSimplificationCallback() { return _continueSimplificationCallback.get(); }
|
||||
const ContinueSimplificationCallback* getContinueSimplificationCallback() const { return _continueSimplificationCallback.get(); }
|
||||
|
||||
|
||||
bool continueSimplification(float nextError, unsigned int numOriginalPrimitives, unsigned int numRemainingPrimitives) const
|
||||
{
|
||||
if (_continueSimplificationCallback.valid()) return _continueSimplificationCallback->continueSimplification(*this, nextError, numOriginalPrimitives, numRemainingPrimitives);
|
||||
else return continueSimplificationImplementation(nextError, numOriginalPrimitives, numRemainingPrimitives);
|
||||
}
|
||||
|
||||
virtual bool continueSimplificationImplementation(float nextError, unsigned int numOriginalPrimitives, unsigned int numRemainingPrimitives) const
|
||||
{
|
||||
if (nextError<=getMaximumError()) return true;
|
||||
return (float)numRemainingPrimitives > (float)numOriginalPrimitives * getSampleRatio();
|
||||
}
|
||||
|
||||
|
||||
virtual void apply(osg::Geode& geode)
|
||||
{
|
||||
for(unsigned int i=0;i<geode.getNumDrawables();++i)
|
||||
@@ -40,20 +76,21 @@ class OSGUTIL_EXPORT Simplifier : public osg::NodeVisitor
|
||||
osg::Geometry* geometry = geode.getDrawable(i)->asGeometry();
|
||||
if (geometry)
|
||||
{
|
||||
simplify(*geometry,_sampleRatio);
|
||||
simplify(*geometry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** simply the geometry to defined ratio of original size.*/
|
||||
void simplify(osg::Geometry& geometry, float sampleRatio);
|
||||
|
||||
void simplify(osg::Geometry& geometry, unsigned int targetNumberOfTriangles);
|
||||
void simplify(osg::Geometry& geometry);
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
float _sampleRatio;
|
||||
float _maximumError;
|
||||
|
||||
osg::ref_ptr<ContinueSimplificationCallback> _continueSimplificationCallback;
|
||||
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user