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-10 19:30:54 +0300
committerbubnikv <bubnikv@gmail.com>2019-06-10 19:30:54 +0300
commit6defabea537ba871070fc405a14c2173cb92fc89 (patch)
treed1df60d45ebeb9068d9e322ca103ea3b32f8c4be /src/admesh
parent65238a89b10fb18e7f9b647f5026da9276d32d58 (diff)
admesh refactoring: separation of the shared vertices / indices
into an indexed_triangle_set structure
Diffstat (limited to 'src/admesh')
-rw-r--r--src/admesh/shared.cpp111
-rw-r--r--src/admesh/stl.h26
-rw-r--r--src/admesh/stlinit.cpp2
-rw-r--r--src/admesh/util.cpp50
4 files changed, 94 insertions, 95 deletions
diff --git a/src/admesh/shared.cpp b/src/admesh/shared.cpp
index e9f075498..7da2841b0 100644
--- a/src/admesh/shared.cpp
+++ b/src/admesh/shared.cpp
@@ -29,19 +29,13 @@
#include "stl.h"
-void stl_invalidate_shared_vertices(stl_file *stl)
-{
- stl->v_indices.clear();
- stl->v_shared.clear();
-}
-
-void stl_generate_shared_vertices(stl_file *stl)
+void stl_generate_shared_vertices(stl_file *stl, indexed_triangle_set &its)
{
// 3 indices to vertex per face
- stl->v_indices.assign(stl->stats.number_of_facets, v_indices_struct());
+ its.indices.assign(stl->stats.number_of_facets, v_indices_struct());
// Shared vertices (3D coordinates)
- stl->v_shared.clear();
- stl->v_shared.reserve(stl->stats.number_of_facets / 2);
+ its.vertices.clear();
+ its.vertices.reserve(stl->stats.number_of_facets / 2);
// A degenerate mesh may contain loops: Traversing a fan will end up in an endless loop
// while never reaching the starting face. To avoid these endless loops, traversed faces at each fan traversal
@@ -51,11 +45,11 @@ void stl_generate_shared_vertices(stl_file *stl)
for (uint32_t facet_idx = 0; facet_idx < stl->stats.number_of_facets; ++ facet_idx) {
for (int j = 0; j < 3; ++ j) {
- if (stl->v_indices[facet_idx].vertex[j] != -1)
+ if (its.indices[facet_idx].vertex[j] != -1)
// Shared vertex was already assigned.
continue;
// Create a new shared vertex.
- stl->v_shared.emplace_back(stl->facet_start[facet_idx].vertex[j]);
+ its.vertices.emplace_back(stl->facet_start[facet_idx].vertex[j]);
// Traverse the fan around the j-th vertex of the i-th face, assign the newly created shared vertex index to all the neighboring triangles in the triangle fan.
int facet_in_fan_idx = facet_idx;
bool edge_direction = false;
@@ -89,7 +83,7 @@ void stl_generate_shared_vertices(stl_file *stl)
next_edge = pivot_vertex;
}
}
- stl->v_indices[facet_in_fan_idx].vertex[pivot_vertex] = stl->v_shared.size() - 1;
+ its.indices[facet_in_fan_idx].vertex[pivot_vertex] = its.vertices.size() - 1;
fan_traversal_facet_visited[facet_in_fan_idx] = fan_traversal_stamp;
// next_edge is an index of the starting vertex of the edge, not an index of the opposite vertex to the edge!
@@ -130,7 +124,7 @@ void stl_generate_shared_vertices(stl_file *stl)
}
}
-bool stl_write_off(stl_file *stl, const char *file)
+bool its_write_off(const indexed_triangle_set &its, const char *file)
{
/* Open the file */
FILE *fp = boost::nowide::fopen(file, "w");
@@ -143,16 +137,16 @@ bool stl_write_off(stl_file *stl, const char *file)
}
fprintf(fp, "OFF\n");
- fprintf(fp, "%d %d 0\n", stl->v_shared.size(), stl->stats.number_of_facets);
- for (int i = 0; i < stl->v_shared.size(); ++ i)
- fprintf(fp, "\t%f %f %f\n", stl->v_shared[i](0), stl->v_shared[i](1), stl->v_shared[i](2));
- for (uint32_t i = 0; i < stl->stats.number_of_facets; ++ i)
- fprintf(fp, "\t3 %d %d %d\n", stl->v_indices[i].vertex[0], stl->v_indices[i].vertex[1], stl->v_indices[i].vertex[2]);
+ fprintf(fp, "%d %d 0\n", (int)its.vertices.size(), (int)its.indices.size());
+ for (int i = 0; i < its.vertices.size(); ++ i)
+ fprintf(fp, "\t%f %f %f\n", its.vertices[i](0), its.vertices[i](1), its.vertices[i](2));
+ for (uint32_t i = 0; i < its.indices.size(); ++ i)
+ fprintf(fp, "\t3 %d %d %d\n", its.indices[i].vertex[0], its.indices[i].vertex[1], its.indices[i].vertex[2]);
fclose(fp);
return true;
}
-bool stl_write_vrml(stl_file *stl, const char *file)
+bool its_write_vrml(const indexed_triangle_set &its, const char *file)
{
/* Open the file */
FILE *fp = boost::nowide::fopen(file, "w");
@@ -180,16 +174,16 @@ bool stl_write_vrml(stl_file *stl, const char *file)
fprintf(fp, "\t\t\tpoint [\n");
int i = 0;
- for (; i + 1 < stl->v_shared.size(); ++ i)
- fprintf(fp, "\t\t\t\t%f %f %f,\n", stl->v_shared[i](0), stl->v_shared[i](1), stl->v_shared[i](2));
- fprintf(fp, "\t\t\t\t%f %f %f]\n", stl->v_shared[i](0), stl->v_shared[i](1), stl->v_shared[i](2));
+ for (; i + 1 < its.vertices.size(); ++ i)
+ fprintf(fp, "\t\t\t\t%f %f %f,\n", its.vertices[i](0), its.vertices[i](1), its.vertices[i](2));
+ fprintf(fp, "\t\t\t\t%f %f %f]\n", its.vertices[i](0), its.vertices[i](1), its.vertices[i](2));
fprintf(fp, "\t\t}\n");
fprintf(fp, "\t\tDEF STLTriangles IndexedFaceSet {\n");
fprintf(fp, "\t\t\tcoordIndex [\n");
- for (int i = 0; i + 1 < (int)stl->stats.number_of_facets; ++ i)
- fprintf(fp, "\t\t\t\t%d, %d, %d, -1,\n", stl->v_indices[i].vertex[0], stl->v_indices[i].vertex[1], stl->v_indices[i].vertex[2]);
- fprintf(fp, "\t\t\t\t%d, %d, %d, -1]\n", stl->v_indices[i].vertex[0], stl->v_indices[i].vertex[1], stl->v_indices[i].vertex[2]);
+ for (size_t i = 0; i + 1 < its.indices.size(); ++ i)
+ fprintf(fp, "\t\t\t\t%d, %d, %d, -1,\n", its.indices[i].vertex[0], its.indices[i].vertex[1], its.indices[i].vertex[2]);
+ fprintf(fp, "\t\t\t\t%d, %d, %d, -1]\n", its.indices[i].vertex[0], its.indices[i].vertex[1], its.indices[i].vertex[2]);
fprintf(fp, "\t\t}\n");
fprintf(fp, "\t}\n");
fprintf(fp, "}\n");
@@ -197,7 +191,7 @@ bool stl_write_vrml(stl_file *stl, const char *file)
return true;
}
-bool stl_write_obj(stl_file *stl, const char *file)
+bool its_write_obj(const indexed_triangle_set &its, const char *file)
{
FILE *fp = boost::nowide::fopen(file, "w");
@@ -209,10 +203,65 @@ bool stl_write_obj(stl_file *stl, const char *file)
return false;
}
- for (size_t i = 0; i < stl->v_shared.size(); ++ i)
- fprintf(fp, "v %f %f %f\n", stl->v_shared[i](0), stl->v_shared[i](1), stl->v_shared[i](2));
- for (uint32_t i = 0; i < stl->stats.number_of_facets; ++ i)
- fprintf(fp, "f %d %d %d\n", stl->v_indices[i].vertex[0]+1, stl->v_indices[i].vertex[1]+1, stl->v_indices[i].vertex[2]+1);
+ for (size_t i = 0; i < its.vertices.size(); ++ i)
+ fprintf(fp, "v %f %f %f\n", its.vertices[i](0), its.vertices[i](1), its.vertices[i](2));
+ for (size_t i = 0; i < its.indices.size(); ++ i)
+ fprintf(fp, "f %d %d %d\n", its.indices[i].vertex[0]+1, its.indices[i].vertex[1]+1, its.indices[i].vertex[2]+1);
fclose(fp);
return true;
}
+
+
+// Check validity of the mesh, assert on error.
+bool stl_validate(const stl_file *stl, const indexed_triangle_set &its)
+{
+ assert(! stl->facet_start.empty());
+ assert(stl->facet_start.size() == stl->stats.number_of_facets);
+ assert(stl->neighbors_start.size() == stl->stats.number_of_facets);
+ assert(stl->facet_start.size() == stl->neighbors_start.size());
+ assert(! stl->neighbors_start.empty());
+ assert((its.indices.empty()) == (its.vertices.empty()));
+ assert(stl->stats.number_of_facets > 0);
+ assert(its.vertices.empty() || its.indices.size() == stl->stats.number_of_facets);
+
+#ifdef _DEBUG
+ // Verify validity of neighborship data.
+ for (int facet_idx = 0; facet_idx < (int)stl->stats.number_of_facets; ++ facet_idx) {
+ const stl_neighbors &nbr = stl->neighbors_start[facet_idx];
+ const int *vertices = (its.indices.empty()) ? nullptr : its.indices[facet_idx].vertex;
+ for (int nbr_idx = 0; nbr_idx < 3; ++ nbr_idx) {
+ int nbr_face = stl->neighbors_start[facet_idx].neighbor[nbr_idx];
+ assert(nbr_face < (int)stl->stats.number_of_facets);
+ if (nbr_face != -1) {
+ int nbr_vnot = nbr.which_vertex_not[nbr_idx];
+ assert(nbr_vnot >= 0 && nbr_vnot < 6);
+ // Neighbor of the neighbor is the original face.
+ assert(stl->neighbors_start[nbr_face].neighbor[(nbr_vnot + 1) % 3] == facet_idx);
+ int vnot_back = stl->neighbors_start[nbr_face].which_vertex_not[(nbr_vnot + 1) % 3];
+ assert(vnot_back >= 0 && vnot_back < 6);
+ assert((nbr_vnot < 3) == (vnot_back < 3));
+ assert(vnot_back % 3 == (nbr_idx + 2) % 3);
+ if (vertices != nullptr) {
+ // Has shared vertices.
+ if (nbr_vnot < 3) {
+ // Faces facet_idx and nbr_face share two vertices accross the common edge. Faces are correctly oriented.
+ assert((its.indices[nbr_face].vertex[(nbr_vnot + 1) % 3] == vertices[(nbr_idx + 1) % 3] && its.indices[nbr_face].vertex[(nbr_vnot + 2) % 3] == vertices[nbr_idx]));
+ } else {
+ // Faces facet_idx and nbr_face share two vertices accross the common edge. Faces are incorrectly oriented, one of them is flipped.
+ assert((its.indices[nbr_face].vertex[(nbr_vnot + 2) % 3] == vertices[(nbr_idx + 1) % 3] && its.indices[nbr_face].vertex[(nbr_vnot + 1) % 3] == vertices[nbr_idx]));
+ }
+ }
+ }
+ }
+ }
+#endif /* _DEBUG */
+
+ return true;
+}
+
+// Check validity of the mesh, assert on error.
+bool stl_validate(const stl_file *stl)
+{
+ indexed_triangle_set its;
+ return stl_validate(stl, its);
+}
diff --git a/src/admesh/stl.h b/src/admesh/stl.h
index 4aee6048f..bb5d25296 100644
--- a/src/admesh/stl.h
+++ b/src/admesh/stl.h
@@ -130,21 +130,22 @@ struct stl_stats {
struct stl_file {
std::vector<stl_facet> facet_start;
std::vector<stl_neighbors> neighbors_start;
- // Indexed face set
- std::vector<v_indices_struct> v_indices;
- std::vector<stl_vertex> v_shared;
// Statistics
stl_stats stats;
};
+struct indexed_triangle_set
+{
+ void clear() { indices.clear(); vertices.clear(); }
+ std::vector<v_indices_struct> indices;
+ std::vector<stl_vertex> vertices;
+};
+
extern bool stl_open(stl_file *stl, const char *file);
extern void stl_stats_out(stl_file *stl, FILE *file, char *input_file);
extern bool stl_print_neighbors(stl_file *stl, char *file);
-extern void stl_put_little_int(FILE *fp, int value_in);
-extern void stl_put_little_float(FILE *fp, float value_in);
extern bool stl_write_ascii(stl_file *stl, const char *file, const char *label);
extern bool stl_write_binary(stl_file *stl, const char *file, const char *label);
-extern void stl_write_binary_block(stl_file *stl, FILE *fp);
extern void stl_check_facets_exact(stl_file *stl);
extern void stl_check_facets_nearby(stl_file *stl, float tolerance);
extern void stl_remove_unconnected_facets(stl_file *stl);
@@ -219,12 +220,12 @@ inline void stl_transform(stl_file *stl, const Eigen::Matrix<T, 3, 3, Eigen::Don
stl_get_size(stl);
}
-extern void stl_invalidate_shared_vertices(stl_file *stl);
-extern void stl_generate_shared_vertices(stl_file *stl);
-extern bool stl_write_obj(stl_file *stl, const char *file);
-extern bool stl_write_off(stl_file *stl, const char *file);
+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);
+extern bool its_write_vrml(const indexed_triangle_set &its, const char *file);
+
extern bool stl_write_dxf(stl_file *stl, const char *file, char *label);
-extern bool stl_write_vrml(stl_file *stl, const char *file);
inline void stl_calculate_normal(stl_normal &normal, stl_facet *facet) {
normal = (facet->vertex[1] - facet->vertex[0]).cross(facet->vertex[2] - facet->vertex[0]);
}
@@ -251,6 +252,7 @@ extern void stl_reallocate(stl_file *stl);
extern void stl_add_facet(stl_file *stl, const stl_facet *new_facet);
// Validate the mesh, assert on error.
-extern bool stl_validate(stl_file *stl);
+extern bool stl_validate(const stl_file *stl);
+extern bool stl_validate(const stl_file *stl, const indexed_triangle_set &its);
#endif
diff --git a/src/admesh/stlinit.cpp b/src/admesh/stlinit.cpp
index 088842d51..44477511f 100644
--- a/src/admesh/stlinit.cpp
+++ b/src/admesh/stlinit.cpp
@@ -253,8 +253,6 @@ void stl_reset(stl_file *stl)
{
stl->facet_start.clear();
stl->neighbors_start.clear();
- stl->v_indices.clear();
- stl->v_shared.clear();
memset(&stl->stats, 0, sizeof(stl_stats));
stl->stats.volume = -1.0;
}
diff --git a/src/admesh/util.cpp b/src/admesh/util.cpp
index 685b641b4..f4e4dbf0a 100644
--- a/src/admesh/util.cpp
+++ b/src/admesh/util.cpp
@@ -73,7 +73,6 @@ void stl_translate(stl_file *stl, float x, float y, float z)
stl->facet_start[i].vertex[j] += shift;
stl->stats.min = new_min;
stl->stats.max += shift;
- stl_invalidate_shared_vertices(stl);
}
/* Translates the stl by x,y,z, relatively from wherever it is currently */
@@ -85,7 +84,6 @@ void stl_translate_relative(stl_file *stl, float x, float y, float z)
stl->facet_start[i].vertex[j] += shift;
stl->stats.min += shift;
stl->stats.max += shift;
- stl_invalidate_shared_vertices(stl);
}
void stl_scale_versor(stl_file *stl, const stl_vertex &versor)
@@ -103,7 +101,6 @@ void stl_scale_versor(stl_file *stl, const stl_vertex &versor)
for (int i = 0; i < stl->stats.number_of_facets; ++ i)
for (int j = 0; j < 3; ++ j)
stl->facet_start[i].vertex[j].array() *= s;
- stl_invalidate_shared_vertices(stl);
}
static void calculate_normals(stl_file *stl)
@@ -414,50 +411,3 @@ All facets connected. No further nearby check necessary.\n");
stl_verify_neighbors(stl);
}
}
-
-// Check validity of the mesh, assert on error.
-bool stl_validate(stl_file *stl)
-{
- assert(! stl->facet_start.empty());
- assert(stl->facet_start.size() == stl->stats.number_of_facets);
- assert(stl->neighbors_start.size() == stl->stats.number_of_facets);
- assert(stl->facet_start.size() == stl->neighbors_start.size());
- assert(! stl->neighbors_start.empty());
- assert((stl->v_indices.empty()) == (stl->v_shared.empty()));
- assert(stl->stats.number_of_facets > 0);
- assert(stl->v_shared.empty() || stl->v_indices.size() == stl->stats.number_of_facets);
-
-#ifdef _DEBUG
- // Verify validity of neighborship data.
- for (int facet_idx = 0; facet_idx < (int)stl->stats.number_of_facets; ++ facet_idx) {
- const stl_neighbors &nbr = stl->neighbors_start[facet_idx];
- const int *vertices = (stl->v_indices.empty()) ? nullptr : stl->v_indices[facet_idx].vertex;
- for (int nbr_idx = 0; nbr_idx < 3; ++ nbr_idx) {
- int nbr_face = stl->neighbors_start[facet_idx].neighbor[nbr_idx];
- assert(nbr_face < (int)stl->stats.number_of_facets);
- if (nbr_face != -1) {
- int nbr_vnot = nbr.which_vertex_not[nbr_idx];
- assert(nbr_vnot >= 0 && nbr_vnot < 6);
- // Neighbor of the neighbor is the original face.
- assert(stl->neighbors_start[nbr_face].neighbor[(nbr_vnot + 1) % 3] == facet_idx);
- int vnot_back = stl->neighbors_start[nbr_face].which_vertex_not[(nbr_vnot + 1) % 3];
- assert(vnot_back >= 0 && vnot_back < 6);
- assert((nbr_vnot < 3) == (vnot_back < 3));
- assert(vnot_back % 3 == (nbr_idx + 2) % 3);
- if (vertices != nullptr) {
- // Has shared vertices.
- if (nbr_vnot < 3) {
- // Faces facet_idx and nbr_face share two vertices accross the common edge. Faces are correctly oriented.
- assert((stl->v_indices[nbr_face].vertex[(nbr_vnot + 1) % 3] == vertices[(nbr_idx + 1) % 3] && stl->v_indices[nbr_face].vertex[(nbr_vnot + 2) % 3] == vertices[nbr_idx]));
- } else {
- // Faces facet_idx and nbr_face share two vertices accross the common edge. Faces are incorrectly oriented, one of them is flipped.
- assert((stl->v_indices[nbr_face].vertex[(nbr_vnot + 2) % 3] == vertices[(nbr_idx + 1) % 3] && stl->v_indices[nbr_face].vertex[(nbr_vnot + 1) % 3] == vertices[nbr_idx]));
- }
- }
- }
- }
- }
-#endif /* _DEBUG */
-
- return true;
-}