00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #ifndef __VCGLIB_EDGEALLOCATOR
00053 #define __VCGLIB_EDGEALLOCATOR
00054
00055 namespace vcg {
00056 namespace edg {
00059
00060
00061 template <class AllocateMeshType>
00062 class Allocator
00063 {
00064
00065 public:
00066 typedef AllocateMeshType MeshType;
00067 typedef typename MeshType::VertexType VertexType;
00068 typedef typename MeshType::VertexPointer VertexPointer;
00069 typedef typename MeshType::VertexIterator VertexIterator;
00070 typedef typename MeshType::EdgeType EdgeType;
00071 typedef typename MeshType::EdgePointer EdgePointer;
00072 typedef typename MeshType::EdgeIterator EdgeIterator;
00073
00079 template<class SimplexPointerType>
00080 class PointerUpdater
00081 {
00082 public:
00083 void Clear(){newBase=oldBase=newEnd=oldEnd=0;preventUpdateFlag=false;};
00084 void Update(SimplexPointerType &vp)
00085 {
00086 vp=newBase+(vp-oldBase);
00087 }
00088 bool NeedUpdate() {if(newBase!=oldBase && !preventUpdateFlag) return true; else return false;}
00089
00090 SimplexPointerType oldBase;
00091 SimplexPointerType newBase;
00092 SimplexPointerType newEnd;
00093 SimplexPointerType oldEnd;
00094 bool preventUpdateFlag;
00095 };
00096
00097
00104 static VertexIterator AddVertices(MeshType &m,int n, PointerUpdater<VertexPointer> &pu)
00105 {
00106 VertexIterator last=m.vert.end();
00107 pu.Clear();
00108 if(m.vert.empty()) pu.oldBase=0;
00109 else pu.oldBase=&*m.vert.begin();
00110
00111
00112 for(int i=0; i<n; ++i)
00113 {
00114 m.vert.push_back(VertexType());
00115 m.vert.back().ClearFlags();
00116 }
00117
00118 m.vn+=n;
00119
00120 pu.newBase = &*m.vert.begin();
00121 if(pu.NeedUpdate())
00122 {
00123 EdgeIterator ei;
00124 for (ei=m.edges.begin(); ei!=m.edges.end(); ++ei)
00125 if(!(*ei).IsD())
00126 {
00127 pu.Update((*ei).V(0));
00128 pu.Update((*ei).V(1));
00129 }
00130 }
00131
00132 unsigned int siz=(unsigned int)m.vert.size()-n;
00133
00134
00135 last = m.vert.begin();
00136 advance(last,siz);
00137
00138
00139
00140
00141 return last;
00142 }
00143
00144 static VertexIterator AddVertices(MeshType &m, int n)
00145 {
00146 PointerUpdater<VertexPointer> pu;
00147 return AddVertices(m, n,pu);
00148 }
00149
00153 static EdgeIterator AddEdges(MeshType &m, int n)
00154 {
00155 PointerUpdater<EdgePointer> pu;
00156 return AddEdges(m,n,pu);
00157 }
00161 static EdgeIterator AddEdges(MeshType &m, int n, PointerUpdater<EdgePointer> &pu)
00162 {
00163 EdgeIterator last=m.edges.end();
00164 pu.Clear();
00165 if(m.edges.empty()) {
00166 pu.oldBase=0;
00167
00168 } else {
00169 pu.oldBase=&*m.edges.begin();
00170 last=m.edges.end();
00171 }
00172
00173 m.edges.resize(m.edges.size()+n);
00174
00175
00176
00177
00178
00179
00180 m.en+=n;
00181
00182 pu.newBase = &*m.edges.begin();
00183
00184 if(pu.NeedUpdate())
00185 {
00186 EdgeIterator ei;
00187 for (ei=m.edges.begin(); ei!=m.edges.end(); ++ei)
00188 if(!(*ei).IsD())
00189 {
00190 if(EdgeType::HasEEAdjacency())
00191 {
00192 pu.Update((*ei).EEp(0));
00193 pu.Update((*ei).EEp(1));
00194 }
00195 }
00196 VertexIterator vi;
00197 for (vi=m.vert.begin(); vi!=m.vert.end(); ++vi)
00198 if(!(*vi).IsD())
00199 {
00200 if(VertexType::HasVEAdjacency())
00201 pu.Update((*vi).VEp());
00202 }
00203 }
00204
00205 unsigned int siz=(unsigned int)m.edges.size()-(unsigned int)n;
00206
00207
00208 last = m.edges.begin();
00209 advance(last,siz);
00210
00211
00212
00213
00214 return last;
00215 }
00216
00217 };
00219 }
00220 }
00221
00222 #endif