You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.7 KiB
139 lines
3.7 KiB
#ifndef POLY_TRIANGULATOR_H |
|
#define POLY_TRIANGULATOR_H |
|
|
|
#include "util_dae.h" |
|
#include <wrap/gl/glu_tesselator.h> |
|
|
|
namespace vcg { |
|
namespace tri { |
|
namespace io { |
|
// These two classes is used for temporary storing of the |
|
// collected data of the polgons during the reading of files. |
|
|
|
template<typename VERTEX_TYPE> |
|
class MyPolygon |
|
{ |
|
public: |
|
typedef VERTEX_TYPE BaseVertexType; |
|
|
|
int _nvert; |
|
std::vector<VERTEX_TYPE*> _pv; |
|
std::vector< vcg::TexCoord2<float> > _txc; |
|
|
|
|
|
MyPolygon(int n) |
|
:_nvert(n),_pv(_nvert),_txc(_nvert) |
|
{ |
|
} |
|
}; |
|
|
|
template<typename POLYGONAL_TYPE> |
|
class PolygonalMesh |
|
{ |
|
public: |
|
typedef POLYGONAL_TYPE FaceType; |
|
|
|
enum PERWEDGEATTRIBUTETYPE {NONE = 0,NORMAL = 1,MULTITEXTURECOORD = 2,MULTICOLOR = 4}; |
|
|
|
typedef typename FaceType::BaseVertexType VertexType; |
|
typedef VertexType* VertexPointer; |
|
typedef typename std::vector<VertexType>::iterator VertexIterator; |
|
typedef typename std::vector<FaceType>::iterator PolygonIterator; |
|
|
|
vcg::Box3<float> bbox; |
|
|
|
std::vector<VertexType> vert; |
|
std::vector<FaceType> _pols; |
|
|
|
void generatePointsVector(std::vector<std::vector<vcg::Point3f> >& v) |
|
{ |
|
for(typename PolygonalMesh::PolygonIterator itp = _pols.begin();itp != _pols.end();++itp) |
|
{ |
|
v.push_back(std::vector<vcg::Point3f>()); |
|
for(typename std::vector<VertexPointer>::iterator itv = itp->_pv.begin();itv != itp->_pv.end();++itv) |
|
{ |
|
v[v.size() - 1].push_back((*itv)->P()); |
|
} |
|
} |
|
} |
|
|
|
void usePerWedgeAttributes(PERWEDGEATTRIBUTETYPE att,const unsigned int multitexture = 1,const unsigned int multicolor = 1) |
|
{ |
|
if (att != NONE) |
|
{ |
|
for(PolygonIterator itp = _pols.begin();itp != _pols.end();++itp) |
|
{ |
|
if (att & MULTICOLOR) itp->usePerWedgeColor(multicolor); |
|
if (att & MULTITEXTURECOORD) itp->usePerWedgeMultiTexture(multitexture); |
|
if (att & NORMAL) itp->usePerWedgeNormal(); |
|
} |
|
} |
|
} |
|
|
|
template<class TRIMESH> |
|
void triangulate(TRIMESH& mesh) |
|
{ |
|
std::vector<std::vector<vcg::Point3f> > pl; |
|
mesh.vert.resize(vert.size()); |
|
int multicoor = 0; |
|
//PolygonalMesh's points has been copied in TriangularMesh |
|
for(size_t jj = 0;jj < mesh.vert.size();++jj) |
|
mesh.vert[jj].P() = vert[jj].P(); |
|
|
|
bool texen = mesh.face.IsWedgeTexEnabled(); |
|
unsigned int totaltri = 0; |
|
for(size_t ii = 0;ii < _pols.size();++ii) |
|
totaltri += _pols[ii]._nvert - 2; |
|
|
|
mesh.face.resize(totaltri); |
|
|
|
//transform the polygonal mesh in a vector<vector<Point>> |
|
generatePointsVector(pl); |
|
|
|
|
|
int trioff = 0; |
|
//foreach Polygon |
|
for(size_t ii = 0;ii < pl.size();++ii) |
|
{ |
|
std::vector<int> tx; |
|
std::vector<std::vector<vcg::Point3f> > pl2(1); |
|
pl2[0] = pl[ii]; |
|
|
|
vcg::glu_tesselator::tesselate(pl2,tx); |
|
size_t ntri = tx.size() / 3; |
|
assert(tx.size() % 3 == 0); |
|
|
|
|
|
int polvert = 0; |
|
//foreach triangle |
|
for(size_t tr = 0;tr < ntri;++tr) |
|
{ |
|
|
|
//typename TRIMESH::FaceType& f = mesh.face[tr]; |
|
|
|
//typename TRIMESH::FaceType& f = mesh.face[tr]; |
|
for(unsigned int tt = 0;tt < 3; ++tt) |
|
{ |
|
mesh.face[trioff + tr].V(tt) = &(mesh.vert[_pols[ii]._pv[tx[3 * tr + tt]] - &(vert[0])]); |
|
//vcg::Point3f ppp = mesh.face[tr].V(tt)->P(); |
|
if (texen) |
|
{ |
|
/* f.WT(multicoor).U() = _pols[ii]._txc[polvert].U(); |
|
f.WT(multicoor).V() = _pols[ii]._txc[polvert].V(); |
|
f.WT(multicoor).N() = _pols[ii]._txc[polvert].N();*/ |
|
|
|
} |
|
polvert = (polvert + 1) % _pols[ii]._nvert; |
|
} |
|
//mesh.face.push_back(f); |
|
} |
|
trioff += ntri; |
|
} |
|
assert(trioff == totaltri); |
|
} |
|
}; |
|
} |
|
} |
|
} |
|
|
|
#endif
|
|
|