Revision: 27526
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27526
Author:   scourage
Date:     2010-03-15 23:36:39 +0100 (Mon, 15 Mar 2010)

Log Message:
-----------
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

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree_types.h
    trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
    trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c

Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c  2010-03-15 
22:03:24 UTC (rev 27525)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c  2010-03-15 
22:36:39 UTC (rev 27526)
@@ -921,6 +921,11 @@
        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 @@
                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;

Modified: trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_nodetree.c 2010-03-15 
22:03:24 UTC (rev 27525)
+++ trunk/blender/source/blender/makesrna/intern/rna_nodetree.c 2010-03-15 
22:36:39 UTC (rev 27526)
@@ -1187,6 +1187,23 @@
        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;

Modified: trunk/blender/source/blender/makesrna/intern/rna_nodetree_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_nodetree_types.h   
2010-03-15 22:03:24 UTC (rev 27525)
+++ trunk/blender/source/blender/makesrna/intern/rna_nodetree_types.h   
2010-03-15 22:36:39 UTC (rev 27526)
@@ -74,7 +74,7 @@
 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",      ""              )

Modified: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c 
2010-03-15 22:03:24 UTC (rev 27525)
+++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c 
2010-03-15 22:36:39 UTC (rev 27526)
@@ -42,9 +42,7 @@
        {-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 @@
        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);

Modified: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c    
2010-03-15 22:03:24 UTC (rev 27525)
+++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c    
2010-03-15 22:36:39 UTC (rev 27526)
@@ -41,46 +41,6 @@
        {       -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 @@
        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 @@
                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 */

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to