diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-09-25 15:30:46 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-09-25 15:30:46 +0400 |
commit | 0d3f0ff08e2066de33165fa3153fd081fc394aaa (patch) | |
tree | 7e2a35a4d78b811c464a0df6e48a75963595f1b1 /source/blender | |
parent | d305a64b69a6181dfde1f7cc14c6b9d579140da0 (diff) |
Fix #23901: displace node not working with negative values.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenlib/BLI_math_base.h | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_base_inline.c | 5 | ||||
-rw-r--r-- | source/blender/nodes/intern/CMP_nodes/CMP_displace.c | 11 |
3 files changed, 14 insertions, 4 deletions
diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h index bb20cb7c8e1..48ad46282c2 100644 --- a/source/blender/blenlib/BLI_math_base.h +++ b/source/blender/blenlib/BLI_math_base.h @@ -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); diff --git a/source/blender/blenlib/intern/math_base_inline.c b/source/blender/blenlib/intern/math_base_inline.c index b364ff73e4f..fc413457122 100644 --- a/source/blender/blenlib/intern/math_base_inline.c +++ b/source/blender/blenlib/intern/math_base_inline.c @@ -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 */ diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c index 7d64d4e719c..aa7fac81c2c 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c @@ -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); |