[Bf-blender-cvs] [9f1c6250563] functions: cleanup force node handling
Jacques Lucke
noreply at git.blender.org
Thu Jul 11 17:15:33 CEST 2019
Commit: 9f1c6250563355d7eb73ce6cc27f3be267173032
Author: Jacques Lucke
Date: Thu Jul 11 14:29:17 2019 +0200
Branches: functions
https://developer.blender.org/rB9f1c6250563355d7eb73ce6cc27f3be267173032
cleanup force node handling
===================================================================
M source/blender/blenkernel/intern/node_tree.cpp
M source/blender/simulations/bparticles/forces.cpp
M source/blender/simulations/bparticles/forces.hpp
M source/blender/simulations/bparticles/inserters.cpp
M source/blender/simulations/bparticles/inserters.hpp
M source/blender/simulations/bparticles/node_frontend.cpp
===================================================================
diff --git a/source/blender/blenkernel/intern/node_tree.cpp b/source/blender/blenkernel/intern/node_tree.cpp
index 0c2d8462865..d9c369a9e05 100644
--- a/source/blender/blenkernel/intern/node_tree.cpp
+++ b/source/blender/blenkernel/intern/node_tree.cpp
@@ -48,7 +48,8 @@ void IndexedNodeTree::find_connected_sockets_left(bNodeSocket *bsocket,
SmallVector<SocketWithNode> &r_sockets) const
{
BLI_assert(bsocket->in_out == SOCK_IN);
- for (SocketWithNode linked : m_direct_links.lookup_default(bsocket)) {
+ auto from_sockets = m_direct_links.lookup_default(bsocket);
+ for (SocketWithNode linked : from_sockets) {
if (this->is_reroute(linked.node)) {
this->find_connected_sockets_left((bNodeSocket *)linked.node->inputs.first, r_sockets);
}
@@ -61,7 +62,8 @@ void IndexedNodeTree::find_connected_sockets_right(bNodeSocket *bsocket,
SmallVector<SocketWithNode> &r_sockets) const
{
BLI_assert(bsocket->in_out == SOCK_OUT);
- for (SocketWithNode other : m_direct_links.lookup_default(bsocket)) {
+ auto to_sockets = m_direct_links.lookup_default(bsocket);
+ for (SocketWithNode other : to_sockets) {
if (this->is_reroute(other.node)) {
this->find_connected_sockets_right((bNodeSocket *)other.node->outputs.first, r_sockets);
}
diff --git a/source/blender/simulations/bparticles/forces.cpp b/source/blender/simulations/bparticles/forces.cpp
index 013fb3c8134..d1ffcdd4785 100644
--- a/source/blender/simulations/bparticles/forces.cpp
+++ b/source/blender/simulations/bparticles/forces.cpp
@@ -69,14 +69,16 @@ class TurbulenceForce : public Force {
}
};
-Force *FORCE_gravity(SharedFunction &compute_acceleration_fn)
+std::unique_ptr<Force> FORCE_gravity(SharedFunction &compute_acceleration_fn)
{
- return new GravityForce(compute_acceleration_fn);
+ Force *force = new GravityForce(compute_acceleration_fn);
+ return std::unique_ptr<Force>(force);
}
-Force *FORCE_turbulence(SharedFunction &compute_strength_fn)
+std::unique_ptr<Force> FORCE_turbulence(SharedFunction &compute_strength_fn)
{
- return new TurbulenceForce(compute_strength_fn);
+ Force *force = new TurbulenceForce(compute_strength_fn);
+ return std::unique_ptr<Force>(force);
}
} // namespace BParticles
diff --git a/source/blender/simulations/bparticles/forces.hpp b/source/blender/simulations/bparticles/forces.hpp
index 4ee25b7dad9..862eee7f025 100644
--- a/source/blender/simulations/bparticles/forces.hpp
+++ b/source/blender/simulations/bparticles/forces.hpp
@@ -11,7 +11,7 @@ class Force {
virtual void add_force(ParticlesBlock &block, ArrayRef<float3> r_force) = 0;
};
-Force *FORCE_gravity(SharedFunction &compute_acceleration_fn);
-Force *FORCE_turbulence(SharedFunction &compute_strength_fn);
+std::unique_ptr<Force> FORCE_gravity(SharedFunction &compute_acceleration_fn);
+std::unique_ptr<Force> FORCE_turbulence(SharedFunction &compute_strength_fn);
} // namespace BParticles
diff --git a/source/blender/simulations/bparticles/inserters.cpp b/source/blender/simulations/bparticles/inserters.cpp
index bbd1a1bf315..cd07783a9cf 100644
--- a/source/blender/simulations/bparticles/inserters.cpp
+++ b/source/blender/simulations/bparticles/inserters.cpp
@@ -305,44 +305,6 @@ static void INSERT_EVENT_mesh_collision(ProcessNodeInterface &interface)
}
}
-static void INSERT_FORCE_gravity(ProcessNodeInterface &interface)
-{
- for (SocketWithNode linked : interface.linked_with_output(0)) {
- if (!is_particle_type_node(linked.node)) {
- continue;
- }
-
- SharedFunction fn = create_function_for_data_inputs(
- interface.bnode(), interface.indexed_tree(), interface.data_graph());
-
- Force *force = FORCE_gravity(fn);
-
- bNode *type_node = linked.node;
- EulerIntegrator *integrator = reinterpret_cast<EulerIntegrator *>(
- interface.step_description().m_types.lookup_ref(type_node->name)->m_integrator);
- integrator->add_force(std::unique_ptr<Force>(force));
- }
-}
-
-static void INSERT_FORCE_turbulence(ProcessNodeInterface &interface)
-{
- for (SocketWithNode linked : interface.linked_with_output(0)) {
- if (!is_particle_type_node(linked.node)) {
- continue;
- }
-
- SharedFunction fn = create_function_for_data_inputs(
- interface.bnode(), interface.indexed_tree(), interface.data_graph());
-
- Force *force = FORCE_turbulence(fn);
-
- bNode *type_node = linked.node;
- EulerIntegrator *integrator = reinterpret_cast<EulerIntegrator *>(
- interface.step_description().m_types.lookup_ref(type_node->name)->m_integrator);
- integrator->add_force(std::unique_ptr<Force>(force));
- }
-}
-
BLI_LAZY_INIT(ProcessFunctionsMap, get_node_processors)
{
ProcessFunctionsMap processors;
@@ -350,9 +312,27 @@ BLI_LAZY_INIT(ProcessFunctionsMap, get_node_processors)
processors.add_new("bp_PointEmitterNode", INSERT_EMITTER_point);
processors.add_new("bp_AgeReachedEventNode", INSERT_EVENT_age_reached);
processors.add_new("bp_MeshCollisionEventNode", INSERT_EVENT_mesh_collision);
- processors.add_new("bp_GravityForceNode", INSERT_FORCE_gravity);
- processors.add_new("bp_TurbulenceForceNode", INSERT_FORCE_turbulence);
return processors;
}
+static std::unique_ptr<Force> BUILD_FORCE_gravity(BuildContext &ctx, bNode *bnode)
+{
+ SharedFunction fn = create_function_for_data_inputs(bnode, ctx.indexed_tree, ctx.data_graph);
+ return FORCE_gravity(fn);
+}
+
+static std::unique_ptr<Force> BUILD_FORCE_turbulence(BuildContext &ctx, bNode *bnode)
+{
+ SharedFunction fn = create_function_for_data_inputs(bnode, ctx.indexed_tree, ctx.data_graph);
+ return FORCE_turbulence(fn);
+}
+
+BLI_LAZY_INIT(ForceFromNodeCallbackMap, get_force_builders)
+{
+ ForceFromNodeCallbackMap map;
+ map.add_new("bp_GravityForceNode", BUILD_FORCE_gravity);
+ map.add_new("bp_TurbulenceForceNode", BUILD_FORCE_turbulence);
+ return map;
+}
+
} // namespace BParticles
diff --git a/source/blender/simulations/bparticles/inserters.hpp b/source/blender/simulations/bparticles/inserters.hpp
index 083f6048b55..ab0cf98c85f 100644
--- a/source/blender/simulations/bparticles/inserters.hpp
+++ b/source/blender/simulations/bparticles/inserters.hpp
@@ -7,6 +7,7 @@
#include "world_state.hpp"
#include "step_description.hpp"
+#include "forces.hpp"
namespace BParticles {
@@ -95,4 +96,16 @@ using ProcessFunctionsMap = SmallMap<std::string, ProcessNodeFunction>;
ProcessFunctionsMap &get_node_processors();
+struct BuildContext {
+ IndexedNodeTree &indexed_tree;
+ BTreeDataGraph &data_graph;
+ ModifierStepDescription &step_description;
+};
+
+using ForceFromNodeCallback =
+ std::function<std::unique_ptr<Force>(BuildContext &ctx, bNode *bnode)>;
+using ForceFromNodeCallbackMap = SmallMap<std::string, ForceFromNodeCallback>;
+
+ForceFromNodeCallbackMap &get_force_builders();
+
} // namespace BParticles
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index f4bd992a44a..822e66b40b6 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -4,12 +4,15 @@
namespace BParticles {
+static bool is_particle_type_node(bNode *bnode)
+{
+ return STREQ(bnode->idname, "bp_ParticleTypeNode");
+}
+
std::unique_ptr<StepDescription> step_description_from_node_tree(IndexedNodeTree &indexed_tree,
WorldState &world_state,
float time_step)
{
- auto node_processors = get_node_processors();
-
ModifierStepDescription *step_description = new ModifierStepDescription();
for (bNode *particle_type_node : indexed_tree.nodes_with_idname("bp_ParticleTypeNode")) {
@@ -23,6 +26,7 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(IndexedNodeTree
auto data_graph = FN::DataFlowNodes::generate_graph(indexed_tree).value();
+ auto node_processors = get_node_processors();
for (auto item : node_processors.items()) {
for (bNode *bnode : indexed_tree.nodes_with_idname(item.key)) {
ProcessNodeInterface interface(
@@ -31,6 +35,22 @@ std::unique_ptr<StepDescription> step_description_from_node_tree(IndexedNodeTree
}
}
+ BuildContext ctx = {indexed_tree, data_graph, *step_description};
+ for (auto item : get_force_builders().items()) {
+ for (bNode *bnode : indexed_tree.nodes_with_idname(item.key)) {
+ bNodeSocket *force_output = bSocketList(bnode->outputs).get(0);
+ for (SocketWithNode linked : indexed_tree.linked(force_output)) {
+ if (is_particle_type_node(linked.node)) {
+ auto force = item.value(ctx, bnode);
+
+ EulerIntegrator *integrator = reinterpret_cast<EulerIntegrator *>(
+ step_description->m_types.lookup_ref(linked.node->name)->m_integrator);
+ integrator->add_force(std::move(force));
+ }
+ }
+ }
+ }
+
step_description->m_duration = time_step;
return std::unique_ptr<StepDescription>(step_description);
}
More information about the Bf-blender-cvs
mailing list