[Bf-blender-cvs] [8dd5be76c08] functions: initial step desription builder

Jacques Lucke noreply at git.blender.org
Thu Jul 18 18:19:28 CEST 2019


Commit: 8dd5be76c08da2306924cbad0f8dbb516d3f3ef5
Author: Jacques Lucke
Date:   Thu Jul 18 14:59:07 2019 +0200
Branches: functions
https://developer.blender.org/rB8dd5be76c08da2306924cbad0f8dbb516d3f3ef5

initial step desription builder

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

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 417ad7131e2..5e88422794e 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -141,7 +141,7 @@ static std::unique_ptr<Action> BUILD_ACTION_explode(BuildContext &ctx, bNode *bn
 
   auto post_action = build_action(ctx, {node_outputs.get(0), bnode});
 
-  if (ctx.step_description.m_types.contains(name)) {
+  if (ctx.step_builder.has_type(name)) {
     return std::unique_ptr<Action>(new ExplodeAction(name, particle_fn, std::move(post_action)));
   }
   else {
@@ -403,7 +403,7 @@ static std::unique_ptr<OffsetHandler> BUILD_OFFSET_HANDLER_trails(BuildContext &
   char name[65];
   RNA_string_get(&rna, "particle_type_name", name);
 
-  if (ctx.step_description.m_types.contains(name)) {
+  if (ctx.step_builder.has_type(name)) {
     return std::unique_ptr<OffsetHandler>(new CreateTrailHandler(name));
   }
   else {
diff --git a/source/blender/simulations/bparticles/inserters.hpp b/source/blender/simulations/bparticles/inserters.hpp
index 1395c32623a..44a0a601292 100644
--- a/source/blender/simulations/bparticles/inserters.hpp
+++ b/source/blender/simulations/bparticles/inserters.hpp
@@ -21,7 +21,7 @@ using FN::DataFlowNodes::BTreeDataGraph;
 struct BuildContext {
   IndexedNodeTree &indexed_tree;
   BTreeDataGraph &data_graph;
-  ModifierStepDescription &step_description;
+  StepDescriptionBuilder &step_builder;
   WorldState &world_state;
 };
 
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index bd437459609..8260a45b1d2 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -29,19 +29,19 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(IndexedNodeTree
                                                                  WorldState &world_state,
                                                                  float time_step)
 {
-  ModifierStepDescription *step_description = new ModifierStepDescription();
+  StepDescriptionBuilder step_builder;
+  StringMap<EulerIntegrator *> euler_integrators;
 
   for (bNode *particle_type_node : indexed_tree.nodes_with_idname("bp_ParticleTypeNode")) {
-    ModifierParticleType *type = new ModifierParticleType();
-    type->m_integrator = new EulerIntegrator();
-
-    std::string type_name = particle_type_node->name;
-    step_description->m_types.add_new(type_name, type);
+    auto &type_builder = step_builder.add_type(particle_type_node->name);
+    EulerIntegrator *integrator = new EulerIntegrator();
+    euler_integrators.add_new(particle_type_node->name, integrator);
+    type_builder.set_integrator(integrator);
   }
 
   auto data_graph = FN::DataFlowNodes::generate_graph(indexed_tree).value();
 
-  BuildContext ctx = {indexed_tree, data_graph, *step_description, world_state};
+  BuildContext ctx = {indexed_tree, data_graph, step_builder, world_state};
 
   for (auto item : get_force_builders().items()) {
     for (bNode *bnode : indexed_tree.nodes_with_idname(item.key)) {
@@ -50,9 +50,7 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(IndexedNodeTree
         if (is_particle_type_node(linked.node)) {
           auto force = item.value(ctx, bnode);
           if (force) {
-            EulerIntegrator &integrator = reinterpret_cast<EulerIntegrator &>(
-                step_description->m_types.lookup_ref(linked.node->name)->integrator());
-            integrator.add_force(std::move(force));
+            euler_integrators.lookup(linked.node->name)->add_force(std::move(force));
           }
         }
       }
@@ -66,9 +64,7 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(IndexedNodeTree
         if (is_particle_type_node(linked.node)) {
           auto listener = item.value(ctx, bnode);
           if (listener) {
-            ModifierParticleType &particle_type =
-                *(ModifierParticleType *)step_description->m_types.lookup(linked.node->name);
-            particle_type.m_offset_handlers.append(listener.release());
+            step_builder.get_type(linked.node->name).add_offset_handler(std::move(listener));
           }
         }
       }
@@ -82,9 +78,7 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(IndexedNodeTree
         if (is_particle_type_node(linked.node)) {
           auto event = item.value(ctx, bnode);
           if (event) {
-            ModifierParticleType &particle_type =
-                *(ModifierParticleType *)step_description->m_types.lookup(linked.node->name);
-            particle_type.m_events.append(event.release());
+            step_builder.get_type(linked.node->name).add_event(std::move(event));
           }
         }
       }
@@ -98,15 +92,14 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(IndexedNodeTree
         if (is_particle_type_node(linked.node)) {
           auto emitter = item.value(ctx, bnode, linked.node->name);
           if (emitter) {
-            step_description->m_emitters.append(emitter.release());
+            step_builder.add_emitter(std::move(emitter));
           }
         }
       }
     }
   }
 
-  step_description->m_duration = time_step;
-  return std::unique_ptr<StepDescription>(step_description);
+  return step_builder.build(time_step);
 }
 
 }  // namespace BParticles
diff --git a/source/blender/simulations/bparticles/step_description.hpp b/source/blender/simulations/bparticles/step_description.hpp
index 8baab3a109b..92f6985bc4b 100644
--- a/source/blender/simulations/bparticles/step_description.hpp
+++ b/source/blender/simulations/bparticles/step_description.hpp
@@ -75,4 +75,81 @@ class ModifierStepDescription : public StepDescription {
   }
 };
 
+class ParticleTypeBuilder {
+ private:
+  Integrator *m_integrator;
+  SmallVector<Event *> m_events;
+  SmallVector<OffsetHandler *> m_offset_handlers;
+
+ 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());
+  }
+
+  ParticleType *build()
+  {
+    BLI_assert(m_integrator);
+    ModifierParticleType *type = new ModifierParticleType();
+    type->m_integrator = m_integrator;
+    type->m_events = m_events;
+    type->m_offset_handlers = m_offset_handlers;
+    m_events.clear();
+    m_offset_handlers.clear();
+    return type;
+  }
+};
+
+class StepDescriptionBuilder {
+ private:
+  StringMap<ParticleTypeBuilder *> m_type_builders;
+  SmallVector<Emitter *> m_emitters;
+
+ public:
+  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)
+  {
+    ModifierStepDescription *step_description = new ModifierStepDescription();
+    step_description->m_duration = duration;
+    step_description->m_emitters = m_emitters;
+    for (auto item : m_type_builders.items()) {
+      step_description->m_types.add_new(item.key, item.value->build());
+    }
+    return std::unique_ptr<StepDescription>(step_description);
+  }
+};
+
 }  // namespace BParticles



More information about the Bf-blender-cvs mailing list