Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/kernel/shaders/node_rgb_curves.osl')
-rw-r--r--intern/cycles/kernel/shaders/node_rgb_curves.osl25
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..0427c001f6d 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);
}