[Bf-blender-cvs] [91c39cbb6ae] temp-usd-prev-export2: USD Preview Surface export refactor.

Michael Kowalski noreply at git.blender.org
Tue Dec 28 06:13:52 CET 2021


Commit: 91c39cbb6ae69b64f3a50192f6f23c2b7a118963
Author: Michael Kowalski
Date:   Mon Dec 27 07:57:04 2021 -0500
Branches: temp-usd-prev-export2
https://developer.blender.org/rB91c39cbb6ae69b64f3a50192f6f23c2b7a118963

USD Preview Surface export refactor.

Refactored the create_usd_preview_surface_material() implementation
to use a map to avoid multiple if/else statments.  Further
simplified this function by moving some of its functionality
to a new create_uvmap_shader() function.

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

M	source/blender/io/usd/intern/usd_writer_material.cc

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

diff --git a/source/blender/io/usd/intern/usd_writer_material.cc b/source/blender/io/usd/intern/usd_writer_material.cc
index fe90bb16e91..708ab6fac7b 100644
--- a/source/blender/io/usd/intern/usd_writer_material.cc
+++ b/source/blender/io/usd/intern/usd_writer_material.cc
@@ -82,6 +82,20 @@ static const pxr::TfToken UVMap("UVMap", pxr::TfToken::Immortal);
 
 namespace blender::io::usd {
 
+/* Preview surface input specification. */
+struct InputSpec {
+  pxr::TfToken input_name;
+  pxr::SdfValueTypeName input_type;
+  pxr::TfToken source_name;
+  /* Whether a default value should be set
+   * if the node socket has not input. Usually
+   * false for the Normal input. */
+  bool set_default_value;
+};
+
+/* Map Blender socket names to USD Preview Surface InputSpec structs. */
+typedef std::map<std::string, InputSpec> InputSpecMap;
+
 /* Static function forward declarations. */
 static pxr::UsdShadeShader create_usd_preview_shader(const USDExporterContext &usd_export_context,
                                                      pxr::UsdShadeMaterial &material,
@@ -99,7 +113,13 @@ static std::string get_node_tex_image_filepath(bNode *node,
 static std::string get_texture_filepath(const std::string &in_path,
                                         const pxr::UsdStageRefPtr stage,
                                         const USDExportParams &export_params);
-static bNode *traverse_channel(bNodeSocket *input, short target_type = SH_NODE_TEX_IMAGE);
+static bNode *traverse_channel(bNodeSocket *input, short target_type);
+static InputSpecMap &preview_surface_input_map();
+static void create_uvmap_shader(const USDExporterContext &usd_export_context,
+                                bNode *tex_node,
+                                pxr::UsdShadeMaterial &usd_material,
+                                pxr::UsdShadeShader &usd_tex_shader,
+                                const pxr::TfToken &default_uv);
 
 
 void create_usd_preview_surface_material(const USDExporterContext &usd_export_context,
@@ -115,6 +135,7 @@ void create_usd_preview_surface_material(const USDExporterContext &usd_export_co
   pxr::UsdGeomScope::Define(usd_export_context.stage,
     usd_material.GetPath().AppendChild(usdtokens::preview));
 
+  /* Default map when creating UV primvar reader shaders. */
   pxr::TfToken default_uv_sampler = default_uv.empty() ? cyclestokens::UVMap :
     pxr::TfToken(default_uv);
 
@@ -129,153 +150,52 @@ void create_usd_preview_surface_material(const USDExporterContext &usd_export_co
   pxr::UsdShadeShader preview_surface = create_usd_preview_shader(
     usd_export_context, usd_material, node);
 
+  const InputSpecMap &input_map = preview_surface_input_map();
+
   /* Set the preview surface inputs. */
   LISTBASE_FOREACH(bNodeSocket *, sock, &node->inputs) {
-    bNode *input_node = nullptr;
-    pxr::UsdShadeShader created_shader;
 
-    if (STREQ(sock->name, "Base Color") || STREQ(sock->name, "Color")) {
+    /* Check if this socket is mapped to a USD preview shader input. */
+    const InputSpecMap::const_iterator it = input_map.find(sock->name);
 
-      input_node = traverse_channel(sock);
-      if (input_node) {
-        /* Create connection. */
-        created_shader = create_usd_preview_shader(usd_export_context, usd_material, input_node);
-        preview_surface.CreateInput(usdtokens::diffuse_color, pxr::SdfValueTypeNames->Float3)
-          .ConnectToSource(created_shader, usdtokens::rgb);
-      }
-      else {
-        /* Set hardcoded value. */
-        bNodeSocketValueRGBA *socket_data = (bNodeSocketValueRGBA *)sock->default_value;
-        preview_surface.CreateInput(usdtokens::diffuse_color, pxr::SdfValueTypeNames->Float3)
-          .Set(pxr::VtValue(pxr::GfVec3f(
-            socket_data->value[0], socket_data->value[1], socket_data->value[2])));
-      }
-    }
-    else if (STREQ(sock->name, "Roughness")) {
-
-      input_node = traverse_channel(sock);
-      if (input_node) {
-        /* Create connection. */
-        created_shader = create_usd_preview_shader(usd_export_context, usd_material, input_node);
-        preview_surface.CreateInput(usdtokens::roughness, pxr::SdfValueTypeNames->Float)
-          .ConnectToSource(created_shader, usdtokens::r);
-      }
-      else {
-        /* Set hardcoded value. */
-        bNodeSocketValueFloat *socket_data = (bNodeSocketValueFloat *)sock->default_value;
-        preview_surface.CreateInput(usdtokens::roughness, pxr::SdfValueTypeNames->Float)
-          .Set(pxr::VtValue(socket_data->value));
-      }
-    }
-    else if (STREQ(sock->name, "Metallic")) {
-
-      input_node = traverse_channel(sock);
-      if (input_node) {
-        /* Create connection. */
-        created_shader = create_usd_preview_shader(usd_export_context, usd_material, input_node);
-        preview_surface.CreateInput(usdtokens::metallic, pxr::SdfValueTypeNames->Float)
-          .ConnectToSource(created_shader, usdtokens::r);
-      }
-      else {
-        /* Set hardcoded value. */
-        bNodeSocketValueFloat *socket_data = (bNodeSocketValueFloat *)sock->default_value;
-        preview_surface.CreateInput(usdtokens::metallic, pxr::SdfValueTypeNames->Float)
-          .Set(pxr::VtValue(socket_data->value));
-      }
-    }
-    else if (STREQ(sock->name, "Specular")) {
-
-      input_node = traverse_channel(sock);
-      if (input_node) {
-        /* Create connection. */
-        created_shader = create_usd_preview_shader(usd_export_context, usd_material, input_node);
-        preview_surface.CreateInput(usdtokens::specular, pxr::SdfValueTypeNames->Float)
-          .ConnectToSource(created_shader, usdtokens::r);
-      }
-      else {
-        /* Set hardcoded value. */
-        bNodeSocketValueFloat *socket_data = (bNodeSocketValueFloat *)sock->default_value;
-        preview_surface.CreateInput(usdtokens::specular, pxr::SdfValueTypeNames->Float)
-          .Set(pxr::VtValue(socket_data->value));
-      }
-    }
-    else if (STREQ(sock->name, "Alpha")) {
-
-      input_node = traverse_channel(sock);
-      if (input_node) {
-        /* Create connection. */
-        created_shader = create_usd_preview_shader(usd_export_context, usd_material, input_node);
-        preview_surface.CreateInput(usdtokens::opacity, pxr::SdfValueTypeNames->Float)
-          .ConnectToSource(created_shader, usdtokens::r);
-      }
-      else {
-        /* Set hardcoded value. */
-        bNodeSocketValueFloat *socket_data = (bNodeSocketValueFloat *)sock->default_value;
-        preview_surface.CreateInput(usdtokens::opacity, pxr::SdfValueTypeNames->Float)
-          .Set(pxr::VtValue(socket_data->value));
-      }
-    }
-    else if (STREQ(sock->name, "IOR")) {
-
-      input_node = traverse_channel(sock);
-      if (input_node) {
-        /* Create connection. */
-        created_shader = create_usd_preview_shader(usd_export_context, usd_material, input_node);
-        preview_surface.CreateInput(usdtokens::ior, pxr::SdfValueTypeNames->Float)
-          .ConnectToSource(created_shader, usdtokens::r);
-      }
-      else {
-        /* Set hardcoded value. */
-        bNodeSocketValueFloat *socket_data = (bNodeSocketValueFloat *)sock->default_value;
-        preview_surface.CreateInput(usdtokens::ior, pxr::SdfValueTypeNames->Float)
-          .Set(pxr::VtValue(socket_data->value));
-      }
+    if (it == input_map.end()) {
+      continue;
     }
-    else if (STREQ(sock->name, "Normal")) {
 
-      input_node = traverse_channel(sock);
-      if (input_node) {
-        created_shader = create_usd_preview_shader(usd_export_context, usd_material, input_node);
-        preview_surface.CreateInput(usdtokens::normal, pxr::SdfValueTypeNames->Float3)
-          .ConnectToSource(created_shader, usdtokens::rgb);
-      }
-      /* We don't handle hardcoded value. */
+    pxr::UsdShadeShader created_shader;
+
+    bNode *input_node = traverse_channel(sock, SH_NODE_TEX_IMAGE);
+
+    if (input_node) {
+      /* Create connection. */
+      created_shader = create_usd_preview_shader(usd_export_context, usd_material, input_node);
+
+      preview_surface.CreateInput(it->second.input_name, it->second.input_type)
+        .ConnectToSource(created_shader, it->second.source_name);
     }
-    else if (STREQ(sock->name, "Clearcoat")) {
-
-      input_node = traverse_channel(sock);
-      if (input_node) {
-        /* Create connection. */
-        created_shader = create_usd_preview_shader(usd_export_context, usd_material, input_node);
-        preview_surface.CreateInput(usdtokens::clearcoat, pxr::SdfValueTypeNames->Float)
-          .ConnectToSource(created_shader, usdtokens::r);
-      }
-      else {
-        /* Set hardcoded value. */
-        bNodeSocketValueFloat *socket_data = (bNodeSocketValueFloat *)sock->default_value;
-        preview_surface.CreateInput(usdtokens::clearcoat, pxr::SdfValueTypeNames->Float)
-          .Set(pxr::VtValue(socket_data->value));
+    else if (it->second.set_default_value) {
+      /* Set hardcoded value. */
+      if (sock->type == SOCK_FLOAT) {
+            bNodeSocketValueFloat *float_value = static_cast<bNodeSocketValueFloat *>(sock->default_value);
+               preview_surface.CreateInput(it->second.input_name, it->second.input_type)
+                 .Set(pxr::VtValue(float_value->value));
       }
-    }
-    else if (STREQ(sock->name, "Clearcoat Roughness")) {
-
-      input_node = traverse_channel(sock);
-      if (input_node) {
-        /* Create connection. */
-        created_shader = create_usd_preview_shader(usd_export_context, usd_material, input_node);
-        preview_surface.CreateInput(usdtokens::clearcoatRoughness, pxr::SdfValueTypeNames->Float)
-          .ConnectToSource(created_shader, usdtokens::r);
+      else if (sock->type == SOCK_VECTOR) {
+        bNodeSocketValueVector *vec_data = static_cast<bNodeSocketValueVector *>(sock->default_value);
+        preview_surface.CreateInput(it->second.input_name, it->second.input_type)
+          .Set(pxr::VtValue(pxr::GfVec3f(
+            vec_data->value[0], vec_data->value[1], vec_data->value[2])));
       }
-      else {
-        /* Set hardcoded value. */
-        bNodeSocketValueFloat *socket_data = (bNodeSocketValueFloat *)soc

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list