1 // This is brl/bbas/bmsh3d/bmsh3d_textured_mesh_mc.cxx
2 //---------------------------------------------------------------------
3 #include "bmsh3d_textured_mesh_mc.h"
4 //:
5 // \file
6 // \brief Mesh
7 //
8 // \author Daniel Crispell
9 // \date   March 20, 2007
10 //
11 // \verbatim
12 //  Modifications
13 //   <none>
14 // \endverbatim
15 //
16 //-------------------------------------------------------------------------
17 
18 #include "bmsh3d_mesh_mc.h"
19 #include "bmsh3d_textured_face_mc.h"
20 #include "bmsh3d_vertex.h"
21 
22 //: create a textured mesh from a non-textured mesh
bmsh3d_textured_mesh_mc(bmsh3d_mesh_mc * mesh)23 bmsh3d_textured_mesh_mc::bmsh3d_textured_mesh_mc(bmsh3d_mesh_mc* mesh): bmsh3d_mesh_mc()
24 {
25   // shallow copy the vertices
26   std::map<int, bmsh3d_vertex* > vertices = mesh->vertexmap();
27   std::map<int, bmsh3d_vertex* >::iterator v_it;
28   for (v_it = vertices.begin(); v_it != vertices.end(); v_it++) {
29     bmsh3d_vertex* vertex = v_it->second;
30     this->_add_vertex(vertex);
31   }
32 
33   // shallow copy the edgemap
34   std::map<int, bmsh3d_edge* > edgemap = mesh->edgemap();
35   std::map<int, bmsh3d_edge* >::iterator edge_it;
36   for (edge_it = edgemap.begin(); edge_it != edgemap.end(); edge_it++) {
37     // create new edges
38     bmsh3d_edge* edge = edge_it->second;
39     this->add_edge_incidence (edge);
40   }
41 
42   // deep copy the faces (need to create textured faces)
43   std::map<int, bmsh3d_face* > fmap = mesh->facemap();
44   std::map<int, bmsh3d_face* >::iterator face_it;
45   for (face_it = fmap.begin(); face_it != fmap.end(); face_it++) {
46 
47     auto* face = (bmsh3d_face_mc*) face_it->second;
48     face->_sort_HEs_circular();
49     face->_ifs_clear_vertices ();
50 
51     bmsh3d_textured_face_mc* f = this->_new_face();
52     bmsh3d_halfedge* he = face->halfedge();
53     bmsh3d_halfedge* HE = he;
54 
55     // clone the half edges
56     do {
57       bmsh3d_edge* edge = HE->edge();
58 #ifdef DEBUG
59       std::cout << edge->id() << std::endl;
60 #endif
61       auto* new_he = new bmsh3d_halfedge(this->edgemap(edge->id()), f);
62       f->connect_E_to_end(new_he->edge());
63       HE = HE->next();
64     }while (HE != he);
65 
66     this->_add_face(f);
67     // clone the inner faces
68     if (face->size() > 0) {
69       std::map<int, bmsh3d_halfedge*> inner_faces = face->get_mc_halfedges();
70       auto it = inner_faces.begin();
71       while (it != inner_faces.end()) {
72         std::vector<bmsh3d_edge*> incident_edges;
73         face->get_mc_incident_edges(it->second, incident_edges);
74         bmsh3d_face* inner_face = copy_inner_face(incident_edges, mesh);
75         f->add_mc_halfedge((bmsh3d_halfedge *)inner_face->halfedge());
76         it++;
77       }
78     }
79   }
80 }
81 
82 
clone() const83 bmsh3d_textured_mesh_mc* bmsh3d_textured_mesh_mc::clone() const
84 {
85   auto* mesh = new bmsh3d_textured_mesh_mc();
86 
87   // deep copy the vertices
88   std::map<int, bmsh3d_vertex* > vertices = this->vertexmap_;
89   auto v_it = vertices.begin();
90   while (v_it != vertices.end()) {
91     auto* vertex = (bmsh3d_vertex*) v_it->second;
92     auto* v = (bmsh3d_vertex*) mesh->_new_vertex();
93     v->set_pt(vertex->get_pt());
94     mesh->_add_vertex(v);
95     v_it++;
96   }
97 
98  // deep copy the edgemap
99   std::map<int, bmsh3d_edge* > edgemap = this->edgemap_;
100   auto edge_it = edgemap.begin();
101   while (edge_it != edgemap.end()) {
102     // create new edges
103     bmsh3d_edge* edge = edge_it->second;
104 #ifdef DEBUG
105     std::cout << "old edge id=" << edge->id() << std::endl;
106 #endif
107     auto* new_edge = // mesh->_new_edge
108       new bmsh3d_edge((bmsh3d_vertex*) mesh->vertexmap(edge->sV()->id()),
109                       (bmsh3d_vertex*) mesh->vertexmap(edge->eV()->id()),
110                       edge_it->first);
111 #if 0
112     std::cout << "  new edge id=" << new_edge->id() << std::endl
113              << " v1=" << ((bmsh3d_vertex*)new_edge->sV())->get_pt()
114              << " v2=" << ((bmsh3d_vertex*)new_edge->eV())->get_pt()
115              << std::endl;
116 #endif // 0
117     mesh->add_edge_incidence (new_edge);
118     edge_it++;
119   }
120 
121   // deep copy the faces
122   std::map<int, bmsh3d_face* > fmap = this->facemap_;
123   auto face_it = fmap.begin();
124   while (face_it != fmap.end()) {
125     auto* face = (bmsh3d_textured_face_mc*) face_it->second;
126 #ifdef DEBUG
127     std::cout << "old face id=" << face->id() << std::endl;
128 #endif
129     face->_sort_HEs_circular();
130     face->_ifs_clear_vertices ();
131     bmsh3d_textured_face_mc* f = mesh->_new_face();
132     bmsh3d_halfedge* he = face->halfedge();
133     bmsh3d_halfedge* HE = he;
134 
135     // copy the texture coordinates
136 
137     f->tex_coords().insert(face->tex_coords().begin(), face->tex_coords().end());
138 
139     // clone the half edges
140     do {
141       bmsh3d_edge* edge = HE->edge();
142 #ifdef DEBUG
143       std::cout << edge->id() << std::endl;
144 #endif
145       auto* new_he = new bmsh3d_halfedge(mesh->edgemap(edge->id()), f);
146       f->connect_E_to_end(new_he->edge());
147       HE = HE->next();
148     }while (HE != he);
149 
150     mesh->_add_face(f);
151     // clone the inner faces
152     if (face->size() > 0) {
153       std::map<int, bmsh3d_halfedge*> inner_faces = face->get_mc_halfedges();
154       auto it = inner_faces.begin();
155       while (it != inner_faces.end()) {
156         std::vector<bmsh3d_edge*> incident_edges;
157         face->get_mc_incident_edges(it->second, incident_edges);
158         bmsh3d_face* inner_face = copy_inner_face(incident_edges, mesh);
159         f->add_mc_halfedge((bmsh3d_halfedge *)inner_face->halfedge());
160         it++;
161       }
162     }
163     face_it++;
164   }
165   return mesh;
166 }
167