This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
Kévin Dietrich b980cd163a Cycles: fix compilation of OSL shaders following API change
The names of the parameters are based on those of those of the sockets, so they also need to be updated. This was forgotten about in the previous commit (rBa284e559b90e).

Ref T82561.
2020-11-10 18:59:30 +01:00

110 lines
3.6 KiB
Plaintext

/*
* 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!");
}