From 0fd360428acdc7689356861a9c5e01862a5fe1ed Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 28 Mar 2025 19:25:56 +0100 Subject: [PATCH] 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 --- extern/quadriflow/patches/blender.patch | 31 +++++++++---------- .../patches/boykov_kolmogorov_max_flow.hpp | 2 ++ extern/quadriflow/src/optimizer.cpp | 4 ++- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/extern/quadriflow/patches/blender.patch b/extern/quadriflow/patches/blender.patch index d74bd09f22f..83ca880178d 100644 --- a/extern/quadriflow/patches/blender.patch +++ b/extern/quadriflow/patches/blender.patch @@ -521,21 +521,18 @@ index a93c58ac2a7..8c682b6d9f2 100644 VectorXi &V2E, VectorXi &E2E, VectorXi &boundary, VectorXi &nonmanifold, std::vector &edge_diff, std::vector &edge_values, std::vector &face_edgeOrients, std::vector &face_edgeIds, -diff --git a/intern/quadriflow/quadriflow_capi.cpp b/intern/quadriflow/quadriflow_capi.cpp -index fad604f679a..014ac2a5613 100644 ---- a/intern/quadriflow/quadriflow_capi.cpp -+++ b/intern/quadriflow/quadriflow_capi.cpp -@@ -190,8 +190,11 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd, - return; - } +diff --git a/extern/quadriflow/src/optimizer.cpp b/extern/quadriflow/src/optimizer.cpp +index 1c59ad0f70c..f8836ed0d0e 100644 +--- a/extern/quadriflow/src/optimizer.cpp ++++ b/extern/quadriflow/src/optimizer.cpp +@@ -1296,7 +1296,9 @@ void Optimizer::optimize_integer_constraints(Hierarchy& mRes, std::map + solver = std::make_unique(); + } + #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 */ -- field.ComputeIndexMap(); -+ /* 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; + std::set ids; + for (int i = 0; i < arcs.size(); ++i) { diff --git a/extern/quadriflow/patches/boykov_kolmogorov_max_flow.hpp b/extern/quadriflow/patches/boykov_kolmogorov_max_flow.hpp index 96df563f0c4..d99b464a537 100644 --- a/extern/quadriflow/patches/boykov_kolmogorov_max_flow.hpp +++ b/extern/quadriflow/patches/boykov_kolmogorov_max_flow.hpp @@ -49,6 +49,8 @@ class BoykovKolmogorovMaxFlow { const int target, const int capacity) { + assert(edge < m_graph_edges.size()); + m_graph_edges[edge] = Edge{source, target}; m_graph_out_edges[source].push_back(edge); m_rev_edge_map[edge] = reverse_edge; diff --git a/extern/quadriflow/src/optimizer.cpp b/extern/quadriflow/src/optimizer.cpp index 1c59ad0f70c..5e14f329805 100644 --- a/extern/quadriflow/src/optimizer.cpp +++ b/extern/quadriflow/src/optimizer.cpp @@ -1296,7 +1296,9 @@ void Optimizer::optimize_integer_constraints(Hierarchy& mRes, std::map solver = std::make_unique(); } #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 ids; for (int i = 0; i < arcs.size(); ++i) {