== Compositor ==
authorMatt Ebb <matt@mke3.net>
Thu, 4 Jan 2007 01:56:21 +0000 (01:56 +0000)
committerMatt Ebb <matt@mke3.net>
Thu, 4 Jan 2007 01:56:21 +0000 (01:56 +0000)
* Ported Math node from shader nodes to composite nodes too

It's a good general purpose utility node and also allows stupid stuff
like this more easily :)

http://mke3.net/blender/etc/math-spiral-h264.mov
http://mke3.net/blender/etc/stupidmath.blend.zip

source/blender/blenkernel/BKE_node.h
source/blender/blenkernel/intern/node_composite.c
source/blender/src/drawnode.c

index 2644e18e3ec33b66ccd92ed51c774283e906b5bd..9621240c8155670cd026a3ba84a736cdb9e3248b 100644 (file)
@@ -250,6 +250,8 @@ void                        set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, str
 #define CMP_NODE_DEFOCUS               244
 #define CMP_NODE_DISPLACE              245
 #define CMP_NODE_COMBHSVA              246
+#define CMP_NODE_MATH                  247
+
 
 /* filter types */
 
index c6cb8a4c753df68b7802bcb26993d53659f829a6..9ffa312da0fb279cac02ab1d8f98dbee176d2ced 100644 (file)
@@ -5588,6 +5588,144 @@ static bNodeType cmp_node_displace= {
        /* execfunc    */       node_composit_exec_displace
 };
 
+/* **************** SCALAR MATH ******************** */ 
+static bNodeSocketType cmp_node_math_in[]= { 
+       { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f}, 
+       { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f}, 
+       { -1, 0, "" } 
+};
+
+static bNodeSocketType cmp_node_math_out[]= { 
+       { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, 
+       { -1, 0, "" } 
+};
+
+static void do_math(bNode *node, float *out, float *in, float *in2)
+{
+       switch(node->custom1)
+       {
+       case 0: /* Add */
+               out[0]= in[0] + in2[0]; 
+               break; 
+       case 1: /* Subtract */
+               out[0]= in[0] - in2[0];
+               break; 
+       case 2: /* Multiply */
+               out[0]= in[0] * in2[0]; 
+               break; 
+       case 3: /* Divide */
+               {
+                       if(in[1]==0)    /* We don't want to divide by zero. */
+                               out[0]= 0.0;
+                       else
+                               out[0]= in[0] / in2[0];
+                       }
+               break;
+       case 4: /* Sine */
+               out[0]= sin(in[0]);
+               break;
+       case 5: /* Cosine */
+               out[0]= cos(in[0]);
+               break;
+       case 6: /* Tangent */
+               out[0]= tan(in[0]);
+               break;
+       case 7: /* Arc-Sine */
+               {
+                       /* Can't do the impossible... */
+                       if(in[0] <= 1 && in[0] >= -1 )
+                               out[0]= asin(in[0]);
+                       else
+                               out[0]= 0.0;
+               }
+               break;
+       case 8: /* Arc-Cosine */
+               {
+                       /* Can't do the impossible... */
+                       if( in[0] <= 1 && in[0] >= -1 )
+                               out[0]= acos(in[0]);
+                       else
+                               out[0]= 0.0;
+               }
+               break;
+       case 9: /* Arc-Tangent */
+               out[0]= atan(in[0]);
+               break;
+       case 10: /* Power */
+               {
+                       /* Don't want any imaginary numbers... */
+                       if( in[0] >= 0 )
+                               out[0]= pow(in[0], in2[0]);
+                       else
+                               out[0]= 0.0;
+               }
+               break;
+       case 11: /* Logarithm */
+               {
+                       /* Don't want any imaginary numbers... */
+                       if( in[0] > 0  && in2[0] > 0 )
+                               out[0]= log(in[0]) / log(in2[0]);
+                       else
+                               out[0]= 0.0;
+               }
+               break;
+       case 12: /* Minimum */
+               {
+                       if( in[0] < in2[0] )
+                               out[0]= in2[0];
+                       else
+                               out[0]= in[0];
+               }
+               break;
+       case 13: /* Maximum */
+               {
+                       if( in[0] > in2[0] )
+                               out[0]= in2[0];
+                       else
+                               out[0]= in[0];
+               }
+               break;
+       case 14: /* Round */
+               {
+                               out[0]= (int)(in[0] + 0.5f);
+               }
+               break; 
+       }
+}
+
+static void node_composit_exec_math(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+       /* stack order out: bw */
+       /* stack order in: col */
+       
+       if(out[0]->hasoutput==0)
+               return;
+       
+       /* input no image? then only color operation */
+       if(in[0]->data==NULL) {
+               do_math(node, out[0]->vec, in[0]->vec, in[1]->vec);
+       }
+       else {
+               /* make output size of input image */
+               CompBuf *cbuf= in[0]->data;
+               CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); // allocs
+               
+               composit2_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, do_math, CB_VAL, CB_VAL);
+               
+               out[0]->data= stackbuf;
+       }
+}
+
+static bNodeType cmp_node_math= {
+       /* type code   */       CMP_NODE_MATH,
+       /* name        */       "Math",
+       /* width+range */       120, 110, 160,
+       /* class+opts  */       NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+       /* input sock  */       cmp_node_math_in,
+       /* output sock */       cmp_node_math_out,
+       /* storage     */       "",
+       /* execfunc    */       node_composit_exec_math
+};
 
 /* ****************** types array for all shaders ****************** */
 
@@ -5626,6 +5764,7 @@ bNodeType *node_all_composit[]= {
        &cmp_node_rgbtobw,      
        &cmp_node_setalpha,
        &cmp_node_idmask,
+       &cmp_node_math,
        &cmp_node_seprgba,
        &cmp_node_combrgba,
        &cmp_node_sephsva,
index b097793f33f1665c784cee5ed5d08ed181e1bbd4..57a0b2adab98b4afc8f93ea4f0112ffe8d76c3a3 100644 (file)
@@ -381,6 +381,17 @@ static int node_buts_texture(uiBlock *block, bNodeTree *ntree, bNode *node, rctf
        return 19;
 }
 
+static int node_buts_math(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr) 
+{ 
+       if(block) { 
+               uiBut *bt; 
+
+               bt=uiDefButS(block, MENU, B_NODE_EXEC,  "Add %x0|Subtract %x1|Multiply %x2|Divide %x3|Sine %x4|Cosine %x5|Tangent %x6|Arcsine %x7|Arccosine %x8|Arctangent %x9|Power %x10|Logarithm %x11|Minimum %x12|Maximum %x13|Round %x14", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &node->custom1, 0, 0, 0, 0, ""); 
+               uiButSetFunc(bt, node_but_title_cb, node, bt); 
+       } 
+       return 20; 
+}
+
 
 /* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */
 
@@ -577,17 +588,6 @@ static int node_shader_buts_mapping(uiBlock *block, bNodeTree *ntree, bNode *nod
        return 5*19 + 6;
 }
 
-static int node_shader_buts_math(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr) 
-{ 
-       if(block) { 
-               uiBut *bt; 
-
-               bt=uiDefButS(block, MENU, B_NODE_EXEC,  "Add %x0|Subtract %x1|Multiply %x2|Divide %x3|Sine %x4|Cosine %x5|Tangent %x6|Arcsine %x7|Arccosine %x8|Arctangent %x9|Power %x10|Logarithm %x11|Minimum %x12|Maximum %x13|Round %x14", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &node->custom1, 0, 0, 0, 0, ""); 
-               uiButSetFunc(bt, node_but_title_cb, node, bt); 
-       } 
-       return 20; 
-}
-
 static int node_shader_buts_vect_math(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr) 
 { 
        if(block) { 
@@ -660,7 +660,7 @@ static void node_shader_set_butfunc(bNodeType *ntype)
                        ntype->butfunc= node_buts_valtorgb;
                        break;
                case SH_NODE_MATH: 
-                       ntype->butfunc= node_shader_buts_math;
+                       ntype->butfunc= node_buts_math;
                        break; 
                case SH_NODE_VECT_MATH: 
                        ntype->butfunc= node_shader_buts_vect_math;
@@ -1565,6 +1565,9 @@ static void node_composit_set_butfunc(bNodeType *ntype)
                case CMP_NODE_ID_MASK:
                        ntype->butfunc= node_composit_buts_id_mask;
                        break;
+               case CMP_NODE_MATH:
+                       ntype->butfunc= node_buts_math;
+                       break;
                default:
                        ntype->butfunc= NULL;
        }