diff options
author | Fabian Schempp <fabian_schempp> | 2021-02-11 10:16:17 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2021-02-11 10:16:17 +0300 |
commit | 8f707a72e81833bb835324ddc635b29dfbe87a9f (patch) | |
tree | 6628941c09c3a46be9b1c0f36751ed8c6669feee /source/blender/editors/space_node/drawnode.c | |
parent | 9a9e19fdcc48622dba8f98c9afb10a6750ff22b0 (diff) |
UI: Multi-input node socket spacing and interaction
This commit makes links connected to multi-input sockets spread verticaly
along the socket. Sockets grow if more links are connected and the node
layout updates accordingly. Links are sorted by their incoming angle
to avoid crossing links. Also, link picking is updated to work with
spread links and bezier links.
Currently the multi-input sockets are used in the join geometry node.
The mutli-input sockets look like a vertical rounded rectangle.
Currently they do not support the other custom socket shapes.
Reviewed By Hans Goudey, with cleanup and additional edits
Differential Revision: https://developer.blender.org/D10181
Diffstat (limited to 'source/blender/editors/space_node/drawnode.c')
-rw-r--r-- | source/blender/editors/space_node/drawnode.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 2d65302c656..4716f1c29ea 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -3560,10 +3560,10 @@ void draw_nodespace_back_pix(const bContext *C, } /* return quadratic beziers points for a given nodelink and clip if v2d is not NULL. */ -static bool node_link_bezier_handles(const View2D *v2d, - const SpaceNode *snode, - const bNodeLink *link, - float vec[4][2]) +bool node_link_bezier_handles(const View2D *v2d, + const SpaceNode *snode, + const bNodeLink *link, + float vec[4][2]) { float cursor[2] = {0.0f, 0.0f}; @@ -3591,6 +3591,9 @@ static bool node_link_bezier_handles(const View2D *v2d, if (link->tosock) { vec[3][0] = link->tosock->locx; vec[3][1] = link->tosock->locy; + if (!(link->tonode->flag & NODE_HIDDEN) && link->tosock->flag & SOCK_MULTI_INPUT) { + node_link_calculate_multi_input_position(link, vec[3]); + } toreroute = (link->tonode && link->tonode->type == NODE_REROUTE); } else { @@ -3902,7 +3905,7 @@ void node_draw_link_bezier(const View2D *v2d, int th_col3) { float vec[4][2]; - + const bool highlighted = link->flag & NODE_LINK_TEMP_HIGHLIGHT; if (node_link_bezier_handles(v2d, snode, link, vec)) { int drawarrow = ((link->tonode && (link->tonode->type == NODE_REROUTE)) && (link->fromnode && (link->fromnode->type == NODE_REROUTE))); @@ -3911,7 +3914,7 @@ void node_draw_link_bezier(const View2D *v2d, nodelink_batch_init(); } - if (g_batch_link.enabled) { + if (g_batch_link.enabled && !highlighted) { /* Add link to batch. */ nodelink_batch_add_link( snode, vec[0], vec[1], vec[2], vec[3], th_col1, th_col2, th_col3, drawarrow); @@ -3925,6 +3928,12 @@ void node_draw_link_bezier(const View2D *v2d, UI_GetThemeColor4fv(th_col1, colors[1]); UI_GetThemeColor4fv(th_col2, colors[2]); + if (highlighted) { + float link_preselection_highlight_color[4]; + UI_GetThemeColor4fv(TH_SELECT, link_preselection_highlight_color); + copy_v4_v4(colors[2], link_preselection_highlight_color); + } + GPUBatch *batch = g_batch_link.batch_single; GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_NODELINK); GPU_batch_uniform_2fv_array(batch, "bezierPts", 4, vec); |