Changed importers (off ply obj raw) to tag edges inside polygonal faces as "faux"

This commit is contained in:
mtarini 2009-04-20 22:59:08 +00:00
parent 97b5d83721
commit 241d058c92
4 changed files with 48 additions and 23 deletions

View File

@ -625,7 +625,7 @@ static int Open( OpenMeshType &m, const char * filename, Info &oi)
} }
if ( oi.mask & vcg::tri::io::Mask::IOM_WEDGNORMAL ) if ( oi.mask & vcg::tri::io::Mask::IOM_WEDGNORMAL )
m.face[i].WN(j).Import(normals[indexedFaces[i].n[j]]); m.face[i].WN(j).Import(normals[indexedFaces[i].n[j]]);
// set border flags according to internals faces // set faux edge flags according to internals faces
if(indexedFaces[i].edge[j]) m.face[i].SetF(j); if(indexedFaces[i].edge[j]) m.face[i].SetF(j);
else m.face[i].ClearF(j); else m.face[i].ClearF(j);
} }

View File

@ -499,6 +499,12 @@ namespace vcg
mesh.face[f+j].V(0) = &(mesh.vert[ vertIndices[0 ] ]); mesh.face[f+j].V(0) = &(mesh.vert[ vertIndices[0 ] ]);
mesh.face[f+j].V(1) = &(mesh.vert[ vertIndices[1+j] ]); mesh.face[f+j].V(1) = &(mesh.vert[ vertIndices[1+j] ]);
mesh.face[f+j].V(2) = &(mesh.vert[ vertIndices[2+j] ]); mesh.face[f+j].V(2) = &(mesh.vert[ vertIndices[2+j] ]);
if (tri::HasPerFaceFlags(mesh)) {
// tag internal polygnal edges as "faux"
if (j>0) mesh.face[f+j].SetF(0);
if (j<vert_per_face-3) mesh.face[f+j].SetF(2);
loadmask |= Mask::IOM_FACEFLAGS;
}
} }
f+=trigs; f+=trigs;

View File

@ -840,38 +840,49 @@ static int Open( OpenMeshType &m, const char * filename, PlyInfo &pi )
(*fi).V(k) = index[ fa.v[k] ]; (*fi).V(k) = index[ fa.v[k] ];
} }
// tag faux vertices of first face
if (fa.size>3) fi->SetF(2);
for(k=0;k<pi.fdn;k++) for(k=0;k<pi.fdn;k++)
memcpy((char *)(&(*fi)) + pi.FaceData[k].offset1, memcpy((char *)(&(*fi)) + pi.FaceData[k].offset1,
(char *)(&fa) + FPV[k].offset1, (char *)(&fa) + FPV[k].offset1,
FPV[k].memtypesize()); FPV[k].memtypesize());
++fi; ++fi;
// Non Triangular Faces Loop // Non Triangular Faces Loop
// It performs a simple fan triangulation. // It performs a simple fan triangulation.
if(fa.size>3) if(fa.size>3)
{ {
int curpos=int(fi-m.face.begin()); int curpos=int(fi-m.face.begin());
Allocator<OpenMeshType>::AddFaces(m,fa.size-3); Allocator<OpenMeshType>::AddFaces(m,fa.size-3);
fi=m.face.begin()+curpos; fi=m.face.begin()+curpos;
} }
for(int qq=0;qq<fa.size-3;++qq) for(int qq=0;qq<fa.size-3;++qq)
{ {
(*fi).V(0) = index[ fa.v[0] ]; (*fi).V(0) = index[ fa.v[0] ];
for(k=1;k<3;++k) for(k=1;k<3;++k)
{ {
if( fa.v[2+qq]<0 || fa.v[2+qq]>=m.vn ) if( fa.v[2+qq]<0 || fa.v[2+qq]>=m.vn )
{ {
pi.status = PlyInfo::E_BAD_VERT_INDEX; pi.status = PlyInfo::E_BAD_VERT_INDEX;
return pi.status; return pi.status;
} }
(*fi).V(k) = index[ fa.v[1+qq+k] ]; (*fi).V(k) = index[ fa.v[1+qq+k] ];
}
}
for(k=0;k<pi.fdn;k++) // tag faux vertices of extra faces
memcpy((char *)(&(*fi)) + pi.FaceData[k].offset1, fi->SetF(0);
(char *)(&fa) + FPV[k].offset1, FPV[k].memtypesize()); if (qq!=fa.size-3) fi->SetF(2);
++fi;
} for(k=0;k<pi.fdn;k++)
memcpy((char *)(&(*fi)) + pi.FaceData[k].offset1,
(char *)(&fa) + FPV[k].offset1, FPV[k].memtypesize());
++fi;
}
} }
}else if( !strcmp( pf.ElemName(i),"tristrips") )//////////////////// LETTURA TRISTRIP DI STANFORD }else if( !strcmp( pf.ElemName(i),"tristrips") )//////////////////// LETTURA TRISTRIP DI STANFORD
@ -1168,3 +1179,4 @@ static bool LoadMask(const char * filename, int &mask, PlyInfo &pi)
} // end namespace vcg } // end namespace vcg
#endif #endif

View File

@ -419,29 +419,36 @@ static int Open( MESH_TYPE &m, const char * filename, bool triangulate=false, in
int trinum = (rownumber-1) * (colnumber-1) * 2; int trinum = (rownumber-1) * (colnumber-1) * 2;
FaceIterator fi=Allocator<MESH_TYPE>::AddFaces(m,trinum); FaceIterator fi=Allocator<MESH_TYPE>::AddFaces(m,trinum);
FaceIterator fi2 = fi;
m.fn = trinum; m.fn = trinum;
for(cc=0; cc<colnumber-1; cc++) for(cc=0; cc<colnumber-1; cc++)
for(rr=0; rr<rownumber-1; rr++) for(rr=0; rr<rownumber-1; rr++)
{ {
// upper tri // upper tri
(*fi).V(2) = &(m.vert[(cc ) + ((rr ) * colnumber)]); (*fi).V(0) = &(m.vert[(cc+1) + ((rr ) * colnumber)]);
(*fi).V(1) = &(m.vert[(cc+1) + ((rr ) * colnumber)]); (*fi).V(1) = &(m.vert[(cc ) + ((rr ) * colnumber)]);
(*fi).V(0) = &(m.vert[(cc ) + ((rr+1) * colnumber)]); (*fi).V(2) = &(m.vert[(cc ) + ((rr+1) * colnumber)]);
fi++; fi++;
// lower tri // lower tri
(*fi).V(2) = &(m.vert[(cc+1) + ((rr ) * colnumber)]);
(*fi).V(1) = &(m.vert[(cc+1) + ((rr+1) * colnumber)]);
(*fi).V(0) = &(m.vert[(cc ) + ((rr+1) * colnumber)]); (*fi).V(0) = &(m.vert[(cc ) + ((rr+1) * colnumber)]);
(*fi).V(1) = &(m.vert[(cc+1) + ((rr+1) * colnumber)]);
(*fi).V(2) = &(m.vert[(cc+1) + ((rr ) * colnumber)]);
fi++; fi++;
} }
// tag faux faces
if (m.HasPerFaceFlags()) {
for (; fi2!=m.face.end(); fi2++) {
(*fi2).SetF(2);
}
}
} }