[Bf-blender-cvs] [9a86255da8d] master: Node Editor: Visual tweaks to node links

Leon Schittek noreply at git.blender.org
Thu Sep 1 19:48:58 CEST 2022


Commit: 9a86255da8dcf0737dd664abf153c2544803788b
Author: Leon Schittek
Date:   Thu Sep 1 19:46:19 2022 +0200
Branches: master
https://developer.blender.org/rB9a86255da8dcf0737dd664abf153c2544803788b

Node Editor: Visual tweaks to node links

Several visual tweaks to node links to make them overall fit in
better with the look of the node editor:

- Change the link thickness with the zoom level to a certain degree.
- Remove the fuzziness of the node link and its shadow/outline.
- The link outline color can now be made transparent.
- Add circles at the end of dragged links when connecting to sockets.
- Improve the banding of the color interpolation along the link.
- Adjust the spacing of dashes along straight node links.

Reviewed By: Pablo Vazquez, Hans Goudey

Differential Revision: http://developer.blender.org/D15036

===================================================================

M	source/blender/editors/space_node/drawnode.cc
M	source/blender/editors/space_node/node_draw.cc
M	source/blender/editors/space_node/node_edit.cc
M	source/blender/editors/space_node/node_intern.hh
M	source/blender/gpu/shaders/gpu_shader_2D_nodelink_frag.glsl
M	source/blender/gpu/shaders/gpu_shader_2D_nodelink_vert.glsl
M	source/blender/gpu/shaders/infos/gpu_shader_2D_nodelink_info.hh
M	source/blender/makesrna/intern/rna_userdef.c

===================================================================

diff --git a/source/blender/editors/space_node/drawnode.cc b/source/blender/editors/space_node/drawnode.cc
index e8325d658ca..262b33dc0a3 100644
--- a/source/blender/editors/space_node/drawnode.cc
+++ b/source/blender/editors/space_node/drawnode.cc
@@ -6,6 +6,7 @@
  * \brief lower level node drawing for nodes (boarders, headers etc), also node layout.
  */
 
+#include "BLI_color.hh"
 #include "BLI_system.h"
 #include "BLI_threads.h"
 
@@ -1639,8 +1640,8 @@ bool node_link_bezier_handles(const View2D *v2d,
 
   if (curving == 0) {
     /* Straight line: align all points. */
-    mid_v2_v2v2(vec[1], vec[0], vec[3]);
-    mid_v2_v2v2(vec[2], vec[1], vec[3]);
+    interp_v2_v2v2(vec[1], vec[0], vec[3], 1.0f / 3.0f);
+    interp_v2_v2v2(vec[2], vec[0], vec[3], 2.0f / 3.0f);
     return true;
   }
 
@@ -1938,27 +1939,38 @@ void nodelink_batch_end(SpaceNode &snode)
   g_batch_link.enabled = false;
 }
 
+struct NodeLinkDrawConfig {
+  int th_col1;
+  int th_col2;
+  int th_col3;
+
+  ColorTheme4f start_color;
+  ColorTheme4f end_color;
+  ColorTheme4f outline_color;
+
+  bool drawarrow;
+  bool drawmuted;
+  bool highlighted;
+
+  float dim_factor;
+  float thickness;
+  float dash_factor;
+  float dash_alpha;
+};
+
 static void nodelink_batch_add_link(const SpaceNode &snode,
                                     const float2 &p0,
                                     const float2 &p1,
                                     const float2 &p2,
                                     const float2 &p3,
-                                    int th_col1,
-                                    int th_col2,
-                                    int th_col3,
-                                    const float start_color[4],
-                                    const float end_color[4],
-                                    bool drawarrow,
-                                    bool drawmuted,
-                                    float dim_factor,
-                                    float thickness,
-                                    float dash_factor,
-                                    float dash_alpha)
+                                    const NodeLinkDrawConfig &draw_config)
 {
   /* Only allow these colors. If more is needed, you need to modify the shader accordingly. */
-  BLI_assert(ELEM(th_col1, TH_WIRE_INNER, TH_WIRE, TH_ACTIVE, TH_EDGE_SELECT, TH_REDALERT));
-  BLI_assert(ELEM(th_col2, TH_WIRE_INNER, TH_WIRE, TH_ACTIVE, TH_EDGE_SELECT, TH_REDALERT));
-  BLI_assert(ELEM(th_col3, TH_WIRE, TH_REDALERT, -1));
+  BLI_assert(
+      ELEM(draw_config.th_col1, TH_WIRE_INNER, TH_WIRE, TH_ACTIVE, TH_EDGE_SELECT, TH_REDALERT));
+  BLI_assert(
+      ELEM(draw_config.th_col2, TH_WIRE_INNER, TH_WIRE, TH_ACTIVE, TH_EDGE_SELECT, TH_REDALERT));
+  BLI_assert(ELEM(draw_config.th_col3, TH_WIRE, TH_REDALERT, -1));
 
   g_batch_link.count++;
   copy_v2_v2((float *)GPU_vertbuf_raw_step(&g_batch_link.p0_step), p0);
@@ -1966,161 +1978,218 @@ static void nodelink_batch_add_link(const SpaceNode &snode,
   copy_v2_v2((float *)GPU_vertbuf_raw_step(&g_batch_link.p2_step), p2);
   copy_v2_v2((float *)GPU_vertbuf_raw_step(&g_batch_link.p3_step), p3);
   char *colid = (char *)GPU_vertbuf_raw_step(&g_batch_link.colid_step);
-  colid[0] = nodelink_get_color_id(th_col1);
-  colid[1] = nodelink_get_color_id(th_col2);
-  colid[2] = nodelink_get_color_id(th_col3);
-  colid[3] = drawarrow;
-  copy_v4_v4((float *)GPU_vertbuf_raw_step(&g_batch_link.start_color_step), start_color);
-  copy_v4_v4((float *)GPU_vertbuf_raw_step(&g_batch_link.end_color_step), end_color);
+  colid[0] = nodelink_get_color_id(draw_config.th_col1);
+  colid[1] = nodelink_get_color_id(draw_config.th_col2);
+  colid[2] = nodelink_get_color_id(draw_config.th_col3);
+  colid[3] = draw_config.drawarrow;
+  copy_v4_v4((float *)GPU_vertbuf_raw_step(&g_batch_link.start_color_step),
+             draw_config.start_color);
+  copy_v4_v4((float *)GPU_vertbuf_raw_step(&g_batch_link.end_color_step), draw_config.end_color);
   char *muted = (char *)GPU_vertbuf_raw_step(&g_batch_link.muted_step);
-  muted[0] = drawmuted;
-  *(float *)GPU_vertbuf_raw_step(&g_batch_link.dim_factor_step) = dim_factor;
-  *(float *)GPU_vertbuf_raw_step(&g_batch_link.thickness_step) = thickness;
-  *(float *)GPU_vertbuf_raw_step(&g_batch_link.dash_factor_step) = dash_factor;
-  *(float *)GPU_vertbuf_raw_step(&g_batch_link.dash_alpha_step) = dash_alpha;
+  muted[0] = draw_config.drawmuted;
+  *(float *)GPU_vertbuf_raw_step(&g_batch_link.dim_factor_step) = draw_config.dim_factor;
+  *(float *)GPU_vertbuf_raw_step(&g_batch_link.thickness_step) = draw_config.thickness;
+  *(float *)GPU_vertbuf_raw_step(&g_batch_link.dash_factor_step) = draw_config.dash_factor;
+  *(float *)GPU_vertbuf_raw_step(&g_batch_link.dash_alpha_step) = draw_config.dash_alpha;
 
   if (g_batch_link.count == NODELINK_GROUP_SIZE) {
     nodelink_batch_draw(snode);
   }
 }
 
-void node_draw_link_bezier(const bContext &C,
-                           const View2D &v2d,
-                           const SpaceNode &snode,
-                           const bNodeLink &link,
-                           const int th_col1,
-                           const int th_col2,
-                           const int th_col3,
-                           const bool selected)
+static void node_draw_link_end_marker(const float2 center,
+                                      const float radius,
+                                      const ColorTheme4f &color)
+{
+  rctf rect;
+  BLI_rctf_init(&rect, center.x - radius, center.x + radius, center.y - radius, center.y + radius);
+
+  UI_draw_roundbox_corner_set(UI_CNR_ALL);
+  UI_draw_roundbox_4fv(&rect, true, radius, color);
+  /* Roundbox disables alpha. Reenable it for node links that are drawn after this one. */
+  GPU_blend(GPU_BLEND_ALPHA);
+}
+
+static void node_draw_link_end_markers(const bNodeLink &link,
+                                       const NodeLinkDrawConfig &draw_config,
+                                       const float handles[4][2],
+                                       const bool outline)
+{
+  const float radius = (outline ? 0.65f : 0.45f) * NODE_SOCKSIZE;
+  if (link.fromsock) {
+    const float2 link_start(handles[0]);
+    node_draw_link_end_marker(
+        link_start, radius, outline ? draw_config.outline_color : draw_config.start_color);
+  }
+  if (link.tosock) {
+    const float2 link_end(handles[3]);
+    node_draw_link_end_marker(
+        link_end, radius, outline ? draw_config.outline_color : draw_config.end_color);
+  }
+}
+
+static bool node_link_is_field_link(const SpaceNode &snode, const bNodeLink &link)
+{
+  if (snode.edittree->type != NTREE_GEOMETRY) {
+    return false;
+  }
+  if (link.fromsock && link.fromsock->display_shape == SOCK_DISPLAY_SHAPE_DIAMOND) {
+    return true;
+  }
+  return false;
+}
+
+static NodeLinkDrawConfig nodelink_get_draw_config(const bContext &C,
+                                                   const View2D &v2d,
+                                                   const SpaceNode &snode,
+                                                   const bNodeLink &link,
+                                                   const int th_col1,
+                                                   const int th_col2,
+                                                   const int th_col3,
+                                                   const bool selected)
 {
-  const float dim_factor = selected ? 1.0f : node_link_dim_factor(v2d, link);
-  float thickness = 1.5f;
-  float dash_factor = 1.0f;
+  NodeLinkDrawConfig draw_config;
+
+  draw_config.th_col1 = th_col1;
+  draw_config.th_col2 = th_col2;
+  draw_config.th_col3 = th_col3;
+
+  draw_config.dim_factor = selected ? 1.0f : node_link_dim_factor(v2d, link);
 
   bTheme *btheme = UI_GetTheme();
-  const float dash_alpha = btheme->space_node.dash_alpha;
-
-  if (snode.edittree->type == NTREE_GEOMETRY) {
-    if (link.fromsock && link.fromsock->display_shape == SOCK_DISPLAY_SHAPE_DIAMOND) {
-      /* Make field links a bit thinner. */
-      thickness = 1.0f;
-      /* Draw field as dashes. */
-      dash_factor = 0.75f;
+  draw_config.dash_alpha = btheme->space_node.dash_alpha;
+
+  const bool field_link = node_link_is_field_link(snode, link);
+
+  draw_config.dash_factor = field_link ? 0.75f : 1.0f;
+
+  const float scale = UI_view2d_scale_get_x(&v2d);
+  /* Clamp the thickness to make the links more readable when zooming out. */
+  draw_config.thickness = max_ff(scale, 1.0f) * (field_link ? 0.7f : 1.0f);
+  draw_config.highlighted = link.flag & NODE_LINK_TEMP_HIGHLIGHT;
+  draw_config.drawarrow = ((link.tonode && (link.tonode->type == NODE_REROUTE)) &&
+                           (link.fromnode && (link.fromnode->type == NODE_REROUTE)));
+  draw_config.drawmuted = (link.flag & NODE_LINK_MUTED);
+
+  UI_GetThemeColor4fv(th_col3, draw_config.outline_color);
+
+  if (snode.overlay.flag & SN_OVERLAY_SHOW_OVERLAYS &&
+      snode.overlay.flag & SN_OVERLAY_SHOW_WIRE_COLORS) {
+    PointerRNA from_node_ptr, to_node_ptr;
+    RNA_pointer_create((ID *)snode.edittree, &RNA_Node, link.fromnode, &from_node_ptr);
+    RNA_pointer_create((ID *)snode.edittree, &RNA_Node, link.tonode, &to_node_ptr);
+
+    if (link.fromsock) {
+      node_socket_color_get(
+          C, *snode.edittree, from_node_ptr, *link.fromsock, draw_config.start_color);
+    }
+    else {
+      node_socket_color_get(
+          C, *snode.edittree, to_node_ptr, *link.tosock, draw_config.start_color);
     }
-  }
 
-  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)));
-    int drawmuted = (link.flag & NODE_LINK_MUTED);
-    if (g_batch_link.batch == nullptr) {
-      nodelink_batch_init();
+    if (link.tosock) {
+      node_socket_color_get(C, *snode.edittree, to_node_ptr, *link.tosock, draw_config.end_color);
     }
-    /* Draw single link. */
-    float colors[3][4] = {{0.0f}};
-    if (th_col3 != -1) {
-      UI_GetThemeColor4fv(th_col3, colors[0]);
+    els

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list