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_vector_curves.osl')
-rw-r--r--intern/cycles/kernel/shaders/node_vector_curves.osl29
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);
}