/******************************************************************************* * CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps * * version 0.1 * * Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg * * * * This library is free software; you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as published by the * * Free Software Foundation; either version 2.1 of the License, or (at your * * option) any later version. * * * * This library is distributed in the hope that it will be useful, but WITHOUT * * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * * for more details. * * * * You should have received a copy of the GNU Lesser General Public License * * along with this library; if not, write to the Free Software Foundation, * * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * * * Web site: http://cgogn.unistra.fr/ * * Contact information: cgogn@unistra.fr * * * *******************************************************************************/ #ifndef __HALFEDGESELECTOR_H__ #define __HALFEDGESELECTOR_H__ #include "Algo/Decimation/selector.h" namespace CGoGN { namespace Algo { namespace Decimation { template class HalfEdgeSelector_QEMml : public EdgeSelector { public: typedef typename PFP::MAP MAP ; typedef typename PFP::VEC3 VEC3 ; typedef typename PFP::REAL REAL ; private: typedef struct { typename std::multimap::iterator it ; bool valid ; static std::string CGoGNnameOfType() { return "QEMhalfEdgeInfo" ; } } QEMhalfEdgeInfo ; typedef NoMathIOAttribute HalfEdgeInfo ; DartAttribute halfEdgeInfo ; VertexAttribute > quadric ; std::multimap halfEdges ; typename std::multimap::iterator cur ; Approximator* m_positionApproximator ; void initHalfEdgeInfo(Dart d) ; void updateHalfEdgeInfo(Dart d, bool recompute) ; void computeHalfEdgeInfo(Dart d, HalfEdgeInfo& einfo) ; void recomputeQuadric(const Dart d, const bool recomputeNeighbors = false) ; public: HalfEdgeSelector_QEMml(MAP& m, VertexAttribute& pos, std::vector*>& approx, const FunctorSelect& select = allDarts) : EdgeSelector(m, pos, approx, select) { halfEdgeInfo = m.template addAttribute("halfEdgeInfo") ; quadric = m.template addAttribute, VERTEX>("QEMquadric") ; } ~HalfEdgeSelector_QEMml() { this->m_map.removeAttribute(quadric) ; this->m_map.removeAttribute(halfEdgeInfo) ; } SelectorType getType() { return S_hQEMml ; } bool init() ; bool nextEdge(Dart& d) ; void updateBeforeCollapse(Dart d) ; void updateAfterCollapse(Dart d2, Dart dd2) ; } ; template class HalfEdgeSelector_Color : public EdgeSelector { public: typedef typename PFP::MAP MAP ; typedef typename PFP::VEC3 VEC3 ; typedef typename PFP::REAL REAL ; private: typedef struct { typename std::multimap::iterator it ; bool valid ; static std::string CGoGNnameOfType() { return "ColorHalfEdgeInfo" ; } } QEMhalfEdgeInfo ; typedef NoMathIOAttribute HalfEdgeInfo ; DartAttribute halfEdgeInfo ; VertexAttribute m_color ; VertexAttribute > m_quadric ; std::multimap halfEdges ; typename std::multimap::iterator cur ; Approximator* m_positionApproximator ; Approximator* m_colorApproximator ; void initHalfEdgeInfo(Dart d) ; void updateHalfEdgeInfo(Dart d, bool recompute) ; void computeHalfEdgeInfo(Dart d, HalfEdgeInfo& einfo) ; void recomputeQuadric(const Dart d, const bool recomputeNeighbors = false) ; public: HalfEdgeSelector_Color(MAP& m, VertexAttribute& pos, std::vector*>& approx, const FunctorSelect& select = allDarts) : EdgeSelector(m, pos, approx, select) { halfEdgeInfo = m.template addAttribute("halfEdgeInfo") ; m_quadric = m.template addAttribute, VERTEX>("QEMquadric") ; m_color = m.template getAttribute("color") ; assert(m_color.isValid() || !"HalfEdgeSelector_Color: Color atrribute to select is not valid") ; } ~HalfEdgeSelector_Color() { this->m_map.removeAttribute(halfEdgeInfo) ; this->m_map.removeAttribute(m_quadric) ; } SelectorType getType() { return S_hColor ; } bool init() ; bool nextEdge(Dart& d) ; void updateBeforeCollapse(Dart d) ; void updateAfterCollapse(Dart d2, Dart dd2) ; } ; /*template class HalfEdgeSelector_Lightfield_deprecated : public EdgeSelector { public: typedef typename PFP::MAP MAP ; typedef typename PFP::VEC3 VEC3 ; typedef typename PFP::REAL REAL ; typedef Geom::Matrix<3,3,REAL> MATRIX33 ; typedef Geom::Matrix<3,6,REAL> MATRIX36 ; private: typedef struct { typename std::multimap::iterator it ; bool valid ; static std::string CGoGNnameOfType() { return "LightfieldHalfEdgeInfo_deprecated" ; } } LightfieldHalfEdgeInfo ; typedef NoMathIOAttribute HalfEdgeInfo ; VertexAttribute m_frame ; DartAttribute halfEdgeInfo ; VertexAttribute > quadric ; EdgeAttribute > quadricRGBfunctions ; std::multimap halfEdges ; typename std::multimap::iterator cur ; Approximator* m_positionApproximator ; Approximator* m_frameApproximator ; Approximator* m_RGBfunctionsApproximator ; void initHalfEdgeInfo(Dart d) ; void updateHalfEdgeInfo(Dart d, bool recompute) ; void computeHalfEdgeInfo(Dart d, HalfEdgeInfo& einfo) ; void recomputeQuadric(const Dart d, const bool recomputeNeighbors) ; public: HalfEdgeSelector_Lightfield_deprecated(MAP& m, VertexAttribute& pos, std::vector*>& approx, const FunctorSelect& select = allDarts) : EdgeSelector(m, pos, approx, select) { m_frame = m.template getAttribute("frame") ; halfEdgeInfo = m.template addAttribute("halfEdgeInfo") ; quadric = m.template addAttribute, VERTEX>("QEMquadric") ; quadricRGBfunctions = m.template addAttribute, EDGE>("quadricRGBfunctions") ; } ~HalfEdgeSelector_Lightfield_deprecated() { this->m_map.removeAttribute(quadric) ; this->m_map.removeAttribute(quadricRGBfunctions) ; this->m_map.removeAttribute(halfEdgeInfo) ; } SelectorType getType() { return S_hLightfield_deprecated ; } bool init() ; bool nextEdge(Dart& d) ; void updateBeforeCollapse(Dart d) ; void updateAfterCollapse(Dart d2, Dart dd2) ; } ; / * template class EdgeSelector_Lightfield : public EdgeSelector { public: typedef typename PFP::MAP MAP ; typedef typename PFP::VEC3 VEC3 ; typedef typename PFP::REAL REAL ; typedef Geom::Matrix<3,3,REAL> MATRIX33 ; typedef MATRIX33 FRAME ; typedef Geom::Matrix<3,6,REAL> MATRIX36 ; typedef MATRIX36 RGBFUNCTIONS ; private: typedef struct { typename std::multimap::iterator it ; bool valid ; static std::string CGoGNnameOfType() { return "LightfieldEdgeInfo" ; } } LightfieldEdgeInfo ; typedef NoMathIOAttribute EdgeInfo ; AttributeHandler m_frame ; AttributeHandler edgeInfo ; AttributeHandler, VERTEX> quadric ; AttributeHandler, EDGE> quadricRGBfunctions ; Quadric tmpQ ; std::multimap edges ; typename std::multimap::iterator cur ; Approximator* m_positionApproximator ; Approximator* m_frameApproximator ; Approximator* m_RGBfunctionsApproximator ; void initEdgeInfo(Dart d) ; void updateEdgeInfo(Dart d, bool recompute) ; void computeEdgeInfo(Dart d, EdgeInfo& einfo) ; public: EdgeSelector_Lightfield(MAP& m, VertexAttribute& pos, std::vector*>& approx, const FunctorSelect& select = allDarts) : EdgeSelector(m, pos, approx, select) { m_frame = m.template getAttribute("frame") ; edgeInfo = m.template addAttribute("edgeInfo") ; quadric = m.template addAttribute, VERTEX>("QEMquadric") ; quadricRGBfunctions = m.template addAttribute, EDGE>("quadricRGBfunctions") ; } ~EdgeSelector_Lightfield() { this->m_map.removeAttribute(quadric) ; this->m_map.removeAttribute(quadricRGBfunctions) ; this->m_map.removeAttribute(edgeInfo) ; } SelectorType getType() { return S_Lightfield ; } bool init() ; bool nextEdge(Dart& d) ; void updateBeforeCollapse(Dart d) ; void updateAfterCollapse(Dart d2, Dart dd2) ; } ;*/ } // namespace Decimation } // namespace Algo } // namespace CGoGN #include "Algo/Decimation/halfEdgeSelector.hpp" #endif