From f2d15d4fd19aba23b9432b4f31488336b2214eba Mon Sep 17 00:00:00 2001
From: Michael Kowalski <makowalski@nvidia.com>
Date: Fri, 10 Nov 2023 19:57:34 -0500
Subject: [PATCH] Fix: USD: Wrong UsdUVTexture rgb output type.

This fixes a bug where the rgb UsdUVTexture shader output
attributes were created with incorrect type color3f when
connected to UsdPreviewSurface diffuseColor and emissiveColor
inputs. The UsdPreviewSurface specification requires the
UsdUVTexture rgb output to be of type float3.

This was happening because the UsdUVTexture outputs were created
implicitly by the call to UsdShadeInput::ConnectToSource().  I.e.,
because the diffuseColor and emissiveColor inputs are of type
color3f, this was the type assigned by default to the rgb source
attributes as well.

Now explicitly creating the UsdUVTexture shader output attributes
with the correct types.

Pull Request: https://projects.blender.org/blender/blender/pulls/114728
---
 source/blender/io/usd/intern/usd_writer_material.cc | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/source/blender/io/usd/intern/usd_writer_material.cc b/source/blender/io/usd/intern/usd_writer_material.cc
index e683a24ca12..cf8b22c7eef 100644
--- a/source/blender/io/usd/intern/usd_writer_material.cc
+++ b/source/blender/io/usd/intern/usd_writer_material.cc
@@ -174,16 +174,17 @@ static void create_usd_preview_surface_material(const USDExporterContext &usd_ex
       pxr::UsdShadeShader usd_shader = create_usd_preview_shader(
           usd_export_context, usd_material, input_node);
 
-      /* Determine the name of the USD texture node attribute that should be
-       * connected to this input. */
+      /* Create the UsdUVTexture node output attribute that should be connected to this input. */
       pxr::TfToken source_name;
       if (input_spec.input_type == pxr::SdfValueTypeNames->Float) {
         /* If the input is a float, we connect it to either the texture alpha or red channels. */
         source_name = STREQ(input_link->fromsock->identifier, "Alpha") ? usdtokens::a :
                                                                          usdtokens::r;
+        usd_shader.CreateOutput(source_name, pxr::SdfValueTypeNames->Float);
       }
       else {
         source_name = usdtokens::rgb;
+        usd_shader.CreateOutput(usdtokens::rgb, pxr::SdfValueTypeNames->Float3);
       }
 
       /* Create the preview surface input and connect it to the shader. */
-- 
GitLab