Corrected a significant bug in the reflection types for ocf components.

Changed the basic reflection mechanism: Instead of having a function templates over all the four containers now we template over Trimesh and we rely on a second function templated on face/vert that wants a vector<face> ; this second function only is eventually overloaded by another function that needs a vector_ocf of faces. 

That is Before we had:
- in complex.h

template < class  CType0, class CType1, class CType2 , class CType3>
bool HasPerFaceVFAdjacency   (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasVFAdjacency();}

- in the component_ocf.h

template < class VertContainerType, class FaceType, class Container1, class Container2  >
		bool HasPerFaceVFAdjacency (const TriMesh < VertContainerType , face::vector_ocf< FaceType >, Container1, Container2 > & m)
	{
	  if(FaceType::HasVFAdjacencyOcf()) return m.face.IsVFAdjacencyEnabled();
	  else return FaceType::FaceType::HasVFAdjacency();
	}


While now we have:
- in complex.h

template < class FaceType  > bool   FaceVectorHasPerFaceVFAdjacency     (const std::vector<FaceType  > &) {  return FaceType::HasVFAdjacency(); }
template < class TriMeshType> bool   HasPerFaceVFAdjacency     (const TriMeshType &m) { return tri::FaceVectorHasPerFaceVFAdjacency  (m.vert); }

- and in component_ocf.h

template < class FaceType >
  bool FaceVectorHasPerFaceVFAdjacency(const face::vector_ocf<FaceType> &fv)
  {
    if(FaceType::HasVFAdjacencyOcf()) return fv.IsVFAdjacencyEnabled();
    else return FaceType::HasVFAdjacency();
  }
This commit is contained in:
Paolo Cignoni 2012-03-31 01:16:58 +00:00
parent b43fffd46f
commit 8a631d48c1
3 changed files with 135 additions and 193 deletions

View File

@ -372,31 +372,6 @@ void Clear()
C()=Color4b::Gray; C()=Color4b::Gray;
} }
/// Reflection functions that speak about vertex and face properties.
static bool HasPerVertexNormal() { return VertexType::HasNormal() ; }
static bool HasPerVertexColor() { return VertexType::HasColor() ; }
static bool HasPerVertexMark() { return VertexType::HasMark() ; }
static bool HasPerVertexQuality() { return VertexType::HasQuality(); }
static bool HasPerVertexTexCoord(){ return VertexType::HasTexCoord(); }
static bool HasPerVertexRadius() { return VertexType::HasRadius(); }
static bool HasPerVertexFlags() { return VertexType::HasFlags(); }
static bool HasPolyInfo() { return FaceType::HasPolyInfo() ; }
static bool HasPerFaceColor() { return FaceType::HasFaceColor() ; }
static bool HasPerFaceNormal() { return FaceType::HasFaceNormal() ; }
static bool HasPerFaceMark() { return FaceType::HasFaceMark() ; }
static bool HasPerFaceQuality() { return FaceType::HasFaceQuality(); }
static bool HasPerFaceFlags() { return FaceType::HasFlags(); }
static bool HasPerWedgeColor() { return FaceType::HasWedgeColor() ; }
static bool HasPerWedgeNormal() { return FaceType::HasWedgeNormal() ; }
static bool HasPerWedgeMark() { return FaceType::HasWedgeMark() ; }
static bool HasPerWedgeQuality() { return FaceType::HasWedgeQuality(); }
static bool HasPerWedgeTexCoord() { return FaceType::HasWedgeTexCoord(); }
static bool HasFFTopology() { return FaceType::HasFFAdjacency(); }
static bool HasVFTopology() { return ((FaceType::HasVFAdjacency())&&(VertexType::HasVFAdjacency())); }
static bool HasTopology() { return HasFFTopology() || HasVFTopology(); }
int & SimplexNumber(){ return fn;} int & SimplexNumber(){ return fn;}
int & VertexNumber(){ return vn;} int & VertexNumber(){ return vn;}
@ -486,80 +461,71 @@ template <class MeshType> inline void Mark(MeshType & m, typename MeshType::Face
template <class MeshType> inline void UnMarkAll(MeshType & m) { ++m.imark; } template <class MeshType> inline void UnMarkAll(MeshType & m) { ++m.imark; }
template < class CType0, class CType1 , class CType2, class CType3>
bool HasPerVertexVFAdjacency (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasVFAdjacency();}
template < class CType0, class CType1, class CType2 , class CType3>
bool HasPerFaceVFAdjacency (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasVFAdjacency();}
template < class CType0, class CType1 , class CType2, class CType3> template < class CType0, class CType1 , class CType2, class CType3>
bool HasPerVertexVEAdjacency (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasVEAdjacency();} bool HasPerVertexVEAdjacency (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasVEAdjacency();}
template < class CType0, class CType1, class CType2 , class CType3> template < class CType0, class CType1, class CType2 , class CType3>
bool HasPerEdgeVEAdjacency (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::EdgeContainer::value_type::HasVEAdjacency();} bool HasPerEdgeVEAdjacency (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::EdgeContainer::value_type::HasVEAdjacency();}
template < class CType0, class CType1 , class CType2, class CType3> template < class VertexType> bool VertexVectorHasPerFaceVFAdjacency (const std::vector<VertexType> &) { return VertexType::HasVFAdjacency(); }
bool HasPerVertexQuality (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasQuality();} template < class FaceType > bool FaceVectorHasPerFaceVFAdjacency (const std::vector<FaceType > &) { return FaceType::HasVFAdjacency(); }
template < class CType0, class CType1 , class CType2, class CType3> template < class TriMeshType> bool HasPerFaceVFAdjacency (const TriMeshType &m) { return tri::FaceVectorHasPerFaceVFAdjacency (m.vert); }
bool HasPerVertexMark (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasMark();} template < class TriMeshType> bool HasPerVertexVFAdjacency (const TriMeshType &m) { return tri::VertexVectorHasPerFaceVFAdjacency(m.vert); }
template < class CType0, class CType1, class CType2 , class CType3>
bool HasPerVertexCurvature (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasCurvature();}
template < class CType0, class CType1 , class CType2, class CType3> template < class VertexType> bool VertexVectorHasPerVertexQuality (const std::vector<VertexType> &) { return VertexType::HasQuality (); }
bool HasPerVertexCurvatureDir (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasCurvatureDir();} template < class VertexType> bool VertexVectorHasPerVertexNormal (const std::vector<VertexType> &) { return VertexType::HasNormal (); }
template < class VertexType> bool VertexVectorHasPerVertexColor (const std::vector<VertexType> &) { return VertexType::HasColor (); }
template < class VertexType> bool VertexVectorHasPerVertexMark (const std::vector<VertexType> &) { return VertexType::HasMark (); }
template < class VertexType> bool VertexVectorHasPerVertexFlags (const std::vector<VertexType> &) { return VertexType::HasFlags (); }
template < class VertexType> bool VertexVectorHasPerVertexRadius (const std::vector<VertexType> &) { return VertexType::HasRadius (); }
template < class VertexType> bool VertexVectorHasPerVertexCurvature (const std::vector<VertexType> &) { return VertexType::HasCurvature (); }
template < class VertexType> bool VertexVectorHasPerVertexCurvatureDir(const std::vector<VertexType> &) { return VertexType::HasCurvatureDir(); }
template < class VertexType> bool VertexVectorHasPerVertexTexCoord (const std::vector<VertexType> &) { return VertexType::HasTexCoord (); }
template < class CType0, class CType1 , class CType2, class CType3> template < class TriMeshType> bool HasPerVertexQuality (const TriMeshType &m) { return tri::VertexVectorHasPerVertexQuality (m.vert); }
bool HasPerVertexColor (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasColor();} template < class TriMeshType> bool HasPerVertexNormal (const TriMeshType &m) { return tri::VertexVectorHasPerVertexNormal (m.vert); }
template < class TriMeshType> bool HasPerVertexColor (const TriMeshType &m) { return tri::VertexVectorHasPerVertexColor (m.vert); }
template < class TriMeshType> bool HasPerVertexMark (const TriMeshType &m) { return tri::VertexVectorHasPerVertexMark (m.vert); }
template < class TriMeshType> bool HasPerVertexFlags (const TriMeshType &m) { return tri::VertexVectorHasPerVertexFlags (m.vert); }
template < class TriMeshType> bool HasPerVertexRadius (const TriMeshType &m) { return tri::VertexVectorHasPerVertexRadius (m.vert); }
template < class TriMeshType> bool HasPerVertexCurvature (const TriMeshType &m) { return tri::VertexVectorHasPerVertexCurvature (m.vert); }
template < class TriMeshType> bool HasPerVertexCurvatureDir(const TriMeshType &m) { return tri::VertexVectorHasPerVertexCurvatureDir(m.vert); }
template < class TriMeshType> bool HasPerVertexTexCoord (const TriMeshType &m) { return tri::VertexVectorHasPerVertexTexCoord (m.vert); }
template < class CType0, class CType1, class CType2 , class CType3>
bool HasPerVertexTexCoord (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasTexCoord();}
template < class CType0, class CType1, class CType2 , class CType3> template < class FaceType> bool FaceVectorHasPerWedgeColor (const std::vector<FaceType> &) { return FaceType::HasWedgeColor (); }
bool HasPerVertexFlags (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasFlags();} template < class FaceType> bool FaceVectorHasPerWedgeNormal (const std::vector<FaceType> &) { return FaceType::HasWedgeNormal (); }
template < class FaceType> bool FaceVectorHasPerWedgeTexCoord(const std::vector<FaceType> &) { return FaceType::HasWedgeTexCoord(); }
template < class CType0, class CType1, class CType2, class CType3 >
bool HasPerVertexNormal (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasNormal();}
template < class CType0, class CType1, class CType2 , class CType3>
bool HasPerVertexRadius (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasRadius();}
template < class CType0, class CType1, class CType2 , class CType3>
bool HasPerWedgeTexCoord (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasWedgeTexCoord();}
template < class CType0, class CType1, class CType2 , class CType3>
bool HasPerWedgeNormal (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasWedgeNormal();}
template < class CType0, class CType1, class CType2 , class CType3>
bool HasPerWedgeColor (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasWedgeColor();}
template < class TriMeshType> bool HasPerWedgeColor (const TriMeshType &m) { return tri::FaceVectorHasPerWedgeColor (m.face); }
template < class TriMeshType> bool HasPerWedgeNormal (const TriMeshType &m) { return tri::FaceVectorHasPerWedgeNormal (m.face); }
template < class TriMeshType> bool HasPerWedgeTexCoord(const TriMeshType &m) { return tri::FaceVectorHasPerWedgeTexCoord(m.face); }
template < class CType0, class CType1, class CType2 , class CType3> template < class CType0, class CType1, class CType2 , class CType3>
bool HasPolyInfo (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasPolyInfo();} bool HasPolyInfo (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasPolyInfo();}
template < class CType0, class CType1, class CType2 , class CType3> template < class FaceType> bool FaceVectorHasPerFaceFlags (const std::vector<FaceType> &) { return FaceType::HasFlags (); }
bool HasPerFaceFlags (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasFlags();} template < class FaceType> bool FaceVectorHasPerFaceNormal (const std::vector<FaceType> &) { return FaceType::HasFaceNormal (); }
template < class FaceType> bool FaceVectorHasPerFaceColor (const std::vector<FaceType> &) { return FaceType::HasFaceColor (); }
template < class FaceType> bool FaceVectorHasPerFaceMark (const std::vector<FaceType> &) { return FaceType::HasFaceMark (); }
template < class FaceType> bool FaceVectorHasPerFaceQuality(const std::vector<FaceType> &) { return FaceType::HasFaceQuality(); }
template < class FaceType> bool FaceVectorHasFFAdjacency (const std::vector<FaceType> &) { return FaceType::HasFFAdjacency(); }
template < class FaceType> bool FaceVectorHasFEAdjacency (const std::vector<FaceType> &) { return FaceType::HasFEAdjacency(); }
template < class FaceType> bool FaceVectorHasFVAdjacency (const std::vector<FaceType> &) { return FaceType::HasFVAdjacency(); }
template < class FaceType> bool FaceVectorHasPerFaceCurvatureDir (const std::vector<FaceType> &) { return FaceType::HasCurvatureDir(); }
template < class CType0, class CType1, class CType2 , class CType3> template < class TriMeshType> bool HasPerFaceFlags (const TriMeshType &m) { return tri::FaceVectorHasPerFaceFlags (m.face); }
bool HasPerFaceNormal (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasFaceNormal();} template < class TriMeshType> bool HasPerFaceNormal (const TriMeshType &m) { return tri::FaceVectorHasPerFaceNormal (m.face); }
template < class TriMeshType> bool HasPerFaceColor (const TriMeshType &m) { return tri::FaceVectorHasPerFaceColor (m.face); }
template < class TriMeshType> bool HasPerFaceMark (const TriMeshType &m) { return tri::FaceVectorHasPerFaceMark (m.face); }
template < class TriMeshType> bool HasPerFaceQuality (const TriMeshType &m) { return tri::FaceVectorHasPerFaceQuality (m.face); }
template < class TriMeshType> bool HasPerFaceCurvatureDir(const TriMeshType &m) { return tri::FaceVectorHasPerFaceCurvatureDir(m.face); }
template < class TriMeshType> bool HasFFAdjacency (const TriMeshType &m) { return tri::FaceVectorHasFFAdjacency (m.face); }
template < class TriMeshType> bool HasFEAdjacency (const TriMeshType &m) { return tri::FaceVectorHasFEAdjacency (m.face); }
template < class TriMeshType> bool HasFVAdjacency (const TriMeshType &m) { return tri::FaceVectorHasFVAdjacency (m.face); }
template < class CType0, class CType1, class CType2 , class CType3>
bool HasPerFaceColor (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasFaceColor();}
template < class CType0, class CType1, class CType2 , class CType3>
bool HasPerFaceMark (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasMark();}
template < class CType0, class CType1, class CType2 , class CType3>
bool HasPerFaceQuality (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasFaceQuality();}
template < class CType0, class CType1, class CType2 , class CType3>
bool HasFFAdjacency (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasFFAdjacency();}
template < class CType0, class CType1, class CType2 , class CType3>
bool HasFEAdjacency (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasFEAdjacency();}
template < class CType0, class CType1, class CType2 , class CType3>
bool HasFVAdjacency (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasFVAdjacency();}
template < class CType0, class CType1, class CType2 , class CType3> template < class CType0, class CType1, class CType2 , class CType3>
bool HasVEAdjacency (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasVEAdjacency();} bool HasVEAdjacency (const TriMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TriMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasVEAdjacency();}

View File

@ -783,61 +783,53 @@ public:
namespace tri namespace tri
{ {
template < class FaceType >
bool FaceVectorHasPerFaceVFAdjacency(const face::vector_ocf<FaceType> &fv)
template < class VertContainerType, class FaceType, class Container1, class Container2 > {
bool HasPerFaceVFAdjacency (const TriMesh < VertContainerType , face::vector_ocf< FaceType >, Container1, Container2 > & m) if(FaceType::HasVFAdjacencyOcf()) return fv.IsVFAdjacencyEnabled();
{ else return FaceType::HasVFAdjacency();
if(FaceType::HasVFAdjacencyOcf()) return m.face.IsVFAdjacencyEnabled(); }
else return FaceType::FaceType::HasVFAdjacency(); template < class FaceType >
} bool FaceVectorHasFFAdjacency(const face::vector_ocf<FaceType> &fv)
{
template < class VertContainerType, class FaceType, class Container1, class Container2 > if(FaceType::HasFFAdjacencyOcf()) return fv.IsFFAdjacencyEnabled();
bool HasFFAdjacency (const TriMesh < VertContainerType , face::vector_ocf< FaceType >, Container1, Container2 > & m) else return FaceType::HasFFAdjacency();
{ }
if(FaceType::HasFFAdjacencyOcf()) return m.face.IsFFAdjacencyEnabled(); template < class FaceType >
else return FaceType::FaceType::HasFFAdjacency(); bool FaceVectorHasPerWedgeTexCoord(const face::vector_ocf<FaceType> &fv)
} {
if(FaceType::HasWedgeTexCoordOcf()) return fv.IsWedgeTexEnabled();
template < class VertContainerType, class FaceType, class Container1, class Container2 > else return FaceType::HasWedgeTexCoord();
bool HasPerWedgeTexCoord (const TriMesh < VertContainerType , face::vector_ocf< FaceType >, Container1, Container2 > & m) }
{ template < class FaceType >
if(FaceType::HasWedgeTexCoordOcf()) return m.face.IsWedgeTexEnabled(); bool FaceVectorHasPerFaceColor(const face::vector_ocf<FaceType> &fv)
else return FaceType::HasWedgeTexCoord(); {
} if(FaceType::HasFaceColorOcf()) return fv.IsColorEnabled();
else return FaceType::HasFaceColor();
template < class VertContainerType, class FaceType, class Container1, class Container2 > }
bool HasPerFaceColor (const TriMesh < VertContainerType , face::vector_ocf< FaceType >, Container1, Container2 > & m) template < class FaceType >
{ bool FaceVectorHasPerFaceQuality(const face::vector_ocf<FaceType> &fv)
if(FaceType::HasFaceColorOcf()) return m.face.IsColorEnabled(); {
else return FaceType::HasFaceColor(); if(FaceType::HasFaceQualityOcf()) return fv.IsQualityEnabled();
} else return FaceType::HasFaceQuality();
template < class VertContainerType, class FaceType, class Container1, class Container2 > }
bool HasPerFaceCurvatureDir (const TriMesh < VertContainerType , face::vector_ocf< FaceType >, Container1, Container2 > & m) template < class FaceType >
{ bool FaceVectorHasPerFaceMark(const face::vector_ocf<FaceType> &fv)
if(FaceType::HasFaceCurvatureDirOcf()) return m.face.IsCurvatureDirEnabled(); {
else return FaceType::HasFaceCurvatureDir(); if(FaceType::HasFaceMarkOcf()) return fv.IsMarkEnabled();
} else return FaceType::HasFaceMark();
}
template < class VertContainerType, class FaceType, class Container1, class Container2 > template < class FaceType >
bool HasPerFaceQuality (const TriMesh < VertContainerType , face::vector_ocf< FaceType >, Container1, Container2 > & m) bool FaceVectorHasPerFaceCurvatureDir(const face::vector_ocf<FaceType> &fv)
{ {
if(FaceType::HasFaceQualityOcf()) return m.face.IsQualityEnabled(); if(FaceType::HasCurvatureDirOcf()) return fv.IsCurvatureDirEnabled();
else return FaceType::HasFaceQuality(); else return FaceType::HasCurvatureDir();
} }
template < class FaceType >
template < class VertContainerType, class FaceType, class Container1, class Container2 > void ReorderFace( std::vector<size_t> &newFaceIndex, face::vector_ocf< FaceType > &faceVec)
bool HasPerFaceMark (const TriMesh < VertContainerType , face::vector_ocf< FaceType >, Container1, Container2 > & m) {
{ faceVec.ReorderFace(newFaceIndex);
if(FaceType::HasFaceMarkOcf()) return m.face.IsMarkEnabled(); }
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

View File

@ -642,64 +642,48 @@ public:
namespace tri namespace tri
{ {
template < class VertexType >
template < class, class,class, class> class TriMesh; bool VertexVectorHasPerVertexVFAdjacency(const vertex::vector_ocf<VertexType> &fv)
{
template < class VertexType, class ContainerType0, class Container1, class Container2 > if(VertexType::HasVFAdjacencyOcf()) return fv.IsVFAdjacencyEnabled();
bool HasPerVertexVFAdjacency (const TriMesh < vertex::vector_ocf< VertexType > , ContainerType0, Container1, Container2 > & m) else return VertexType::HasVFAdjacency();
{ }
if(VertexType::HasVFAdjacencyOcf()) return m.vert.IsVFAdjacencyEnabled(); template < class VertexType >
else return VertexType::HasVFAdjacency(); bool VertexVectorHasPerVertexRadius(const vertex::vector_ocf<VertexType> &fv)
} {
if(VertexType::HasRadiusOcf()) return fv.IsRadiusEnabled();
template < class VertexType, class ContainerType0, class ContainerType1 ,class ContainerType2 > else return VertexType::HasRadius();
bool HasPerVertexRadius (const TriMesh < vertex::vector_ocf< VertexType > , ContainerType0, ContainerType1, ContainerType2 > & m) }
{ template < class VertexType >
if(VertexType::HasRadiusOcf()) return m.vert.IsRadiusEnabled(); bool VertexVectorHasPerVertexQuality(const vertex::vector_ocf<VertexType> &fv)
else return VertexType::HasRadius(); {
} if(VertexType::HasQualityOcf()) return fv.IsQualityEnabled();
else return VertexType::HasQuality();
template < class VertexType, class ContainerType0, class ContainerType1 ,class ContainerType2> }
bool HasPerVertexQuality (const TriMesh < vertex::vector_ocf< VertexType > , ContainerType0, ContainerType1, ContainerType2> & m) template < class VertexType >
{ bool VertexVectorHasPerVertexNormal(const vertex::vector_ocf<VertexType> &fv)
if(VertexType::HasQualityOcf()) return m.vert.IsQualityEnabled(); {
else return VertexType::HasQuality(); if(VertexType::HasNormalOcf()) return fv.IsNormalEnabled();
} else return VertexType::HasNormal();
}
template < class VertexType, class ContainerType0, class ContainerType1 ,class ContainerType2 > template < class VertexType >
bool HasPerVertexTexCoord (const TriMesh < vertex::vector_ocf< VertexType > , ContainerType0, ContainerType1, ContainerType2> & m) bool VertexVectorHasPerVertexColor(const vertex::vector_ocf<VertexType> &fv)
{ {
if(VertexType::HasTexCoordOcf()) return m.vert.IsTexCoordEnabled(); if(VertexType::HasColorOcf()) return fv.IsColorEnabled();
else return VertexType::HasTexCoord(); else return VertexType::HasColor();
} }
template < class VertexType >
template < class VertexType, class ContainerType0, class ContainerType1 ,class ContainerType2 > bool VertexVectorHasPerVertexCurvature(const vertex::vector_ocf<VertexType> &fv)
bool HasPerVertexNormal (const TriMesh < vertex::vector_ocf< VertexType > , ContainerType0, ContainerType1, ContainerType2> & m) {
{ if(VertexType::HasCurvatureOcf()) return fv.IsCurvatureEnabled();
if(VertexType::HasNormalOcf()) return m.vert.IsNormalEnabled(); else return VertexType::HasCurvature();
else return VertexType::HasNormal(); }
} template < class VertexType >
bool VertexVectorHasPerVertexCurvatureDir(const vertex::vector_ocf<VertexType> &fv)
template < class VertexType, class ContainerType0, class ContainerType1 ,class ContainerType2> {
bool HasPerVertexColor (const TriMesh < vertex::vector_ocf< VertexType > , ContainerType0, ContainerType1, ContainerType2> & m) if(VertexType::HasCurvatureDirOcf()) return fv.IsCurvatureDirEnabled();
{ else return VertexType::HasCurvatureDir();
if(VertexType::HasColorOcf()) return m.vert.IsColorEnabled(); }
else return VertexType::HasColor();
}
template < class VertexType, class ContainerType0, class ContainerType1 ,class ContainerType2 >
bool HasPerVertexCurvature (const TriMesh < vertex::vector_ocf< VertexType > , ContainerType0, ContainerType1, ContainerType2 > & m)
{
if(VertexType::HasCurvatureOcf()) return m.vert.IsCurvatureEnabled();
else return VertexType::HasCurvature();
}
template < class VertexType, class ContainerType0, class ContainerType1 ,class ContainerType2>
bool HasPerVertexCurvatureDir (const TriMesh < vertex::vector_ocf< VertexType > , ContainerType0, ContainerType1, ContainerType2 > & m)
{
if(VertexType::HasCurvatureDirOcf()) return m.vert.IsCurvatureDirEnabled();
else return VertexType::HasCurvatureDir();
}
} }
}// end namespace vcg }// end namespace vcg