Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2015-11-17 06:29:13 +0300
committerCampbell Barton <ideasman42@gmail.com>2015-11-17 06:36:22 +0300
commita3530b35bdbbaf214f4113915e6e7a672fef2cbd (patch)
tree30108293e67d55e4e7fbe36ac74bef2a8852083d /source/blender/bmesh/operators/bmo_connect_pair.c
parent98931d9e395f8835a339061b665f0752a853f95a (diff)
Fix T46784: Connect vertices (follow up)
Another fix for a slightly different case from the original report, to give better orientation. Vertex normals influence on the orientation is now scaled by the alignment with the cut direction. Also use face normal instead of loop normal which can be unreliable when the corners edges are co-linear.
Diffstat (limited to 'source/blender/bmesh/operators/bmo_connect_pair.c')
-rw-r--r--source/blender/bmesh/operators/bmo_connect_pair.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/source/blender/bmesh/operators/bmo_connect_pair.c b/source/blender/bmesh/operators/bmo_connect_pair.c
index f12ad6dfc27..3b860778e1c 100644
--- a/source/blender/bmesh/operators/bmo_connect_pair.c
+++ b/source/blender/bmesh/operators/bmo_connect_pair.c
@@ -506,6 +506,7 @@ static void bm_vert_pair_to_matrix(BMVert *v_pair[2], float r_unit_mat[3][3])
float basis_nor[3];
sub_v3_v3v3(basis_dir, v_pair[0]->co, v_pair[1]->co);
+ normalize_v3(basis_dir);
#if 0
add_v3_v3v3(basis_nor, v_pair[0]->no, v_pair[1]->no);
@@ -518,16 +519,12 @@ static void bm_vert_pair_to_matrix(BMVert *v_pair[2], float r_unit_mat[3][3])
float basis_nor_b[3];
/* align normal to direction */
- cross_v3_v3v3(basis_tmp, v_pair[0]->no, basis_dir);
- cross_v3_v3v3(basis_nor_a, basis_tmp, basis_dir);
+ project_plane_v3_v3v3(basis_nor_a, v_pair[0]->no, basis_dir);
+ project_plane_v3_v3v3(basis_nor_b, v_pair[1]->no, basis_dir);
- cross_v3_v3v3(basis_tmp, v_pair[1]->no, basis_dir);
- cross_v3_v3v3(basis_nor_b, basis_tmp, basis_dir);
+ /* don't normalize before combining so as normals approach the direction, they have less effect (T46784). */
/* combine the normals */
- normalize_v3(basis_nor_a);
- normalize_v3(basis_nor_b);
-
/* for flipped faces */
if (dot_v3v3(basis_nor_a, basis_nor_b) < 0.0f) {
negate_v3(basis_nor_b);
@@ -537,7 +534,6 @@ static void bm_vert_pair_to_matrix(BMVert *v_pair[2], float r_unit_mat[3][3])
#endif
/* get third axis */
- normalize_v3(basis_dir);
normalize_v3(basis_nor);
cross_v3_v3v3(basis_tmp, basis_dir, basis_nor);
@@ -558,13 +554,11 @@ static void bm_vert_pair_to_matrix(BMVert *v_pair[2], float r_unit_mat[3][3])
axis_pair[i].angle_cos = -FLT_MAX;
BM_ITER_ELEM (l, &liter, v_pair[i], BM_LOOPS_OF_VERT) {
- float l_normal[3], basis_dir_proj[3];
+ float basis_dir_proj[3];
float angle_cos_test;
- BM_loop_calc_face_normal(l, l_normal);
-
/* project basis dir onto the normal to find its closest angle */
- project_plane_v3_v3v3(basis_dir_proj, basis_dir, l_normal);
+ project_plane_v3_v3v3(basis_dir_proj, basis_dir, l->f->no);
if (normalize_v3(basis_dir_proj) > eps) {
angle_cos_test = dot_v3v3(basis_dir_proj, basis_dir);