Fix #136593, #136641: Quadriflow remesh gets stuck on Windows

This appears to be a pre-existing issue that got exposed by the refactor
for some files, while for others it was already happening.

Pull Request: https://projects.blender.org/blender/blender/pulls/136680
This commit is contained in:
Brecht Van Lommel
2025-03-28 19:25:56 +01:00
committed by Brecht Van Lommel
parent 448d3d04d9
commit 0fd360428a
3 changed files with 19 additions and 18 deletions

View File

@@ -521,21 +521,18 @@ index a93c58ac2a7..8c682b6d9f2 100644
VectorXi &V2E, VectorXi &E2E, VectorXi &boundary, VectorXi &nonmanifold, VectorXi &V2E, VectorXi &E2E, VectorXi &boundary, VectorXi &nonmanifold,
std::vector<Vector2i> &edge_diff, std::vector<DEdge> &edge_values, std::vector<Vector2i> &edge_diff, std::vector<DEdge> &edge_values,
std::vector<Vector3i> &face_edgeOrients, std::vector<Vector3i> &face_edgeIds, std::vector<Vector3i> &face_edgeOrients, std::vector<Vector3i> &face_edgeIds,
diff --git a/intern/quadriflow/quadriflow_capi.cpp b/intern/quadriflow/quadriflow_capi.cpp diff --git a/extern/quadriflow/src/optimizer.cpp b/extern/quadriflow/src/optimizer.cpp
index fad604f679a..014ac2a5613 100644 index 1c59ad0f70c..f8836ed0d0e 100644
--- a/intern/quadriflow/quadriflow_capi.cpp --- a/extern/quadriflow/src/optimizer.cpp
+++ b/intern/quadriflow/quadriflow_capi.cpp +++ b/extern/quadriflow/src/optimizer.cpp
@@ -190,8 +190,11 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd, @@ -1296,7 +1296,9 @@ void Optimizer::optimize_integer_constraints(Hierarchy& mRes, std::map<int, int>
return; solver = std::make_unique<GurobiFlowHelper>();
} }
#endif
- solver->resize(initial.size() + 2, arc_ids.size());
+ /* This used to be arc_ids.size() which is wrong, the loop below adds
+ * exactly arcs.size() edges. */
+ solver->resize(initial.size() + 2, arcs.size());
- /* Compute the final quad geomtry using a maxflow solver */ std::set<int> ids;
- field.ComputeIndexMap(); for (int i = 0; i < arcs.size(); ++i) {
+ /* Compute the final quad geometry using a maxflow solver */
+ if (!field.ComputeIndexMap()) {
+ /* Error computing the result. */
+ return;
+ }
if (check_if_canceled(0.9f, update_cb, update_cb_data)) {
return;

View File

@@ -49,6 +49,8 @@ class BoykovKolmogorovMaxFlow {
const int target, const int target,
const int capacity) const int capacity)
{ {
assert(edge < m_graph_edges.size());
m_graph_edges[edge] = Edge{source, target}; m_graph_edges[edge] = Edge{source, target};
m_graph_out_edges[source].push_back(edge); m_graph_out_edges[source].push_back(edge);
m_rev_edge_map[edge] = reverse_edge; m_rev_edge_map[edge] = reverse_edge;

View File

@@ -1296,7 +1296,9 @@ void Optimizer::optimize_integer_constraints(Hierarchy& mRes, std::map<int, int>
solver = std::make_unique<GurobiFlowHelper>(); solver = std::make_unique<GurobiFlowHelper>();
} }
#endif #endif
solver->resize(initial.size() + 2, arc_ids.size()); /* This used to be arc_ids.size() which is wrong, the loop below adds
* exactly arcs.size() edges. */
solver->resize(initial.size() + 2, arcs.size());
std::set<int> ids; std::set<int> ids;
for (int i = 0; i < arcs.size(); ++i) { for (int i = 0; i < arcs.size(); ++i) {