[Bf-blender-cvs] [10b78013eb3] temp-attribute-processor: support default mode again and have separate default attribute name

Jacques Lucke noreply at git.blender.org
Tue Jun 22 05:25:05 CEST 2021


Commit: 10b78013eb318af046daafe5a55f9576fe13b951
Author: Jacques Lucke
Date:   Thu Jun 10 12:07:37 2021 +0200
Branches: temp-attribute-processor
https://developer.blender.org/rB10b78013eb318af046daafe5a55f9576fe13b951

support default mode again and have separate default attribute name

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

M	source/blender/blenkernel/intern/node.cc
M	source/blender/editors/space_node/node_buttons.c
M	source/blender/editors/space_node/node_group.cc
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc

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

diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 3d146497a9c..338be7c3560 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -480,6 +480,7 @@ static void write_node_socket_interface(BlendWriter *writer, bNodeSocket *sock)
   }
 
   write_node_socket_default_value(writer, sock);
+  BLO_write_string(writer, sock->default_attribute_name);
 }
 
 /* this is only direct data, tree itself should have been written */
@@ -653,6 +654,7 @@ static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock)
   sock->typeinfo = nullptr;
   BLO_read_data_address(reader, &sock->storage);
   BLO_read_data_address(reader, &sock->default_value);
+  BLO_read_data_address(reader, &sock->default_attribute_name);
   sock->total_inputs = 0; /* Clear runtime data set before drawing. */
   sock->cache = nullptr;
 }
@@ -2150,6 +2152,9 @@ static void node_socket_copy(bNodeSocket *sock_dst, const bNodeSocket *sock_src,
       socket_id_user_increment(sock_dst);
     }
   }
+  if (sock_src->default_attribute_name) {
+    sock_dst->default_attribute_name = (char *)MEM_dupallocN(sock_src->default_attribute_name);
+  }
 
   sock_dst->stack_index = 0;
   /* XXX some compositor node (e.g. image, render layers) still store
@@ -3102,6 +3107,9 @@ static void node_socket_interface_free(bNodeTree *UNUSED(ntree),
     }
     MEM_freeN(sock->default_value);
   }
+  if (sock->default_attribute_name) {
+    MEM_freeN(sock->default_attribute_name);
+  }
 }
 
 static void free_localized_node_groups(bNodeTree *ntree)
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c
index 336b0c46a81..6ab31373e32 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -165,6 +165,10 @@ static void draw_socket_list(const bContext *C,
     if (socket->typeinfo->interface_draw) {
       socket->typeinfo->interface_draw((bContext *)C, layout, &socket_ptr);
     }
+
+    if (ntree->type == NTREE_ATTRIBUTE) {
+      uiItemR(layout, &socket_ptr, "default_attribute_name", 0, "Attribute", ICON_NONE);
+    }
   }
 }
 
diff --git a/source/blender/editors/space_node/node_group.cc b/source/blender/editors/space_node/node_group.cc
index be8a30c8b54..3c87533e86e 100644
--- a/source/blender/editors/space_node/node_group.cc
+++ b/source/blender/editors/space_node/node_group.cc
@@ -1146,7 +1146,7 @@ static int node_group_interface_add_invoke(bContext *C,
                                            wmOperator *op,
                                            const wmEvent *UNUSED(event))
 {
-  return WM_operator_props_dialog_popup(C, op, 200);
+  return WM_operator_props_dialog_popup(C, op, 300);
 }
 
 static int node_group_interface_add_exec(bContext *C, wmOperator *op)
@@ -1169,7 +1169,8 @@ static int node_group_interface_add_exec(bContext *C, wmOperator *op)
   NODE_SOCKET_TYPES_END;
   BLI_assert(socket_idname != nullptr);
 
-  ntreeAddSocketInterface(ntree, in_out, socket_idname, name);
+  bNodeSocket *sock = ntreeAddSocketInterface(ntree, in_out, socket_idname, name);
+  sock->default_attribute_name = RNA_string_get_alloc(op->ptr, "attribute_name", nullptr, 0);
 
   if (name != nullptr) {
     MEM_freeN(name);
@@ -1207,8 +1208,11 @@ static const EnumPropertyItem *node_group_interface_add_type_items(bContext *C,
 static void node_group_interface_add_ui(bContext *UNUSED(C), wmOperator *op)
 {
   uiLayout *layout = op->layout;
+  uiLayoutSetPropSep(layout, true);
+  uiLayoutSetPropDecorate(layout, false);
   uiLayoutSetActivateInit(layout, true);
   uiItemR(layout, op->ptr, "name", 0, "Name", ICON_NONE);
+  uiItemR(layout, op->ptr, "attribute_name", 0, "Default Attribute", ICON_NONE);
   uiItemR(layout, op->ptr, "type", 0, "Type", ICON_NONE);
 }
 
@@ -1233,6 +1237,7 @@ void NODE_OT_group_interface_add(wmOperatorType *ot)
   RNA_def_enum(ot->srna, "in_out", rna_enum_node_socket_in_out_items, SOCK_IN, "Socket Side", "");
 
   RNA_def_string(ot->srna, "name", nullptr, MAX_NAME, "Name", "Name of the new interface socket");
+  RNA_def_string(ot->srna, "attribute_name", nullptr, MAX_NAME, "Attribute Name", "");
 
   prop = RNA_def_property(ot->srna, "type", PROP_ENUM, PROP_NONE);
   RNA_def_property_enum_funcs_runtime(prop, nullptr, nullptr, node_group_interface_add_type_items);
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 22ebf9eee91..59fada43bdd 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -114,6 +114,7 @@ typedef struct bNodeSocket {
 
   /** Default input value used for unlinked sockets. */
   void *default_value;
+  char *default_attribute_name;
 
   /* execution data */
   /** Local stack index. */
@@ -1384,6 +1385,10 @@ typedef struct AttributeProcessorOutputSettings {
   struct AttributeProcessorOutputSettings *next, *prev;
 
   char *identifier;
+
+  /* GeometryNodeAttributeProcessorOutputMode. */
+  uint8_t output_mode;
+  char _pad[7];
 } AttributeProcessorOutputSettings;
 
 typedef struct NodeGeometryAttributeProcessor {
@@ -1916,8 +1921,14 @@ typedef enum GeometryNodeAttributeTransferMapMode {
 typedef enum GeometryNodeAttributeProcessorInputMode {
   GEO_NODE_ATTRIBUTE_PROCESSOR_INPUT_MODE_VALUE = 0,
   GEO_NODE_ATTRIBUTE_PROCESSOR_INPUT_MODE_ATTRIBUTE = 1,
+  GEO_NODE_ATTRIBUTE_PROCESSOR_INPUT_MODE_DEFAULT = 2,
 } GeometryNodeAttributeProcessorInputMode;
 
+typedef enum GeometryNodeAttributeProcessorOutputMode {
+  GEO_NODE_ATTRIBUTE_PROCESSOR_OUTPUT_MODE_ATTRIBUTE = 0,
+  GEO_NODE_ATTRIBUTE_PROCESSOR_OUTPUT_MODE_DEFAULT = 1,
+} GeometryNodeAttributeProcessorOutputMode;
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 8b0bfe789d1..1186bcce3e2 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -9998,6 +9998,11 @@ static void def_geo_attribute_processor_group_input(BlenderRNA *brna)
        0,
        "Attribute",
        "Pass a attribute name into the group"},
+      {GEO_NODE_ATTRIBUTE_PROCESSOR_INPUT_MODE_DEFAULT,
+       "DEFAULT",
+       0,
+       "Default",
+       "Use the default attribute name or default value if the attribute does not exist"},
       {0, NULL, 0, NULL, NULL},
   };
 
@@ -10020,6 +10025,20 @@ static void def_geo_attribute_processor_group_input(BlenderRNA *brna)
 
 static void def_geo_attribute_processor_group_output(BlenderRNA *brna)
 {
+  static EnumPropertyItem input_mode_items[] = {
+      {GEO_NODE_ATTRIBUTE_PROCESSOR_OUTPUT_MODE_ATTRIBUTE,
+       "ATTRIBUTE",
+       0,
+       "Attribute",
+       "Specify the attribute the result should be stored in"},
+      {GEO_NODE_ATTRIBUTE_PROCESSOR_OUTPUT_MODE_DEFAULT,
+       "DEFAULT",
+       0,
+       "Default",
+       "Use the default attribute name for the output"},
+      {0, NULL, 0, NULL, NULL},
+  };
+
   StructRNA *srna;
   PropertyRNA *prop;
 
@@ -10029,6 +10048,12 @@ static void def_geo_attribute_processor_group_output(BlenderRNA *brna)
   prop = RNA_def_property(srna, "identifier", PROP_STRING, PROP_NONE);
   RNA_def_property_ui_text(prop, "identifier", "Identifier of the matching socket in the group");
   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+
+  prop = RNA_def_property(srna, "output_mode", PROP_ENUM, PROP_NONE);
+  RNA_def_property_ui_text(prop, "Output Mode", "Where the group output is stored");
+  RNA_def_property_enum_items(prop, input_mode_items);
+  RNA_def_property_update(
+      prop, NC_NODE | NA_EDITED, "rna_GeometryNodeAttributeProcessor_mode_update");
 }
 
 static void def_geo_attribute_processor(StructRNA *srna)
@@ -10338,6 +10363,10 @@ static void rna_def_node_socket_interface(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Tooltip", "Socket tooltip");
   RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
 
+  prop = RNA_def_property(srna, "default_attribute_name", PROP_STRING, PROP_NONE);
+  RNA_def_property_ui_text(prop, "Default Attribute Name", "");
+  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocketInterface_update");
+
   prop = RNA_def_property(srna, "is_output", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_funcs(prop, "rna_NodeSocket_is_output_get", NULL);
   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc
index 9095285ca71..0600332f8db 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc
@@ -27,6 +27,7 @@
 #include "UI_resources.h"
 
 #include "NOD_node_tree_multi_function.hh"
+#include "NOD_type_callbacks.hh"
 
 #include "FN_multi_function_network_evaluation.hh"
 
@@ -34,6 +35,9 @@
 
 static void geo_node_attribute_processor_layout(uiLayout *layout, bContext *C, PointerRNA *ptr)
 {
+  uiLayoutSetPropSep(layout, true);
+  uiLayoutSetPropDecorate(layout, false);
+
   bNode *node = (bNode *)ptr->data;
   NodeGeometryAttributeProcessor *storage = (NodeGeometryAttributeProcessor *)node->storage;
 
@@ -49,17 +53,33 @@ static void geo_node_attribute_processor_layout(uiLayout *layout, bContext *C, P
     return;
   }
 
-  uiLayout *col = uiLayoutColumn(layout, false);
+  {
+    uiLayout *col = uiLayoutColumn(layout, false);
 
-  bNodeSocket *interface_socket = (bNodeSocket *)group->inputs.first;
-  AttributeProcessorInputSettings *input_settings = (AttributeProcessorInputSettings *)
-                                                        storage->inputs_settings.first;
-  for (; interface_socket && input_settings;
-       interface_socket = interface_socket->next, input_settings = input_settings->next) {
-    PointerRNA input_ptr;
-    RNA_pointer_create(
-        ptr->owner_id, &RNA_AttributeProcessorInputSettings, input_settings, &input_ptr);
-    uiItemR(col, &input_ptr, "input_mode", 0, interface_socket->name, ICON_NONE);
+    bNodeSocket *interface_socket = (b

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list