[Bf-blender-cvs] [87153cf019c] temp-geometry-nodes-fields-prototype: progress

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


Commit: 87153cf019c1120bd4752cff8b2b5116782029cb
Author: Jacques Lucke
Date:   Wed Jul 28 11:33:00 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rB87153cf019c1120bd4752cff8b2b5116782029cb

progress

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

M	source/blender/blenkernel/BKE_field.hh
M	source/blender/modifiers/intern/MOD_nodes_evaluator.cc
M	source/blender/nodes/NOD_geometry_exec.hh
M	source/blender/nodes/geometry/nodes/node_geo_attribute.cc
M	source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc

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

diff --git a/source/blender/blenkernel/BKE_field.hh b/source/blender/blenkernel/BKE_field.hh
index 5f97fc0ec7e..3b6f1a3d2f0 100644
--- a/source/blender/blenkernel/BKE_field.hh
+++ b/source/blender/blenkernel/BKE_field.hh
@@ -354,6 +354,11 @@ class FieldRefBase {
 template<typename T> class FieldRef : public FieldRefBase {
 
  public:
+  FieldRef()
+  {
+    field_ = new ConstantField<T>(T());
+  }
+
   FieldRef(FieldPtr field)
   {
     field_ = std::move(field);
diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index 66e500c537f..1fb941e2b4a 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@ -930,6 +930,23 @@ class GeometryNodesEvaluator {
         bke::FieldRef<float> field = *(bke::FieldRef<float> *)single_value.value;
         input_fields.append(field.field());
       }
+      else if (input_state.type->is<bke::FieldRef<int>>()) {
+        bke::FieldRef<int> field = *(bke::FieldRef<int> *)single_value.value;
+        input_fields.append(field.field());
+      }
+      else if (input_state.type->is<bke::FieldRef<float3>>()) {
+        bke::FieldRef<float3> field = *(bke::FieldRef<float3> *)single_value.value;
+        input_fields.append(field.field());
+      }
+      else if (input_state.type->is<bke::FieldRef<bool>>()) {
+        bke::FieldRef<bool> field = *(bke::FieldRef<bool> *)single_value.value;
+        input_fields.append(field.field());
+      }
+      else if (input_state.type->is<bke::FieldRef<blender::ColorGeometry4f>>()) {
+        bke::FieldRef<blender::ColorGeometry4f> field =
+            *(bke::FieldRef<blender::ColorGeometry4f> *)single_value.value;
+        input_fields.append(field.field());
+      }
       else {
         /* Not yet supported. */
         BLI_assert_unreachable();
@@ -952,6 +969,26 @@ class GeometryNodesEvaluator {
             allocator.construct<bke::FieldRef<float>>(out_field).release();
         this->forward_output(socket, field_ref);
       }
+      else if (socket->typeinfo()->type == SOCK_VECTOR) {
+        bke::FieldRef<float3> *field_ref =
+            allocator.construct<bke::FieldRef<float3>>(out_field).release();
+        this->forward_output(socket, field_ref);
+      }
+      else if (socket->typeinfo()->type == SOCK_BOOLEAN) {
+        bke::FieldRef<bool> *field_ref =
+            allocator.construct<bke::FieldRef<bool>>(out_field).release();
+        this->forward_output(socket, field_ref);
+      }
+      else if (socket->typeinfo()->type == SOCK_RGBA) {
+        bke::FieldRef<blender::ColorGeometry4f> *field_ref =
+            allocator.construct<bke::FieldRef<blender::ColorGeometry4f>>(out_field).release();
+        this->forward_output(socket, field_ref);
+      }
+      else if (socket->typeinfo()->type == SOCK_INT) {
+        bke::FieldRef<int> *field_ref =
+            allocator.construct<bke::FieldRef<int>>(out_field).release();
+        this->forward_output(socket, field_ref);
+      }
       else {
         /* Not yet supported. */
         BLI_assert_unreachable();
diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh
index d0f64845852..46513075f48 100644
--- a/source/blender/nodes/NOD_geometry_exec.hh
+++ b/source/blender/nodes/NOD_geometry_exec.hh
@@ -148,7 +148,20 @@ class GeoNodeExecParams {
     this->check_input_access(identifier, &CPPType::get<T>());
 #endif
     GMutablePointer gvalue = this->extract_input(identifier);
-    return gvalue.relocate_out<T>();
+    if constexpr (std::is_same_v<T, int> || std::is_same_v<T, float> ||
+                  std::is_same_v<T, float3> || std::is_same_v<T, ColorGeometry4f> ||
+                  std::is_same_v<T, bool>) {
+      BLI_assert(gvalue.is_type<bke::FieldRef<T>>());
+      bke::FieldRef<T> field = gvalue.relocate_out<bke::FieldRef<T>>();
+      bke::FieldInputs inputs = field->prepare_inputs();
+      bke::FieldOutput output = field->evaluate(IndexRange(1), inputs);
+      T value;
+      output.varray_ref().get(0, &value);
+      return value;
+    }
+    else {
+      return gvalue.relocate_out<T>();
+    }
   }
 
   /**
@@ -169,7 +182,7 @@ class GeoNodeExecParams {
   /**
    * Get the input value for the input socket with the given identifier.
    */
-  template<typename T> const T get_input(StringRef identifier) const
+  template<typename T> T get_input(StringRef identifier) const
   {
 #ifdef DEBUG
     this->check_input_access(identifier, &CPPType::get<T>());
@@ -192,6 +205,16 @@ class GeoNodeExecParams {
     }
   }
 
+  template<typename T> bke::FieldRef<T> get_input_field(StringRef identifier) const
+  {
+#ifdef DEBUG
+    this->check_input_access(identifier, &CPPType::get<T>());
+#endif
+    GPointer gvalue = provider_->get_input(identifier);
+    BLI_assert(gvalue.is_type<bke::FieldRef<T>>());
+    return *(const bke::FieldRef<T> *)gvalue.get<bke::FieldRef<T>>();
+  }
+
   /**
    * Store the output value for the given socket identifier.
    */
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute.cc
index 9da9ea3d83f..0e6bc782a1c 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute.cc
@@ -85,7 +85,21 @@ static void geo_node_attribute_exec(GeoNodeExecParams params)
   BLI_assert(cpp_type != nullptr);
   bke::FieldPtr field = new bke::GVArrayInputField<bke::AttributeFieldInputKey>(std::move(name),
                                                                                 *cpp_type);
-  params.set_output("Attribute", bke::FieldRef<float>(std::move(field)));
+  if (cpp_type->is<float>()) {
+    params.set_output("Attribute", bke::FieldRef<float>(std::move(field)));
+  }
+  else if (cpp_type->is<int>()) {
+    params.set_output("Attribute_001", bke::FieldRef<int>(std::move(field)));
+  }
+  else if (cpp_type->is<bool>()) {
+    params.set_output("Attribute_002", bke::FieldRef<bool>(std::move(field)));
+  }
+  else if (cpp_type->is<float3>()) {
+    params.set_output("Attribute_003", bke::FieldRef<float3>(std::move(field)));
+  }
+  else if (cpp_type->is<ColorGeometry4f>()) {
+    params.set_output("Attribute_004", bke::FieldRef<ColorGeometry4f>(std::move(field)));
+  }
 }
 
 }  // namespace blender::nodes
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
index 406b72bc345..f9e1c696d08 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
@@ -121,7 +121,7 @@ static void fill_attribute(GeometryComponent &component, const GeoNodeExecParams
 
   switch (data_type) {
     case CD_PROP_FLOAT: {
-      bke::FieldRef<float> value_field = params.get_input<bke::FieldRef<float>>("Value_001");
+      bke::FieldRef<float> value_field = params.get_input_field<float>("Value_001");
       bke::FieldInputs field_inputs = value_field->prepare_inputs();
       Vector<std::unique_ptr<bke::FieldInputValue>> input_values;
       prepare_field_inputs(field_inputs, component, domain, input_values);



More information about the Bf-blender-cvs mailing list