diff options
Diffstat (limited to 'intern/cycles/kernel/osl/shaders/node_math.osl')
-rw-r--r-- | intern/cycles/kernel/osl/shaders/node_math.osl | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/intern/cycles/kernel/osl/shaders/node_math.osl b/intern/cycles/kernel/osl/shaders/node_math.osl new file mode 100644 index 00000000000..66884610561 --- /dev/null +++ b/intern/cycles/kernel/osl/shaders/node_math.osl @@ -0,0 +1,109 @@ +/* + * Copyright 2011-2013 Blender Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "node_math.h" +#include "stdcycles.h" + +/* OSL asin, acos, and pow functions are safe by default. */ +shader node_math(string math_type = "add", + float Value1 = 0.5, + float Value2 = 0.5, + float Value3 = 0.5, + output float Value = 0.0) +{ + if (math_type == "add") + Value = Value1 + Value2; + else if (math_type == "subtract") + Value = Value1 - Value2; + else if (math_type == "multiply") + Value = Value1 * Value2; + else if (math_type == "divide") + Value = safe_divide(Value1, Value2); + else if (math_type == "power") + Value = pow(Value1, Value2); + else if (math_type == "logarithm") + Value = safe_log(Value1, Value2); + else if (math_type == "sqrt") + Value = safe_sqrt(Value1); + else if (math_type == "inversesqrt") + Value = inversesqrt(Value1); + else if (math_type == "absolute") + Value = fabs(Value1); + else if (math_type == "radians") + Value = radians(Value1); + else if (math_type == "degrees") + Value = degrees(Value1); + else if (math_type == "minimum") + Value = min(Value1, Value2); + else if (math_type == "maximum") + Value = max(Value1, Value2); + else if (math_type == "less_than") + Value = Value1 < Value2; + else if (math_type == "greater_than") + Value = Value1 > Value2; + else if (math_type == "round") + Value = floor(Value1 + 0.5); + else if (math_type == "floor") + Value = floor(Value1); + else if (math_type == "ceil") + Value = ceil(Value1); + else if (math_type == "fraction") + Value = Value1 - floor(Value1); + else if (math_type == "modulo") + Value = safe_modulo(Value1, Value2); + else if (math_type == "trunc") + Value = trunc(Value1); + else if (math_type == "snap") + Value = floor(safe_divide(Value1, Value2)) * Value2; + else if (math_type == "wrap") + Value = wrap(Value1, Value2, Value3); + else if (math_type == "pingpong") + Value = pingpong(Value1, Value2); + else if (math_type == "sine") + Value = sin(Value1); + else if (math_type == "cosine") + Value = cos(Value1); + else if (math_type == "tangent") + Value = tan(Value1); + else if (math_type == "sinh") + Value = sinh(Value1); + else if (math_type == "cosh") + Value = cosh(Value1); + else if (math_type == "tanh") + Value = tanh(Value1); + else if (math_type == "arcsine") + Value = asin(Value1); + else if (math_type == "arccosine") + Value = acos(Value1); + else if (math_type == "arctangent") + Value = atan(Value1); + else if (math_type == "arctan2") + Value = atan2(Value1, Value2); + else if (math_type == "sign") + Value = sign(Value1); + else if (math_type == "exponent") + Value = exp(Value1); + else if (math_type == "compare") + Value = ((Value1 == Value2) || (abs(Value1 - Value2) <= max(Value3, 1e-5))) ? 1.0 : 0.0; + else if (math_type == "multiply_add") + Value = Value1 * Value2 + Value3; + else if (math_type == "smoothmin") + Value = smoothmin(Value1, Value2, Value3); + else if (math_type == "smoothmax") + Value = -(smoothmin(-Value1, -Value2, Value3)); + else + warning("%s", "Unknown math operator!"); +} |