[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