[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