[Bf-blender-cvs] [997980096f1] sculpt-mode-features: attempt to take hard edges into account at quad remeshing

Martin Felke noreply at git.blender.org
Wed Apr 17 22:26:22 CEST 2019


Commit: 997980096f1361f28ed0da722ad561554b0f8c7c
Author: Martin Felke
Date:   Wed Apr 17 21:14:43 2019 +0200
Branches: sculpt-mode-features
https://developer.blender.org/rB997980096f1361f28ed0da722ad561554b0f8c7c

attempt to take hard edges into account at quad remeshing

(with mark sharp on edges)

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

M	build_files/build_environment/cmake/versions.cmake
M	intern/qex/igl_capi.cc
M	intern/qex/igl_capi.h
M	source/blender/blenkernel/intern/remesh_quad.c

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

diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake
index 045e012bcd4..66afd794fa6 100644
--- a/build_files/build_environment/cmake/versions.cmake
+++ b/build_files/build_environment/cmake/versions.cmake
@@ -308,9 +308,10 @@ set(IGL_URI https://github.com/libigl/libigl/archive/v${IGL_VERSION}.tar.gz)
 set(IGL_HASH 42518e6b106c7209c73435fd260ed5d34edeb254852495b4c95dce2d95401328)
 
 #should match qex, but what about comiso ?
-set(OPENMESH_VERSION 3.0)
+set(OPENMESH_VERSION 8.0)
 set(OPENMESH_URI http://www.openmesh.org/media/Releases/${OPENMESH_VERSION}/OpenMesh-${OPENMESH_VERSION}.tar.gz)
-set(OPENMESH_HASH 96c595c1683b1ad950e80464ae5fc1f3c8dc45c31c8a211122a23e16a076ab23)
+#set(OPENMESH_HASH 96c595c1683b1ad950e80464ae5fc1f3c8dc45c31c8a211122a23e16a076ab23) #3.0
+set(OPENMESH_HASH 8974d44026cacaa37b171945b5c96a284bfd32c9df9d671d62931050d057ec82)
 
 #latest uid in git as of 2016-10-25
 set(QEX_GIT_UID 1d33e0d6700dd3d00df984aad776d9537fcf16af)
diff --git a/intern/qex/igl_capi.cc b/intern/qex/igl_capi.cc
index 878d36c178a..59c7740e436 100644
--- a/intern/qex/igl_capi.cc
+++ b/intern/qex/igl_capi.cc
@@ -38,7 +38,7 @@
 
 
 void igl_miq(float (*verts)[3] , int (*tris)[3], int num_verts, int num_tris, float (*uv_tris)[3][2],
-            double gradient_size, double iter, double stiffness, bool direct_round)
+            double gradient_size, double iter, double stiffness, bool direct_round, bool *hard_edges)
 {
 
     using namespace Eigen;
@@ -142,6 +142,26 @@ void igl_miq(float (*verts)[3] , int (*tris)[3], int num_verts, int num_tris, fl
     // Comb the frame-field accordingly
     igl::comb_frame_field(V, F, X1, X2, BIS1_combed, BIS2_combed, X1_combed, X2_combed);
 
+
+    //hard verts (optionally mark too)
+    std::vector<int> hverts;
+
+    //hard edges
+    std::vector<std::vector<int>> hedges;
+    for (int i = 0; i < num_tris; i++)
+    {
+        for (int j = 0; j < 3; j++)
+        {
+            if (hard_edges[i * 3 + j])
+            {
+                 std::vector<int> hedge;
+                 hedge.push_back(i);
+                 hedge.push_back(j);
+                 hedges.push_back(hedge);
+            }
+        }
+    }
+
     // Global parametrization
     igl::copyleft::comiso::miq(V,
            F,
@@ -157,7 +177,7 @@ void igl_miq(float (*verts)[3] , int (*tris)[3], int num_verts, int num_tris, fl
            direct_round,
            iter,
            5,
-           true);
+           true, true, hverts, hedges);
 
     // Global parametrization (with seams, only for demonstration)
     /*igl::copyleft::comiso::miq(V,
diff --git a/intern/qex/igl_capi.h b/intern/qex/igl_capi.h
index d067c9f78e3..2cedcf0fb5e 100644
--- a/intern/qex/igl_capi.h
+++ b/intern/qex/igl_capi.h
@@ -26,7 +26,7 @@ extern "C" {
 #endif
 
 void igl_miq(float (*verts)[3] , int (*tris)[3], int num_verts, int num_tris, float (*uv_tris)[3][2],
-             double gradient_size, double iter, double stiffness, bool direct_round);
+             double gradient_size, double iter, double stiffness, bool direct_round, bool* hard_edges);
 
 
 #ifdef __cplusplus
diff --git a/source/blender/blenkernel/intern/remesh_quad.c b/source/blender/blenkernel/intern/remesh_quad.c
index bff76f37306..e85abd92d78 100644
--- a/source/blender/blenkernel/intern/remesh_quad.c
+++ b/source/blender/blenkernel/intern/remesh_quad.c
@@ -86,7 +86,32 @@ Mesh* BKE_remesh_quad(Mesh* mesh, float gradient_size, float stiffness, int iter
     //double gradient_size = 50.0;
     //double iter = 0;
     //bool direct_round = false;
-    igl_miq(verts, tris, num_verts, num_tris, uv_tris, gradient_size, iter, stiffness, direct_round);
+
+    //find pairs of verts of original edges (= marked with seam)
+    bool *hard_edges = MEM_callocN(sizeof(bool) * 3 * num_tris, "hard edges");
+   // int *hard_verts = MEM_mallocN(sizeof(int) * mesh->totvert, "hard_verts");
+
+    for (int i = 0; i < num_tris; i++)
+    {
+        int r_edges[3];
+        BKE_mesh_looptri_get_real_edges(mesh, &looptri[i], r_edges);
+
+        for (int j = 0; j < 3; j++)
+        {
+            bool seam = (r_edges[j] > -1) && (mesh->medge[r_edges[j]].flag & ME_SHARP);
+
+            if (seam) {
+                hard_edges[i*3+j] = true;
+            }
+            else {
+                hard_edges[i*3+j] = false;
+            }
+        }
+    }
+
+
+    igl_miq(verts, tris, num_verts, num_tris, uv_tris, gradient_size, iter, stiffness, direct_round,
+            hard_edges);
 
     //build trimesh
     trimesh->tri_count = (unsigned int)num_tris;
@@ -108,6 +133,10 @@ Mesh* BKE_remesh_quad(Mesh* mesh, float gradient_size, float stiffness, int iter
     }
 
     for (int i = 0; i < num_tris; i++) {
+        //printf("UVTri (%d %d) (%f %f)\n", i, 0, uv_tris[i][0][0],  uv_tris[i][0][1]);
+        //printf("UVTri (%d %d) (%f %f)\n", i, 1, uv_tris[i][1][0],  uv_tris[i][1][1]);
+        //printf("UVTri (%d %d) (%f %f)\n", i, 2, uv_tris[i][2][0],  uv_tris[i][2][1]);
+
         trimesh->uvTris[i].uvs[0].x[0] = uv_tris[i][0][0];
         trimesh->uvTris[i].uvs[0].x[1] = uv_tris[i][0][1];
 
@@ -135,13 +164,14 @@ Mesh* BKE_remesh_quad(Mesh* mesh, float gradient_size, float stiffness, int iter
             result->mface[i].v3 = quadmesh->quads[i].indices[1];
             result->mface[i].v2 = quadmesh->quads[i].indices[2];
             result->mface[i].v1 = quadmesh->quads[i].indices[3];
-            result->mface->mat_nr = 1;
+            result->mface->mat_nr = 0;
         }
 
         //build edges, tessfaces, normals
         BKE_mesh_calc_edges_tessface(result);
         BKE_mesh_convert_mfaces_to_mpolys(result);
         BKE_mesh_calc_normals(result);
+        BKE_mesh_update_customdata_pointers(result, true);
     }
 
     //free stuff
@@ -156,9 +186,9 @@ Mesh* BKE_remesh_quad(Mesh* mesh, float gradient_size, float stiffness, int iter
     MEM_freeN(verttri);
 
     if (quadmesh->vertices)
-        MEM_freeN(quadmesh->vertices);
+        free(quadmesh->vertices);
     if (quadmesh->quads)
-        MEM_freeN(quadmesh->quads);
+        free(quadmesh->quads);
     MEM_freeN(quadmesh);
 
     return result;



More information about the Bf-blender-cvs mailing list