Cycles: constant folding for RGB/Vector Curves and Color Ramp.
[blender.git] / intern / cycles / kernel / shaders / node_geometry.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 shader node_geometry(
20         normal NormalIn = N,
21         string bump_offset = "center",
22
23         output point Position = point(0.0, 0.0, 0.0),
24         output normal Normal = normal(0.0, 0.0, 0.0),
25         output normal Tangent = normal(0.0, 0.0, 0.0),
26         output normal TrueNormal = normal(0.0, 0.0, 0.0),
27         output vector Incoming = vector(0.0, 0.0, 0.0),
28         output point Parametric = point(0.0, 0.0, 0.0),
29         output float Backfacing = 0.0,
30         output float Pointiness = 0.0)
31 {
32         Position = P;
33         Normal = NormalIn;
34         TrueNormal = Ng;
35         Incoming = I;
36         Parametric = point(u, v, 0.0);
37         Backfacing = backfacing();
38
39         if (bump_offset == "dx") {
40                 Position += Dx(Position);
41                 Parametric += Dx(Parametric);
42         }
43         else if (bump_offset == "dy") {
44                 Position += Dy(Position);
45                 Parametric += Dy(Parametric);
46         }
47
48         /* first try to get tangent attribute */
49         point generated;
50
51         /* try to create spherical tangent from generated coordinates */
52         if (getattribute("geom:generated", generated)) {
53                 normal data = normal(-(generated[1] - 0.5), (generated[0] - 0.5), 0.0);
54                 vector T = transform("object", "world", data);
55                 Tangent = cross(Normal, normalize(cross(T, Normal)));
56         }
57         else {
58                 /* otherwise use surface derivatives */
59                 Tangent = normalize(dPdu);
60         }
61
62         getattribute("geom:pointiness", Pointiness);
63         if (bump_offset == "dx") {
64                 Pointiness += Dx(Pointiness);
65         }
66         else if (bump_offset == "dy") {
67                 Pointiness += Dy(Pointiness);
68         }
69 }
70