[Bf-blender-cvs] [7239cf328b3] quadriflow: Make quadriflow sharp feature less crash prone

Sebastian Parborg noreply at git.blender.org
Wed Sep 4 18:27:51 CEST 2019


Commit: 7239cf328b34fd20707aabbcb8a38205de642a78
Author: Sebastian Parborg
Date:   Wed Sep 4 15:40:32 2019 +0200
Branches: quadriflow
https://developer.blender.org/rB7239cf328b34fd20707aabbcb8a38205de642a78

Make quadriflow sharp feature less crash prone

===================================================================

M	extern/quadriflow/src/optimizer.cpp
M	extern/quadriflow/src/parametrizer-int.cpp

===================================================================

diff --git a/extern/quadriflow/src/optimizer.cpp b/extern/quadriflow/src/optimizer.cpp
index 47004f01126..1c59ad0f70c 100644
--- a/extern/quadriflow/src/optimizer.cpp
+++ b/extern/quadriflow/src/optimizer.cpp
@@ -871,6 +871,9 @@ void Optimizer::optimize_positions_sharp(
             }
 
             for (int i = 0; i < q.size(); ++i) {
+                if (sharp_to_original_indices[q[i]].size() == 0) {
+                  continue;
+                }
                 o[i] = O.col(sharp_to_original_indices[q[i]][0]);
                 Vector3d qx = Q.col(sharp_to_original_indices[q[i]][0]);
                 Vector3d qy = Vector3d(N.col(sharp_to_original_indices[q[i]][0])).cross(qx);
@@ -1222,6 +1225,8 @@ void Optimizer::optimize_integer_constraints(Hierarchy& mRes, std::map<int, int>
         auto& FQ = mRes.mFQ[level];
         auto& F2E = mRes.mF2E[level];
         auto& E2F = mRes.mE2F[level];
+
+        int iter = 0;
         while (!fullFlow) {
             std::vector<Vector4i> edge_to_constraints(E2F.size() * 2, Vector4i(-1, 0, -1, 0));
             std::vector<int> initial(F2E.size() * 2, 0);
@@ -1322,6 +1327,11 @@ void Optimizer::optimize_integer_constraints(Hierarchy& mRes, std::map<int, int>
             if (flow_count == supply) fullFlow = true;
             if (level != 0 || fullFlow) break;
             edge_capacity += 1;
+            iter++;
+            if (iter == 10) {
+              /* Probably won't converge. */
+              break;
+            }
             lprintf("Not full flow, edge_capacity += 1\n");
         }
 
diff --git a/extern/quadriflow/src/parametrizer-int.cpp b/extern/quadriflow/src/parametrizer-int.cpp
index 467dc637cc5..08fa36c1baa 100644
--- a/extern/quadriflow/src/parametrizer-int.cpp
+++ b/extern/quadriflow/src/parametrizer-int.cpp
@@ -333,19 +333,6 @@ void Parametrizer::BuildIntegerConstraints() {
         for (int j = 0; j < 3; ++j) {
             int orient = face_edgeOrients[i][j];
             diff += rshift90(edge_diff[face_edgeIds[i][j]], orient);
-            if (i == 24231) {
-                for (int k = 0; k < 2; ++k) {
-                    int eid = face_edgeIds[i][j] * 2 + k;
-                    int f1 = edge_to_constraints[eid][0];
-                    int f2 = edge_to_constraints[eid][2];
-                    if (f1 != -1) {
-                        f1 = tree.Index(f1);
-                    }
-                    if (f2 != -1) {
-                        f2 = tree.Index(f2);
-                    }
-                }
-            }
         }
         for (int j = 0; j < 2; ++j) {
             total_flows[tree.Index(i * 2 + j)] += diff[j];
@@ -415,7 +402,7 @@ void Parametrizer::BuildIntegerConstraints() {
             if (ii == 0)
                 max_num = std::min(abs(total_flows[j]) / 2, (int)modified_variables[ii][j].size());
             else
-                max_num = abs(total_flows[j]);
+                max_num = std::min(abs(total_flows[j]), (int)modified_variables[ii][j].size());
             int dir = (total_flows[j] > 0) ? -1 : 1;
             for (int i = 0; i < max_num; ++i) {
                 auto& info = modified_variables[ii][j][i];



More information about the Bf-blender-cvs mailing list