[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54267] trunk/blender/source/blender: fix [#34073] Combined EdgeLoop slides weirdly on even try

Campbell Barton ideasman42 at gmail.com
Sun Feb 3 07:09:30 CET 2013


Revision: 54267
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54267
Author:   campbellbarton
Date:     2013-02-03 06:09:29 +0000 (Sun, 03 Feb 2013)
Log Message:
-----------
fix [#34073] Combined EdgeLoop slides weirdly on even try

concave check on co-linear edges could fail, avoid by using the loop-direction + face normal.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
    trunk/blender/source/blender/editors/transform/transform.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2013-02-03 02:54:24 UTC (rev 54266)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2013-02-03 06:09:29 UTC (rev 54267)
@@ -1058,6 +1058,29 @@
 }
 
 /**
+ * \brief BM_loop_calc_face_direction
+ *
+ * Calculate the direction a loop is pointing.
+ *
+ * \param l The loop to calculate the direction at
+ * \param r_dir Resulting direction
+ */
+void BM_loop_calc_face_direction(BMLoop *l, float r_dir[3])
+{
+	float v_prev[3];
+	float v_next[3];
+
+	sub_v3_v3v3(v_prev, l->v->co, l->prev->v->co);
+	sub_v3_v3v3(v_next, l->next->v->co, l->v->co);
+
+	normalize_v3(v_prev);
+	normalize_v3(v_next);
+
+	add_v3_v3v3(r_dir, v_prev, v_next);
+	normalize_v3(r_dir);
+}
+
+/**
  * \brief BM_loop_calc_face_tangent
  *
  * Calculate the tangent at this loop corner or fallback to the face normal on straight lines.

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.h	2013-02-03 02:54:24 UTC (rev 54266)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.h	2013-02-03 06:09:29 UTC (rev 54267)
@@ -66,6 +66,7 @@
 
 float   BM_loop_calc_face_angle(BMLoop *l);
 void    BM_loop_calc_face_normal(BMLoop *l, float r_normal[3]);
+void    BM_loop_calc_face_direction(BMLoop *l, float r_normal[3]);
 void    BM_loop_calc_face_tangent(BMLoop *l, float r_tangent[3]);
 
 float   BM_edge_calc_face_angle(BMEdge *e);

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c	2013-02-03 02:54:24 UTC (rev 54266)
+++ trunk/blender/source/blender/editors/transform/transform.c	2013-02-03 06:09:29 UTC (rev 54267)
@@ -4920,7 +4920,6 @@
 				/* When there is no edge to slide along,
 				 * we must slide along the vector defined by the face we're attach to */
 				BMLoop *l_tmp = BM_face_vert_share_loop(l_first->f, v);
-				float tvec[3];
 
 				BLI_assert(ELEM(l_tmp->e, e_prev, e_next) && ELEM(l_tmp->prev->e, e_prev, e_next));
 
@@ -4930,12 +4929,9 @@
 					sub_v3_v3v3(vec_accum, l_tmp->next->next->v->co, v->co);
 				}
 				else {
-					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);
+					float tdir[3];
+					BM_loop_calc_face_direction(l_tmp, tdir);
+					cross_v3_v3v3(vec_accum, l_tmp->f->no, tdir);
 					len_v3_ensure(vec_accum, (BM_edge_calc_length(e_prev) + BM_edge_calc_length(e_next)) / 2.0f);
 				}
 			}




More information about the Bf-blender-cvs mailing list