Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbubnikv <bubnikv@gmail.com>2019-06-11 18:08:47 +0300
committerbubnikv <bubnikv@gmail.com>2019-06-11 18:08:47 +0300
commit0bb8ee149e8702fb644a70ab1f3924ff8e6f3d71 (patch)
treec10f7eb2a17a6dad421b739182caae97ce9003d0 /src/admesh
parent5fc465b7e8e5398771e4b6db6043bc84770e5923 (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.cpp46
-rw-r--r--src/admesh/stl.h38
-rw-r--r--src/admesh/stlinit.cpp2
-rw-r--r--src/admesh/util.cpp2
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;