From 29cbe8204847492d7db85b64a64bd79ce5e2d69c Mon Sep 17 00:00:00 2001 From: Martin Schultz Date: Tue, 24 Oct 2017 15:58:29 +0200 Subject: [PATCH] changed the way status propertzies are copied. refcount is set to 1 if it was > 0 in the original mesh fixes #48 --- src/OpenMesh/Core/Mesh/ArrayKernel.cc | 421 +++++++++++++------------- src/OpenMesh/Core/Mesh/ArrayKernel.hh | 10 +- 2 files changed, 216 insertions(+), 215 deletions(-) diff --git a/src/OpenMesh/Core/Mesh/ArrayKernel.cc b/src/OpenMesh/Core/Mesh/ArrayKernel.cc index 00c8d3c5..a22f8785 100644 --- a/src/OpenMesh/Core/Mesh/ArrayKernel.cc +++ b/src/OpenMesh/Core/Mesh/ArrayKernel.cc @@ -37,146 +37,145 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * - * ========================================================================= */ - -/*===========================================================================*\ - * * - * $Revision$ * - * $Date$ * - * * -\*===========================================================================*/ - -#include - -namespace OpenMesh -{ - -ArrayKernel::ArrayKernel() -: refcount_vstatus_(0), refcount_hstatus_(0), - refcount_estatus_(0), refcount_fstatus_(0) -{ - init_bit_masks(); //Status bit masks initialization -} - -ArrayKernel::~ArrayKernel() -{ - clear(); -} - -// ArrayKernel::ArrayKernel(const ArrayKernel& _rhs) -// : BaseKernel(_rhs), -// vertices_(_rhs.vertices_), edges_(_rhs.edges_), faces_(_rhs.faces_), -// vertex_status_(_rhs.vertex_status_), halfedge_status_(_rhs.halfedge_status_), -// edge_status_(_rhs.edge_status_), face_status_(_rhs.face_status_), -// refcount_vstatus_(_rhs.refcount_vstatus_), refcount_hstatus_(_rhs.refcount_hstatus_), -// refcount_estatus_(_rhs.refcount_estatus_), refcount_fstatus_(_rhs.refcount_fstatus_) -// {} - - -void ArrayKernel::assign_connectivity(const ArrayKernel& _other) -{ - vertices_ = _other.vertices_; - edges_ = _other.edges_; - faces_ = _other.faces_; - - vprops_resize(n_vertices()); - hprops_resize(n_halfedges()); - eprops_resize(n_edges()); - fprops_resize(n_faces()); - -#define COPY_STATUS_PROPERTY(ENTITY) \ - if (_other.ENTITY##_status_.is_valid()) \ - { \ - if (!ENTITY##_status_.is_valid()) \ - { \ - request_##ENTITY##_status(); \ - } \ - property(ENTITY##_status_) = _other.property(_other.ENTITY##_status_); \ - } - COPY_STATUS_PROPERTY(vertex) - COPY_STATUS_PROPERTY(halfedge) - COPY_STATUS_PROPERTY(edge) - COPY_STATUS_PROPERTY(face) - -#undef COPY_STATUS_PROPERTY -} - -// --- handle -> item --- -VertexHandle ArrayKernel::handle(const Vertex& _v) const -{ - return VertexHandle( int( &_v - &vertices_.front())); -} - -HalfedgeHandle ArrayKernel::handle(const Halfedge& _he) const -{ - // Calculate edge belonging to given halfedge - // There are two halfedges stored per edge - // Get memory position inside edge vector and devide by size of an edge - // to get the corresponding edge for the requested halfedge - size_t eh = ( (char*)&_he - (char*)&edges_.front() ) / sizeof(Edge) ; - assert((&_he == &edges_[eh].halfedges_[0]) || - (&_he == &edges_[eh].halfedges_[1])); - return ((&_he == &edges_[eh].halfedges_[0]) ? - HalfedgeHandle( int(eh)<<1) : HalfedgeHandle((int(eh)<<1)+1)); -} - -EdgeHandle ArrayKernel::handle(const Edge& _e) const -{ - return EdgeHandle( int(&_e - &edges_.front() ) ); -} - -FaceHandle ArrayKernel::handle(const Face& _f) const -{ - return FaceHandle( int(&_f - &faces_.front()) ); -} - -#define SIGNED(x) signed( (x) ) - -bool ArrayKernel::is_valid_handle(VertexHandle _vh) const -{ - return 0 <= _vh.idx() && _vh.idx() < SIGNED(n_vertices()); -} - -bool ArrayKernel::is_valid_handle(HalfedgeHandle _heh) const -{ - return 0 <= _heh.idx() && _heh.idx() < SIGNED(n_edges()*2); -} - -bool ArrayKernel::is_valid_handle(EdgeHandle _eh) const -{ - return 0 <= _eh.idx() && _eh.idx() < SIGNED(n_edges()); -} - -bool ArrayKernel::is_valid_handle(FaceHandle _fh) const -{ - return 0 <= _fh.idx() && _fh.idx() < SIGNED(n_faces()); -} - -#undef SIGNED - -unsigned int ArrayKernel::delete_isolated_vertices() -{ - assert(has_vertex_status());//this function requires vertex status property - unsigned int n_isolated = 0; - for (KernelVertexIter v_it = vertices_begin(); v_it != vertices_end(); ++v_it) - { - if (is_isolated(handle(*v_it))) - { - status(handle(*v_it)).set_deleted(true); - n_isolated++; - } - } - return n_isolated; -} - -void ArrayKernel::garbage_collection(bool _v, bool _e, bool _f) -{ - std::vector empty_vh; - std::vector empty_hh; - std::vector empty_fh; - garbage_collection( empty_vh,empty_hh,empty_fh,_v, _e, _f); -} - + * ========================================================================= */ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + +#include + +namespace OpenMesh +{ + +ArrayKernel::ArrayKernel() +: refcount_vstatus_(0), refcount_hstatus_(0), + refcount_estatus_(0), refcount_fstatus_(0) +{ + init_bit_masks(); //Status bit masks initialization +} + +ArrayKernel::~ArrayKernel() +{ + clear(); +} + +// ArrayKernel::ArrayKernel(const ArrayKernel& _rhs) +// : BaseKernel(_rhs), +// vertices_(_rhs.vertices_), edges_(_rhs.edges_), faces_(_rhs.faces_), +// vertex_status_(_rhs.vertex_status_), halfedge_status_(_rhs.halfedge_status_), +// edge_status_(_rhs.edge_status_), face_status_(_rhs.face_status_), +// refcount_vstatus_(_rhs.refcount_vstatus_), refcount_hstatus_(_rhs.refcount_hstatus_), +// refcount_estatus_(_rhs.refcount_estatus_), refcount_fstatus_(_rhs.refcount_fstatus_) +// {} + + +void ArrayKernel::assign_connectivity(const ArrayKernel& _other) +{ + vertices_ = _other.vertices_; + edges_ = _other.edges_; + faces_ = _other.faces_; + + vprops_resize(n_vertices()); + hprops_resize(n_halfedges()); + eprops_resize(n_edges()); + fprops_resize(n_faces()); + + //just copy status properties for now, + //until a proper solution for refcounted + //properties is available + vertex_status_ = _other.vertex_status_; + halfedge_status_ = _other.halfedge_status_; + edge_status_ = _other.edge_status_; + face_status_ = _other.face_status_; + + //initialize refcounter to 1 for the new mesh, + //if status is available. + refcount_estatus_ = _other.refcount_estatus_ > 0 ? 1 : 0; + refcount_vstatus_ = _other.refcount_vstatus_ > 0 ? 1 : 0; + refcount_hstatus_ = _other.refcount_hstatus_ > 0 ? 1 : 0; + refcount_fstatus_ = _other.refcount_fstatus_ > 0 ? 1 : 0; +} + +// --- handle -> item --- +VertexHandle ArrayKernel::handle(const Vertex& _v) const +{ + return VertexHandle( int( &_v - &vertices_.front())); +} + +HalfedgeHandle ArrayKernel::handle(const Halfedge& _he) const +{ + // Calculate edge belonging to given halfedge + // There are two halfedges stored per edge + // Get memory position inside edge vector and devide by size of an edge + // to get the corresponding edge for the requested halfedge + size_t eh = ( (char*)&_he - (char*)&edges_.front() ) / sizeof(Edge) ; + assert((&_he == &edges_[eh].halfedges_[0]) || + (&_he == &edges_[eh].halfedges_[1])); + return ((&_he == &edges_[eh].halfedges_[0]) ? + HalfedgeHandle( int(eh)<<1) : HalfedgeHandle((int(eh)<<1)+1)); +} + +EdgeHandle ArrayKernel::handle(const Edge& _e) const +{ + return EdgeHandle( int(&_e - &edges_.front() ) ); +} + +FaceHandle ArrayKernel::handle(const Face& _f) const +{ + return FaceHandle( int(&_f - &faces_.front()) ); +} + +#define SIGNED(x) signed( (x) ) + +bool ArrayKernel::is_valid_handle(VertexHandle _vh) const +{ + return 0 <= _vh.idx() && _vh.idx() < SIGNED(n_vertices()); +} + +bool ArrayKernel::is_valid_handle(HalfedgeHandle _heh) const +{ + return 0 <= _heh.idx() && _heh.idx() < SIGNED(n_edges()*2); +} + +bool ArrayKernel::is_valid_handle(EdgeHandle _eh) const +{ + return 0 <= _eh.idx() && _eh.idx() < SIGNED(n_edges()); +} + +bool ArrayKernel::is_valid_handle(FaceHandle _fh) const +{ + return 0 <= _fh.idx() && _fh.idx() < SIGNED(n_faces()); +} + +#undef SIGNED + +unsigned int ArrayKernel::delete_isolated_vertices() +{ + assert(has_vertex_status());//this function requires vertex status property + unsigned int n_isolated = 0; + for (KernelVertexIter v_it = vertices_begin(); v_it != vertices_end(); ++v_it) + { + if (is_isolated(handle(*v_it))) + { + status(handle(*v_it)).set_deleted(true); + n_isolated++; + } + } + return n_isolated; +} + +void ArrayKernel::garbage_collection(bool _v, bool _e, bool _f) +{ + std::vector empty_vh; + std::vector empty_hh; + std::vector empty_fh; + garbage_collection( empty_vh,empty_hh,empty_fh,_v, _e, _f); +} + void ArrayKernel::clean_keep_reservation() { vertices_.clear(); @@ -187,74 +186,74 @@ void ArrayKernel::clean_keep_reservation() } -void ArrayKernel::clean() -{ - - vertices_.clear(); - VertexContainer().swap( vertices_ ); - - edges_.clear(); - EdgeContainer().swap( edges_ ); - - faces_.clear(); - FaceContainer().swap( faces_ ); - -} - - -void ArrayKernel::clear() -{ - vprops_clear(); - eprops_clear(); - hprops_clear(); - fprops_clear(); - - clean(); -} - - - -void ArrayKernel::resize( size_t _n_vertices, size_t _n_edges, size_t _n_faces ) -{ - vertices_.resize(_n_vertices); - edges_.resize(_n_edges); - faces_.resize(_n_faces); - - vprops_resize(n_vertices()); - hprops_resize(n_halfedges()); - eprops_resize(n_edges()); - fprops_resize(n_faces()); -} - -void ArrayKernel::reserve(size_t _n_vertices, size_t _n_edges, size_t _n_faces ) -{ - vertices_.reserve(_n_vertices); - edges_.reserve(_n_edges); - faces_.reserve(_n_faces); - - vprops_reserve(_n_vertices); - hprops_reserve(_n_edges*2); - eprops_reserve(_n_edges); - fprops_reserve(_n_faces); -} - -// Status Sets API -void ArrayKernel::init_bit_masks(BitMaskContainer& _bmc) -{ - for (unsigned int i = Attributes::UNUSED; i != 0; i <<= 1) - { - _bmc.push_back(i); - } -} - -void ArrayKernel::init_bit_masks() -{ - init_bit_masks(vertex_bit_masks_); - edge_bit_masks_ = vertex_bit_masks_;//init_bit_masks(edge_bit_masks_); - face_bit_masks_ = vertex_bit_masks_;//init_bit_masks(face_bit_masks_); - halfedge_bit_masks_= vertex_bit_masks_;//init_bit_masks(halfedge_bit_masks_); -} - - -}; - +void ArrayKernel::clean() +{ + + vertices_.clear(); + VertexContainer().swap( vertices_ ); + + edges_.clear(); + EdgeContainer().swap( edges_ ); + + faces_.clear(); + FaceContainer().swap( faces_ ); + +} + + +void ArrayKernel::clear() +{ + vprops_clear(); + eprops_clear(); + hprops_clear(); + fprops_clear(); + + clean(); +} + + + +void ArrayKernel::resize( size_t _n_vertices, size_t _n_edges, size_t _n_faces ) +{ + vertices_.resize(_n_vertices); + edges_.resize(_n_edges); + faces_.resize(_n_faces); + + vprops_resize(n_vertices()); + hprops_resize(n_halfedges()); + eprops_resize(n_edges()); + fprops_resize(n_faces()); +} + +void ArrayKernel::reserve(size_t _n_vertices, size_t _n_edges, size_t _n_faces ) +{ + vertices_.reserve(_n_vertices); + edges_.reserve(_n_edges); + faces_.reserve(_n_faces); + + vprops_reserve(_n_vertices); + hprops_reserve(_n_edges*2); + eprops_reserve(_n_edges); + fprops_reserve(_n_faces); +} + +// Status Sets API +void ArrayKernel::init_bit_masks(BitMaskContainer& _bmc) +{ + for (unsigned int i = Attributes::UNUSED; i != 0; i <<= 1) + { + _bmc.push_back(i); + } +} + +void ArrayKernel::init_bit_masks() +{ + init_bit_masks(vertex_bit_masks_); + edge_bit_masks_ = vertex_bit_masks_;//init_bit_masks(edge_bit_masks_); + face_bit_masks_ = vertex_bit_masks_;//init_bit_masks(face_bit_masks_); + halfedge_bit_masks_= vertex_bit_masks_;//init_bit_masks(halfedge_bit_masks_); +} + + +}; + diff --git a/src/OpenMesh/Core/Mesh/ArrayKernel.hh b/src/OpenMesh/Core/Mesh/ArrayKernel.hh index 388c9267..ccf2748c 100644 --- a/src/OpenMesh/Core/Mesh/ArrayKernel.hh +++ b/src/OpenMesh/Core/Mesh/ArrayKernel.hh @@ -879,10 +879,7 @@ private: void init_bit_masks(BitMaskContainer& _bmc); void init_bit_masks(); -private: - VertexContainer vertices_; - EdgeContainer edges_; - FaceContainer faces_; +protected: VertexStatusPropertyHandle vertex_status_; HalfedgeStatusPropertyHandle halfedge_status_; @@ -894,6 +891,11 @@ private: unsigned int refcount_estatus_; unsigned int refcount_fstatus_; +private: + VertexContainer vertices_; + EdgeContainer edges_; + FaceContainer faces_; + BitMaskContainer halfedge_bit_masks_; BitMaskContainer edge_bit_masks_; BitMaskContainer vertex_bit_masks_; -- GitLab