[Bf-blender-cvs] [532fd9b9ede] quadriflow: Make quadriflow sharp feature less crash prone
Sebastian Parborg
noreply at git.blender.org
Tue Sep 10 18:36:08 CEST 2019
Commit: 532fd9b9ede1968b218f4fa79d14e7827ccb84b5
Author: Sebastian Parborg
Date: Wed Sep 4 15:40:32 2019 +0200
Branches: quadriflow
https://developer.blender.org/rB532fd9b9ede1968b218f4fa79d14e7827ccb84b5
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