added optional mark and cleaned up some nasty type bugs.

This commit is contained in:
Paolo Cignoni 2008-04-03 23:15:40 +00:00
parent 242e5ab82a
commit 89a4321cdf
1 changed files with 78 additions and 15 deletions

View File

@ -24,6 +24,9 @@
History History
$Log: not supported by cvs2svn $ $Log: not supported by cvs2svn $
Revision 1.15 2008/03/17 11:39:15 ganovelli
added curvature and curvatruredir (compiled .net 2005 and gcc)
Revision 1.14 2008/03/11 09:22:07 cignoni Revision 1.14 2008/03/11 09:22:07 cignoni
Completed the garbage collecting functions CompactVertexVector and CompactFaceVector. Completed the garbage collecting functions CompactVertexVector and CompactFaceVector.
@ -104,18 +107,22 @@ public:
vector_ocf():std::vector<VALUE_TYPE>(){ vector_ocf():std::vector<VALUE_TYPE>(){
QualityEnabled=false; QualityEnabled=false;
ColorEnabled=false; ColorEnabled=false;
MarkEnabled = false;
NormalEnabled=false; NormalEnabled=false;
VFAdjacencyEnabled=false; VFAdjacencyEnabled=false;
CurvatureEnabled = false; CurvatureEnabled = false;
}
}
// override di tutte le funzioni che possono spostare // override di tutte le funzioni che possono spostare
// l'allocazione in memoria del container // l'allocazione in memoria del container
void push_back(const VALUE_TYPE & v) void push_back(const VALUE_TYPE & v)
{ {
BaseType::push_back(v); BaseType::push_back(v);
BaseType::back()._ovp = this; BaseType::back()._ovp = this;
if (ColorEnabled) CV.push_back(vcg::Color4b(vcg::Color4b::White));
if (MarkEnabled) MV.push_back(0);
if (NormalEnabled) NV.push_back(typename VALUE_TYPE::NormalType());
if (VFAdjacencyEnabled) AV.push_back(VFAdjType());
} }
void pop_back(); void pop_back();
void resize(const unsigned int & _size) void resize(const unsigned int & _size)
@ -127,15 +134,21 @@ public:
advance(firstnew,oldsize); advance(firstnew,oldsize);
_updateOVP(firstnew,(*this).end()); _updateOVP(firstnew,(*this).end());
} }
if(ColorEnabled) CV.resize(_size); if (ColorEnabled) CV.resize(_size);
if(NormalEnabled) NV.resize(_size); if (MarkEnabled) MV.resize(_size);
if (NormalEnabled) NV.resize(_size);
if (VFAdjacencyEnabled) AV.resize(_size);
} }
void reserve(const unsigned int & _size) void reserve(const unsigned int & _size)
{ {
BaseType::reserve(_size); BaseType::reserve(_size);
if (ColorEnabled) CV.reserve(_size); if (ColorEnabled) CV.reserve(_size);
if (MarkEnabled) MV.reserve(_size);
if (NormalEnabled) NV.reserve(_size); if (NormalEnabled) NV.reserve(_size);
if (VFAdjacencyEnabled) AV.reserve(_size);
} }
void _updateOVP(ThisTypeIterator lbegin, ThisTypeIterator lend) void _updateOVP(ThisTypeIterator lbegin, ThisTypeIterator lend)
@ -150,18 +163,28 @@ void ReorderVert(std::vector<size_t> &newVertIndex )
{ {
size_t pos=0; size_t pos=0;
size_t i=0; size_t i=0;
if(ColorEnabled) assert( CV.size() == newVertIndex.size() ); if (ColorEnabled) assert( CV.size() == newVertIndex.size() );
if(NormalEnabled) assert( NV.size() == newVertIndex.size() ); if (MarkEnabled) assert( MV.size() == newVertIndex.size() );
if (NormalEnabled) assert( NV.size() == newVertIndex.size() );
if (VFAdjacencyEnabled) assert( AV.size() == newVertIndex.size() );
for(i=0;i<newVertIndex.size();++i) for(i=0;i<newVertIndex.size();++i)
{ {
if(newVertIndex[i] != std::numeric_limits<size_t>::max() ) if(newVertIndex[i] != std::numeric_limits<size_t>::max() )
{ {
assert(newVertIndex[i] <= i); assert(newVertIndex[i] <= i);
if(ColorEnabled) CV[newVertIndex[i]] = CV[i]; if (ColorEnabled) CV[newVertIndex[i]] = CV[i];
if(NormalEnabled) NV[newVertIndex[i]] = NV[i];; if (MarkEnabled) MV[newVertIndex[i]] = MV[i];
if (NormalEnabled) NV[newVertIndex[i]] = NV[i];
if (VFAdjacencyEnabled) AV[newVertIndex[i]] = AV[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());
} }
@ -195,6 +218,19 @@ void DisableColor() {
CV.clear(); CV.clear();
} }
bool IsMarkEnabled() const {return MarkEnabled;}
void EnableMark() {
assert(VALUE_TYPE::HasFaceMarkOcf());
MarkEnabled=true;
MV.resize((*this).size());
}
void DisableMark() {
assert(VALUE_TYPE::HasFaceMarkOcf());
MarkEnabled=false;
MV.clear();
}
bool IsNormalEnabled() const {return NormalEnabled;} bool IsNormalEnabled() const {return NormalEnabled;}
void EnableNormal() { void EnableNormal() {
assert(VALUE_TYPE::HasNormalOcf()); assert(VALUE_TYPE::HasNormalOcf());
@ -259,14 +295,15 @@ public:
std::vector<typename VALUE_TYPE::ColorType> CV; std::vector<typename VALUE_TYPE::ColorType> CV;
std::vector<typename VALUE_TYPE::NormalType> NV; std::vector<typename VALUE_TYPE::NormalType> NV;
std::vector<struct VFAdjType> AV; std::vector<struct VFAdjType> AV;
std::vector<int> MV;
bool QualityEnabled; bool QualityEnabled;
bool ColorEnabled; bool ColorEnabled;
bool NormalEnabled; bool NormalEnabled;
bool VFAdjacencyEnabled; bool VFAdjacencyEnabled;
bool CurvatureEnabled; bool CurvatureEnabled;
bool CurvatureDirEnabled; bool CurvatureDirEnabled;
bool MarkEnabled;
}; };
@ -296,7 +333,7 @@ public:
void ImportLocal(const LeftV & leftV){VFp() = NULL; VFi() = -1; T::ImporLocal(leftV);} void ImportLocal(const LeftV & leftV){VFp() = NULL; VFi() = -1; T::ImporLocal(leftV);}
static bool HasVFAdjacency() { return true; } static bool HasVFAdjacency() { return true; }
static bool HasVFAdjacencyOcf() { return true; } static bool HasVFAdjacencyOcf() {assert(!T::HasVFAdjacencyOcf()); return true; }
private: private:
}; };
@ -336,7 +373,7 @@ public:
template <class LeftV> template <class LeftV>
void ImportLocal(const LeftV & leftV){ C() = leftV.cC(); T::ImporLocal(leftV);} void ImportLocal(const LeftV & leftV){ C() = leftV.cC(); T::ImporLocal(leftV);}
static bool HasColor() { return true; } static bool HasColor() { return true; }
static bool HasColorOcf() { return true; } static bool HasColorOcf() { assert(!T::HasColorOcf()); return true; }
}; };
template <class T> class Color4bOcf: public ColorOcf<vcg::Color4b, T> {}; template <class T> class Color4bOcf: public ColorOcf<vcg::Color4b, T> {};
@ -350,11 +387,32 @@ public:
template <class LeftV> template <class LeftV>
void ImportLocal(const LeftV & leftV){ Q() = leftV.cQ(); T::ImporLocal(leftV);} void ImportLocal(const LeftV & leftV){ Q() = leftV.cQ(); T::ImporLocal(leftV);}
static bool HasQuality() { return true; } static bool HasQuality() { return true; }
static bool HasQualityOcf() { return true; } static bool HasQualityOcf() { assert(!T::HasQualityOcf()); return true; }
}; };
template <class T> class QualityfOcf: public QualityOcf<float, T> {}; template <class T> class QualityfOcf: public QualityOcf<float, T> {};
///*-------------------------- MARK ----------------------------------*/
template <class T> class MarkOcf: public T {
public:
inline int & IMark() {
assert((*this).Base().MarkEnabled);
return (*this).Base().MV[(*this).Index()];
}
inline int IMark() const {
assert((*this).Base().MarkEnabled);
return (*this).Base().MV[(*this).Index()];
} ;
template <class LeftF>
void ImportLocal(const LeftF & leftF){IMark() = leftF.cIMark(); T::ImportLocal(leftF);}
static bool HasFaceMark() { return true; }
static bool HasFaceMarkOcf() { return true; }
inline void InitIMark() { IMark() = 0; }
};
///*-------------------------- CURVATURE ----------------------------------*/ ///*-------------------------- CURVATURE ----------------------------------*/
@ -438,15 +496,20 @@ public:
} }
public: public:
vector_ocf<typename T::VertType> *_ovp; vector_ocf<typename T::VertType> *_ovp;
static bool HasQualityOcf() { return false; }
static bool HasVFAdjacencyOcf() { return false; }
}; };
} // end namespace vert } // end namespace vert
template < class, class > class TriMesh;
namespace tri namespace tri
{ {
template < class, class > class TriMesh;
template < class VertexType, class FaceContainerType > template < class VertexType, class FaceContainerType >
bool HasPerVertexQuality (const TriMesh < vert::vector_ocf< VertexType > , FaceContainerType > & m) bool HasPerVertexQuality (const TriMesh < vert::vector_ocf< VertexType > , FaceContainerType > & m)
{ {