diff --git a/apps/sample/trimesh_allocate/trimesh_allocate.cpp b/apps/sample/trimesh_allocate/trimesh_allocate.cpp index ca540491..63b1df0c 100644 --- a/apps/sample/trimesh_allocate/trimesh_allocate.cpp +++ b/apps/sample/trimesh_allocate/trimesh_allocate.cpp @@ -23,7 +23,7 @@ /*! \file trimesh_allocate.cpp \ingroup code_sample -\brief the minimal example of using the attributes +\brief the minimal example about creating and deleting elements Attributes are a simple mechanism to associate user-defined 'attributes' to the simplicies and to the mesh. \ref attributes for more Details @@ -95,6 +95,10 @@ int main() } } + // To remove the elements marked as deleted use + vcg::tri::Allocator::CompactFaceVector(m); + vcg::tri::Allocator::CompactVertexVector(m); + // finally lets copy this mesh onto another one. MyMesh m2; vcg::tri::Append::MeshCopy(m2,m); diff --git a/docs/Doxygen/allocation.dxy b/docs/Doxygen/allocation.dxy index 49262169..3cb3e4f2 100644 --- a/docs/Doxygen/allocation.dxy +++ b/docs/Doxygen/allocation.dxy @@ -42,10 +42,9 @@ Therefore when you scan the containers of vertices and faces you could encounter \until } \until } In some situations, particularly when you have to loop many many times over the element of the mesh without deleting/creating anything, it can be practical and convenient to get rid of deleted elements by explicitly calling the two garbage collecting functions: -\code -vcg::tri::Allocator::CompactVertexVector(m); -vcg::tri::Allocator::CompactFaceVector(m); -\endcode +\dontinclude trimesh_allocate.cpp +\skip CompactFaceVector +\until CompactVertexVector After calling these function it is safe to not check the IsD() state of every element and always holds that: \code m.vert.size() == m.VN() diff --git a/docs/Doxygen/shot.dxy b/docs/Doxygen/shot.dxy index e61a3e97..1645743e 100644 --- a/docs/Doxygen/shot.dxy +++ b/docs/Doxygen/shot.dxy @@ -16,7 +16,7 @@ Then, a set of examples of the most important operations (projection and un-proj In generale, the camera parameters can be divided in two groups: - \b Extrinsic (or external) parameters: these are the parameters associated to the position in the space of the camera. -- \bIntrinsic (or internal) parameters: these values are related to the peculiar characteristics of the camera, like the focal length (the zoom) or the distortion introduced by the lenses. +- \b Intrinsic (or internal) parameters: these values are related to the peculiar characteristics of the camera, like the focal length (the zoom) or the distortion introduced by the lenses. If these group of values are put in a proper camera model, it is possible to transform any point in the space in the corresponding point on the image plane of the camera (and viceversa). diff --git a/vcg/complex/allocate.h b/vcg/complex/allocate.h index 4a5ecb2b..2c5b9350 100644 --- a/vcg/complex/allocate.h +++ b/vcg/complex/allocate.h @@ -46,7 +46,9 @@ public: }; namespace tri { - /** \addtogroup trimesh */ +/** \addtogroup trimesh +@{ +*/ template size_t Index(MeshType &m, const typename MeshType::VertexType &v) {return &v-&*m.vert.begin();} @@ -80,7 +82,6 @@ public: ((typename MeshType::PointerToAttribute)(*ai)).Resize(sz); } - /*@{*/ /*! \brief Class to safely add and delete elements in a mesh. @@ -336,12 +337,14 @@ public: /* ++++++++++ hedges +++++++++++++ */ - /** Function to add n edges to the mesh. The second parameter hold a vector of + /** Function to add n halfedges to the mesh. The second parameter hold a vector of pointers to pointer to elements of the mesh that should be updated after a possible vector realloc. - @param n number of edges to be added - @param local_var vector of pointers to pointers to edges to be updated. - return an iterator to the first element added + \sa PointerUpdater + \param m the mesh to be modified + \param n the number of elements to be added + \param pu a PointerUpdater initialized so that it can be used to update pointers to edges that could have become invalid after this adding. + \retval the iterator to the first element added. */ static HEdgeIterator AddHEdges(MeshType &m,int n, PointerUpdater &pu) { @@ -659,13 +662,14 @@ public: } - /* - Function to compact all the vertices that have been deleted and put them to the end of the vector. - after this pass the isD test in the scanning of vertex vector, is no more strongly necessary. - It should not be called when TemporaryData is active; + /*! + \brief Compact vector of vertices removing deleted elements. + Deleted elements are put to the end of the vector and the vector is resized. Order between elements is preserved but not their position (hence the PointerUpdater) + After calling this function the \c IsD() test in the scanning a vector, is no more necessary. + + \warning It should not be called when TemporaryData is active (but works correctly if attributes are present) */ - - static void CompactVertexVector( MeshType &m, PointerUpdater &pu ) + static void CompactVertexVector( MeshType &m, PointerUpdater &pu ) { // If already compacted fast return please! if(m.vn==(int)m.vert.size()) return; @@ -690,22 +694,21 @@ public: } - /* - Function to compact all the verices that have been deleted and put them to the end of the vector. - Wrapper if not PointerUpdater is not wanted - */ + /*! \brief Wrapper without the PointerUpdater. */ static void CompactVertexVector( MeshType &m ) { PointerUpdater pu; CompactVertexVector(m,pu); } - /* - Function to compact all the vertices that have been deleted and put them to the end of the vector. - after this pass the isD test in the scanning of vertex vector, is no more strongly necessary. - It should not be called when TemporaryData is active; - */ + /*! + \brief Compact vector of edges removing deleted elements. - static void CompactEdgeVector( MeshType &m, PointerUpdater &pu ) + Deleted elements are put to the end of the vector and the vector is resized. Order between elements is preserved but not their position (hence the PointerUpdater) + After calling this function the \c IsD() test in the scanning a vector, is no more necessary. + + \warning It should not be called when TemporaryData is active (but works correctly if attributes are present) + */ + static void CompactEdgeVector( MeshType &m, PointerUpdater &pu ) { // If already compacted fast return please! if(m.en==(int)m.edge.size()) return; @@ -789,22 +792,20 @@ public: } } - /* - Function to compact all the verices that have been deleted and put them to the end of the vector. - Wrapper if not PointerUpdater is not wanted - */ + /*! \brief Wrapper without the PointerUpdater. */ static void CompactEdgeVector( MeshType &m ) { PointerUpdater pu; CompactEdgeVector(m,pu); } - /* - Function to compact all the vertices that have been deleted and put them to the end of the vector. - after this pass the isD test in the scanning of vertex vector, is no more strongly necessary. - It should not be called when TemporaryData is active; + /*! + \brief Compact vector of faces removing deleted elements. + + Deleted elements are put to the end of the vector and the vector is resized. Order between elements is preserved but not their position (hence the PointerUpdater) + After calling this function the \c IsD() test in the scanning a vector, is no more necessary. + \warning It should not be called when TemporaryData is active (but works correctly if attributes are present) */ - - static void CompactFaceVector( MeshType &m, PointerUpdater &pu ) + static void CompactFaceVector( MeshType &m, PointerUpdater &pu ) { // If already compacted fast return please! if(m.fn==(int)m.face.size()) return; @@ -900,10 +901,7 @@ public: } - /* - Function to compact all the face that have been deleted and put them to the end of the vector. - Wrapper if not PointerUpdater is wanted - */ + /*! \brief Wrapper without the PointerUpdater. */ static void CompactFaceVector( MeshType &m ) { PointerUpdater pu; CompactFaceVector(m,pu); diff --git a/vcg/complex/complex.h b/vcg/complex/complex.h index 2804a570..7499426e 100644 --- a/vcg/complex/complex.h +++ b/vcg/complex/complex.h @@ -39,7 +39,6 @@ namespace vcg { namespace tri { /** \addtogroup trimesh */ -/*@{*/ /*@{*/ @@ -205,9 +204,9 @@ class TriMesh /// Container of half edges, usually a vector. HEdgeContainer hedge; - /// Current number of hedges + /// Current number of halfedges; this member is for internal use only. You should always use the HN() member int hn; - /// Current number of hedges; this member is for internal use only. You should always use the HN() member + /// Current number of halfedges; inline int HN() const { return hn; } /// Bounding box of the mesh @@ -298,7 +297,7 @@ private: Color4b c; public: - inline const Color4b & C() const + inline Color4b C() const { return c; } @@ -403,28 +402,42 @@ template inline void InitVertexIMark(MeshType & m) if( !(*vi).IsD() && (*vi).IsRW() ) (*vi).InitIMark(); } -/** Access function to the incremental mark. +/** \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;} -/** Check if the vertex incremental mark matches the one of the mesh. - @param v Vertex pointer -*/ +/** \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->IMark() == m.imark; } -/** Check if the face incremental mark matches the one of the mesh. - @param v Face pointer -*/ + +/** \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->IMark() == m.imark; } -/** Set the vertex incremental mark of the vertex to the one of the mesh. - @param v Vertex pointer -*/ + +/** \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; } -/** Set the face incremental mark of the vertex to the one of the mesh. - @param v Vertex pointer -*/ + +/** \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; } -/// Unmark the mesh -template inline void UnMarkAll(MeshType & m) { ++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>