Cycles: constant folding for RGB/Vector Curves and Color Ramp.
[blender.git] / intern / cycles / kernel / shaders / node_bump.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
19 /* "Bump Mapping Unparameterized Surfaces on the GPU"
20  * Morten S. Mikkelsen, 2010 */
21
22 surface node_bump(
23         int invert = 0,
24         normal NormalIn = N,
25         float Strength = 0.1,
26         float Distance = 1.0,
27         float SampleCenter = 0.0,
28         float SampleX = 0.0,
29         float SampleY = 0.0,
30         output normal NormalOut = N)
31 {
32         /* get surface tangents from normal */
33         vector dPdx = Dx(P);
34         vector dPdy = Dy(P);
35
36         vector Rx = cross(dPdy, NormalIn);
37         vector Ry = cross(NormalIn, dPdx);
38
39         /* compute surface gradient and determinant */
40         float det = dot(dPdx, Rx);
41         vector surfgrad = (SampleX - SampleCenter) * Rx + (SampleY - SampleCenter) * Ry;
42
43         float absdet = fabs(det);
44
45         float strength = max(Strength, 0.0);
46         float dist = Distance;
47
48         if (invert)
49                 dist *= -1.0;
50         
51         /* compute and output perturbed normal */
52         NormalOut = normalize(absdet * NormalIn - dist * sign(det) * surfgrad);
53         NormalOut = normalize(strength * NormalOut + (1.0 - strength) * NormalIn);
54 }
55