[Bf-blender-cvs] [206f3352dd4] temp-attribute-processor: fix missing type conversion

Jacques Lucke noreply at git.blender.org
Mon Jun 28 15:47:12 CEST 2021


Commit: 206f3352dd42dba08fe846c7b067ec683af2b122
Author: Jacques Lucke
Date:   Mon Jun 28 15:46:59 2021 +0200
Branches: temp-attribute-processor
https://developer.blender.org/rB206f3352dd42dba08fe846c7b067ec683af2b122

fix missing type conversion

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

M	source/blender/nodes/intern/node_tree_multi_function.cc

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

diff --git a/source/blender/nodes/intern/node_tree_multi_function.cc b/source/blender/nodes/intern/node_tree_multi_function.cc
index 7ab6495f733..2582b3a207d 100644
--- a/source/blender/nodes/intern/node_tree_multi_function.cc
+++ b/source/blender/nodes/intern/node_tree_multi_function.cc
@@ -160,8 +160,29 @@ static fn::MFOutputSocket &insert_default_value_for_type(CommonMFNetworkBuilderD
   return node.output(0);
 }
 
+static fn::MFOutputSocket &insert_optional_conversion(CommonMFNetworkBuilderData &common,
+                                                      fn::MFOutputSocket &socket,
+                                                      const fn::MFDataType &to_type)
+{
+  const fn::MFDataType from_type = socket.data_type();
+  if (from_type == to_type) {
+    return socket;
+  }
+  const fn::MultiFunction *conversion_fn =
+      get_implicit_type_conversions().get_conversion_multi_function(from_type, to_type);
+  if (conversion_fn != nullptr) {
+    fn::MFNode &node = common.network.add_function(*conversion_fn);
+    common.network.add_link(socket, node.input(0));
+    return node.output(0);
+  }
+  else {
+    return insert_default_value_for_type(common, to_type);
+  }
+}
+
 static fn::MFOutputSocket *insert_unlinked_input(CommonMFNetworkBuilderData &common,
-                                                 const DInputSocket &dsocket)
+                                                 const DInputSocket &dsocket,
+                                                 const fn::MFDataType &to_type)
 {
   BLI_assert(socket_is_mf_data_socket(*dsocket->typeinfo()));
 
@@ -170,7 +191,7 @@ static fn::MFOutputSocket *insert_unlinked_input(CommonMFNetworkBuilderData &com
 
   fn::MFOutputSocket *built_socket = builder.built_socket();
   BLI_assert(built_socket != nullptr);
-  return built_socket;
+  return &insert_optional_conversion(common, *built_socket, to_type);
 }
 
 static void insert_links_and_unlinked_inputs(CommonMFNetworkBuilderData &common)
@@ -200,7 +221,7 @@ static void insert_links_and_unlinked_inputs(CommonMFNetworkBuilderData &common)
       }
       if (from_dsockets.is_empty()) {
         /* The socket is not linked. Need to use the value of the socket itself. */
-        fn::MFOutputSocket *built_socket = insert_unlinked_input(common, to_dsocket);
+        fn::MFOutputSocket *built_socket = insert_unlinked_input(common, to_dsocket, to_type);
         for (fn::MFInputSocket *to_socket : to_sockets) {
           common.network.add_link(*built_socket, *to_socket);
         }
@@ -208,7 +229,7 @@ static void insert_links_and_unlinked_inputs(CommonMFNetworkBuilderData &common)
       }
       if (from_dsockets[0]->is_input()) {
         DInputSocket from_dsocket{from_dsockets[0]};
-        fn::MFOutputSocket *built_socket = insert_unlinked_input(common, from_dsocket);
+        fn::MFOutputSocket *built_socket = insert_unlinked_input(common, from_dsocket, to_type);
         for (fn::MFInputSocket *to_socket : to_sockets) {
           common.network.add_link(*built_socket, *to_socket);
         }
@@ -216,20 +237,7 @@ static void insert_links_and_unlinked_inputs(CommonMFNetworkBuilderData &common)
       }
       DOutputSocket from_dsocket{from_dsockets[0]};
       fn::MFOutputSocket *from_socket = &common.network_map.lookup(from_dsocket);
-      const fn::MFDataType from_type = from_socket->data_type();
-
-      if (from_type != to_type) {
-        const fn::MultiFunction *conversion_fn =
-            get_implicit_type_conversions().get_conversion_multi_function(from_type, to_type);
-        if (conversion_fn != nullptr) {
-          fn::MFNode &node = common.network.add_function(*conversion_fn);
-          common.network.add_link(*from_socket, node.input(0));
-          from_socket = &node.output(0);
-        }
-        else {
-          from_socket = &insert_default_value_for_type(common, to_type);
-        }
-      }
+      from_socket = &insert_optional_conversion(common, *from_socket, to_type);
 
       for (fn::MFInputSocket *to_socket : to_sockets) {
         common.network.add_link(*from_socket, *to_socket);



More information about the Bf-blender-cvs mailing list