cff4efe1d984685577a20fc831b8561083050191
[blender.git] / intern / cycles / kernel / shaders / node_vector_curves.osl
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "stdosl.h"
18 #include "oslutil.h"
19
20 float ramp_lookup(color ramp[], float at, int component)
21 {
22         int table_size = arraylength(ramp);
23
24         if (at < 0.0 || at > 1.0) {
25                 float t0, dy;
26                 if (at < 0.0) {
27                         t0 = ramp[0][component];
28                         dy = t0 - ramp[1][component];
29                         at = -at;
30                 }
31                 else {
32                         t0 = ramp[table_size - 1][component];
33                         dy = t0 - ramp[table_size - 2][component];
34                         at = at - 1.0;
35                 }
36                 return t0 + dy * at * (table_size - 1);
37         }
38
39         float f = clamp(at, 0.0, 1.0) * (table_size - 1);
40
41         /* clamp int as well in case of NaN */
42         int i = (int)f;
43         if (i < 0) i = 0;
44         if (i >= table_size) i = table_size - 1;
45         float t = f - (float)i;
46
47         float result = ramp[i][component];
48
49         if (t > 0.0)
50                 result = (1.0 - t) * result + t * ramp[i + 1][component];
51         
52         return result;
53 }
54
55 shader node_vector_curves(
56         color ramp[] = {0.0},
57         float min_x = 0.0,
58         float max_x = 1.0,
59
60         vector VectorIn = vector(0.0, 0.0, 0.0),
61         float Fac = 0.0,
62         output vector VectorOut = vector(0.0, 0.0, 0.0))
63 {
64         vector c = (VectorIn - vector(min_x, min_x, min_x)) / (max_x - min_x);
65
66         VectorOut[0] = ramp_lookup(ramp, c[0], 0);
67         VectorOut[1] = ramp_lookup(ramp, c[1], 1);
68         VectorOut[2] = ramp_lookup(ramp, c[2], 2);
69
70         VectorOut = mix(VectorIn, VectorOut, Fac);
71 }
72