From 3af06b689b1c4711181084e0f9d9ee47fbfff5a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=B6bius?= Date: Tue, 19 Jun 2018 14:20:35 +0200 Subject: [PATCH] Copied over SmartTagger --- .../Tools/SmartTagger/SmartTaggerT.cc | 223 +++++++++++++++++ .../Tools/SmartTagger/SmartTaggerT.hh | 233 ++++++++++++++++++ 2 files changed, 456 insertions(+) create mode 100644 src/OpenMesh/Tools/SmartTagger/SmartTaggerT.cc create mode 100644 src/OpenMesh/Tools/SmartTagger/SmartTaggerT.hh diff --git a/src/OpenMesh/Tools/SmartTagger/SmartTaggerT.cc b/src/OpenMesh/Tools/SmartTagger/SmartTaggerT.cc new file mode 100644 index 00000000..ef70911f --- /dev/null +++ b/src/OpenMesh/Tools/SmartTagger/SmartTaggerT.cc @@ -0,0 +1,223 @@ +/*===========================================================================*\ + * * + * OpenFlipper * + * Copyright (c) 2001-2015, RWTH-Aachen University * + * Department of Computer Graphics and Multimedia * + * All rights reserved. * + * www.openflipper.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenFlipper. * + *---------------------------------------------------------------------------* + * * + * Redistribution and use in source and binary forms, with or without * + * modification, are permitted provided that the following conditions * + * are met: * + * * + * 1. Redistributions of source code must retain the above copyright notice, * + * this list of conditions and the following disclaimer. * + * * + * 2. Redistributions in binary form must reproduce the above copyright * + * notice, this list of conditions and the following disclaimer in the * + * documentation and/or other materials provided with the distribution. * + * * + * 3. Neither the name of the copyright holder nor the names of its * + * contributors may be used to endorse or promote products derived from * + * this software without specific prior written permission. * + * * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * + * * +\*===========================================================================*/ + +//============================================================================= +// +// CLASS SmartTaggerVT +// +// +// original Author: David Bommes +// $Revision: 18033 $ +// $Author: moeller $ +// $Date: 2014-01-16 17:17:07 +0100 (Do, 16. Jan 2014) $ +// +//============================================================================= + +//============================================================================= +// +// CLASS SmartTaggerT - IMPLEMENTATION +// +//============================================================================= + +#define ACG_SMARTTAGGERT_C + +//== INCLUDES ================================================================= + +#include "SmartTaggerT.hh" + +#include +#include + +//== NAMESPACES =============================================================== + +namespace ACG { + +//== IMPLEMENTATION ========================================================== + +template +SmartTaggerT:: +SmartTaggerT(Mesh& _mesh, unsigned int _tag_range) + : mesh_(_mesh), + current_base_(0), + tag_range_(_tag_range) +{ + // add new property + mesh_.add_property(ep_tag_); + + // reset all tags once + all_tags_to_zero(); +} + + +//----------------------------------------------------------------------------- + + +template +SmartTaggerT:: +~SmartTaggerT() +{ + mesh_.remove_property(ep_tag_); +} + + +//----------------------------------------------------------------------------- + + +template +void +SmartTaggerT:: +untag_all() +{ + unsigned int max_uint = std::numeric_limits::max(); + + if( current_base_ < max_uint - 2*tag_range_) + current_base_ += tag_range_; + else + { + //overflow -> reset all tags +#ifdef STV_DEBUG_CHECKS + std::cerr << "Tagging Overflow occured...\n"; +#endif + current_base_ = 0; + all_tags_to_zero(); + } +} + + +//----------------------------------------------------------------------------- + + +template +void +SmartTaggerT:: +untag_all( const unsigned int _new_tag_range) +{ + set_tag_range(_new_tag_range); +} + + +//----------------------------------------------------------------------------- + +template +void +SmartTaggerT:: +set_tag ( const EHandle _eh, unsigned int _tag) +{ +#ifdef STV_DEBUG_CHECKS + if( _tag > tag_range_) + std::cerr << "ERROR in set_tag tag range!!!\n"; +#endif + + mesh_.property(ep_tag_, _eh) = current_base_ + _tag; +} + + +//----------------------------------------------------------------------------- + + +template +unsigned int +SmartTaggerT:: +get_tag ( const EHandle _eh) const +{ + unsigned int t = mesh_.property(ep_tag_, _eh); + +#ifdef STV_DEBUG_CHECKS + if( t > current_base_ + tag_range_) + std::cerr << "ERROR in get_tag tag range!!!\n"; +#endif + + if( t<= current_base_) return 0; + else return t-current_base_; +} + + +//----------------------------------------------------------------------------- + + +template +bool +SmartTaggerT:: +is_tagged( const EHandle _eh) const +{ + return bool(get_tag(_eh)); +} + + +//----------------------------------------------------------------------------- + + +template +void +SmartTaggerT:: +set_tag_range( const unsigned int _tag_range) +{ + if( _tag_range <= tag_range_) + { + untag_all(); + tag_range_ = _tag_range; + } + else + { + tag_range_ = _tag_range; + untag_all(); + } +} + + +//----------------------------------------------------------------------------- + + +template +void +SmartTaggerT:: +all_tags_to_zero() +{ + // iterate over property vector + for(unsigned int i=0; i +// $Revision$ +// $Author$ +// $Date$ +// +//============================================================================= + + +#ifndef ACG_SMARTTAGGERT_HH +#define ACG_SMARTTAGGERT_HH + + +//== INCLUDES ================================================================= + +// OpenMesh +#include +#include + + +//== DEFINES ================================================================== + +#define STV_DEBUG_CHECKS + +//== NAMESPACES =============================================================== + +namespace ACG { + +//== FORWARD DECLARATIONS ===================================================== + +// Smarttagging for vertices +template< class Mesh> class SmartTaggerVT; +// Smarttagging for edges +template< class Mesh> class SmartTaggerET; +// Smarttagging for faces +template< class Mesh> class SmartTaggerFT; +// Smarttagging for halfedges +template< class Mesh> class SmartTaggerHT; + + +//== CLASS DEFINITION ========================================================= + + +/** \brief Smart Tagger + * + * A tagger class to be used on OpenMesh. It provides an O(1) reset function for the property. + * - Smarttagging for vertices: SmartTaggerVT; + * - Smarttagging for edges: SmartTaggerET; + * - Smarttagging for faces: SmartTaggerFT; + * - Smarttagging for halfedges: SmartTaggerHT; + * + * Usage: + * + * \code + * SmartTaggerVT< MeshType >* tagger = new SmartTaggerVT< MeshType > (mesh_); + * + * // Reset tagged flag on all vertices + * tagger.untag_all(); + * + * // Check if something is tagged + * bool tag = tagger.is_tagged(vh); + * + * // Set tagged: + * tagger.set_tag(vh); + * \endcode + */ +template +class SmartTaggerT +{ +public: + + /// Constructor + SmartTaggerT(Mesh& _mesh, unsigned int _tag_range = 1); + + /// Destructor + ~SmartTaggerT(); + + /** \brief untag all elements + * + */ + inline void untag_all(); + + /** \brief untag all elements and set new tag_range + * + * @param _new_tag_range New tag range of the tagger + */ + inline void untag_all( const unsigned int _new_tag_range); + + /** \brief set tag to a value in [0..tag_range] + * + * @param _eh Edge handle for the tag + * @param _tag Tag value + */ + inline void set_tag ( const EHandle _eh, unsigned int _tag = 1); + + /** \brief get tag value in range [0..tag_range] + * + * @param _eh Edge handle for the tag + * @return Current tag value at that edge + */ + inline unsigned int get_tag ( const EHandle _eh) const; + + /** \brief overloaded member for boolean tags + * + * @param _eh Edge handle for the tag + * @return Current tag value at that edge + */ + inline bool is_tagged( const EHandle _eh) const; + + /** \brief set new tag range and untag_all + * + * Set new tag range and reset tagger + * + * @param _tag_range New tag range of the tagger + */ + inline void set_tag_range( const unsigned int _tag_range); + +protected: + + inline void all_tags_to_zero(); + +protected: + + // Reference to Mesh + Mesh& mesh_; + + // property which holds the current tags + EPHandle ep_tag_; + + // current tags range is [current_base_+1...current_base_+tag_range_] + unsigned int current_base_; + + // number of different tagvalues available + unsigned int tag_range_; +}; + + +//== SPECIALIZATION =========================================================== + + // define standard Tagger + template< class Mesh> + class SmartTaggerVT + : public SmartTaggerT< Mesh, typename Mesh::VertexHandle, OpenMesh::VPropHandleT > + { + public: + typedef SmartTaggerT< Mesh, typename Mesh::VertexHandle, OpenMesh::VPropHandleT > BaseType; + SmartTaggerVT(Mesh& _mesh, unsigned int _tag_range = 1) : BaseType(_mesh, _tag_range) {} + }; + + template< class Mesh> + class SmartTaggerET + : public SmartTaggerT< Mesh, typename Mesh::EdgeHandle, OpenMesh::EPropHandleT > + { + public: + typedef SmartTaggerT< Mesh, typename Mesh::EdgeHandle, OpenMesh::EPropHandleT > BaseType; + SmartTaggerET(Mesh& _mesh, unsigned int _tag_range = 1) : BaseType(_mesh, _tag_range) {} + }; + + template< class Mesh> + class SmartTaggerFT + : public SmartTaggerT< Mesh, typename Mesh::FaceHandle, OpenMesh::FPropHandleT > + { + public: + typedef SmartTaggerT< Mesh, typename Mesh::FaceHandle, OpenMesh::FPropHandleT > BaseType; + SmartTaggerFT(Mesh& _mesh, unsigned int _tag_range = 1): BaseType(_mesh, _tag_range) {} + }; + + template< class Mesh> + class SmartTaggerHT + : public SmartTaggerT< Mesh, typename Mesh::HalfedgeHandle, OpenMesh::HPropHandleT > + { + public: + typedef SmartTaggerT< Mesh, typename Mesh::HalfedgeHandle, OpenMesh::HPropHandleT > BaseType; + SmartTaggerHT(Mesh& _mesh, unsigned int _tag_range = 1): BaseType(_mesh, _tag_range){} + }; + + +//============================================================================= +} // namespace ACG +//============================================================================= +#if defined(INCLUDE_TEMPLATES) && !defined(ACG_SMARTTAGGERT_C) +#define ACG_SMARTTAGGERT_TEMPLATES +#include "SmartTaggerT.cc" +#endif +//============================================================================= +#endif // ACG_SMARTTAGGERT_HH defined +//============================================================================= +