Fix T46915: Non-intuitive behavior of Vector Curve Mapping node

Vector mapping node was doing some weird mapping of both original and mapped
coordinates. Mapping of original coordinates was caused by the clamping nature
of the LUT generated from the node. Mapping of the mapped value again was quite
totally obscure -- one needed to constantly keep in mind that actual value will
be scaled up and moved down.

This commit makes it so values in the vector curve mapping are always absolute.
In fact, it is now behaving quite the same as RGB curve mapping node and the
code could be de-duplicated. Keeping the code duplicated for a bit so it's more
clear what exact parts of the node changed.

Reviewers: brecht

Subscribers: bassamk

Differential Revision: https://developer.blender.org/D1672
This commit is contained in:
Sergey Sharybin
2015-12-15 16:23:33 +05:00
parent 70fa2f69c9
commit c81e6ffdf9
8 changed files with 88 additions and 30 deletions

View File

@@ -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);
color 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);
}