Added beginning of new osgUtil::Simplifier
This commit is contained in:
parent
db9c192a37
commit
51c8655630
@ -161,6 +161,10 @@ SOURCE=..\..\src\osgUtil\SceneView.cpp
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\src\osgUtil\Simplifier.cpp
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\src\osgUtil\SmoothingVisitor.cpp
|
SOURCE=..\..\src\osgUtil\SmoothingVisitor.cpp
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
@ -277,6 +281,10 @@ SOURCE=..\..\Include\osgUtil\SceneView
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\include\osgUtil\Simplifier
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\include\osgUtil\SmoothingVisitor
|
SOURCE=..\..\include\osgUtil\SmoothingVisitor
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
45
include/osgUtil/Simplifier
Normal file
45
include/osgUtil/Simplifier
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OSGUTIL_SIMPLIYFIER
|
||||||
|
#define OSGUTIL_SIMPLIYFIER 1
|
||||||
|
|
||||||
|
#include <osg/NodeVisitor>
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osg/Geometry>
|
||||||
|
|
||||||
|
#include <osgUtil/Export>
|
||||||
|
|
||||||
|
namespace osgUtil {
|
||||||
|
|
||||||
|
/** A simplifier for reducing the number of traingles in osg::Geometry.
|
||||||
|
*/
|
||||||
|
class OSGUTIL_EXPORT Simplifier
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
Simplifier();
|
||||||
|
|
||||||
|
/** simply the geometry to defined ratio of original size.*/
|
||||||
|
void simplify(osg::Geometry& geometry, float sampleRatio);
|
||||||
|
|
||||||
|
void simplify(osg::Geometry& geometry, unsigned int targetNumberOfTriangles);
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include <osgUtil/SmoothingVisitor>
|
#include <osgUtil/SmoothingVisitor>
|
||||||
#include <osgUtil/TriStripVisitor>
|
#include <osgUtil/TriStripVisitor>
|
||||||
|
#include <osgUtil/Simplifier>
|
||||||
|
|
||||||
#include <osgDB/ReadFile>
|
#include <osgDB/ReadFile>
|
||||||
#include <osgDB/WriteFile>
|
#include <osgDB/WriteFile>
|
||||||
@ -2177,6 +2178,10 @@ osg::Node* DataSet::DestinationTile::createPolygonal()
|
|||||||
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
|
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
osgUtil::Simplifier simplifier;
|
||||||
|
simplifier.simplify(*geometry,0.5f); // this will replace the normal vector with a new one
|
||||||
|
|
||||||
|
|
||||||
osg::Geode* geode = new osg::Geode;
|
osg::Geode* geode = new osg::Geode;
|
||||||
geode->addDrawable(geometry);
|
geode->addDrawable(geometry);
|
||||||
|
|
||||||
|
@ -3,11 +3,13 @@ include $(TOPDIR)/Make/makedefs
|
|||||||
|
|
||||||
|
|
||||||
CXXFILES = \
|
CXXFILES = \
|
||||||
UpdateVisitor.cpp\
|
CubeMapGenerator.cpp\
|
||||||
CullVisitor.cpp\
|
CullVisitor.cpp\
|
||||||
|
DelaunayTriangulator.cpp\
|
||||||
DisplayListVisitor.cpp\
|
DisplayListVisitor.cpp\
|
||||||
DisplayRequirementsVisitor.cpp\
|
DisplayRequirementsVisitor.cpp\
|
||||||
DelaunayTriangulator.cpp\
|
HalfWayMapGenerator.cpp\
|
||||||
|
HighlightMapGenerator.cpp\
|
||||||
InsertImpostorsVisitor.cpp\
|
InsertImpostorsVisitor.cpp\
|
||||||
IntersectVisitor.cpp\
|
IntersectVisitor.cpp\
|
||||||
Optimizer.cpp\
|
Optimizer.cpp\
|
||||||
@ -18,16 +20,15 @@ CXXFILES = \
|
|||||||
RenderStageLighting.cpp\
|
RenderStageLighting.cpp\
|
||||||
RenderToTextureStage.cpp\
|
RenderToTextureStage.cpp\
|
||||||
SceneView.cpp\
|
SceneView.cpp\
|
||||||
|
Simplifier.cpp\
|
||||||
SmoothingVisitor.cpp\
|
SmoothingVisitor.cpp\
|
||||||
TangentSpaceGenerator.cpp\
|
TangentSpaceGenerator.cpp\
|
||||||
Tesselator.cpp\
|
Tesselator.cpp\
|
||||||
TransformCallback.cpp\
|
|
||||||
TransformAttributeFunctor.cpp\
|
TransformAttributeFunctor.cpp\
|
||||||
TriStripVisitor.cpp\
|
TransformCallback.cpp\
|
||||||
TriStrip_tri_stripper.cpp\
|
TriStrip_tri_stripper.cpp\
|
||||||
CubeMapGenerator.cpp\
|
TriStripVisitor.cpp\
|
||||||
HalfWayMapGenerator.cpp\
|
UpdateVisitor.cpp\
|
||||||
HighlightMapGenerator.cpp\
|
|
||||||
Version.cpp\
|
Version.cpp\
|
||||||
|
|
||||||
DEF += -DOSGUTIL_LIBRARY
|
DEF += -DOSGUTIL_LIBRARY
|
||||||
|
161
src/osgUtil/Simplifier.cpp
Normal file
161
src/osgUtil/Simplifier.cpp
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <osg/TriangleIndexFunctor>
|
||||||
|
|
||||||
|
#include <osgUtil/Simplifier>
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace osgUtil;
|
||||||
|
|
||||||
|
|
||||||
|
class EdgeCollapse
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
EdgeCollapse():
|
||||||
|
_targetNumTriangles(0) {}
|
||||||
|
~EdgeCollapse() {}
|
||||||
|
|
||||||
|
void setGeometry(osg::Geometry* geometry);
|
||||||
|
osg::Geometry* getGeometry() { return _geometry; }
|
||||||
|
|
||||||
|
void setTargetNumOfTriangles(unsigned int num) { _targetNumTriangles = num; }
|
||||||
|
|
||||||
|
unsigned int getNumOfTriangles() { return 0; }
|
||||||
|
|
||||||
|
bool collapseMinimumErrorEdge() { return false; }
|
||||||
|
|
||||||
|
void copyBackToGeometry() {}
|
||||||
|
|
||||||
|
class Triangle;
|
||||||
|
class Edge;
|
||||||
|
|
||||||
|
|
||||||
|
struct Point : public osg::Referenced
|
||||||
|
{
|
||||||
|
Point() {}
|
||||||
|
|
||||||
|
unsigned int _index;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Edge : public osg::Referenced
|
||||||
|
{
|
||||||
|
Edge() {}
|
||||||
|
|
||||||
|
osg::ref_ptr<Point> _p1;
|
||||||
|
osg::ref_ptr<Point> _p2;
|
||||||
|
|
||||||
|
osg::ref_ptr<Triangle> _t1;
|
||||||
|
osg::ref_ptr<Triangle> _t2;
|
||||||
|
|
||||||
|
void setErrorMetric(float errorMetric) { _errorMetric = errorMetric; }
|
||||||
|
float getErrorMetric() const { return _errorMetric; }
|
||||||
|
|
||||||
|
float _errorMetric;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Triangle : public osg::Referenced
|
||||||
|
{
|
||||||
|
Triangle() {}
|
||||||
|
|
||||||
|
osg::ref_ptr<Point> _p1;
|
||||||
|
osg::ref_ptr<Point> _p2;
|
||||||
|
osg::ref_ptr<Point> _p3;
|
||||||
|
|
||||||
|
osg::ref_ptr<Edge> _e1;
|
||||||
|
osg::ref_ptr<Edge> _e2;
|
||||||
|
osg::ref_ptr<Edge> _e3;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct LessPtr
|
||||||
|
{
|
||||||
|
inline bool operator() (const osg::ref_ptr<Edge>& lhs,const osg::ref_ptr<Edge>& rhs) const
|
||||||
|
{
|
||||||
|
return lhs->getErrorMetric()<rhs->getErrorMetric();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::set<osg::ref_ptr<Edge>,LessPtr> EdgeSet;
|
||||||
|
|
||||||
|
|
||||||
|
void addTriangle(unsigned int p1, unsigned int p2, unsigned int p3)
|
||||||
|
{
|
||||||
|
std::cout<<"addTriangle("<<p1<<","<<p2<<","<<p3<<")"<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
osg::Geometry* _geometry;
|
||||||
|
unsigned int _targetNumTriangles;
|
||||||
|
EdgeSet _edgeSet;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MyTriangleOperator
|
||||||
|
{
|
||||||
|
|
||||||
|
MyTriangleOperator():_ec(0) {}
|
||||||
|
|
||||||
|
void setEdgeCollapse(EdgeCollapse* ec) { _ec = ec; }
|
||||||
|
|
||||||
|
EdgeCollapse* _ec;
|
||||||
|
|
||||||
|
// for use in the triangle functor.
|
||||||
|
inline void operator()(unsigned int p1, unsigned int p2, unsigned int p3)
|
||||||
|
{
|
||||||
|
_ec->addTriangle(p1,p2,p3);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef osg::TriangleIndexFunctor<MyTriangleOperator> MyTriangleIndexFunctor;
|
||||||
|
|
||||||
|
void EdgeCollapse::setGeometry(osg::Geometry* geometry)
|
||||||
|
{
|
||||||
|
_geometry = geometry;
|
||||||
|
|
||||||
|
MyTriangleIndexFunctor collectTriangles;
|
||||||
|
collectTriangles.setEdgeCollapse(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Simplifier::Simplifier()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Simplifier::simplify(osg::Geometry& geometry, float sampleRatio)
|
||||||
|
{
|
||||||
|
EdgeCollapse ec;
|
||||||
|
ec.setGeometry(&geometry);
|
||||||
|
|
||||||
|
ec.setTargetNumOfTriangles((unsigned int)(sampleRatio*(float)ec.getNumOfTriangles()));
|
||||||
|
|
||||||
|
while (ec.collapseMinimumErrorEdge()) {}
|
||||||
|
|
||||||
|
ec.copyBackToGeometry();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Simplifier::simplify(osg::Geometry& geometry, unsigned int targetNumberOfTriangles)
|
||||||
|
{
|
||||||
|
EdgeCollapse ec;
|
||||||
|
ec.setGeometry(&geometry);
|
||||||
|
|
||||||
|
ec.setTargetNumOfTriangles(targetNumberOfTriangles);
|
||||||
|
|
||||||
|
while (ec.collapseMinimumErrorEdge()) {}
|
||||||
|
|
||||||
|
ec.copyBackToGeometry();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user