[Bf-blender-cvs] [5bcc78ada99] functions: remove builders that are not necessary for now

Jacques Lucke noreply at git.blender.org
Mon Jul 22 18:13:42 CEST 2019


Commit: 5bcc78ada99f3db0609b3ea961a8e21aced2cb2e
Author: Jacques Lucke
Date:   Mon Jul 22 17:57:20 2019 +0200
Branches: functions
https://developer.blender.org/rB5bcc78ada99f3db0609b3ea961a8e21aced2cb2e

remove builders that are not necessary for now

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

M	source/blender/simulations/bparticles/inserters.cpp
M	source/blender/simulations/bparticles/inserters.hpp
M	source/blender/simulations/bparticles/node_frontend.cpp
M	source/blender/simulations/bparticles/step_description.hpp

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

diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index 6502ebd982c..decf31bc931 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -28,8 +28,8 @@ static bool is_particle_data_input(VirtualNode *vnode)
 }
 
 static Vector<FN::DFGraphSocket> insert_inputs(FN::FunctionBuilder &fn_builder,
-                                                    BTreeDataGraph &data_graph,
-                                                    ArrayRef<VirtualSocket *> output_vsockets)
+                                               BTreeDataGraph &data_graph,
+                                               ArrayRef<VirtualSocket *> output_vsockets)
 {
   Set<VirtualSocket *> to_be_checked = output_vsockets;
   Set<VirtualSocket *> found_inputs;
@@ -135,7 +135,7 @@ static std::unique_ptr<Action> BUILD_ACTION_explode(BuildContext &ctx, VirtualNo
 
   auto post_action = build_action(ctx, vnode->output(0));
 
-  if (ctx.step_builder.has_type(name)) {
+  if (ctx.type_name_exists(name)) {
     return std::unique_ptr<Action>(new ExplodeAction(name, particle_fn, std::move(post_action)));
   }
   else {
@@ -404,7 +404,7 @@ static std::unique_ptr<OffsetHandler> BUILD_OFFSET_HANDLER_trails(BuildContext &
   float rate = body->get_output<float>(fn_out, 0, "Rate");
   rate = std::max(rate, 0.0f);
 
-  if (ctx.step_builder.has_type(name)) {
+  if (ctx.type_name_exists(name)) {
     return std::unique_ptr<OffsetHandler>(new CreateTrailHandler(name, rate));
   }
   else {
diff --git a/source/blender/simulations/bparticles/inserters.hpp b/source/blender/simulations/bparticles/inserters.hpp
index 1308955b47e..4ccc67b3bd0 100644
--- a/source/blender/simulations/bparticles/inserters.hpp
+++ b/source/blender/simulations/bparticles/inserters.hpp
@@ -24,8 +24,13 @@ using FN::DataFlowNodes::BTreeDataGraph;
 
 struct BuildContext {
   BTreeDataGraph &data_graph;
-  StepDescriptionBuilder &step_builder;
+  Set<std::string> &particle_type_names;
   WorldState &world_state;
+
+  bool type_name_exists(StringRef name)
+  {
+    return this->particle_type_names.contains(name.to_std_string());
+  }
 };
 
 using ForceFromNodeCallback =
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index 2381d9b7982..186d6fa0e2b 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -41,20 +41,22 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(VirtualNodeTree
 {
   SCOPED_TIMER(__func__);
 
-  StepDescriptionBuilder step_builder;
+  Set<std::string> particle_type_names;
+  StringMap<AttributesDeclaration> declarations;
 
   for (VirtualNode *particle_type_node : get_type_nodes(vtree)) {
-    auto &type_builder = step_builder.add_type(particle_type_node->name());
-    auto &attributes = type_builder.attributes();
+    AttributesDeclaration attributes;
     attributes.add_float3("Position", {0, 0, 0});
     attributes.add_float3("Velocity", {0, 0, 0});
     attributes.add_float("Size", 0.01f);
     attributes.add_float3("Color", {1.0f, 1.0f, 1.0f});
+    declarations.add_new(particle_type_node->name(), attributes);
+    particle_type_names.add_new(particle_type_node->name().to_std_string());
   }
 
   auto data_graph = FN::DataFlowNodes::generate_graph(vtree).value();
 
-  BuildContext ctx = {data_graph, step_builder, world_state};
+  BuildContext ctx = {data_graph, particle_type_names, world_state};
 
   MultiMap<std::string, Force *> forces;
   for (auto item : get_force_builders().items()) {
@@ -70,32 +72,35 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(VirtualNodeTree
     }
   }
 
+  MultiMap<std::string, OffsetHandler *> offset_handlers;
   for (auto item : get_offset_handler_builders().items()) {
     for (VirtualNode *vnode : vtree.nodes_with_idname(item.key)) {
       for (VirtualSocket *linked : vnode->output(0)->links()) {
         if (is_particle_type_node(linked->vnode())) {
           auto listener = item.value(ctx, vnode);
           if (listener) {
-            step_builder.get_type(linked->vnode()->name()).add_offset_handler(std::move(listener));
+            offset_handlers.add(linked->vnode()->name().to_std_string(), listener.release());
           }
         }
       }
     }
   }
 
+  MultiMap<std::string, Event *> events;
   for (auto item : get_event_builders().items()) {
     for (VirtualNode *vnode : vtree.nodes_with_idname(item.key)) {
       for (VirtualSocket *linked : vnode->input(0)->links()) {
         if (is_particle_type_node(linked->vnode())) {
           auto event = item.value(ctx, vnode);
           if (event) {
-            step_builder.get_type(linked->vnode()->name()).add_event(std::move(event));
+            events.add(linked->vnode()->name().to_std_string(), event.release());
           }
         }
       }
     }
   }
 
+  Vector<Emitter *> emitters;
   for (auto item : get_emitter_builders().items()) {
     for (VirtualNode *vnode : vtree.nodes_with_idname(item.key)) {
       VirtualSocket *emitter_output = find_emitter_output(vnode);
@@ -103,26 +108,35 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(VirtualNodeTree
         if (is_particle_type_node(linked->vnode())) {
           auto emitter = item.value(ctx, vnode, linked->vnode()->name());
           if (emitter) {
-            step_builder.add_emitter(std::move(emitter));
+            emitters.append(emitter.release());
           }
         }
       }
     }
   }
 
+  StringMap<ParticleType *> particle_types;
   for (VirtualNode *vnode : get_type_nodes(vtree)) {
     std::string name = vnode->name().to_std_string();
-    ParticleTypeBuilder &type_builder = step_builder.get_type(name);
     ArrayRef<Force *> forces_on_type = forces.lookup_default(name);
+
+    Integrator *integrator = nullptr;
     if (forces_on_type.size() == 0) {
-      type_builder.set_integrator(new ConstantVelocityIntegrator());
+      integrator = new ConstantVelocityIntegrator();
     }
     else {
-      type_builder.set_integrator(new EulerIntegrator(forces_on_type));
+      integrator = new EulerIntegrator(forces_on_type);
     }
+
+    ParticleType *particle_type = new ParticleType(declarations.lookup_ref(name),
+                                                   integrator,
+                                                   events.lookup_default(name),
+                                                   offset_handlers.lookup_default(name));
+    particle_types.add_new(name, particle_type);
   }
 
-  return step_builder.build(time_step);
+  StepDescription *step_description = new StepDescription(time_step, particle_types, emitters);
+  return std::unique_ptr<StepDescription>(step_description);
 }
 
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/step_description.hpp b/source/blender/simulations/bparticles/step_description.hpp
index e91f453b332..73d339ba44c 100644
--- a/source/blender/simulations/bparticles/step_description.hpp
+++ b/source/blender/simulations/bparticles/step_description.hpp
@@ -176,92 +176,4 @@ class StepDescription {
   }
 };
 
-class ParticleTypeBuilder {
- private:
-  Integrator *m_integrator;
-  Vector<Event *> m_events;
-  Vector<OffsetHandler *> m_offset_handlers;
-  AttributesDeclaration m_attributes;
-
- public:
-  ParticleTypeBuilder() = default;
-
-  void set_integrator(Integrator *integrator)
-  {
-    m_integrator = integrator;
-  }
-
-  void add_event(std::unique_ptr<Event> event)
-  {
-    m_events.append(event.release());
-  }
-
-  void add_offset_handler(std::unique_ptr<OffsetHandler> offset_handler)
-  {
-    m_offset_handlers.append(offset_handler.release());
-  }
-
-  AttributesDeclaration &attributes()
-  {
-    return m_attributes;
-  }
-
-  ParticleType *build()
-  {
-    BLI_assert(m_integrator);
-    ParticleType *type = new ParticleType(m_attributes, m_integrator, m_events, m_offset_handlers);
-    m_integrator = nullptr;
-    m_events.clear();
-    m_offset_handlers.clear();
-    return type;
-  }
-};
-
-class StepDescriptionBuilder {
- private:
-  StringMap<ParticleTypeBuilder *> m_type_builders;
-  Vector<Emitter *> m_emitters;
-
- public:
-  ~StepDescriptionBuilder()
-  {
-    for (auto type : m_type_builders.values()) {
-      delete type;
-    }
-  }
-
-  void add_emitter(std::unique_ptr<Emitter> emitter)
-  {
-    m_emitters.append(emitter.release());
-  }
-
-  ParticleTypeBuilder &get_type(StringRef name)
-  {
-    return *m_type_builders.lookup(name);
-  }
-
-  ParticleTypeBuilder &add_type(StringRef name)
-  {
-    ParticleTypeBuilder *builder = new ParticleTypeBuilder();
-    m_type_builders.add_new(name, builder);
-    return *builder;
-  }
-
-  bool has_type(StringRef name)
-  {
-    return m_type_builders.contains(name);
-  }
-
-  std::unique_ptr<StepDescription> build(float duration)
-  {
-    StringMap<ParticleType *> types;
-    for (auto item : m_type_builders.items()) {
-      types.add_new(item.key, item.value->build());
-    }
-
-    StepDescription *step_description = new StepDescription(duration, types, m_emitters);
-    return std::unique_ptr<StepDescription>(step_description);
-  }
-};
-
 }  // namespace BParticles



More information about the Bf-blender-cvs mailing list