diff options
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node_composite.c | 139 | ||||
-rw-r--r-- | source/blender/src/drawnode.c | 27 |
3 files changed, 156 insertions, 12 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 2644e18e3ec..9621240c815 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -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 */ diff --git a/source/blender/blenkernel/intern/node_composite.c b/source/blender/blenkernel/intern/node_composite.c index c6cb8a4c753..9ffa312da0f 100644 --- a/source/blender/blenkernel/intern/node_composite.c +++ b/source/blender/blenkernel/intern/node_composite.c @@ -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, diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c index b097793f33f..57a0b2adab9 100644 --- a/source/blender/src/drawnode.c +++ b/source/blender/src/drawnode.c @@ -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; } |