[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52444] trunk/blender/source/blender/ editors/transform/transform.c: fix [#29633] Mirror-Y also flips Z axis

Campbell Barton ideasman42 at gmail.com
Wed Nov 21 14:39:36 CET 2012


Revision: 52444
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52444
Author:   campbellbarton
Date:     2012-11-21 13:39:32 +0000 (Wed, 21 Nov 2012)
Log Message:
-----------
fix [#29633] Mirror-Y also flips Z axis
Was floating point precision error (FLT_EPSILON was too small).

Modified Paths:
--------------
    trunk/blender/source/blender/editors/transform/transform.c

Modified: trunk/blender/source/blender/editors/transform/transform.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform.c	2012-11-21 13:22:24 UTC (rev 52443)
+++ trunk/blender/source/blender/editors/transform/transform.c	2012-11-21 13:39:32 UTC (rev 52444)
@@ -2860,11 +2860,21 @@
 	(void)spos;
 }
 
-#define SIGN(a)     (a<-FLT_EPSILON ? 1 : a>FLT_EPSILON ? 2 : 3)
-#define VECSIGNFLIP(a, b) ((SIGN(a[0]) & SIGN(b[0])) == 0 || (SIGN(a[1]) & SIGN(b[1])) == 0 || (SIGN(a[2]) & SIGN(b[2])) == 0)
+/* FLT_EPSILON is too small [#29633], 0.0000001f starts to flip */
+#define TX_FLIP_EPS 0.00001f
+BLI_INLINE int tx_sign(const float a)
+{
+	return (a < -TX_FLIP_EPS ? 1 : a > TX_FLIP_EPS ? 2 : 3);
+}
+BLI_INLINE int tx_vec_sign_flip(const float a[3], const float b[3])
+{
+	return ((tx_sign(a[0]) & tx_sign(b[0])) == 0 ||
+	        (tx_sign(a[1]) & tx_sign(b[1])) == 0 ||
+	        (tx_sign(a[2]) & tx_sign(b[2])) == 0);
+}
 
 /* smat is reference matrix, only scaled */
-static void TransMat3ToSize(float mat[][3], float smat[][3], float *size)
+static void TransMat3ToSize(float mat[][3], float smat[][3], float size[3])
 {
 	float vec[3];
 	
@@ -2876,9 +2886,9 @@
 	size[2] = normalize_v3(vec);
 	
 	/* first tried with dotproduct... but the sign flip is crucial */
-	if (VECSIGNFLIP(mat[0], smat[0]) ) size[0] = -size[0];
-	if (VECSIGNFLIP(mat[1], smat[1]) ) size[1] = -size[1];
-	if (VECSIGNFLIP(mat[2], smat[2]) ) size[2] = -size[2];
+	if (tx_vec_sign_flip(mat[0], smat[0]) ) size[0] = -size[0];
+	if (tx_vec_sign_flip(mat[1], smat[1]) ) size[1] = -size[1];
+	if (tx_vec_sign_flip(mat[2], smat[2]) ) size[2] = -size[2];
 }
 
 




More information about the Bf-blender-cvs mailing list