diff options
Diffstat (limited to 'intern/cycles/kernel/shaders/node_rgb_curves.osl')
-rw-r--r-- | intern/cycles/kernel/shaders/node_rgb_curves.osl | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/intern/cycles/kernel/shaders/node_rgb_curves.osl b/intern/cycles/kernel/shaders/node_rgb_curves.osl index 60cb273ba98..fc93dbd044b 100644 --- a/intern/cycles/kernel/shaders/node_rgb_curves.osl +++ b/intern/cycles/kernel/shaders/node_rgb_curves.osl @@ -19,6 +19,21 @@ float ramp_lookup(color ramp[RAMP_TABLE_SIZE], float at, int component) { + 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 */ @@ -37,14 +52,18 @@ float ramp_lookup(color ramp[RAMP_TABLE_SIZE], float at, int component) shader node_rgb_curves( color ramp[RAMP_TABLE_SIZE] = {0.0}, + float min_x = 0.0, + float max_x = 1.0, color ColorIn = 0.0, float Fac = 0.0, output color ColorOut = 0.0) { - ColorOut[0] = ramp_lookup(ramp, ColorIn[0], 0); - ColorOut[1] = ramp_lookup(ramp, ColorIn[1], 1); - ColorOut[2] = ramp_lookup(ramp, ColorIn[2], 2); + color c = (ColorIn - color(min_x, min_x, min_x)) / (max_x - min_x); + + ColorOut[0] = ramp_lookup(ramp, c[0], 0); + ColorOut[1] = ramp_lookup(ramp, c[1], 1); + ColorOut[2] = ramp_lookup(ramp, c[2], 2); ColorOut = mix(ColorIn, ColorOut, Fac); } |