23 #ifndef __VCGLIB_APPEND
24 #define __VCGLIB_APPEND
27 #error "This file should not be included alone. It is automatically included by complex.h"
39 template<
class MeshLeft,
class ConstMeshRight>
43 typedef typename MeshLeft::ScalarType ScalarLeft;
44 typedef typename MeshLeft::CoordType CoordLeft;
45 typedef typename MeshLeft::VertexType VertexLeft;
46 typedef typename MeshLeft::EdgeType EdgeLeft;
47 typedef typename MeshLeft::FaceType FaceLeft;
48 typedef typename MeshLeft::HEdgeType HEdgeLeft;
49 typedef typename MeshLeft::TetraType TetraLeft;
50 typedef typename MeshLeft::VertexPointer VertexPointerLeft;
51 typedef typename MeshLeft::VertexIterator VertexIteratorLeft;
52 typedef typename MeshLeft::EdgeIterator EdgeIteratorLeft;
53 typedef typename MeshLeft::HEdgeIterator HEdgeIteratorLeft;
54 typedef typename MeshLeft::FaceIterator FaceIteratorLeft;
55 typedef typename MeshLeft::TetraIterator TetraIteratorLeft;
58 typedef typename ConstMeshRight::ScalarType ScalarRight;
59 typedef typename ConstMeshRight::CoordType CoordRight;
60 typedef typename ConstMeshRight::VertexType VertexRight;
61 typedef typename ConstMeshRight::EdgeType EdgeRight;
62 typedef typename ConstMeshRight::HEdgeType HEdgeRight;
63 typedef typename ConstMeshRight::FaceType FaceRight;
64 typedef typename ConstMeshRight::TetraType TetraRight;
65 typedef typename ConstMeshRight::TetraPointer TetraPointerRight;
66 typedef typename ConstMeshRight::TetraIterator TetraIteratorRight;
67 typedef typename ConstMeshRight::VertexPointer VertexPointerRight;
68 typedef typename ConstMeshRight::VertexIterator VertexIteratorRight;
69 typedef typename ConstMeshRight::EdgeIterator EdgeIteratorRight;
70 typedef typename ConstMeshRight::HEdgeIterator HEdgeIteratorRight;
71 typedef typename ConstMeshRight::FaceIterator FaceIteratorRight;
72 typedef typename ConstMeshRight::FacePointer FacePointerRight;
75 static size_t InvalidIndex() {
return std::numeric_limits<size_t>::max(); }
76 std::vector<size_t> vert, face, edge, hedge, tetra;
79 static void ImportVertexAdj(MeshLeft &ml, ConstMeshRight &mr, VertexLeft &vl, VertexRight &vr, Remap &remap ){
81 if(HasVEAdjacency(ml) && HasVEAdjacency(mr) && vr.cVEp() != 0){
82 size_t i = Index(mr,vr.cVEp());
83 vl.VEp() = (i>ml.edge.size())? 0 : &ml.edge[remap.edge[i]];
88 if(HasPerVertexVFAdjacency(ml) && HasPerVertexVFAdjacency(mr) && vr.cVFp() != 0 ){
89 size_t i = Index(mr,vr.cVFp());
90 vl.VFp() = (i>ml.face.size())? 0 :&ml.face[remap.face[i]];
95 if(HasVHAdjacency(ml) && HasVHAdjacency(mr) && vr.cVHp() != 0){
96 vl.VHp() = &ml.hedge[remap.hedge[Index(mr,vr.cVHp())]];
101 if(HasVTAdjacency(ml) && HasVTAdjacency(mr) && vr.cVTp() != 0){
102 size_t i = Index(mr, vr.cVTp());
103 vl.VTp() = (i > ml.edge.size()) ? 0 : &ml.tetra[remap.tetra[i]];
108 static void ImportEdgeAdj(MeshLeft &ml, ConstMeshRight &mr, EdgeLeft &el,
const EdgeRight &er, Remap &remap)
111 if(HasEEAdjacency(ml) && HasEEAdjacency(mr))
112 for(
unsigned int vi = 0; vi < 2; ++vi)
114 size_t idx = Index(mr,er.cEEp(vi));
115 el.EEp(vi) = (idx>ml.edge.size())? 0 : &ml.edge[remap.edge[idx]];
116 el.EEi(vi) = er.cEEi(vi);
120 if(HasEFAdjacency(ml) && HasEFAdjacency(mr)){
121 size_t idx = Index(mr,er.cEFp());
122 el.EFp() = (idx>ml.face.size())? 0 :&ml.face[remap.face[idx]];
123 el.EFi() = er.cEFi();
127 if(HasEHAdjacency(ml) && HasEHAdjacency(mr))
128 el.EHp() = &ml.hedge[remap.hedge[Index(mr,er.cEHp())]];
132 static void ImportFaceAdj(MeshLeft &ml, ConstMeshRight &mr, FaceLeft &fl,
const FaceRight &fr, Remap &remap )
135 if(HasFEAdjacency(ml) && HasFEAdjacency(mr)){
136 assert(fl.VN() == fr.VN());
137 for(
int vi = 0; vi < fl.VN(); ++vi ){
138 size_t idx = remap.edge[Index(mr,fr.cFEp(vi))];
139 if(idx!=Remap::InvalidIndex())
140 fl.FEp(vi) = &ml.edge[idx];
145 if(HasFFAdjacency(ml) && HasFFAdjacency(mr)){
146 assert(fl.VN() == fr.VN());
147 for(
int vi = 0; vi < fl.VN(); ++vi ){
148 size_t idx = remap.face[Index(mr,fr.cFFp(vi))];
149 if(idx!=Remap::InvalidIndex()){
150 assert(idx >= 0 && idx < ml.face.size());
151 fl.FFp(vi) = &ml.face[idx];
152 fl.FFi(vi) = fr.cFFi(vi);
158 if(HasPerFaceVFAdjacency(ml) && HasPerFaceVFAdjacency(mr))
160 assert(fl.VN() == fr.VN());
161 for (
int vi = 0; vi < fl.VN(); ++vi)
163 const auto * fp = fr.cVFp(vi);
164 const auto vfindex = fr.cVFi(vi);
165 size_t fidx = (fp ==
nullptr) ? Remap::InvalidIndex() : remap.face[Index(mr,fp)];
167 if (fidx == Remap::InvalidIndex())
170 assert(fl.cVFi(vi) == -1);
174 assert(fidx >= 0 && fidx < ml.face.size());
175 fl.VFp(vi) = &ml.face[fidx];
176 fl.VFi(vi) = vfindex;
182 if(HasFHAdjacency(ml) && HasFHAdjacency(mr))
183 fl.FHp() = &ml.hedge[remap.hedge[Index(mr,fr.cFHp())]];
186 static void ImportHEdgeAdj(MeshLeft &ml, ConstMeshRight &mr, HEdgeLeft &hl,
const HEdgeRight &hr, Remap &remap,
bool ){
188 if(HasHVAdjacency(ml) && HasHVAdjacency(mr))
189 hl.HVp() = &ml.vert[remap.vert[Index(mr,hr.cHVp())]];
192 if(HasHEAdjacency(ml) && HasHEAdjacency(mr)){
193 size_t idx = Index(mr,hr.cHEp()) ;
194 hl.HEp() = (idx>ml.edge.size())? 0 : &ml.edge[remap.edge[idx]];
198 if(HasHFAdjacency(ml) && HasHFAdjacency(mr)){
199 size_t idx = Index(mr,hr.cHFp());
200 hl.HFp() = (idx>ml.face.size())? 0 :&ml.face[remap.face[idx]];
205 if(HasHOppAdjacency(ml) && HasHOppAdjacency(mr))
206 hl.HOp() = &ml.hedge[remap.hedge[Index(mr,hr.cHOp())]];
209 if(HasHNextAdjacency(ml) && HasHNextAdjacency(mr))
210 hl.HNp() = &ml.hedge[remap.hedge[Index(mr,hr.cHNp())]];
213 if(HasHPrevAdjacency(ml) && HasHPrevAdjacency(mr))
214 hl.HPp() = &ml.hedge[remap.hedge[Index(mr,hr.cHPp())]];
217 static void ImportTetraAdj(MeshLeft &ml, ConstMeshRight &mr, TetraLeft &tl,
const TetraRight &tr, Remap &remap )
220 if(HasTTAdjacency(ml) && HasTTAdjacency(mr)){
221 for(
int vi = 0; vi < 4; ++vi ){
222 size_t idx = remap.tetra[Index(mr,tr.cTTp(vi))];
223 if(idx != Remap::InvalidIndex()){
224 tl.TTp(vi) = &ml.tetra[idx];
225 tl.TTi(vi) = tr.cTTi(vi);
254 static void Mesh(MeshLeft& ml, ConstMeshRight& mr,
const bool selected =
false,
const bool adjFlag =
false)
263 assert(adjFlag ==
false || ml.IsEmpty());
274 remap.vert.resize(mr.vert.size(), Remap::InvalidIndex());
275 VertexIteratorLeft vp;
282 for(VertexIteratorRight vi=mr.vert.begin(); vi!=mr.vert.end(); ++vi)
284 if(!(*vi).IsD() && (!selected || (*vi).IsS()))
286 size_t ind=Index(mr,*vi);
287 remap.vert[ind]=int(Index(ml,*vp));
292 remap.edge.resize(mr.edge.size(), Remap::InvalidIndex());
298 for(EdgeIteratorRight ei=mr.edge.begin(); ei!=mr.edge.end(); ++ei)
299 if(!(*ei).IsD() && (!selected || (*ei).IsS())){
300 size_t ind=Index(mr,*ei);
301 remap.edge[ind]=int(Index(ml,*ep));
306 remap.face.resize(mr.face.size(), Remap::InvalidIndex());
312 for(FaceIteratorRight fi=mr.face.begin(); fi!=mr.face.end(); ++fi)
313 if(!(*fi).IsD() && (!selected || (*fi).IsS())){
314 size_t ind=Index(mr,*fi);
315 remap.face[ind]=int(Index(ml,*fp));
320 remap.hedge.resize(mr.hedge.size(),Remap::InvalidIndex());
321 for(HEdgeIteratorRight hi=mr.hedge.begin(); hi!=mr.hedge.end(); ++hi)
322 if(!(*hi).IsD() && (!selected || (*hi).IsS())){
323 size_t ind=Index(mr,*hi);
324 assert(remap.hedge[ind]==Remap::InvalidIndex());
326 (*hp).ImportData(*(hi));
327 remap.hedge[ind]=Index(ml,*hp);
330 remap.tetra.resize(mr.tetra.size(), Remap::InvalidIndex());
331 for (TetraIteratorRight ti = mr.tetra.begin(); ti != mr.tetra.end(); ++ti)
332 if (!(*ti).IsD() && (!selected || (*ti).IsS())) {
333 size_t idx = Index(mr, *ti);
334 assert (remap.tetra[idx] == Remap::InvalidIndex());
336 (*tp).ImportData(*ti);
337 remap.tetra[idx] = Index(ml, *tp);
344 for(VertexIteratorRight vi=mr.vert.begin();vi!=mr.vert.end();++vi)
345 if( !(*vi).IsD() && (!selected || (*vi).IsS())){
346 ml.vert[remap.vert[Index(mr,*vi)]].ImportData(*vi);
347 if(adjFlag) ImportVertexAdj(ml,mr,ml.vert[remap.vert[Index(mr,*vi)]],*vi,remap);
351 for(EdgeIteratorRight ei=mr.edge.begin();ei!=mr.edge.end();++ei)
352 if(!(*ei).IsD() && (!selected || (*ei).IsS())){
353 ml.edge[remap.edge[Index(mr,*ei)]].ImportData(*ei);
355 EdgeLeft &el = ml.edge[remap.edge[Index(mr,*ei)]];
356 if(HasEVAdjacency(ml) && HasEVAdjacency(mr)){
357 el.V(0) = &ml.vert[remap.vert[Index(mr,ei->cV(0))]];
358 el.V(1) = &ml.vert[remap.vert[Index(mr,ei->cV(1))]];
360 if(adjFlag) ImportEdgeAdj(ml,mr,el,*ei,remap);
364 const size_t textureOffset = ml.textures.size();
365 bool WTFlag = HasPerWedgeTexCoord(mr) && (textureOffset>0);
366 for(FaceIteratorRight fi=mr.face.begin();fi!=mr.face.end();++fi)
367 if(!(*fi).IsD() && (!selected || (*fi).IsS()))
369 FaceLeft &fl = ml.face[remap.face[Index(mr,*fi)]];
371 if(HasFVAdjacency(ml) && HasFVAdjacency(mr)){
372 for(
int i = 0; i < fl.VN(); ++i)
373 fl.V(i) = &ml.vert[remap.vert[Index(mr,fi->cV(i))]];
377 for(
int i = 0; i < fl.VN(); ++i)
378 fl.WT(i).n() += short(textureOffset);
379 if(adjFlag) ImportFaceAdj(ml,mr,ml.face[remap.face[Index(mr,*fi)]],*fi,remap);
384 for(HEdgeIteratorRight hi=mr.hedge.begin();hi!=mr.hedge.end();++hi)
385 if(!(*hi).IsD() && (!selected || (*hi).IsS())){
386 ml.hedge[remap.hedge[Index(mr,*hi)]].ImportData(*hi);
387 ImportHEdgeAdj(ml,mr,ml.hedge[remap.hedge[Index(mr,*hi)]],*hi,remap,selected);
391 for(TetraIteratorRight ti = mr.tetra.begin(); ti != mr.tetra.end(); ++ti)
392 if(!(*ti).IsD() && (!selected || (*ti).IsS()))
394 TetraLeft &tl = ml.tetra[remap.tetra[Index(mr,*ti)]];
396 if(HasFVAdjacency(ml) && HasFVAdjacency(mr)){
397 for(
int i = 0; i < 4; ++i)
398 tl.V(i) = &ml.vert[remap.vert[Index(mr,ti->cV(i))]];
401 if(adjFlag) ImportTetraAdj(ml, mr, ml.tetra[remap.tetra[Index(mr,*ti)]], *ti, remap);
409 ml.textures.insert(ml.textures.end(),mr.textures.begin(),mr.textures.end());
419 typename std::set< PointerToAttribute >::iterator al, ar;
422 for(al = ml.vert_attr.begin(); al != ml.vert_attr.end(); ++al)
423 if(!(*al)._name.empty()){
424 ar = mr.vert_attr.find(*al);
425 if(ar!= mr.vert_attr.end()){
427 for(VertexIteratorRight vi=mr.vert.begin();vi!=mr.vert.end();++vi,++id_r)
428 if( !(*vi).IsD() && (!selected || (*vi).IsS()))
429 (*al)._handle->CopyValue(remap.vert[Index(mr,*vi)], id_r, (*ar)._handle);
434 for(al = ml.edge_attr.begin(); al != ml.edge_attr.end(); ++al)
435 if(!(*al)._name.empty()){
436 ar = mr.edge_attr.find(*al);
437 if(ar!= mr.edge_attr.end()){
439 for(EdgeIteratorRight ei=mr.edge.begin();ei!=mr.edge.end();++ei,++id_r)
440 if( !(*ei).IsD() && (!selected || (*ei).IsS()))
441 (*al)._handle->CopyValue(remap.edge[Index(mr,*ei)], id_r, (*ar)._handle);
446 for(al = ml.face_attr.begin(); al != ml.face_attr.end(); ++al)
447 if(!(*al)._name.empty()){
448 ar = mr.face_attr.find(*al);
449 if(ar!= mr.face_attr.end()){
451 for(FaceIteratorRight fi=mr.face.begin();fi!=mr.face.end();++fi,++id_r)
452 if( !(*fi).IsD() && (!selected || (*fi).IsS()))
453 (*al)._handle->CopyValue(remap.face[Index(mr,*fi)], id_r, (*ar)._handle);
458 for(al = ml.tetra_attr.begin(); al != ml.tetra_attr.end(); ++al)
459 if(!(*al)._name.empty()){
460 ar = mr.tetra_attr.find(*al);
461 if(ar!= mr.tetra_attr.end()){
463 for(TetraIteratorRight ti = mr.tetra.begin(); ti != mr.tetra.end(); ++ti, ++id_r)
464 if( !(*ti).IsD() && (!selected || (*ti).IsS()))
465 (*al)._handle->CopyValue(remap.tetra[Index(mr, *ti)], id_r, (*ar)._handle);
482 static void MeshCopy(MeshLeft& ml, ConstMeshRight& mr,
bool selected=
false,
const bool adjFlag =
false)
485 Mesh(ml,mr,selected,adjFlag);
486 ml.bbox.Import(mr.bbox);
492 static void Selected(MeshLeft& ml, ConstMeshRight& mr)