[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