[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