[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54176] trunk/blender/source/blender: fix for fix, ugh!, vertex slide with concave/ convex ngons & normal flipping should now work properly in all cases.

Campbell Barton ideasman42 at gmail.com
Tue Jan 29 06:18:36 CET 2013


Revision: 54176
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54176
Author:   campbellbarton
Date:     2013-01-29 05:18:30 +0000 (Tue, 29 Jan 2013)
Log Message:
-----------
fix for fix, ugh!, vertex slide with concave/convex ngons & normal flipping should now work properly in all cases.
... somehow I managed to make test-cases that worked in previous commits but failed in other cases.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/intern/math_vector_inline.c
    trunk/blender/source/blender/editors/transform/transform.c

Modified: trunk/blender/source/blender/blenlib/intern/math_vector_inline.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_vector_inline.c	2013-01-29 04:26:05 UTC (rev 54175)
+++ trunk/blender/source/blender/blenlib/intern/math_vector_inline.c	2013-01-29 05:18:30 UTC (rev 54176)
@@ -528,6 +528,7 @@
 
 MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
 {
+	BLI_assert(r != a && r != b);
 	r[0] = a[1] * b[2] - a[2] * b[1];
 	r[1] = a[2] * b[0] - a[0] * b[2];
 	r[2] = a[0] * b[1] - a[1] * b[0];

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c	2013-01-29 04:26:05 UTC (rev 54175)
+++ trunk/blender/source/blender/editors/transform/transform.c	2013-01-29 05:18:30 UTC (rev 54176)
@@ -4917,24 +4917,21 @@
 				len_v3_ensure(vec_accum, vec_accum_len / (float)i);
 			}
 			else {
-				/* When there is no edge to slide along,
-				 * we must slide along the vector defined by the face we're attach to */
-				float e_dir_prev[3], e_dir_next[3], tvec[3];
+				BMLoop *l_tmp = BM_face_vert_share_loop(l_first->f, v);
 
-				sub_v3_v3v3(e_dir_prev, BM_edge_other_vert(e_prev, v)->co, v->co);
-				sub_v3_v3v3(e_dir_next, BM_edge_other_vert(e_next, v)->co, v->co);
-
-				cross_v3_v3v3(tvec, l->f->no, e_dir_prev);
-				cross_v3_v3v3(vec_accum, e_dir_next, l->f->no);
-
-				mid_v3_v3v3(vec_accum, vec_accum, tvec);
-
-				/* check if we need to flip
-				 * (compare the normal defines by the edges with the face normal) */
-				cross_v3_v3v3(tvec, e_dir_prev, e_dir_next);
-				if ((dot_v3v3(tvec, l->f->no) < 0.0f) == BM_loop_is_convex(l)) {
-					negate_v3(vec_accum);
+				if (ELEM(l_tmp->e, e_prev, e_next) && ELEM(l_tmp->prev->e, e_prev, e_next)) {
+					float tvec[3];
+					BM_loop_calc_face_tangent(l_tmp, vec_accum);
+					if (!BM_loop_is_convex(l_tmp)) {
+						negate_v3(vec_accum);
+					}
+					cross_v3_v3v3(tvec, vec_accum, l_tmp->f->no);
+					cross_v3_v3v3(vec_accum, l_tmp->f->no, tvec);
+					len_v3_ensure(vec_accum, (BM_edge_calc_length(e_prev) + BM_edge_calc_length(e_next)) / 2.0f);
 				}
+				else {
+					BLI_assert(0);
+				}
 			}
 
 			copy_v3_v3(r_slide_vec, vec_accum);




More information about the Bf-blender-cvs mailing list