[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52928] trunk/blender/source/blender/ editors/transform/transform_conversions.c: fix [#33489] Scaling normals with Alt (maintains shell thickness) producing wrong result.

Campbell Barton ideasman42 at gmail.com
Wed Dec 12 15:34:22 CET 2012


Revision: 52928
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52928
Author:   campbellbarton
Date:     2012-12-12 14:34:21 +0000 (Wed, 12 Dec 2012)
Log Message:
-----------
fix [#33489] Scaling normals with Alt (maintains shell thickness) producing wrong result.

not exactly a bug - zero area faces from a cancelled extrude gave issues - but this is a common use case, so make it work by only using selected faces when calculating the vertex shell thickness.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/transform/transform_conversions.c

Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c	2012-12-12 12:57:27 UTC (rev 52927)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c	2012-12-12 14:34:21 UTC (rev 52928)
@@ -1879,6 +1879,40 @@
 	}
 }
 
+/* local version of #BM_vert_calc_shell_factor which only
+ * uses selected faces */
+static float bm_vert_calc_shell_factor_selected(BMVert *v)
+{
+	BMIter iter;
+	BMLoop *l;
+	float accum_shell = 0.0f;
+	float accum_angle = 0.0f;
+	int tot_sel = 0, tot = 0;
+
+	BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
+		if (BM_elem_flag_test(l->f, BM_ELEM_SELECT)) {  /* <-- only difference to BM_vert_calc_shell_factor! */
+			const float face_angle = BM_loop_calc_face_angle(l);
+			accum_shell += shell_angle_to_dist(angle_normalized_v3v3(v->no, l->f->no)) * face_angle;
+			accum_angle += face_angle;
+			tot_sel++;
+		}
+		tot++;
+	}
+
+	if (accum_angle != 0.0f) {
+		return accum_shell / accum_angle;
+	}
+	else {
+		if (tot != 0 && tot_sel == 0) {
+			/* none selected, so use all */
+			return BM_vert_calc_shell_factor(v);
+		}
+		else {
+			return 1.0f;
+		}
+	}
+}
+
 /* way to overwrite what data is edited with transform */
 static void VertsToTransData(TransInfo *t, TransData *td, TransDataExtension *tx,
                              BMEditMesh *em, BMVert *eve, float *bweight)
@@ -1927,7 +1961,7 @@
 	}
 	else if (t->mode == TFM_SHRINKFATTEN) {
 		td->ext = tx;
-		tx->isize[0] = BM_vert_calc_shell_factor(eve);
+		tx->isize[0] = bm_vert_calc_shell_factor_selected(eve);
 	}
 }
 




More information about the Bf-blender-cvs mailing list