/**************************************************************************** * VCGLib o o * * Visual and Computer Graphics Library o o * * _ O _ * * Copyright(C) 2004-2016 \/)\/ * * Visual Computing Lab /\/| * * ISTI - Italian National Research Council | * * \ * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * * for more details. * * * ****************************************************************************/ #ifndef __VCG_TETRA_MESH #error "This file should not be included alone. It is automatically included by complex.h" #endif #ifndef __VCG_TETRA_COMPLEX_BASE #define __VCG_TETRA_COMPLEX_BASE namespace vcg { class PointerToAttribute { public: SimpleTempDataBase *_handle; // pointer to the SimpleTempData that stores the attribute std::string _name; // name of the attribute int _sizeof; // size of the attribute type (used only with VMI loading) int _padding; // padding (used only with VMI loading) int n_attr; // unique ID of the attribute std::type_index _type; void Resize(size_t sz) { ((SimpleTempDataBase *)_handle)->Resize(sz); } void Reorder(std::vector &newVertIndex) { ((SimpleTempDataBase *)_handle)->Reorder(newVertIndex); } bool operator<(const PointerToAttribute b) const { return (_name.empty() && b._name.empty()) ? (_handle < b._handle) : (_name < b._name); } PointerToAttribute() : _type(typeid(void)){}; }; namespace tetra { /** \addtogroup TetraMesh */ /*@{*/ /* MeshTypeHolder is a class which is used to define the types in the mesh */ template struct BaseMeshTypeHolder { typedef bool ScalarType; typedef std::vector CONTV; typedef std::vector CONTE; typedef std::vector CONTF; typedef std::vector CONTT; typedef CONTV VertContainer; typedef _Vertex VertexType; typedef typename TYPESPOOL::VertexPointer VertexPointer; typedef const typename TYPESPOOL::VertexPointer ConstVertexPointer; typedef bool CoordType; typedef typename CONTV::iterator VertexIterator; typedef typename CONTV::const_iterator ConstVertexIterator; typedef CONTE EdgeContainer; typedef typename CONTE::value_type EdgeType; typedef typename TYPESPOOL::EdgePointer EdgePointer; typedef typename CONTE::iterator EdgeIterator; typedef typename CONTE::const_iterator ConstEdgeIterator; typedef CONTF FaceContainer; typedef typename CONTF::value_type FaceType; typedef typename CONTF::const_iterator ConstFaceIterator; typedef typename CONTF::iterator FaceIterator; typedef typename TYPESPOOL::FacePointer FacePointer; typedef const typename TYPESPOOL::FacePointer ConstFacePointer; typedef CONTT TetraContainer; typedef typename CONTT::value_type TetraType; typedef typename TYPESPOOL::TetraPointer TetraPointer; typedef const typename TYPESPOOL::TetraPointer ConstTetraPointer; typedef typename CONTT::iterator TetraIterator; typedef typename CONTT::const_iterator ConstTetraIterator; }; template struct MeshTypeHolder : public T { }; template struct MeshTypeHolder : public T { typedef CONT VertContainer; typedef typename VertContainer::value_type VertexType; typedef VertexType *VertexPointer; typedef const VertexType *ConstVertexPointer; typedef typename VertexType::ScalarType ScalarType; typedef typename VertexType::CoordType CoordType; typedef typename VertContainer::iterator VertexIterator; typedef typename VertContainer::const_iterator ConstVertexIterator; }; template struct MeshTypeHolder : public T { typedef CONT EdgeContainer; typedef typename EdgeContainer::value_type EdgeType; typedef typename EdgeContainer::value_type *EdgePointer; typedef typename EdgeContainer::iterator EdgeIterator; typedef typename EdgeContainer::const_iterator ConstEdgeIterator; }; template struct MeshTypeHolder : public T { typedef CONT FaceContainer; typedef typename FaceContainer::value_type FaceType; typedef typename FaceContainer::const_iterator ConstFaceIterator; typedef typename FaceContainer::iterator FaceIterator; typedef FaceType *FacePointer; typedef const FaceType *ConstFacePointer; }; template struct MeshTypeHolder : public T { typedef CONT TetraContainer; typedef typename TetraContainer::value_type TetraType; typedef TetraType *TetraPointer; typedef const TetraType *ConstTetraPointer; typedef typename TetraContainer::iterator TetraIterator; typedef typename TetraContainer::const_iterator ConstTetraIterator; }; template struct Der : public MeshTypeHolder { }; struct DummyContainer { struct value_type { typedef int IAm; }; }; /** \brief The official \b mesh class As explained in \ref basic_concepts, this class is templated over a list of container of simplexes (like vertex, face, edges) */ template class TetraMesh : public MArity4, Container0, Der, Container1, Der, Container2, Der, Container3, Der> { public: typedef typename TetraMesh::ScalarType ScalarType; typedef typename TetraMesh::VertContainer VertContainer; typedef typename TetraMesh::EdgeContainer EdgeContainer; typedef typename TetraMesh::FaceContainer FaceContainer; typedef typename TetraMesh::TetraContainer TetraContainer; // types for vertex typedef typename TetraMesh::VertexType VertexType; typedef typename TetraMesh::VertexPointer VertexPointer; typedef typename TetraMesh::ConstVertexPointer ConstVertexPointer; typedef typename TetraMesh::CoordType CoordType; typedef typename TetraMesh::VertexIterator VertexIterator; typedef typename TetraMesh::ConstVertexIterator ConstVertexIterator; // types for edge typedef typename TetraMesh::EdgeType EdgeType; typedef typename TetraMesh::EdgePointer EdgePointer; typedef typename TetraMesh::EdgeIterator EdgeIterator; typedef typename TetraMesh::ConstEdgeIterator ConstEdgeIterator; //types for face typedef typename TetraMesh::FaceType FaceType; typedef typename TetraMesh::ConstFaceIterator ConstFaceIterator; typedef typename TetraMesh::FaceIterator FaceIterator; typedef typename TetraMesh::FacePointer FacePointer; typedef typename TetraMesh::ConstFacePointer ConstFacePointer; // types for hedge typedef typename TetraMesh::TetraType TetraType; typedef typename TetraMesh::TetraPointer TetraPointer; typedef typename TetraMesh::ConstTetraPointer ConstTetraPointer; typedef typename TetraMesh::TetraIterator TetraIterator typedef typename TetraMesh::ConstTetraIterator ConstTetraIterator; typedef vcg::PointerToAttribute PointerToAttribute; typedef TetraMesh MeshType; typedef Box3 BoxType; /// Container of vertices, usually a vector. VertContainer vert; /// Current number of vertices; this member is for internal use only. You should always use the VN() member int vn; /// Current number of vertices inline int VN() const { return vn; } /// Container of edges, usually a vector. EdgeContainer edge; /// Current number of edges; this member is for internal use only. You should always use the EN() member int en; /// Current number of edges inline int EN() const { return en; } /// Container of faces, usually a vector. FaceContainer face; /// Current number of faces; this member is for internal use only. You should always use the FN() member int fn; /// Current number of faces inline int FN() const { return fn; } /// Container of tetras, usually a vector. TetraContainer tetra; /// Current number of tetras; this member is for internal use only. You should always use the TN() member int tn; /// Current number of tetras; inline int TN() const { return tn; } /// Bounding box of the mesh Box3 bbox; /// Nomi di textures // std::vector textures; // std::vector normalmaps; int attrn; // total numer of attribute created std::set vert_attr; std::set edge_attr; std::set face_attr; std::set tetra_attr; std::set mesh_attr; template class AttributeHandle { public: AttributeHandle() { _handle = (SimpleTempData *)NULL; } AttributeHandle(void *ah, const int &n) : _handle((SimpleTempData *)ah), n_attr(n) {} AttributeHandle operator=(const PointerToAttribute &pva) { _handle = (SimpleTempData *)pva._handle; n_attr = pva.n_attr; return (*this); } //pointer to the SimpleTempData that stores the attribute SimpleTempData *_handle; // its attribute number int n_attr; // access function template ATTR_TYPE &operator[](const RefType &i) { return (*_handle)[i]; } void resize(size_t /*size*/){}; }; template class PerVertexAttributeHandle : public AttributeHandle { public: PerVertexAttributeHandle() : AttributeHandle() {} PerVertexAttributeHandle(void *ah, const int &n) : AttributeHandle(ah, n) {} }; template class PerFaceAttributeHandle : public AttributeHandle { public: PerFaceAttributeHandle() : AttributeHandle() {} PerFaceAttributeHandle(void *ah, const int &n) : AttributeHandle(ah, n) {} }; template class PerEdgeAttributeHandle : public AttributeHandle { public: PerEdgeAttributeHandle() : AttributeHandle() {} PerEdgeAttributeHandle(void *ah, const int &n) : AttributeHandle(ah, n) {} }; template class PerTetraAttributeHandle : public AttributeHandle { public: PerTetraAttributeHandle() : AttributeHandle() {} PerTetraAttributeHandle(void *ah, const int &n) : AttributeHandle(ah, n) {} }; template class PerMeshAttributeHandle { public: PerMeshAttributeHandle() { _handle = NULL; } PerMeshAttributeHandle(void *ah, const int &n) : _handle((Attribute *)ah), n_attr(n) {} PerMeshAttributeHandle operator=(const PerMeshAttributeHandle &pva) { _handle = (Attribute *)pva._handle; n_attr = pva.n_attr; return (*this); } Attribute *_handle; int n_attr; ATTR_TYPE &operator()() { return *((Attribute *)_handle)->attribute; } }; // Some common Handle typedefs to simplify use typedef typename MeshType::template PerVertexAttributeHandle PerVertexScalarHandle; typedef typename MeshType::template PerVertexAttributeHandle PerVertexIntHandle; typedef typename MeshType::template PerVertexAttributeHandle PerVertexBoolHandle; typedef typename MeshType::template PerVertexAttributeHandle PerVertexCoordHandle; typedef typename MeshType::template PerFaceAttributeHandle PerFaceScalarHandle; typedef typename MeshType::template PerFaceAttributeHandle PerFaceIntHandle; typedef typename MeshType::template PerFaceAttributeHandle PerFaceBoolHandle; typedef typename MeshType::template PerFaceAttributeHandle PerFaceCoordHandle; typedef typename MeshType::template PerTetraAttributeHandle PerTetraScalarHandle; typedef typename MeshType::template PerTetraAttributeHandle PerTetraIntHandle; typedef typename MeshType::template PerTetraAttributeHandle PerTetraBoolHandle; typedef typename MeshType::template PerTetraAttributeHandle PerTetraCoordHandle; // the camera member (that should keep the intrinsics) is no more needed since 2006, when intrisncs moved into the Shot structure //Camera camera; // intrinsic Shot shot; // intrinsic && extrinsic private: /// The per-mesh color. Not very useful and meaningful... Color4b c; public: inline const Color4b &C() const { return c; } inline Color4b &C() { return c; } inline Color4b cC() const { return c; } /// Default constructor TetraMesh() { Clear(); } /// destructor ~TetraMesh() { Clear(); } int Mem(const int &nv, const int &nf, const int &nt) const { typename std::set::const_iterator i; int size = 0; size += sizeof(TetraMesh) + sizeof(VertexType) * nv + sizeof(FaceType) * nf + sizeof(TetraType) * nt; for (i = vert_attr.begin(); i != vert_attr.end(); ++i) size += ((SimpleTempDataBase *)(*i)._handle)->SizeOf() * nv; for (i = edge_attr.begin(); i != edge_attr.end(); ++i) size += ((SimpleTempDataBase *)(*i)._handle)->SizeOf() * en; for (i = face_attr.begin(); i != face_attr.end(); ++i) size += ((SimpleTempDataBase *)(*i)._handle)->SizeOf() * nf; for (i = tetra_attr.begin(); i != tetra_attr.end(); ++i) size += ((SimpleTempDataBase *)(*i)._handle)->SizeOf() * nt; for (i = mesh_attr.begin(); i != mesh_attr.end(); ++i) size += ((SimpleTempDataBase *)(*i)._handle)->SizeOf(); return size; } int MemUsed() const { return Mem(vert.size(), face.size(), tetra.size()); } inline int MemNeeded() const { return Mem(vn, fn, tn); } /// Function to destroy the mesh void Clear() { for (FaceIterator fi = face.begin(); fi != face.end(); ++fi) (*fi).Dealloc(); vert.clear(); face.clear(); edge.clear(); tetra.clear(); // textures.clear(); // normalmaps.clear(); vn = 0; en = 0; fn = 0; hn = 0; imark = 0; C() = Color4b::Gray; } void ClearAttributes() { // Clear attributes typename std::set::iterator i; for (i = vert_attr.begin(); i != vert_attr.end(); ++i) delete ((SimpleTempDataBase *)(*i)._handle); vert_attr.clear(); for (i = edge_attr.begin(); i != edge_attr.end(); ++i) delete ((SimpleTempDataBase *)(*i)._handle); edge_attr.clear(); for (i = face_attr.begin(); i != face_attr.end(); ++i) delete ((SimpleTempDataBase *)(*i)._handle); face_attr.clear(); for (i = tetra_attr.begin(); i != tetra_attr.end(); ++i) delete ((SimpleTempDataBase *)(*i)._handle); tetra_attr.clear(); for (i = mesh_attr.begin(); i != mesh_attr.end(); ++i) delete ((SimpleTempDataBase *)(*i)._handle); mesh_attr.clear(); attrn = 0; } bool IsEmpty() const { return vert.empty() && edge.empty() && face.empty() && tetra.empty(); } int &TetraNumber() { return tn; } int &SimplexNumber() { return fn; } int &VertexNumber() { return vn; } /// The incremental mark int imark; private: // TetraMesh cannot be copied. Use Append (see vcg/complex/append.h) TetraMesh operator=(const TetraMesh & /*m*/) { assert(0); return TetraMesh(); } TetraMesh(const TetraMesh &) {} }; // end class Mesh /// Initialize the imark-system of the faces template inline void InitFaceIMark(MeshType &m) { typename MeshType::FaceIterator f; for (f = m.face.begin(); f != m.face.end(); ++f) if (!(*f).IsD() && (*f).IsR() && (*f).IsW()) (*f).InitIMark(); } /// Initialize the imark-system of the vertices template inline void InitVertexIMark(MeshType &m) { typename MeshType::VertexIterator vi; for (vi = m.vert.begin(); vi != m.vert.end(); ++vi) if (!(*vi).IsD() && (*vi).IsRW()) (*vi).InitIMark(); } ///initialize the imark-sysyem of the tetras template inline void InitTetraIMark(MeshType &m) { typename MeshType::TetraIterator ti; for (ti = m.tetra.begin(); ti != m.tetra.end(); ++ti) if (!(*ti).IsD() && (*ti).IsRW()) (*ti).InitIMark(); } /** \brief Access function to the incremental mark. You should not use this member directly. In most of the case just use IsMarked() and Mark() */ template inline int &IMark(MeshType &m) { return m.imark; } /** \brief Check if the vertex incremental mark matches the one of the mesh. @param m the mesh containing the element @param v Vertex pointer */ template inline bool IsMarked(MeshType &m, typename MeshType::ConstVertexPointer v) { return v->cIMark() == m.imark; } /** \brief Check if the face incremental mark matches the one of the mesh. @param m the mesh containing the element @param f Face pointer */ template inline bool IsMarked(MeshType &m, typename MeshType::ConstFacePointer f) { return f->cIMark() == m.imark; } /** \brief Check if the tetra incremental mark matches the one of the mesh. @param m the mesh containing the element @param t tetra pointer */ template inline bool IsMarked(MeshType &m, typename MeshType::ConstTetraPointer t) { return t->cIMark() == m.imark; } /** \brief Set the vertex incremental mark of the vertex to the one of the mesh. @param m the mesh containing the element @param v Vertex pointer */ template inline void Mark(MeshType &m, typename MeshType::VertexPointer v) { v->IMark() = m.imark; } /** \brief Set the face incremental mark of the vertex to the one of the mesh. @param m the mesh containing the element @param f Vertex pointer */ template inline void Mark(MeshType &m, typename MeshType::FacePointer f) { f->IMark() = m.imark; } /** \brief Set the tetra incremental mark to the one of the mesh. @param m the mesh containing the element @param t tetra pointer */ template inline void Mark(MeshType &m, typename MeshType::TetraPointer t) { t->IMark() = m.imark; } /** \brief Unmark, in constant time, all the elements (face and vertices) of a mesh. @param m the mesh containing the element In practice this function just increment the internal counter that stores the value for which an element is considered marked; therefore all the mesh elements become immediately un-mmarked. */ template inline void UnMarkAll(MeshType &m) { ++m.imark; } //template < class CType0, class CType1 , class CType2, class CType3> //bool HasPerVertexVEAdjacency (const TetraMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TetraMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasVEAdjacency();} //template < class CType0, class CType1, class CType2 , class CType3> //bool HasPerEdgeVEAdjacency (const TetraMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TetraMesh < CType0 , CType1, CType2, CType3>::EdgeContainer::value_type::HasVEAdjacency();} //TODO: ADD FT ET ADJACENCY template bool VertexVectorHasVFAdjacency(const std::vector &) { return VertexType::HasVFAdjacency(); } template bool VertexVectorHasVEAdjacency(const std::vector &) { return VertexType::HasVEAdjacency(); } template bool VertexVectorHasVTAdjacency(const std::vector &) { return VertexType::HasVTAdjacency(); } template bool EdgeVectorHasVEAdjacency(const std::vector &) { return EdgeType::HasVEAdjacency(); } template bool EdgeVectorHasEEAdjacency(const std::vector &) { return EdgeType::HasEEAdjacency(); } template bool FaceVectorHasVFAdjacency(const std::vector &) { return FaceType::HasVFAdjacency(); } template bool HasPerVertexVFAdjacency(const TetraMeshType &m) { return tetra::VertexVectorHasVFAdjacency(m.vert); } template bool HasPerVertexVEAdjacency(const TetraMeshType &m) { return tetra::VertexVectorHasVEAdjacency(m.vert); } template bool HasPerVertexVTAdjacency(const TetraMeshType &m) { return tetra::VertexVectorHasVTAdjacency(m.vert); } template bool HasPerEdgeVEAdjacency(const TetraMeshType &m) { return tetra::EdgeVectorHasVEAdjacency(m.edge); } template bool HasPerFaceVFAdjacency(const TetraMeshType &m) { return tetra::FaceVectorHasVFAdjacency(m.face); } template bool VertexVectorHasPerVertexQuality(const std::vector &) { return VertexType::HasQuality(); } template bool VertexVectorHasPerVertexNormal(const std::vector &) { return VertexType::HasNormal(); } template bool VertexVectorHasPerVertexColor(const std::vector &) { return VertexType::HasColor(); } template bool VertexVectorHasPerVertexMark(const std::vector &) { return VertexType::HasMark(); } template bool VertexVectorHasPerVertexFlags(const std::vector &) { return VertexType::HasFlags(); } template bool VertexVectorHasPerVertexRadius(const std::vector &) { return VertexType::HasRadius(); } template bool VertexVectorHasPerVertexCurvature(const std::vector &) { return VertexType::HasCurvature(); } template bool VertexVectorHasPerVertexCurvatureDir(const std::vector &) { return VertexType::HasCurvatureDir(); } template bool VertexVectorHasPerVertexTexCoord(const std::vector &) { return VertexType::HasTexCoord(); } template bool HasPerVertexQuality(const TetraMeshType &m) { return tetra::VertexVectorHasPerVertexQuality(m.vert); } template bool HasPerVertexNormal(const TetraMeshType &m) { return tetra::VertexVectorHasPerVertexNormal(m.vert); } template bool HasPerVertexColor(const TetraMeshType &m) { return tetra::VertexVectorHasPerVertexColor(m.vert); } template bool HasPerVertexMark(const TetraMeshType &m) { return tetra::VertexVectorHasPerVertexMark(m.vert); } template bool HasPerVertexFlags(const TetraMeshType &m) { return tetra::VertexVectorHasPerVertexFlags(m.vert); } template bool HasPerVertexRadius(const TetraMeshType &m) { return tetra::VertexVectorHasPerVertexRadius(m.vert); } template bool HasPerVertexCurvature(const TetraMeshType &m) { return tetra::VertexVectorHasPerVertexCurvature(m.vert); } template bool HasPerVertexCurvatureDir(const TetraMeshType &m) { return tetra::VertexVectorHasPerVertexCurvatureDir(m.vert); } template bool HasPerVertexTexCoord(const TetraMeshType &m) { return tetra::VertexVectorHasPerVertexTexCoord(m.vert); } template bool EdgeVectorHasPerEdgeQuality(const std::vector &) { return EdgeType::HasQuality(); } template bool EdgeVectorHasPerEdgeNormal(const std::vector &) { return EdgeType::HasNormal(); } template bool EdgeVectorHasPerEdgeColor(const std::vector &) { return EdgeType::HasColor(); } template bool EdgeVectorHasPerEdgeMark(const std::vector &) { return EdgeType::HasMark(); } template bool EdgeVectorHasPerEdgeFlags(const std::vector &) { return EdgeType::HasFlags(); } template bool HasPerEdgeQuality(const TetraMeshType &m) { return tetra::EdgeVectorHasPerEdgeQuality(m.edge); } template bool HasPerEdgeNormal(const TetraMeshType &m) { return tetra::EdgeVectorHasPerEdgeNormal(m.edge); } template bool HasPerEdgeColor(const TetraMeshType &m) { return tetra::EdgeVectorHasPerEdgeColor(m.edge); } template bool HasPerEdgeMark(const TetraMeshType &m) { return tetra::EdgeVectorHasPerEdgeMark(m.edge); } template bool HasPerEdgeFlags(const TetraMeshType &m) { return tetra::EdgeVectorHasPerEdgeFlags(m.edge); } template bool FaceVectorHasPerWedgeColor(const std::vector &) { return FaceType::HasWedgeColor(); } template bool FaceVectorHasPerWedgeNormal(const std::vector &) { return FaceType::HasWedgeNormal(); } template bool FaceVectorHasPerWedgeTexCoord(const std::vector &) { return FaceType::HasWedgeTexCoord(); } template bool HasPerWedgeColor(const TetraMeshType &m) { return tetra::FaceVectorHasPerWedgeColor(m.face); } template bool HasPerWedgeNormal(const TetraMeshType &m) { return tetra::FaceVectorHasPerWedgeNormal(m.face); } template bool HasPerWedgeTexCoord(const TetraMeshType &m) { return tetra::FaceVectorHasPerWedgeTexCoord(m.face); } // template // bool HasPolyInfo(const TetraMesh & /*m*/) { return TetraMesh::FaceContainer::value_type::HasPolyInfo(); } template bool FaceVectorHasPerFaceFlags(const std::vector &) { return FaceType::HasFlags(); } template bool FaceVectorHasPerFaceNormal(const std::vector &) { return FaceType::HasNormal(); } template bool FaceVectorHasPerFaceColor(const std::vector &) { return FaceType::HasColor(); } template bool FaceVectorHasPerFaceMark(const std::vector &) { return FaceType::HasMark(); } template bool FaceVectorHasPerFaceQuality(const std::vector &) { return FaceType::HasQuality(); } template bool FaceVectorHasFFAdjacency(const std::vector &) { return FaceType::HasFFAdjacency(); } template bool FaceVectorHasFEAdjacency(const std::vector &) { return FaceType::HasFEAdjacency(); } template bool FaceVectorHasFVAdjacency(const std::vector &) { return FaceType::HasFVAdjacency(); } template bool FaceVectorHasPerFaceCurvatureDir(const std::vector &) { return FaceType::HasCurvatureDir(); } template bool HasPerFaceFlags(const TetraMeshType &m) { return tetra::FaceVectorHasPerFaceFlags(m.face); } template bool HasPerFaceNormal(const TetraMeshType &m) { return tetra::FaceVectorHasPerFaceNormal(m.face); } template bool HasPerFaceColor(const TetraMeshType &m) { return tetra::FaceVectorHasPerFaceColor(m.face); } template bool HasPerFaceMark(const TetraMeshType &m) { return tetra::FaceVectorHasPerFaceMark(m.face); } template bool HasPerFaceQuality(const TetraMeshType &m) { return tetra::FaceVectorHasPerFaceQuality(m.face); } template bool HasPerFaceCurvatureDir(const TetraMeshType &m) { return tetra::FaceVectorHasPerFaceCurvatureDir(m.face); } template bool HasFFAdjacency(const TetraMeshType &m) { return tetra::FaceVectorHasFFAdjacency(m.face); } template bool HasEEAdjacency(const TetraMeshType &m) { return tetra::EdgeVectorHasEEAdjacency(m.edge); } template bool HasFEAdjacency(const TetraMeshType &m) { return tetra::FaceVectorHasFEAdjacency(m.face); } template bool HasFVAdjacency(const TetraMeshType &m) { return tetra::FaceVectorHasFVAdjacency(m.face); } //:::::::::::TETRA:::::::::::::::: template bool TetraVectorHasVTAdjacency(const std::vector &) { return TetraType::HasVTAdjacency(); } template bool HasTVAdjacency(const TetraMeshType &m) { return tetra::TetraVectorHasVTAdjacency(m.tetra); } template bool HasVFAdjacency(const TetraMeshType &m) { return tetra::FaceVectorHasVFAdjacency(m.face) && tetra::VertexVectorHasVFAdjacency(m.vert); } template bool HasVEAdjacency(const TetraMeshType &m) { return tetra::EdgeVectorHasVEAdjacency(m.edge) && tetra::VertexVectorHasVEAdjacency(m.vert); } template bool HasVTAdjacency(const TetraMeshType &m) { return tetra::VertexVectorHasVTAdjacency(m.vert) && tetra::TetraVectorHasVTAdjacency(m.tetra); } //template < class CType0, class CType1, class CType2 , class CType3> //bool HasVEAdjacency (const TetraMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TetraMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasVEAdjacency();} // template // bool HasVHAdjacency(const TetraMesh & /*m*/) { return TetraMesh::VertContainer::value_type::HasVHAdjacency(); } template bool HasEVAdjacency(const TetraMesh & /*m*/) { return TetraMesh::EdgeType::HasEVAdjacency(); } //template < class CType0, class CType1, class CType2 , class CType3> //bool HasEEAdjacency (const TetraMesh < CType0, CType1, CType2, CType3> & /*m*/) {return TetraMesh < CType0 , CType1, CType2, CType3>::EdgeType::HasEEAdjacency();} template bool HasEFAdjacency(const TetraMesh & /*m*/) { return TetraMesh::EdgeType::HasEFAdjacency(); } // template // bool HasEHAdjacency(const TetraMesh & /*m*/) { return TetraMesh::EdgeType::HasEHAdjacency(); } // template // bool HasFHAdjacency(const TetraMesh & /*m*/) { return TetraMesh::FaceType::HasFHAdjacency(); } // template // bool HasHVAdjacency(const TetraMesh & /*m*/) { return TetraMesh::HEdgeType::HasHVAdjacency(); } // template // bool HasHEAdjacency(const TetraMesh & /*m*/) { return TetraMesh::HEdgeType::HasHEAdjacency(); } // template // bool HasHFAdjacency(const TetraMesh & /*m*/) { return TetraMesh::HEdgeType::HasHFAdjacency(); } // template // bool HasHNextAdjacency(const TetraMesh & /*m*/) { return TetraMesh::HEdgeType::HasHNextAdjacency(); } // template // bool HasHPrevAdjacency(const TetraMesh & /*m*/) { return TetraMesh::HEdgeType::HasHPrevAdjacency(); } // template // bool HasHOppAdjacency(const TetraMesh & /*m*/) { return TetraMesh::HEdgeType::HasHOppAdjacency(); } // //template < class CType0, class CType1 , class CType2, class CType3> //bool HasVFAdjacency (const TetraMesh < CType0 , CType1, CType2, CType3> & m ) { // // gcc 4.4: if the expressions assigned to a1 and a2 are replaced in the assert we get a compilation error // // for the macro assert // bool a1 = TetraMesh < CType0 , CType1, CType2, CType3>::FaceContainer::value_type::HasVFAdjacency(); // bool a2 = TetraMesh < CType0 , CType1, CType2, CType3>::VertContainer::value_type::HasVFAdjacency(); // // a1 and a2 are still evaluated but not referenced, this causes a warning // (void)a1; // (void)a2; // assert(a1==a2); // // return vcg::tetra::HasPerVertexVFAdjacency< CType0, CType1 , CType2, CType3>(m) && // vcg::tetra::HasPerFaceVFAdjacency< CType0, CType1 , CType2, CType3>(m) ; //} template bool HasPerVertexAttribute(const MeshType &m, std::string name) { typename std::set::const_iterator ai; typename MeshType::PointerToAttribute h; h._name = name; ai = m.vert_attr.find(h); return (ai != m.vert_attr.end()); } template bool HasPerFaceAttribute(const MeshType &m, std::string name) { typename std::set::const_iterator ai; typename MeshType::PointerToAttribute h; h._name = name; ai = m.face_attr.find(h); return (ai != m.face_attr.end()); } template bool HasPerTetraAttribute(const MeshType &m, std::string name) { typename std::set::const_iterator ai; typename MeshType::PointerToAttribute h; h._name = name; ai = m.tetra_attr.find(h); return (ai != m.tetra_attr.end()); } template bool HasPerMeshAttribute(const MeshType &m, std::string name) { typename std::set::const_iterator ai; typename MeshType::PointerToAttribute h; h._name = name; ai = m.mesh_attr.find(h); return (ai != m.mesh_attr.end()); } template void RequireVertexCompactness(MeshType &m) { if (m.vert.size() != size_t(m.vn)) throw vcg::MissingCompactnessException("Vertex Vector Contains deleted elements"); } template void RequireFaceCompactness(MeshType &m) { if (m.face.size() != size_t(m.fn)) throw vcg::MissingCompactnessException("Face Vector Contains deleted elements"); } template void RequireEdgeCompactness(MeshType &m) { if (m.edge.size() != size_t(m.en)) throw vcg::MissingCompactnessException("Edge Vector Contains deleted elements"); } template void RequireTetraCompactness(MeshType &m) { if (m.tetra.size() != size_t(m.tn)) throw vcg::MissingCompactnessException("Tetra Vector Contains deleted elements"); } template void RequireCompactness(MeshType &m) { RequireVertexCompactness(m); RequireFaceCompactness(m); RequireEdgeCompactness(m); RequireTetraCompactness(m); } template void RequireTriangularMesh(MeshType &m) { // if (tetra::HasPolyInfo(m)) throw vcg::MissingTriangularRequirementException(""); } template void RequirePolygonalMesh(MeshType &m) { // if (!tetra::HasPolyInfo(m)) throw vcg::MissingPolygonalRequirementException(""); } template void RequireVFAdjacency(MeshType &m) { if (!tetra::HasVFAdjacency(m)) throw vcg::MissingComponentException("VFAdjacency"); } template void RequireVEAdjacency(MeshType &m) { if (!tetra::HasVEAdjacency(m)) throw vcg::MissingComponentException("VEAdjacency"); } template void RequireFFAdjacency(MeshType &m) { if (!tetra::HasFFAdjacency(m)) throw vcg::MissingComponentException("FFAdjacency"); } template void RequireEEAdjacency(MeshType &m) { if (!tetra::HasEEAdjacency(m)) throw vcg::MissingComponentException("EEAdjacency"); } template void RequireFEAdjacency(MeshType &m) { if (!tetra::HasFEAdjacency(m)) throw vcg::MissingComponentException("FEAdjacency"); } template void RequireVTAdjacency(MeshType &m) { if (!tetra::HasVTAdjacency(m)) throw vcg::MissingComponentException("VTAdjacency"); } // template // void RequireFHAdjacency(MeshType &m) // { // if (!tetra::HasFHAdjacency(m)) // throw vcg::MissingComponentException("FHAdjacency"); // } template void RequirePerVertexQuality(MeshType &m) { if (!tetra::HasPerVertexQuality(m)) throw vcg::MissingComponentException("PerVertexQuality "); } template void RequirePerVertexNormal(MeshType &m) { if (!tetra::HasPerVertexNormal(m)) throw vcg::MissingComponentException("PerVertexNormal "); } template void RequirePerVertexColor(MeshType &m) { if (!tetra::HasPerVertexColor(m)) throw vcg::MissingComponentException("PerVertexColor "); } template void RequirePerVertexMark(MeshType &m) { if (!tetra::HasPerVertexMark(m)) throw vcg::MissingComponentException("PerVertexMark "); } template void RequirePerVertexFlags(MeshType &m) { if (!tetra::HasPerVertexFlags(m)) throw vcg::MissingComponentException("PerVertexFlags "); } template void RequirePerVertexRadius(MeshType &m) { if (!tetra::HasPerVertexRadius(m)) throw vcg::MissingComponentException("PerVertexRadius "); } template void RequirePerVertexCurvature(MeshType &m) { if (!tetra::HasPerVertexCurvature(m)) throw vcg::MissingComponentException("PerVertexCurvature "); } template void RequirePerVertexCurvatureDir(MeshType &m) { if (!tetra::HasPerVertexCurvatureDir(m)) throw vcg::MissingComponentException("PerVertexCurvatureDir"); } template void RequirePerVertexTexCoord(MeshType &m) { if (!tetra::HasPerVertexTexCoord(m)) throw vcg::MissingComponentException("PerVertexTexCoord "); } template void RequirePerEdgeQuality(MeshType &m) { if (!tetra::HasPerEdgeQuality(m)) throw vcg::MissingComponentException("PerEdgeQuality "); } template void RequirePerEdgeNormal(MeshType &m) { if (!tetra::HasPerEdgeNormal(m)) throw vcg::MissingComponentException("PerEdgeNormal "); } template void RequirePerEdgeColor(MeshType &m) { if (!tetra::HasPerEdgeColor(m)) throw vcg::MissingComponentException("PerEdgeColor "); } template void RequirePerEdgeMark(MeshType &m) { if (!tetra::HasPerEdgeMark(m)) throw vcg::MissingComponentException("PerEdgeMark "); } template void RequirePerEdgeFlags(MeshType &m) { if (!tetra::HasPerEdgeFlags(m)) throw vcg::MissingComponentException("PerEdgeFlags "); } template void RequirePerFaceFlags(MeshType &m) { if (!tetra::HasPerFaceFlags(m)) throw vcg::MissingComponentException("PerFaceFlags "); } template void RequirePerFaceNormal(MeshType &m) { if (!tetra::HasPerFaceNormal(m)) throw vcg::MissingComponentException("PerFaceNormal "); } template void RequirePerFaceColor(MeshType &m) { if (!tetra::HasPerFaceColor(m)) throw vcg::MissingComponentException("PerFaceColor "); } template void RequirePerFaceMark(MeshType &m) { if (!tetra::HasPerFaceMark(m)) throw vcg::MissingComponentException("PerFaceMark "); } template void RequirePerFaceQuality(MeshType &m) { if (!tetra::HasPerFaceQuality(m)) throw vcg::MissingComponentException("PerFaceQuality "); } template void RequirePerFaceCurvatureDir(MeshType &m) { if (!tetra::HasPerFaceCurvatureDir(m)) throw vcg::MissingComponentException("PerFaceCurvatureDir"); } template void RequirePerFaceWedgeColor(MeshType &m) { if (!tetra::HasPerWedgeColor(m)) throw vcg::MissingComponentException("PerFaceWedgeColor "); } template void RequirePerFaceWedgeNormal(MeshType &m) { if (!tetra::HasPerWedgeNormal(m)) throw vcg::MissingComponentException("PerFaceWedgeNormal "); } template void RequirePerFaceWedgeTexCoord(MeshType &m) { if (!tetra::HasPerWedgeTexCoord(m)) throw vcg::MissingComponentException("PerFaceWedgeTexCoord"); } template void RequirePerVertexAttribute(MeshType &m, const char *name) { if (!HasPerVertexAttribute(m, name)) throw vcg::MissingComponentException("PerVertex attribute"); } template void RequirePerEdgeAttribute(MeshType &m, const char *name) { if (!HasPerEdgeAttribute(m, name)) throw vcg::MissingComponentException("PerEdge attribute"); } template void RequirePerFaceAttribute(MeshType &m, const char *name) { if (!HasPerFaceAttribute(m, name)) throw vcg::MissingComponentException("PerFace attribute"); } template void RequirePerMeshAttribute(MeshType &m, const char *name) { if (!HasPerMeshAttribute(m, name)) throw vcg::MissingComponentException("PerMesh attribute"); } /*@}*/ /*@}*/ } // end namespace } // end namespace #endif // BASE_H