[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54272] trunk/blender/source/blender/bmesh /intern/bmesh_queries.c: fix BM_loop_calc_face_tangent for concave face corners, caused a bug in wire-frame operator.

Campbell Barton ideasman42 at gmail.com
Sun Feb 3 10:44:38 CET 2013


Revision: 54272
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54272
Author:   campbellbarton
Date:     2013-02-03 09:44:37 +0000 (Sun, 03 Feb 2013)
Log Message:
-----------
fix BM_loop_calc_face_tangent for concave face corners, caused a bug in wire-frame operator.

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

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2013-02-03 08:13:15 UTC (rev 54271)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2013-02-03 09:44:37 UTC (rev 54272)
@@ -1093,23 +1093,27 @@
 {
 	float v_prev[3];
 	float v_next[3];
+	float dir[3];
 
 	sub_v3_v3v3(v_prev, l->prev->v->co, l->v->co);
 	sub_v3_v3v3(v_next, l->v->co, l->next->v->co);
 
 	normalize_v3(v_prev);
 	normalize_v3(v_next);
+	add_v3_v3v3(dir, v_prev, v_next);
 
-	if (compare_v3v3(v_prev, v_next, FLT_EPSILON) == false) {
-		float dir[3];
+	if (compare_v3v3(v_prev, v_next, FLT_EPSILON * 10.0f) == false) {
 		float nor[3]; /* for this purpose doesn't need to be normalized */
-		add_v3_v3v3(dir, v_prev, v_next);
 		cross_v3_v3v3(nor, v_prev, v_next);
+		/* concave face check */
+		if (UNLIKELY(dot_v3v3(nor, l->f->no) < 0.0f)) {
+			negate_v3(nor);
+		}
 		cross_v3_v3v3(r_tangent, dir, nor);
 	}
 	else {
 		/* prev/next are the same - compare with face normal since we don't have one */
-		cross_v3_v3v3(r_tangent, v_next, l->f->no);
+		cross_v3_v3v3(r_tangent, dir, l->f->no);
 	}
 
 	normalize_v3(r_tangent);




More information about the Bf-blender-cvs mailing list