Fix fix invalid index use for edit-mesh laplacian smooth

Only vertex indices were ensured to be correct.
This commit is contained in:
Campbell Barton 2021-08-05 22:32:18 +10:00 committed by Jeroen Bakker
parent bbfb29c794
commit 6d1895c681
Notes: blender-bot 2023-02-13 22:19:20 +01:00
Referenced by issue #77348, Blender LTS: Maintenance Task 2.83
1 changed files with 11 additions and 16 deletions

View File

@ -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(