
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
71 lines
1.8 KiB
Plaintext
71 lines
1.8 KiB
Plaintext
/*
|
|
* Copyright 2011-2013 Blender Foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "stdosl.h"
|
|
#include "oslutil.h"
|
|
|
|
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 */
|
|
int i = (int)f;
|
|
if (i < 0) i = 0;
|
|
if (i >= RAMP_TABLE_SIZE) i = RAMP_TABLE_SIZE - 1;
|
|
float t = f - (float)i;
|
|
|
|
float result = ramp[i][component];
|
|
|
|
if (t > 0.0)
|
|
result = (1.0 - t) * result + t * ramp[i + 1][component];
|
|
|
|
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))
|
|
{
|
|
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);
|
|
}
|
|
|