Completed the garbage collecting functions CompactVertexVector and CompactFaceVector.
This commit is contained in:
parent
7ea4ad85a0
commit
3d4222b231
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.39 2007/12/11 20:18:55 cignoni
|
||||||
|
forgotten required std::
|
||||||
|
|
||||||
Revision 1.38 2007/12/11 11:35:50 cignoni
|
Revision 1.38 2007/12/11 11:35:50 cignoni
|
||||||
Added the CompactVertexVector garbage collecting function.
|
Added the CompactVertexVector garbage collecting function.
|
||||||
|
|
||||||
|
@ -160,10 +163,17 @@ namespace vcg {
|
||||||
namespace tri {
|
namespace tri {
|
||||||
/** \addtogroup trimesh */
|
/** \addtogroup trimesh */
|
||||||
|
|
||||||
|
|
||||||
|
// Placeholder.
|
||||||
|
// this one is called by the Compact and overridden by more specialized functions for OCF classes.
|
||||||
|
// that manage also the additional types
|
||||||
template <class vector_type>
|
template <class vector_type>
|
||||||
void Reorder( std::vector<size_t> &newVertIndex, vector_type &vert)
|
void ReorderFace( std::vector<size_t> &newVertIndex, vector_type &vert)
|
||||||
{}
|
{}
|
||||||
|
template <class vector_type>
|
||||||
|
void ReorderVert( std::vector<size_t> &newVertIndex, vector_type &vert)
|
||||||
|
{}
|
||||||
|
|
||||||
/*@{*/
|
/*@{*/
|
||||||
/// Class to safely add vertexes and faces to a mesh updating all the involved pointers.
|
/// Class to safely add vertexes and faces to a mesh updating all the involved pointers.
|
||||||
/// It provides static memeber to add either vertex or faces to a trimesh.
|
/// It provides static memeber to add either vertex or faces to a trimesh.
|
||||||
|
@ -376,7 +386,7 @@ namespace vcg {
|
||||||
static void CompactVertexVector( MeshType &m )
|
static void CompactVertexVector( MeshType &m )
|
||||||
{
|
{
|
||||||
// newVertIndex [ <old_vert_position> ] gives you the new position of the vertex in the vector;
|
// newVertIndex [ <old_vert_position> ] gives you the new position of the vertex in the vector;
|
||||||
std::vector<size_t> newVertIndex(m.vert.size());
|
std::vector<size_t> newVertIndex(m.vert.size(),std::numeric_limits<size_t>::max() );
|
||||||
|
|
||||||
size_t pos=0;
|
size_t pos=0;
|
||||||
size_t i=0;
|
size_t i=0;
|
||||||
|
@ -392,7 +402,11 @@ namespace vcg {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(pos==m.vn);
|
assert(pos==m.vn);
|
||||||
Reorder<typename MeshType::VertContainer>(newVertIndex,m.vert);
|
|
||||||
|
// call a templated reordering function that manage any additional data internally stored by the vector
|
||||||
|
// for the default std::vector no work is needed (some work is typically needed for the OCF stuff)
|
||||||
|
ReorderVert<typename MeshType::VertContainer>(newVertIndex,m.vert);
|
||||||
|
|
||||||
m.vert.resize(m.vn);
|
m.vert.resize(m.vn);
|
||||||
FaceIterator fi;
|
FaceIterator fi;
|
||||||
VertexPointer vbase=&m.vert[0];
|
VertexPointer vbase=&m.vert[0];
|
||||||
|
@ -406,6 +420,77 @@ namespace vcg {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Function to compact all the vertices that have been deleted and put them to the end of the vector.
|
||||||
|
after this pass the isD test in the scanning of vertex vector, is no more strongly necessary.
|
||||||
|
It should not be called when TemporaryData is active;
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void CompactFaceVector( MeshType &m )
|
||||||
|
{
|
||||||
|
// newFaceIndex [ <old_face_position> ] gives you the new position of the face in the vector;
|
||||||
|
std::vector<size_t> newFaceIndex(m.face.size(),std::numeric_limits<size_t>::max() );
|
||||||
|
|
||||||
|
size_t pos=0;
|
||||||
|
size_t i=0;
|
||||||
|
|
||||||
|
for(i=0;i<m.face.size();++i)
|
||||||
|
{
|
||||||
|
if(!m.face[i].IsD())
|
||||||
|
{
|
||||||
|
if(pos!=i)
|
||||||
|
m.face[pos]=m.face[i];
|
||||||
|
newFaceIndex[i]=pos;
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(pos==m.fn);
|
||||||
|
|
||||||
|
// call a templated reordering function that manage any additional data internally stored by the vector
|
||||||
|
// for the default std::vector no work is needed (some work is typically needed for the OCF stuff)
|
||||||
|
ReorderFace<typename MeshType::FaceType>(newFaceIndex,m.face);
|
||||||
|
|
||||||
|
// Loop on the vertices to correct VF relation
|
||||||
|
VertexIterator vi;
|
||||||
|
FacePointer fbase=&m.face[0];
|
||||||
|
for (vi=m.vert.begin(); vi!=m.vert.end(); ++vi)
|
||||||
|
if(!(*vi).IsD())
|
||||||
|
{
|
||||||
|
if(HasVFAdjacency(m))
|
||||||
|
if ((*vi).cVFp()!=0)
|
||||||
|
{
|
||||||
|
size_t oldIndex = (*vi).cVFp() - fbase;
|
||||||
|
assert(oldIndex >=0 && oldIndex < newFaceIndex.size());
|
||||||
|
(*vi).VFp() = fbase+newFaceIndex[oldIndex];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop on the faces to correct VF and FF relations
|
||||||
|
m.face.resize(m.fn);
|
||||||
|
FaceIterator fi;
|
||||||
|
for(fi=m.face.begin();fi!=m.face.end();++fi)
|
||||||
|
if(!(*fi).IsD())
|
||||||
|
{
|
||||||
|
if(HasVFAdjacency(m))
|
||||||
|
for(i=0;i<3;++i)
|
||||||
|
if ((*fi).cVFp(i)!=0)
|
||||||
|
{
|
||||||
|
size_t oldIndex = (*fi).VFp(i) - fbase;
|
||||||
|
assert(oldIndex >=0 && oldIndex < newFaceIndex.size());
|
||||||
|
(*fi).VFp(i) = fbase+newFaceIndex[oldIndex];
|
||||||
|
}
|
||||||
|
if(HasFFAdjacency(m))
|
||||||
|
for(i=0;i<3;++i)
|
||||||
|
if ((*fi).cFFp(i)!=0)
|
||||||
|
{
|
||||||
|
size_t oldIndex = (*fi).FFp(i) - fbase;
|
||||||
|
assert(oldIndex >=0 && oldIndex < newFaceIndex.size());
|
||||||
|
(*fi).FFp(i) = fbase+newFaceIndex[oldIndex];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}; // end class
|
}; // end class
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.24 2008/02/28 15:41:17 cignoni
|
||||||
|
Added FFpi methods and better init of texture coords
|
||||||
|
|
||||||
Revision 1.23 2008/02/05 10:11:34 cignoni
|
Revision 1.23 2008/02/05 10:11:34 cignoni
|
||||||
A small typo (a T:: instead of TT::)
|
A small typo (a T:: instead of TT::)
|
||||||
|
|
||||||
|
@ -226,6 +229,43 @@ public:
|
||||||
for(fi=lbegin;fi!=lend;++fi)
|
for(fi=lbegin;fi!=lend;++fi)
|
||||||
(*fi)._ovp=this;
|
(*fi)._ovp=this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// this function is called by the specialized Reorder function, that is called whenever someone call the allocator::CompactVertVector
|
||||||
|
void ReorderFace(std::vector<size_t> &newFaceIndex )
|
||||||
|
{
|
||||||
|
size_t pos=0;
|
||||||
|
size_t i=0;
|
||||||
|
if (ColorEnabled) assert( CV.size() == newFaceIndex.size() );
|
||||||
|
if (MarkEnabled) assert( MV.size() == newFaceIndex.size() );
|
||||||
|
if (NormalEnabled) assert( NV.size() == newFaceIndex.size() );
|
||||||
|
if (VFAdjacencyEnabled)assert( AV.size() == newFaceIndex.size() );
|
||||||
|
if (FFAdjacencyEnabled)assert( AF.size() == newFaceIndex.size() );
|
||||||
|
if (WedgeTexEnabled) assert(WTV.size() == newFaceIndex.size() );
|
||||||
|
|
||||||
|
for(i=0;i<newFaceIndex.size();++i)
|
||||||
|
{
|
||||||
|
if(newFaceIndex[i] != std::numeric_limits<size_t>::max() )
|
||||||
|
{
|
||||||
|
assert(newFaceIndex[i] <= i);
|
||||||
|
if (ColorEnabled) CV[newFaceIndex[i]] = CV[i];
|
||||||
|
if (MarkEnabled) MV[newFaceIndex[i]] = MV[i];
|
||||||
|
if (NormalEnabled) NV[newFaceIndex[i]] = NV[i];
|
||||||
|
if (VFAdjacencyEnabled) AV[newFaceIndex[i]] = AV[i];
|
||||||
|
if (FFAdjacencyEnabled) AF[newFaceIndex[i]] = AF[i];
|
||||||
|
if (WedgeTexEnabled) WTV[newFaceIndex[i]] = WTV[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ColorEnabled) CV.resize(BaseType::size());
|
||||||
|
if (MarkEnabled) MV.resize(BaseType::size());
|
||||||
|
if (NormalEnabled) NV.resize(BaseType::size());
|
||||||
|
if (VFAdjacencyEnabled) AV.resize(BaseType::size());
|
||||||
|
if (FFAdjacencyEnabled) AF.resize(BaseType::size());
|
||||||
|
if (WedgeTexEnabled) WTV.resize(BaseType::size());
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////
|
////////////////////////////////////////
|
||||||
// Enabling Functions
|
// Enabling Functions
|
||||||
|
|
||||||
|
@ -546,6 +586,13 @@ public:
|
||||||
if(FaceType::HasFaceMarkOcf()) return m.face.IsMarkEnabled();
|
if(FaceType::HasFaceMarkOcf()) return m.face.IsMarkEnabled();
|
||||||
else return FaceType::HasFaceMark();
|
else return FaceType::HasFaceMark();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template < class FaceType >
|
||||||
|
void ReorderFace( std::vector<size_t> &newFaceIndex, face::vector_ocf< FaceType > &faceVec)
|
||||||
|
{
|
||||||
|
faceVec.ReorderFace(newFaceIndex);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}// end namespace vcg
|
}// end namespace vcg
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.13 2008/02/05 20:42:43 cignoni
|
||||||
|
Other small typos
|
||||||
|
|
||||||
Revision 1.12 2008/02/04 21:26:49 ganovelli
|
Revision 1.12 2008/02/04 21:26:49 ganovelli
|
||||||
added ImportLocal which imports all local attributes into vertexplus and faceplus.
|
added ImportLocal which imports all local attributes into vertexplus and faceplus.
|
||||||
A local attribute is everything (N(), C(), Q()....) except pointers to other simplices
|
A local attribute is everything (N(), C(), Q()....) except pointers to other simplices
|
||||||
|
@ -138,7 +141,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// this function is called by the specialized Reorder function, that is called whenever someone call the allocator::CompactVertVector
|
// this function is called by the specialized Reorder function, that is called whenever someone call the allocator::CompactVertVector
|
||||||
void Reorder(std::vector<size_t> &newVertIndex )
|
void ReorderVert(std::vector<size_t> &newVertIndex )
|
||||||
{
|
{
|
||||||
size_t pos=0;
|
size_t pos=0;
|
||||||
size_t i=0;
|
size_t i=0;
|
||||||
|
@ -349,9 +352,9 @@ namespace tri
|
||||||
}
|
}
|
||||||
|
|
||||||
template < class VertexType >
|
template < class VertexType >
|
||||||
void Reorder( std::vector<size_t> &newVertIndex, vert::vector_ocf< VertexType > &vertVec)
|
void ReorderVert( std::vector<size_t> &newVertIndex, vert::vector_ocf< VertexType > &vertVec)
|
||||||
{
|
{
|
||||||
vertVec.Reorder(newVertIndex);
|
vertVec.ReorderVert(newVertIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}// end namespace vcg
|
}// end namespace vcg
|
||||||
|
|
Loading…
Reference in New Issue