added support for loading directly polygon meshes.

If you are not using polygon mesh this commit does not change anything.
This commit is contained in:
ganovelli 2008-12-18 18:02:44 +00:00
parent d3682195ca
commit 70ea5c2057
1 changed files with 76 additions and 9 deletions

View File

@ -158,12 +158,13 @@ public:
//};
struct ObjIndexedFace
{
int v[3];
int n[3];
int t[3];
int tInd;
bool edge[3];
Color4b c;
void set(const int & num){v.resize(num);n.resize(num); t.resize(num);}
std::vector<int> v;
std::vector<int> n;
std::vector<int> t;
int tInd;
bool edge[3];// useless if the face is a polygon, no need to have variable length array
Color4b c;
};
struct ObjTexCoord
@ -378,7 +379,69 @@ static int Open( OpenMeshType &m, const char * filename, Info &oi)
{
if (numTokens < 4) return E_LESS_THAN_3VERTINFACE;
int vertexesPerFace = static_cast<int>(tokens.size()-1);
if( (vertexesPerFace>3) && OpenMeshType::FaceType::HasPolyInfo() ){
//_BEGIN___ if you are loading a GENERIC POLYGON mesh
ff.set(vertexesPerFace);
std::string vertex;
std::string texcoord;
std::string normal;
for(int i=0;i<vertexesPerFace;++i) // remember index starts from 1 instead of 0
SplitToken(tokens[i+1], ff.v[i], ff.n[i], ff.t[i], oi.mask);
if ( oi.mask & vcg::tri::io::Mask::IOM_WEDGTEXCOORD )
{
// verifying validity of texture coords indices
for(int i=0;i<vertexesPerFace;i++)
if(!GoodObjIndex(ff.t[i],oi.numTexCoords))
return E_BAD_VERT_TEX_INDEX;
ff.tInd=materials[currentMaterialIdx].index;
}
// verifying validity of vertex indices
vector<int> tmp = ff.v;
std::sort(tmp.begin(),tmp.end());
std::unique(tmp.begin(),tmp.end());
if(tmp.size() != ff.v.size())
result = E_VERTICES_WITH_SAME_IDX_IN_FACE;
for(int i=0;i<vertexesPerFace;i++)
if(!GoodObjIndex(ff.v[i],numVertices))
return E_BAD_VERT_INDEX;
// assigning face normal
// ---------------------
if ( oi.mask & vcg::tri::io::Mask::IOM_WEDGNORMAL )
{
// verifying validity of vertex normal indices
// -------------------------------------------
for(int i=0;i<vertexesPerFace;i++)
if(!GoodObjIndex(ff.n[i],numVNormals)) return E_BAD_VERT_NORMAL_INDEX;
}
// assigning face color
// --------------------
if( oi.mask & vcg::tri::io::Mask::IOM_FACECOLOR)
ff.c = currentColor;
++numTriangles;
indexedFaces.push_back(ff);
// callback invocation, abort loading process if the call returns false
if ((cb !=NULL)&& (((numTriangles + numVertices)%100)==0) )
{
if (!(*cb)( (100*(numTriangles +numVertices))/ numVerticesPlusFaces, "Face Loading"))
return E_ABORTED;
}
//_END ___ if you are loading a GENERIC POLYGON mesh
}else
{
//_BEGIN___ if you are loading a TRIMESH mesh
ff.set(3);
std::string vertex;
std::string texcoord;
std::string normal;
@ -495,10 +558,13 @@ static int Open( OpenMeshType &m, const char * filename, Info &oi)
// callback invocation, abort loading process if the call returns false
if ((cb !=NULL)&& (((numTriangles + numVertices)%100)==0) )
{
{
if (!(*cb)( (100*(numTriangles +numVertices))/ numVerticesPlusFaces, "Face Loading"))
return E_ABORTED;
}
}
//_END___ if you are loading a TRIMESH mesh
}
}
else if (header.compare("mtllib")==0) // material library
{
@ -547,7 +613,8 @@ static int Open( OpenMeshType &m, const char * filename, Info &oi)
for(int i=0;i<numTriangles;++i)
{
assert(m.face.size()==size_t(m.fn));
for(int j=0;j<3;++j)
m.face[i].Alloc(indexedFaces[i].v.size()); // it does not do anything if it is a trimesh
for(int j=0;j<indexedFaces[i].v.size();++j)
{
m.face[i].V(j)=&(m.vert[indexedFaces[i].v[j]]);
if ( oi.mask & vcg::tri::io::Mask::IOM_WEDGTEXCOORD ) {