Significantly improved documentation of the components.
Added IsNull to the VF vertex component and coherent initialization of the vf adjacency.
This commit is contained in:
parent
db53a1ff06
commit
c7b6bd26bf
|
|
@ -25,10 +25,12 @@
|
||||||
#endif
|
#endif
|
||||||
#ifndef __VCG_VERTEX_PLUS_COMPONENT
|
#ifndef __VCG_VERTEX_PLUS_COMPONENT
|
||||||
#define __VCG_VERTEX_PLUS_COMPONENT
|
#define __VCG_VERTEX_PLUS_COMPONENT
|
||||||
|
|
||||||
namespace vcg {
|
namespace vcg {
|
||||||
namespace vertex {
|
namespace vertex {
|
||||||
/** \addtogroup VertexComponentGroup
|
/** \addtogroup VertexComponentGroup
|
||||||
@{
|
@{
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/*------------------------- Base Classes -----------------------------------------*/
|
/*------------------------- Base Classes -----------------------------------------*/
|
||||||
|
|
||||||
|
|
@ -103,6 +105,7 @@ public:
|
||||||
typename TT::FacePointer cVFp() const { static typename TT::FacePointer fp=0; assert(0); return fp; }
|
typename TT::FacePointer cVFp() const { static typename TT::FacePointer fp=0; assert(0); return fp; }
|
||||||
int &VFi() { static int z=-1; assert(0); return z;}
|
int &VFi() { static int z=-1; assert(0); return z;}
|
||||||
int cVFi() const { static int z=-1; assert(0); return z;}
|
int cVFi() const { static int z=-1; assert(0); return z;}
|
||||||
|
bool IsNull() const { return true; }
|
||||||
static bool HasVFAdjacency() { return false; }
|
static bool HasVFAdjacency() { return false; }
|
||||||
bool IsVFInitialized() const {return static_cast<const typename TT::VertexType *>(this)->cVFi()!=-1;}
|
bool IsVFInitialized() const {return static_cast<const typename TT::VertexType *>(this)->cVFi()!=-1;}
|
||||||
void VFClear() {
|
void VFClear() {
|
||||||
|
|
@ -156,16 +159,19 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
/*-------------------------- COORD ----------------------------------------*/
|
/*-------------------------- COORD ----------------------------------------*/
|
||||||
/*! \brief \em Component: \b Geometric \b Position of the vertex
|
/*! \brief \em Generic Component: \b Geometric \b Position of the vertex
|
||||||
|
Templated on the coordinate class. In practice you use one of the two specialized class Coord3f and Coord3d
|
||||||
Stored as a templated Point3.
|
You can access to the coordinate of a vertex by mean of the P(),cP() member functions.
|
||||||
*/
|
*/
|
||||||
template <class A, class T> class Coord: public T {
|
template <class A, class T> class Coord: public T {
|
||||||
public:
|
public:
|
||||||
typedef A CoordType;
|
typedef A CoordType;
|
||||||
typedef typename A::ScalarType ScalarType;
|
typedef typename A::ScalarType ScalarType;
|
||||||
|
/// Return a const reference to the coordinate of the vertex
|
||||||
inline const CoordType &P() const { return _coord; }
|
inline const CoordType &P() const { return _coord; }
|
||||||
|
/// Return a reference to the coordinate of the vertex
|
||||||
inline CoordType &P() { return _coord; }
|
inline CoordType &P() { return _coord; }
|
||||||
|
/// Return a const reference to the coordinate of the vertex
|
||||||
inline CoordType cP() const { return _coord; }
|
inline CoordType cP() const { return _coord; }
|
||||||
|
|
||||||
template < class RightValueType>
|
template < class RightValueType>
|
||||||
|
|
@ -176,24 +182,35 @@ public:
|
||||||
private:
|
private:
|
||||||
CoordType _coord;
|
CoordType _coord;
|
||||||
};
|
};
|
||||||
|
/// Specialized Coord Component in floating point precision.
|
||||||
template <class T> class Coord3f: public Coord<vcg::Point3f, T> {
|
template <class T> class Coord3f: public Coord<vcg::Point3f, T> {
|
||||||
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("Coord3f"));T::Name(name);}
|
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("Coord3f"));T::Name(name);}
|
||||||
};
|
};
|
||||||
|
/// Specialized Coord Component in double point precision.
|
||||||
template <class T> class Coord3d: public Coord<vcg::Point3d, T> {
|
template <class T> class Coord3d: public Coord<vcg::Point3d, T> {
|
||||||
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("Coord3d"));T::Name(name);}
|
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("Coord3d"));T::Name(name);}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*-------------------------- NORMAL ----------------------------------------*/
|
/*-------------------------- NORMAL ----------------------------------------*/
|
||||||
/*! \brief \em Component: \b %Normal of the vertex
|
/*! \brief \em Generic Component: \b %Normal of the vertex
|
||||||
|
|
||||||
Stored as a templated Point3. The type of the normal can be different type with respect to the Coord component
|
Templated on the Point3 class used to store the normal.
|
||||||
|
In practice you use one of the two specialized class Normal3f and Normal3d.
|
||||||
|
|
||||||
|
You can access to the normal of a vertex by mean of the N(),cN() member functions.
|
||||||
|
|
||||||
|
\note Many algorithms assume that, for sake of precision coherence,
|
||||||
|
the type of the normal is the same with respect to the type coord component.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
template <class A, class T> class Normal: public T {
|
template <class A, class T> class Normal: public T {
|
||||||
public:
|
public:
|
||||||
typedef A NormalType;
|
typedef A NormalType;
|
||||||
|
/// Return a const reference to the normal of the vertex
|
||||||
inline const NormalType &N() const { return _norm; }
|
inline const NormalType &N() const { return _norm; }
|
||||||
|
/// Return a reference to the normal of the vertex
|
||||||
inline NormalType &N() { return _norm; }
|
inline NormalType &N() { return _norm; }
|
||||||
|
/// Return a const reference to the normal of the vertex
|
||||||
inline NormalType cN() const { return _norm; }
|
inline NormalType cN() const { return _norm; }
|
||||||
template < class RightValueType>
|
template < class RightValueType>
|
||||||
void ImportData(const RightValueType & rVert ){
|
void ImportData(const RightValueType & rVert ){
|
||||||
|
|
@ -210,9 +227,11 @@ private:
|
||||||
template <class T> class Normal3s: public Normal<vcg::Point3s, T> {
|
template <class T> class Normal3s: public Normal<vcg::Point3s, T> {
|
||||||
public:static void Name(std::vector<std::string> & name){name.push_back(std::string("Normal3s"));T::Name(name);}
|
public:static void Name(std::vector<std::string> & name){name.push_back(std::string("Normal3s"));T::Name(name);}
|
||||||
};
|
};
|
||||||
|
/// Specialized Normal component in floating point precision.
|
||||||
template <class T> class Normal3f: public Normal<vcg::Point3f, T> {
|
template <class T> class Normal3f: public Normal<vcg::Point3f, T> {
|
||||||
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("Normal3f"));T::Name(name);}
|
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("Normal3f"));T::Name(name);}
|
||||||
};
|
};
|
||||||
|
/// Specialized Normal component in double point precision.
|
||||||
template <class T> class Normal3d: public Normal<vcg::Point3d, T> {
|
template <class T> class Normal3d: public Normal<vcg::Point3d, T> {
|
||||||
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("Normal3d"));T::Name(name);}
|
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("Normal3d"));T::Name(name);}
|
||||||
};
|
};
|
||||||
|
|
@ -226,9 +245,12 @@ public: static void Name(std::vector<std::string> & name){name.push_back(std::st
|
||||||
|
|
||||||
template <class T> class Mark: public T {
|
template <class T> class Mark: public T {
|
||||||
public:
|
public:
|
||||||
Mark():_imark(0){}
|
Mark():_imark(0){}
|
||||||
|
/// Return a const reference to the incremental mark value
|
||||||
inline const int &IMark() const { return _imark;}
|
inline const int &IMark() const { return _imark;}
|
||||||
|
/// Return a reference to the incremental mark value
|
||||||
inline int &IMark() { return _imark;}
|
inline int &IMark() { return _imark;}
|
||||||
|
/// Return a const reference to the incremental mark value
|
||||||
inline int cIMark() const { return _imark;}
|
inline int cIMark() const { return _imark;}
|
||||||
static bool HasMark() { return true; }
|
static bool HasMark() { return true; }
|
||||||
inline void InitIMark() { _imark = 0; }
|
inline void InitIMark() { _imark = 0; }
|
||||||
|
|
@ -241,16 +263,24 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
/*-------------------------- TEXCOORD ----------------------------------------*/
|
/*-------------------------- TEXCOORD ----------------------------------------*/
|
||||||
/*! \brief \em Component: Per vertex \b Texture Coords
|
/*! \brief \em Generic Component: Per vertex \b Texture Coords
|
||||||
|
|
||||||
Note that to have multiple different TexCoord for a single vertex (as it happens on atlas where a vertex can belong to two triangles mapped on different portionof the texture) you have two options:
|
Note that to have multiple different TexCoord for a single vertex
|
||||||
- duplicate vertexes
|
(as it happens on atlas where a vertex can belong to two triangles
|
||||||
|
mapped on different portionof the texture) you have two options:
|
||||||
|
- explicit duplication of vertexes
|
||||||
- use PerWedge Texture coords
|
- use PerWedge Texture coords
|
||||||
|
|
||||||
|
It is templated on the TextureCoord type. Usually you use the specialized classes TexCoord2f or TexCoord2d;
|
||||||
|
See the TexCoord2 class to see how to access to texture coordinate values.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
template <class A, class TT> class TexCoord: public TT {
|
template <class A, class TT> class TexCoord: public TT {
|
||||||
public:
|
public:
|
||||||
typedef A TexCoordType;
|
typedef A TexCoordType;
|
||||||
|
|
||||||
|
/// Return a const reference to the Texture Coordinate
|
||||||
const TexCoordType &T() const { return _t; }
|
const TexCoordType &T() const { return _t; }
|
||||||
TexCoordType &T() { return _t; }
|
TexCoordType &T() { return _t; }
|
||||||
TexCoordType cT() const { return _t; }
|
TexCoordType cT() const { return _t; }
|
||||||
|
|
@ -263,12 +293,15 @@ private:
|
||||||
TexCoordType _t;
|
TexCoordType _t;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template <class TT> class TexCoord2s: public TexCoord<TexCoord2<short,1>, TT> {
|
template <class TT> class TexCoord2s: public TexCoord<TexCoord2<short,1>, TT> {
|
||||||
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("TexCoord2s"));TT::Name(name);}
|
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("TexCoord2s"));TT::Name(name);}
|
||||||
};
|
};
|
||||||
|
/// Specialized Texture component in floating point precision.
|
||||||
template <class TT> class TexCoord2f: public TexCoord<TexCoord2<float,1>, TT> {
|
template <class TT> class TexCoord2f: public TexCoord<TexCoord2<float,1>, TT> {
|
||||||
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("TexCoord2f"));TT::Name(name);}
|
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("TexCoord2f"));TT::Name(name);}
|
||||||
};
|
};
|
||||||
|
/// Specialized Texture component in double precision.
|
||||||
template <class TT> class TexCoord2d: public TexCoord<TexCoord2<double,1>, TT> {
|
template <class TT> class TexCoord2d: public TexCoord<TexCoord2<double,1>, TT> {
|
||||||
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("TexCoord2d"));TT::Name(name);}
|
public: static void Name(std::vector<std::string> & name){name.push_back(std::string("TexCoord2d"));TT::Name(name);}
|
||||||
};
|
};
|
||||||
|
|
@ -276,7 +309,8 @@ public: static void Name(std::vector<std::string> & name){name.push_back(std::st
|
||||||
/*------------------------- FLAGS -----------------------------------------*/
|
/*------------------------- FLAGS -----------------------------------------*/
|
||||||
/*! \brief \em Component: Per vertex \b Flags
|
/*! \brief \em Component: Per vertex \b Flags
|
||||||
|
|
||||||
This component stores a 32 bit array of bit flags. These bit flags are used for keeping track of selection, deletion, visiting etc. \sa \ref flags for more details on common uses of flags.
|
This component stores a 32 bit array of bit flags.
|
||||||
|
These bit flags are used for keeping track of selection, deletion, visiting etc. \sa \ref flags for more details on common uses of flags.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
template <class T> class BitFlags: public T {
|
template <class T> class BitFlags: public T {
|
||||||
|
|
@ -511,6 +545,7 @@ Note that if you use this component it is expected that on the Face you use also
|
||||||
typename T::FacePointer cVFp() const { return _fp; }
|
typename T::FacePointer cVFp() const { return _fp; }
|
||||||
int &VFi() { return _zp; }
|
int &VFi() { return _zp; }
|
||||||
int cVFi() const { return _zp; }
|
int cVFi() const { return _zp; }
|
||||||
|
bool IsNull() const { return _zp==-1;}
|
||||||
template < class RightValueType>
|
template < class RightValueType>
|
||||||
void ImportData(const RightValueType & rVert ) { T::ImportData( rVert); }
|
void ImportData(const RightValueType & rVert ) { T::ImportData( rVert); }
|
||||||
static bool HasVFAdjacency() { return true; }
|
static bool HasVFAdjacency() { return true; }
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ public:
|
||||||
if (MarkEnabled) MV.resize(_size);
|
if (MarkEnabled) MV.resize(_size);
|
||||||
if (NormalEnabled) NV.resize(_size);
|
if (NormalEnabled) NV.resize(_size);
|
||||||
if (TexCoordEnabled) TV.resize(_size);
|
if (TexCoordEnabled) TV.resize(_size);
|
||||||
if (VFAdjacencyEnabled) AV.resize(_size);
|
if (VFAdjacencyEnabled) AV.resize(_size,VFAdjType::Zero());
|
||||||
if (CurvatureEnabled) CuV.resize(_size);
|
if (CurvatureEnabled) CuV.resize(_size);
|
||||||
if (CurvatureDirEnabled) CuDV.resize(_size);
|
if (CurvatureDirEnabled) CuDV.resize(_size);
|
||||||
if (RadiusEnabled) RadiusV.resize(_size);
|
if (RadiusEnabled) RadiusV.resize(_size);
|
||||||
|
|
@ -107,7 +107,7 @@ public:
|
||||||
if (MarkEnabled) MV.reserve(_size);
|
if (MarkEnabled) MV.reserve(_size);
|
||||||
if (NormalEnabled) NV.reserve(_size);
|
if (NormalEnabled) NV.reserve(_size);
|
||||||
if (TexCoordEnabled) TV.reserve(_size);
|
if (TexCoordEnabled) TV.reserve(_size);
|
||||||
if (VFAdjacencyEnabled) AV.reserve(_size);
|
if (VFAdjacencyEnabled) AV.reserve(_size,VFAdjType::Zero());
|
||||||
if (CurvatureEnabled) CuV.reserve(_size);
|
if (CurvatureEnabled) CuV.reserve(_size);
|
||||||
if (CurvatureDirEnabled) CuDV.reserve(_size);
|
if (CurvatureDirEnabled) CuDV.reserve(_size);
|
||||||
if (RadiusEnabled) RadiusV.reserve(_size);
|
if (RadiusEnabled) RadiusV.reserve(_size);
|
||||||
|
|
@ -175,8 +175,7 @@ bool IsVFAdjacencyEnabled() const {return VFAdjacencyEnabled;}
|
||||||
void EnableVFAdjacency() {
|
void EnableVFAdjacency() {
|
||||||
assert(VALUE_TYPE::HasVFAdjacencyOcf());
|
assert(VALUE_TYPE::HasVFAdjacencyOcf());
|
||||||
VFAdjacencyEnabled=true;
|
VFAdjacencyEnabled=true;
|
||||||
VFAdjType zero; zero._fp=0; zero._zp=-1;
|
AV.resize((*this).size(),VFAdjType::Zero());
|
||||||
AV.resize((*this).size(),zero);
|
|
||||||
}
|
}
|
||||||
void DisableVFAdjacency() {
|
void DisableVFAdjacency() {
|
||||||
assert(VALUE_TYPE::HasVFAdjacencyOcf());
|
assert(VALUE_TYPE::HasVFAdjacencyOcf());
|
||||||
|
|
@ -234,8 +233,11 @@ void DisableTexCoord() {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct VFAdjType {
|
struct VFAdjType {
|
||||||
|
VFAdjType(typename VALUE_TYPE::FacePointer fp, int zp):_fp(fp),_zp(zp){}
|
||||||
typename VALUE_TYPE::FacePointer _fp ;
|
typename VALUE_TYPE::FacePointer _fp ;
|
||||||
int _zp ;
|
int _zp ;
|
||||||
|
static VFAdjType Zero() { return VFAdjType(0,-1); }
|
||||||
|
bool IsNull() const { return (_zp ==-1); }
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue