diff options
Diffstat (limited to 'intern/cycles/kernel/shaders/node_vector_curves.osl')
-rw-r--r-- | intern/cycles/kernel/shaders/node_vector_curves.osl | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/intern/cycles/kernel/shaders/node_vector_curves.osl b/intern/cycles/kernel/shaders/node_vector_curves.osl index 7bbf97d95ea..4d4c28b57a2 100644 --- a/intern/cycles/kernel/shaders/node_vector_curves.osl +++ b/intern/cycles/kernel/shaders/node_vector_curves.osl @@ -19,7 +19,22 @@ float ramp_lookup(color ramp[RAMP_TABLE_SIZE], float at, int component) { - float f = clamp((at + 1.0) * 0.5, 0.0, 1.0) * (RAMP_TABLE_SIZE - 1); + if (at < 0.0 || at > 1.0) { + float t0, dy; + if (at < 0.0) { + t0 = ramp[0][component]; + dy = t0 - ramp[1][component]; + at = -at; + } + else { + t0 = ramp[RAMP_TABLE_SIZE - 1][component]; + dy = t0 - ramp[RAMP_TABLE_SIZE - 2][component]; + at = at - 1.0; + } + return t0 + dy * at * (RAMP_TABLE_SIZE - 1); + } + + float f = clamp(at, 0.0, 1.0) * (RAMP_TABLE_SIZE - 1); /* clamp int as well in case of NaN */ int i = (int)f; @@ -32,19 +47,23 @@ float ramp_lookup(color ramp[RAMP_TABLE_SIZE], float at, int component) if (t > 0.0) result = (1.0 - t) * result + t * ramp[i + 1][component]; - return result * 2.0 - 1.0; + return result; } shader node_vector_curves( color ramp[RAMP_TABLE_SIZE] = {0.0}, + float min_x = 0.0, + float max_x = 1.0, vector VectorIn = vector(0.0, 0.0, 0.0), float Fac = 0.0, output vector VectorOut = vector(0.0, 0.0, 0.0)) { - VectorOut[0] = ramp_lookup(ramp, VectorIn[0], 0); - VectorOut[1] = ramp_lookup(ramp, VectorIn[1], 1); - VectorOut[2] = ramp_lookup(ramp, VectorIn[2], 2); + vector c = (VectorIn - vector(min_x, min_x, min_x)) / (max_x - min_x); + + VectorOut[0] = ramp_lookup(ramp, c[0], 0); + VectorOut[1] = ramp_lookup(ramp, c[1], 1); + VectorOut[2] = ramp_lookup(ramp, c[2], 2); VectorOut = mix(VectorIn, VectorOut, Fac); } |