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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs