diff options
author | Thomas Dinges <blender@dingto.org> | 2013-05-20 18:38:47 +0400 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2013-05-20 18:38:47 +0400 |
commit | 38dc85f296a27a5641d296c8f41834db41dac18b (patch) | |
tree | b47567b3c6fd455a6a92b359fc92509ff33e85fb /intern/cycles | |
parent | 0fb5c9117fdb9ad24184a2dad2ad1c8c66565aaa (diff) |
Math Node:
* Added a Modulo operation to the math node, available in Compositor, Shader and Texture Nodes.
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/kernel/shaders/node_math.osl | 14 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_math.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_types.h | 1 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 1 | ||||
-rw-r--r-- | intern/cycles/util/util_math.h | 5 |
5 files changed, 23 insertions, 0 deletions
diff --git a/intern/cycles/kernel/shaders/node_math.osl b/intern/cycles/kernel/shaders/node_math.osl index 2ec1a5f0a32..214ef931660 100644 --- a/intern/cycles/kernel/shaders/node_math.osl +++ b/intern/cycles/kernel/shaders/node_math.osl @@ -30,6 +30,18 @@ float safe_divide(float a, float b) return result; } +float safe_modulo(float a, float b) +{ + float result; + + if (b == 0.0) + result = 0.0; + else + result = fmod(a, b); + + return result; +} + float safe_log(float a, float b) { if (a < 0.0 || b < 0.0) @@ -81,6 +93,8 @@ shader node_math( Value = Value1 < Value2; else if (type == "Greater Than") Value = Value1 > Value2; + else if (type == "Modulo") + Value = safe_modulo(Value1, Value2); if (Clamp) Value = clamp(Value1, 0.0, 1.0); diff --git a/intern/cycles/kernel/svm/svm_math.h b/intern/cycles/kernel/svm/svm_math.h index c7cd5200cd0..dbf477a0a96 100644 --- a/intern/cycles/kernel/svm/svm_math.h +++ b/intern/cycles/kernel/svm/svm_math.h @@ -56,6 +56,8 @@ __device float svm_math(NodeMath type, float Fac1, float Fac2) Fac = Fac1 < Fac2; else if(type == NODE_MATH_GREATER_THAN) Fac = Fac1 > Fac2; + else if(type == NODE_MATH_MODULO) + Fac = safe_modulo(Fac1, Fac2); else if(type == NODE_MATH_CLAMP) Fac = clamp(Fac1, 0.0f, 1.0f); else diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h index d89fde898dc..2cf3ccbe575 100644 --- a/intern/cycles/kernel/svm/svm_types.h +++ b/intern/cycles/kernel/svm/svm_types.h @@ -210,6 +210,7 @@ typedef enum NodeMath { NODE_MATH_ROUND, NODE_MATH_LESS_THAN, NODE_MATH_GREATER_THAN, + NODE_MATH_MODULO, NODE_MATH_CLAMP /* used for the clamp UI option */ } NodeMath; diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 7435616ffc0..06322fec820 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -2959,6 +2959,7 @@ static ShaderEnum math_type_init() enm.insert("Round", NODE_MATH_ROUND); enm.insert("Less Than", NODE_MATH_LESS_THAN); enm.insert("Greater Than", NODE_MATH_GREATER_THAN); + enm.insert("Modulo", NODE_MATH_MODULO); return enm; } diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h index 6edf7fa3544..6fe1b2bcf54 100644 --- a/intern/cycles/util/util_math.h +++ b/intern/cycles/util/util_math.h @@ -1166,6 +1166,11 @@ __device float safe_divide(float a, float b) return (b != 0.0f)? a/b: 0.0f; } +__device float safe_modulo(float a, float b) +{ + return (b != 0.0f)? fmodf(a, b): 0.0f; +} + /* Ray Intersection */ __device bool ray_sphere_intersect( |