[Bf-blender-cvs] [d5ec476e365] functions: simplify influence generation from xnodes

Jacques Lucke noreply at git.blender.org
Wed Dec 4 17:10:41 CET 2019


Commit: d5ec476e36531fced66eda3dde89cbdd6ab729fe
Author: Jacques Lucke
Date:   Wed Dec 4 16:42:04 2019 +0100
Branches: functions
https://developer.blender.org/rBd5ec476e36531fced66eda3dde89cbdd6ab729fe

simplify influence generation from xnodes

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

M	source/blender/simulations/bparticles/integrator.cpp
M	source/blender/simulations/bparticles/node_frontend.cpp

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

diff --git a/source/blender/simulations/bparticles/integrator.cpp b/source/blender/simulations/bparticles/integrator.cpp
index ad8543932c5..b479c3f7cac 100644
--- a/source/blender/simulations/bparticles/integrator.cpp
+++ b/source/blender/simulations/bparticles/integrator.cpp
@@ -37,9 +37,6 @@ EulerIntegrator::EulerIntegrator(ArrayRef<Force *> forces) : m_forces(forces)
 
 EulerIntegrator::~EulerIntegrator()
 {
-  for (Force *force : m_forces) {
-    delete force;
-  }
 }
 
 const AttributesInfo &EulerIntegrator::offset_attributes_info()
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index 6f75fa56df2..021026d9717 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -481,42 +481,145 @@ BLI_LAZY_INIT(StringMap<ActionParserCallback>, get_action_parsers)
   return map;
 }
 
-using ParseNodeCallback = std::function<void(InfluencesCollector &collector,
-                                             InlinedTreeData &inlined_tree_data,
-                                             WorldTransition &world_transition,
-                                             const XNode &xnode)>;
-
-static void PARSE_point_emitter(InfluencesCollector &collector,
-                                InlinedTreeData &inlined_tree_data,
-                                WorldTransition &world_transition,
-                                const XNode &xnode)
+class XNodeInfluencesBuilder {
+ private:
+  InfluencesCollector &m_influences_collector;
+  InlinedTreeData &m_inlined_tree_data;
+  WorldTransition &m_world_transition;
+  const XNode &m_xnode;
+
+ public:
+  XNodeInfluencesBuilder(InfluencesCollector &influences_collector,
+                         InlinedTreeData &inlined_tree_data,
+                         WorldTransition &world_transition,
+                         const XNode &xnode)
+      : m_influences_collector(influences_collector),
+        m_inlined_tree_data(inlined_tree_data),
+        m_world_transition(world_transition),
+        m_xnode(xnode)
+  {
+  }
+
+  Optional<NamedGenericTupleRef> compute_all_data_inputs()
+  {
+    return m_inlined_tree_data.compute_all_data_inputs(m_xnode);
+  }
+
+  Optional<NamedGenericTupleRef> compute_inputs(ArrayRef<uint> input_indices)
+  {
+    return m_inlined_tree_data.compute_inputs(m_xnode, input_indices);
+  }
+
+  Action &build_action_list(StringRef name)
+  {
+    return m_inlined_tree_data.build_action_list(m_influences_collector, m_xnode, name);
+  }
+
+  ArrayRef<std::string> find_target_system_names(uint output_index, StringRef expected_name)
+  {
+    return m_inlined_tree_data.find_target_system_names(
+        m_xnode.output(output_index, expected_name));
+  }
+
+  WorldTransition &world_transition()
+  {
+    return m_world_transition;
+  }
+
+  template<typename T, typename... Args> T &construct(Args &&... args)
+  {
+    return m_inlined_tree_data.construct<T>(__func__, std::forward<Args>(args)...);
+  }
+
+  void add_emitter(Emitter &emitter)
+  {
+    m_influences_collector.m_emitters.append(&emitter);
+  }
+
+  void add_force(ArrayRef<std::string> system_names, Force &force)
+  {
+    for (StringRef system_name : system_names) {
+      m_influences_collector.m_forces.add(system_name, &force);
+    }
+  }
+
+  void add_event(ArrayRef<std::string> system_names, Event &event)
+  {
+    for (StringRef system_name : system_names) {
+      m_influences_collector.m_events.add(system_name, &event);
+    }
+  }
+
+  void add_offset_handler(ArrayRef<std::string> system_names, OffsetHandler &offset_handler)
+  {
+    for (StringRef system_name : system_names) {
+      m_influences_collector.m_offset_handlers.add(system_name, &offset_handler);
+    }
+  }
+
+  std::string node_identifier()
+  {
+    /* TODO: mix parent names into the identifier */
+    return m_xnode.name();
+  }
+
+  IDHandleLookup &id_handle_lookup()
+  {
+    return m_inlined_tree_data.id_handle_lookup();
+  }
+
+  PointerRNA *node_rna()
+  {
+    return m_xnode.rna();
+  }
+
+  ParticleFunction *particle_function_for_all_inputs()
+  {
+    return m_inlined_tree_data.particle_function_for_all_inputs(m_xnode);
+  }
+
+  template<typename T>
+  void add_attribute(ArrayRef<std::string> system_names, StringRef attribute_name, T default_value)
+  {
+    for (StringRef system_name : system_names) {
+      m_influences_collector.m_attributes.lookup(system_name)
+          ->add<T>(attribute_name, default_value);
+    }
+  }
+};
+
+using ParseNodeCallback = std::function<void(XNodeInfluencesBuilder &builder)>;
+
+static void PARSE_point_emitter(XNodeInfluencesBuilder &builder)
 {
-  Optional<NamedGenericTupleRef> inputs = inlined_tree_data.compute_all_data_inputs(xnode);
+  Optional<NamedGenericTupleRef> inputs = builder.compute_all_data_inputs();
   if (!inputs.has_value()) {
     return;
   }
 
-  Action &action = inlined_tree_data.build_action_list(collector, xnode, "Execute on Birth");
+  Action &action = builder.build_action_list("Execute on Birth");
 
-  ArrayRef<std::string> system_names = inlined_tree_data.find_target_system_names(
-      xnode.output(0, "Emitter"));
-  std::string name = xnode.name();
+  ArrayRef<std::string> system_names = builder.find_target_system_names(0, "Emitter");
+  std::string identifier = builder.node_identifier();
 
+  WorldTransition &world_transition = builder.world_transition();
   VaryingFloat3 position = world_transition.update_float3(
-      name, "Position", inputs->get<float3>(0, "Position"));
+      identifier, "Position", inputs->get<float3>(0, "Position"));
   VaryingFloat3 velocity = world_transition.update_float3(
-      name, "Velocity", inputs->get<float3>(1, "Velocity"));
-  VaryingFloat size = world_transition.update_float(name, "Size", inputs->get<float>(2, "Size"));
+      identifier, "Velocity", inputs->get<float3>(1, "Velocity"));
+  VaryingFloat size = world_transition.update_float(
+      identifier, "Size", inputs->get<float>(2, "Size"));
 
-  Emitter *emitter = new PointEmitter(std::move(system_names), position, velocity, size, action);
-  collector.m_emitters.append(emitter);
+  Emitter &emitter = builder.construct<PointEmitter>(
+      std::move(system_names), position, velocity, size, action);
+  builder.add_emitter(emitter);
 }
 
-static Vector<float> compute_emitter_vertex_weights(const XNode &xnode,
+static Vector<float> compute_emitter_vertex_weights(PointerRNA *node_rna,
                                                     NamedGenericTupleRef inputs,
                                                     Object *object)
 {
-  uint density_mode = RNA_enum_get(xnode.rna(), "density_mode");
+  uint density_mode = RNA_enum_get(node_rna, "density_mode");
 
   Mesh *mesh = (Mesh *)object->data;
   Vector<float> vertex_weights(mesh->totvert);
@@ -544,222 +647,171 @@ static Vector<float> compute_emitter_vertex_weights(const XNode &xnode,
   return vertex_weights;
 }
 
-static void PARSE_mesh_emitter(InfluencesCollector &collector,
-                               InlinedTreeData &inlined_tree_data,
-                               WorldTransition &world_transition,
-                               const XNode &xnode)
+static void PARSE_mesh_emitter(XNodeInfluencesBuilder &builder)
 {
-  Optional<NamedGenericTupleRef> inputs = inlined_tree_data.compute_all_data_inputs(xnode);
+  Optional<NamedGenericTupleRef> inputs = builder.compute_all_data_inputs();
   if (!inputs.has_value()) {
     return;
   }
 
-  Action &on_birth_action = inlined_tree_data.build_action_list(
-      collector, xnode, "Execute on Birth");
+  Action &on_birth_action = builder.build_action_list("Execute on Birth");
 
   ObjectIDHandle object_handle = inputs->relocate_out<ObjectIDHandle>(0, "Object");
-  Object *object = inlined_tree_data.id_handle_lookup().lookup(object_handle);
+  Object *object = builder.id_handle_lookup().lookup(object_handle);
   if (object == nullptr || object->type != OB_MESH) {
     return;
   }
 
-  auto vertex_weights = compute_emitter_vertex_weights(xnode, *inputs, object);
+  auto vertex_weights = compute_emitter_vertex_weights(builder.node_rna(), *inputs, object);
 
-  VaryingFloat4x4 transform = world_transition.update_float4x4(
+  VaryingFloat4x4 transform = builder.world_transition().update_float4x4(
       object->id.name, "obmat", object->obmat);
-  ArrayRef<std::string> system_names = inlined_tree_data.find_target_system_names(
-      xnode.output(0, "Emitter"));
-  Emitter *emitter = new SurfaceEmitter(system_names,
-                                        on_birth_action,
-                                        object,
-                                        transform,
-                                        inputs->get<float>(1, "Rate"),
-                                        std::move(vertex_weights));
-  collector.m_emitters.append(emitter);
+
+  ArrayRef<std::string> system_names = builder.find_target_system_names(0, "Emitter");
+  Emitter &emitter = builder.construct<SurfaceEmitter>(system_names,
+                                                       on_birth_action,
+                                                       object,
+                                                       transform,
+                                                       inputs->get<float>(1, "Rate"),
+                                                       std::move(vertex_weights));
+  builder.add_emitter(emitter);
 }
 
-static void PARSE_custom_force(InfluencesCollector &collector,
-                               InlinedTreeData &inlined_tree_data,
-                               WorldTransition &UNUSED(world_transition),
-                               const XNode &xnode)
+static void PARSE_custom_force(XNodeInfluencesBuilder &builder)
 {
-  ParticleFunction *inputs_fn = inlined_tree_data.particle_function_for_all_inputs(xnode);
+  ParticleFunction *inputs_fn = builder.particle_function_for_all_inputs();
   if (inputs_fn == nullptr) {
     return;
   }
 
-  ArrayRef<std::string> system_names = inlined_tree_data.find_target_system_names(
-      xnode.output(0, "Force"));
-
-  for (const std::string &system_name : system_names) {
-    Cu

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list