[Bf-blender-cvs] [2f35217] master: Fix T46503: Snap scale fails using corner pivot

Campbell Barton noreply at git.blender.org
Fri Oct 16 06:06:54 CEST 2015


Commit: 2f35217849c82af87e35a0916e7d70d0d8e2dbaf
Author: Campbell Barton
Date:   Fri Oct 16 14:45:05 2015 +1100
Branches: master
https://developer.blender.org/rB2f35217849c82af87e35a0916e7d70d0d8e2dbaf

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 5230c39..0e954d4 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;




More information about the Bf-blender-cvs mailing list