Commit: 9a5d74a998005299b120b5dfa1f2ff2232b90e50
Author: Campbell Barton
Date:   Fri Oct 16 14:45:05 2015 +1100
Branches: blender-v2.76-release
https://developer.blender.org/rB9a5d74a998005299b120b5dfa1f2ff2232b90e50

Fix T46503: Snap scale fails using corner pivot

===================================================================

M       source/blender/editors/transform/transform_snap.c

===================================================================

diff --git a/source/blender/editors/transform/transform_snap.c 
b/source/blender/editors/transform/transform_snap.c
index 6075261..8e429ee 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -85,6 +85,8 @@
 
 #define TRANSFORM_DIST_MAX_PX 1000.0f
 #define TRANSFORM_SNAP_MAX_PX 100.0f
+#define TRANSFORM_DIST_INVALID NAN_FLT
+
 /* use half of flt-max so we can scale up without an exception */
 
 /********************* PROTOTYPES ***********************/
@@ -897,7 +899,10 @@ static float ResizeBetween(TransInfo *t, const float 
p1[3], const float p2[3])
        
        len_d1 = len_v3(d1);
 
-       return len_d1 != 0.0f ? len_v3(d2) / len_d1 : 1;
+       /* Use 'invalid' dist when `center == p1` (after projecting),
+        * in this case scale will _never_ move the point in relation to the 
center,
+        * so it makes no sense to take it into account when scaling. see: 
T46503 */
+       return len_d1 != 0.0f ? len_v3(d2) / len_d1 : TRANSFORM_DIST_INVALID;
 }
 
 /********************** CALC **************************/
@@ -1177,8 +1182,10 @@ static void TargetSnapClosest(TransInfo *t)
                                                mul_m4_v3(td->ext->obmat, loc);
                                                
                                                dist = t->tsnap.distance(t, 
loc, t->tsnap.snapPoint);
-                                               
-                                               if (closest == NULL || 
fabsf(dist) < fabsf(t->tsnap.dist)) {
+
+                                               if ((dist != 
TRANSFORM_DIST_INVALID) &&
+                                                   (closest == NULL || 
fabsf(dist) < fabsf(t->tsnap.dist)))
+                                               {
                                                        
copy_v3_v3(t->tsnap.snapTarget, loc);
                                                        closest = td;
                                                        t->tsnap.dist = dist; 
@@ -1193,8 +1200,10 @@ static void TargetSnapClosest(TransInfo *t)
                                        copy_v3_v3(loc, td->center);
                                        
                                        dist = t->tsnap.distance(t, loc, 
t->tsnap.snapPoint);
-                                       
-                                       if (closest == NULL || fabsf(dist) < 
fabsf(t->tsnap.dist)) {
+
+                                       if ((dist != TRANSFORM_DIST_INVALID) &&
+                                           (closest == NULL || fabsf(dist) < 
fabsf(t->tsnap.dist)))
+                                       {
                                                copy_v3_v3(t->tsnap.snapTarget, 
loc);
                                                closest = td;
                                                t->tsnap.dist = dist; 
@@ -1217,7 +1226,9 @@ static void TargetSnapClosest(TransInfo *t)
                                
                                dist = t->tsnap.distance(t, loc, 
t->tsnap.snapPoint);
                                
-                               if (closest == NULL || fabsf(dist) < 
fabsf(t->tsnap.dist)) {
+                               if ((dist != TRANSFORM_DIST_INVALID) &&
+                                   (closest == NULL || fabsf(dist) < 
fabsf(t->tsnap.dist)))
+                               {
                                        copy_v3_v3(t->tsnap.snapTarget, loc);
                                        closest = td;
                                        t->tsnap.dist = dist;

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

Reply via email to