Commit 34041d75 authored by Sylvain Thery's avatar Sylvain Thery

resolving MR compilation problems

parent 439c9150
...@@ -104,7 +104,7 @@ public: ...@@ -104,7 +104,7 @@ public:
// if(oldEmb == EMBNULL) // if(oldEmb == EMBNULL)
// { // {
//std::cout << "oldEmb == NULL"<< std::endl; //std::cout << "oldEmb == NULL"<< std::endl;
map.template setOrbitEmbedding<VERTEX>(dd, newEmb) ; Algo::Topo::setOrbitEmbedding<VERTEX>(map,dd,newEmb);
//needed because the darts are duplicated at each level //needed because the darts are duplicated at each level
//and the vertex orbits are initialized at the creation of each level with wrong embedding indices //and the vertex orbits are initialized at the creation of each level with wrong embedding indices
...@@ -114,7 +114,8 @@ public: ...@@ -114,7 +114,8 @@ public:
for(unsigned int i = map.getCurrentLevel() + 1; i <= map.getMaxLevel(); ++i) for(unsigned int i = map.getCurrentLevel() + 1; i <= map.getMaxLevel(); ++i)
{ {
map.setCurrentLevel(i) ; map.setCurrentLevel(i) ;
map.template setOrbitEmbedding<VERTEX>(dd, newEmb) ; Algo::Topo::setOrbitEmbedding<VERTEX>(map,dd,newEmb);
} }
//map.popLevel() ; //map.popLevel() ;
map.setCurrentLevel(cur); map.setCurrentLevel(cur);
......
...@@ -44,9 +44,9 @@ inline void nextNonEmptyLine(std::ifstream& fp, std::string& line) ...@@ -44,9 +44,9 @@ inline void nextNonEmptyLine(std::ifstream& fp, std::string& line)
template <typename PFP> template <typename PFP>
bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vector<std::string>& attrNames, QuadTree& qt) bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vector<std::string>& attrNames, QuadTree& qt)
{ {
VertexAttribute<typename PFP::VEC3, typename PFP::MAP> position = map.template getAttribute<typename PFP::VEC3, VERTEX>("position") ; VertexAttribute<typename PFP::VEC3, typename PFP::MAP> position = map.template getAttribute<typename PFP::VEC3, VERTEX, typename PFP::MAP>("position") ;
if (!position.isValid()) if (!position.isValid())
position = map.template addAttribute<typename PFP::VEC3, VERTEX>("position") ; position = map.template addAttribute<typename PFP::VEC3, VERTEX, typename PFP::MAP>("position") ;
attrNames.push_back(position.name()) ; attrNames.push_back(position.name()) ;
...@@ -197,7 +197,6 @@ bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vecto ...@@ -197,7 +197,6 @@ bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vecto
DartMarkerNoUnmark<typename PFP::MAP> m(map) ; DartMarkerNoUnmark<typename PFP::MAP> m(map) ;
unsigned int vemb = EMBNULL; unsigned int vemb = EMBNULL;
auto fsetemb = [&] (Dart d) { map.template setDartEmbedding<VERTEX>(d, vemb); };
unsigned nbf = qt.roots.size() ; unsigned nbf = qt.roots.size() ;
...@@ -211,7 +210,7 @@ bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vecto ...@@ -211,7 +210,7 @@ bool importMRDAT(typename PFP::MAP& map, const std::string& filename, std::vecto
unsigned int idx = qt.roots[i]->indices[j] ; unsigned int idx = qt.roots[i]->indices[j] ;
vemb = qt.verticesID[idx] ; vemb = qt.verticesID[idx] ;
map.template foreach_dart_of_orbit<PFP::MAP::VERTEX_OF_PARENT>(d, fsetemb) ; map.template foreach_dart_of_orbit<PFP::MAP::VERTEX_OF_PARENT>(d, [&] (Dart dd) { map.template initDartEmbedding<VERTEX>(dd, vemb); });
m.mark(d) ; // mark on the fly to unmark on second loop m.mark(d) ; // mark on the fly to unmark on second loop
vecDartsPerVertex[vemb].push_back(d) ; // store incident darts for fast adjacency reconstruction vecDartsPerVertex[vemb].push_back(d) ; // store incident darts for fast adjacency reconstruction
......
...@@ -582,8 +582,8 @@ void DooSabin(typename PFP::MAP& map, EMBV& position) ...@@ -582,8 +582,8 @@ void DooSabin(typename PFP::MAP& map, EMBV& position)
// take care of edge embedding // take care of edge embedding
if(map.template isOrbitEmbedded<EDGE>()) if(map.template isOrbitEmbedded<EDGE>())
{ {
map.template setOrbitEmbedding<EDGE>(nf, map.template getEmbedding<EDGE>(e)); Algo::Topo::setOrbitEmbedding<VERTEX>(map, nf, map.template getEmbedding<EDGE>(e));
map.template setOrbitEmbedding<EDGE>(map.template phi<11>(nf), map.template getEmbedding<EDGE>(e2)); Algo::Topo::setOrbitEmbedding<VERTEX>(map, map.template phi<11>(nf), map.template getEmbedding<EDGE>(e2));
} }
dm.markOrbit<FACE>(nf); dm.markOrbit<FACE>(nf);
...@@ -608,7 +608,8 @@ void DooSabin(typename PFP::MAP& map, EMBV& position) ...@@ -608,7 +608,8 @@ void DooSabin(typename PFP::MAP& map, EMBV& position)
Dart d = df; Dart d = df;
do do
{ {
map.template setOrbitEmbedding<EDGE>(d,map.template getEmbedding<EDGE>(map.phi2(d))); // map.template setOrbitEmbedding<EDGE>(d,map.template getEmbedding<EDGE>(map.phi2(d)));
Algo::Topo::setOrbitEmbedding<VERTEX>(map, d, map.template getEmbedding<EDGE>(map.phi2(d)));
d = map.phi1(d); d = map.phi1(d);
} while (d != df); } while (d != df);
} }
...@@ -646,7 +647,8 @@ void DooSabin(typename PFP::MAP& map, EMBV& position) ...@@ -646,7 +647,8 @@ void DooSabin(typename PFP::MAP& map, EMBV& position)
P+= c2*buffer[j]; P+= c2*buffer[j];
} }
} }
map.template setOrbitEmbeddingOnNewCell<VERTEX>(e); // map.template setOrbitEmbeddingOnNewCell<VERTEX>(e);
Algo::Topo::setOrbitEmbeddingOnNewCell<VERTEX>(map,e);
position[e] = P; position[e] = P;
e = map.phi1(e); e = map.phi1(e);
} }
...@@ -730,9 +732,9 @@ void computeDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3, typ ...@@ -730,9 +732,9 @@ void computeDual(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3, typ
typedef typename PFP::VEC3 VEC3 ; typedef typename PFP::VEC3 VEC3 ;
// Face Attribute -> after dual new Vertex Attribute // Face Attribute -> after dual new Vertex Attribute
FaceAttribute<VEC3, MAP> positionF = map.template getAttribute<VEC3, FACE>("position") ; FaceAttribute<VEC3, MAP> positionF = map.template getAttribute<VEC3, FACE,MAP>("position") ;
if(!positionF.isValid()) if(!positionF.isValid())
positionF = map.template addAttribute<VEC3, FACE>("position") ; positionF = map.template addAttribute<VEC3, FACE,MAP>("position") ;
// Compute Centroid for the faces // Compute Centroid for the faces
Algo::Surface::Geometry::computeCentroidFaces<PFP>(map, position, positionF) ; Algo::Surface::Geometry::computeCentroidFaces<PFP>(map, position, positionF) ;
...@@ -752,9 +754,9 @@ void computeBoundaryConstraintDual(typename PFP::MAP& map, VertexAttribute<typen ...@@ -752,9 +754,9 @@ void computeBoundaryConstraintDual(typename PFP::MAP& map, VertexAttribute<typen
typedef typename PFP::REAL REAL ; typedef typename PFP::REAL REAL ;
// Face Attribute -> after dual new Vertex Attribute // Face Attribute -> after dual new Vertex Attribute
FaceAttribute<VEC3, MAP> positionF = map.template getAttribute<VEC3, FACE>("position") ; FaceAttribute<VEC3, MAP> positionF = map.template getAttribute<VEC3, FACE,MAP>("position") ;
if(!positionF.isValid()) if(!positionF.isValid())
positionF = map.template addAttribute<VEC3, FACE>("position") ; positionF = map.template addAttribute<VEC3, FACE,MAP>("position") ;
//Triangule boundary faces & compute for each new face the centroid //Triangule boundary faces & compute for each new face the centroid
std::vector<Dart> boundsDart; std::vector<Dart> boundsDart;
...@@ -823,9 +825,9 @@ void computeBoundaryConstraintKeepingOldVerticesDual(typename PFP::MAP& map, Ver ...@@ -823,9 +825,9 @@ void computeBoundaryConstraintKeepingOldVerticesDual(typename PFP::MAP& map, Ver
typedef typename PFP::REAL REAL ; typedef typename PFP::REAL REAL ;
// Face Attribute -> after dual new Vertex Attribute // Face Attribute -> after dual new Vertex Attribute
FaceAttribute<VEC3, MAP> positionF = map.template getAttribute<VEC3, FACE>("position") ; FaceAttribute<VEC3, MAP> positionF = map.template getAttribute<VEC3, FACE,MAP>("position") ;
if(!positionF.isValid()) if(!positionF.isValid())
positionF = map.template addAttribute<VEC3, FACE>("position") ; positionF = map.template addAttribute<VEC3, FACE,MAP>("position") ;
//Triangule boundary faces & compute for each new face the centroid //Triangule boundary faces & compute for each new face the centroid
std::vector<Dart> boundsDart; std::vector<Dart> boundsDart;
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
* * * *
*******************************************************************************/ *******************************************************************************/
#include "Algo/Topo/embedding.h"
namespace CGoGN namespace CGoGN
{ {
...@@ -87,8 +89,10 @@ void Map2MR<PFP>::addNewLevel(bool embedNewVertices) ...@@ -87,8 +89,10 @@ void Map2MR<PFP>::addNewLevel(bool embedNewVertices)
// take care of edge embedding // take care of edge embedding
if(m_map.template isOrbitEmbedded<EDGE>()) if(m_map.template isOrbitEmbedded<EDGE>())
{ {
m_map.template setOrbitEmbedding<EDGE>(nf, m_map.template getEmbedding<EDGE>(d)); // m_map.template setOrbitEmbedding<EDGE>(nf, m_map.template getEmbedding<EDGE>(d));
m_map.template setOrbitEmbedding<EDGE>(m_map.phi1(m_map.phi1(nf)), m_map.template getEmbedding<EDGE>(d2)); // m_map.template setOrbitEmbedding<EDGE>(m_map.phi1(m_map.phi1(nf)), m_map.template getEmbedding<EDGE>(d2));
Algo::Topo::setOrbitEmbedding<EDGE>(m_map, nf, m_map.template getEmbedding<EDGE>(d));
Algo::Topo::setOrbitEmbedding<EDGE>(m_map, m_map.phi1(m_map.phi1(nf)), m_map.template getEmbedding<EDGE>(d2));
} }
m_map.decCurrentLevel(); m_map.decCurrentLevel();
...@@ -109,13 +113,15 @@ void Map2MR<PFP>::addNewLevel(bool embedNewVertices) ...@@ -109,13 +113,15 @@ void Map2MR<PFP>::addNewLevel(bool embedNewVertices)
{ {
if(m_map.template isOrbitEmbedded<EDGE>()) if(m_map.template isOrbitEmbedded<EDGE>())
{ {
m_map.template setOrbitEmbedding<EDGE>(temp, m_map.template getEmbedding<EDGE>( m_map.phi2(temp))); // m_map.template setOrbitEmbedding<EDGE>(temp, m_map.template getEmbedding<EDGE>( m_map.phi2(temp)));
Algo::Topo::setOrbitEmbedding<EDGE>(m_map, temp, m_map.template getEmbedding<EDGE>( m_map.phi2(temp)));
} }
if(!shareVertexEmbeddings) if(!shareVertexEmbeddings)
{ {
//if(m_map.template getEmbedding<VERTEX>(d) == EMBNULL) //if(m_map.template getEmbedding<VERTEX>(d) == EMBNULL)
m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(temp) ; Algo::Topo::setOrbitEmbeddingOnNewCell<VERTEX>(m_map, temp);
//m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(d2) ; //m_map.template setOrbitEmbeddingOnNewCell<VERTEX>(d2) ;
} }
......
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
namespace CGoGN namespace CGoGN
{ {
class MapMono;
class MapMulti : public GenericMap class MapMulti : public GenericMap
{ {
template<typename MAP> friend class DartMarkerTmpl ; template<typename MAP> friend class DartMarkerTmpl ;
...@@ -301,6 +303,8 @@ public: ...@@ -301,6 +303,8 @@ public:
bool copyFrom(const GenericMap& map); bool copyFrom(const GenericMap& map);
bool copyFromOtherType(const MapMono& map);
void restore_topo_shortcuts(); void restore_topo_shortcuts();
} ; } ;
......
...@@ -243,7 +243,7 @@ template <typename MAP_IMPL> ...@@ -243,7 +243,7 @@ template <typename MAP_IMPL>
void Map2<MAP_IMPL>::createHole(Dart d) void Map2<MAP_IMPL>::createHole(Dart d)
{ {
assert(!isBoundaryEdge(d)) ; assert(!isBoundaryEdge(d)) ;
this->template boundaryMarkOrbit<2,FACE>(d) ; Algo::Topo::boundaryMarkOrbit<2,FACE>(*this, d) ;
} }
/*! @name Topological Operators /*! @name Topological Operators
......
...@@ -193,6 +193,9 @@ void MapMono::restore_topo_shortcuts() ...@@ -193,6 +193,9 @@ void MapMono::restore_topo_shortcuts()
void MapMono::compactTopo() void MapMono::compactTopo()
{ {
if (fragmentation(DART)==1.0)
return;
std::vector<unsigned int> oldnew; std::vector<unsigned int> oldnew;
m_attribs[DART].compact(oldnew); m_attribs[DART].compact(oldnew);
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
*******************************************************************************/ *******************************************************************************/
#include "Topology/generic/mapImpl/mapMulti.h" #include "Topology/generic/mapImpl/mapMulti.h"
#include "Topology/generic/mapImpl/mapMono.h"
namespace CGoGN namespace CGoGN
{ {
...@@ -313,31 +314,77 @@ bool MapMulti::loadMapBin(const std::string& filename) ...@@ -313,31 +314,77 @@ bool MapMulti::loadMapBin(const std::string& filename)
return true; return true;
} }
bool MapMulti::copyFromOtherType(const MapMono& mapMR)
{
// map.compactIfNeeded(1.0);
// clear the map but do not insert boundary markers dart attribute
GenericMap::init(false);
// init MR data
initMR();
// copy attrib containers from MapMono
for (unsigned int i = 0; i < NB_ORBITS; ++i)
m_attribs[i].copyFrom(mapMR.getAttributeContainer(i));
// restore shortcuts
GenericMap::restore_shortcuts();
restore_topo_shortcuts();
AttributeContainer darts = m_attribs[DART];
for(unsigned int xd = darts.begin(); xd != darts.end(); darts.next(xd))
{
unsigned int mrdi = m_mrattribs.insertLine() ;
assert(mrdi==xd);
(*m_mrDarts[0])[mrdi] = xd ;
}
return true;
}
bool MapMulti::copyFrom(const GenericMap& map) bool MapMulti::copyFrom(const GenericMap& map)
{ {
const MapMulti& mapMR = reinterpret_cast<const MapMulti&>(map); const MapMulti* mapMR = dynamic_cast<const MapMulti*>(&map);
if (mapTypeName() != map.mapTypeName()) if (mapMR == NULL)
{ {
CGoGNerr << "try to copy from incompatible type map" << CGoGNendl; const MapMono* mapmono = dynamic_cast<const MapMono*>(mapMR);
return false; if (mapmono == NULL)
{
CGoGNerr << "try to copy from incompatible type map" << CGoGNendl;
return false;
}
copyFromOtherType(*mapmono);
} }
// clear the map but do not insert boundary markers dart attribute // clear the map but do not insert boundary markers dart attribute
GenericMap::init(false); GenericMap::init(false);
// init MR data without adding the attributes
m_mrattribs.clear(true) ;
m_mrattribs.setRegistry(m_attributes_registry_map) ;
m_mrDarts.clear() ;
m_mrDarts.reserve(16) ;
m_mrNbDarts.clear();
m_mrNbDarts.reserve(16);
m_mrLevelStack.clear() ;
m_mrLevelStack.reserve(16) ;
// load attrib container // copy attrib containers
for (unsigned int i = 0; i < NB_ORBITS; ++i) for (unsigned int i = 0; i < NB_ORBITS; ++i)
m_attribs[i].copyFrom(mapMR.m_attribs[i]); m_attribs[i].copyFrom(mapMR->m_attribs[i]);
m_mrattribs.copyFrom(mapMR.m_mrattribs); m_mrattribs.copyFrom(mapMR->m_mrattribs);
m_mrCurrentLevel = mapMR.m_mrCurrentLevel;
unsigned int nb = mapMR.m_mrNbDarts.size(); m_mrCurrentLevel = mapMR->m_mrCurrentLevel;
m_mrNbDarts.resize(nb);
for (unsigned int i = 0; i < nb; ++i) m_mrNbDarts.assign(mapMR->m_mrNbDarts.begin(), mapMR->m_mrNbDarts.end());
m_mrNbDarts[i] = mapMR.m_mrNbDarts[i];
m_mrLevelStack.assign(mapMR->m_mrLevelStack.begin(), mapMR->m_mrLevelStack.end()); // ??
// restore shortcuts // restore shortcuts
GenericMap::restore_shortcuts(); GenericMap::restore_shortcuts();
......
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