diff options
author | Ton Roosendaal <ton@blender.org> | 2012-11-05 17:43:02 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2012-11-05 17:43:02 +0400 |
commit | 6ee3bf5300cb345a02563a4137c8b0e651b2a564 (patch) | |
tree | d23488d9f63b3eae830909713729b143cc3621b1 /source/blender/nodes | |
parent | cf30cb2cff9c45a2562e5ad3619fe3631e9dd076 (diff) |
Bugfix #33087
Shader nodes (Blender Internal), Math node Power() didn't accept negative
values for input. Added same code as for compositor case - only allow to
raise with integer values for negatives.
Diffstat (limited to 'source/blender/nodes')
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_math.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/source/blender/nodes/shader/nodes/node_shader_math.c b/source/blender/nodes/shader/nodes/node_shader_math.c index a70134b2325..f4e0faf2110 100644 --- a/source/blender/nodes/shader/nodes/node_shader_math.c +++ b/source/blender/nodes/shader/nodes/node_shader_math.c @@ -137,11 +137,22 @@ bNodeStack **out) break; case 10: /* Power */ { - /* Don't want any imaginary numbers... */ - if ( in[0]->vec[0] >= 0 ) + /* Only raise negative numbers by full integers */ + if ( in[0]->vec[0] >= 0 ) { out[0]->vec[0] = pow(in[0]->vec[0], in[1]->vec[0]); - else - out[0]->vec[0] = 0.0; + } + else { + float y_mod_1 = fmod(in[1]->vec[0], 1); + + /* if input value is not nearly an integer, fall back to zero, nicer than straight rounding */ + if (y_mod_1 > 0.999f || y_mod_1 < 0.001f) { + out[0]->vec[0] = powf(in[0]->vec[0], floorf(in[1]->vec[0] + 0.5f)); + } + else { + out[0]->vec[0] = 0.0f; + } + } + } break; case 11: /* Logarithm */ |