[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