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
$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
Completed the garbage collecting functions CompactVertexVector and CompactFaceVector.
@ -104,18 +107,22 @@ public:
vector_ocf():std::vector<VALUE_TYPE>(){
QualityEnabled=false;
ColorEnabled=false;
MarkEnabled = false;
NormalEnabled=false;
VFAdjacencyEnabled=false;
CurvatureEnabled = false;
}
}
// override di tutte le funzioni che possono spostare
// l'allocazione in memoria del container
void push_back(const VALUE_TYPE & 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 resize(const unsigned int & _size)
@ -127,15 +134,21 @@ public:
advance(firstnew,oldsize);
_updateOVP(firstnew,(*this).end());
}
if(ColorEnabled) CV.resize(_size);
if(NormalEnabled) NV.resize(_size);
if (ColorEnabled) CV.resize(_size);
if (MarkEnabled) MV.resize(_size);
if (NormalEnabled) NV.resize(_size);
if (VFAdjacencyEnabled) AV.resize(_size);
}
void reserve(const unsigned int & _size)
{
BaseType::reserve(_size);
if (ColorEnabled) CV.reserve(_size);
if (MarkEnabled) MV.reserve(_size);
if (NormalEnabled) NV.reserve(_size);
if (VFAdjacencyEnabled) AV.reserve(_size);
}
void _updateOVP(ThisTypeIterator lbegin, ThisTypeIterator lend)
@ -150,18 +163,28 @@ void ReorderVert(std::vector<size_t> &newVertIndex )
{
size_t pos=0;
size_t i=0;
if(ColorEnabled) assert( CV.size() == newVertIndex.size() );
if(NormalEnabled) assert( NV.size() == newVertIndex.size() );
if (ColorEnabled) assert( CV.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)
{
if(newVertIndex[i] != std::numeric_limits<size_t>::max() )
{
assert(newVertIndex[i] <= i);
if(ColorEnabled) CV[newVertIndex[i]] = CV[i];
if(NormalEnabled) NV[newVertIndex[i]] = NV[i];;
if (ColorEnabled) CV[newVertIndex[i]] = CV[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();
}
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;}
void EnableNormal() {
assert(VALUE_TYPE::HasNormalOcf());
@ -259,14 +295,15 @@ public:
std::vector<typename VALUE_TYPE::ColorType> CV;
std::vector<typename VALUE_TYPE::NormalType> NV;
std::vector<struct VFAdjType> AV;
std::vector<int> MV;
bool QualityEnabled;
bool ColorEnabled;
bool NormalEnabled;
bool VFAdjacencyEnabled;
bool CurvatureEnabled;
bool CurvatureDirEnabled;
bool MarkEnabled;
};
@ -296,7 +333,7 @@ public:
void ImportLocal(const LeftV & leftV){VFp() = NULL; VFi() = -1; T::ImporLocal(leftV);}
static bool HasVFAdjacency() { return true; }
static bool HasVFAdjacencyOcf() { return true; }
static bool HasVFAdjacencyOcf() {assert(!T::HasVFAdjacencyOcf()); return true; }
private:
};
@ -336,7 +373,7 @@ public:
template <class LeftV>
void ImportLocal(const LeftV & leftV){ C() = leftV.cC(); T::ImporLocal(leftV);}
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> {};
@ -350,11 +387,32 @@ public:
template <class LeftV>
void ImportLocal(const LeftV & leftV){ Q() = leftV.cQ(); T::ImporLocal(leftV);}
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> {};
///*-------------------------- 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 ----------------------------------*/
@ -438,15 +496,20 @@ public:
}
public:
vector_ocf<typename T::VertType> *_ovp;
static bool HasQualityOcf() { return false; }
static bool HasVFAdjacencyOcf() { return false; }
};
} // end namespace vert
template < class, class > class TriMesh;
namespace tri
{
template < class, class > class TriMesh;
template < class VertexType, class FaceContainerType >
bool HasPerVertexQuality (const TriMesh < vert::vector_ocf< VertexType > , FaceContainerType > & m)
{