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);
                }


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to