[Bf-blender-cvs] [8132383662d] temp-geometry-nodes-fields-prototype: new index node and fixes

Jacques Lucke noreply at git.blender.org
Wed Jul 28 15:13:08 CEST 2021


Commit: 8132383662d8ec3943de817cc17654861abf0061
Author: Jacques Lucke
Date:   Wed Jul 28 15:12:53 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rB8132383662d8ec3943de817cc17654861abf0061

new index node and fixes

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

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_field.hh
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.cc
M	source/blender/functions/FN_generic_virtual_array.hh
M	source/blender/modifiers/intern/MOD_nodes_evaluator.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
A	source/blender/nodes/geometry/nodes/node_geo_index.cc
M	source/blender/nodes/geometry/nodes/node_geo_object_info.cc

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 816ffc60304..0df9f3f99d9 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -540,6 +540,7 @@ geometry_node_categories = [
         NodeItem("GeometryNodeInputMaterial"),
         NodeItem("GeometryNodeIsViewport"),
         NodeItem("GeometryNodeAttribute"),
+        NodeItem("GeometryNodeIndex"),
     ]),
     GeometryNodeCategory("GEO_MATERIAL", "Material", items=[
         NodeItem("GeometryNodeMaterialAssign"),
diff --git a/source/blender/blenkernel/BKE_field.hh b/source/blender/blenkernel/BKE_field.hh
index 23f1fa5c4e4..48da2c7bfb2 100644
--- a/source/blender/blenkernel/BKE_field.hh
+++ b/source/blender/blenkernel/BKE_field.hh
@@ -65,6 +65,26 @@ class FieldInputValue {
   virtual ~FieldInputValue() = default;
 };
 
+class IndexFieldInputKey : public FieldInputKey {
+ public:
+  uint64_t hash() const override
+  {
+    /* Arbitrary number. */
+    return 78582029;
+  }
+
+  const CPPType &type() const override
+  {
+    return CPPType::get<int>();
+  }
+
+ private:
+  bool is_same_as(const FieldInputKey &other) const override
+  {
+    return dynamic_cast<const IndexFieldInputKey *>(&other) != nullptr;
+  }
+};
+
 class AttributeFieldInputKey : public FieldInputKey {
  private:
   std::string name_;
@@ -92,7 +112,7 @@ class AttributeFieldInputKey : public FieldInputKey {
   }
 
  private:
-  bool is_same_as(const FieldInputKey &other) const
+  bool is_same_as(const FieldInputKey &other) const override
   {
     if (const AttributeFieldInputKey *other_typed = dynamic_cast<const AttributeFieldInputKey *>(
             &other)) {
@@ -349,6 +369,9 @@ class AttributeField : public GVArrayInputField<AttributeFieldInputKey> {
   }
 };
 
+class IndexField : public GVArrayInputField<IndexFieldInputKey> {
+};
+
 class FieldRefBase {
  protected:
   FieldPtr field_;
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index fd4eb8f1b98..5950da9f8b7 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1467,6 +1467,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_CURVE_TRIM 1071
 #define GEO_NODE_CURVE_SET_HANDLES 1072
 #define GEO_NODE_ATTRIBUTE 1073
+#define GEO_NODE_INDEX 1074
 
 /** \} */
 
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 8fc872b0f08..fa63599b30d 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5127,6 +5127,7 @@ static void registerGeometryNodes()
   register_node_type_geo_curve_trim();
   register_node_type_geo_delete_geometry();
   register_node_type_geo_edge_split();
+  register_node_type_geo_index();
   register_node_type_geo_input_material();
   register_node_type_geo_is_viewport();
   register_node_type_geo_join_geometry();
diff --git a/source/blender/functions/FN_generic_virtual_array.hh b/source/blender/functions/FN_generic_virtual_array.hh
index c1c2e8d218b..be810c89a16 100644
--- a/source/blender/functions/FN_generic_virtual_array.hh
+++ b/source/blender/functions/FN_generic_virtual_array.hh
@@ -365,6 +365,11 @@ template<typename T> class GVArray_For_VArray : public GVArray {
   {
   }
 
+  GVArray_For_VArray(std::unique_ptr<VArray<T>> varray)
+      : GVArray_For_VArray(optional_ptr<const VArray<T>>(std::move(varray)))
+  {
+  }
+
   GVArray_For_VArray(optional_ptr<const VArray<T>> varray)
       : GVArray(CPPType::get<T>(), varray->size()), varray_(std::move(varray))
   {
@@ -675,7 +680,7 @@ class GVArray_For_EmbeddedVArray : public GVArray_For_VArray<T> {
 
  public:
   template<typename... Args>
-  GVArray_For_EmbeddedVArray(const int64_t size, Args &&... args)
+  GVArray_For_EmbeddedVArray(const int64_t size, Args &&...args)
       : GVArray_For_VArray<T>(size), embedded_varray_(std::forward<Args>(args)...)
   {
     this->varray_ = embedded_varray_;
@@ -690,7 +695,7 @@ class GVMutableArray_For_EmbeddedVMutableArray : public GVMutableArray_For_VMuta
 
  public:
   template<typename... Args>
-  GVMutableArray_For_EmbeddedVMutableArray(const int64_t size, Args &&... args)
+  GVMutableArray_For_EmbeddedVMutableArray(const int64_t size, Args &&...args)
       : GVMutableArray_For_VMutableArray<T>(size), embedded_varray_(std::forward<Args>(args)...)
   {
     this->varray_ = embedded_varray_;
diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index 298931fd1a2..1c47fe63c54 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@ -964,7 +964,7 @@ class GeometryNodesEvaluator {
       if (!socket_ref.is_available()) {
         continue;
       }
-      const int output_param_index = input_fields.size() + i;
+      const int output_param_index = input_fields.size() + output_index;
       OutputState &output_state = node_state.outputs[i];
       const DOutputSocket socket{node.context(), &socket_ref};
       bke::FieldPtr out_field = new bke::MultiFunctionField(input_fields, fn, output_param_index);
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 6a32670b918..e7311210ead 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -183,6 +183,7 @@ set(SRC
   geometry/nodes/node_geo_curve_trim.cc
   geometry/nodes/node_geo_delete_geometry.cc
   geometry/nodes/node_geo_edge_split.cc
+  geometry/nodes/node_geo_index.cc
   geometry/nodes/node_geo_input_material.cc
   geometry/nodes/node_geo_is_viewport.cc
   geometry/nodes/node_geo_join_geometry.cc
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index 49e4d419b1b..a48aff08748 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -70,6 +70,7 @@ void register_node_type_geo_curve_to_points(void);
 void register_node_type_geo_curve_trim(void);
 void register_node_type_geo_delete_geometry(void);
 void register_node_type_geo_edge_split(void);
+void register_node_type_geo_index(void);
 void register_node_type_geo_input_material(void);
 void register_node_type_geo_is_viewport(void);
 void register_node_type_geo_join_geometry(void);
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index bcf6ac8726a..05865c5cf04 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -310,6 +310,7 @@ DefNode(GeometryNode, GEO_NODE_CURVE_TO_POINTS, def_geo_curve_to_points, "CURVE_
 DefNode(GeometryNode, GEO_NODE_CURVE_ENDPOINTS, 0, "CURVE_ENDPOINTS", CurveEndpoints, "Curve Endpoints", "")
 DefNode(GeometryNode, GEO_NODE_DELETE_GEOMETRY, 0, "DELETE_GEOMETRY", DeleteGeometry, "Delete Geometry", "")
 DefNode(GeometryNode, GEO_NODE_EDGE_SPLIT, 0, "EDGE_SPLIT", EdgeSplit, "Edge Split", "")
+DefNode(GeometryNode, GEO_NODE_INDEX, 0, "INDEX", Index, "Index", "")
 DefNode(GeometryNode, GEO_NODE_INPUT_MATERIAL, def_geo_input_material, "INPUT_MATERIAL", InputMaterial, "Material", "")
 DefNode(GeometryNode, GEO_NODE_IS_VIEWPORT, 0, "IS_VIEWPORT", IsViewport, "Is Viewport", "")
 DefNode(GeometryNode, GEO_NODE_JOIN_GEOMETRY, 0, "JOIN_GEOMETRY", JoinGeometry, "Join Geometry", "")
diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc
index 4504edc4f79..77d573b1daf 100644
--- a/source/blender/nodes/geometry/node_geometry_util.cc
+++ b/source/blender/nodes/geometry/node_geometry_util.cc
@@ -60,6 +60,7 @@ void prepare_field_inputs(bke::FieldInputs &field_inputs,
                           const AttributeDomain domain,
                           Vector<std::unique_ptr<bke::FieldInputValue>> &r_values)
 {
+  const int domain_size = component.attribute_domain_size(domain);
   for (const bke::FieldInputKey &key : field_inputs) {
     if (const bke::AttributeFieldInputKey *attribute_key =
             dynamic_cast<const bke::AttributeFieldInputKey *>(&key)) {
@@ -71,6 +72,16 @@ void prepare_field_inputs(bke::FieldInputs &field_inputs,
       field_inputs.set_input(key, *value);
       r_values.append(std::move(value));
     }
+    else if (dynamic_cast<const bke::IndexFieldInputKey *>(&key) != nullptr) {
+      auto index_func = [](int i) { return i; };
+      VArrayPtr<int> index_varray = std::make_unique<VArray_For_Func<int, decltype(index_func)>>(
+          domain_size, index_func);
+      GVArrayPtr index_gvarray = std::make_unique<fn::GVArray_For_VArray<int>>(
+          std::move(index_varray));
+      auto value = std::make_unique<bke::GVArrayFieldInputValue>(std::move(index_gvarray));
+      field_inputs.set_input(key, *value);
+      r_values.append(std::move(value));
+    }
   }
 }
 
diff --git a/source/blender/nodes/geometry/nodes/node_geo_index.cc b/source/blender/nodes/geometry/nodes/node_geo_index.cc
new file mode 100644
index 00000000000..459c22cd45f
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_index.cc
@@ -0,0 +1,45 @@
+/*
+ * 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 geo_node_index_out[] = {
+    {SOCK_INT, N_("Index")},
+    {-1, ""},
+};
+
+namespace blender::nodes {
+
+static void geo_node_index_exec(GeoNodeExecParams params)
+{
+  FieldPtr index_field = new bke:

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list