Commit: 8f70d4986e2468105ec41c9706c13609d1b32ef9
Author: Jacques Lucke
Date:   Sun Apr 28 21:15:43 2019 +0200
Branches: functions
https://developer.blender.org/rB8f70d4986e2468105ec41c9706c13609d1b32ef9

splitup forwarding function

===================================================================

M       source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp

===================================================================

diff --git a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp 
b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
index b4e3d6b8e2e..70d384a8b9f 100644
--- a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
+++ b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
@@ -440,47 +440,96 @@ class ExecuteFGraph : public TupleCallBody {
 
     SocketInfo &output_info = m_output_info[output_id];
     CPPTypeInfo *type_info = output_info.type;
-    void *value_src = storage.output_value_ptr(output_id);
 
     uint *target_ids = BLI_array_alloca(target_ids, 
possible_target_ids.size());
+    uint target_amount = this->filter_uninitialized_targets(
+        possible_target_ids, storage, target_ids);
+
+    this->forward_output_to_targets(output_id, target_ids, target_amount, 
type_info, storage);
+    this->copy_targets_to_final_output_if_necessary(target_ids, target_amount, 
storage, fn_out);
+  }
+
+  uint filter_uninitialized_targets(ArrayRef<uint> &possible_target_ids,
+                                    SocketValueStorage &storage,
+                                    uint *r_target_ids) const
+  {
     uint target_amount = 0;
     for (uint possible_target_id : possible_target_ids) {
       if (!storage.is_input_initialized(possible_target_id)) {
-        target_ids[target_amount] = possible_target_id;
+        r_target_ids[target_amount] = possible_target_id;
         target_amount++;
       }
     }
+    return target_amount;
+  }
 
+  void forward_output_to_targets(uint output_id,
+                                 uint *target_ids,
+                                 uint target_amount,
+                                 CPPTypeInfo *type_info,
+                                 SocketValueStorage &storage) const
+  {
     if (target_amount == 0) {
-      type_info->destruct_type(value_src);
-      storage.set_output_initialized(output_id, false);
+      this->destruct_output(output_id, type_info, storage);
     }
     else if (target_amount == 1) {
-      uint target_id = target_ids[0];
-      void *value_dst = storage.input_value_ptr(target_id);
-      type_info->relocate_to_uninitialized(value_src, value_dst);
-      storage.set_output_initialized(output_id, false);
-      storage.set_input_initialized(target_id, true);
+      this->relocate_output_to_input(output_id, target_ids[0], type_info, 
storage);
     }
     else {
-      for (uint i = 1; i < target_amount; i++) {
-        uint target_id = target_ids[i];
-        void *value_dst = storage.input_value_ptr(target_id);
-        type_info->copy_to_uninitialized(value_src, value_dst);
-        storage.set_input_initialized(target_id, true);
-      }
+      this->forward_output_to_multiple_inputs(
+          output_id, target_ids, target_amount, type_info, storage);
+    }
+  }
+
+  void destruct_output(uint output_id, CPPTypeInfo *type_info, 
SocketValueStorage &storage) const
+  {
+    void *value_ptr = storage.output_value_ptr(output_id);
+    type_info->destruct_type(value_ptr);
+    storage.set_output_initialized(output_id, false);
+  }
+
+  void relocate_output_to_input(uint output_id,
+                                uint target_id,
+                                CPPTypeInfo *type_info,
+                                SocketValueStorage &storage) const
+  {
+    void *value_src = storage.output_value_ptr(output_id);
+    void *value_dst = storage.input_value_ptr(target_id);
+    type_info->relocate_to_uninitialized(value_src, value_dst);
+    storage.set_output_initialized(output_id, false);
+    storage.set_input_initialized(target_id, true);
+  }
+
+  void forward_output_to_multiple_inputs(uint output_id,
+                                         uint *target_ids,
+                                         uint target_amount,
+                                         CPPTypeInfo *type_info,
+                                         SocketValueStorage &storage) const
+  {
+    void *value_src = storage.output_value_ptr(output_id);
 
-      uint target_id = target_ids[0];
+    for (uint i = 1; i < target_amount; i++) {
+      uint target_id = target_ids[i];
       void *value_dst = storage.input_value_ptr(target_id);
       type_info->copy_to_uninitialized(value_src, value_dst);
-      storage.set_output_initialized(output_id, false);
       storage.set_input_initialized(target_id, true);
     }
 
+    uint target_id = target_ids[0];
+    void *value_dst = storage.input_value_ptr(target_id);
+    type_info->copy_to_uninitialized(value_src, value_dst);
+    storage.set_output_initialized(output_id, false);
+    storage.set_input_initialized(target_id, true);
+  }
+
+  void copy_targets_to_final_output_if_necessary(uint *target_ids,
+                                                 uint target_amount,
+                                                 SocketValueStorage &storage,
+                                                 Tuple &fn_out) const
+  {
     for (uint i = 0; i < target_amount; i++) {
       uint target_id = target_ids[i];
       SocketInfo &socket_info = m_input_info[target_id];
-      BLI_assert(type_info == socket_info.type);
       if (socket_info.is_fn_output) {
         uint index = 
m_fgraph.outputs().index(DFGraphSocket::FromInput(target_id));
         void *value_ptr = storage.input_value_ptr(target_id);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to