[Bf-blender-cvs] [33981125735] functions: refactor how input providers are parsed

Jacques Lucke noreply at git.blender.org
Tue Sep 3 16:23:14 CEST 2019


Commit: 339811257356a4118ef8f393a6adc9b57c3c04ac
Author: Jacques Lucke
Date:   Tue Sep 3 14:06:57 2019 +0200
Branches: functions
https://developer.blender.org/rB339811257356a4118ef8f393a6adc9b57c3c04ac

refactor how input providers are parsed

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

M	source/blender/functions/frontends/data_flow_nodes/vtree_data_graph.hpp
M	source/blender/simulations/bparticles/particle_function_builder.cpp

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

diff --git a/source/blender/functions/frontends/data_flow_nodes/vtree_data_graph.hpp b/source/blender/functions/frontends/data_flow_nodes/vtree_data_graph.hpp
index 460fdc7fa00..7c97acf90da 100644
--- a/source/blender/functions/frontends/data_flow_nodes/vtree_data_graph.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/vtree_data_graph.hpp
@@ -52,6 +52,12 @@ class VTreeDataGraph {
     return m_socket_map[vsocket->id()];
   }
 
+  Type *lookup_type(VirtualSocket *vsocket)
+  {
+    DataSocket socket = this->lookup_socket(vsocket);
+    return m_graph->type_of_socket(socket);
+  }
+
   bool uses_socket(VirtualSocket *vsocket)
   {
     return !m_socket_map[vsocket->id()].is_none();
diff --git a/source/blender/simulations/bparticles/particle_function_builder.cpp b/source/blender/simulations/bparticles/particle_function_builder.cpp
index b8b3a426fc9..24e40914cfa 100644
--- a/source/blender/simulations/bparticles/particle_function_builder.cpp
+++ b/source/blender/simulations/bparticles/particle_function_builder.cpp
@@ -1,4 +1,5 @@
 #include "FN_llvm.hpp"
+#include "BLI_lazy_init.hpp"
 
 #include "particle_function_builder.hpp"
 #include "particle_function_input_providers.hpp"
@@ -66,35 +67,58 @@ static AttributeType attribute_type_from_socket_type(FN::Type *type)
   }
 }
 
-static ParticleFunctionInputProvider *create_input_provider(VirtualSocket *vsocket,
-                                                            SharedDataGraph &data_graph,
-                                                            DataSocket socket)
+using BuildInputProvider = std::function<ParticleFunctionInputProvider *(
+    VTreeDataGraph &vtree_data_graph, VirtualSocket *vsocket)>;
+
+static ParticleFunctionInputProvider *INPUT_particle_info(VTreeDataGraph &vtree_data_graph,
+                                                          VirtualSocket *vsocket)
 {
-  VirtualNode *vnode = vsocket->vnode();
-  if (STREQ(vnode->idname(), "bp_ParticleInfoNode")) {
-    if (STREQ(vsocket->name(), "Age")) {
-      return new AgeInputProvider();
-    }
-    else {
-      return new AttributeInputProvider(
-          attribute_type_from_socket_type(data_graph->type_of_socket(socket)), vsocket->name());
-    }
-  }
-  else if (STREQ(vnode->idname(), "bp_CollisionInfoNode")) {
-    return new CollisionNormalInputProvider();
-  }
-  else if (STREQ(vnode->idname(), "bp_SurfaceImageNode")) {
-    PointerRNA rna = vnode->rna();
-    Image *image = (Image *)RNA_pointer_get(&rna, "image").data;
-    BLI_assert(image != nullptr);
-    return new SurfaceImageInputProvider(image);
+  if (STREQ(vsocket->name(), "Age")) {
+    return new AgeInputProvider();
   }
   else {
-    BLI_assert(false);
-    return nullptr;
+    FN::Type *fn_type = vtree_data_graph.lookup_type(vsocket);
+    AttributeType attr_type = attribute_type_from_socket_type(fn_type);
+    return new AttributeInputProvider(attr_type, vsocket->name());
   }
 }
 
+static ParticleFunctionInputProvider *INPUT_collision_info(
+    VTreeDataGraph &UNUSED(vtree_data_graph), VirtualSocket *UNUSED(vsocket))
+{
+  return new CollisionNormalInputProvider();
+}
+
+static ParticleFunctionInputProvider *INPUT_surface_image(VTreeDataGraph &UNUSED(vtree_data_graph),
+                                                          VirtualSocket *vsocket)
+{
+  PointerRNA rna = vsocket->vnode()->rna();
+  Image *image = (Image *)RNA_pointer_get(&rna, "image").data;
+  BLI_assert(image != nullptr);
+  return new SurfaceImageInputProvider(image);
+}
+
+BLI_LAZY_INIT_STATIC(StringMap<BuildInputProvider>, get_input_providers_map)
+{
+  StringMap<BuildInputProvider> map;
+  map.add_new("bp_ParticleInfoNode", INPUT_particle_info);
+  map.add_new("bp_CollisionInfoNode", INPUT_collision_info);
+  map.add_new("bp_SurfaceImageNode", INPUT_surface_image);
+  return map;
+}
+
+static ParticleFunctionInputProvider *create_input_provider(VTreeDataGraph &vtree_data_graph,
+                                                            VirtualSocket *vsocket)
+{
+  VirtualNode *vnode = vsocket->vnode();
+
+  auto &map = get_input_providers_map();
+  auto &builder = map.lookup(vnode->idname());
+  ParticleFunctionInputProvider *provider = builder(vtree_data_graph, vsocket);
+  BLI_assert(provider != nullptr);
+  return provider;
+}
+
 static SharedFunction create_function__with_deps(
     VTreeDataGraph &data_graph,
     StringRef function_name,
@@ -112,8 +136,7 @@ static SharedFunction create_function__with_deps(
   fn_builder.add_outputs(data_graph.graph(), sockets_to_compute);
 
   for (uint i = 0; i < input_amount; i++) {
-    r_input_providers[i] = create_input_provider(
-        input_vsockets[i], data_graph.graph(), input_sockets[i]);
+    r_input_providers[i] = create_input_provider(data_graph, input_vsockets[i]);
   }
 
   SharedFunction fn = fn_builder.build(function_name);



More information about the Bf-blender-cvs mailing list