[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