[Bf-blender-cvs] [1b2b07fb18a] temp-geometry-nodes-fields-prototype: progress

Jacques Lucke noreply at git.blender.org
Wed Jul 28 14:14:20 CEST 2021


Commit: 1b2b07fb18a2a434c3f3471905f91531dbd6d74c
Author: Jacques Lucke
Date:   Mon Jul 26 16:34:28 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rB1b2b07fb18a2a434c3f3471905f91531dbd6d74c

progress

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

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/blenlib/BLI_optionally_owned_ptr.hh
M	source/blender/blenlib/BLI_virtual_array.hh
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/CMakeLists.txt
M	source/blender/nodes/NOD_geometry.h
M	source/blender/nodes/NOD_static_types.h
A	source/blender/nodes/geometry/nodes/node_geo_attribute.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 09820291222..dda36fe83fc 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -539,6 +539,7 @@ geometry_node_categories = [
         NodeItem("FunctionNodeInputVector"),
         NodeItem("GeometryNodeInputMaterial"),
         NodeItem("GeometryNodeIsViewport"),
+        NodeItem("GeometryNodeAttribute"),
     ]),
     GeometryNodeCategory("GEO_MATERIAL", "Material", items=[
         NodeItem("GeometryNodeMaterialAssign"),
diff --git a/source/blender/blenkernel/BKE_field.hh b/source/blender/blenkernel/BKE_field.hh
index 5f1d23b47b3..a3c6a11e5ed 100644
--- a/source/blender/blenkernel/BKE_field.hh
+++ b/source/blender/blenkernel/BKE_field.hh
@@ -44,6 +44,7 @@ class FieldInputKey {
  public:
   virtual ~FieldInputKey() = default;
   virtual uint64_t hash() const = 0;
+  virtual const CPPType &type() const = 0;
 
   friend bool operator==(const FieldInputKey &a, const FieldInputKey &b)
   {
@@ -79,14 +80,14 @@ class AttributeFieldInputKey : public FieldInputKey {
     return get_default_hash_2(name_, type_);
   }
 
-  StringRefNull name() const
+  const CPPType &type() const override
   {
-    return name_;
+    return *type_;
   }
 
-  const CPPType &type() const
+  StringRefNull name() const
   {
-    return *type_;
+    return name_;
   }
 
  private:
@@ -115,21 +116,6 @@ class GVArrayFieldInputValue : public FieldInputValue {
   }
 };
 
-template<typename T> class VArrayFieldInputValue : public FieldInputValue {
- private:
-  const VArray<T> *varray_;
-
- public:
-  VArrayFieldInputValue(const VArray<T> &varray) : varray_(varray)
-  {
-  }
-
-  const VArray<T> &varray() const
-  {
-    return *varray_;
-  }
-};
-
 class FieldInputs {
  private:
   using InputMap = Map<std::reference_wrapper<const FieldInputKey>, const FieldInputValue *>;
@@ -166,24 +152,19 @@ class FieldInputs {
 
 template<typename T> class FieldOutput {
  private:
-  const VArray<T> *varray_ = nullptr;
-  VArrayPtr<T> varray_owned_;
+  OptionallyOwnedPtr<const VArray<T>> varray_;
 
  public:
-  FieldOutput(const VArray<T> &varray) : varray_(&varray)
-  {
-  }
-
-  FieldOutput(VArrayPtr<T> varray) : varray_(varray.get()), varray_owned_(std::move(varray))
+  FieldOutput(OptionallyOwnedPtr<const VArray<T>> varray) : varray_(std::move(varray))
   {
   }
 
-  VArrayPtr<T> &varray_owned()
+  OptionallyOwnedPtr<const VArray<T>> extract()
   {
-    return varray_owned_;
+    return std::move(varray_);
   }
 
-  const VArray<T> &varray_ref() const
+  const VArray<T> &varray() const
   {
     return *varray_;
   }
@@ -191,15 +172,10 @@ template<typename T> class FieldOutput {
 
 class GFieldOutput {
  private:
-  const GVArray *varray_;
-  GVArrayPtr varray_owned_;
+  OptionallyOwnedPtr<const GVArray> varray_;
 
  public:
-  GFieldOutput(const GVArray &varray) : varray_(&varray)
-  {
-  }
-
-  GFieldOutput(GVArrayPtr varray) : varray_(varray.get()), varray_owned_(std::move(varray))
+  GFieldOutput(OptionallyOwnedPtr<const GVArray> varray) : varray_(std::move(varray))
   {
   }
 
@@ -253,10 +229,13 @@ template<typename T> class Field : public GField {
   GFieldOutput evaluate_generic(IndexMask mask, const FieldInputs &inputs) const override
   {
     FieldOutput<T> output = this->evaluate(mask, inputs);
-    if (output.varray_owned()) {
-      return {std::make_unique<fn::GVArray_For_OwnedVArray<T>>(std::move(output.varray_owned()))};
+    OptionallyOwnedPtr<const VArray<T>> varray = output.extract();
+    if (varray.is_owned()) {
+      return GFieldOutput{OptionallyOwnedPtr<const GVArray>{
+          std::make_unique<fn::GVArray_For_OwnedVArray<T>>(varray.extract_owned())}};
     }
-    return {std::make_unique<fn::GVArray_For_VArray<T>>(output.varray_ref())};
+    return GFieldOutput{OptionallyOwnedPtr<const GVArray>{
+        std::make_unique<fn::GVArray_For_VArray<T>>(output.varray())}};
   }
 
   const CPPType &output_type() const override
@@ -276,34 +255,39 @@ template<typename T> class ConstantField : public Field<T> {
 
   FieldOutput<T> evaluate(IndexMask mask, const FieldInputs &UNUSED(inputs)) const
   {
-    return {std::make_unique<VArray_For_Single<T>>(value_, mask.min_array_size())};
+    return OptionallyOwnedPtr<const VArray<T>>{
+        std::make_unique<VArray_For_Single<T>>(value_, mask.min_array_size())};
   }
 };
 
-template<typename T, typename KeyT> class VArrayInputField : public Field<T> {
+template<typename KeyT> class VArrayInputField : public GField {
  private:
-  T default_value_;
   KeyT key_;
 
  public:
-  template<typename... Args>
-  VArrayInputField(T default_value, Args &&... args)
-      : default_value_(std::move(default_value)), key_(std::forward<Args>(args)...)
+  template<typename... Args> VArrayInputField(Args &&... args) : key_(std::forward<Args>(args)...)
   {
   }
 
-  void foreach_input_key(FunctionRef<void(const FieldInputKey &key)> callback) const
+  void foreach_input_key(FunctionRef<void(const FieldInputKey &key)> callback) const override
   {
     callback(key_);
   }
 
-  FieldOutput<T> evaluate(IndexMask mask, const FieldInputs &inputs) const override
+  const CPPType &output_type() const override
+  {
+    return key_.type();
+  }
+
+  GFieldOutput evaluate_generic(IndexMask mask, const FieldInputs &inputs) const override
   {
-    const VArrayFieldInputValue<T> *input = inputs.get<VArrayFieldInputValue<T>>(key_);
+    const GVArrayFieldInputValue *input = inputs.get<GVArrayFieldInputValue>(key_);
     if (input == nullptr) {
-      return std::make_unique<VArray_For_Single<T>>(default_value_, mask.min_array_size());
+      return GFieldOutput{
+          OptionallyOwnedPtr<const GVArray>{std::make_unique<fn::GVArray_For_SingleValueRef>(
+              key_.type(), mask.min_array_size(), key_.type().default_value())}};
     }
-    return input->varray();
+    return GFieldOutput{OptionallyOwnedPtr<const GVArray>{input->varray()}};
   }
 };
 
@@ -394,7 +378,9 @@ class MultiFunctionField : public GField {
       MEM_freeN(span.data());
     }
 
-    return {std::make_unique<fn::GVArray_For_OwnedGSpan>(output_span, mask)};
+    std::unique_ptr<GVArray> out_array = std::make_unique<fn::GVArray_For_OwnedGSpan>(output_span,
+                                                                                      mask);
+    return GFieldOutput{OptionallyOwnedPtr<const GVArray>{std::move(out_array)}};
   }
 };
 
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index cecb3118038..fd4eb8f1b98 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1466,6 +1466,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_CURVE_PRIMITIVE_QUADRILATERAL 1070
 #define GEO_NODE_CURVE_TRIM 1071
 #define GEO_NODE_CURVE_SET_HANDLES 1072
+#define GEO_NODE_ATTRIBUTE 1073
 
 /** \} */
 
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index e9608457896..8fc872b0f08 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5087,6 +5087,7 @@ static void registerGeometryNodes()
   register_node_type_geo_group();
 
   register_node_type_geo_align_rotation_to_vector();
+  register_node_type_geo_attribute();
   register_node_type_geo_attribute_clamp();
   register_node_type_geo_attribute_color_ramp();
   register_node_type_geo_attribute_combine_xyz();
diff --git a/source/blender/blenlib/BLI_optionally_owned_ptr.hh b/source/blender/blenlib/BLI_optionally_owned_ptr.hh
index cfb9cf5273f..174491ad5f4 100644
--- a/source/blender/blenlib/BLI_optionally_owned_ptr.hh
+++ b/source/blender/blenlib/BLI_optionally_owned_ptr.hh
@@ -42,6 +42,19 @@ template<typename T, typename OwnedTPtr = std::unique_ptr<T>> class OptionallyOw
   {
   }
 
+  bool is_owned() const
+  {
+    return static_cast<bool>(owned_ptr_);
+  }
+
+  OwnedTPtr extract_owned()
+  {
+    OwnedTPtr ptr = std::move(owned_ptr_);
+    owned_ptr_ = OwnedTPtr{nullptr};
+    ptr_ = nullptr;
+    return ptr;
+  }
+
   T *operator->()
   {
     BLI_assert(ptr_ != nullptr);
diff --git a/source/blender/blenlib/BLI_virtual_array.hh b/source/blender/blenlib/BLI_virtual_array.hh
index 1c02bce8411..71c6db7e56e 100644
--- a/source/blender/blenlib/BLI_virtual_array.hh
+++ b/source/blender/blenlib/BLI_virtual_array.hh
@@ -255,7 +255,7 @@ template<typename T> class VMutableArray : public VArray<T> {
   }
 };
 
-template<typename T> using VArrayPtr = std::unique_ptr<VArray<T>>;
+template<typename T> using VArrayPtr = std::unique_ptr<const VArray<T>>;
 template<typename T> using VMutableArrayPtr = std::unique_ptr<VMutableArray<T>>;
 
 /**
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 5152098f57a..33d1a92c386 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1418,6 +1418,11 @@ typedef struct NodeGeometryRaycast {
   char _pad[1];
 } NodeGeometryRaycast;
 
+typedef struct NodeGeometryAttribute {
+  /* eNodeSocketDatatype. */
+  int8_t output_type;
+} NodeGeometryAttribute;
+
 /* script node mode */
 #define NODE_SCRIPT_INTERNAL 0
 #define NODE_SCRIPT_EXTERNAL 1
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 3d4256db335..4cbed2b6a33 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -2040,6 +2040,20 @@ static const EnumPropertyItem *rna_GeometryNodeSwitch_type_itemf(bContext *UNUSE
   return itemf_function_check(node_socket_data_type_items, switch_type_supported);
 }
 
+static bool attribute_type_supported(const EnumPropertyItem *item)
+{
+  return ELEM(item->value, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR, SOCK_RGBA);
+}
+
+static const EnumPropertyItem *rna_GeometryNodeAttribute_type_itemf(bContext *UNUSED(C),
+                                                                    PointerRNA *UNUSED(ptr),
+                                                                    PropertyRNA *UNUSED(prop),
+                                    

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list