[Bf-blender-cvs] [d5ec476e365] functions: simplify influence generation from xnodes
Jacques Lucke
noreply at git.blender.org
Wed Dec 4 17:10:41 CET 2019
Commit: d5ec476e36531fced66eda3dde89cbdd6ab729fe
Author: Jacques Lucke
Date: Wed Dec 4 16:42:04 2019 +0100
Branches: functions
https://developer.blender.org/rBd5ec476e36531fced66eda3dde89cbdd6ab729fe
simplify influence generation from xnodes
===================================================================
M source/blender/simulations/bparticles/integrator.cpp
M source/blender/simulations/bparticles/node_frontend.cpp
===================================================================
diff --git a/source/blender/simulations/bparticles/integrator.cpp b/source/blender/simulations/bparticles/integrator.cpp
index ad8543932c5..b479c3f7cac 100644
--- a/source/blender/simulations/bparticles/integrator.cpp
+++ b/source/blender/simulations/bparticles/integrator.cpp
@@ -37,9 +37,6 @@ EulerIntegrator::EulerIntegrator(ArrayRef<Force *> forces) : m_forces(forces)
EulerIntegrator::~EulerIntegrator()
{
- for (Force *force : m_forces) {
- delete force;
- }
}
const AttributesInfo &EulerIntegrator::offset_attributes_info()
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index 6f75fa56df2..021026d9717 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -481,42 +481,145 @@ BLI_LAZY_INIT(StringMap<ActionParserCallback>, get_action_parsers)
return map;
}
-using ParseNodeCallback = std::function<void(InfluencesCollector &collector,
- InlinedTreeData &inlined_tree_data,
- WorldTransition &world_transition,
- const XNode &xnode)>;
-
-static void PARSE_point_emitter(InfluencesCollector &collector,
- InlinedTreeData &inlined_tree_data,
- WorldTransition &world_transition,
- const XNode &xnode)
+class XNodeInfluencesBuilder {
+ private:
+ InfluencesCollector &m_influences_collector;
+ InlinedTreeData &m_inlined_tree_data;
+ WorldTransition &m_world_transition;
+ const XNode &m_xnode;
+
+ public:
+ XNodeInfluencesBuilder(InfluencesCollector &influences_collector,
+ InlinedTreeData &inlined_tree_data,
+ WorldTransition &world_transition,
+ const XNode &xnode)
+ : m_influences_collector(influences_collector),
+ m_inlined_tree_data(inlined_tree_data),
+ m_world_transition(world_transition),
+ m_xnode(xnode)
+ {
+ }
+
+ Optional<NamedGenericTupleRef> compute_all_data_inputs()
+ {
+ return m_inlined_tree_data.compute_all_data_inputs(m_xnode);
+ }
+
+ Optional<NamedGenericTupleRef> compute_inputs(ArrayRef<uint> input_indices)
+ {
+ return m_inlined_tree_data.compute_inputs(m_xnode, input_indices);
+ }
+
+ Action &build_action_list(StringRef name)
+ {
+ return m_inlined_tree_data.build_action_list(m_influences_collector, m_xnode, name);
+ }
+
+ ArrayRef<std::string> find_target_system_names(uint output_index, StringRef expected_name)
+ {
+ return m_inlined_tree_data.find_target_system_names(
+ m_xnode.output(output_index, expected_name));
+ }
+
+ WorldTransition &world_transition()
+ {
+ return m_world_transition;
+ }
+
+ template<typename T, typename... Args> T &construct(Args &&... args)
+ {
+ return m_inlined_tree_data.construct<T>(__func__, std::forward<Args>(args)...);
+ }
+
+ void add_emitter(Emitter &emitter)
+ {
+ m_influences_collector.m_emitters.append(&emitter);
+ }
+
+ void add_force(ArrayRef<std::string> system_names, Force &force)
+ {
+ for (StringRef system_name : system_names) {
+ m_influences_collector.m_forces.add(system_name, &force);
+ }
+ }
+
+ void add_event(ArrayRef<std::string> system_names, Event &event)
+ {
+ for (StringRef system_name : system_names) {
+ m_influences_collector.m_events.add(system_name, &event);
+ }
+ }
+
+ void add_offset_handler(ArrayRef<std::string> system_names, OffsetHandler &offset_handler)
+ {
+ for (StringRef system_name : system_names) {
+ m_influences_collector.m_offset_handlers.add(system_name, &offset_handler);
+ }
+ }
+
+ std::string node_identifier()
+ {
+ /* TODO: mix parent names into the identifier */
+ return m_xnode.name();
+ }
+
+ IDHandleLookup &id_handle_lookup()
+ {
+ return m_inlined_tree_data.id_handle_lookup();
+ }
+
+ PointerRNA *node_rna()
+ {
+ return m_xnode.rna();
+ }
+
+ ParticleFunction *particle_function_for_all_inputs()
+ {
+ return m_inlined_tree_data.particle_function_for_all_inputs(m_xnode);
+ }
+
+ template<typename T>
+ void add_attribute(ArrayRef<std::string> system_names, StringRef attribute_name, T default_value)
+ {
+ for (StringRef system_name : system_names) {
+ m_influences_collector.m_attributes.lookup(system_name)
+ ->add<T>(attribute_name, default_value);
+ }
+ }
+};
+
+using ParseNodeCallback = std::function<void(XNodeInfluencesBuilder &builder)>;
+
+static void PARSE_point_emitter(XNodeInfluencesBuilder &builder)
{
- Optional<NamedGenericTupleRef> inputs = inlined_tree_data.compute_all_data_inputs(xnode);
+ Optional<NamedGenericTupleRef> inputs = builder.compute_all_data_inputs();
if (!inputs.has_value()) {
return;
}
- Action &action = inlined_tree_data.build_action_list(collector, xnode, "Execute on Birth");
+ Action &action = builder.build_action_list("Execute on Birth");
- ArrayRef<std::string> system_names = inlined_tree_data.find_target_system_names(
- xnode.output(0, "Emitter"));
- std::string name = xnode.name();
+ ArrayRef<std::string> system_names = builder.find_target_system_names(0, "Emitter");
+ std::string identifier = builder.node_identifier();
+ WorldTransition &world_transition = builder.world_transition();
VaryingFloat3 position = world_transition.update_float3(
- name, "Position", inputs->get<float3>(0, "Position"));
+ identifier, "Position", inputs->get<float3>(0, "Position"));
VaryingFloat3 velocity = world_transition.update_float3(
- name, "Velocity", inputs->get<float3>(1, "Velocity"));
- VaryingFloat size = world_transition.update_float(name, "Size", inputs->get<float>(2, "Size"));
+ identifier, "Velocity", inputs->get<float3>(1, "Velocity"));
+ VaryingFloat size = world_transition.update_float(
+ identifier, "Size", inputs->get<float>(2, "Size"));
- Emitter *emitter = new PointEmitter(std::move(system_names), position, velocity, size, action);
- collector.m_emitters.append(emitter);
+ Emitter &emitter = builder.construct<PointEmitter>(
+ std::move(system_names), position, velocity, size, action);
+ builder.add_emitter(emitter);
}
-static Vector<float> compute_emitter_vertex_weights(const XNode &xnode,
+static Vector<float> compute_emitter_vertex_weights(PointerRNA *node_rna,
NamedGenericTupleRef inputs,
Object *object)
{
- uint density_mode = RNA_enum_get(xnode.rna(), "density_mode");
+ uint density_mode = RNA_enum_get(node_rna, "density_mode");
Mesh *mesh = (Mesh *)object->data;
Vector<float> vertex_weights(mesh->totvert);
@@ -544,222 +647,171 @@ static Vector<float> compute_emitter_vertex_weights(const XNode &xnode,
return vertex_weights;
}
-static void PARSE_mesh_emitter(InfluencesCollector &collector,
- InlinedTreeData &inlined_tree_data,
- WorldTransition &world_transition,
- const XNode &xnode)
+static void PARSE_mesh_emitter(XNodeInfluencesBuilder &builder)
{
- Optional<NamedGenericTupleRef> inputs = inlined_tree_data.compute_all_data_inputs(xnode);
+ Optional<NamedGenericTupleRef> inputs = builder.compute_all_data_inputs();
if (!inputs.has_value()) {
return;
}
- Action &on_birth_action = inlined_tree_data.build_action_list(
- collector, xnode, "Execute on Birth");
+ Action &on_birth_action = builder.build_action_list("Execute on Birth");
ObjectIDHandle object_handle = inputs->relocate_out<ObjectIDHandle>(0, "Object");
- Object *object = inlined_tree_data.id_handle_lookup().lookup(object_handle);
+ Object *object = builder.id_handle_lookup().lookup(object_handle);
if (object == nullptr || object->type != OB_MESH) {
return;
}
- auto vertex_weights = compute_emitter_vertex_weights(xnode, *inputs, object);
+ auto vertex_weights = compute_emitter_vertex_weights(builder.node_rna(), *inputs, object);
- VaryingFloat4x4 transform = world_transition.update_float4x4(
+ VaryingFloat4x4 transform = builder.world_transition().update_float4x4(
object->id.name, "obmat", object->obmat);
- ArrayRef<std::string> system_names = inlined_tree_data.find_target_system_names(
- xnode.output(0, "Emitter"));
- Emitter *emitter = new SurfaceEmitter(system_names,
- on_birth_action,
- object,
- transform,
- inputs->get<float>(1, "Rate"),
- std::move(vertex_weights));
- collector.m_emitters.append(emitter);
+
+ ArrayRef<std::string> system_names = builder.find_target_system_names(0, "Emitter");
+ Emitter &emitter = builder.construct<SurfaceEmitter>(system_names,
+ on_birth_action,
+ object,
+ transform,
+ inputs->get<float>(1, "Rate"),
+ std::move(vertex_weights));
+ builder.add_emitter(emitter);
}
-static void PARSE_custom_force(InfluencesCollector &collector,
- InlinedTreeData &inlined_tree_data,
- WorldTransition &UNUSED(world_transition),
- const XNode &xnode)
+static void PARSE_custom_force(XNodeInfluencesBuilder &builder)
{
- ParticleFunction *inputs_fn = inlined_tree_data.particle_function_for_all_inputs(xnode);
+ ParticleFunction *inputs_fn = builder.particle_function_for_all_inputs();
if (inputs_fn == nullptr) {
return;
}
- ArrayRef<std::string> system_names = inlined_tree_data.find_target_system_names(
- xnode.output(0, "Force"));
-
- for (const std::string &system_name : system_names) {
- Cu
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list