diff --git a/vcg/complex/trimesh/allocate.h b/vcg/complex/trimesh/allocate.h index 5843a50b..b3619990 100644 --- a/vcg/complex/trimesh/allocate.h +++ b/vcg/complex/trimesh/allocate.h @@ -701,7 +701,17 @@ namespace vcg { } public: + /// Per Vertex Attributes + template + static + bool IsValidHandle( MeshType & m, const typename MeshType::template PerVertexAttributeHandle & a){ + + for(HandlesIterator i = m.vert_attr.begin(); i!=m.vert_attr.end();++i) + if ( (*i).n_attr == a.n_attr ) return true; + return false; + } + template static typename MeshType::template PerVertexAttributeHandle @@ -714,8 +724,10 @@ public: assert(i ==m.vert_attr.end() );// an attribute with this name exists } h._handle = (void*) new SimpleTempData(m.vert); + m.attrn++; + h.n_attr = m.attrn; std::pair < HandlesIterator , bool> res = m.vert_attr.insert(h); - return typename MeshType::template PerVertexAttributeHandle(res.first->_handle); + return typename MeshType::template PerVertexAttributeHandle(res.first->_handle,res.first->n_attr ); } template @@ -735,9 +747,9 @@ public: i =m.vert_attr.find(h1); if(i!=m.vert_attr.end()) - return typename MeshType::template PerVertexAttributeHandle((*i)._handle); + return typename MeshType::template PerVertexAttributeHandle((*i)._handle,(*i).n_attr); else - return typename MeshType:: template PerVertexAttributeHandle(NULL); + return typename MeshType:: template PerVertexAttributeHandle(NULL,0); } template @@ -765,6 +777,14 @@ public: } /// Per Edge Attributes + template + static + bool IsValidHandle( MeshType & m, const typename MeshType::template PerEdgeAttributeHandle & a){ + for(HandlesIterator i = m.edge_attr.begin(); i!=m.edge_attr.end();++i) + if ( (*i).n_attr == a.n_attr ) return true; + return false; + } + template static typename MeshType::template PerEdgeAttributeHandle @@ -777,8 +797,17 @@ public: assert(i ==m.edge_attr.end() );// an attribute with this name exists } h._handle = (void*) new SimpleTempData(m.edge); + m.attrn++; + h.n_attr = m.attrn; std::pair < HandlesIterator , bool> res = m.edge_attr.insert(h); - return typename MeshType::template PerEdgeAttributeHandle(res.first->_handle); + return typename MeshType::template PerEdgeAttributeHandle(res.first->_handle,res.first->n_attr); + } + + template + static + typename MeshType::template PerVertexAttributeHandle + AddPerEdgeAttribute( MeshType & m){ + return AddPerEdgeAttribute(m,std::string("")); } template @@ -791,9 +820,9 @@ public: i =m.edge_attr.find(h1); if(i!=m.edge_attr.end()) - return typename MeshType::template PerFaceAttributeHandle((*i)._handle); + return typename MeshType::template PerFaceAttributeHandle((*i)._handle,(*i).n_attr); else - return typename MeshType:: template PerFaceAttributeHandle(NULL); + return typename MeshType:: template PerFaceAttributeHandle(NULL,0); } template @@ -821,6 +850,14 @@ public: } /// Per Face Attributes + template + static + bool IsValidHandle( MeshType & m, const typename MeshType::template PerFaceAttributeHandle & a){ + for(HandlesIterator i = m.face_attr.begin(); i!=m.face_attr.end();++i) + if ( (*i).n_attr == a.n_attr ) return true; + return false; + } + template static typename MeshType::template PerFaceAttributeHandle @@ -833,10 +870,19 @@ public: assert(i ==m.face_attr.end() );// an attribute with this name exists } h._handle = (void*) new SimpleTempData(m.face); + m.attrn++; + h.n_attr = m.attrn; std::pair < HandlesIterator , bool> res = m.face_attr.insert(h); - return typename MeshType::template PerFaceAttributeHandle(res.first->_handle); + return typename MeshType::template PerFaceAttributeHandle(res.first->_handle,res.first->n_attr); } - + + template + static + typename MeshType::template PerFaceAttributeHandle + AddPerFaceAttribute( MeshType & m){ + return AddPerFaceAttribute(m,std::string("")); + } + template static typename MeshType::template PerFaceAttributeHandle @@ -847,9 +893,9 @@ public: i =m.face_attr.find(h1); if(i!=m.face_attr.end()) - return typename MeshType::template PerFaceAttributeHandle((*i)._handle); + return typename MeshType::template PerFaceAttributeHandle((*i)._handle,(*i).n_attr); else - return typename MeshType:: template PerFaceAttributeHandle(NULL); + return typename MeshType:: template PerFaceAttributeHandle(NULL,0); } template @@ -877,6 +923,14 @@ public: } /// Per Mesh Attributes + template + static + bool IsValidHandle( MeshType & m, const typename MeshType::template PerMeshAttributeHandle & a){ + for(HandlesIterator i = m.mesh_attr.begin(); i!=m.mesh_attr.end();++i) + if ( (*i).n_attr == a.n_attr ) return true; + return false; + } + template static typename MeshType::template PerMeshAttributeHandle @@ -889,8 +943,10 @@ public: assert(i ==m.mesh_attr.end() );// an attribute with this name exists } h._handle = (void*) new Attribute(); + m.attrn++; + h.n_attr = m.attrn; std::pair < HandlesIterator , bool> res = m.mesh_attr.insert(h); - return typename MeshType::template PerMeshAttributeHandle(res.first->_handle); + return typename MeshType::template PerMeshAttributeHandle(res.first->_handle,res.first->n_attr); } template @@ -903,9 +959,9 @@ public: i =m.mesh_attr.find(h1); if(i!=m.mesh_attr.end()) - return typename MeshType::template PerMeshAttributeHandle((*i)._handle); + return typename MeshType::template PerMeshAttributeHandle((*i)._handle,(*i).n_attr); else - return typename MeshType:: template PerMeshAttributeHandle(NULL); + return typename MeshType:: template PerMeshAttributeHandle(NULL,0); } template diff --git a/vcg/complex/trimesh/base.h b/vcg/complex/trimesh/base.h index 75a4d7e2..06fbcee2 100644 --- a/vcg/complex/trimesh/base.h +++ b/vcg/complex/trimesh/base.h @@ -236,20 +236,33 @@ class TriMesh: public TriMeshEdgeHolder normalmaps; + int attrn; // total numer of attribute created + class HandlesWrapper{ public: void * _handle; std::string _name; + int n_attr; void Resize(const int & sz){((SimpleTempDataBase*)_handle)->Resize(sz);} void Reorder(std::vector & newVertIndex){((SimpleTempDataBase*)_handle)->Reorder(newVertIndex);} const bool operator<(const HandlesWrapper b) const { return(_name.empty()&&b._name.empty())?(_handle < b._handle):( _name < b._name);} }; + std::set< HandlesWrapper > vert_attr; + std::set< HandlesWrapper > edge_attr; + std::set< HandlesWrapper > face_attr; + std::set< HandlesWrapper > mesh_attr; + template class PerVertexAttributeHandle{ public: - PerVertexAttributeHandle(){} - PerVertexAttributeHandle( void *ah):_handle ( (SimpleTempData *)ah ){} + PerVertexAttributeHandle(){_handle=NULL;} + PerVertexAttributeHandle( void *ah,const int & n):_handle ( (SimpleTempData *)ah ),n_attr(n){} + PerVertexAttributeHandle operator = ( const PerVertexAttributeHandle & pva){ + (SimpleTempData *)pva._handle; + n_attr = pva.n_attr; + } SimpleTempData * _handle; + int n_attr; // its attribute number template ATTR_TYPE & operator [](const RefType & i){return (*_handle)[i];} }; @@ -257,9 +270,14 @@ class TriMesh: public TriMeshEdgeHolder class PerFaceAttributeHandle{ public: - PerFaceAttributeHandle(){} - PerFaceAttributeHandle(void *ah):_handle ( (SimpleTempData *)ah ){} + PerFaceAttributeHandle(){_handle=NULL;} + PerFaceAttributeHandle(void *ah,const int & n):_handle ( (SimpleTempData *)ah ),n_attr(n){} + PerFaceAttributeHandle operator = ( const PerFaceAttributeHandle & pva){ + (SimpleTempData *)pva._handle; + n_attr = pva.n_attr; + } SimpleTempData * _handle; + int n_attr; // its attribute number template ATTR_TYPE & operator [](const RefType & i){return (*_handle)[i];} }; @@ -267,9 +285,14 @@ class TriMesh: public TriMeshEdgeHolder class PerEdgeAttributeHandle{ public: - PerEdgeAttributeHandle(){} - PerEdgeAttributeHandle(void *ah):_handle ( (SimpleTempData *)ah ){} + PerEdgeAttributeHandle(){_handle=NULL;} + PerEdgeAttributeHandle(void *ah,const int & n):_handle ( (SimpleTempData *)ah ),n_attr(n){} + PerEdgeAttributeHandle operator = ( const PerEdgeAttributeHandle & pva){ + (SimpleTempData *)pva._handle; + n_attr = pva.n_attr; + } SimpleTempData * _handle; + int n_attr; // its attribute number template ATTR_TYPE & operator [](const RefType & i){return (*(SimpleTempData*)_handle)[i];} }; @@ -277,16 +300,17 @@ class TriMesh: public TriMeshEdgeHolder class PerMeshAttributeHandle{ public: - PerMeshAttributeHandle(){} - PerMeshAttributeHandle(void *ah):_handle ( (Attribute *)ah ){} + PerMeshAttributeHandle(){_handle=NULL;} + PerMeshAttributeHandle(void *ah,const int & n):_handle ( (Attribute *)ah ),n_attr(n){} + PerMeshAttributeHandle operator = ( const PerMeshAttributeHandle & pva){ + (Attribute *)pva._handle; + n_attr = pva.n_attr; + } Attribute * _handle; + int n_attr; ATTR_TYPE & operator ()(){ return *((Attribute *)_handle)->attribute;} }; - std::set< HandlesWrapper > vert_attr; - std::set< HandlesWrapper > edge_attr; - std::set< HandlesWrapper > face_attr; - std::set< HandlesWrapper > mesh_attr; /// La camera Camera camera; // intrinsic @@ -313,6 +337,7 @@ public: { fn = vn = 0; imark = 0; + attrn = 0; } /// destructor