[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