[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33679] trunk/blender/source/blender/ editors/space_view3d/view3d_buttons.c: fix for annoyance found when looking into bug [#25226].

Campbell Barton ideasman42 at gmail.com
Wed Dec 15 08:15:53 CET 2010


Revision: 33679
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33679
Author:   campbellbarton
Date:     2010-12-15 08:15:51 +0100 (Wed, 15 Dec 2010)

Log Message:
-----------
fix for annoyance found when looking into bug [#25226].

Changing the edge crease median value often wouldn't result in the median value entered because of clamping from 0-1.
Now the median crease is applied by scaling the values up/down.

also add some simple checks to speed up updates,
- don't move verts or recalculate normals if only crease changes.
- don't apply crease changes if location is being edited.

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	2010-12-15 06:12:16 UTC (rev 33678)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c	2010-12-15 07:15:51 UTC (rev 33679)
@@ -381,30 +381,66 @@
 		if(ob->type==OB_MESH) {
 			Mesh *me= ob->data;
 			EditMesh *em = BKE_mesh_get_editmesh(me);
-			EditVert *eve;
-			EditEdge *eed;
-			
-			eve= em->verts.first;
-			while(eve) {
-				if(eve->f & SELECT) {
-					add_v3_v3(eve->co, median);
+
+			/* allow for some rounding error becasue of matrix transform */
+			if(len_v3(median) > 0.000001) {
+				EditVert *eve;
+
+				for(eve= em->verts.first; eve; eve= eve->next) {
+					if(eve->f & SELECT) {
+						add_v3_v3(eve->co, median);
+					}
 				}
-				eve= eve->next;
+
+				recalc_editnormals(em);
 			}
-			
-			for(eed= em->edges.first; eed; eed= eed->next) {
-				if(eed->f & SELECT) {
-					/* ensure the median can be set to zero or one */
-					if(ve_median[3]==0.0f) eed->crease= 0.0f;
-					else if(ve_median[3]==1.0f) eed->crease= 1.0f;
+
+			if(median[3] != 0.0f) {
+				EditEdge *eed;
+				const float fixed_crease= (ve_median[3] <= 0.0f ? 0.0 : (ve_median[3] >= 1.0f ? 1.0 : FLT_MAX));
+				
+				if(fixed_crease != FLT_MAX) {
+					/* simple case */
+
+					for(eed= em->edges.first; eed; eed= eed->next) {
+						if(eed->f & SELECT) {
+							eed->crease= fixed_crease;
+						}
+					}
+				}
+				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.0, 1.0);
+					CLAMP(median_new, 0.0, 1.0);
+
+					if(median_new < median_orig) {
+						/* scale down */
+						const float sca= median_new / median_orig;
+						
+						for(eed= em->edges.first; eed; eed= eed->next) {
+							if(eed->f & SELECT) {
+								eed->crease *= sca;
+								CLAMP(eed->crease, 0.0, 1.0);
+							}
+						}
+					}
 					else {
-						eed->crease+= median[3];
-						CLAMP(eed->crease, 0.0, 1.0);
+						/* scale up */
+						const float sca= (1.0f - median_new) / (1.0f - median_orig);
+
+						for(eed= em->edges.first; eed; eed= eed->next) {
+							if(eed->f & SELECT) {
+								eed->crease = 1.0f - ((1.0f - eed->crease) * sca);
+								CLAMP(eed->crease, 0.0, 1.0);
+							}
+						}
 					}
 				}
 			}
-			
-			recalc_editnormals(em);
 
 			BKE_mesh_end_editmesh(me, em);
 		}





More information about the Bf-blender-cvs mailing list