From 025f86ca3f14e35d617ddb6c76dc5d463d5bf11e Mon Sep 17 00:00:00 2001
From: bubnikv <bubnikv@gmail.com>
Date: Mon, 10 Jun 2019 11:04:09 +0200
Subject: [PATCH] Fix of the previous refactoring.

---
 src/admesh/connect.cpp         |  8 +++++---
 src/admesh/shared.cpp          |  3 ++-
 src/admesh/util.cpp            |  5 +++++
 src/libslic3r/TriangleMesh.cpp | 35 +++++++++++++++-------------------
 4 files changed, 27 insertions(+), 24 deletions(-)

diff --git a/src/admesh/connect.cpp b/src/admesh/connect.cpp
index b99f93f3d..d35c48aba 100644
--- a/src/admesh/connect.cpp
+++ b/src/admesh/connect.cpp
@@ -837,10 +837,12 @@ void stl_add_facet(stl_file *stl, const stl_facet *new_facet)
 {
 	if (stl->error)
 		return;
-  	++ stl->stats.facets_added;
-  	++ stl->stats.number_of_facets;
-  	stl->facet_start.emplace_back(*new_facet);
+	assert(stl->facet_start.size() == stl->stats.number_of_facets);
+	assert(stl->neighbors_start.size() == stl->stats.number_of_facets);
+	stl->facet_start.emplace_back(*new_facet);
   	// note that the normal vector is not set here, just initialized to 0.
   	stl->facet_start[stl->stats.number_of_facets].normal = stl_normal::Zero();
   	stl->neighbors_start.emplace_back();
+	++ stl->stats.facets_added;
+	++ stl->stats.number_of_facets;
 }
diff --git a/src/admesh/shared.cpp b/src/admesh/shared.cpp
index 8162c6a8d..bc264ee96 100644
--- a/src/admesh/shared.cpp
+++ b/src/admesh/shared.cpp
@@ -33,6 +33,7 @@ void stl_invalidate_shared_vertices(stl_file *stl)
 {
   	stl->v_indices.clear();
   	stl->v_shared.clear();
+  	stl->stats.shared_vertices = 0;
 }
 
 void stl_generate_shared_vertices(stl_file *stl)
@@ -46,7 +47,7 @@ void stl_generate_shared_vertices(stl_file *stl)
 	// 3 indices to vertex per face
 	stl->v_indices.assign(stl->stats.number_of_facets, v_indices_struct());
 	// Shared vertices (3D coordinates)
-	stl->v_shared.assign(stl->stats.number_of_facets / 2, stl_vertex());
+	stl->v_shared.reserve(stl->stats.number_of_facets / 2);
 	stl->stats.shared_vertices = 0;
 
 	// A degenerate mesh may contain loops: Traversing a fan will end up in an endless loop
diff --git a/src/admesh/util.cpp b/src/admesh/util.cpp
index 61e0d11e7..d8640e575 100644
--- a/src/admesh/util.cpp
+++ b/src/admesh/util.cpp
@@ -456,11 +456,16 @@ bool stl_validate(stl_file *stl)
 	assert(! stl->error);
 	assert(stl->fp == nullptr);
 	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->heads.empty());
 	assert(stl->tail  == nullptr);
 	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.size() == stl->stats.shared_vertices);
+	assert(stl->v_shared.empty() || stl->v_indices.size() == stl->stats.number_of_facets);
 
 #ifdef _DEBUG
     // Verify validity of neighborship data.
diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp
index a974f5af3..ad12047d2 100644
--- a/src/libslic3r/TriangleMesh.cpp
+++ b/src/libslic3r/TriangleMesh.cpp
@@ -47,7 +47,6 @@ TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector<Vec3crd>& f
 {
     stl_initialize(&this->stl);
     stl_file &stl = this->stl;
-    stl.error = 0;
     stl.stats.type = inmemory;
 
     // count facets and allocate memory
@@ -55,7 +54,7 @@ TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector<Vec3crd>& f
     stl.stats.original_num_facets = stl.stats.number_of_facets;
     stl_allocate(&stl);
 
-    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_facet facet;
         facet.vertex[0] = points[facets[i](0)].cast<float>();
         facet.vertex[1] = points[facets[i](1)].cast<float>();
@@ -76,16 +75,8 @@ TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector<Vec3crd>& f
 TriangleMesh& TriangleMesh::operator=(const TriangleMesh &other)
 {
     stl_close(&this->stl);
-    this->stl       = other.stl;
-    this->repaired  = other.repaired;
-	this->stl.heads.clear();
-    this->stl.tail  = nullptr;
-    this->stl.error = other.stl.error;
-    this->stl.facet_start = other.stl.facet_start;
-    this->stl.neighbors_start = other.stl.neighbors_start;
-    this->stl.v_indices = other.stl.v_indices;
-	this->stl.v_shared = other.stl.v_shared;
-	this->stl.stats = other.stl.stats;
+    this->stl = other.stl;
+	this->repaired = other.repaired;
     return *this;
 }
 
@@ -1711,10 +1702,12 @@ void TriangleMeshSlicer::cut(float z, TriangleMesh* upper, TriangleMesh* lower)
         
         if (min_z > z || (min_z == z && max_z > z)) {
             // facet is above the cut plane and does not belong to it
-            if (upper != NULL) stl_add_facet(&upper->stl, facet);
+            if (upper != nullptr)
+				stl_add_facet(&upper->stl, facet);
         } else if (max_z < z || (max_z == z && min_z < z)) {
             // facet is below the cut plane and does not belong to it
-            if (lower != NULL) stl_add_facet(&lower->stl, facet);
+            if (lower != nullptr)
+				stl_add_facet(&lower->stl, facet);
         } else if (min_z < z && max_z > z) {
             // Facet is cut by the slicing plane.
 
@@ -1761,22 +1754,24 @@ void TriangleMeshSlicer::cut(float z, TriangleMesh* upper, TriangleMesh* lower)
             quadrilateral[1].vertex[2] = v0v1;
             
             if (v0(2) > z) {
-                if (upper != NULL) stl_add_facet(&upper->stl, &triangle);
-                if (lower != NULL) {
+                if (upper != nullptr) 
+					stl_add_facet(&upper->stl, &triangle);
+                if (lower != nullptr) {
                     stl_add_facet(&lower->stl, &quadrilateral[0]);
                     stl_add_facet(&lower->stl, &quadrilateral[1]);
                 }
             } else {
-                if (upper != NULL) {
+                if (upper != nullptr) {
                     stl_add_facet(&upper->stl, &quadrilateral[0]);
                     stl_add_facet(&upper->stl, &quadrilateral[1]);
                 }
-                if (lower != NULL) stl_add_facet(&lower->stl, &triangle);
+                if (lower != nullptr) 
+					stl_add_facet(&lower->stl, &triangle);
             }
         }
     }
     
-    if (upper != NULL) {
+    if (upper != nullptr) {
         BOOST_LOG_TRIVIAL(trace) << "TriangleMeshSlicer::cut - triangulating upper part";
         ExPolygons section;
         this->make_expolygons_simple(upper_lines, &section);
@@ -1790,7 +1785,7 @@ void TriangleMeshSlicer::cut(float z, TriangleMesh* upper, TriangleMesh* lower)
         }
     }
     
-    if (lower != NULL) {
+    if (lower != nullptr) {
         BOOST_LOG_TRIVIAL(trace) << "TriangleMeshSlicer::cut - triangulating lower part";
         ExPolygons section;
         this->make_expolygons_simple(lower_lines, &section);