3434
3535#include < igl/facet_components.h>
3636#include < igl/boundary_facets.h>
37+ #include < igl/remove_unreferenced.h>
3738#include < igl/unique.h>
3839#include < igl/per_vertex_normals.h>
3940
@@ -52,11 +53,12 @@ void remove_unreferenced(
5253 std::vector<int >& new_to_old_map)
5354{
5455 int num_faces = F.rows ();
56+ int cols = F.cols ();
5557
5658 // Iterate over faces to find all referenced vertices in sorted order
5759 std::vector<int > referenced_vertices;
5860 for (int fi = 0 ; fi < num_faces; ++fi) {
59- for (int j = 0 ; j < 3 ; ++j) {
61+ for (int j = 0 ; j < cols ; ++j) {
6062 int vk = F (fi, j);
6163 referenced_vertices.push_back (vk);
6264 }
@@ -78,9 +80,9 @@ void remove_unreferenced(
7880 }
7981
8082 // Reindex the vertices in the face list
81- FN.resize (num_faces, 3 );
83+ FN.resize (num_faces, cols );
8284 for (int fi = 0 ; fi < num_faces; ++fi) {
83- for (int j = 0 ; j < 3 ; ++j) {
85+ for (int j = 0 ; j < cols ; ++j) {
8486 int vk = F (fi, j);
8587 int k = old_to_new_map[vk];
8688 FN (fi, j) = k;
@@ -115,6 +117,40 @@ void cut_mesh_along_parametrization_seams(
115117 }
116118}
117119
120+ std::tuple<Eigen::MatrixXd, Eigen::MatrixXi> generate_seams (
121+ const Eigen::MatrixXd& V,
122+ const Eigen::MatrixXi& F,
123+ const Eigen::MatrixXi& FT)
124+ {
125+ // get boundary edges of the uv map
126+ Eigen::MatrixXi uv_edges;
127+ Eigen::VectorXi J, K;
128+ igl::boundary_facets (FT, uv_edges, J, K);
129+
130+ // get 3D vertices on seam
131+ int num_seam_edges = J.size ();
132+ Eigen::MatrixXi edges (num_seam_edges, 2 );
133+ for (int i = 0 ; i < num_seam_edges; ++i)
134+ {
135+ edges (i, 0 ) = F (J[i], (K[i] + 1 )%3 );
136+ edges (i, 1 ) = F (J[i], (K[i] + 2 )%3 );
137+ }
138+
139+ // reindex to remove redundant
140+ Eigen::MatrixXi seam_edges;
141+ std::vector<int > new_to_old_map;
142+ remove_unreferenced (edges, seam_edges, new_to_old_map);
143+
144+ // get new vertices
145+ int num_seam_vertices = new_to_old_map.size ();
146+ Eigen::MatrixXd seam_vertices (num_seam_vertices, 3 );
147+ for (int i = 0 ; i < num_seam_vertices; ++i) {
148+ seam_vertices.row (i) = V.row (new_to_old_map[i]);
149+ }
150+
151+ return std::make_tuple (seam_vertices, seam_edges);
152+ }
153+
118154std::vector<int > find_boundary_vertices (const Eigen::MatrixXi& F)
119155{
120156 // Get the boundary edges
0 commit comments