[Bf-blender-cvs] [445889676bf] temp_bmesh_multires: commit prior to merge

Joseph Eagar noreply at git.blender.org
Thu Sep 16 19:55:34 CEST 2021


Commit: 445889676bfd900a237acbacbedeaadc30881cc7
Author: Joseph Eagar
Date:   Thu Sep 16 10:42:30 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB445889676bfd900a237acbacbedeaadc30881cc7

commit prior to merge

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

M	extern/audaspace/bindings/C/AUD_Device.cpp
M	extern/quadriflow/3rd/lemon-1.3.1/CMakeLists.txt
M	extern/quadriflow/3rd/lemon-1.3.1/cmake/FindILOG.cmake
M	extern/quadriflow/3rd/lemon-1.3.1/contrib/CMakeLists.txt
M	extern/quadriflow/3rd/lemon-1.3.1/lemon/CMakeLists.txt
M	extern/quadriflow/src/config.hpp
M	extern/quadriflow/src/loader.cpp
M	intern/quadriflow/quadriflow_capi.cpp
M	intern/quadriflow/quadriflow_capi.hpp
M	source/blender/blenkernel/intern/dyntopo.c
M	source/blender/blenkernel/intern/mesh_remesh_voxel.cc
M	source/blender/bmesh/intern/bmesh_construct.c
M	source/blender/editors/sculpt_paint/CMakeLists.txt
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_boundary.c
A	source/blender/editors/sculpt_paint/sculpt_brush_machine.c
M	source/blender/editors/sculpt_paint/sculpt_smooth.c
M	source/blender/makesdna/DNA_node_types.h

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

diff --git a/extern/audaspace/bindings/C/AUD_Device.cpp b/extern/audaspace/bindings/C/AUD_Device.cpp
index d4643094bc2..80a2f4c1fd8 100644
--- a/extern/audaspace/bindings/C/AUD_Device.cpp
+++ b/extern/audaspace/bindings/C/AUD_Device.cpp
@@ -221,7 +221,7 @@ AUD_API void AUD_Device_setListenerVelocity(AUD_Device* device, const float valu
 AUD_API double AUD_Device_getRate(AUD_Device* device)
 {
 	auto dev = device ? *device : DeviceManager::getDevice();
-	return dev->getSpecs().rate;
+	return dev ? dev->getSpecs().rate : 0.0;
 }
 
 AUD_API float AUD_Device_getSpeedOfSound(AUD_Device* device)
diff --git a/extern/quadriflow/3rd/lemon-1.3.1/CMakeLists.txt b/extern/quadriflow/3rd/lemon-1.3.1/CMakeLists.txt
index b20b163a16a..7aa6d430906 100644
--- a/extern/quadriflow/3rd/lemon-1.3.1/CMakeLists.txt
+++ b/extern/quadriflow/3rd/lemon-1.3.1/CMakeLists.txt
@@ -67,7 +67,7 @@ SET(LEMON_ENABLE_ILOG YES CACHE STRING "Enable ILOG (CPLEX) solver backend.")
 SET(LEMON_ENABLE_COIN YES CACHE STRING "Enable COIN solver backend.")
 SET(LEMON_ENABLE_SOPLEX YES CACHE STRING "Enable SoPlex solver backend.")
 
-IF(LEMON_ENABLE_GLPK)
+IF(LEMON_ENABLE_GLPK) 
   FIND_PACKAGE(GLPK 4.33)
 ENDIF(LEMON_ENABLE_GLPK)
 IF(LEMON_ENABLE_ILOG)
diff --git a/extern/quadriflow/3rd/lemon-1.3.1/cmake/FindILOG.cmake b/extern/quadriflow/3rd/lemon-1.3.1/cmake/FindILOG.cmake
index 584df4f6994..a09fc9a2753 100644
--- a/extern/quadriflow/3rd/lemon-1.3.1/cmake/FindILOG.cmake
+++ b/extern/quadriflow/3rd/lemon-1.3.1/cmake/FindILOG.cmake
@@ -4,7 +4,7 @@ FIND_PATH(ILOG_ROOT_DIR
   PATHS /opt/ibm/ILOG /usr/local/ibm/ILOG /usr/local/ILOG /usr/local/ilog
   PATHS "$ENV{HOME}/ILOG" "$ENV{HOME}/.local/ILOG"
   PATHS "$ENV{HOME}/ibm/ILOG" "$ENV{HOME}/.local/ibm/ILOG"
-  PATHS "C:/Program Files/IBM/ILOG"
+  PATHS "C:/Program Files/IBM/ILOG" 
   PATH_SUFFIXES "CPLEX_Studio126" "CPLEX_Studio125"
   "CPLEX_Studio124" "CPLEX_Studio123" "CPLEX_Studio122"
   NO_DEFAULT_PATH
diff --git a/extern/quadriflow/3rd/lemon-1.3.1/contrib/CMakeLists.txt b/extern/quadriflow/3rd/lemon-1.3.1/contrib/CMakeLists.txt
index fd393bcc420..b6c11e2aad4 100644
--- a/extern/quadriflow/3rd/lemon-1.3.1/contrib/CMakeLists.txt
+++ b/extern/quadriflow/3rd/lemon-1.3.1/contrib/CMakeLists.txt
@@ -16,3 +16,4 @@ LINK_DIRECTORIES(
 
 # ADD_EXECUTABLE(myprog myprog-main.cc)
 # TARGET_LINK_LIBRARIES(myprog lemon)
+
diff --git a/extern/quadriflow/3rd/lemon-1.3.1/lemon/CMakeLists.txt b/extern/quadriflow/3rd/lemon-1.3.1/lemon/CMakeLists.txt
index f3501ca865b..4e6567e49c7 100644
--- a/extern/quadriflow/3rd/lemon-1.3.1/lemon/CMakeLists.txt
+++ b/extern/quadriflow/3rd/lemon-1.3.1/lemon/CMakeLists.txt
@@ -88,3 +88,4 @@ INSTALL(
   FILES ${CMAKE_CURRENT_BINARY_DIR}/lemon.pc
   DESTINATION lib/pkgconfig
 )
+
diff --git a/extern/quadriflow/src/config.hpp b/extern/quadriflow/src/config.hpp
index 106a8e58d0b..bf597ad0f39 100644
--- a/extern/quadriflow/src/config.hpp
+++ b/extern/quadriflow/src/config.hpp
@@ -1,8 +1,6 @@
 #ifndef CONFIG_H_
 #define CONFIG_H_
 
-#define WITH_OMP
-
 /* Workaround a bug in boost 1.68, until we upgrade to a newer version. */
 #if defined(__clang__) && defined(WIN32)
   #include <boost/type_traits/is_assignable.hpp>
diff --git a/extern/quadriflow/src/loader.cpp b/extern/quadriflow/src/loader.cpp
index a1596eeff9a..aa27066e6e4 100644
--- a/extern/quadriflow/src/loader.cpp
+++ b/extern/quadriflow/src/loader.cpp
@@ -69,7 +69,7 @@ void load(const char* filename, MatrixXd& V, MatrixXi& F)
 	};
 
 	/// Hash function for obj_vertex
-	struct obj_vertexHash {
+	struct obj_vertexHash : std::unary_function<obj_vertex, size_t> {
 		std::size_t operator()(const obj_vertex &v) const {
 			size_t hash = std::hash<uint32_t>()(v.p);
 			hash = hash * 37 + std::hash<uint32_t>()(v.uv);
diff --git a/intern/quadriflow/quadriflow_capi.cpp b/intern/quadriflow/quadriflow_capi.cpp
index 086d5f7d296..d00f42ed218 100644
--- a/intern/quadriflow/quadriflow_capi.cpp
+++ b/intern/quadriflow/quadriflow_capi.cpp
@@ -70,9 +70,9 @@ static int check_if_canceled(float progress,
   return cancel;
 }
 
-void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
-                             void (*update_cb)(void *, float progress, int *cancel),
-                             void *update_cb_data)
+ATTR_NO_OPT void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
+                                         void (*update_cb)(void *, float progress, int *cancel),
+                                         void *update_cb_data)
 {
   Parametrizer field;
   VertexMap vertexMap;
@@ -80,6 +80,12 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
   /* Get remeshing parameters. */
   int faces = qrd->target_faces;
 
+  field.flag_adaptive_scale = 1;
+  field.flag_minimum_cost_flow = 1;
+  field.flag_preserve_boundary = 1;
+  field.flag_preserve_sharp = 1;
+  // field.flag_aggresive_sat = 1;
+
   if (qrd->preserve_sharp) {
     field.flag_preserve_sharp = 1;
   }
@@ -106,6 +112,7 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
   /* Copy mesh to quadriflow data structures. */
   std::vector<Vector3d> positions;
   std::vector<uint32_t> indices;
+  std::vector<uint32_t> eflags;
   std::vector<ObjVertex> vertices;
 
   for (int i = 0; i < qrd->totverts; i++) {
@@ -114,16 +121,18 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
   }
 
   for (int q = 0; q < qrd->totfaces; q++) {
-    Vector3i f(qrd->faces[q * 3], qrd->faces[q * 3 + 1], qrd->faces[q * 3 + 2]);
+    Vector3i f(qrd->faces[q].v[0], qrd->faces[q].v[1], qrd->faces[q].v[2]);
 
     ObjVertex tri[6];
-    int nVertices = 3;
+    const int nVertices = 3;
 
     tri[0] = ObjVertex(f[0]);
     tri[1] = ObjVertex(f[1]);
     tri[2] = ObjVertex(f[2]);
 
     for (int i = 0; i < nVertices; ++i) {
+      eflags.push_back(qrd->faces[q].eflag[i]);
+
       const ObjVertex &v = tri[i];
       VertexMap::const_iterator it = vertexMap.find(v);
       if (it == vertexMap.end()) {
@@ -138,7 +147,10 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
   }
 
   field.F.resize(3, indices.size() / 3);
+  // field.FF.resize(3, indices.size() / 3);
+
   memcpy(field.F.data(), indices.data(), sizeof(uint32_t) * indices.size());
+  // memcpy(field.FF.data(), eflags.data(), sizeof(uint32_t) * eflags.size());
 
   field.V.resize(3, vertices.size());
   for (uint32_t i = 0; i < vertices.size(); ++i) {
@@ -157,12 +169,17 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
     return;
   }
 
+  const int steps = 2;
+
   /* Setup mesh boundary constraints if needed */
-  if (field.flag_preserve_boundary) {
+#if 0
+  if (true) {  // field.flag_preserve_boundary) {
     Hierarchy &mRes = field.hierarchy;
     mRes.clearConstraints();
+
     for (uint32_t i = 0; i < 3 * mRes.mF.cols(); ++i) {
-      if (mRes.mE2E[i] == -1) {
+      if (mRes.mFF((i) % 3, i / 3) & QFLOW_CONSTRAINED) {
+        // if (mRes.mE2E[i] == -1) {
         uint32_t i0 = mRes.mF(i % 3, i / 3);
         uint32_t i1 = mRes.mF((i + 1) % 3, i / 3);
         Vector3d p0 = mRes.mV[0].col(i0), p1 = mRes.mV[0].col(i1);
@@ -172,15 +189,20 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
           mRes.mCO[0].col(i0) = p0;
           mRes.mCO[0].col(i1) = p1;
           mRes.mCQ[0].col(i0) = mRes.mCQ[0].col(i1) = edge;
-          mRes.mCQw[0][i0] = mRes.mCQw[0][i1] = mRes.mCOw[0][i0] = mRes.mCOw[0][i1] = 1.0;
+          mRes.mCQw[0][i0] = mRes.mCQw[0][i1] = mRes.mCOw[0][i0] = mRes.mCOw[0][i1] = 0.1;
         }
       }
     }
-    mRes.propagateConstraints();
+    for (int j = 0; j < 10; j++) {
+      mRes.propagateConstraints();
+    }
   }
+#endif
 
   /* Optimize the mesh field orientations (tangental field etc) */
-  Optimizer::optimize_orientations(field.hierarchy);
+  for (int i = 0; i < steps; i++) {
+    Optimizer::optimize_orientations(field.hierarchy);
+  }
   field.ComputeOrientationSingularities();
 
   if (check_if_canceled(0.3f, update_cb, update_cb_data)) {
@@ -195,11 +217,13 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
     return;
   }
 
-  Optimizer::optimize_scale(field.hierarchy, field.rho, field.flag_adaptive_scale);
-  field.flag_adaptive_scale = 1;
-
-  Optimizer::optimize_positions(field.hierarchy, field.flag_adaptive_scale);
+  for (int i = 0; i < steps; i++) {
+    Optimizer::optimize_scale(field.hierarchy, field.rho, field.flag_adaptive_scale);
+  }
 
+  for (int i = 0; i < steps; i++) {
+    Optimizer::optimize_positions(field.hierarchy, field.flag_adaptive_scale);
+  }
   field.ComputePositionSingularities();
 
   if (check_if_canceled(0.5f, update_cb, update_cb_data)) {
diff --git a/intern/quadriflow/quadriflow_capi.hpp b/intern/quadriflow/quadriflow_capi.hpp
index 59af2826e15..563c25b4a84 100644
--- a/intern/quadriflow/quadriflow_capi.hpp
+++ b/intern/quadriflow/quadriflow_capi.hpp
@@ -23,9 +23,16 @@
 extern "C" {
 #endif
 
+enum { QFLOW_CONSTRAINED = 1 };
+
+typedef struct QuadriflowFace {
+  int v[3];
+  char eflag[3];
+} QuadriflowFace;
+
 typedef struct QuadriflowRemeshData {
   float *verts;
-  int *faces;
+  QuadriflowFace *faces;
   int totfaces;
   int totverts;
 
diff --git a/source/blender/blenkernel/intern/dyntopo.c b/source/blender/blenkernel/intern/dyntopo.c
index cb88b76fd47..51757540ba3 100644
--- a/source/blender/blenkernel/intern/dyntopo.c
+++ b/source/blender/blenkernel/intern/dyntopo.c
@@ -5774,6 +5774,8 @@ static void pbvh_split_edges(EdgeQueueContext *eq_ctx,
       continue;
     }
 
+    int _i = 0;
+
     do {
       if (!l) {
         printf("error 1 %s\n", __func__);
@@ -5781,6 +5783,8 @@ static void pbvh_split_edges(EdgeQueueContext *eq_ctx,
       }
 
       BMLoop *l2 = l->f->l_first;
+      int _j = 0;
+
       do {
         if (!l2->e) {
           printf("error2 %s\n", __func__);
@@ -5792,8 +5796,20 @@ static void pbvh_split_edges(EdgeQueueContext *eq_ctx,
 
         MDynTopoVert *mv = BKE_PBVH_DYNVERT(pbvh->cd_dyn_vert, l2->v);
         mv->flag |= DYNVERT_NEED_VALENCE | DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_DISK_SORT;
+
+        if (_j > 10000) {
+          printf("infinite loop error 1\n");
+          fix_mesh(pbvh, pbvh->bm);
+          return;
+        }
       } while ((l2 = l2->next) != l->f->l_first);
 
+      if (_i++ > 1000) {
+        printf("infinite loop

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list