[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