Nodes: add sqrt, ceil, floor and fract to math nodes.
[blender.git] / intern / cycles / kernel / shaders / node_math.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 float safe_divide(float a, float b)
20 {
21         float result;
22
23         if (b == 0.0)
24                 result = 0.0;
25         else
26                 result = a / b;
27         
28         return result;
29 }
30
31 float safe_modulo(float a, float b)
32 {
33         float result;
34
35         if (b == 0.0)
36                 result = 0.0;
37         else
38                 result = fmod(a, b);
39         
40         return result;
41 }
42
43 float safe_sqrt(float a)
44 {
45         float result;
46
47         if (a > 0.0)
48                 result = sqrt(a);
49         else
50                 result = 0.0;
51
52         return result;
53 }
54
55 float safe_log(float a, float b)
56 {
57         if (a < 0.0 || b < 0.0)
58                 return 0.0;
59         
60         return log(a) / log(b);
61 }
62
63 shader node_math(
64         string type = "add",
65         int use_clamp = 0,
66         float Value1 = 0.0,
67         float Value2 = 0.0,
68         output float Value = 0.0)
69 {
70         /* OSL asin, acos, pow check for values that could give rise to nan */
71
72         if (type == "add")
73                 Value = Value1 + Value2;
74         else if (type == "subtract")
75                 Value = Value1 - Value2;
76         else if (type == "multiply")
77                 Value = Value1 * Value2;
78         else if (type == "divide")
79                 Value = safe_divide(Value1, Value2);
80         else if (type == "sine")
81                 Value = sin(Value1);
82         else if (type == "cosine")
83                 Value = cos(Value1);
84         else if (type == "tangent")
85                 Value = tan(Value1);
86         else if (type == "arcsine")
87                 Value = asin(Value1);
88         else if (type == "arccosine")
89                 Value = acos(Value1);
90         else if (type == "arctangent")
91                 Value = atan(Value1);
92         else if (type == "power")
93                 Value = pow(Value1, Value2);
94         else if (type == "logarithm")
95                 Value = safe_log(Value1, Value2);
96         else if (type == "minimum")
97                 Value = min(Value1, Value2);
98         else if (type == "maximum")
99                 Value = max(Value1, Value2);
100         else if (type == "round")
101                 Value = floor(Value1 + 0.5);
102         else if (type == "less_than")
103                 Value = Value1 < Value2;
104         else if (type == "greater_than")
105                 Value = Value1 > Value2;
106         else if (type == "modulo")
107                 Value = safe_modulo(Value1, Value2);
108         else if (type == "absolute")
109                 Value = fabs(Value1);
110         else if (type == "arctan2")
111                 Value = atan2(Value1, Value2);
112         else if (type == "floor")
113                 Value = floor(Value1);
114         else if (type == "ceil")
115                 Value = ceil(Value1);
116         else if (type == "fract")
117                 Value = Value1 - floor(Value1);
118         else if (type == "sqrt")
119                 Value = safe_sqrt(Value1);
120
121         if (use_clamp)
122                 Value = clamp(Value, 0.0, 1.0);
123 }
124