[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18849] branches/blender2.5/blender/source /blender: 2.5
Ton Roosendaal
ton at blender.org
Sat Feb 7 15:03:37 CET 2009
Revision: 18849
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18849
Author: ton
Date: 2009-02-07 15:03:34 +0100 (Sat, 07 Feb 2009)
Log Message:
-----------
2.5
- Node editor: link cut back, now under ALT+LMB, to prevent
accidents. Note it now nicely intersects the real curved
noodles with a line you draw!
- To make above work, replaced ogl curve draw with own bezier
code.
- Added new WM standard operator callback for lines-gesture,
the Lasso gesture now draws a closed line.
- Both callbacks have optional property 'cursor' to make it
give modal info. For future also linestyle or color can be
defined.
- Changed 'pin' icon in Image header to something that looks
less scary... but there's no pin icon yet?
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/editors/interface/interface_utils.c
branches/blender2.5/blender/source/blender/editors/space_node/drawnode.c
branches/blender2.5/blender/source/blender/editors/space_node/node_draw.c
branches/blender2.5/blender/source/blender/editors/space_node/node_edit.c
branches/blender2.5/blender/source/blender/editors/space_node/node_intern.h
branches/blender2.5/blender/source/blender/editors/space_node/node_ops.c
branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
branches/blender2.5/blender/source/blender/windowmanager/WM_types.h
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_gesture.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_utils.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_utils.c 2009-02-07 13:39:54 UTC (rev 18848)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_utils.c 2009-02-07 14:03:34 UTC (rev 18849)
@@ -503,7 +503,7 @@
/* pin button */
if(id && (events & UI_ID_PIN)) {
- but= uiDefIconButS(block, ICONTOG, (events & UI_ID_PIN), 0 /* XXX ICON_PIN_DEHLT */, x, y ,DEF_ICON_BUT_WIDTH,DEF_BUT_HEIGHT, pin_p, 0, 0, 0, 0, "Keeps this view displaying the current data regardless of what object is selected");
+ but= uiDefIconButS(block, ICONTOG, (events & UI_ID_PIN), ICON_KEY_DEHLT, x, y ,DEF_ICON_BUT_WIDTH,DEF_BUT_HEIGHT, pin_p, 0, 0, 0, 0, "Keeps this view displaying the current data regardless of what object is selected");
uiButSetNFunc(but, idpoin_cb, MEM_dupallocN(params), SET_INT_IN_POINTER(UI_ID_PIN));
x+= DEF_ICON_BUT_WIDTH;
}
Modified: branches/blender2.5/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_node/drawnode.c 2009-02-07 13:39:54 UTC (rev 18848)
+++ branches/blender2.5/blender/source/blender/editors/space_node/drawnode.c 2009-02-07 14:03:34 UTC (rev 18849)
@@ -53,6 +53,7 @@
#include "DNA_userdef_types.h"
#include "BKE_context.h"
+#include "BKE_curve.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_library.h"
@@ -2522,46 +2523,80 @@
}
#endif
-void node_draw_link_bezier(View2D *v2d, float vec[4][3], int th_col1, int th_col2, int do_shaded)
+/* if v2d not NULL, it clips and returns 0 if not visible */
+int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, float coord_array[][2], int resol)
{
- float dist;
+ float dist, vec[4][2];
+ /* in v0 and v3 we put begin/end points */
+ if(link->fromsock) {
+ vec[0][0]= link->fromsock->locx;
+ vec[0][1]= link->fromsock->locy;
+ }
+ else {
+ if(snode==NULL) return 0;
+ vec[0][0]= snode->mx;
+ vec[0][1]= snode->my;
+ }
+ if(link->tosock) {
+ vec[3][0]= link->tosock->locx;
+ vec[3][1]= link->tosock->locy;
+ }
+ else {
+ if(snode==NULL) return 0;
+ vec[3][0]= snode->mx;
+ vec[3][1]= snode->my;
+ }
+
dist= 0.5f*ABS(vec[0][0] - vec[3][0]);
-
/* check direction later, for top sockets */
vec[1][0]= vec[0][0]+dist;
vec[1][1]= vec[0][1];
vec[2][0]= vec[3][0]-dist;
vec[2][1]= vec[3][1];
- // printf("-> %f %f %f %f %f\n", dist, vec[0][0], vec[3][0], vec[1][0], vec[2][0]);
- if( MIN4(vec[0][0], vec[1][0], vec[2][0], vec[3][0]) > v2d->cur.xmax); /* clipped */
- else if ( MAX4(vec[0][0], vec[1][0], vec[2][0], vec[3][0]) < v2d->cur.xmin); /* clipped */
+ if(v2d && MIN4(vec[0][0], vec[1][0], vec[2][0], vec[3][0]) > v2d->cur.xmax); /* clipped */
+ else if (v2d && MAX4(vec[0][0], vec[1][0], vec[2][0], vec[3][0]) < v2d->cur.xmin); /* clipped */
else {
- float curve_res = 24, spline_step = 0.0f;
+ /* always do all three, to prevent data hanging around */
+ forward_diff_bezier(vec[0][0], vec[1][0], vec[2][0], vec[3][0], coord_array[0], resol, 2);
+ forward_diff_bezier(vec[0][1], vec[1][1], vec[2][1], vec[3][1], coord_array[0]+1, resol, 2);
+
+ return 1;
+ }
+ return 0;
+}
+
+#define LINK_RESOL 24
+void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int th_col2, int do_shaded)
+{
+ float coord_array[LINK_RESOL+1][2];
+
+ if(node_link_bezier_points(v2d, snode, link, coord_array, LINK_RESOL)) {
+ float dist, spline_step = 0.0f;
+ int i;
+
/* we can reuse the dist variable here to increment the GL curve eval amount*/
- dist = 1.0f/curve_res;
+ dist = 1.0f/(float)LINK_RESOL;
- glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, vec[0]);
glBegin(GL_LINE_STRIP);
- while (spline_step < 1.000001f) {
- if(do_shaded)
+ for(i=0; i<LINK_RESOL; i++) {
+ if(do_shaded) {
UI_ThemeColorBlend(th_col1, th_col2, spline_step);
- glEvalCoord1f(spline_step);
- spline_step += dist;
+ spline_step += dist;
+ }
+ glVertex2fv(coord_array[i]);
}
glEnd();
}
-
}
/* note; this is used for fake links in groups too */
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
{
- float vec[4][3];
int do_shaded= 1, th_col1= TH_WIRE, th_col2= TH_WIRE;
if(link->fromnode==NULL && link->tonode==NULL)
@@ -2598,28 +2633,7 @@
}
}
- vec[0][2]= vec[1][2]= vec[2][2]= vec[3][2]= 0.0; /* only 2d spline, set the Z to 0*/
-
- /* in v0 and v3 we put begin/end points */
- if(link->fromnode) {
- vec[0][0]= link->fromsock->locx;
- vec[0][1]= link->fromsock->locy;
- }
- else {
- vec[0][0]= snode->mx;
- vec[0][1]= snode->my;
- }
- if(link->tonode) {
- vec[3][0]= link->tosock->locx;
- vec[3][1]= link->tosock->locy;
- }
- else {
- vec[3][0]= snode->mx;
- vec[3][1]= snode->my;
- }
-
- node_draw_link_bezier(v2d, vec, th_col1, th_col2, do_shaded);
- // fdrawbezier(vec);
+ node_draw_link_bezier(v2d, snode, link, th_col1, th_col2, do_shaded);
}
#if 0
Modified: branches/blender2.5/blender/source/blender/editors/space_node/node_draw.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_node/node_draw.c 2009-02-07 13:39:54 UTC (rev 18848)
+++ branches/blender2.5/blender/source/blender/editors/space_node/node_draw.c 2009-02-07 14:03:34 UTC (rev 18849)
@@ -356,10 +356,10 @@
{
bNodeSocket *valsock= NULL, *colsock= NULL, *vecsock= NULL;
bNodeSocket *sock;
- float vec[4][3];
+ bNodeLink link;
int a;
- vec[0][2]= vec[1][2]= vec[2][2]= vec[3][2]= 0.0; /* only 2d spline, set the Z to 0*/
+ memset(&link, 0, sizeof(bNodeLink));
/* connect the first value buffer in with first value out */
/* connect the first RGBA buffer in with first RGBA out */
@@ -381,25 +381,21 @@
if(valsock || colsock || vecsock) {
for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
if(nodeCountSocketLinks(snode->edittree, sock)) {
- vec[3][0]= sock->locx;
- vec[3][1]= sock->locy;
+ link.tosock= sock;
if(sock->type==SOCK_VALUE && valsock) {
- vec[0][0]= valsock->locx;
- vec[0][1]= valsock->locy;
- node_draw_link_bezier(v2d, vec, TH_WIRE, TH_WIRE, 0);
+ link.fromsock= valsock;
+ node_draw_link_bezier(v2d, snode, &link, TH_WIRE, TH_WIRE, 0);
valsock= NULL;
}
if(sock->type==SOCK_VECTOR && vecsock) {
- vec[0][0]= vecsock->locx;
- vec[0][1]= vecsock->locy;
- node_draw_link_bezier(v2d, vec, TH_WIRE, TH_WIRE, 0);
+ link.fromsock= vecsock;
+ node_draw_link_bezier(v2d, snode, &link, TH_WIRE, TH_WIRE, 0);
vecsock= NULL;
}
if(sock->type==SOCK_RGBA && colsock) {
- vec[0][0]= colsock->locx;
- vec[0][1]= colsock->locy;
- node_draw_link_bezier(v2d, vec, TH_WIRE, TH_WIRE, 0);
+ link.fromsock= colsock;
+ node_draw_link_bezier(v2d, snode, &link, TH_WIRE, TH_WIRE, 0);
colsock= NULL;
}
}
Modified: branches/blender2.5/blender/source/blender/editors/space_node/node_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_node/node_edit.c 2009-02-07 13:39:54 UTC (rev 18848)
+++ branches/blender2.5/blender/source/blender/editors/space_node/node_edit.c 2009-02-07 14:03:34 UTC (rev 18849)
@@ -2077,84 +2077,94 @@
// XXX snode_handle_recalc(snode);
}
+#endif
-static void node_border_link_delete(SpaceNode *snode)
+/* ********************** Cut Link operator ***************** */
+
+#define LINK_RESOL 12
+static int cut_links_intersect(bNodeLink *link, float mcoords[][2], int tot)
{
- rcti rect;
- short val, mval[2], mvalo[2];
+ float coord_array[LINK_RESOL+1][2];
+ int i, b;
+
+ if(node_link_bezier_points(NULL, NULL, link, coord_array, LINK_RESOL)) {
- /* to make this work more friendly, we first wait for a mouse move */
- getmouseco_areawin(mvalo);
- while (get_mbut() & L_MOUSE) {
- getmouseco_areawin(mval);
- if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1])
- break;
- else BIF_wait_for_statechange();
+ for(i=0; i<tot-1; i++)
+ for(b=0; b<LINK_RESOL-1; b++)
+ if(IsectLL2Df(mcoords[i], mcoords[i+1], coord_array[b], coord_array[b+1]) > 0)
+ return 1;
}
- if((get_mbut() & L_MOUSE)==0)
- return;
+ return 0;
+}
+
+static int cut_links_exec(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
+ ARegion *ar= CTX_wm_region(C);
+ float mcoords[256][2];
+ int i= 0;
- /* now change cursor and draw border */
- setcursor_space(SPACE_NODE, CURSOR_VPAINT);
+ RNA_BEGIN(op->ptr, itemptr, "path") {
+ float loc[2];
+
+ RNA_float_get_array(&itemptr, "loc", loc);
+ UI_view2d_region_to_view(&ar->v2d, (short)loc[0], (short)loc[1],
+ &mcoords[i][0], &mcoords[i][1]);
+ i++;
+ if(i>= 256) break;
+ }
+ RNA_END;
- if ( (val = get_border(&rect, 2)) ) {
- if(rect.xmin<rect.xmax && rect.ymin<rect.ymax) {
- //#define NODE_MAXPICKBUF 256
- bNodeLink *link, *next;
- GLuint buffer[256];
- rctf rectf;
- int code=0, hits;
+ if(i>1) {
+ bNodeLink *link, *next;
+
+ for(link= snode->edittree->links.first; link; link= link->next) {
+ next= link->next;
- mval[0]= rect.xmin;
- mval[1]= rect.ymin;
- areamouseco_to_ipoco(&snode->v2d, mval, &rectf.xmin, &rectf.ymin);
- mval[0]= rect.xmax;
- mval[1]= rect.ymax;
- areamouseco_to_ipoco(&snode->v2d, mval, &rectf.xmax, &rectf.ymax);
-
- glLoadIdentity();
- myortho2(rectf.xmin, rectf.xmax, rectf.ymin, rectf.ymax);
-
- glSelectBuffer(256, buffer);
- glRenderMode(GL_SELECT);
- glInitNames();
- glPushName(-1);
-
- /* draw links */
- for(link= snode->edittree->links.first; link; link= link->next) {
- glLoadName(code++);
- node_draw_link(snode, link);
+ if(cut_links_intersect(link, mcoords, i)) {
+ NodeTagChanged(snode->edittree, link->tonode);
+ nodeRemLink(snode->edittree, link);
}
-
- hits= glRenderMode(GL_RENDER);
- glPopName();
- if(hits>0) {
- int a;
- for(a=0; a<hits; a++) {
- bNodeLink *link= BLI_findlink(&snode->edittree->links, buffer[ (4 * a) + 3]);
- if(link)
- link->fromnode= NULL; /* first tag for delete, otherwise indices are wrong */
- }
- for(link= snode->edittree->links.first; link; link= next) {
- next= link->next;
- if(link->fromnode==NULL) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list