[Bf-blender-cvs] [4141c905f3d] functions: cleanup
Jacques Lucke
noreply at git.blender.org
Mon Jan 27 22:10:08 CET 2020
Commit: 4141c905f3d081f4885f4fe1e9b9f3ffd31d2eef
Author: Jacques Lucke
Date: Sun Jan 26 20:50:02 2020 +0100
Branches: functions
https://developer.blender.org/rB4141c905f3d081f4885f4fe1e9b9f3ffd31d2eef
cleanup
===================================================================
M source/blender/functions/FN_multi_function_network.h
M source/blender/functions/intern/multi_functions/network.cc
===================================================================
diff --git a/source/blender/functions/FN_multi_function_network.h b/source/blender/functions/FN_multi_function_network.h
index c7ef567ed31..56a9016b8af 100644
--- a/source/blender/functions/FN_multi_function_network.h
+++ b/source/blender/functions/FN_multi_function_network.h
@@ -288,6 +288,7 @@ class MFNode : BLI::NonCopyable, BLI::NonMovable {
const MFDummyNode &as_dummy() const;
template<typename FuncT> void foreach_origin_node(const FuncT &func) const;
+ template<typename FuncT> void foreach_origin_socket(const FuncT &func) const;
};
class MFFunctionNode final : public MFNode {
@@ -661,7 +662,7 @@ inline const MFDummyNode &MFNode::as_dummy() const
return *(const MFDummyNode *)this;
}
-template<typename FuncT> void MFNode::foreach_origin_node(const FuncT &func) const
+template<typename FuncT> inline void MFNode::foreach_origin_node(const FuncT &func) const
{
for (const MFInputSocket *socket : m_inputs) {
const MFOutputSocket &origin_socket = socket->origin();
@@ -670,6 +671,14 @@ template<typename FuncT> void MFNode::foreach_origin_node(const FuncT &func) con
}
}
+template<typename FuncT> inline void MFNode::foreach_origin_socket(const FuncT &func) const
+{
+ for (const MFInputSocket *socket : m_inputs) {
+ const MFOutputSocket &origin_socket = socket->origin();
+ func(origin_socket);
+ }
+}
+
inline const MultiFunction &MFFunctionNode::function() const
{
return *m_function;
diff --git a/source/blender/functions/intern/multi_functions/network.cc b/source/blender/functions/intern/multi_functions/network.cc
index 3bde778cdda..11ab9d67348 100644
--- a/source/blender/functions/intern/multi_functions/network.cc
+++ b/source/blender/functions/intern/multi_functions/network.cc
@@ -308,10 +308,9 @@ class NetworkEvaluationStorage {
return GenericVirtualListListRef::FromSingleArray(CPP_TYPE<float>(), nullptr, 0, 0);
}
- bool input_is_computed(const MFInputSocket &socket)
+ bool socket_is_computed(const MFOutputSocket &socket)
{
- const MFOutputSocket &origin = socket.origin();
- OutputValue *any_value = m_value_per_output_id[origin.id()];
+ OutputValue *any_value = m_value_per_output_id[socket.id()];
return any_value != nullptr;
}
};
@@ -401,48 +400,42 @@ BLI_NOINLINE void MF_EvaluateNetwork::evaluate_network_to_compute_outputs(
const MFNetwork &network = m_outputs[0]->node().network();
ArrayRef<uint> max_dependency_depths = network.max_dependency_depth_per_node();
- Stack<const MFSocket *> sockets_to_compute;
- sockets_to_compute.push_multiple(m_outputs.as_ref());
+ Stack<const MFOutputSocket *> sockets_to_compute;
+ for (const MFInputSocket *socket : m_outputs) {
+ sockets_to_compute.push(&socket->origin());
+ }
while (!sockets_to_compute.is_empty()) {
- const MFSocket &socket = *sockets_to_compute.peek();
+ const MFOutputSocket &socket = *sockets_to_compute.peek();
+ const MFNode &node = socket.node();
- if (socket.is_input()) {
- const MFInputSocket &input_socket = socket.as_input();
- if (storage.input_is_computed(input_socket)) {
- sockets_to_compute.pop();
- }
- else {
- const MFOutputSocket &origin = input_socket.origin();
- sockets_to_compute.push(&origin);
- }
+ if (node.is_dummy()) {
+ BLI_assert(m_inputs.contains(&socket));
+ continue;
}
- else {
- const MFOutputSocket &output_socket = socket.as_output();
- const MFFunctionNode &function_node = output_socket.node().as_function();
-
- ScopedVector<const MFInputSocket *> missing_inputs;
- for (const MFInputSocket *input_socket : function_node.inputs()) {
- if (!storage.input_is_computed(*input_socket)) {
- missing_inputs.append(input_socket);
- sockets_to_compute.push(input_socket);
- }
+
+ const MFFunctionNode &function_node = node.as_function();
+
+ ScopedVector<const MFOutputSocket *> missing_sockets;
+ function_node.foreach_origin_socket([&](const MFOutputSocket &origin) {
+ if (!storage.socket_is_computed(origin)) {
+ missing_sockets.append(&origin);
}
+ });
- std::sort(missing_inputs.begin(),
- missing_inputs.end(),
- [&](const MFInputSocket *a, const MFInputSocket *b) {
- return max_dependency_depths[a->origin().node().id()] <
- max_dependency_depths[b->origin().node().id()];
- });
+ std::sort(missing_sockets.begin(),
+ missing_sockets.end(),
+ [&](const MFOutputSocket *a, const MFOutputSocket *b) {
+ return max_dependency_depths[a->node().id()] <
+ max_dependency_depths[b->node().id()];
+ });
- sockets_to_compute.push_multiple(missing_inputs.as_ref());
+ sockets_to_compute.push_multiple(missing_sockets.as_ref());
- bool all_inputs_are_computed = missing_inputs.size() == 0;
- if (all_inputs_are_computed) {
- this->evaluate_function(global_context, function_node, storage);
- sockets_to_compute.pop();
- }
+ bool all_inputs_are_computed = missing_sockets.size() == 0;
+ if (all_inputs_are_computed) {
+ this->evaluate_function(global_context, function_node, storage);
+ sockets_to_compute.pop();
}
}
}
More information about the Bf-blender-cvs
mailing list