[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13020] trunk/blender/source/blender: Directional Blur Node
joe
joeedh at gmail.com
Sat Dec 29 01:18:11 CET 2007
To make things animatible, it seems like it'd be a good idea to just
use value sockets for the
spin/size/iterations/direction/etc?
Joe
On Dec 27, 2007 7:19 AM, Juho Vepsalainen <bebraw at gmail.com> wrote:
> Revision: 13020
> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13020
> Author: bebraw
> Date: 2007-12-27 15:19:11 +0100 (Thu, 27 Dec 2007)
>
> Log Message:
> -----------
> Directional Blur Node
> Directional Blur node allows the users to do various blur operations on the input
> image. It essentially offers three different kind of ways of blurring in one node.
> It is possible to blur using a certain direction, spin and zoom. These three ways
> can be used in conjunction.
>
> The node contains following controls:
> *Iterations, Wrap
> *Center: X, Y
> *Distance, Angle
> *Spin
> *Zoom
>
> Iterations is used to determine the smoothness of the result. The more iterations,
> the smoother result. Low values are good for preview.
>
> Wrap means that the image is wrapped as if it was tiled on both x and y directions.
> To see better what this means, try it with spin for instance.
>
> Center values (X and Y) determine the location which is used as a pivot point for
> the operations. It is center (0.5) of the image by default.
>
> Distance and angle are used to adjust directional blur. The result can be described
> as a sweep that varies based on given distance (bigger distance, longer sweep) and
> angle. Angle is given in degrees.
>
> Spin produces rotating blur based on given angle. Yet again it is in degrees. Also
> negative values work.
>
> Zoom causes the image to be zoomed towards set center point (Center values).
>
> Thanks to Alfredo de Greef (eeshlo) for contribution.
>
> Possible development ideas:
> *Make an algorithm to extend image in case spin is used. Extend would temporarily
> change the size of the canvas of the input image. Canvas would be filled based on
> colors on the edges of the input image. After the blur operation has been done,
> the image would be cropped back to normal size. The advantage of this would be nicer
> result of spin (no problems with image size) on a computational cost.
> *Make values animatable. This is something that is better solved on more general
> level. ("everything is animatable" paradigm)
> *Provide an option to calculate automatic value for iterations. A good value that
> produces a smooth result could be calculated based on direction deltas. This would be
> useful in conjuction of animatable values.
>
> Modified Paths:
> --------------
> trunk/blender/source/blender/blenkernel/BKE_node.h
> trunk/blender/source/blender/blenkernel/BKE_utildefines.h
> trunk/blender/source/blender/blenkernel/intern/node.c
> trunk/blender/source/blender/makesdna/DNA_node_types.h
> trunk/blender/source/blender/nodes/CMP_node.h
> trunk/blender/source/blender/src/drawnode.c
>
> Added Paths:
> -----------
> trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
>
> Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/BKE_node.h 2007-12-27 13:35:14 UTC (rev 13019)
> +++ trunk/blender/source/blender/blenkernel/BKE_node.h 2007-12-27 14:19:11 UTC (rev 13020)
> @@ -306,6 +306,7 @@
> #define CMP_NODE_INVERT 251
> #define CMP_NODE_NORMALIZE 252
> #define CMP_NODE_CROP 253
> +#define CMP_NODE_DBLUR 254
>
> #define CMP_NODE_GLARE 301
> #define CMP_NODE_TONEMAP 302
>
> Modified: trunk/blender/source/blender/blenkernel/BKE_utildefines.h
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/BKE_utildefines.h 2007-12-27 13:35:14 UTC (rev 13019)
> +++ trunk/blender/source/blender/blenkernel/BKE_utildefines.h 2007-12-27 14:19:11 UTC (rev 13020)
> @@ -101,6 +101,8 @@
>
> #define ABS(a) ( (a)<0 ? (-(a)) : (a) )
>
> +#define AVG2(x, y) ( 0.5 * ((x) + (y)) )
> +
> #define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
> #define VECCOPY2D(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1);}
> #define QUATCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
>
> Modified: trunk/blender/source/blender/blenkernel/intern/node.c
> ===================================================================
> --- trunk/blender/source/blender/blenkernel/intern/node.c 2007-12-27 13:35:14 UTC (rev 13019)
> +++ trunk/blender/source/blender/blenkernel/intern/node.c 2007-12-27 14:19:11 UTC (rev 13020)
> @@ -2374,6 +2374,7 @@
>
> nodeRegisterType(ntypelist, &cmp_node_filter);
> nodeRegisterType(ntypelist, &cmp_node_blur);
> + nodeRegisterType(ntypelist, &cmp_node_dblur);
> nodeRegisterType(ntypelist, &cmp_node_vecblur);
> nodeRegisterType(ntypelist, &cmp_node_dilateerode);
> nodeRegisterType(ntypelist, &cmp_node_defocus);
>
> Modified: trunk/blender/source/blender/makesdna/DNA_node_types.h
> ===================================================================
> --- trunk/blender/source/blender/makesdna/DNA_node_types.h 2007-12-27 13:35:14 UTC (rev 13019)
> +++ trunk/blender/source/blender/makesdna/DNA_node_types.h 2007-12-27 14:19:11 UTC (rev 13020)
> @@ -203,6 +203,12 @@
> int pad2;
> } NodeBlurData;
>
> +typedef struct NodeDBlurData {
> + float center_x, center_y, distance, angle, spin, zoom;
> + short iter;
> + char wrap, pad;
> +} NodeDBlurData;
> +
> typedef struct NodeHueSat {
> float hue, sat, val;
> } NodeHueSat;
>
> Modified: trunk/blender/source/blender/nodes/CMP_node.h
> ===================================================================
> --- trunk/blender/source/blender/nodes/CMP_node.h 2007-12-27 13:35:14 UTC (rev 13019)
> +++ trunk/blender/source/blender/nodes/CMP_node.h 2007-12-27 14:19:11 UTC (rev 13020)
> @@ -66,6 +66,7 @@
>
> extern bNodeType cmp_node_filter;
> extern bNodeType cmp_node_blur;
> +extern bNodeType cmp_node_dblur;
> extern bNodeType cmp_node_vecblur;
> extern bNodeType cmp_node_dilateerode;
> extern bNodeType cmp_node_defocus;
>
> Added: trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
> ===================================================================
> --- trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c (rev 0)
> +++ trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c 2007-12-27 14:19:11 UTC (rev 13020)
> @@ -0,0 +1,143 @@
> +/**
> + *
> + * ***** BEGIN GPL LICENSE BLOCK *****
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
> + *
> + * The Original Code is Copyright (C) 2006 Blender Foundation.
> + * All rights reserved.
> + *
> + * The Original Code is: all of this file.
> + *
> + * Contributor(s): Alfredo de Greef (eeshlo)
> + *
> + * ***** END GPL LICENSE BLOCK *****
> + */
> +
> +#include "../CMP_util.h"
> +
> +static bNodeSocketType cmp_node_dblur_in[]= {
> + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.f, 0.f, 1.f},
> + { -1, 0, "" }
> +};
> +
> +static bNodeSocketType cmp_node_dblur_out[]= {
> + { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
> + { -1, 0, "" }
> +};
> +
> +static CompBuf *dblur(bNode *node, CompBuf *img, int iterations, int wrap,
> + float center_x, float center_y, float dist, float angle, float spin, float zoom)
> +{
> + if ((dist != 0.f) || (spin != 0.f) || (zoom != 0.f)) {
> + void (*getpix)(CompBuf*, float, float, float*) = wrap ? qd_getPixelLerpWrap : qd_getPixelLerp;
> + const float a= angle * (float)M_PI / 180.f;
> + const float itsc= 1.f / pow(2.f, (float)iterations);
> + float D;
> + float center_x_pix, center_y_pix;
> + float tx, ty;
> + float sc, rot;
> + CompBuf *tmp;
> + int i, j;
> +
> + tmp= dupalloc_compbuf(img);
> +
> + D= dist * sqrtf(img->x * img->x + img->y * img->y);
> + center_x_pix= center_x * img->x;
> + center_y_pix= center_y * img->y;
> +
> + tx= itsc * D * cos(a);
> + ty= -itsc * D * sin(a);
> + sc= itsc * zoom;
> + rot= itsc * spin * (float)M_PI / 180.f;
> +
> + /* blur the image */
> + for(i= 0; i < iterations; ++i) {
> + const float cs= cos(rot), ss= sin(rot);
> + const float isc= 1.f / (1.f + sc);
> + unsigned int x, y;
> + float col[4]= {0,0,0,0};
> +
> + for(y= 0; y < img->y; ++y) {
> + const float v= isc * (y - center_y_pix) + ty;
> +
> + for(x= 0; x < img->x; ++x) {
> + const float u= isc * (x - center_x_pix) + tx;
> + unsigned int p= (x + y * img->x) * img->type;
> +
> + getpix(tmp, cs * u + ss * v + center_x_pix, cs * v - ss * u + center_y_pix, col);
> +
> + /* mix img and transformed tmp */
> + for(j= 0; j < 4; ++j)
> + img->rect[p + j]= AVG2(img->rect[p + j], col[j]);
> + }
> + }
> +
> + /* copy img to tmp */
> + if(i != (iterations - 1))
> + memcpy(tmp->rect, img->rect, sizeof(float) * img->x * img->y * img->type);
> +
> + /* double transformations */
> + tx *= 2.f, ty *= 2.f;
> + sc *= 2.f, rot *= 2.f;
> +
> + if(node->exec & NODE_BREAK) break;
> + }
> +
> + free_compbuf(tmp);
> + }
> +
> + return img;
> +}
> +
> +static void node_composit_exec_dblur(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
> +{
> + NodeDBlurData *ndbd= node->storage;
> + CompBuf *new, *img= in[0]->data;
> +
> + if((img == NULL) || (out[0]->hasoutput == 0)) return;
> +
> + if (img->type != CB_RGBA)
> + new = typecheck_compbuf(img, CB_RGBA);
> + else
> + new = dupalloc_compbuf(img);
> +
> + out[0]->data= dblur(node, new, ndbd->iter, ndbd->wrap, ndbd->center_x, ndbd->center_y, ndbd->distance, ndbd->angle, ndbd->spin, ndbd->zoom);
> +}
> +
> +static void node_composit_init_dblur(bNode* node)
> +{
> + NodeDBlurData *ndbd= MEM_callocN(sizeof(NodeDBlurData), "node dblur data");
> + node->storage= ndbd;
> + ndbd->center_x= 0.5;
> + ndbd->center_y= 0.5;
> +}
> +
> +bNodeType cmp_node_dblur = {
> + /* *next,*prev */ NULL, NULL,
> + /* type code */ CMP_NODE_DBLUR,
> + /* name */ "Directional Blur",
> + /* width+range */ 150, 120, 200,
> + /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
> + /* input sock */ cmp_node_dblur_in,
> + /* output sock */ cmp_node_dblur_out,
> + /* storage */ "NodeDBlurData",
> + /* execfunc */ node_composit_exec_dblur,
> + /* butfunc */ NULL,
> + /* initfunc */ node_composit_init_dblur,
> + /* freestoragefunc */ node_free_standard_storage,
> + /* copystoragefunc */ node_copy_standard_storage,
> + /* id */ NULL
> +};
>
> Modified: trunk/blender/source/blender/src/drawnode.c
> ===================================================================
> --- trunk/blender/source/blender/src/drawnode.c 2007-12-27 13:35:14 UTC (rev 13019)
> +++ trunk/blender/source/blender/src/drawnode.c 2007-12-27 14:19:11 UTC (rev 13020)
> @@ -1085,6 +1085,63 @@
> return 57;
> }
>
> +static int node_composit_buts_dblur(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
> +{
> + if(block) {
> + NodeDBlurData *ndbd = node->storage;
> + short dy = butr->ymin + 171;
> + short dx = butr->xmax - butr->xmin;
> + short halfdx= (short)dx/2;
> +
> + uiBlockBeginAlign(block);
> + uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Iterations:",
> + butr->xmin, dy, dx, 19,
> + &ndbd->iter, 1, 32, 10, 0, "Amount of iterations");
> + uiDefButC(block, TOG, B_NODE_EXEC+node->nr, "Wrap",
> + butr->xmin, dy-= 19, dx, 19,
> + &ndbd->wrap, 0, 0, 0, 0, "Wrap blur");
> + uiBlockEndAlign(block);
> +
> + dy-= 9;
> +
> + uiDefBut(block, LABEL, B_NOP, "Center", butr->xmin, dy-= 19, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
> +
> + uiBlockBeginAlign(block);
> + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "X:",
> + butr->xmin, dy-= 19, halfdx, 19,
> + &ndbd->center_x, 0.0f, 1.0f, 10, 0, "X center in percents");
> + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Y:",
> + butr->xmin+halfdx, dy, halfdx, 19,
> + &ndbd->center_y, 0.0f, 1.0f, 10, 0, "Y center in percents");
> + uiBlockEndAlign(block);
> +
> + dy-= 9;
> +
> + uiBlockBeginAlign(block);
> + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Distance:",
> + butr->xmin, dy-= 19, dx, 19,
> + &ndbd->distance, -1.0f, 1.0f, 10, 0, "Amount of which the image moves");
> + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Angle:",
> + butr->xmin, dy-= 19, dx, 19,
> + &ndbd->angle, 0.0f, 360.0f, 1000, 0, "Angle in which the image will be moved");
> + uiBlockEndAlign(block);
> +
> + dy-= 9;
> +
> + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Spin:",
> + butr->xmin, dy-= 19, dx, 19,
> + &ndbd->spin, -360.0f, 360.0f, 1000, 0, "Angle that is used to spin the image");
> +
> + dy-= 9;
> +
> + uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Zoom:",
> + butr->xmin, dy-= 19, dx, 19,
> + &ndbd->zoom, 0.0f, 100.0f, 100, 0, "Amount of which the image is zoomed");
> +
> + }
> + return 190;
> +}
> +
> /* qdn: defocus node */
> static int node_composit_buts_defocus(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
> {
> @@ -1334,7 +1391,6 @@
> {
> if(block) {
> NodeTwoXYs *ntxy= node->storage;
> - uiBut *bt;
> char elementheight = 19;
> short dx= (butr->xmax-butr->xmin)/2;
> short dy= butr->ymax - elementheight;
> @@ -1350,22 +1406,22 @@
> dy-=elementheight;
>
> /* x1 */
> - bt=uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "X1:",
> + uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "X1:",
>
> @@ Diff output truncated at 10240 characters. @@
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
More information about the Bf-committers
mailing list