[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