Merging r59182 through r59257 from trunk into soc-2013-depsgraph_mt
[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[RAMP_TABLE_SIZE], float at, int component)
21 {
22         float f = clamp((at + 1.0) * 0.5, 0.0, 1.0) * (RAMP_TABLE_SIZE - 1);
23
24         /* clamp int as well in case of NaN */
25         int i = (int)f;
26         if (i < 0) i = 0;
27         if (i >= RAMP_TABLE_SIZE) i = RAMP_TABLE_SIZE - 1;
28         float t = f - (float)i;
29
30         float result = ramp[i][component];
31
32         if (t > 0.0)
33                 result = (1.0 - t) * result + t * ramp[i + 1][component];
34         
35         return result * 2.0 - 1.0;
36 }
37
38 shader node_vector_curves(
39         color ramp[RAMP_TABLE_SIZE] = {0.0},
40
41         vector VectorIn = vector(0.0, 0.0, 0.0),
42         float Fac = 0.0,
43         output vector VectorOut = vector(0.0, 0.0, 0.0))
44 {
45         VectorOut[0] = ramp_lookup(ramp, VectorIn[0], 0);
46         VectorOut[1] = ramp_lookup(ramp, VectorIn[1], 1);
47         VectorOut[2] = ramp_lookup(ramp, VectorIn[2], 2);
48
49         VectorOut = mix(VectorIn, VectorOut, Fac);
50 }
51