Fix #23901: displace node not working with negative values.
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Sat, 25 Sep 2010 11:30:46 +0000 (11:30 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Sat, 25 Sep 2010 11:30:46 +0000 (11:30 +0000)
source/blender/blenlib/BLI_math_base.h
source/blender/blenlib/intern/math_base_inline.c
source/blender/nodes/intern/CMP_nodes/CMP_displace.c

index bb20cb7..48ad462 100644 (file)
@@ -155,6 +155,8 @@ MINLINE float interpf(float a, float b, float t);
 MINLINE float minf(float a, float b);
 MINLINE float maxf(float a, float b);
 
+MINLINE float signf(float f);
+
 MINLINE float power_of_2(float f);
 
 MINLINE float shell_angle_to_dist(float angle);
index b364ff7..fc41345 100644 (file)
@@ -122,5 +122,10 @@ MINLINE float maxf(float a, float b)
        return (a > b)? a: b;
 }
 
+MINLINE float signf(float f)
+{
+       return (f < 0.f)? -1.f: 1.f;
+}
+
 #endif /* BLI_MATH_BASE_INLINE */
 
index 7d64d4e..aa7fac8 100644 (file)
@@ -83,7 +83,7 @@ static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float
                        p_dy = vec[1] * ys;
                        
                        /* if no displacement, then just copy this pixel */
-                       if (p_dx < DISPLACE_EPSILON && p_dy < DISPLACE_EPSILON) {
+                       if (fabsf(p_dx) < DISPLACE_EPSILON && fabsf(p_dy) < DISPLACE_EPSILON) {
                                qd_getPixel(cbuf, x-cbuf->xof, y-cbuf->yof, col);
                                qd_setPixel(stackbuf, x, y, col);
                                continue;
@@ -99,10 +99,13 @@ static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float
                        qd_getPixel(vecbuf, x-vecbuf->xof, y-vecbuf->yof+1, vecdy);
                        d_dx = vecdx[0] * xs;
                        d_dy = vecdy[0] * ys;
-                       
+
                        /* clamp derivatives to minimum displacement distance in UV space */
-                       dxt = MAX2(p_dx - d_dx, DISPLACE_EPSILON)/(float)stackbuf->x;
-                       dyt = MAX2(p_dy - d_dy, DISPLACE_EPSILON)/(float)stackbuf->y;
+                       dxt = p_dx - d_dx;
+                       dyt = p_dy - d_dy;
+
+                       dxt = signf(dxt)*maxf(fabsf(dxt), DISPLACE_EPSILON)/(float)stackbuf->x;
+                       dyt = signf(dyt)*maxf(fabsf(dyt), DISPLACE_EPSILON)/(float)stackbuf->y;
                        
                        ibuf_sample(ibuf, u, v, dxt, dyt, col);
                        qd_setPixel(stackbuf, x, y, col);