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