[Bf-blender-cvs] [510da247789] functions: keep track of contexts used by function network
Jacques Lucke
noreply at git.blender.org
Sat Dec 14 14:46:51 CET 2019
Commit: 510da247789a28bd115e0bb1982aead5b9d5cb41
Author: Jacques Lucke
Date: Sat Dec 14 14:46:21 2019 +0100
Branches: functions
https://developer.blender.org/rB510da247789a28bd115e0bb1982aead5b9d5cb41
keep track of contexts used by function network
===================================================================
M source/blender/functions/FN_multi_function.h
M source/blender/functions/FN_multi_function_network.h
M source/blender/functions/intern/multi_function_network.cc
M source/blender/functions/intern/multi_functions/network.cc
===================================================================
diff --git a/source/blender/functions/FN_multi_function.h b/source/blender/functions/FN_multi_function.h
index a4abc21a094..f2f56fea75a 100644
--- a/source/blender/functions/FN_multi_function.h
+++ b/source/blender/functions/FN_multi_function.h
@@ -48,13 +48,13 @@ class MFSignatureBuilder {
template<typename T> void use_element_context()
{
BLI::class_id_t id = BLI::get_class_id<T>();
- m_data.used_element_contexts.append(id);
+ m_data.used_element_contexts.append_non_duplicates(id);
}
template<typename T> void use_global_context()
{
BLI::class_id_t id = BLI::get_class_id<T>();
- m_data.used_global_contexts.append(id);
+ m_data.used_global_contexts.append_non_duplicates(id);
}
void copy_used_contexts(const MultiFunction &fn);
@@ -185,6 +185,18 @@ class MultiFunction {
return m_signature_data.used_element_contexts.size() > 0;
}
+ template<typename T> bool uses_element_context() const
+ {
+ BLI::class_id_t id = BLI::get_class_id<T>();
+ return m_signature_data.used_element_contexts.contains(id);
+ }
+
+ template<typename T> bool uses_global_context() const
+ {
+ BLI::class_id_t id = BLI::get_class_id<T>();
+ return m_signature_data.used_global_contexts.contains(id);
+ }
+
protected:
MFSignatureBuilder get_builder(StringRef function_name)
{
@@ -421,8 +433,8 @@ class MFParams {
inline void MFSignatureBuilder::copy_used_contexts(const MultiFunction &fn)
{
- m_data.used_element_contexts.extend(fn.m_signature_data.used_element_contexts);
- m_data.used_global_contexts.extend(fn.m_signature_data.used_global_contexts);
+ m_data.used_element_contexts.extend_non_duplicates(fn.m_signature_data.used_element_contexts);
+ m_data.used_global_contexts.extend_non_duplicates(fn.m_signature_data.used_global_contexts);
}
}; // namespace FN
diff --git a/source/blender/functions/FN_multi_function_network.h b/source/blender/functions/FN_multi_function_network.h
index 51d859bd7c7..01ee6da8466 100644
--- a/source/blender/functions/FN_multi_function_network.h
+++ b/source/blender/functions/FN_multi_function_network.h
@@ -306,6 +306,9 @@ class MFNetwork : BLI::NonCopyable, BLI::NonMovable {
Vector<const MFOutputSocket *> find_dummy_dependencies(
ArrayRef<const MFInputSocket *> sockets) const;
+
+ Vector<const MFFunctionNode *> find_function_dependencies(
+ ArrayRef<const MFInputSocket *> sockets) const;
};
/* Builder Implementations
diff --git a/source/blender/functions/intern/multi_function_network.cc b/source/blender/functions/intern/multi_function_network.cc
index e650000fe51..747b06aa4a5 100644
--- a/source/blender/functions/intern/multi_function_network.cc
+++ b/source/blender/functions/intern/multi_function_network.cc
@@ -325,13 +325,12 @@ Vector<const MFOutputSocket *> MFNetwork::find_dummy_dependencies(
const MFOutputSocket &origin_socket = input_socket.origin();
if (found_outputs.add(&origin_socket)) {
- if (origin_socket.node().is_dummy()) {
+ const MFNode &origin_node = origin_socket.node();
+ if (origin_node.is_dummy()) {
dummy_dependencies.append(&origin_socket);
}
else {
- for (const MFInputSocket *origin_input : origin_socket.node().inputs()) {
- inputs_to_check.push(origin_input);
- }
+ inputs_to_check.push_multiple(origin_node.inputs());
}
}
}
@@ -339,4 +338,27 @@ Vector<const MFOutputSocket *> MFNetwork::find_dummy_dependencies(
return dummy_dependencies;
}
+Vector<const MFFunctionNode *> MFNetwork::find_function_dependencies(
+ ArrayRef<const MFInputSocket *> sockets) const
+{
+ Vector<const MFFunctionNode *> function_dependencies;
+ Set<const MFNode *> found_nodes;
+ Stack<const MFInputSocket *> inputs_to_check = sockets;
+
+ while (!inputs_to_check.empty()) {
+ const MFInputSocket &input_socket = *inputs_to_check.pop();
+ const MFOutputSocket &origin_socket = input_socket.origin();
+ const MFNode &origin_node = origin_socket.node();
+
+ if (found_nodes.add(&origin_node)) {
+ if (origin_node.is_function()) {
+ function_dependencies.append(&origin_node.as_function());
+ inputs_to_check.push_multiple(origin_node.inputs());
+ }
+ }
+ }
+
+ return function_dependencies;
+}
+
} // namespace FN
diff --git a/source/blender/functions/intern/multi_functions/network.cc b/source/blender/functions/intern/multi_functions/network.cc
index 11e809ca80f..54c58c9d902 100644
--- a/source/blender/functions/intern/multi_functions/network.cc
+++ b/source/blender/functions/intern/multi_functions/network.cc
@@ -202,7 +202,17 @@ MF_EvaluateNetwork::MF_EvaluateNetwork(Vector<const MFOutputSocket *> inputs,
Vector<const MFInputSocket *> outputs)
: m_inputs(std::move(inputs)), m_outputs(std::move(outputs))
{
+ BLI_assert(m_outputs.size() > 0);
+ const MFNetwork &network = m_outputs[0]->node().network();
+
MFSignatureBuilder signature = this->get_builder("Function Tree");
+
+ Vector<const MFFunctionNode *> used_function_nodes = network.find_function_dependencies(
+ m_outputs);
+ for (const MFFunctionNode *node : used_function_nodes) {
+ signature.copy_used_contexts(node->function());
+ }
+
for (auto socket : m_inputs) {
BLI_assert(socket->node().is_dummy());
@@ -216,6 +226,7 @@ MF_EvaluateNetwork::MF_EvaluateNetwork(Vector<const MFOutputSocket *> inputs,
break;
}
}
+
for (auto socket : m_outputs) {
BLI_assert(socket->node().is_dummy());
More information about the Bf-blender-cvs
mailing list