diff options
author | bubnikv <bubnikv@gmail.com> | 2019-06-11 18:08:47 +0300 |
---|---|---|
committer | bubnikv <bubnikv@gmail.com> | 2019-06-11 18:08:47 +0300 |
commit | 0bb8ee149e8702fb644a70ab1f3924ff8e6f3d71 (patch) | |
tree | c10f7eb2a17a6dad421b739182caae97ce9003d0 /src/admesh | |
parent | 5fc465b7e8e5398771e4b6db6043bc84770e5923 (diff) |
Sharing TriangleMesh objects between the front end (UI) and back end
(background processing)
Diffstat (limited to 'src/admesh')
-rw-r--r-- | src/admesh/connect.cpp | 46 | ||||
-rw-r--r-- | src/admesh/stl.h | 38 | ||||
-rw-r--r-- | src/admesh/stlinit.cpp | 2 | ||||
-rw-r--r-- | src/admesh/util.cpp | 2 |
4 files changed, 62 insertions, 26 deletions
diff --git a/src/admesh/connect.cpp b/src/admesh/connect.cpp index be782b1b7..1a7b7965d 100644 --- a/src/admesh/connect.cpp +++ b/src/admesh/connect.cpp @@ -59,7 +59,7 @@ struct HashEdge { // Ensure identical vertex ordering of equal edges. // This method is numerically robust. - if (stl_vertex_lower(*a, *b)) { + if (vertex_lower(*a, *b)) { } else { // This edge is loaded backwards. std::swap(a, b); @@ -110,6 +110,12 @@ struct HashEdge { } return true; } + +private: + inline bool vertex_lower(const stl_vertex &a, const stl_vertex &b) { + return (a(0) != b(0)) ? (a(0) < b(0)) : + ((a(1) != b(1)) ? (a(1) < b(1)) : (a(2) < b(2))); + } }; struct HashTableEdges { @@ -440,7 +446,9 @@ void stl_check_facets_exact(stl_file *stl) stl_facet &facet = stl->facet_start[i]; if (facet.vertex[0] == facet.vertex[1] || facet.vertex[1] == facet.vertex[2] || facet.vertex[0] == facet.vertex[2]) { // Remove the degenerate facet. - facet = stl->facet_start[--stl->stats.number_of_facets]; + facet = stl->facet_start[-- stl->stats.number_of_facets]; + stl->facet_start.pop_back(); + stl->neighbors_start.pop_back(); stl->stats.facets_removed += 1; stl->stats.degenerate_facets += 1; } else @@ -526,23 +534,25 @@ void stl_remove_unconnected_facets(stl_file *stl) assert(false); } - if (facet_number == -- stl->stats.number_of_facets) - // Removing the last face is easy, just forget the last face. - return; - - // Copy the face and neighborship from the last face to facet_number. - stl->facet_start[facet_number] = stl->facet_start[stl->stats.number_of_facets]; - neighbors = stl->neighbors_start[stl->stats.number_of_facets]; - // Update neighborship of faces, which used to point to the last face, now moved to facet_number. - for (int i = 0; i < 3; ++ i) - if (neighbors.neighbor[i] != -1) { - int &other_face_idx = stl->neighbors_start[neighbors.neighbor[i]].neighbor[(neighbors.which_vertex_not[i] + 1) % 3]; - if (other_face_idx != stl->stats.number_of_facets) { - BOOST_LOG_TRIVIAL(info) << "in remove_facet: neighbor = " << other_face_idx << " numfacets = " << stl->stats.number_of_facets << " this is wrong"; - return; + if (facet_number < -- stl->stats.number_of_facets) { + // Removing a face, which was not the last one. + // Copy the face and neighborship from the last face to facet_number. + stl->facet_start[facet_number] = stl->facet_start[stl->stats.number_of_facets]; + neighbors = stl->neighbors_start[stl->stats.number_of_facets]; + // Update neighborship of faces, which used to point to the last face, now moved to facet_number. + for (int i = 0; i < 3; ++ i) + if (neighbors.neighbor[i] != -1) { + int &other_face_idx = stl->neighbors_start[neighbors.neighbor[i]].neighbor[(neighbors.which_vertex_not[i] + 1) % 3]; + if (other_face_idx != stl->stats.number_of_facets) { + BOOST_LOG_TRIVIAL(info) << "in remove_facet: neighbor = " << other_face_idx << " numfacets = " << stl->stats.number_of_facets << " this is wrong"; + return; + } + other_face_idx = facet_number; } - other_face_idx = facet_number; - } + } + + stl->facet_start.pop_back(); + stl->neighbors_start.pop_back(); }; auto remove_degenerate = [stl, remove_facet](int facet) diff --git a/src/admesh/stl.h b/src/admesh/stl.h index fce23eb3f..c419c567b 100644 --- a/src/admesh/stl.h +++ b/src/admesh/stl.h @@ -128,6 +128,8 @@ struct indexed_triangle_set void clear() { indices.clear(); vertices.clear(); } std::vector<stl_triangle_vertex_indices> indices; std::vector<stl_vertex> vertices; + //FIXME add normals once we get rid of the stl_file from TriangleMesh completely. + //std::vector<stl_normal> normals }; extern bool stl_open(stl_file *stl, const char *file); @@ -186,7 +188,7 @@ template<typename T> inline void stl_transform(stl_file *stl, const Eigen::Transform<T, 3, Eigen::Affine, Eigen::DontAlign>& t) { const Eigen::Matrix<double, 3, 3, Eigen::DontAlign> r = t.matrix().template block<3, 3>(0, 0); - for (size_t i = 0; i < stl->stats.number_of_facets; ++i) { + for (size_t i = 0; i < stl->stats.number_of_facets; ++ i) { stl_facet &f = stl->facet_start[i]; for (size_t j = 0; j < 3; ++j) f.vertex[j] = (t * f.vertex[j].template cast<T>()).template cast<float>().eval(); @@ -199,7 +201,7 @@ inline void stl_transform(stl_file *stl, const Eigen::Transform<T, 3, Eigen::Aff template<typename T> inline void stl_transform(stl_file *stl, const Eigen::Matrix<T, 3, 3, Eigen::DontAlign>& m) { - for (size_t i = 0; i < stl->stats.number_of_facets; ++i) { + for (size_t i = 0; i < stl->stats.number_of_facets; ++ i) { stl_facet &f = stl->facet_start[i]; for (size_t j = 0; j < 3; ++j) f.vertex[j] = (m * f.vertex[j].template cast<T>()).template cast<float>().eval(); @@ -209,6 +211,34 @@ inline void stl_transform(stl_file *stl, const Eigen::Matrix<T, 3, 3, Eigen::Don stl_get_size(stl); } + +template<typename T> +extern void its_transform(indexed_triangle_set &its, T *trafo3x4) +{ + for (stl_vertex &v_dst : its.vertices) { + stl_vertex &v_dst = face.vertex[i_vertex]; + stl_vertex v_src = v_dst; + v_dst(0) = T(trafo3x4[0] * v_src(0) + trafo3x4[1] * v_src(1) + trafo3x4[2] * v_src(2) + trafo3x4[3]); + v_dst(1) = T(trafo3x4[4] * v_src(0) + trafo3x4[5] * v_src(1) + trafo3x4[6] * v_src(2) + trafo3x4[7]); + v_dst(2) = T(trafo3x4[8] * v_src(0) + trafo3x4[9] * v_src(1) + trafo3x4[10] * v_src(2) + trafo3x4[11]); + } +} + +template<typename T> +inline void its_transform(indexed_triangle_set &its, const Eigen::Transform<T, 3, Eigen::Affine, Eigen::DontAlign>& t) +{ + const Eigen::Matrix<double, 3, 3, Eigen::DontAlign> r = t.matrix().template block<3, 3>(0, 0); + for (stl_vertex &v : its.vertices) + v = (t * v.template cast<T>()).template cast<float>().eval(); +} + +template<typename T> +inline void its_transform(indexed_triangle_set &its, const Eigen::Matrix<T, 3, 3, Eigen::DontAlign>& m) +{ + for (stl_vertex &v : its.vertices) + v = (m * v.template cast<T>()).template cast<float>().eval(); +} + extern void stl_generate_shared_vertices(stl_file *stl, indexed_triangle_set &its); extern bool its_write_obj(const indexed_triangle_set &its, const char *file); extern bool its_write_off(const indexed_triangle_set &its, const char *file); @@ -225,10 +255,6 @@ inline void stl_normalize_vector(stl_normal &normal) { else normal *= float(1.0 / length); } -inline bool stl_vertex_lower(const stl_vertex &a, const stl_vertex &b) { - return (a(0) != b(0)) ? (a(0) < b(0)) : - ((a(1) != b(1)) ? (a(1) < b(1)) : (a(2) < b(2))); -} extern void stl_calculate_volume(stl_file *stl); extern void stl_repair(stl_file *stl, bool fixall_flag, bool exact_flag, bool tolerance_flag, float tolerance, bool increment_flag, float increment, bool nearby_flag, int iterations, bool remove_unconnected_flag, bool fill_holes_flag, bool normal_directions_flag, bool normal_values_flag, bool reverse_all_flag, bool verbose_flag); diff --git a/src/admesh/stlinit.cpp b/src/admesh/stlinit.cpp index 24fbe9edc..0cc6e50c7 100644 --- a/src/admesh/stlinit.cpp +++ b/src/admesh/stlinit.cpp @@ -147,7 +147,7 @@ static bool stl_read(stl_file *stl, FILE *fp, int first_facet, bool first) rewind(fp); char normal_buf[3][32]; - for (uint32_t i = first_facet; i < stl->stats.number_of_facets; ++i) { + for (uint32_t i = first_facet; i < stl->stats.number_of_facets; ++ i) { stl_facet facet; if (stl->stats.type == binary) { diff --git a/src/admesh/util.cpp b/src/admesh/util.cpp index 6fff8a8ed..70f4ffc27 100644 --- a/src/admesh/util.cpp +++ b/src/admesh/util.cpp @@ -108,7 +108,7 @@ void stl_scale_versor(stl_file *stl, const stl_vertex &versor) static void calculate_normals(stl_file *stl) { stl_normal normal; - for (uint32_t i = 0; i < stl->stats.number_of_facets; i++) { + for (uint32_t i = 0; i < stl->stats.number_of_facets; ++ i) { stl_calculate_normal(normal, &stl->facet_start[i]); stl_normalize_vector(normal); stl->facet_start[i].normal = normal; |