c5fcbc311d35759f3f6d7b3387d51ed505ada582
[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_log(float a, float b)
44 {
45         if (a < 0.0 || b < 0.0)
46                 return 0.0;
47         
48         return log(a) / log(b);
49 }
50
51 shader node_math(
52         string type = "add",
53         int use_clamp = 0,
54         float Value1 = 0.0,
55         float Value2 = 0.0,
56         output float Value = 0.0)
57 {
58         /* OSL asin, acos, pow check for values that could give rise to nan */
59
60         if (type == "add")
61                 Value = Value1 + Value2;
62         else if (type == "subtract")
63                 Value = Value1 - Value2;
64         else if (type == "multiply")
65                 Value = Value1 * Value2;
66         else if (type == "divide")
67                 Value = safe_divide(Value1, Value2);
68         else if (type == "sine")
69                 Value = sin(Value1);
70         else if (type == "cosine")
71                 Value = cos(Value1);
72         else if (type == "tangent")
73                 Value = tan(Value1);
74         else if (type == "arcsine")
75                 Value = asin(Value1);
76         else if (type == "arccosine")
77                 Value = acos(Value1);
78         else if (type == "arctangent")
79                 Value = atan(Value1);
80         else if (type == "power")
81                 Value = pow(Value1, Value2);
82         else if (type == "logarithm")
83                 Value = safe_log(Value1, Value2);
84         else if (type == "minimum")
85                 Value = min(Value1, Value2);
86         else if (type == "maximum")
87                 Value = max(Value1, Value2);
88         else if (type == "round")
89                 Value = floor(Value1 + 0.5);
90         else if (type == "less_than")
91                 Value = Value1 < Value2;
92         else if (type == "greater_than")
93                 Value = Value1 > Value2;
94         else if (type == "modulo")
95                 Value = safe_modulo(Value1, Value2);
96         else if (type == "absolute")
97                 Value = fabs(Value1);
98         else if (type == "arctan2")
99                 Value = atan2(Value1, Value2);
100
101         if (use_clamp)
102                 Value = clamp(Value, 0.0, 1.0);
103 }
104