[Bf-blender-cvs] [6d1895c6816] blender-v2.83-release: Fix fix invalid index use for edit-mesh laplacian smooth
Campbell Barton
noreply at git.blender.org
Mon Aug 16 10:02:38 CEST 2021
Commit: 6d1895c6816dabadae7d875b49e2be988f57b155
Author: Campbell Barton
Date: Thu Aug 5 22:32:18 2021 +1000
Branches: blender-v2.83-release
https://developer.blender.org/rB6d1895c6816dabadae7d875b49e2be988f57b155
Fix fix invalid index use for edit-mesh laplacian smooth
Only vertex indices were ensured to be correct.
===================================================================
M source/blender/bmesh/operators/bmo_smooth_laplacian.c
===================================================================
diff --git a/source/blender/bmesh/operators/bmo_smooth_laplacian.c b/source/blender/bmesh/operators/bmo_smooth_laplacian.c
index 01bdf5d933a..c6a3a6e6295 100644
--- a/source/blender/bmesh/operators/bmo_smooth_laplacian.c
+++ b/source/blender/bmesh/operators/bmo_smooth_laplacian.c
@@ -180,7 +180,7 @@ static void init_laplacian_matrix(LaplacianSystem *sys)
BMVert *vn;
BMVert *vf[4];
- BM_ITER_MESH_INDEX (e, &eiter, sys->bm, BM_EDGES_OF_MESH, j) {
+ BM_ITER_MESH_INDEX (e, &eiter, sys->bm, BM_EDGES_OF_MESH, i) {
if (!BM_elem_flag_test(e, BM_ELEM_SELECT) && BM_edge_is_boundary(e)) {
v1 = e->v1->co;
v2 = e->v2->co;
@@ -190,7 +190,6 @@ static void init_laplacian_matrix(LaplacianSystem *sys)
w1 = len_v3v3(v1, v2);
if (w1 > sys->min_area) {
w1 = 1.0f / w1;
- i = BM_elem_index_get(e);
sys->eweights[i] = w1;
sys->vlengths[idv1] += w1;
sys->vlengths[idv2] += w1;
@@ -202,13 +201,13 @@ static void init_laplacian_matrix(LaplacianSystem *sys)
}
}
- BM_ITER_MESH (f, &fiter, sys->bm, BM_FACES_OF_MESH) {
+ BM_ITER_MESH_INDEX (f, &fiter, sys->bm, BM_FACES_OF_MESH, i) {
if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
- BM_ITER_ELEM_INDEX (vn, &vi, f, BM_VERTS_OF_FACE, i) {
- vf[i] = vn;
+ BM_ITER_ELEM_INDEX (vn, &vi, f, BM_VERTS_OF_FACE, j) {
+ vf[j] = vn;
}
- has_4_vert = (i == 4) ? 1 : 0;
+ has_4_vert = (j == 4) ? 1 : 0;
idv1 = BM_elem_index_get(vf[0]);
idv2 = BM_elem_index_get(vf[1]);
idv3 = BM_elem_index_get(vf[2]);
@@ -268,8 +267,6 @@ static void init_laplacian_matrix(LaplacianSystem *sys)
}
}
else {
- i = BM_elem_index_get(f);
-
w1 = cotangent_tri_weight_v3(v1, v2, v3);
w2 = cotangent_tri_weight_v3(v2, v3, v1);
w3 = cotangent_tri_weight_v3(v3, v1, v2);
@@ -302,12 +299,12 @@ static void fill_laplacian_matrix(LaplacianSystem *sys)
BMVert *vn;
BMVert *vf[4];
- BM_ITER_MESH (f, &fiter, sys->bm, BM_FACES_OF_MESH) {
+ BM_ITER_MESH_INDEX (f, &fiter, sys->bm, BM_FACES_OF_MESH, i) {
if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
- BM_ITER_ELEM_INDEX (vn, &vi, f, BM_VERTS_OF_FACE, i) {
- vf[i] = vn;
+ BM_ITER_ELEM_INDEX (vn, &vi, f, BM_VERTS_OF_FACE, j) {
+ vf[j] = vn;
}
- has_4_vert = (i == 4) ? 1 : 0;
+ has_4_vert = (j == 4) ? 1 : 0;
if (has_4_vert) {
idv[0] = BM_elem_index_get(vf[0]);
idv[1] = BM_elem_index_get(vf[1]);
@@ -343,8 +340,7 @@ static void fill_laplacian_matrix(LaplacianSystem *sys)
idv1 = BM_elem_index_get(vf[0]);
idv2 = BM_elem_index_get(vf[1]);
idv3 = BM_elem_index_get(vf[2]);
- /* Is ring if number of faces == number of edges around vertice*/
- i = BM_elem_index_get(f);
+ /* Is ring if number of faces == number of edges around vertice. */
if (!vert_is_boundary(vf[0]) && sys->zerola[idv1] == 0) {
EIG_linear_solver_matrix_add(
sys->context, idv1, idv2, sys->fweights[i][2] * sys->vweights[idv1]);
@@ -366,14 +362,13 @@ static void fill_laplacian_matrix(LaplacianSystem *sys)
}
}
}
- BM_ITER_MESH (e, &eiter, sys->bm, BM_EDGES_OF_MESH) {
+ BM_ITER_MESH_INDEX (e, &eiter, sys->bm, BM_EDGES_OF_MESH, i) {
if (!BM_elem_flag_test(e, BM_ELEM_SELECT) && BM_edge_is_boundary(e)) {
v1 = e->v1->co;
v2 = e->v2->co;
idv1 = BM_elem_index_get(e->v1);
idv2 = BM_elem_index_get(e->v2);
if (sys->zerola[idv1] == 0 && sys->zerola[idv2] == 0) {
- i = BM_elem_index_get(e);
EIG_linear_solver_matrix_add(
sys->context, idv1, idv2, sys->eweights[i] * sys->vlengths[idv1]);
EIG_linear_solver_matrix_add(
More information about the Bf-blender-cvs
mailing list