Revision: 56927
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56927
Author:   dingto
Date:     2013-05-20 14:38:47 +0000 (Mon, 20 May 2013)
Log Message:
-----------
Math Node:
* Added a Modulo operation to the math node, available in Compositor, Shader 
and Texture Nodes. 

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/shaders/node_math.osl
    trunk/blender/intern/cycles/kernel/svm/svm_math.h
    trunk/blender/intern/cycles/kernel/svm/svm_types.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/util/util_math.h
    trunk/blender/source/blender/compositor/nodes/COM_MathNode.cpp
    trunk/blender/source/blender/compositor/operations/COM_MathBaseOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_MathBaseOperation.h
    trunk/blender/source/blender/gpu/shaders/gpu_shader_material.glsl
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_math.c
    trunk/blender/source/blender/nodes/texture/nodes/node_texture_math.c

Modified: trunk/blender/intern/cycles/kernel/shaders/node_math.osl
===================================================================
--- trunk/blender/intern/cycles/kernel/shaders/node_math.osl    2013-05-20 
14:38:43 UTC (rev 56926)
+++ trunk/blender/intern/cycles/kernel/shaders/node_math.osl    2013-05-20 
14:38:47 UTC (rev 56927)
@@ -30,6 +30,18 @@
        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 @@
                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);

Modified: trunk/blender/intern/cycles/kernel/svm/svm_math.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_math.h   2013-05-20 14:38:43 UTC 
(rev 56926)
+++ trunk/blender/intern/cycles/kernel/svm/svm_math.h   2013-05-20 14:38:47 UTC 
(rev 56927)
@@ -56,6 +56,8 @@
                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

Modified: trunk/blender/intern/cycles/kernel/svm/svm_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/svm/svm_types.h  2013-05-20 14:38:43 UTC 
(rev 56926)
+++ trunk/blender/intern/cycles/kernel/svm/svm_types.h  2013-05-20 14:38:47 UTC 
(rev 56927)
@@ -210,6 +210,7 @@
        NODE_MATH_ROUND,
        NODE_MATH_LESS_THAN,
        NODE_MATH_GREATER_THAN,
+       NODE_MATH_MODULO,
        NODE_MATH_CLAMP /* used for the clamp UI option */
 } NodeMath;
 

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp        2013-05-20 14:38:43 UTC 
(rev 56926)
+++ trunk/blender/intern/cycles/render/nodes.cpp        2013-05-20 14:38:47 UTC 
(rev 56927)
@@ -2959,6 +2959,7 @@
        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;
 }

Modified: trunk/blender/intern/cycles/util/util_math.h
===================================================================
--- trunk/blender/intern/cycles/util/util_math.h        2013-05-20 14:38:43 UTC 
(rev 56926)
+++ trunk/blender/intern/cycles/util/util_math.h        2013-05-20 14:38:47 UTC 
(rev 56927)
@@ -1166,6 +1166,11 @@
        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(

Modified: trunk/blender/source/blender/compositor/nodes/COM_MathNode.cpp
===================================================================
--- trunk/blender/source/blender/compositor/nodes/COM_MathNode.cpp      
2013-05-20 14:38:43 UTC (rev 56926)
+++ trunk/blender/source/blender/compositor/nodes/COM_MathNode.cpp      
2013-05-20 14:38:47 UTC (rev 56927)
@@ -80,6 +80,9 @@
                case 16: /* Greater Than */
                        operation = new MathGreaterThanOperation();
                        break;
+               case 17: /* Modulo */
+                       operation = new MathModuloOperation();
+                       break;
        }
        
        if (operation != NULL) {

Modified: 
trunk/blender/source/blender/compositor/operations/COM_MathBaseOperation.cpp
===================================================================
--- 
trunk/blender/source/blender/compositor/operations/COM_MathBaseOperation.cpp    
    2013-05-20 14:38:43 UTC (rev 56926)
+++ 
trunk/blender/source/blender/compositor/operations/COM_MathBaseOperation.cpp    
    2013-05-20 14:38:47 UTC (rev 56927)
@@ -317,4 +317,19 @@
        clampIfNeeded(output);
 }
 
+void MathModuloOperation::executePixel(float output[4], float x, float y, 
PixelSampler sampler)
+{
+       float inputValue1[4];
+       float inputValue2[4];
+       
+       this->m_inputValue1Operation->read(&inputValue1[0], x, y, sampler);
+       this->m_inputValue2Operation->read(&inputValue2[0], x, y, sampler);
+       
+       if (inputValue2[0] == 0)
+               output[0] = 0.0;
+       else
+               output[0] = fmod(inputValue1[0], inputValue2[0]);
 
+       clampIfNeeded(output);
+}
+

Modified: 
trunk/blender/source/blender/compositor/operations/COM_MathBaseOperation.h
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_MathBaseOperation.h  
2013-05-20 14:38:43 UTC (rev 56926)
+++ trunk/blender/source/blender/compositor/operations/COM_MathBaseOperation.h  
2013-05-20 14:38:47 UTC (rev 56927)
@@ -157,4 +157,10 @@
        void executePixel(float output[4], float x, float y, PixelSampler 
sampler);
 };
 
+class MathModuloOperation : public MathBaseOperation {
+public:
+       MathModuloOperation() : MathBaseOperation() {}
+       void executePixel(float output[4], float x, float y, PixelSampler 
sampler);
+};
+
 #endif

Modified: trunk/blender/source/blender/gpu/shaders/gpu_shader_material.glsl
===================================================================
--- trunk/blender/source/blender/gpu/shaders/gpu_shader_material.glsl   
2013-05-20 14:38:43 UTC (rev 56926)
+++ trunk/blender/source/blender/gpu/shaders/gpu_shader_material.glsl   
2013-05-20 14:38:47 UTC (rev 56927)
@@ -279,6 +279,14 @@
                outval = 0.0;
 }
 
+void math_modulo(float val1, float val2, out float outval)
+{
+       if (val2 == 0.0)
+               outval = 0.0;
+       else
+               outval = mod(val1, val2);
+}
+
 void squeeze(float val, float width, float center, out float outval)
 {
        outval = 1.0/(1.0 + pow(2.71828183, -((val-center)*width)));

Modified: trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_nodetree.c 2013-05-20 
14:38:43 UTC (rev 56926)
+++ trunk/blender/source/blender/makesrna/intern/rna_nodetree.c 2013-05-20 
14:38:47 UTC (rev 56927)
@@ -127,6 +127,7 @@
        {14, "ROUND",        0, "Round",        ""},
        {15, "LESS_THAN",    0, "Less Than",    ""},
        {16, "GREATER_THAN", 0, "Greater Than", ""},
+       {17, "MODULO",           0, "Modulo",           ""},            
        {0, NULL, 0, NULL, NULL}
 };
 

Modified: trunk/blender/source/blender/nodes/shader/nodes/node_shader_math.c
===================================================================
--- trunk/blender/source/blender/nodes/shader/nodes/node_shader_math.c  
2013-05-20 14:38:43 UTC (rev 56926)
+++ trunk/blender/source/blender/nodes/shader/nodes/node_shader_math.c  
2013-05-20 14:38:47 UTC (rev 56927)
@@ -203,6 +203,14 @@
                                out[0]->vec[0] = 0.0f;
                }
                break;
+       case 17: /* Modulo */
+               {
+                       if (in[1]->vec[0] == 0.0f)
+                               out[0]->vec[0] = 0.0f;
+                       else
+                               out[0]->vec[0] = fmod(in[0]->vec[0], 
in[1]->vec[0]);
+               }
+               break;
        }
 }
 
@@ -211,7 +219,7 @@
        static const char *names[] = {"math_add", "math_subtract", 
"math_multiply",
                "math_divide", "math_sine", "math_cosine", "math_tangent", 
"math_asin",
                "math_acos", "math_atan", "math_pow", "math_log", "math_min", 
"math_max",
-               "math_round", "math_less_than", "math_greater_than"};
+               "math_round", "math_less_than", "math_greater_than", 
"math_modulo"};
 
        switch (node->custom1) {
                case 0:

Modified: trunk/blender/source/blender/nodes/texture/nodes/node_texture_math.c
===================================================================
--- trunk/blender/source/blender/nodes/texture/nodes/node_texture_math.c        
2013-05-20 14:38:43 UTC (rev 56926)
+++ trunk/blender/source/blender/nodes/texture/nodes/node_texture_math.c        
2013-05-20 14:38:47 UTC (rev 56927)
@@ -174,6 +174,15 @@
                }
                break;
                
+       case 17: /* Modulo */
+               {
+                       if (in1 == 0.0f)
+                               *out = 0.0f;
+                       else
+                               *out= fmod(in0, in1);
+               }
+               break;
+               
        default:
                fprintf(stderr,
                        "%s:%d: unhandeld value in switch statement: %d\n",

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to