[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44599] trunk/blender/source/blender/ editors/space_view3d/view3d_buttons.c: Fix [#30419] Median wrongly setting lattice vertex weights.

Bastien Montagne montagne29 at wanadoo.fr
Fri Mar 2 11:30:31 CET 2012


Revision: 44599
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44599
Author:   mont29
Date:     2012-03-02 10:30:11 +0000 (Fri, 02 Mar 2012)
Log Message:
-----------
Fix [#30419] Median wrongly setting lattice vertex weights.

In fact, the same bug affected curves' weights too. Now using the same method as for setting mesh edges' crease and bevel weights. Also factorized/simplified that part of code by defining a new utility func computing the scale factor.

Also greatly simplified UI code in same v3d_editvertex_buts() function, was really over-complicated (this fixes btw a few minor UI bugs in the transform editmode panel, like missing tips, etc.).

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c	2012-03-02 04:33:41 UTC (rev 44598)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c	2012-03-02 10:30:11 UTC (rev 44599)
@@ -131,7 +131,37 @@
 	float *defweightp;
 } TransformProperties;
 
+/* Helper function to compute a median changed value,
+ * when the value should be clamped in [0.0, 1.0].
+ * Returns either 0.0, 1.0 (both can be applied directly), a positive scale factor
+ * for scale down, or a negative one for scale up.
+ */
+static float compute_scale_factor(const float ve_median, const float median)
+{
+	if (ve_median <= 0.0f)
+		return 0.0f;
+	else if (ve_median >= 1.0f)
+		return 1.0f;
+	else {
+		/* Scale value to target median. */
+		float median_new = ve_median;
+		float median_orig = ve_median - median; /* Previous median value. */
 
+		/* In case of floating point error. */
+		CLAMP(median_orig, 0.0f, 1.0f);
+		CLAMP(median_new, 0.0f, 1.0f);
+
+		if (median_new <= median_orig) {
+			/* Scale down. */
+			return median_new / median_orig;
+		}
+		else {
+			/* Scale up, negative to indicate it... */
+			return -(1.0f - median_new) / (1.0f - median_orig);
+		}
+	}
+}
+
 /* is used for both read and write... */
 static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float lim)
 {
@@ -312,80 +342,47 @@
 		uiBut *but;
 
 		memcpy(tfp->ve_median, median, sizeof(tfp->ve_median));
-		
+
 		uiBlockBeginAlign(block);
 		if (tot==1) {
 			uiDefBut(block, LABEL, 0, "Vertex:",					0, 150, 200, 20, NULL, 0, 0, 0, 0, "");
-			uiBlockBeginAlign(block);
-
-			but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:",		0, 130, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
-			uiButSetUnitType(but, PROP_UNIT_LENGTH);
-			but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:",		0, 110, 200, 20, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
-			uiButSetUnitType(but, PROP_UNIT_LENGTH);
-			but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:",		0, 90, 200, 20, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
-			uiButSetUnitType(but, PROP_UNIT_LENGTH);
-
-			if (totw==1) {
-				uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:",	0, 70, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 1, 3, "");
-				uiBlockBeginAlign(block);
-				uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global",		0, 45, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
-				uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, "Local",		100, 45, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays local values");
-				uiBlockEndAlign(block);
-				if (totweight)
-					uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:",	0, 20, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 1, 3, "");
-				if (totradius) {
-					if (totradius==1) uiDefButR(block, NUM, 0, "Radius", 0, 20, 200, 20, &radius_ptr, "radius", 0, 0.0, 100.0, 10, 3, NULL);
-					else uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:",	0, 20, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 1, 3, "Radius of curve CPs");
-				}
-			}
-			else {
-				uiBlockBeginAlign(block);
-				uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global",		0, 65, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
-				uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, "Local",		100, 65, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays local values");
-				uiBlockEndAlign(block);
-				if (totweight)
-					uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:",	0, 40, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "");
-				if (totradius) {
-					if (totradius==1) uiDefButR(block, NUM, 0, "Radius", 0, 40, 200, 20, &radius_ptr, "radius", 0, 0.0, 100.0, 10, 3, NULL);
-					else uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:",	0, 40, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs");
-				}
-			}
 		}
 		else {
 			uiDefBut(block, LABEL, 0, "Median:",					0, 150, 200, 20, NULL, 0, 0, 0, 0, "");
-			uiBlockBeginAlign(block);
-			but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:",		0, 130, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
-			uiButSetUnitType(but, PROP_UNIT_LENGTH);
-			but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:",		0, 110, 200, 20, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
-			uiButSetUnitType(but, PROP_UNIT_LENGTH);
-			but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:",		0, 90, 200, 20, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
-			uiButSetUnitType(but, PROP_UNIT_LENGTH);
-			if (totw==tot) {
-				uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:",	0, 70, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 1, 3, "");
-				uiBlockEndAlign(block);
-				uiBlockBeginAlign(block);
-				uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global",		0, 45, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
-				uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, "Local",		100, 45, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays local values");
-				uiBlockEndAlign(block);
-				if (totweight)
-					uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:",	0, 20, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "Weight is used for SoftBody Goal");
-				if (totradius)
-					uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:",	0, 20, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs");
-				uiBlockEndAlign(block);
-			}
-			else {
-				uiBlockBeginAlign(block);
-				uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global",		0, 65, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
-				uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, "Local",		100, 65, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays local values");
-				uiBlockEndAlign(block);
-				if (totweight)
-					uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:",	0, 40, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 1, 3, "Weight is used for SoftBody Goal");
-				if (totradius)
-					uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:",	0, 20, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 1, 3, "Radius of curve CPs");
-				uiBlockEndAlign(block);
-			}
 		}
 
+		uiBlockBeginAlign(block);
+
+		but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:",		0, 130, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
+		uiButSetUnitType(but, PROP_UNIT_LENGTH);
+		but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:",		0, 110, 200, 20, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
+		uiButSetUnitType(but, PROP_UNIT_LENGTH);
+		but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:",		0, 90, 200, 20, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
+		uiButSetUnitType(but, PROP_UNIT_LENGTH);
+
+		if (totw==tot) {
+			uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:",	0, 70, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 1, 3, "");
+		}
+
+		uiBlockBeginAlign(block);
+		uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global",		0, 65, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
+		uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, "Local",		100, 65, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays local values");
+		uiBlockEndAlign(block);
+
+		if (totweight == 1) {
+			uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:",	0, 40, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 1, 3, "Weight is used for SoftBody Goal");
+		}
+		else if (totweight > 1) {
+			uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Mean Weight:",	0, 40, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 1, 3, "Weight is used for SoftBody Goal");
+		}
+
+		if (totradius == 1) {
+			uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:",	0, 20, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 1, 3, "Radius of curve CPs");
+		}
+		else if (totradius > 1) {
+			uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Mean Radius:",	0, 20, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 1, 3, "Radius of curve CPs");
+		}
+
 		if (totedge==1) {
 			uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Crease:",	0, 40, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 1, 3, "");
 			uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Bevel Weight:",	0, 20, 200, 20, &(tfp->ve_median[6]), 0.0, 1.0, 1, 3, "");
@@ -395,6 +392,9 @@
 			uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Mean Bevel Weight:",	0, 20, 200, 20, &(tfp->ve_median[6]), 0.0, 1.0, 1, 3, "");
 		}
 
+		uiBlockEndAlign(block);
+		uiBlockEndAlign(block);
+
 	}
 	else {	// apply
 		memcpy(ve_median, tfp->ve_median, sizeof(tfp->ve_median));
@@ -430,56 +430,37 @@
 			
 			if (median[3] != 0.0f) {
 				BMEdge *eed;
-				const float fixed_crease= (ve_median[3] <= 0.0f ? 0.0f : (ve_median[3] >= 1.0f ? 1.0f : FLT_MAX));
-				
-				if (fixed_crease != FLT_MAX) {
-					/* simple case */
+				const float sca = compute_scale_factor(ve_median[3], median[3]);
 
+				if (ELEM(sca, 0.0f, 1.0f)) {
 					BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
 						if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
 							float *crease = (float *)CustomData_bmesh_get(&bm->edata, eed->head.data, CD_CREASE);
-							if (!crease) break;
-							
-							*crease= fixed_crease;
+							if (!crease)
+								break;
+							*crease = sca;
 						}
 					}
 				}
-				else {
-					/* scale crease to target median */
-					float median_new= ve_median[3];
-					float median_orig= ve_median[3] - median[3]; /* previous median value */
-
-					/* incase of floating point error */
-					CLAMP(median_orig, 0.0f, 1.0f);
-					CLAMP(median_new, 0.0f, 1.0f);
-
-					if (median_new < median_orig) {
-						/* scale down */
-						const float sca= median_new / median_orig;
-						
-						BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
-							if (BM_elem_flag_test(eed, BM_ELEM_SELECT) && !BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
-								float *crease = (float *)CustomData_bmesh_get(&bm->edata, eed->head.data, CD_CREASE);
-								
-								if (!crease) break;
-								
-								*crease *= sca;
-								CLAMP(*crease, 0.0f, 1.0f);
-							}
+				else if (sca > 0.0f) {
+					BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+						if (BM_elem_flag_test(eed, BM_ELEM_SELECT) && !BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+							float *crease = (float *)CustomData_bmesh_get(&bm->edata, eed->head.data, CD_CREASE);
+							if (!crease)
+								break;
+							*crease *= sca;
+							CLAMP(*crease, 0.0f, 1.0f);
 						}
 					}
-					else {
-						/* scale up */
-						const float sca= (1.0f - median_new) / (1.0f - median_orig);
-
-						BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list