Added edge selection management in edge selection stack

This commit is contained in:
Paolo Cignoni 2012-12-10 09:39:44 +00:00
parent c0d0599781
commit e9a0913eee
1 changed files with 20 additions and 1 deletions

View File

@ -38,7 +38,8 @@ template <class ComputeMeshType>
class SelectionStack class SelectionStack
{ {
typedef typename ComputeMeshType::template PerVertexAttributeHandle< bool > vsHandle; typedef typename ComputeMeshType::template PerVertexAttributeHandle< bool > vsHandle;
typedef typename ComputeMeshType::template PerFaceAttributeHandle< bool > fsHandle; typedef typename ComputeMeshType::template PerEdgeAttributeHandle< bool > esHandle;
typedef typename ComputeMeshType::template PerFaceAttributeHandle< bool > fsHandle;
public: public:
SelectionStack(ComputeMeshType &m) SelectionStack(ComputeMeshType &m)
@ -49,16 +50,22 @@ public:
bool push() bool push()
{ {
vsHandle vsH = Allocator<ComputeMeshType>::template AddPerVertexAttribute< bool >(*_m); vsHandle vsH = Allocator<ComputeMeshType>::template AddPerVertexAttribute< bool >(*_m);
esHandle esH = Allocator<ComputeMeshType>::template AddPerEdgeAttribute< bool >(*_m);
fsHandle fsH = Allocator<ComputeMeshType>::template AddPerFaceAttribute< bool > (*_m); fsHandle fsH = Allocator<ComputeMeshType>::template AddPerFaceAttribute< bool > (*_m);
typename ComputeMeshType::VertexIterator vi; typename ComputeMeshType::VertexIterator vi;
for(vi = _m->vert.begin(); vi != _m->vert.end(); ++vi) for(vi = _m->vert.begin(); vi != _m->vert.end(); ++vi)
if( !(*vi).IsD() ) vsH[*vi] = (*vi).IsS() ; if( !(*vi).IsD() ) vsH[*vi] = (*vi).IsS() ;
typename ComputeMeshType::EdgeIterator ei;
for(ei = _m->edge.begin(); ei != _m->edge.end(); ++ei)
if( !(*ei).IsD() ) esH[*ei] = (*ei).IsS() ;
typename ComputeMeshType::FaceIterator fi; typename ComputeMeshType::FaceIterator fi;
for(fi = _m->face.begin(); fi != _m->face.end(); ++fi) for(fi = _m->face.begin(); fi != _m->face.end(); ++fi)
if( !(*fi).IsD() ) fsH[*fi] = (*fi).IsS() ; if( !(*fi).IsD() ) fsH[*fi] = (*fi).IsS() ;
vsV.push_back(vsH); vsV.push_back(vsH);
esV.push_back(esH);
fsV.push_back(fsH); fsV.push_back(fsH);
return true; return true;
} }
@ -67,6 +74,7 @@ public:
{ {
if(vsV.empty()) return false; if(vsV.empty()) return false;
vsHandle vsH = vsV.back(); vsHandle vsH = vsV.back();
esHandle esH = esV.back();
fsHandle fsH = fsV.back(); fsHandle fsH = fsV.back();
if(! (Allocator<ComputeMeshType>::template IsValidHandle(*_m, vsH))) return false; if(! (Allocator<ComputeMeshType>::template IsValidHandle(*_m, vsH))) return false;
@ -77,6 +85,14 @@ public:
if(vsH[*vi]) (*vi).SetS() ; if(vsH[*vi]) (*vi).SetS() ;
else (*vi).ClearS() ; else (*vi).ClearS() ;
} }
typename ComputeMeshType::EdgeIterator ei;
for(ei = _m->edge.begin(); ei != _m->edge.end(); ++ei)
if( !(*ei).IsD() )
{
if(esH[*ei]) (*ei).SetS() ;
else (*ei).ClearS() ;
}
typename ComputeMeshType::FaceIterator fi; typename ComputeMeshType::FaceIterator fi;
for(fi = _m->face.begin(); fi != _m->face.end(); ++fi) for(fi = _m->face.begin(); fi != _m->face.end(); ++fi)
if( !(*fi).IsD() ) if( !(*fi).IsD() )
@ -86,8 +102,10 @@ public:
} }
Allocator<ComputeMeshType>::template DeletePerVertexAttribute<bool>(*_m,vsH); Allocator<ComputeMeshType>::template DeletePerVertexAttribute<bool>(*_m,vsH);
Allocator<ComputeMeshType>::template DeletePerEdgeAttribute<bool>(*_m,esH);
Allocator<ComputeMeshType>::template DeletePerFaceAttribute<bool>(*_m,fsH); Allocator<ComputeMeshType>::template DeletePerFaceAttribute<bool>(*_m,fsH);
vsV.pop_back(); vsV.pop_back();
esV.pop_back();
fsV.pop_back(); fsV.pop_back();
return true; return true;
} }
@ -95,6 +113,7 @@ public:
private: private:
ComputeMeshType *_m; ComputeMeshType *_m;
std::vector<vsHandle> vsV; std::vector<vsHandle> vsV;
std::vector<esHandle> esV;
std::vector<fsHandle> fsV; std::vector<fsHandle> fsV;
}; };