#ifndef __EDGE_SELECTOR_VOLUMES_H__ #define __EDGE_SELECTOR_VOLUMES_H__ #include "Container/fakeAttribute.h" #include "Algo/DecimationVolumes/selector.h" #include "Utils/qem.h" #include "Topology/generic/traversorCell.h" namespace CGoGN { namespace Algo { namespace Volume { namespace Decimation { /* * Map Order */ template class EdgeSelector_MapOrder : public Selector { public: typedef typename PFP::MAP MAP ; typedef typename PFP::VEC3 VEC3 ; typedef typename PFP::REAL REAL ; private: Dart cur ; public: EdgeSelector_MapOrder(MAP& m, VertexAttribute& pos, std::vector*>& approx) : Selector(m, pos, approx) {} ~EdgeSelector_MapOrder() {} SelectorType getType() { return S_MapOrder ; } bool init() ; bool nextEdge(Dart& d) ; void updateBeforeCollapse(Dart d) {} void updateAfterCollapse(Dart d2, Dart dd2) ; void updateWithoutCollapse() { } } ; /* * Random */ template class EdgeSelector_Random : public Selector { public: typedef typename PFP::MAP MAP ; typedef typename PFP::VEC3 VEC3 ; typedef typename PFP::REAL REAL ; private: std::vector darts ; unsigned int cur ; bool allSkipped ; public: EdgeSelector_Random(MAP& m, VertexAttribute& pos, std::vector*>& approx) : Selector(m, pos, approx), cur(0), allSkipped(false) {} ~EdgeSelector_Random() {} SelectorType getType() { return S_Random ; } bool init() ; bool nextEdge(Dart& d) ; void updateBeforeCollapse(Dart d2) {} void updateAfterCollapse(Dart d2, Dart dd2) ; void updateWithoutCollapse() { } } ; /* * Edge Length */ template class EdgeSelector_Length : public Selector { 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 "LengthEdgeInfo" ; } } LengthEdgeInfo ; typedef NoMathIOAttribute EdgeInfo ; EdgeAttribute edgeInfo ; std::multimap edges ; typename std::multimap::iterator cur ; void initEdgeInfo(Dart d) ; void updateEdgeInfo(Dart d, bool recompute) ; void computeEdgeInfo(Dart d, EdgeInfo& einfo) ; public: EdgeSelector_Length(MAP& m, VertexAttribute& pos, std::vector*>& approx) : Selector(m, pos, approx) { edgeInfo = m.template addAttribute("edgeInfo") ; } ~EdgeSelector_Length() { this->m_map.removeAttribute(edgeInfo) ; } SelectorType getType() { return S_EdgeLength ; } bool init() ; bool nextEdge(Dart& d) ; void updateBeforeCollapse(Dart d) ; void updateAfterCollapse(Dart d2, Dart dd2) ; void updateWithoutCollapse() { } } ; /* * Progressive Tetrahedralizations [SG98] * Oliver Staadt && Markus Gross */ template class EdgeSelector_SG98 : public Selector { 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 "SG98edgeInfo" ; } } SG98edgeInfo ; typedef NoMathIOAttribute EdgeInfo ; EdgeAttribute edgeInfo ; std::multimap edges ; typename std::multimap::iterator cur ; Approximator* m_positionApproximator ; void initEdgeInfo(Dart d) ; void updateEdgeInfo(Dart d, bool recompute) ; void computeEdgeInfo(Dart d, EdgeInfo& einfo) ; public: EdgeSelector_SG98(MAP& m, VertexAttribute& pos, std::vector*>& approx) : Selector(m, pos, approx), m_positionApproximator(NULL) { edgeInfo = m.template addAttribute("edgeInfo") ; } ~EdgeSelector_SG98() { this->m_map.removeAttribute(edgeInfo) ; } SelectorType getType() { return S_SG98 ; } bool init() ; bool nextEdge(Dart& d) ; void updateBeforeCollapse(Dart d); void updateAfterCollapse(Dart d2, Dart dd2) ; void updateWithoutCollapse() { } } ; } //end namespace Decimation } //namespace Volume } //end namespace Algo } //end namespace CGoGN #include "Algo/DecimationVolumes/edgeSelector.hpp" #endif