[Bf-blender-cvs] [3da0ad6bb23] temp-attribute-processor: add node to access iteration index

Jacques Lucke noreply at git.blender.org
Mon May 31 11:42:08 CEST 2021


Commit: 3da0ad6bb232bf2d3407f0c70c38f05fe621f6b7
Author: Jacques Lucke
Date:   Mon May 31 11:41:51 2021 +0200
Branches: temp-attribute-processor
https://developer.blender.org/rB3da0ad6bb232bf2d3407f0c70c38f05fe621f6b7

add node to access iteration index

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

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.cc
M	source/blender/nodes/CMakeLists.txt
M	source/blender/nodes/NOD_geometry.h
M	source/blender/nodes/NOD_static_types.h
M	source/blender/nodes/geometry/node_geometry_util.cc
M	source/blender/nodes/geometry/node_geometry_util.hh
R097	source/blender/nodes/geometry/nodes/node_attribute_group.cc	source/blender/nodes/geometry/nodes/node_attr_group.cc
A	source/blender/nodes/geometry/nodes/node_attr_index.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 79908b9db28..5297e7fb945 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -599,6 +599,7 @@ attribute_node_categories = [
         NodeItem("ShaderNodeValue"),
         NodeItem("FunctionNodeInputString"),
         NodeItem("FunctionNodeInputVector"),
+        NodeItem("AttributeNodeIndex"),
     ]),
     AttributeNodeCategory("ATTR_UTILITIES", "Utilities", items=[
         NodeItem("ShaderNodeMapRange"),
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 78d12c9df8b..90854c6d2cf 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1443,6 +1443,14 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 
 /** \} */
 
+/* -------------------------------------------------------------------- */
+/** \name Attribute Nodes
+ * \{ */
+
+#define ATTR_NODE_INDEX 1400
+
+/** \} */
+
 void BKE_node_system_init(void);
 void BKE_node_system_exit(void);
 
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index bdf7c6737bb..cc63a031285 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5059,7 +5059,6 @@ static void registerTextureNodes()
 static void registerGeometryNodes()
 {
   register_node_type_geo_group();
-  register_node_type_attribute_group();
 
   register_node_type_geo_align_rotation_to_vector();
   register_node_type_geo_attribute_clamp();
@@ -5115,6 +5114,10 @@ static void registerGeometryNodes()
   register_node_type_geo_transform();
   register_node_type_geo_triangulate();
   register_node_type_geo_volume_to_mesh();
+
+  register_node_type_attr_group();
+
+  register_node_type_attr_index();
 }
 
 static void registerFunctionNodes()
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index dba6672849d..99a0e68e246 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -139,7 +139,8 @@ set(SRC
   function/nodes/node_fn_random_float.cc
   function/node_function_util.cc
 
-  geometry/nodes/node_attribute_group.cc
+  geometry/nodes/node_attr_group.cc
+  geometry/nodes/node_attr_index.cc
   geometry/nodes/node_geo_align_rotation_to_vector.cc
   geometry/nodes/node_geo_attribute_clamp.cc
   geometry/nodes/node_geo_attribute_color_ramp.cc
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index 66425dccd48..6e4b5189d37 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -26,14 +26,10 @@ extern struct bNodeTreeType *ntreeType_Geometry;
 extern struct bNodeTreeType *ntreeType_Attribute;
 
 void register_node_tree_type_geo(void);
-void register_node_tree_type_attr(void);
 
 void register_node_type_geo_group(void);
 void register_node_type_geo_custom_group(bNodeType *ntype);
 
-void register_node_type_attribute_group(void);
-void register_node_type_attribute_custom_group(bNodeType *ntype);
-
 void register_node_type_geo_align_rotation_to_vector(void);
 void register_node_type_geo_attribute_clamp(void);
 void register_node_type_geo_attribute_color_ramp(void);
@@ -89,6 +85,13 @@ void register_node_type_geo_transform(void);
 void register_node_type_geo_triangulate(void);
 void register_node_type_geo_volume_to_mesh(void);
 
+void register_node_tree_type_attr(void);
+
+void register_node_type_attr_group(void);
+void register_node_type_attribute_custom_group(bNodeType *ntype);
+
+void register_node_type_attr_index(void);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index 59c1b725d26..56649b03611 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -322,6 +322,8 @@ DefNode(GeometryNode, GEO_NODE_TRANSFORM, 0, "TRANSFORM", Transform, "Transform"
 DefNode(GeometryNode, GEO_NODE_TRIANGULATE, def_geo_triangulate, "TRIANGULATE", Triangulate, "Triangulate", "")
 DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, def_geo_volume_to_mesh, "VOLUME_TO_MESH", VolumeToMesh, "Volume to Mesh", "")
 
+DefNode(AttributeNode, ATTR_NODE_INDEX, 0, "INDEX", Index, "Index", "")
+
 /* undefine macros */
 #undef DefNode
 
diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc
index 93cada2982b..1d11092d53c 100644
--- a/source/blender/nodes/geometry/node_geometry_util.cc
+++ b/source/blender/nodes/geometry/node_geometry_util.cc
@@ -67,6 +67,17 @@ bool geo_node_poll_default(bNodeType *UNUSED(ntype),
   return true;
 }
 
+bool attr_node_poll_default(bNodeType *UNUSED(ntype),
+                            bNodeTree *ntree,
+                            const char **r_disabled_hint)
+{
+  if (!STREQ(ntree->idname, "AttributeNodeTree")) {
+    *r_disabled_hint = "Not a attribute node tree";
+    return false;
+  }
+  return true;
+}
+
 void geo_node_type_base(bNodeType *ntype, int type, const char *name, short nclass, short flag)
 {
   node_type_base(ntype, type, name, nclass, flag);
@@ -74,3 +85,12 @@ void geo_node_type_base(bNodeType *ntype, int type, const char *name, short ncla
   ntype->update_internal_links = node_update_internal_links_default;
   ntype->insert_link = node_insert_link_default;
 }
+
+void attr_node_type_base(
+    struct bNodeType *ntype, int type, const char *name, short nclass, short flag)
+{
+  node_type_base(ntype, type, name, nclass, flag);
+  ntype->poll = attr_node_poll_default;
+  ntype->update_internal_links = node_update_internal_links_default;
+  ntype->insert_link = node_insert_link_default;
+}
diff --git a/source/blender/nodes/geometry/node_geometry_util.hh b/source/blender/nodes/geometry/node_geometry_util.hh
index 81092798ca1..52a51977ce9 100644
--- a/source/blender/nodes/geometry/node_geometry_util.hh
+++ b/source/blender/nodes/geometry/node_geometry_util.hh
@@ -40,6 +40,9 @@ bool geo_node_poll_default(struct bNodeType *ntype,
                            struct bNodeTree *ntree,
                            const char **r_disabled_hint);
 
+void attr_node_type_base(
+    struct bNodeType *ntype, int type, const char *name, short nclass, short flag);
+
 namespace blender::nodes {
 void update_attribute_input_socket_availabilities(bNode &node,
                                                   const StringRef name,
diff --git a/source/blender/nodes/geometry/nodes/node_attribute_group.cc b/source/blender/nodes/geometry/nodes/node_attr_group.cc
similarity index 97%
rename from source/blender/nodes/geometry/nodes/node_attribute_group.cc
rename to source/blender/nodes/geometry/nodes/node_attr_group.cc
index 2893fe33cc7..5c5a3c7ae07 100644
--- a/source/blender/nodes/geometry/nodes/node_attribute_group.cc
+++ b/source/blender/nodes/geometry/nodes/node_attr_group.cc
@@ -22,7 +22,7 @@
 #include "node_common.h"
 #include "node_geometry_util.hh"
 
-void register_node_type_attribute_group(void)
+void register_node_type_attr_group(void)
 {
   static bNodeType ntype;
 
diff --git a/source/blender/nodes/geometry/nodes/node_attr_index.cc b/source/blender/nodes/geometry/nodes/node_attr_index.cc
new file mode 100644
index 00000000000..b31dddba94b
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_attr_index.cc
@@ -0,0 +1,34 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "node_geometry_util.hh"
+
+static bNodeSocketTemplate attr_node_index_out[] = {
+    {SOCK_INT, N_("Index")},
+    {-1, ""},
+};
+
+void register_node_type_attr_index()
+{
+  static bNodeType ntype;
+
+  attr_node_type_base(&ntype, ATTR_NODE_INDEX, "Index", NODE_CLASS_ATTRIBUTE, 0);
+  node_type_socket_templates(&ntype, nullptr, attr_node_index_out);
+  nodeRegisterType(&ntype);
+}
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 5319394a551..46ee6141092 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_processor.cc
@@ -344,6 +344,13 @@ static CustomDataType get_custom_data_type(bNodeSocketType *typeinfo)
   return CD_PROP_FLOAT;
 }
 
+namespace {
+struct InputsCache {
+  Map<int, GVArrayPtr> group_inputs;
+  GVArrayPtr index;
+};
+}  // namespace
+
 static void process_attributes_on_component(GeoNodeExecParams &geo_params,
                                             GeometryComponent &component,
                                             const fn::MultiFunction &network_fn,
@@ -364,40 +371,56 @@ static void process_attributes_on_component(GeoNodeExecParams &geo_params,
   fn::MFParamsBuilder fn_params{network_fn, domain_size};
   fn::MFContextBuilder context;
 
-  Map<int, GVArrayPtr> input_varrays;
+  InputsCache inputs_cache;
 
   for (const DOutputSocket &dsocket : used_group_inputs) {
-    const int index = dsocket->index();
-    GVArrayPtr &input_varray = input_varrays.lookup_or_add_cb(index, [&]() -> GVArrayPtr {
-      const AttributeProcessorInputSettings *input_settings = (AttributeProcessorInputSettings *)
-          BLI_findlink(&storage.inputs_settings, index);
-      const bNodeSocket *interface_socket = (bNodeSocket *)BLI_findlink(&group->inputs, index);
-      const CustomDataType type = get_custom_data_type(interface_socket->typeinfo);
-      cons

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list