diff -Naur blender2.42/source/blender/blenkernel/BKE_node.h blender-work/source/blender/blenkernel/BKE_node.h --- blender2.42/source/blender/blenkernel/BKE_node.h 2006-07-03 05:49:12.000000000 -0400 +++ blender-work/source/blender/blenkernel/BKE_node.h 2006-07-16 05:43:08.000000000 -0400 @@ -224,7 +224,7 @@ #define CMP_NODE_TEXTURE 224 #define CMP_NODE_TRANSLATE 225 #define CMP_NODE_ZCOMBINE 226 - +#define CMP_NODE_CHROMA 227 /* filter types */ #define CMP_FILT_SOFT 0 diff -Naur blender2.42/source/blender/blenkernel/intern/node.c blender-work/source/blender/blenkernel/intern/node.c --- blender2.42/source/blender/blenkernel/intern/node.c 2006-07-09 07:54:41.000000000 -0400 +++ blender-work/source/blender/blenkernel/intern/node.c 2006-07-16 14:40:22.000000000 -0400 @@ -796,6 +796,13 @@ nhs->hue= 0.5f; nhs->sat= 1.0f; } + else if(type==CMP_NODE_CHROMA){ + NodeChroma *c=MEM_callocN(sizeof(NodeChroma), "node chroma"); + node->storage=c; + c->rt=0.01f; + c->bt=0.01f; + c->gt=0.01f; + } } return node; diff -Naur blender2.42/source/blender/blenkernel/intern/node_composite.c blender-work/source/blender/blenkernel/intern/node_composite.c --- blender2.42/source/blender/blenkernel/intern/node_composite.c 2006-07-03 11:25:11.000000000 -0400 +++ blender-work/source/blender/blenkernel/intern/node_composite.c 2006-07-16 15:48:40.000000000 -0400 @@ -2884,6 +2884,88 @@ /* execfunc */ node_composit_exec_translate }; +/* ******************* Chroma Key ********************************* */ +static bNodeSocketType cmp_node_chroma_in[]={ + {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, + {SOCK_RGBA,1,"Key", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, + {-1,0,""}, +}; + +static bNodeSocketType cmp_node_chroma_out[]={ + {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, + {SOCK_VALUE,0,"Alpha",0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + {-1,0,""} +}; + + +static void node_composit_exec_chroma(void *data, bNode *node, bNodeStack **in, bNodeStack **out) +{ + int i, j; + + float minR, maxR; + float minG, maxG; + float minB, maxB; + + if(out[0]->hasoutput==0 || in[0]->hasinput==0) return; + if(in[0]->data==NULL) return; + + NodeChroma *c=node->storage; + + CompBuf *cbuf=in[0]->data; + CompBuf *rgbbuf=alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA,1); + + int max=cbuf->x*cbuf->y*4; + + minR=in[1]->vec[0]-c->rt; + maxR=in[1]->vec[0]+c->rt; + minG=in[1]->vec[1]-c->gt; + maxG=in[1]->vec[1]+c->gt; + minB=in[1]->vec[2]-c->bt; + maxB=in[1]->vec[2]+c->bt; + + for(i=0;irect[i+0] && cbuf->rect[i+0] < maxR) && + (minG < cbuf->rect[i+1] && cbuf->rect[i+1] < maxG) && + (minB < cbuf->rect[i+2] && cbuf->rect[i+2] < maxB)) + { + rgbbuf->rect[i+0]=0.0; + rgbbuf->rect[i+1]=0.0; + rgbbuf->rect[i+2]=0.0; + rgbbuf->rect[i+3]=0.0; + } + else + { + rgbbuf->rect[i+0]=cbuf->rect[i+0]; + rgbbuf->rect[i+1]=cbuf->rect[i+1]; + rgbbuf->rect[i+2]=cbuf->rect[i+2]; + rgbbuf->rect[i+3]=1.0; + } + } + + CompBuf *alphabuf=valbuf_from_rgbabuf(rgbbuf,CHAN_A); + + out[0]->data=rgbbuf; + out[1]->data=alphabuf; +} + +static bNodeType cmp_node_chroma={ + /* type code */ CMP_NODE_CHROMA, + /* name */ "ChromaKey", + /* width+range */ 200, 80, 250, + /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS, + /* input sock */ cmp_node_chroma_in, + /* output sock */ cmp_node_chroma_out, + /* storage */ "NodeChroma", + /* execfunc */ node_composit_exec_chroma + +}; + + +/* ******************* Chroma Key ********************************* */ + + + /* ****************** types array for all shaders ****************** */ @@ -2915,6 +2997,7 @@ &cmp_node_texture, &cmp_node_translate, &cmp_node_zcombine, + &cmp_node_chroma, NULL }; diff -Naur blender2.42/source/blender/makesdna/DNA_node_types.h blender-work/source/blender/makesdna/DNA_node_types.h --- blender2.42/source/blender/makesdna/DNA_node_types.h 2006-06-17 09:04:09.000000000 -0400 +++ blender-work/source/blender/makesdna/DNA_node_types.h 2006-07-16 14:37:13.000000000 -0400 @@ -196,5 +196,9 @@ float hue, sat; } NodeHueSat; +typedef struct NodeChroma { + float rt, gt, bt; +} NodeChroma; + #endif diff -Naur blender2.42/source/blender/src/drawnode.c blender-work/source/blender/src/drawnode.c --- blender2.42/source/blender/src/drawnode.c 2006-07-03 05:49:12.000000000 -0400 +++ blender-work/source/blender/src/drawnode.c 2006-07-16 14:37:11.000000000 -0400 @@ -985,6 +985,26 @@ return 38; } +static int node_composit_buts_chroma(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr) +{ + if(block) + { + NodeChroma *c= node->storage; + + uiBlockBeginAlign(block); + uiDefButF(block, NUMSLI, B_NODE_EXEC+node->nr, "Red Tolerance ", + butr->xmin, butr->ymin+38.0f, butr->xmax-butr->xmin, 19, + &c->rt, 0.0f, 1.0f, 100, 0, ""); + uiDefButF(block, NUMSLI, B_NODE_EXEC+node->nr, "Green Tolerance ", + butr->xmin, butr->ymin+19.0f, butr->xmax-butr->xmin, 19, + &c->gt, 0.0f, 1.0f, 100, 0, ""); + uiDefButF(block, NUMSLI, B_NODE_EXEC+node->nr, "Blue Tolerance ", + butr->xmin, butr->ymin, butr->xmax-butr->xmin, 19, + &c->bt, 0.0f, 1.0f, 100, 0, ""); + } + return 57; +} + /* only once called */ static void node_composit_set_butfunc(bNodeType *ntype) @@ -1044,6 +1064,9 @@ case CMP_NODE_TEXTURE: ntype->butfunc= node_buts_texture; break; + case CMP_NODE_CHROMA: + ntype->butfunc=node_composit_buts_chroma; + break; default: ntype->butfunc= NULL; }