Commit 7b190e8c authored by Jan Möbius's avatar Jan Möbius

Merge branch 'Moved_SmartTagger_to_OpenMesh' into 'master'

Deprecated SmartTagger (Moved to ACG)

See merge request !115
parents 43a78bf4 7272f285
/*===========================================================================*\
* *
* 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 <bommes@cs.rwth-aachen.de>
// $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 <iostream>
#include <limits>
//== NAMESPACES ===============================================================
namespace ACG {
//== IMPLEMENTATION ==========================================================
template <class Mesh, class EHandle, class EPHandle>
SmartTaggerT<Mesh, EHandle, EPHandle>::
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 <class Mesh, class EHandle, class EPHandle>
SmartTaggerT<Mesh, EHandle, EPHandle>::
~SmartTaggerT()
{
mesh_.remove_property(ep_tag_);
}
//-----------------------------------------------------------------------------
template <class Mesh, class EHandle, class EPHandle>
void
SmartTaggerT<Mesh, EHandle, EPHandle>::
untag_all()
{
unsigned int max_uint = std::numeric_limits<unsigned int>::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 <class Mesh, class EHandle, class EPHandle>
void
SmartTaggerT<Mesh, EHandle, EPHandle>::
untag_all( const unsigned int _new_tag_range)
{
set_tag_range(_new_tag_range);
}
//-----------------------------------------------------------------------------
template <class Mesh, class EHandle, class EPHandle>
void
SmartTaggerT<Mesh, EHandle, EPHandle>::
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 <class Mesh, class EHandle, class EPHandle>
unsigned int
SmartTaggerT<Mesh, EHandle, EPHandle>::
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 <class Mesh, class EHandle, class EPHandle>
bool
SmartTaggerT<Mesh, EHandle, EPHandle>::
is_tagged( const EHandle _eh) const
{
return bool(get_tag(_eh));
}
//-----------------------------------------------------------------------------
template <class Mesh, class EHandle, class EPHandle>
void
SmartTaggerT<Mesh, EHandle, EPHandle>::
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 <class Mesh, class EHandle, class EPHandle>
void
SmartTaggerT<Mesh, EHandle, EPHandle>::
all_tags_to_zero()
{
// iterate over property vector
for(unsigned int i=0; i<mesh_.property(ep_tag_).n_elements(); ++i)
{
mesh_.property(ep_tag_)[i] = 0;
}
}
//=============================================================================
} // namespace ACG
//=============================================================================
......@@ -39,195 +39,36 @@
* *
\*===========================================================================*/
//=============================================================================
//
// CLASS SmartTaggerVT
//
//
// original Author: David Bommes <bommes@cs.rwth-aachen.de>
// $Revision$
// $Author$
// $Date$
//
//=============================================================================
#ifndef ACG_SMARTTAGGERT_HH
#define ACG_SMARTTAGGERT_HH
#pragma once
//== INCLUDES =================================================================
// OpenMesh
#include <OpenMesh/Core/Utils/Property.hh>
#include <OpenMesh/Core/System/omstream.hh>
//== DEFINES ==================================================================
#define STV_DEBUG_CHECKS
//== NAMESPACES ===============================================================
#include <OpenMesh/Tools/SmartTagger/SmartTaggerT.hh>
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 =========================================================
#ifdef WIN32
#pragma message("SmartTagger has been moved to OpenMesh! Please use it directly from there (OpenMesh/Tools/SmartTagger/SmartTaggerT.hh , Now in namespace OpenMesh) ")
#else
#warning "SmartTagger has been moved to OpenMesh! Please use it directly from there (OpenMesh/Tools/SmartTagger/SmartTaggerT.hh , Now in namespace OpenMesh) "
#endif
/** \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 Mesh, class EHandle, class EPHandle>
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);
using SmartTaggerT = OpenMesh::SmartTaggerT<Mesh, EHandle, EPHandle>;
/** \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;
template <class Mesh>
using SmartTaggerVT = OpenMesh::SmartTaggerVT<Mesh>;
/** \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;
template <class Mesh>
using SmartTaggerET = OpenMesh::SmartTaggerET<Mesh>;
/** \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:
template <class Mesh>
using SmartTaggerFT = OpenMesh::SmartTaggerFT<Mesh>;
inline void all_tags_to_zero();
template <class Mesh>
using SmartTaggerHT = OpenMesh::SmartTaggerHT<Mesh>;
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<unsigned int> >
{
public:
typedef SmartTaggerT< Mesh, typename Mesh::VertexHandle, OpenMesh::VPropHandleT<unsigned int> > 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<unsigned int> >
{
public:
typedef SmartTaggerT< Mesh, typename Mesh::EdgeHandle, OpenMesh::EPropHandleT<unsigned int> > 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<unsigned int> >
{
public:
typedef SmartTaggerT< Mesh, typename Mesh::FaceHandle, OpenMesh::FPropHandleT<unsigned int> > 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<unsigned int> >
{
public:
typedef SmartTaggerT< Mesh, typename Mesh::HalfedgeHandle, OpenMesh::HPropHandleT<unsigned int> > 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
//=============================================================================
Subproject commit b8b84489d226a7016a53393164cf14fab073bac2
Subproject commit 054e9985276cc8badd6a74f3621cc21de8936198
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment