Re-added the Luma keyer after realizing channeldid not exactly same capability and could not without sgnificant change.

This commit is contained in:
Robert Holcomb 2007-01-13 22:56:26 +00:00
parent 0535c2c8ad
commit 611b583acc
4 changed files with 143 additions and 29 deletions

@ -251,6 +251,7 @@ void set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, str
#define CMP_NODE_DISPLACE 245 #define CMP_NODE_DISPLACE 245
#define CMP_NODE_COMBHSVA 246 #define CMP_NODE_COMBHSVA 246
#define CMP_NODE_MATH 247 #define CMP_NODE_MATH 247
#define CMP_NODE_LUMA_MATTE 248
/* filter types */ /* filter types */

@ -895,6 +895,12 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup)
c->fstrength= 0.0f; c->fstrength= 0.0f;
node->custom1= 1; /* RGB channel */ node->custom1= 1; /* RGB channel */
node->custom2= 2; /* Green Channel */ node->custom2= 2; /* Green Channel */
}
else if(type==CMP_NODE_LUMA_MATTE){
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage=c;
c->t1= 0.0f;
c->t2= 0.0f;
} }
} }

@ -1311,7 +1311,7 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
if(node->id) { if(node->id) {
/* first make the preview image */ /* first make the preview image */
CompBuf *prevbuf= alloc_compbuf(140, 140, CB_RGBA, 1); // alloc CompBuf *prevbuf= alloc_compbuf(140, 140, CB_RGBA, 1); /* alloc */
prevbuf->rect_procedural= texture_procedural; prevbuf->rect_procedural= texture_procedural;
prevbuf->node= node; prevbuf->node= node;
@ -1320,7 +1320,7 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
free_compbuf(prevbuf); free_compbuf(prevbuf);
if(out[0]->hasoutput) { if(out[0]->hasoutput) {
CompBuf *stackbuf= alloc_compbuf(140, 140, CB_VAL, 1); // alloc CompBuf *stackbuf= alloc_compbuf(140, 140, CB_VAL, 1); /* alloc */
stackbuf->rect_procedural= texture_procedural; stackbuf->rect_procedural= texture_procedural;
stackbuf->node= node; stackbuf->node= node;
@ -1328,7 +1328,7 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
out[0]->data= stackbuf; out[0]->data= stackbuf;
} }
if(out[1]->hasoutput) { if(out[1]->hasoutput) {
CompBuf *stackbuf= alloc_compbuf(140, 140, CB_RGBA, 1); // alloc CompBuf *stackbuf= alloc_compbuf(140, 140, CB_RGBA, 1); /* alloc */
stackbuf->rect_procedural= texture_procedural; stackbuf->rect_procedural= texture_procedural;
stackbuf->node= node; stackbuf->node= node;
@ -1387,7 +1387,7 @@ static void node_composit_exec_normal(void *data, bNode *node, bNodeStack **in,
else if(out[1]->hasoutput) { else if(out[1]->hasoutput) {
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[0]->data; CompBuf *cbuf= in[0]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */
composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_normal, CB_VEC3); composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_normal, CB_VEC3);
@ -1521,7 +1521,7 @@ static void node_composit_exec_curve_rgb(void *data, bNode *node, bNodeStack **i
else { else {
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[1]->data; CompBuf *cbuf= in[1]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
if(in[0]->data) if(in[0]->data)
composit2_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[0]->data, in[0]->vec, do_curves_fac, CB_RGBA, CB_VAL); composit2_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[0]->data, in[0]->vec, do_curves_fac, CB_RGBA, CB_VAL);
@ -1645,7 +1645,7 @@ static void node_composit_exec_hue_sat(void *data, bNode *node, bNodeStack **in,
else { else {
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[1]->data; CompBuf *cbuf= in[1]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
composit2_pixel_processor(node, stackbuf, cbuf, in[1]->vec, in[0]->data, in[0]->vec, do_hue_sat_fac, CB_RGBA, CB_VAL); composit2_pixel_processor(node, stackbuf, cbuf, in[1]->vec, in[0]->data, in[0]->vec, do_hue_sat_fac, CB_RGBA, CB_VAL);
@ -1705,7 +1705,7 @@ static void node_composit_exec_mix_rgb(void *data, bNode *node, bNodeStack **in,
else { else {
/* make output size of first available input image */ /* make output size of first available input image */
CompBuf *cbuf= in[1]->data?in[1]->data:in[2]->data; CompBuf *cbuf= in[1]->data?in[1]->data:in[2]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
composit3_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, in[0]->data, fac, do_mix_rgb, CB_RGBA, CB_RGBA, CB_VAL); composit3_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, in[0]->data, fac, do_mix_rgb, CB_RGBA, CB_RGBA, CB_VAL);
@ -1876,7 +1876,7 @@ static void node_composit_exec_filter(void *data, bNode *node, bNodeStack **in,
if(in[1]->data) { if(in[1]->data) {
/* make output size of first available input image */ /* make output size of first available input image */
CompBuf *cbuf= in[1]->data; CompBuf *cbuf= in[1]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 1); /* allocs */
/* warning note: xof and yof are applied in pixelprocessor, but should be copied otherwise? */ /* warning note: xof and yof are applied in pixelprocessor, but should be copied otherwise? */
stackbuf->xof= cbuf->xof; stackbuf->xof= cbuf->xof;
@ -1956,7 +1956,7 @@ static void node_composit_exec_valtorgb(void *data, bNode *node, bNodeStack **in
else { else {
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[0]->data; CompBuf *cbuf= in[0]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_colorband_composit, CB_VAL); composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_colorband_composit, CB_VAL);
@ -2012,7 +2012,7 @@ static void node_composit_exec_rgbtobw(void *data, bNode *node, bNodeStack **in,
else { else {
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[0]->data; CompBuf *cbuf= in[0]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */
composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_rgbtobw, CB_RGBA); composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_rgbtobw, CB_RGBA);
@ -2134,7 +2134,7 @@ static void node_composit_exec_sephsva(void *data, bNode *node, bNodeStack **in,
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[0]->data; CompBuf *cbuf= in[0]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
/* convert the RGB stackbuf to an HSV representation */ /* convert the RGB stackbuf to an HSV representation */
composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_sephsva, CB_RGBA); composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_sephsva, CB_RGBA);
@ -2209,7 +2209,7 @@ static void node_composit_exec_combrgba(void *data, bNode *node, bNodeStack **in
else if (in[2]->data) cbuf = in[2]->data; else if (in[2]->data) cbuf = in[2]->data;
else cbuf = in[3]->data; else cbuf = in[3]->data;
stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
@ -2257,7 +2257,7 @@ static void node_composit_exec_setalpha(void *data, bNode *node, bNodeStack **in
else { else {
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[0]->data; CompBuf *cbuf= in[0]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
if(in[1]->data==NULL && in[1]->vec[0]==1.0f) { if(in[1]->data==NULL && in[1]->vec[0]==1.0f) {
/* pass on image */ /* pass on image */
@ -2351,7 +2351,7 @@ static void node_composit_exec_alphaover(void *data, bNode *node, bNodeStack **i
else { else {
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[1]->data; CompBuf *cbuf= in[1]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
if(node->custom1) if(node->custom1)
composit3_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, in[0]->data, in[0]->vec, do_alphaover_key, CB_RGBA, CB_RGBA, CB_VAL); composit3_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, in[0]->data, in[0]->vec, do_alphaover_key, CB_RGBA, CB_RGBA, CB_VAL);
@ -2424,7 +2424,7 @@ static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in
else { else {
/* make output size of first input image */ /* make output size of first input image */
CompBuf *cbuf= in[0]->data; CompBuf *cbuf= in[0]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
CompBuf *zbuf, *mbuf; CompBuf *zbuf, *mbuf;
float *fp; float *fp;
int x; int x;
@ -2529,7 +2529,7 @@ static void node_composit_exec_map_value(void *data, bNode *node, bNodeStack **i
else { else {
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[0]->data; CompBuf *cbuf= in[0]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */
composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_map_value, CB_VAL); composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_map_value, CB_VAL);
@ -2613,7 +2613,7 @@ static void blur_single_image(CompBuf *new, CompBuf *img, float scale, NodeBlurD
float *src, *dest; float *src, *dest;
/* helper image */ /* helper image */
work= alloc_compbuf(imgx, imgy, img->type, 1); // allocs work= alloc_compbuf(imgx, imgy, img->type, 1); /* allocs */
/* horizontal */ /* horizontal */
rad = scale*(float)nbd->sizex; rad = scale*(float)nbd->sizex;
@ -3103,7 +3103,7 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
if(in[1]->data) { if(in[1]->data) {
/* make output size of input image */ /* make output size of input image */
new= alloc_compbuf(img->x, img->y, img->type, 1); // allocs new= alloc_compbuf(img->x, img->y, img->type, 1); /* allocs */
blur_with_reference(new, img, in[1]->data, node->storage); blur_with_reference(new, img, in[1]->data, node->storage);
@ -3119,7 +3119,7 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
CompBuf *gammabuf; CompBuf *gammabuf;
/* make output size of input image */ /* make output size of input image */
new= alloc_compbuf(img->x, img->y, img->type, 1); // allocs new= alloc_compbuf(img->x, img->y, img->type, 1); /* allocs */
if(nbd->gamma) { if(nbd->gamma) {
gammabuf= dupalloc_compbuf(img); gammabuf= dupalloc_compbuf(img);
@ -4253,7 +4253,7 @@ static void node_composit_exec_sepyuva(void *data, bNode *node, bNodeStack **in,
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[0]->data; CompBuf *cbuf= in[0]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
/* convert the RGB stackbuf to an YUV representation */ /* convert the RGB stackbuf to an YUV representation */
composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_sepyuva, CB_RGBA); composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_sepyuva, CB_RGBA);
@ -4327,7 +4327,7 @@ static void node_composit_exec_sepycca(void *data, bNode *node, bNodeStack **in,
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[0]->data; CompBuf *cbuf= in[0]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
/* convert the RGB stackbuf to an HSV representation */ /* convert the RGB stackbuf to an HSV representation */
composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_sepycca, CB_RGBA); composit1_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, do_sepycca, CB_RGBA);
@ -4828,7 +4828,7 @@ static void do_channel_matte(bNode *node, float *out, float *in)
/*flip because 0.0 is transparent, not 1.0*/ /*flip because 0.0 is transparent, not 1.0*/
alpha=1-alpha; alpha=1-alpha;
//test range /* test range*/
if(alpha>c->t1) { if(alpha>c->t1) {
alpha=in[3]; /*whatever it was prior */ alpha=in[3]; /*whatever it was prior */
} }
@ -4839,6 +4839,7 @@ static void do_channel_matte(bNode *node, float *out, float *in)
alpha=(alpha-c->t2)/(c->t1-c->t2); alpha=(alpha-c->t2)/(c->t1-c->t2);
} }
/* don't make something that was more transparent less transparent */ /* don't make something that was more transparent less transparent */
if (alpha<in[3]) { if (alpha<in[3]) {
out[3]=alpha; out[3]=alpha;
@ -4922,6 +4923,85 @@ static bNodeType cmp_node_channel_matte={
/* execfunc */ node_composit_exec_channel_matte /* execfunc */ node_composit_exec_channel_matte
}; };
/* ******************* Luma Matte Node ********************************* */
static bNodeSocketType cmp_node_luma_matte_in[]={
{SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
{-1,0,""}
};
static bNodeSocketType cmp_node_luma_matte_out[]={
{SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
{SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{-1,0,""}
};
static void do_luma_matte(bNode *node, float *out, float *in)
{
NodeChroma *c=(NodeChroma *)node->storage;
float alpha;
alpha=0.0;
/* test range*/
if(in[0]>c->t1) {
alpha=1.0;
}
else if(in[1]<c->t2){
alpha=0.0;
}
else {/*blend */
alpha=(in[0]-c->t2)/(c->t1-c->t2);
}
/* don't make something that was more transparent less transparent */
if (alpha<in[3]) {
out[3]=alpha;
}
else {
out[3]=in[3];
}
}
static void node_composit_exec_luma_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *cbuf;
CompBuf *outbuf;
if(in[0]->hasinput==0) return;
if(in[0]->data==NULL) return;
if(out[0]->hasoutput==0 && out[1]->hasoutput==0) return;
cbuf=in[0]->data;
/*is it an RGBA image?*/
if(cbuf->type==CB_RGBA) {
outbuf=dupalloc_compbuf(cbuf);
composit1_pixel_processor(node, outbuf, cbuf, in[1]->vec, do_rgba_to_yuva, CB_RGBA);
composit1_pixel_processor(node, outbuf, outbuf, in[1]->vec, do_luma_matte, CB_RGBA);
composit1_pixel_processor(node, outbuf, outbuf, in[1]->vec, do_yuva_to_rgba, CB_RGBA);
generate_preview(node, outbuf);
out[0]->data=outbuf;
out[1]->data=valbuf_from_rgbabuf(outbuf, CHAN_A);
}
else {
return;
}
}
static bNodeType cmp_node_luma_matte={
/* type code */ CMP_NODE_LUMA_MATTE,
/* name */ "Luminence Key",
/* width+range */ 200, 80, 250,
/* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
/* input sock */ cmp_node_luma_matte_in,
/* output sock */ cmp_node_luma_matte_out,
/* storage */ "NodeChroma",
/* execfunc */ node_composit_exec_luma_matte
};
/* **************** COMBINE YCCA ******************** */ /* **************** COMBINE YCCA ******************** */
@ -4978,7 +5058,7 @@ static void node_composit_exec_combycca(void *data, bNode *node, bNodeStack **in
else if (in[2]->data) cbuf = in[2]->data; else if (in[2]->data) cbuf = in[2]->data;
else cbuf = in[3]->data; else cbuf = in[3]->data;
stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
@ -5047,7 +5127,7 @@ static void node_composit_exec_combyuva(void *data, bNode *node, bNodeStack **in
else if (in[2]->data) cbuf = in[2]->data; else if (in[2]->data) cbuf = in[2]->data;
else cbuf = in[3]->data; else cbuf = in[3]->data;
stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
@ -5115,7 +5195,7 @@ static void node_composit_exec_combhsva(void *data, bNode *node, bNodeStack **in
else if (in[2]->data) cbuf = in[2]->data; else if (in[2]->data) cbuf = in[2]->data;
else cbuf = in[3]->data; else cbuf = in[3]->data;
stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
in[2]->data, in[2]->vec, in[3]->data, in[3]->vec, in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
@ -5423,7 +5503,7 @@ static void node_composit_exec_mapuv(void *data, bNode *node, bNodeStack **in, b
cbuf= typecheck_compbuf(cbuf, CB_RGBA); cbuf= typecheck_compbuf(cbuf, CB_RGBA);
uvbuf= typecheck_compbuf(uvbuf, CB_VEC3); uvbuf= typecheck_compbuf(uvbuf, CB_VEC3);
stackbuf= alloc_compbuf(uvbuf->x, uvbuf->y, CB_RGBA, 1); // allocs; stackbuf= alloc_compbuf(uvbuf->x, uvbuf->y, CB_RGBA, 1); /* allocs */;
do_mapuv(stackbuf, cbuf, uvbuf, 0.05f*(float)node->custom1); do_mapuv(stackbuf, cbuf, uvbuf, 0.05f*(float)node->custom1);
@ -5493,7 +5573,7 @@ static void node_composit_exec_idmask(void *data, bNode *node, bNodeStack **in,
if(cbuf->type!=CB_VAL) if(cbuf->type!=CB_VAL)
return; return;
stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); // allocs; stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */;
do_idmask(stackbuf, cbuf, (float)node->custom1); do_idmask(stackbuf, cbuf, (float)node->custom1);
@ -5613,7 +5693,7 @@ static void node_composit_exec_displace(void *data, bNode *node, bNodeStack **in
cbuf= typecheck_compbuf(cbuf, CB_RGBA); cbuf= typecheck_compbuf(cbuf, CB_RGBA);
vecbuf= typecheck_compbuf(vecbuf, CB_VEC3); vecbuf= typecheck_compbuf(vecbuf, CB_VEC3);
stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); // allocs stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
do_displace(stackbuf, cbuf, vecbuf, in[1]->vec, in[2]->vec, in[3]->vec); do_displace(stackbuf, cbuf, vecbuf, in[1]->vec, in[2]->vec, in[3]->vec);
@ -5758,7 +5838,7 @@ static void node_composit_exec_math(void *data, bNode *node, bNodeStack **in, bN
else { else {
/* make output size of input image */ /* make output size of input image */
CompBuf *cbuf= in[0]->data; CompBuf *cbuf= in[0]->data;
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); // allocs 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); composit2_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, do_math, CB_VAL, CB_VAL);
@ -5828,6 +5908,7 @@ bNodeType *node_all_composit[]= {
&cmp_node_chroma, &cmp_node_chroma,
&cmp_node_channel_matte, &cmp_node_channel_matte,
&cmp_node_color_spill, &cmp_node_color_spill,
&cmp_node_luma_matte,
&cmp_node_translate, &cmp_node_translate,
&cmp_node_rotate, &cmp_node_rotate,

@ -1391,6 +1391,29 @@ static int node_composit_buts_channel_matte(uiBlock *block, bNodeTree *ntree, bN
return 80; return 80;
} }
static int node_composit_buts_luma_matte(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block) {
NodeChroma *c=node->storage;
/*tolerance sliders */
uiDefButF(block, NUMSLI, B_NODE_EXEC+node->nr, "High ",
butr->xmin, butr->ymin+20.0, butr->xmax-butr->xmin, 20,
&c->t1, 0.0f, 1.0f, 100, 0, "Values higher than this setting are 100% opaque");
uiDefButF(block, NUMSLI, B_NODE_EXEC+node->nr, "Low ",
butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
&c->t2, 0.0f, 1.0f, 100, 0, "Values lower than this setting are 100% keyed");
uiBlockEndAlign(block);
/*keep t2 (low) less than t1 (high) */
if(c->t2 > c->t1) {
c->t2=c->t1;
}
}
return 40;
}
static int node_composit_buts_map_uv(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr) static int node_composit_buts_map_uv(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{ {
if(block) { if(block) {
@ -1595,6 +1618,9 @@ static void node_composit_set_butfunc(bNodeType *ntype)
case CMP_NODE_CHANNEL_MATTE: case CMP_NODE_CHANNEL_MATTE:
ntype->butfunc= node_composit_buts_channel_matte; ntype->butfunc= node_composit_buts_channel_matte;
break; break;
case CMP_NODE_LUMA_MATTE:
ntype->butfunc= node_composit_buts_luma_matte;
break;
case CMP_NODE_MAP_UV: case CMP_NODE_MAP_UV:
ntype->butfunc= node_composit_buts_map_uv; ntype->butfunc= node_composit_buts_map_uv;
break; break;