[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52693] trunk/blender/source/blender/bmesh /tools/bmesh_bevel.c: Bevel: fix spike in suzanne, bug 33354.

Howard Trickey howard.trickey at gmail.com
Sat Dec 1 04:27:02 CET 2012


Revision: 52693
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52693
Author:   howardt
Date:     2012-12-01 03:26:57 +0000 (Sat, 01 Dec 2012)
Log Message:
-----------
Bevel: fix spike in suzanne, bug 33354.
Non-planar faces made some of the meet point code not work well,
so now calculate local face norms.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c	2012-12-01 02:47:59 UTC (rev 52692)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c	2012-12-01 03:26:57 UTC (rev 52693)
@@ -375,8 +375,9 @@
 static void offset_in_two_planes(EdgeHalf *e1, EdgeHalf *e2, EdgeHalf *emid,
                                  BMVert *v, BMFace *f1, BMFace *f2, float meetco[3])
 {
-	float dir1[3], dir2[3], norm_perp1[3], norm_perp2[3],
-	      off1a[3], off1b[3], off2a[3], off2b[3], isect2[3], co[3];
+	float dir1[3], dir2[3], dirmid[3], norm_perp1[3], norm_perp2[3],
+	      off1a[3], off1b[3], off2a[3], off2b[3], isect2[3], co[3],
+	      f1no[3], f2no[3];
 	int iret;
 
 	BLI_assert(f1 != NULL && f2 != NULL);
@@ -384,17 +385,21 @@
 	/* get direction vectors for two offset lines */
 	sub_v3_v3v3(dir1, v->co, BM_edge_other_vert(e1->e, v)->co);
 	sub_v3_v3v3(dir2, BM_edge_other_vert(e2->e, v)->co, v->co);
+	sub_v3_v3v3(dirmid, BM_edge_other_vert(emid->e, v)->co, v->co);
 
 	/* get directions into offset planes */
-	cross_v3_v3v3(norm_perp1, dir1, f1->no);
+	/* calculate face normals at corner in case faces are nonplanar */
+	cross_v3_v3v3(f1no, dirmid, dir1);
+	cross_v3_v3v3(f2no, dirmid, dir2);
+	cross_v3_v3v3(norm_perp1, dir1, f1no);
 	normalize_v3(norm_perp1);
-	cross_v3_v3v3(norm_perp2, dir2, f2->no);
+	cross_v3_v3v3(norm_perp2, dir2, f2no);
 	normalize_v3(norm_perp2);
 
 	/* get points that are offset distances from each line, then another point on each line */
 	copy_v3_v3(off1a, v->co);
 	madd_v3_v3fl(off1a, norm_perp1, e1->offset);
-	add_v3_v3v3(off1b, off1a, dir1);
+	sub_v3_v3v3(off1b, off1a, dir1);
 	copy_v3_v3(off2a, v->co);
 	madd_v3_v3fl(off2a, norm_perp2, e2->offset);
 	add_v3_v3v3(off2b, off2a, dir2);
@@ -404,7 +409,7 @@
 		copy_v3_v3(meetco, off1a);
 	}
 	else {
-		iret =isect_line_line_v3(off1a, off1b, off2a, off2b, meetco, isect2);
+		iret = isect_line_line_v3(off1a, off1b, off2a, off2b, meetco, isect2);
 		if (iret == 0) {
 			/* lines colinear: another test says they are parallel. so shouldn't happen */
 			copy_v3_v3(meetco, off1a);




More information about the Bf-blender-cvs mailing list