[Bf-blender-cvs] [d4e46c13cc9] master: Geometry Nodes: Add named attribute nodes behind experimental flag

Hans Goudey noreply at git.blender.org
Mon Mar 14 17:56:20 CET 2022


Commit: d4e46c13cc92e01489a031a6afe6bafb5af5ca18
Author: Hans Goudey
Date:   Mon Mar 14 11:48:11 2022 -0500
Branches: master
https://developer.blender.org/rBd4e46c13cc92e01489a031a6afe6bafb5af5ca18

Geometry Nodes: Add named attribute nodes behind experimental flag

This commit adds three nodes:
- `Remove Attribute`: Removes an attribute with the given name
- `Named Attribute`: A field input node
- `Store Named Attribute`: Puts results of a field in a named attribute

They are added behind a new experimental feature flag, because further
development of attribute search and name dependency visualization will
happen as separate steps.

Ref T91742

Differential Revision: https://developer.blender.org/D12685

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

M	release/scripts/startup/bl_ui/space_userpref.py
M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.cc
M	source/blender/blenloader/intern/versioning_300.c
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/makesrna/intern/rna_userdef.c
M	source/blender/nodes/NOD_geometry.h
M	source/blender/nodes/NOD_static_types.h
M	source/blender/nodes/geometry/CMakeLists.txt
R082	source/blender/nodes/geometry/nodes/node_geo_attribute_remove.cc	source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_remove.cc
A	source/blender/nodes/geometry/nodes/node_geo_input_named_attribute.cc
A	source/blender/nodes/geometry/nodes/node_geo_remove_attribute.cc
A	source/blender/nodes/geometry/nodes/node_geo_store_named_attribute.cc

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

diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index f80ad378b3c..09716c77917 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -2262,6 +2262,7 @@ class USERPREF_PT_experimental_new_features(ExperimentalPanel, Panel):
                 ({"property": "use_sculpt_tools_tilt"}, "T82877"),
                 ({"property": "use_extended_asset_browser"}, ("project/view/130/", "Project Page")),
                 ({"property": "use_override_templates"}, ("T73318", "Milestone 4")),
+                ({"property": "use_named_attribute_nodes"}, ("T91742")),
             ),
         )
 
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index a0205a2bcb1..705b98c4d11 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -201,6 +201,8 @@ def geometry_input_node_items(context):
     yield NodeItem("ShaderNodeValue")
     yield NodeItem("FunctionNodeInputVector")
     yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
+    if named_attribute_poll(context):
+        yield NodeItem("GeometryNodeInputNamedAttribute")
     yield NodeItem("GeometryNodeInputID")
     yield NodeItem("GeometryNodeInputIndex")
     yield NodeItem("GeometryNodeInputNormal")
@@ -358,6 +360,10 @@ def geometry_nodes_legacy_poll(context):
     return context.preferences.experimental.use_geometry_nodes_legacy
 
 
+def named_attribute_poll(context):
+    return context.preferences.experimental.use_named_attribute_nodes
+
+
 # All standard node categories currently used in nodes.
 
 shader_node_categories = [
@@ -683,6 +689,8 @@ geometry_node_categories = [
         NodeItem("GeometryNodeAttributeDomainSize"),
         NodeItem("GeometryNodeAttributeStatistic"),
         NodeItem("GeometryNodeAttributeTransfer"),
+        NodeItem("GeometryNodeStoreNamedAttribute", poll=named_attribute_poll),
+        NodeItem("GeometryNodeRemoveAttribute", poll=named_attribute_poll),
     ]),
     GeometryNodeCategory("GEO_COLOR", "Color", items=[
         NodeItem("ShaderNodeMixRGB"),
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 4e664192019..904f06f2734 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1392,7 +1392,7 @@ struct TexResult;
 #define GEO_NODE_LEGACY_ATTRIBUTE_COMBINE_XYZ 1027
 #define GEO_NODE_LEGACY_ATTRIBUTE_SEPARATE_XYZ 1028
 #define GEO_NODE_SUBDIVIDE_MESH 1029
-#define GEO_NODE_ATTRIBUTE_REMOVE 1030
+#define GEO_NODE_LEGACY_ATTRIBUTE_REMOVE 1030
 #define GEO_NODE_LEGACY_ATTRIBUTE_CONVERT 1031
 #define GEO_NODE_MESH_PRIMITIVE_CUBE 1032
 #define GEO_NODE_MESH_PRIMITIVE_CIRCLE 1033
@@ -1517,6 +1517,9 @@ struct TexResult;
 #define GEO_NODE_MERGE_BY_DISTANCE 1153
 #define GEO_NODE_DUPLICATE_ELEMENTS 1154
 #define GEO_NODE_INPUT_MESH_FACE_IS_PLANAR 1155
+#define GEO_NODE_STORE_NAMED_ATTRIBUTE 1156
+#define GEO_NODE_INPUT_NAMED_ATTRIBUTE 1157
+#define GEO_NODE_REMOVE_ATTRIBUTE 1158
 
 /** \} */
 
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 51a2545d7b9..9a573919165 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -4694,6 +4694,7 @@ static void registerGeometryNodes()
 
   register_node_type_geo_legacy_attribute_proximity();
   register_node_type_geo_legacy_attribute_randomize();
+  register_node_type_geo_legacy_attribute_remove();
   register_node_type_geo_legacy_attribute_transfer();
   register_node_type_geo_legacy_curve_endpoints();
   register_node_type_geo_legacy_curve_reverse();
@@ -4726,7 +4727,6 @@ static void registerGeometryNodes()
   register_node_type_geo_attribute_map_range();
   register_node_type_geo_attribute_math();
   register_node_type_geo_attribute_mix();
-  register_node_type_geo_attribute_remove();
   register_node_type_geo_attribute_separate_xyz();
   register_node_type_geo_attribute_statistic();
   register_node_type_geo_attribute_vector_math();
@@ -4768,6 +4768,7 @@ static void registerGeometryNodes()
   register_node_type_geo_flip_faces();
   register_node_type_geo_geometry_to_instance();
   register_node_type_geo_image_texture();
+  register_node_type_geo_input_named_attribute();
   register_node_type_geo_input_curve_handles();
   register_node_type_geo_input_curve_tilt();
   register_node_type_geo_input_id();
@@ -4821,6 +4822,7 @@ static void registerGeometryNodes()
   register_node_type_geo_proximity();
   register_node_type_geo_raycast();
   register_node_type_geo_realize_instances();
+  register_node_type_geo_remove_attribute();
   register_node_type_geo_rotate_instances();
   register_node_type_geo_sample_texture();
   register_node_type_geo_scale_elements();
@@ -4838,6 +4840,7 @@ static void registerGeometryNodes()
   register_node_type_geo_set_shade_smooth();
   register_node_type_geo_set_spline_cyclic();
   register_node_type_geo_set_spline_resolution();
+  register_node_type_geo_store_named_attribute();
   register_node_type_geo_string_join();
   register_node_type_geo_string_to_curves();
   register_node_type_geo_subdivision_surface();
diff --git a/source/blender/blenloader/intern/versioning_300.c b/source/blender/blenloader/intern/versioning_300.c
index 9afaad04066..eead735b305 100644
--- a/source/blender/blenloader/intern/versioning_300.c
+++ b/source/blender/blenloader/intern/versioning_300.c
@@ -527,7 +527,7 @@ static void version_geometry_nodes_add_realize_instance_nodes(bNodeTree *ntree)
              GEO_NODE_TRIM_CURVE,
              GEO_NODE_REPLACE_MATERIAL,
              GEO_NODE_SUBDIVIDE_MESH,
-             GEO_NODE_ATTRIBUTE_REMOVE,
+             GEO_NODE_LEGACY_ATTRIBUTE_REMOVE,
              GEO_NODE_TRIANGULATE)) {
       bNodeSocket *geometry_socket = node->inputs.first;
       add_realize_instances_before_socket(ntree, node, geometry_socket);
@@ -999,7 +999,7 @@ static bool geometry_node_is_293_legacy(const short node_type)
     /* Maybe legacy: Might need special attribute handling, depending on design. */
     case GEO_NODE_SWITCH:
     case GEO_NODE_JOIN_GEOMETRY:
-    case GEO_NODE_ATTRIBUTE_REMOVE:
+    case GEO_NODE_LEGACY_ATTRIBUTE_REMOVE:
     case GEO_NODE_OBJECT_INFO:
     case GEO_NODE_COLLECTION_INFO:
       return false;
@@ -2637,5 +2637,14 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
    */
   {
     /* Keep this block, even when empty. */
+
+    /* Deprecate the attribute remove node. It was hidden and is replaced by a version without a
+     * multi-input socket. */
+    LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) {
+      if (ntree->type == NTREE_GEOMETRY) {
+        version_node_id(
+            ntree, GEO_NODE_LEGACY_ATTRIBUTE_REMOVE, "GeometryNodeLegacyAttributeRemove");
+      }
+    }
   }
 }
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 18b79a6fc25..5bd44868741 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1592,6 +1592,18 @@ typedef struct NodeGeometryAttributeCapture {
   int8_t domain;
 } NodeGeometryAttributeCapture;
 
+typedef struct NodeGeometryStoreNamedAttribute {
+  /* CustomDataType. */
+  int8_t data_type;
+  /* AttributeDomain. */
+  int8_t domain;
+} NodeGeometryStoreNamedAttribute;
+
+typedef struct NodeGeometryInputNamedAttribute {
+  /* CustomDataType. */
+  int8_t data_type;
+} NodeGeometryInputNamedAttribute;
+
 typedef struct NodeGeometryStringToCurves {
   /* GeometryNodeStringToCurvesOverflowMode */
   uint8_t overflow;
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 80a107e4bae..5784d437048 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -650,7 +650,8 @@ typedef struct UserDef_Experimental {
   char use_sculpt_tools_tilt;
   char use_extended_asset_browser;
   char use_override_templates;
-  char _pad[2];
+  char use_named_attribute_nodes;
+  char _pad[1];
   /** `makesdna` does not allow empty structs. */
 } UserDef_Experimental;
 
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index d1c37eff36f..f212b4a1d23 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -11281,6 +11281,40 @@ static void def_geo_curve_fill(StructRNA *srna)
   RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
 }
 
+static void def_geo_store_named_attribute(StructRNA *srna)
+{
+  PropertyRNA *prop;
+
+  RNA_def_struct_sdna_from(srna, "NodeGeometryStoreNamedAttribute", "storage");
+
+  prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
+  RNA_def_property_enum_items(prop, rna_enum_attribute_type_items);
+  RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_GeometryNodeAttributeFill_type_itemf");
+  RNA_def_property_enum_default(prop, CD_PROP_FLOAT);
+  RNA_def_property_ui_text(prop, "Data Type", "Type of data stored in attribute");
+  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_GeometryNode_socket_update");
+
+  prop = RNA_def_property(srna, "domain", PROP_ENUM, PROP_NONE);
+  RNA_def_property_enum_items(prop, rna_enum_attribute_domain_items);
+  RNA_def_property_enum_default(prop, ATTR_DOMAIN_POINT);
+  RNA_def_property_ui_text(prop, "Domain", "Which domain to store the data in");
+  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
+}
+
+static void def_geo_input_named_attribute(StructRNA *srna)
+{
+  PropertyRNA *prop;
+
+  RNA_def_struct_sdna_from(srna, "NodeGeometryInputNamedAttribute", "storage");
+
+  prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
+  RNA_def_property_enum_items(prop, rna_enum_attribute_type_items);
+  RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_GeometryNodeAttributeFill_type_itemf");
+  RNA_def_property_enum_default(prop, CD_PROP_FLOAT);
+  RNA_def_property_ui_text(prop, "Data Type", "The data type used to read the attribute values");
+  RNA_def

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list