Improved the documentation regarding garbage collection and iterators.
closes #1010 git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@665 fdac6126-5c0c-442c-9429-916003d36597
This commit is contained in:
@@ -4,10 +4,10 @@
|
|||||||
* Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen *
|
* Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen *
|
||||||
* www.openmesh.org *
|
* www.openmesh.org *
|
||||||
* *
|
* *
|
||||||
*---------------------------------------------------------------------------*
|
*---------------------------------------------------------------------------*
|
||||||
* This file is part of OpenMesh. *
|
* This file is part of OpenMesh. *
|
||||||
* *
|
* *
|
||||||
* OpenMesh is free software: you can redistribute it and/or modify *
|
* OpenMesh is free software: you can redistribute it and/or modify *
|
||||||
* it under the terms of the GNU Lesser General Public License as *
|
* it under the terms of the GNU Lesser General Public License as *
|
||||||
* published by the Free Software Foundation, either version 3 of *
|
* published by the Free Software Foundation, either version 3 of *
|
||||||
* the License, or (at your option) any later version with the *
|
* the License, or (at your option) any later version with the *
|
||||||
@@ -30,10 +30,10 @@
|
|||||||
* License along with OpenMesh. If not, *
|
* License along with OpenMesh. If not, *
|
||||||
* see <http://www.gnu.org/licenses/>. *
|
* see <http://www.gnu.org/licenses/>. *
|
||||||
* *
|
* *
|
||||||
\*===========================================================================*/
|
\*===========================================================================*/
|
||||||
|
|
||||||
/*===========================================================================*\
|
/*===========================================================================*\
|
||||||
* *
|
* *
|
||||||
* $Revision$ *
|
* $Revision$ *
|
||||||
* $Date$ *
|
* $Date$ *
|
||||||
* *
|
* *
|
||||||
@@ -179,8 +179,9 @@ public:
|
|||||||
/** Remove all items that are marked as deleted from the
|
/** Remove all items that are marked as deleted from the
|
||||||
corresponding containers.
|
corresponding containers.
|
||||||
\note All handles (and indices) to any entity (face, vertex,
|
\note All handles (and indices) to any entity (face, vertex,
|
||||||
edge, halfedge) created before garbage collection
|
edge, halfedge) created before garbage collection
|
||||||
will be out of sync with the mesh, do not use them anymore!
|
will be out of sync with the mesh, do not use them anymore!
|
||||||
|
See also \ref deletedElements.
|
||||||
\note Needs the Attributes::Status attribute
|
\note Needs the Attributes::Status attribute
|
||||||
\note This function may not be implemented for all kernels.
|
\note This function may not be implemented for all kernels.
|
||||||
*/
|
*/
|
||||||
@@ -322,19 +323,19 @@ public: // Standard Property Management
|
|||||||
|
|
||||||
const TexCoord2D& texcoord2D(VertexHandle _vh) const; ///< Get texture coordinate.
|
const TexCoord2D& texcoord2D(VertexHandle _vh) const; ///< Get texture coordinate.
|
||||||
void set_texcoord2D(VertexHandle _vh, const TexCoord2D& _t); ///< Set texture coordinate.
|
void set_texcoord2D(VertexHandle _vh, const TexCoord2D& _t); ///< Set texture coordinate.
|
||||||
|
|
||||||
const TexCoord3D& texcoord3D(VertexHandle _vh) const; ///< Get texture coordinate.
|
const TexCoord3D& texcoord3D(VertexHandle _vh) const; ///< Get texture coordinate.
|
||||||
void set_texcoord3D(VertexHandle _vh, const TexCoord3D& _t); ///< Set texture coordinate.
|
void set_texcoord3D(VertexHandle _vh, const TexCoord3D& _t); ///< Set texture coordinate.
|
||||||
|
|
||||||
const TexCoord1D& texcoord1D(HalfedgeHandle _hh) const; ///< Get texture coordinate of the to vertex for the current face (per face per vertex texcoords)
|
const TexCoord1D& texcoord1D(HalfedgeHandle _hh) const; ///< Get texture coordinate of the to vertex for the current face (per face per vertex texcoords)
|
||||||
void set_texcoord1D(HalfedgeHandle _hh, const TexCoord1D& _t); ///< Set texture coordinate of the to vertex of the given Halfedge (per face per vertex texcoords)
|
void set_texcoord1D(HalfedgeHandle _hh, const TexCoord1D& _t); ///< Set texture coordinate of the to vertex of the given Halfedge (per face per vertex texcoords)
|
||||||
|
|
||||||
const TexCoord2D& texcoord2D(HalfedgeHandle _hh) const; ///< Get texture coordinate of the to vertex for the current face (per face per vertex texcoords)
|
const TexCoord2D& texcoord2D(HalfedgeHandle _hh) const; ///< Get texture coordinate of the to vertex for the current face (per face per vertex texcoords)
|
||||||
void set_texcoord2D(HalfedgeHandle _hh, const TexCoord2D& _t); ///< Set texture coordinate of the to vertex of the given Halfedge (per face per vertex texcoords)
|
void set_texcoord2D(HalfedgeHandle _hh, const TexCoord2D& _t); ///< Set texture coordinate of the to vertex of the given Halfedge (per face per vertex texcoords)
|
||||||
|
|
||||||
const TexCoord3D& texcoord3D(HalfedgeHandle _hh) const; ///< Get texture coordinate of the to vertex for the current face (per face per vertex texcoords)
|
const TexCoord3D& texcoord3D(HalfedgeHandle _hh) const; ///< Get texture coordinate of the to vertex for the current face (per face per vertex texcoords)
|
||||||
void set_texcoord3D(HalfedgeHandle _hh, const TexCoord3D& _t); ///< Set texture coordinate of the to vertex of the given Halfedge (per face per vertex texcoords)
|
void set_texcoord3D(HalfedgeHandle _hh, const TexCoord3D& _t); ///< Set texture coordinate of the to vertex of the given Halfedge (per face per vertex texcoords)
|
||||||
|
|
||||||
const StatusInfo& status(VertexHandle _vh) const; ///< Get status
|
const StatusInfo& status(VertexHandle _vh) const; ///< Get status
|
||||||
StatusInfo& status(VertexHandle _vh); ///< Get status
|
StatusInfo& status(VertexHandle _vh); ///< Get status
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ The main features of the underlying data structure are:
|
|||||||
one vertex).
|
one vertex).
|
||||||
|
|
||||||
|
|
||||||
The goals/features of the C++ implementation are:
|
The goals/features of the C++ implementation are:
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li> Flexibility:
|
<li> Flexibility:
|
||||||
@@ -71,7 +71,7 @@ The goals/features of the C++ implementation are:
|
|||||||
Vertex.</li>
|
Vertex.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li> Efficiency:
|
<li> Efficiency:
|
||||||
<ul>
|
<ul>
|
||||||
<li> Avoid the overhead of virtual inheritance and virtual function calls.</li>
|
<li> Avoid the overhead of virtual inheritance and virtual function calls.</li>
|
||||||
<li> Resolve as many type/attribute dependencies as possible at
|
<li> Resolve as many type/attribute dependencies as possible at
|
||||||
@@ -83,9 +83,9 @@ The goals/features of the C++ implementation are:
|
|||||||
(Half-)Edges, Faces know each other and their corresponding
|
(Half-)Edges, Faces know each other and their corresponding
|
||||||
handles.
|
handles.
|
||||||
|
|
||||||
<b>(*)</b> Since version 0.10.0 the Microsoft VisualC++ compiler is
|
<b>(*)</b> Since version 0.10.0 the Microsoft VisualC++ compiler is
|
||||||
supported. Due to the compilers inaptitude to process forwards on template
|
supported. Due to the compilers inaptitude to process forwards on template
|
||||||
functions correctly, the type-safety had to be given up to some extend.
|
functions correctly, the type-safety had to be given up to some extend.
|
||||||
Though under the hood void pointers are used, the casting is done
|
Though under the hood void pointers are used, the casting is done
|
||||||
within the mesh, and the user transparently uses his handles as before.<br>
|
within the mesh, and the user transparently uses his handles as before.<br>
|
||||||
As soon as the compiler adheres to the C++ standard the type-safe version
|
As soon as the compiler adheres to the C++ standard the type-safe version
|
||||||
@@ -102,7 +102,7 @@ The goals/features of the C++ implementation are:
|
|||||||
If one takes a look at the goals and features section it soon becomes
|
If one takes a look at the goals and features section it soon becomes
|
||||||
obvious that these goals cannot be achieved using trivial C++ features
|
obvious that these goals cannot be achieved using trivial C++ features
|
||||||
only. We make heavy use of templates, (partial) template specialization,
|
only. We make heavy use of templates, (partial) template specialization,
|
||||||
generative and generic programming, and the STL. This may be a challenge
|
generative and generic programming, and the STL. This may be a challenge
|
||||||
for you as well as for your compiler, as these are quite late features
|
for you as well as for your compiler, as these are quite late features
|
||||||
of the C++ language.
|
of the C++ language.
|
||||||
|
|
||||||
@@ -115,13 +115,13 @@ books:
|
|||||||
|
|
||||||
\li Bjarne Stroustrup, <em> The C++ Programming Language </em>,
|
\li Bjarne Stroustrup, <em> The C++ Programming Language </em>,
|
||||||
|
|
||||||
\li Matthew H. Austern, <em> Generic Programming and the STL: Using
|
\li Matthew H. Austern, <em> Generic Programming and the STL: Using
|
||||||
and Extending the C++ Standard Template Library </em>,
|
and Extending the C++ Standard Template Library </em>,
|
||||||
|
|
||||||
\li Andrei Alexandrescu, <em> Modern C++ Design: Generic Programming
|
\li Andrei Alexandrescu, <em> Modern C++ Design: Generic Programming
|
||||||
and Design Patterns Applied </em>,
|
and Design Patterns Applied </em>,
|
||||||
|
|
||||||
\li Krzysztof Czarnecki, Ulrich Eisenecker, <em> Generative Programming:
|
\li Krzysztof Czarnecki, Ulrich Eisenecker, <em> Generative Programming:
|
||||||
Methods, Tools, and Applications </em>.
|
Methods, Tools, and Applications </em>.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
@@ -157,7 +157,7 @@ illustrates the way connectivity is stored in this structure:
|
|||||||
<li> Each \b vertex references one outgoing halfedge, i.e. a halfedge that
|
<li> Each \b vertex references one outgoing halfedge, i.e. a halfedge that
|
||||||
starts at this vertex (1).
|
starts at this vertex (1).
|
||||||
<li> Each \b face references one of the halfedges bounding it (2).
|
<li> Each \b face references one of the halfedges bounding it (2).
|
||||||
<li> Each \b halfedge provides a handle to
|
<li> Each \b halfedge provides a handle to
|
||||||
<ul>
|
<ul>
|
||||||
<li> the vertex it points to (3),
|
<li> the vertex it points to (3),
|
||||||
<li> the face it belongs to (4)
|
<li> the face it belongs to (4)
|
||||||
@@ -181,7 +181,7 @@ encapsulated into the so-called <em> circulators </em>, described in
|
|||||||
|
|
||||||
\attention In order to efficiently classify a boundary
|
\attention In order to efficiently classify a boundary
|
||||||
vertex, the outgoing halfedge of these vertices <b> must be a boundary
|
vertex, the outgoing halfedge of these vertices <b> must be a boundary
|
||||||
halfedge </b> (see OpenMesh::PolyMeshT::is_boundary()).
|
halfedge </b> (see OpenMesh::PolyMeshT::is_boundary()).
|
||||||
\attention Whenever you modify the
|
\attention Whenever you modify the
|
||||||
topology using low-level topology changing functions, be sure to
|
topology using low-level topology changing functions, be sure to
|
||||||
guarantee this behaviour (see
|
guarantee this behaviour (see
|
||||||
@@ -207,7 +207,7 @@ advantages:
|
|||||||
|
|
||||||
\li Circulating around a vertex in order to get its one-ring neighbors is an
|
\li Circulating around a vertex in order to get its one-ring neighbors is an
|
||||||
important operation for many kinds of algorithms on polygonal meshes.
|
important operation for many kinds of algorithms on polygonal meshes.
|
||||||
For face-based structures this leads to many <tt>if-then</tt> branchings,
|
For face-based structures this leads to many <tt>if-then</tt> branchings,
|
||||||
the halfedge structure provides this funcionality without
|
the halfedge structure provides this funcionality without
|
||||||
conditional branching in constant time.
|
conditional branching in constant time.
|
||||||
|
|
||||||
@@ -245,9 +245,9 @@ shows the overall concept.
|
|||||||
\section ch_kernel Building the kernel
|
\section ch_kernel Building the kernel
|
||||||
|
|
||||||
-# The BaseKernel defines the basic operations on properties like
|
-# The BaseKernel defines the basic operations on properties like
|
||||||
add/remove/access.
|
add/remove/access.
|
||||||
-# Next the AttribKernelT adds the standard properties all associated
|
-# Next the AttribKernelT adds the standard properties all associated
|
||||||
methods.
|
methods.
|
||||||
-# Finally the ArrayKernelT provides the methods to add/remove/access
|
-# Finally the ArrayKernelT provides the methods to add/remove/access
|
||||||
the mesh items vertices, (half-)edges, and faces. The base class is passed
|
the mesh items vertices, (half-)edges, and faces. The base class is passed
|
||||||
as a template parameter, since depending on the underlying storage type the
|
as a template parameter, since depending on the underlying storage type the
|
||||||
@@ -289,11 +289,11 @@ MyMesh. As we have seen in the section on goals and features there are
|
|||||||
some parameters to be specified for a mesh. This is done in the
|
some parameters to be specified for a mesh. This is done in the
|
||||||
following four steps:
|
following four steps:
|
||||||
|
|
||||||
<ol>
|
<ol>
|
||||||
|
|
||||||
<li> Choose between triangle mesh and general polygonal mesh.
|
<li> Choose between triangle mesh and general polygonal mesh.
|
||||||
|
|
||||||
<li> Select the mesh kernel
|
<li> Select the mesh kernel
|
||||||
|
|
||||||
<li> Parameterize the mesh by a so-called \em Traits class. You can
|
<li> Parameterize the mesh by a so-called \em Traits class. You can
|
||||||
add arbitrary classes to the mesh items, specify the types \c Scalar,
|
add arbitrary classes to the mesh items, specify the types \c Scalar,
|
||||||
@@ -351,11 +351,11 @@ environment one might be better off using \c OSG_Kernel::ArrayKernelT.
|
|||||||
|
|
||||||
While the last two sections only have chosen from a list of predefined
|
While the last two sections only have chosen from a list of predefined
|
||||||
meshes or kernels, respectively, we now come to the user-defined
|
meshes or kernels, respectively, we now come to the user-defined
|
||||||
customization.
|
customization.
|
||||||
|
|
||||||
The resulting mesh \c MyMesh will provide the following types:
|
The resulting mesh \c MyMesh will provide the following types:
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li> The <i>point</i> and <i>scalar</i> type: \c MyMesh::Point and \c
|
<li> The <i>point</i> and <i>scalar</i> type: \c MyMesh::Point and \c
|
||||||
MyMesh::Scalar.
|
MyMesh::Scalar.
|
||||||
<li> The <i>mesh items</i>: \c MyMesh::Vertex, \c MyMesh::Halfedge, \c
|
<li> The <i>mesh items</i>: \c MyMesh::Vertex, \c MyMesh::Halfedge, \c
|
||||||
@@ -383,8 +383,8 @@ by a so-called \em traits class. Using this mechanism one can
|
|||||||
All these customizations are encapsulated in one class \c MyTraits,
|
All these customizations are encapsulated in one class \c MyTraits,
|
||||||
that is used as template argument to the mesh, e.g.
|
that is used as template argument to the mesh, e.g.
|
||||||
\code
|
\code
|
||||||
struct MyTraits {
|
struct MyTraits {
|
||||||
// your customization
|
// your customization
|
||||||
};
|
};
|
||||||
typedef PolyMesh_ArrayKernelT<MyTraits> MyMesh;
|
typedef PolyMesh_ArrayKernelT<MyTraits> MyMesh;
|
||||||
\endcode
|
\endcode
|
||||||
@@ -441,7 +441,7 @@ vectors per vertex/face.
|
|||||||
|
|
||||||
Adding these predefined attributes is quite simple. You provide an
|
Adding these predefined attributes is quite simple. You provide an
|
||||||
<tt>unsigned int</tt> in the traits class, whose bits control whether
|
<tt>unsigned int</tt> in the traits class, whose bits control whether
|
||||||
or not a certain attribute should be attached or not.
|
or not a certain attribute should be attached or not.
|
||||||
|
|
||||||
If you want to add a normal vector to your vertices and faces, and also
|
If you want to add a normal vector to your vertices and faces, and also
|
||||||
want to have color information for vertices, the code would look like this:
|
want to have color information for vertices, the code would look like this:
|
||||||
@@ -454,8 +454,8 @@ together). From its set/unset bits you can see whether a certain
|
|||||||
attribute is used. OpenMesh provides the macro OM_Check_Attrib for
|
attribute is used. OpenMesh provides the macro OM_Check_Attrib for
|
||||||
doing this:
|
doing this:
|
||||||
|
|
||||||
\code
|
\code
|
||||||
if (OM_Check_Attrib(MyMesh::Vertex, Normal)
|
if (OM_Check_Attrib(MyMesh::Vertex, Normal)
|
||||||
do_something_with_normals();
|
do_something_with_normals();
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
@@ -608,17 +608,17 @@ This section explains the methods used to read a mesh from a file or
|
|||||||
write it to a file. The corresponding functions are defined in the
|
write it to a file. The corresponding functions are defined in the
|
||||||
namespace OpenMesh::MeshIO. This section is divided into three steps.
|
namespace OpenMesh::MeshIO. This section is divided into three steps.
|
||||||
Step one will give a short example on how to use the %OpenMesh IOManager,
|
Step one will give a short example on how to use the %OpenMesh IOManager,
|
||||||
step two will give some background information on how IOManager works and
|
step two will give some background information on how IOManager works and
|
||||||
finally step three will show you how to add your own modules to IOManager.
|
finally step three will show you how to add your own modules to IOManager.
|
||||||
|
|
||||||
\section mesh_io_quick Step 1 - IOManager quick start
|
\section mesh_io_quick Step 1 - IOManager quick start
|
||||||
|
|
||||||
For a quick start you can copy the following code directly to your project.
|
For a quick start you can copy the following code directly to your project.
|
||||||
|
|
||||||
\note
|
\note
|
||||||
<ul>
|
<ul>
|
||||||
<li>If you link statically against OpenMesh, you have to add the define
|
<li>If you link statically against OpenMesh, you have to add the define
|
||||||
OM_STATIC_BUILD to your application. This will ensure that readers and writers
|
OM_STATIC_BUILD to your application. This will ensure that readers and writers
|
||||||
get initialized correctly.</li>
|
get initialized correctly.</li>
|
||||||
<li>IOManager uses the filename extension to determine which reader/writer
|
<li>IOManager uses the filename extension to determine which reader/writer
|
||||||
to use. I.e. if passing "inputmesh.obj" as filename parameter, the OBJ-File
|
to use. I.e. if passing "inputmesh.obj" as filename parameter, the OBJ-File
|
||||||
@@ -686,7 +686,7 @@ the same way as reader modules.
|
|||||||
\subsection mesh_io_extend_datastruct Adding support for a new data structure
|
\subsection mesh_io_extend_datastruct Adding support for a new data structure
|
||||||
|
|
||||||
As we have already seen, Importers receive information from the reader modules.
|
As we have already seen, Importers receive information from the reader modules.
|
||||||
Reader modules pass information through a specified interface :
|
Reader modules pass information through a specified interface :
|
||||||
|
|
||||||
\include BaseImporter.hh
|
\include BaseImporter.hh
|
||||||
|
|
||||||
@@ -699,10 +699,10 @@ vectors/texcoords/faces. Therefore an exporter has to provide these iterators :
|
|||||||
|
|
||||||
There might be the need for the exporter to cache data from the structure it
|
There might be the need for the exporter to cache data from the structure it
|
||||||
refers to. The update() function should be called at the beginning of
|
refers to. The update() function should be called at the beginning of
|
||||||
each BaseWriter::save() method and it should make sure that cached information
|
each BaseWriter::save() method and it should make sure that cached information
|
||||||
is up to date.
|
is up to date.
|
||||||
|
|
||||||
For further information you are encouraged to take a look at the modules
|
For further information you are encouraged to take a look at the modules
|
||||||
provided by %OpenMesh which can be found in the IO subdirectory.
|
provided by %OpenMesh which can be found in the IO subdirectory.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
@@ -724,7 +724,7 @@ provided by %OpenMesh which can be found in the IO subdirectory.
|
|||||||
The mesh provides linear iterators (that enumerate vertices,
|
The mesh provides linear iterators (that enumerate vertices,
|
||||||
halfedges, edges, and faces). These can be used to easily navigate
|
halfedges, edges, and faces). These can be used to easily navigate
|
||||||
through a mesh. Each iterator \c XYZIter also exists in a const
|
through a mesh. Each iterator \c XYZIter also exists in a const
|
||||||
version \c ConstXYZIter.
|
version \c ConstXYZIter.
|
||||||
|
|
||||||
All iterators are defined in the namespace
|
All iterators are defined in the namespace
|
||||||
OpenMesh::Iterators. They are template classes that expect a mesh as
|
OpenMesh::Iterators. They are template classes that expect a mesh as
|
||||||
@@ -744,7 +744,7 @@ The corresponding \c const counterparts are
|
|||||||
\arg \c ConstFaceIter.
|
\arg \c ConstFaceIter.
|
||||||
|
|
||||||
|
|
||||||
The linear iterators are (almost) conformant to STL iterators. For a
|
The linear iterators are (almost) conformant to STL iterators. For a
|
||||||
description of their interface see OpenMesh::Concepts::IteratorT.
|
description of their interface see OpenMesh::Concepts::IteratorT.
|
||||||
|
|
||||||
For efficiency reasons the \c operation++(int) (post-increment)
|
For efficiency reasons the \c operation++(int) (post-increment)
|
||||||
@@ -755,9 +755,20 @@ Additionally to the standard operations, each linear iterator
|
|||||||
provides a method \c handle(), which returns the handle of the
|
provides a method \c handle(), which returns the handle of the
|
||||||
item referred to by the iterator.
|
item referred to by the iterator.
|
||||||
|
|
||||||
\note
|
\subsection deletedElements Deleted Elements
|
||||||
|
If no elements of a mesh are marked as deleted, the indices provided by \c idx()
|
||||||
|
are consecutive numbers from 0 to <I>number of elements</I>-1 (in the case of vertices this would be
|
||||||
|
from 0 to n_vertices()-1).
|
||||||
|
|
||||||
|
However, note that this is <B>not</B> the case when elements are marked
|
||||||
|
as deleted and OpenMesh::ArrayKernel::garbage_collection() has not yet been called.
|
||||||
|
|
||||||
|
After garbage_collection() has been called the elements are reorganized and their handles and
|
||||||
|
iterators are guaranteed to be consecutive numbers again.
|
||||||
|
|
||||||
|
\note
|
||||||
<ul>
|
<ul>
|
||||||
<li>If you delete elements on the mesh, they will still be
|
<li>If you delete elements on the mesh, they will still be
|
||||||
enumerated by the standard iterators. To skip deleted elements,
|
enumerated by the standard iterators. To skip deleted elements,
|
||||||
use the \ref it_iters_skipping</li>
|
use the \ref it_iters_skipping</li>
|
||||||
<li>An iterator to an item usually needs more memory than a
|
<li>An iterator to an item usually needs more memory than a
|
||||||
@@ -913,7 +924,7 @@ of templates especially in the kernels, there's no direct inheritence
|
|||||||
relationship of the kernel classes. For a conceptual overview of the
|
relationship of the kernel classes. For a conceptual overview of the
|
||||||
inheritance graph see \ref mesh_hierarchy. For a list of available
|
inheritance graph see \ref mesh_hierarchy. For a list of available
|
||||||
methods see OpenMesh::Concepts::KernelT.
|
methods see OpenMesh::Concepts::KernelT.
|
||||||
|
|
||||||
\see \ref mesh_hierarchy, OpenMesh::Concepts::KernelT
|
\see \ref mesh_hierarchy, OpenMesh::Concepts::KernelT
|
||||||
|
|
||||||
*/
|
*/
|
||||||
@@ -926,7 +937,7 @@ methods see OpenMesh::Concepts::KernelT.
|
|||||||
|
|
||||||
This group holds all the predefind mesh types, i.e. all combinations
|
This group holds all the predefind mesh types, i.e. all combinations
|
||||||
of triangle/polygonal mesh and the set of kernels.
|
of triangle/polygonal mesh and the set of kernels.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -940,7 +951,7 @@ a specific interface by pure virtual functions. Therefore these
|
|||||||
interfaces will be described in this group. Everyone implementing
|
interfaces will be described in this group. Everyone implementing
|
||||||
e.g. a new mesh kernel should at least implement the
|
e.g. a new mesh kernel should at least implement the
|
||||||
OpenMesh::Concepts::Kernel concept.
|
OpenMesh::Concepts::Kernel concept.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,10 @@
|
|||||||
* Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen *
|
* Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen *
|
||||||
* www.openmesh.org *
|
* www.openmesh.org *
|
||||||
* *
|
* *
|
||||||
*---------------------------------------------------------------------------*
|
*---------------------------------------------------------------------------*
|
||||||
* This file is part of OpenMesh. *
|
* This file is part of OpenMesh. *
|
||||||
* *
|
* *
|
||||||
* OpenMesh is free software: you can redistribute it and/or modify *
|
* OpenMesh is free software: you can redistribute it and/or modify *
|
||||||
* it under the terms of the GNU Lesser General Public License as *
|
* it under the terms of the GNU Lesser General Public License as *
|
||||||
* published by the Free Software Foundation, either version 3 of *
|
* published by the Free Software Foundation, either version 3 of *
|
||||||
* the License, or (at your option) any later version with the *
|
* the License, or (at your option) any later version with the *
|
||||||
@@ -30,10 +30,10 @@
|
|||||||
* License along with OpenMesh. If not, *
|
* License along with OpenMesh. If not, *
|
||||||
* see <http://www.gnu.org/licenses/>. *
|
* see <http://www.gnu.org/licenses/>. *
|
||||||
* *
|
* *
|
||||||
\*===========================================================================*/
|
\*===========================================================================*/
|
||||||
|
|
||||||
/*===========================================================================*\
|
/*===========================================================================*\
|
||||||
* *
|
* *
|
||||||
* $Revision$ *
|
* $Revision$ *
|
||||||
* $Date$ *
|
* $Date$ *
|
||||||
* *
|
* *
|
||||||
@@ -103,14 +103,14 @@ public:
|
|||||||
ArrayKernel();
|
ArrayKernel();
|
||||||
virtual ~ArrayKernel();
|
virtual ~ArrayKernel();
|
||||||
|
|
||||||
/** ArrayKernel uses the default copy constructor and assignment operator, which means
|
/** ArrayKernel uses the default copy constructor and assignment operator, which means
|
||||||
that the connectivity and all properties are copied, including reference
|
that the connectivity and all properties are copied, including reference
|
||||||
counters, allocated bit status masks, etc.. In contrast assign_connectivity
|
counters, allocated bit status masks, etc.. In contrast assign_connectivity
|
||||||
copies only the connectivity, i.e. vertices, edges, faces and their status fields.
|
copies only the connectivity, i.e. vertices, edges, faces and their status fields.
|
||||||
NOTE: The geometry (the points property) is NOT copied. Poly/TriConnectivity
|
NOTE: The geometry (the points property) is NOT copied. Poly/TriConnectivity
|
||||||
override(and hide) that function to provide connectivity consistence.*/
|
override(and hide) that function to provide connectivity consistence.*/
|
||||||
void assign_connectivity(const ArrayKernel& _other);
|
void assign_connectivity(const ArrayKernel& _other);
|
||||||
|
|
||||||
// --- handle -> item ---
|
// --- handle -> item ---
|
||||||
VertexHandle handle(const Vertex& _v) const
|
VertexHandle handle(const Vertex& _v) const
|
||||||
{return VertexHandle(&_v - &vertices_.front()); }
|
{return VertexHandle(&_v - &vertices_.front()); }
|
||||||
@@ -128,10 +128,10 @@ public:
|
|||||||
HalfedgeHandle(eh<<1) : HalfedgeHandle((eh<<1)+1));
|
HalfedgeHandle(eh<<1) : HalfedgeHandle((eh<<1)+1));
|
||||||
}
|
}
|
||||||
|
|
||||||
EdgeHandle handle(const Edge& _e) const
|
EdgeHandle handle(const Edge& _e) const
|
||||||
{ return EdgeHandle(&_e - &edges_.front()); }
|
{ return EdgeHandle(&_e - &edges_.front()); }
|
||||||
|
|
||||||
FaceHandle handle(const Face& _f) const
|
FaceHandle handle(const Face& _f) const
|
||||||
{ return FaceHandle(&_f - &faces_.front()); }
|
{ return FaceHandle(&_f - &faces_.front()); }
|
||||||
|
|
||||||
#define SIGNED(x) signed( (x) )
|
#define SIGNED(x) signed( (x) )
|
||||||
@@ -269,10 +269,12 @@ public:
|
|||||||
* \note Garbage collection invalidates all handles. If you need to keep track of
|
* \note Garbage collection invalidates all handles. If you need to keep track of
|
||||||
* a set of handles, you can pass them to the second garbage collection
|
* a set of handles, you can pass them to the second garbage collection
|
||||||
* function, which will update a vector of handles.
|
* function, which will update a vector of handles.
|
||||||
|
* See also \ref deletedElements.
|
||||||
*
|
*
|
||||||
* @param _v Remove deleted vertices?
|
* @param _v Remove deleted vertices?
|
||||||
* @param _e Remove deleted edges?
|
* @param _e Remove deleted edges?
|
||||||
* @param _f Remove deleted faces?
|
* @param _f Remove deleted faces?
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
void garbage_collection(bool _v=true, bool _e=true, bool _f=true);
|
void garbage_collection(bool _v=true, bool _e=true, bool _f=true);
|
||||||
|
|
||||||
@@ -284,8 +286,7 @@ public:
|
|||||||
* \note Garbage collection invalidates all handles. If you need to keep track of
|
* \note Garbage collection invalidates all handles. If you need to keep track of
|
||||||
* a set of handles, you can pass them to this function. The handles that the
|
* a set of handles, you can pass them to this function. The handles that the
|
||||||
* given pointers point to are updated in place.
|
* given pointers point to are updated in place.
|
||||||
*
|
* See also \ref deletedElements.
|
||||||
*
|
|
||||||
*
|
*
|
||||||
* @param vh_to_update Pointers to vertex handles that should get updated
|
* @param vh_to_update Pointers to vertex handles that should get updated
|
||||||
* @param hh_to_update Pointers to halfedge handles that should get updated
|
* @param hh_to_update Pointers to halfedge handles that should get updated
|
||||||
@@ -609,7 +610,7 @@ public:
|
|||||||
}
|
}
|
||||||
return sz;
|
return sz;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Note: O(n) complexity
|
/// Note: O(n) complexity
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
@@ -628,7 +629,7 @@ public:
|
|||||||
friend class StatusSetT<HalfedgeHandle>;
|
friend class StatusSetT<HalfedgeHandle>;
|
||||||
|
|
||||||
/// --- AutoStatusSet API ---
|
/// --- AutoStatusSet API ---
|
||||||
|
|
||||||
template <class Handle>
|
template <class Handle>
|
||||||
class AutoStatusSetT : public StatusSetT<Handle>
|
class AutoStatusSetT : public StatusSetT<Handle>
|
||||||
{
|
{
|
||||||
@@ -657,7 +658,7 @@ public:
|
|||||||
typedef AutoStatusSetT<HalfedgeHandle> HalfedgeStatusSet;
|
typedef AutoStatusSetT<HalfedgeHandle> HalfedgeStatusSet;
|
||||||
|
|
||||||
/// --- ExtStatusSet API --- (hybrid between a set and an array)
|
/// --- ExtStatusSet API --- (hybrid between a set and an array)
|
||||||
|
|
||||||
template <class Handle>
|
template <class Handle>
|
||||||
class ExtStatusSetT : public AutoStatusSetT<Handle>
|
class ExtStatusSetT : public AutoStatusSetT<Handle>
|
||||||
{
|
{
|
||||||
@@ -753,7 +754,7 @@ public:
|
|||||||
typedef ExtStatusSetT<VertexHandle> ExtVertexStatusSet;
|
typedef ExtStatusSetT<VertexHandle> ExtVertexStatusSet;
|
||||||
typedef ExtStatusSetT<EdgeHandle> ExtEdgeStatusSet;
|
typedef ExtStatusSetT<EdgeHandle> ExtEdgeStatusSet;
|
||||||
typedef ExtStatusSetT<HalfedgeHandle> ExtHalfedgeStatusSet;
|
typedef ExtStatusSetT<HalfedgeHandle> ExtHalfedgeStatusSet;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// iterators
|
// iterators
|
||||||
typedef std::vector<Vertex> VertexContainer;
|
typedef std::vector<Vertex> VertexContainer;
|
||||||
@@ -812,7 +813,7 @@ private:
|
|||||||
|
|
||||||
void init_bit_masks(BitMaskContainer& _bmc);
|
void init_bit_masks(BitMaskContainer& _bmc);
|
||||||
void init_bit_masks();
|
void init_bit_masks();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
VertexContainer vertices_;
|
VertexContainer vertices_;
|
||||||
EdgeContainer edges_;
|
EdgeContainer edges_;
|
||||||
|
|||||||
Reference in New Issue
Block a user