[Bf-blender-cvs] [3f1603a8f84] temp-geometry-nodes-expandable-geometry-socket-prototype: initial socket draw override

Jacques Lucke noreply at git.blender.org
Tue Aug 3 13:45:42 CEST 2021


Commit: 3f1603a8f84660db7a654050fedf32c8940e1b57
Author: Jacques Lucke
Date:   Tue Aug 3 13:41:53 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rB3f1603a8f84660db7a654050fedf32c8940e1b57

initial socket draw override

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/editors/space_node/node_draw.cc
M	source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index c2e091b5c0e..d34b3ca26d5 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -223,6 +223,11 @@ typedef int (*NodeGPUExecFunction)(struct GPUMaterial *mat,
                                    struct bNodeExecData *execdata,
                                    struct GPUNodeStack *in,
                                    struct GPUNodeStack *out);
+typedef bool (*NodeDrawSocketFunction)(const struct bContext *C,
+                                       struct uiLayout *layout,
+                                       struct bNodeTree *ntree,
+                                       struct bNode *node,
+                                       struct bNodeSocket *socket);
 
 /**
  * \brief Defines a node type.
@@ -339,6 +344,10 @@ typedef struct bNodeType {
   NodeGeometryExecFunction geometry_node_execute;
   bool geometry_node_execute_supports_laziness;
 
+  /* Draws a socket in a way specific to this node. If false is returned, the socket will be drawn
+   * as usual. */
+  NodeDrawSocketFunction draw_socket;
+
   /* RNA integration */
   ExtensionRNA rna_ext;
 } bNodeType;
diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc
index ad7f1f708f1..ec257f428ca 100644
--- a/source/blender/editors/space_node/node_draw.cc
+++ b/source/blender/editors/space_node/node_draw.cc
@@ -353,6 +353,27 @@ void node_from_view(const bNode *node, float x, float y, float *rx, float *ry)
   nodeFromView(node, x, y, rx, ry);
 }
 
+static void draw_socket_layout(
+    const bContext *C, uiLayout *layout, bNodeTree *ntree, bNode *node, bNodeSocket *socket)
+{
+  if (node->typeinfo->draw_socket) {
+    if (node->typeinfo->draw_socket(C, layout, ntree, node, socket)) {
+      return;
+    }
+  }
+  uiLayout *row = uiLayoutRow(layout, true);
+  if (socket->in_out == SOCK_OUT) {
+    uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_RIGHT);
+  }
+
+  PointerRNA nodeptr;
+  RNA_pointer_create(&ntree->id, &RNA_Node, node, &nodeptr);
+  PointerRNA sockptr;
+  RNA_pointer_create(&ntree->id, &RNA_NodeSocket, socket, &sockptr);
+  const char *socket_label = nodeSocketLabel(socket);
+  socket->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(socket_label));
+}
+
 /**
  * Based on settings and sockets in node, set drawing rect info.
  */
@@ -404,11 +425,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
     uiLayoutSetContextPointer(layout, "node", &nodeptr);
     uiLayoutSetContextPointer(layout, "socket", &sockptr);
 
-    /* Align output buttons to the right. */
-    uiLayout *row = uiLayoutRow(layout, true);
-    uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_RIGHT);
-    const char *socket_label = nodeSocketLabel(nsock);
-    nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(socket_label));
+    draw_socket_layout(C, layout, ntree, node, nsock);
 
     UI_block_align_end(node->block);
     UI_block_layout_resolve(node->block, nullptr, &buty);
@@ -541,10 +558,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
     uiLayoutSetContextPointer(layout, "node", &nodeptr);
     uiLayoutSetContextPointer(layout, "socket", &sockptr);
 
-    uiLayout *row = uiLayoutRow(layout, true);
-
-    const char *socket_label = nodeSocketLabel(nsock);
-    nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(socket_label));
+    draw_socket_layout(C, layout, ntree, node, nsock);
 
     UI_block_align_end(node->block);
     UI_block_layout_resolve(node->block, nullptr, &buty);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
index d6903b0a085..5d08e9d9b82 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
@@ -38,6 +38,13 @@ static void geo_node_geometry_expander_layout(uiLayout *layout,
   uiItemO(layout, "Add", ICON_ADD, "node.geometry_expander_output_add");
 }
 
+static bool geo_node_geometry_expande_socket_layout(
+    const bContext *C, uiLayout *layout, bNodeTree *ntree, bNode *node, bNodeSocket *socket)
+{
+  uiItemL(layout, "Hello World", ICON_NONE);
+  return true;
+}
+
 static void geo_node_geometry_expander_exec(GeoNodeExecParams params)
 {
   const bNode &bnode = params.node();
@@ -147,5 +154,6 @@ void register_node_type_geo_geometry_expander()
   node_type_update(&ntype, blender::nodes::geo_node_geometry_expander_update);
   ntype.geometry_node_execute = blender::nodes::geo_node_geometry_expander_exec;
   ntype.draw_buttons = blender::nodes::geo_node_geometry_expander_layout;
+  ntype.draw_socket = blender::nodes::geo_node_geometry_expande_socket_layout;
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list