Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Holcomb <bob_holcomb@hotmail.com>2010-03-16 01:36:39 +0300
committerRobert Holcomb <bob_holcomb@hotmail.com>2010-03-16 01:36:39 +0300
commitebd63787e6ad1889319442558e8f7329ca7a768d (patch)
tree752115084879931fdee7fe6167f018dd8dac6ef4 /source/blender/nodes
parentc12cfa37753e440aa585c2044dc433a46e494e59 (diff)
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
Diffstat (limited to 'source/blender/nodes')
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c37
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_rotate.c103
2 files changed, 64 insertions, 76 deletions
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
index f1b39587e2a..aa282a78af1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
@@ -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);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
index 0a2fe906eb6..4da0b20c6f8 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
@@ -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