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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs