forked from bartvdbraak/blender
added different sampling methods in rotate node
fixed bug in difference matte node that prevented using a solid color for second input -also clairified some variable names to be more meaningful
This commit is contained in:
parent
c12cfa3775
commit
ebd63787e6
@ -921,6 +921,11 @@ static void node_composit_buts_scale(uiLayout *layout, bContext *C, PointerRNA *
|
||||
uiItemR(layout, "", 0, ptr, "space", 0);
|
||||
}
|
||||
|
||||
static void node_composit_buts_rotate(uiLayout *layout, bContext *C, PointerRNA *ptr)
|
||||
{
|
||||
uiItemR(layout, "", 0, ptr, "filter", 0);
|
||||
}
|
||||
|
||||
static void node_composit_buts_invert(uiLayout *layout, bContext *C, PointerRNA *ptr)
|
||||
{
|
||||
uiLayout *col;
|
||||
@ -1098,6 +1103,9 @@ static void node_composit_set_butfunc(bNodeType *ntype)
|
||||
case CMP_NODE_SCALE:
|
||||
ntype->uifunc= node_composit_buts_scale;
|
||||
break;
|
||||
case CMP_NODE_ROTATE:
|
||||
ntype->uifunc=node_composit_buts_rotate;
|
||||
break;
|
||||
case CMP_NODE_CHANNEL_MATTE:
|
||||
ntype->uifunc= node_composit_buts_channel_matte;
|
||||
break;
|
||||
|
@ -1187,6 +1187,23 @@ static void def_cmp_scale(StructRNA *srna)
|
||||
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
|
||||
}
|
||||
|
||||
static void def_cmp_rotate(StructRNA *srna)
|
||||
{
|
||||
PropertyRNA *prop;
|
||||
|
||||
static EnumPropertyItem rotate_items[] = {
|
||||
{0, "NEAREST", 0, "Nearest", ""},
|
||||
{1, "BILINEAR", 0, "Bilinear", ""},
|
||||
{2, "BICUBIC", 0, "Bicubic", ""},
|
||||
{0, NULL, 0, NULL, NULL}};
|
||||
|
||||
prop = RNA_def_property(srna, "filter", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_sdna(prop, NULL, "custom1");
|
||||
RNA_def_property_enum_items(prop, rotate_items);
|
||||
RNA_def_property_ui_text(prop, "Filter", "Method to use to filter rotation");
|
||||
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
|
||||
}
|
||||
|
||||
static void def_cmp_diff_matte(StructRNA *srna)
|
||||
{
|
||||
PropertyRNA *prop;
|
||||
|
@ -74,7 +74,7 @@ DefNode( CompositorNode, CMP_NODE_TRANSLATE, 0, "TRANS
|
||||
DefNode( CompositorNode, CMP_NODE_ZCOMBINE, 0, "ZCOMBINE", Zcombine, "Z Combine", "" )
|
||||
DefNode( CompositorNode, CMP_NODE_COMBRGBA, 0, "COMBRGBA", CombRGBA, "Combine RGBA", "" )
|
||||
DefNode( CompositorNode, CMP_NODE_DILATEERODE, def_cmp_dilate_erode, "DILATEERODE", DilateErode, "Dilate/Erode", "" )
|
||||
DefNode( CompositorNode, CMP_NODE_ROTATE, 0, "ROTATE", Rotate, "Rotate", "" )
|
||||
DefNode( CompositorNode, CMP_NODE_ROTATE, def_cmp_rotate, "ROTATE", Rotate, "Rotate", "" )
|
||||
DefNode( CompositorNode, CMP_NODE_SCALE, def_cmp_scale, "SCALE", Scale, "Scale", "" )
|
||||
DefNode( CompositorNode, CMP_NODE_SEPYCCA, 0, "SEPYCCA", SepYCCA, "Separate YCCA", "" )
|
||||
DefNode( CompositorNode, CMP_NODE_COMBYCCA, 0, "COMBYCCA", CombYCCA, "Combine YCCA", "" )
|
||||
|
@ -42,9 +42,7 @@ static bNodeSocketType cmp_node_diff_matte_out[]={
|
||||
{-1,0,""}
|
||||
};
|
||||
|
||||
/* note, keyvals is passed on from caller as stack array */
|
||||
/* might have been nicer as temp struct though... */
|
||||
static void do_diff_matte(bNode *node, float *colorbuf, float *imbuf1, float *imbuf2)
|
||||
static void do_diff_matte(bNode *node, float *outColor, float *inColor1, float *inColor2)
|
||||
{
|
||||
NodeChroma *c= (NodeChroma *)node->storage;
|
||||
float tolerence=c->t1;
|
||||
@ -52,52 +50,57 @@ static void do_diff_matte(bNode *node, float *colorbuf, float *imbuf1, float *im
|
||||
float difference;
|
||||
float alpha;
|
||||
|
||||
difference=fabs(imbuf2[0]-imbuf1[0])+
|
||||
fabs(imbuf2[1]-imbuf1[1])+
|
||||
fabs(imbuf2[2]-imbuf1[2]);
|
||||
difference=fabs(inColor2[0]-inColor1[0])+
|
||||
fabs(inColor2[1]-inColor1[1])+
|
||||
fabs(inColor2[2]-inColor1[2]);
|
||||
|
||||
/*average together the distances*/
|
||||
difference=difference/3.0;
|
||||
|
||||
VECCOPY(colorbuf, imbuf1);
|
||||
VECCOPY(outColor, inColor1);
|
||||
|
||||
/*make 100% transparent*/
|
||||
if(difference < tolerence){
|
||||
colorbuf[3]=0.0;
|
||||
outColor[3]=0.0;
|
||||
}
|
||||
/*in the falloff region, make partially transparent */
|
||||
else if(difference < falloff+tolerence){
|
||||
difference=difference-tolerence;
|
||||
alpha=difference/falloff;
|
||||
/*only change if more transparent than before */
|
||||
if(alpha < imbuf1[3]) {
|
||||
colorbuf[3]=alpha;
|
||||
if(alpha < inColor1[3]) {
|
||||
outColor[3]=alpha;
|
||||
}
|
||||
else { /* leave as before */
|
||||
colorbuf[3]=imbuf1[3];
|
||||
outColor[3]=inColor1[3];
|
||||
}
|
||||
}
|
||||
else {
|
||||
/*foreground object*/
|
||||
colorbuf[3]= imbuf1[3];
|
||||
outColor[3]= inColor1[3];
|
||||
}
|
||||
}
|
||||
|
||||
static void node_composit_exec_diff_matte(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
|
||||
{
|
||||
CompBuf *outbuf;
|
||||
CompBuf *imbuf1;
|
||||
CompBuf *imbuf2;
|
||||
CompBuf *outbuf=0;
|
||||
CompBuf *imbuf1=0;
|
||||
CompBuf *imbuf2=0;
|
||||
NodeChroma *c;
|
||||
|
||||
/*is anything connected?*/
|
||||
if(out[0]->hasoutput==0 && out[1]->hasoutput==0) return;
|
||||
|
||||
/*must have an image imput*/
|
||||
if(in[0]->data==NULL) return;
|
||||
if(in[1]->data==NULL) return;
|
||||
|
||||
|
||||
imbuf1=typecheck_compbuf(in[0]->data, CB_RGBA);
|
||||
imbuf2=typecheck_compbuf(in[1]->data, CB_RGBA);
|
||||
|
||||
/* if there's an image, use that, if not use the color */
|
||||
if(in[1]->data) {
|
||||
imbuf2=typecheck_compbuf(in[1]->data, CB_RGBA);
|
||||
}
|
||||
|
||||
c=node->storage;
|
||||
outbuf=dupalloc_compbuf(imbuf1);
|
||||
|
@ -41,46 +41,6 @@ static bNodeSocketType cmp_node_rotate_out[]= {
|
||||
{ -1, 0, "" }
|
||||
};
|
||||
|
||||
/* function assumes out to be zero'ed, only does RGBA */
|
||||
static void bilinear_interpolation_rotate(CompBuf *in, float *out, float u, float v)
|
||||
{
|
||||
float *row1, *row2, *row3, *row4, a, b;
|
||||
float a_b, ma_b, a_mb, ma_mb;
|
||||
float empty[4]= {0.0f, 0.0f, 0.0f, 0.0f};
|
||||
int y1, y2, x1, x2;
|
||||
|
||||
x1= (int)floor(u);
|
||||
x2= (int)ceil(u);
|
||||
y1= (int)floor(v);
|
||||
y2= (int)ceil(v);
|
||||
|
||||
/* sample area entirely outside image? */
|
||||
if(x2<0 || x1>in->x-1 || y2<0 || y1>in->y-1)
|
||||
return;
|
||||
|
||||
/* sample including outside of edges of image */
|
||||
if(x1<0 || y1<0) row1= empty;
|
||||
else row1= in->rect + in->x * y1 * in->type + in->type*x1;
|
||||
|
||||
if(x1<0 || y2>in->y-1) row2= empty;
|
||||
else row2= in->rect + in->x * y2 * in->type + in->type*x1;
|
||||
|
||||
if(x2>in->x-1 || y1<0) row3= empty;
|
||||
else row3= in->rect + in->x * y1 * in->type + in->type*x2;
|
||||
|
||||
if(x2>in->x-1 || y2>in->y-1) row4= empty;
|
||||
else row4= in->rect + in->x * y2 * in->type + in->type*x2;
|
||||
|
||||
a= u-floor(u);
|
||||
b= v-floor(v);
|
||||
a_b= a*b; ma_b= (1.0f-a)*b; a_mb= a*(1.0f-b); ma_mb= (1.0f-a)*(1.0f-b);
|
||||
|
||||
out[0]= ma_mb*row1[0] + a_mb*row3[0] + ma_b*row2[0]+ a_b*row4[0];
|
||||
out[1]= ma_mb*row1[1] + a_mb*row3[1] + ma_b*row2[1]+ a_b*row4[1];
|
||||
out[2]= ma_mb*row1[2] + a_mb*row3[2] + ma_b*row2[2]+ a_b*row4[2];
|
||||
out[3]= ma_mb*row1[3] + a_mb*row3[3] + ma_b*row2[3]+ a_b*row4[3];
|
||||
}
|
||||
|
||||
/* only supports RGBA nodes now */
|
||||
static void node_composit_exec_rotate(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
|
||||
{
|
||||
@ -91,8 +51,9 @@ static void node_composit_exec_rotate(void *data, bNode *node, bNodeStack **in,
|
||||
if(in[0]->data) {
|
||||
CompBuf *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA);
|
||||
CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* note, this returns zero'd image */
|
||||
float *ofp, rad, u, v, s, c, centx, centy, miny, maxy, minx, maxx;
|
||||
int x, y, yo;
|
||||
float rad, u, v, s, c, centx, centy, miny, maxy, minx, maxx;
|
||||
int x, y, yo, xo;
|
||||
ImBuf *ibuf, *obuf;
|
||||
|
||||
rad= (M_PI*in[1]->vec[0])/180.0f;
|
||||
|
||||
@ -106,32 +67,56 @@ static void node_composit_exec_rotate(void *data, bNode *node, bNodeStack **in,
|
||||
miny= -centy;
|
||||
maxy= -centy + (float)cbuf->y;
|
||||
|
||||
for(y=miny; y<maxy; y++) {
|
||||
yo= y+(int)centy;
|
||||
ofp= stackbuf->rect + 4*yo*stackbuf->x;
|
||||
|
||||
for(x=minx; x<maxx; x++, ofp+=4) {
|
||||
u= c*x + y*s + centx;
|
||||
v= -s*x + c*y + centy;
|
||||
|
||||
bilinear_interpolation_rotate(cbuf, ofp, u, v);
|
||||
|
||||
ibuf=IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
|
||||
obuf=IMB_allocImBuf(stackbuf->x, stackbuf->y, 32, 0, 0);
|
||||
|
||||
if(ibuf){
|
||||
ibuf->rect_float=cbuf->rect;
|
||||
obuf->rect_float=stackbuf->rect;
|
||||
|
||||
for(y=miny; y<maxy; y++) {
|
||||
yo= y+(int)centy;
|
||||
|
||||
for(x=minx; x<maxx;x++) {
|
||||
u=c*x + y*s + centx;
|
||||
v=-s*x + c*y + centy;
|
||||
xo= x+(int)centx;
|
||||
|
||||
switch(node->custom1) {
|
||||
case 0:
|
||||
neareast_interpolation(ibuf, obuf, u, v, xo, yo);
|
||||
break ;
|
||||
case 1:
|
||||
bilinear_interpolation(ibuf, obuf, u, v, xo, yo);
|
||||
break;
|
||||
case 2:
|
||||
bicubic_interpolation(ibuf, obuf, u, v, xo, yo);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* rotate offset vector too, but why negative rad, ehh?? Has to be replaced with [3][3] matrix once (ton) */
|
||||
s= sin(-rad);
|
||||
c= cos(-rad);
|
||||
centx= (float)cbuf->xof; centy= (float)cbuf->yof;
|
||||
stackbuf->xof= (int)( c*centx + s*centy);
|
||||
stackbuf->yof= (int)(-s*centx + c*centy);
|
||||
}
|
||||
/* rotate offset vector too, but why negative rad, ehh?? Has to be replaced with [3][3] matrix once (ton) */
|
||||
s= sin(-rad);
|
||||
c= cos(-rad);
|
||||
centx= (float)cbuf->xof; centy= (float)cbuf->yof;
|
||||
stackbuf->xof= (int)( c*centx + s*centy);
|
||||
stackbuf->yof= (int)(-s*centx + c*centy);
|
||||
|
||||
/* pass on output and free */
|
||||
out[0]->data= stackbuf;
|
||||
if(cbuf!=in[0]->data)
|
||||
free_compbuf(cbuf);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void node_composit_init_rotate(bNode *node)
|
||||
{
|
||||
node->custom1= 1; /* Bilinear Filter*/
|
||||
}
|
||||
|
||||
bNodeType cmp_node_rotate= {
|
||||
/* *next,*prev */ NULL, NULL,
|
||||
/* type code */ CMP_NODE_ROTATE,
|
||||
@ -143,7 +128,7 @@ bNodeType cmp_node_rotate= {
|
||||
/* storage */ "",
|
||||
/* execfunc */ node_composit_exec_rotate,
|
||||
/* butfunc */ NULL,
|
||||
/* initfunc */ NULL,
|
||||
/* initfunc */ node_composit_init_rotate,
|
||||
/* freestoragefunc */ NULL,
|
||||
/* copystoragefunc */ NULL,
|
||||
/* id */ NULL
|
||||
|
Loading…
Reference in New Issue
Block a user