[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59598] branches/hive/source/blender: Applied patch https://codereview.appspot.com/12660043/: custom display of NodeLinks in the Node Editor

Sjoerd de Vries sjdv1982 at gmail.com
Wed Aug 28 13:26:13 CEST 2013


Revision: 59598
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59598
Author:   sjoerddevries
Date:     2013-08-28 11:26:13 +0000 (Wed, 28 Aug 2013)
Log Message:
-----------
Applied patch https://codereview.appspot.com/12660043/: custom display of NodeLinks in the Node Editor

Modified Paths:
--------------
    branches/hive/source/blender/blenkernel/BKE_node.h
    branches/hive/source/blender/editors/space_node/drawnode.c
    branches/hive/source/blender/editors/space_node/node_draw.c
    branches/hive/source/blender/editors/space_node/node_intern.h
    branches/hive/source/blender/makesdna/DNA_node_types.h
    branches/hive/source/blender/makesrna/intern/rna_nodetree.c

Modified: branches/hive/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/hive/source/blender/blenkernel/BKE_node.h	2013-08-28 11:22:29 UTC (rev 59597)
+++ branches/hive/source/blender/blenkernel/BKE_node.h	2013-08-28 11:26:13 UTC (rev 59598)
@@ -115,11 +115,11 @@
 	int flag; int pad;
 	
 	void (*draw)(struct bContext *C, struct uiLayout *layout, struct PointerRNA *ptr, struct PointerRNA *node_ptr, const char *text);
-	void (*draw_color)(struct bContext *C, struct PointerRNA *ptr, struct PointerRNA *node_ptr, float *r_color);
+	void (*draw_color)(const struct bContext *C, struct PointerRNA *ptr, struct PointerRNA *node_ptr, float *r_color);
 	int (*draw_shape)(struct bContext *C, struct PointerRNA *ptr, struct PointerRNA *node_ptr);
 	
 	void (*interface_draw)(struct bContext *C, struct uiLayout *layout, struct PointerRNA *ptr);
-	void (*interface_draw_color)(struct bContext *C, struct PointerRNA *ptr, float *r_color);
+	void (*interface_draw_color)(const struct bContext *C, struct PointerRNA *ptr, float *r_color);
 	void (*interface_register_properties)(struct bNodeTree *ntree, struct bNodeSocket *stemp, struct StructRNA *data_srna);
 	void (*interface_init_socket)(struct bNodeTree *ntree, struct bNodeSocket *stemp, struct bNode *node, struct bNodeSocket *sock, const char *data_path);
 	void (*interface_verify_socket)(struct bNodeTree *ntree, struct bNodeSocket *stemp, struct bNode *node, struct bNodeSocket *sock, const char *data_path);

Modified: branches/hive/source/blender/editors/space_node/drawnode.c
===================================================================
--- branches/hive/source/blender/editors/space_node/drawnode.c	2013-08-28 11:22:29 UTC (rev 59597)
+++ branches/hive/source/blender/editors/space_node/drawnode.c	2013-08-28 11:26:13 UTC (rev 59598)
@@ -2700,7 +2700,7 @@
 	uiItemL(layout, "Undefined Socket Type", ICON_ERROR);
 }
 
-static void node_socket_undefined_draw_color(bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PointerRNA *UNUSED(node_ptr), float *r_color)
+static void node_socket_undefined_draw_color(const bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PointerRNA *UNUSED(node_ptr), float *r_color)
 {
 	r_color[0] = 1.0f;
 	r_color[1] = 0.0f;
@@ -2713,7 +2713,7 @@
 	uiItemL(layout, "Undefined Socket Type", ICON_ERROR);
 }
 
-static void node_socket_undefined_interface_draw_color(bContext *UNUSED(C), PointerRNA *UNUSED(ptr), float *r_color)
+static void node_socket_undefined_interface_draw_color(const bContext *UNUSED(C), PointerRNA *UNUSED(ptr), float *r_color)
 {
 	r_color[0] = 1.0f;
 	r_color[1] = 0.0f;
@@ -2813,13 +2813,13 @@
 };
 
 /* common color callbacks for standard types */
-static void std_node_socket_draw_color(bContext *UNUSED(C), PointerRNA *ptr, PointerRNA *UNUSED(node_ptr), float *r_color)
+static void std_node_socket_draw_color(const bContext *UNUSED(C), PointerRNA *ptr, PointerRNA *UNUSED(node_ptr), float *r_color)
 {
 	bNodeSocket *sock = ptr->data;
 	int type = sock->typeinfo->type;
 	copy_v4_v4(r_color, std_node_socket_colors[type]);
 }
-static void std_node_socket_interface_draw_color(bContext *UNUSED(C), PointerRNA *ptr, float *r_color)
+static void std_node_socket_interface_draw_color(const bContext *UNUSED(C), PointerRNA *ptr, float *r_color)
 {
 	bNodeSocket *sock = ptr->data;
 	int type = sock->typeinfo->type;
@@ -2930,7 +2930,7 @@
 	stype->interface_draw_color = std_node_socket_interface_draw_color;
 }
 
-static void node_socket_virtual_draw_color(bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PointerRNA *UNUSED(node_ptr), float *r_color)
+static void node_socket_virtual_draw_color(const bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PointerRNA *UNUSED(node_ptr), float *r_color)
 {
 	/* alpha = 0, empty circle */
 	zero_v4(r_color);
@@ -3086,6 +3086,7 @@
 int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, float coord_array[][2], int resol)
 {
 	float dist, vec[4][2];
+	float *t = link->tangents;
 	float deltax, deltay;
 	int toreroute, fromreroute;
 	/* in v0 and v3 we put begin/end points */
@@ -3125,8 +3126,14 @@
 		}
 	}
 	else {
-		vec[1][0] = vec[0][0] + dist;
-		vec[1][1] = vec[0][1];
+		if (t[0] || t[1]) {
+			vec[1][0] = vec[0][0] + t[0];
+			vec[1][1] = vec[0][1] + t[1];
+		}
+		else {
+			vec[1][0] = vec[0][0] + dist;
+			vec[1][1] = vec[0][1];
+		}
 	}
 	if (toreroute) {
 		if (ABS(deltax) > ABS(deltay)) {
@@ -3140,8 +3147,14 @@
 
 	}
 	else {
-		vec[2][0] = vec[3][0] - dist;
-		vec[2][1] = vec[3][1];
+		if (t[2] || t[3]) {
+			vec[2][0] = vec[3][0] - t[2];
+			vec[2][1] = vec[3][1] - t[3];
+		}
+		else {
+			vec[2][0] = vec[3][0] - dist;
+			vec[2][1] = vec[3][1];
+		}
 	}
 	if (v2d && min_ffff(vec[0][0], vec[1][0], vec[2][0], vec[3][0]) > v2d->cur.xmax) {
 		/* clipped */
@@ -3164,7 +3177,7 @@
 #define LINK_RESOL  24
 #define LINK_ARROW  12  /* position of arrow on the link, LINK_RESOL/2 */
 #define ARROW_SIZE 7
-void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link,
+void node_draw_link_bezier(const bContext *C, View2D *v2d, SpaceNode *snode, bNodeTree *ntree, bNodeLink *link,
                            int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3)
 {
 	float coord_array[LINK_RESOL + 1][2];
@@ -3176,12 +3189,33 @@
 		/* store current linewidth */
 		float linew;
 		float arrow[2], arrow1[2], arrow2[2];
+		float socketcolor[4];
+		bool use_socketcolor;
+
 		glGetFloatv(GL_LINE_WIDTH, &linew);
 		
 		/* we can reuse the dist variable here to increment the GL curve eval amount*/
 		dist = 1.0f / (float)LINK_RESOL;
 		
 		glEnable(GL_LINE_SMOOTH);
+		use_socketcolor = ntree && link->fromnode && link->fromsock && (link->flag & NODE_LINK_COLOR_SOCKET);
+		if (use_socketcolor) {
+			bNode *node;
+			bNodeSocket *sock;
+			PointerRNA node_ptr, sock_ptr;
+
+			node = link->fromnode;
+			sock = link->fromsock;
+			RNA_pointer_create((ID *)ntree, &RNA_Node, node, &node_ptr);
+			RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &sock_ptr);
+			/* or this:
+			* RNA_pointer_create((ID *)ntree, node->typeinfo->ext.srna, node, &node_ptr);
+			* RNA_pointer_create((ID *)ntree, sock->typeinfo->ext_socket.srna, sock, &sock_ptr);
+			*  which one is better? */
+
+			sock->typeinfo->draw_color(C, &sock_ptr, &node_ptr, socketcolor);
+			glColor4fv(socketcolor);
+		}
 		
 		drawarrow = ((link->tonode && (link->tonode->type == NODE_REROUTE)) &&
 		             (link->fromnode && (link->fromnode->type == NODE_REROUTE)));
@@ -3201,13 +3235,47 @@
 			arrow[1] = coord_array[LINK_ARROW][1];
 		}
 		if (do_triple) {
-			UI_ThemeColorShadeAlpha(th_col3, -80, -120);
+			const int coloffset = -80;
+			const int alphaoffset = -120;
+			if (!use_socketcolor) {
+				UI_ThemeColorShadeAlpha(th_col3, coloffset, alphaoffset);
+			}
+			else {
+				int r, g, b, a;
+				r = coloffset + 255 * socketcolor[0];
+				CLAMP(r, 0, 255);
+				g = coloffset + 255 * socketcolor[1];
+				CLAMP(g, 0, 255);
+				b = coloffset + 255 * socketcolor[2];
+				CLAMP(b, 0, 255);
+				a = alphaoffset + 255 * socketcolor[3];
+				CLAMP(a, 0, 255);
+				glColor4ub(r, g, b, a);
+			}
 			glLineWidth(4.0f);
 			
-			glBegin(GL_LINE_STRIP);
-			for (i = 0; i <= LINK_RESOL; i++) {
-				glVertex2fv(coord_array[i]);
+			if (link->flag & NODE_LINK_DASHED) {
+				glBegin(GL_LINES);
+				for (i = 0; i < LINK_RESOL; i++) {
+					glVertex2fv(coord_array[i]);
+					glVertex2f(
+					  0.75 * coord_array[i][0] + 0.25 * coord_array[i + 1][0],
+					  0.75 * coord_array[i][1] + 0.25 * coord_array[i + 1][1]
+					);
+					glVertex2f(
+					  0.25 * coord_array[i][0] + 0.75 * coord_array[i + 1][0],
+					  0.25 * coord_array[i][1] + 0.75 * coord_array[i + 1][1]
+					);
+					glVertex2fv(coord_array[i + 1]);
+				}
+				glEnd();
 			}
+			else {
+				glBegin(GL_LINE_STRIP);
+				for (i = 0; i <= LINK_RESOL; i++) {
+					glVertex2fv(coord_array[i]);
+				}
+			}
 			glEnd();
 			if (drawarrow) {
 				glBegin(GL_LINE_STRIP);
@@ -3217,6 +3285,7 @@
 				glVertex2fv(arrow2);
 				glEnd();
 			}
+			if (use_socketcolor) glColor4fv(socketcolor);
 		}
 		
 		/* XXX using GL_LINES for shaded node lines is a workaround
@@ -3224,9 +3293,26 @@
 		 * changing color in begin/end blocks.
 		 */
 		glLineWidth(1.5f);
-		if (do_shaded) {
+		if (link->flag & NODE_LINK_DASHED) {
+			if (!use_socketcolor) UI_ThemeColor(th_col1);
 			glBegin(GL_LINES);
 			for (i = 0; i < LINK_RESOL; i++) {
+				glVertex2fv(coord_array[i]);
+				glVertex2f(
+				  0.75 * coord_array[i][0] + 0.25 * coord_array[i + 1][0],
+				  0.75 * coord_array[i][1] + 0.25 * coord_array[i + 1][1]
+				);
+				glVertex2f(
+				  0.25 * coord_array[i][0] + 0.75 * coord_array[i + 1][0],
+				  0.25 * coord_array[i][1] + 0.75 * coord_array[i + 1][1]
+				);
+				glVertex2fv(coord_array[i + 1]);
+			}
+			glEnd();
+		}
+		else if (do_shaded && !use_socketcolor) {
+			glBegin(GL_LINES);
+			for (i = 0; i < LINK_RESOL; i++) {
 				UI_ThemeColorBlend(th_col1, th_col2, spline_step);
 				glVertex2fv(coord_array[i]);
 				
@@ -3238,7 +3324,7 @@
 			glEnd();
 		}
 		else {
-			UI_ThemeColor(th_col1);
+			if (!use_socketcolor) UI_ThemeColor(th_col1);
 			glBegin(GL_LINE_STRIP);
 			for (i = 0; i <= LINK_RESOL; i++) {
 				glVertex2fv(coord_array[i]);
@@ -3257,7 +3343,7 @@
 		
 		glDisable(GL_LINE_SMOOTH);
 		
-		/* restore previuos linewidth */
+		/* restore previous linewidth */
 		glLineWidth(1.0f);
 	}
 }
@@ -3349,7 +3435,7 @@
 #endif
 
 /* note; this is used for fake links in groups too */
-void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
+void node_draw_link(const bContext *C, View2D *v2d, SpaceNode *snode, bNodeTree *ntree, bNodeLink *link)
 {
 	int do_shaded = FALSE, th_col1 = TH_HEADER, th_col2 = TH_HEADER;
 	int do_triple = FALSE, th_col3 = TH_WIRE;
@@ -3389,7 +3475,7 @@
 		}
 	}
 	
-	node_draw_link_bezier(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
+	node_draw_link_bezier(C, v2d, snode, ntree, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
 //	node_draw_link_straight(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
 }
 

Modified: branches/hive/source/blender/editors/space_node/node_draw.c
===================================================================
--- branches/hive/source/blender/editors/space_node/node_draw.c	2013-08-28 11:22:29 UTC (rev 59597)
+++ branches/hive/source/blender/editors/space_node/node_draw.c	2013-08-28 11:26:13 UTC (rev 59598)
@@ -572,7 +572,7 @@

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list