[Bf-blender-cvs] [4bc27fcdf0f] temp-geometry-nodes-expandable-geometry-socket-prototype: initial support for adding geometry expander outputs

Jacques Lucke noreply at git.blender.org
Tue Aug 3 12:08:34 CEST 2021


Commit: 4bc27fcdf0fa48a7cb824721a2a2d54c533223b9
Author: Jacques Lucke
Date:   Tue Aug 3 11:48:51 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rB4bc27fcdf0fa48a7cb824721a2a2d54c533223b9

initial support for adding geometry expander outputs

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

M	source/blender/editors/space_node/node_edit.cc
M	source/blender/editors/space_node/node_intern.h
M	source/blender/editors/space_node/node_ops.c
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc

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

diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc
index cbf03f553f6..70f41d979bc 100644
--- a/source/blender/editors/space_node/node_edit.cc
+++ b/source/blender/editors/space_node/node_edit.cc
@@ -22,6 +22,7 @@
  */
 
 #include <algorithm>
+#include <string>
 
 #include "MEM_guardedalloc.h"
 
@@ -2976,3 +2977,52 @@ void NODE_OT_cryptomatte_layer_remove(wmOperatorType *ot)
   /* flags */
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
+
+/* ****************** Geometry Expander Add Output  ******************* */
+
+static int node_geometry_expander_output_add_exec(bContext *C, wmOperator *UNUSED(op))
+{
+  SpaceNode *snode = CTX_wm_space_node(C);
+  PointerRNA ptr = CTX_data_pointer_get(C, "node");
+  bNode *node = (bNode *)ptr.data;
+  bNodeTree *ntree = (bNodeTree *)ptr.owner_id;
+  NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)node->storage;
+
+  auto to_identifier = [](int id) { return "out_" + std::to_string(id); };
+
+  int id = 0;
+  while (nodeFindSocket(node, SOCK_OUT, to_identifier(id).c_str()) != nullptr) {
+    id++;
+  }
+  const std::string identifier = to_identifier(id);
+
+  GeometryExpanderOutput *expander_output = (GeometryExpanderOutput *)MEM_callocN(
+      sizeof(GeometryExpanderOutput), __func__);
+  expander_output->data_identifier = BLI_strdup("position");
+  expander_output->socket_identifier = BLI_strdup(identifier.c_str());
+  expander_output->socket_type = SOCK_FLOAT;
+  BLI_addtail(&storage->outputs, expander_output);
+
+  nodeUpdate(ntree, node);
+  ntreeUpdateTree(CTX_data_main(C), ntree);
+
+  snode_notify(C, snode);
+  snode_dag_update(C, snode);
+
+  return OPERATOR_FINISHED;
+}
+
+void NODE_OT_geometry_expander_output_add(wmOperatorType *ot)
+{
+  /* identifiers */
+  ot->name = "Add Geometry Expander Output";
+  ot->description = "Add geometry expander output";
+  ot->idname = "NODE_OT_geometry_expander_output_add";
+
+  /* callbacks */
+  ot->exec = node_geometry_expander_output_add_exec;
+  ot->poll = ED_operator_node_editable;
+
+  /* flags */
+  ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index df20420e472..73520bf3262 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -312,6 +312,8 @@ void NODE_GGT_backdrop_corner_pin(struct wmGizmoGroupType *gzgt);
 void NODE_OT_cryptomatte_layer_add(struct wmOperatorType *ot);
 void NODE_OT_cryptomatte_layer_remove(struct wmOperatorType *ot);
 
+void NODE_OT_geometry_expander_output_add(struct wmOperatorType *ot);
+
 /* node_geometry_attribute_search.cc */
 void node_geometry_add_attribute_search_button(const struct bContext *C,
                                                const struct bNodeTree *node_tree,
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index 610c2889e7a..ffe8e9469da 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -124,6 +124,8 @@ void node_operatortypes(void)
 
   WM_operatortype_append(NODE_OT_cryptomatte_layer_add);
   WM_operatortype_append(NODE_OT_cryptomatte_layer_remove);
+
+  WM_operatortype_append(NODE_OT_geometry_expander_output_add);
 }
 
 void ED_operatormacros_node(void)
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index d2bc3d3eb06..22906bc7229 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1419,9 +1419,14 @@ typedef struct NodeGeometryRaycast {
 } NodeGeometryRaycast;
 
 typedef struct GeometryExpanderOutput {
+  struct GeometryExpanderOutput *next, *prev;
+  /* AttributeDomain. */
   int8_t domain;
+  /* GeometryComponentType. */
   int8_t component_type;
-  char _pad[6];
+  /* eNodeSocketDatatype. */
+  int8_t socket_type;
+  char _pad[5];
   char *data_identifier;
   char *socket_identifier;
 } GeometryExpanderOutput;
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 d9a048ae218..3298f4b4f95 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
@@ -31,10 +31,11 @@ static bNodeSocketTemplate geo_node_geometry_expander_in[] = {
 
 namespace blender::nodes {
 
-static void geo_node_geometry_expander_layout(uiLayout *UNUSED(layout),
+static void geo_node_geometry_expander_layout(uiLayout *layout,
                                               bContext *UNUSED(C),
                                               PointerRNA *UNUSED(ptr))
 {
+  uiItemO(layout, "Add", ICON_ADD, "node.geometry_expander_output_add");
 }
 
 static void geo_node_geometry_expander_exec(GeoNodeExecParams params)
@@ -50,6 +51,24 @@ static void geo_node_geometry_expander_init(bNodeTree *UNUSED(ntree), bNode *nod
   node->storage = storage;
 }
 
+static void geo_node_geometry_expander_update(bNodeTree *ntree, bNode *node)
+{
+  NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)node->storage;
+  LISTBASE_FOREACH_MUTABLE (bNodeSocket *, socket, &node->outputs) {
+    nodeRemoveSocket(ntree, node, socket);
+  }
+  LISTBASE_FOREACH (GeometryExpanderOutput *, expander_output, &storage->outputs) {
+    const char *idname = nodeStaticSocketType(expander_output->socket_type, PROP_NONE);
+    nodeAddSocket(ntree,
+                  node,
+                  SOCK_OUT,
+                  idname,
+                  expander_output->socket_identifier,
+                  expander_output->data_identifier);
+  }
+  // nodeAddSocket(ntree, node, SOCK_OUT, "NodeSocketFloat", "")
+}
+
 static void geo_node_geometry_expander_storage_free(bNode *node)
 {
   NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)node->storage;
@@ -74,7 +93,7 @@ static void geo_node_geometry_expander_storage_copy(bNodeTree *UNUSED(dest_ntree
     *dst_output = *src_output;
     dst_output->data_identifier = (char *)MEM_dupallocN(src_output->data_identifier);
     dst_output->socket_identifier = (char *)MEM_dupallocN(src_output->socket_identifier);
-    BLI_addtail(&dst_storage->outputs, src_output);
+    BLI_addtail(&dst_storage->outputs, dst_output);
   }
   dst_node->storage = dst_storage;
 }
@@ -93,6 +112,7 @@ void register_node_type_geo_geometry_expander()
                     "NodeGeometryGeometryExpander",
                     blender::nodes::geo_node_geometry_expander_storage_free,
                     blender::nodes::geo_node_geometry_expander_storage_copy);
+  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;
   nodeRegisterType(&ntype);



More information about the Bf-blender-cvs mailing list