[Bf-blender-cvs] [c00cc9fd602] temp-geometry-nodes-fields-prototype: improve

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


Commit: c00cc9fd602fa2d149cc2be8aa4d65430c37beb5
Author: Jacques Lucke
Date:   Tue Jul 27 16:29:34 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rBc00cc9fd602fa2d149cc2be8aa4d65430c37beb5

improve

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

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

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

diff --git a/source/blender/blenkernel/BKE_field.hh b/source/blender/blenkernel/BKE_field.hh
index 2604a095949..45253531ec3 100644
--- a/source/blender/blenkernel/BKE_field.hh
+++ b/source/blender/blenkernel/BKE_field.hh
@@ -294,6 +294,7 @@ class MultiFunctionField : public Field {
           FieldOutput &output = scope.add_value(field.evaluate(mask, inputs), __func__);
           params.add_readonly_single_input(output.varray_ref());
           input_index++;
+          break;
         }
         case fn::MFParamType::SingleOutput: {
           const CPPType &type = param_type.data_type().single_type();
@@ -305,6 +306,7 @@ class MultiFunctionField : public Field {
           if (param_index == output_param_index_) {
             output_span_index = outputs.size() - 1;
           }
+          break;
         }
         case fn::MFParamType::SingleMutable:
         case fn::MFParamType::VectorInput:
@@ -331,7 +333,10 @@ class MultiFunctionField : public Field {
   }
 };
 
-template<typename T> class FieldRef {
+class FieldRefBase {
+};
+
+template<typename T> class FieldRef : public FieldRefBase {
  private:
   FieldPtr field_;
 
diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index 9e9e380b649..10d804f846d 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@ -32,6 +32,12 @@
 #include "BLI_vector_set.hh"
 
 MAKE_CPP_TYPE(FloatFieldRef, blender::bke::FieldRef<float>, CPPTypeFlags::BasicType);
+MAKE_CPP_TYPE(IntFieldRef, blender::bke::FieldRef<int>, CPPTypeFlags::BasicType);
+MAKE_CPP_TYPE(BoolFieldRef, blender::bke::FieldRef<bool>, CPPTypeFlags::BasicType);
+MAKE_CPP_TYPE(Float3FieldRef, blender::bke::FieldRef<blender::float3>, CPPTypeFlags::BasicType);
+MAKE_CPP_TYPE(ColorFieldRef,
+              blender::bke::FieldRef<blender::ColorGeometry4f>,
+              CPPTypeFlags::BasicType);
 
 namespace blender::modifiers::geometry_nodes {
 
@@ -309,6 +315,18 @@ static const CPPType *get_socket_cpp_type(const SocketRef &socket)
   if (type->is<float>()) {
     return &CPPType::get<bke::FieldRef<float>>();
   }
+  if (type->is<int>()) {
+    return &CPPType::get<bke::FieldRef<int>>();
+  }
+  if (type->is<bool>()) {
+    return &CPPType::get<bke::FieldRef<bool>>();
+  }
+  if (type->is<float3>()) {
+    return &CPPType::get<bke::FieldRef<float3>>();
+  }
+  if (type->is<ColorGeometry4f>()) {
+    return &CPPType::get<bke::FieldRef<ColorGeometry4f>>();
+  }
   return type;
 }
 
@@ -319,13 +337,42 @@ static const CPPType *get_socket_cpp_type(const DSocket socket)
 
 static void get_socket_value(const SocketRef &socket, void *r_value)
 {
-  if (socket.typeinfo()->type == SOCK_FLOAT) {
-    float value;
-    socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
-    new (r_value) bke::FieldRef<float>(FieldPtr{new bke::ConstantField<float>(value)});
-    return;
+  switch (socket.typeinfo()->type) {
+    case SOCK_FLOAT: {
+      float value;
+      socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
+      new (r_value) bke::FieldRef<float>(FieldPtr{new bke::ConstantField<float>(value)});
+      return;
+    }
+    case SOCK_INT: {
+      int value;
+      socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
+      new (r_value) bke::FieldRef<int>(FieldPtr{new bke::ConstantField<int>(value)});
+      return;
+    }
+    case SOCK_BOOLEAN: {
+      bool value;
+      socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
+      new (r_value) bke::FieldRef<bool>(FieldPtr{new bke::ConstantField<bool>(value)});
+      return;
+    }
+    case SOCK_RGBA: {
+      ColorGeometry4f value;
+      socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
+      new (r_value)
+          bke::FieldRef<ColorGeometry4f>(FieldPtr{new bke::ConstantField<ColorGeometry4f>(value)});
+      return;
+    }
+    case SOCK_VECTOR: {
+      float3 value;
+      socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
+      new (r_value) bke::FieldRef<float3>(FieldPtr{new bke::ConstantField<float3>(value)});
+      return;
+    }
+    default:
+      blender::nodes::socket_cpp_value_get(*socket.bsocket(), r_value);
+      return;
   }
-  blender::nodes::socket_cpp_value_get(*socket.bsocket(), r_value);
 }
 
 static bool node_supports_laziness(const DNode node)
diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh
index 98df31cb739..d0f64845852 100644
--- a/source/blender/nodes/NOD_geometry_exec.hh
+++ b/source/blender/nodes/NOD_geometry_exec.hh
@@ -169,14 +169,27 @@ 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> const T get_input(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<T>());
-    return *(const T *)gvalue.get();
+    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.get<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 {
+      BLI_assert(gvalue.is_type<T>());
+      return *(const T *)gvalue.get();
+    }
   }
 
   /**



More information about the Bf-blender-cvs mailing list