[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