diff --git a/cmake/modules/FindMaya.cmake b/cmake/modules/FindMaya.cmake index ecd792a935..36cc6746eb 100644 --- a/cmake/modules/FindMaya.cmake +++ b/cmake/modules/FindMaya.cmake @@ -16,6 +16,7 @@ # Cache variables: # MAYA_HAS_DEFAULT_MATERIAL_API Presence of a default material API on MRenderItem. # MAYA_HAS_COLOR_MANAGEMENT_SUPPORT_API Maya API provides color management support +# MAYA_HAS_OPENPBR_SURFACE_SHADER Maya has an OpenPBR shader # MAYA_NEW_POINT_SNAPPING_SUPPORT Presence of point new snapping support. # MAYA_CURRENT_UFE_CAMERA_SUPPORT Presence of MFrameContext::getCurrentUfeCameraPath. # MAYA_HAS_CRASH_DETECTION Presence of isInCrashHandler API @@ -350,6 +351,12 @@ if(MAYA_INCLUDE_DIRS AND EXISTS "${MAYA_INCLUDE_DIR}/maya/MFragmentManager.h") endif() endif() +set(MAYA_HAS_OPENPBR_SURFACE_SHADER FALSE CACHE INTERNAL "OpenPBRSurfaceShader") +if(MAYA_INCLUDE_DIRS AND EXISTS "${MAYA_INCLUDE_DIR}/maya/MFnOpenPBRSurfaceShader.h") + set(MAYA_HAS_OPENPBR_SURFACE_SHADER TRUE CACHE INTERNAL "OpenPBRSurfaceShader") + message(STATUS "Maya has OpenPBR Surface Shader") +endif() + set(MAYA_NEW_POINT_SNAPPING_SUPPORT FALSE CACHE INTERNAL "snapToActive") if (MAYA_INCLUDE_DIRS AND EXISTS "${MAYA_INCLUDE_DIR}/maya/MSelectionContext.h") file(STRINGS ${MAYA_INCLUDE_DIR}/maya/MSelectionContext.h MAYA_HAS_API REGEX "snapToActive") diff --git a/cmake/modules/FindUSD.cmake b/cmake/modules/FindUSD.cmake index 5965cfbf40..26239d626f 100644 --- a/cmake/modules/FindUSD.cmake +++ b/cmake/modules/FindUSD.cmake @@ -153,6 +153,22 @@ if (USD_LIBRARY_DIR AND EXISTS "${USD_LIBRARY_DIR}/${USD_LIB_PREFIX}usdMtlx${CMA endif() endif() +# See if we are getting OpenPBR Surface shader from USD: +set(USD_HAS_MX_OPENPBR_SURFACE FALSE CACHE INTERNAL "USD.MaterialX.OpenPBRSurface") +if (PXR_USD_LOCATION AND + (EXISTS "${PXR_USD_LOCATION}/libraries/bxdf/mx39_open_pbr_surface.mtlx" OR + EXISTS "${PXR_USD_LOCATION}/libraries/bxdf/open_pbr_surface.mtlx")) + set(USD_HAS_MX_OPENPBR_SURFACE TRUE CACHE INTERNAL "USD.MaterialX.OpenPBRSurface") + message(STATUS "USD has OpenPBR Surface") +endif() + +# See if we are using the backported OpenPBR Surface shader, which needs special handling of Mx39FresnelData: +set(USD_HAS_BACKPORTED_MX39_OPENPBR FALSE CACHE INTERNAL "USD.MaterialX.Mx39OpenPBRSurface") +if (PXR_USD_LOCATION AND EXISTS "${PXR_USD_LOCATION}/libraries/pbrlib/genglsl/lib/mx39_microfacet_specular.glsl") + set(USD_HAS_BACKPORTED_MX39_OPENPBR TRUE CACHE INTERNAL "USD.MaterialX.Mx39OpenPBRSurface") + message(STATUS "USD has backported MaterialX 1.39 OpenPBR Surface code") +endif() + include(FindPackageHandleStandardArgs) find_package_handle_standard_args(USD diff --git a/lib/mayaUsd/CMakeLists.txt b/lib/mayaUsd/CMakeLists.txt index 298ef4c85f..bcfbf0efff 100644 --- a/lib/mayaUsd/CMakeLists.txt +++ b/lib/mayaUsd/CMakeLists.txt @@ -79,6 +79,13 @@ if (MAYA_HAS_COLOR_MANAGEMENT_SUPPORT_API) ) endif() +if (MAYA_HAS_OPENPBR_SURFACE_SHADER) + target_compile_definitions(${PROJECT_NAME} + PRIVATE + MAYA_HAS_OPENPBR_SURFACE_SHADER=1 + ) +endif() + message(STATUS "MAYA_NEW_POINT_SNAPPING_SUPPORT is ${MAYA_NEW_POINT_SNAPPING_SUPPORT}") if (MAYA_NEW_POINT_SNAPPING_SUPPORT) target_compile_definitions(${PROJECT_NAME} diff --git a/lib/mayaUsd/fileio/shading/shadingModeRegistry.h b/lib/mayaUsd/fileio/shading/shadingModeRegistry.h index 357d79ec00..952b1343da 100644 --- a/lib/mayaUsd/fileio/shading/shadingModeRegistry.h +++ b/lib/mayaUsd/fileio/shading/shadingModeRegistry.h @@ -46,15 +46,28 @@ TF_DECLARE_PUBLIC_TOKENS( MAYAUSD_CORE_PUBLIC, PXRUSDMAYA_SHADINGMODE_TOKENS); +#ifdef MAYA_HAS_OPENPBR_SURFACE_SHADER // clang-format off #define PXRUSDMAYA_SHADINGCONVERSION_TOKENS \ (none) \ (lambert) \ + (openPBRSurface) \ (standardSurface) \ (usdPreviewSurface) \ (blinn) \ (phong) // clang-format on +#else +// clang-format off +#define PXRUSDMAYA_SHADINGCONVERSION_TOKENS \ + (none) \ + (lambert) \ + (standardSurface) \ + (usdPreviewSurface) \ + (blinn) \ + (phong) +// clang-format on +#endif TF_DECLARE_PUBLIC_TOKENS( UsdMayaPreferredMaterialTokens, diff --git a/lib/mayaUsd/fileio/shading/shadingModeUseRegistry.cpp b/lib/mayaUsd/fileio/shading/shadingModeUseRegistry.cpp index 5af06c2e46..97e7d8f069 100644 --- a/lib/mayaUsd/fileio/shading/shadingModeUseRegistry.cpp +++ b/lib/mayaUsd/fileio/shading/shadingModeUseRegistry.cpp @@ -715,6 +715,26 @@ class UseRegistryShadingModeImporter } if (!mayaAttr.isNull()) { + // Connecting the R component of a color to a color should be possible. Check + // if there is a compatible parent in case of type mismatch. + MFnAttribute srcFnAttr(srcAttr.attribute()); + MFnAttribute mayaFnAttr(mayaAttr.attribute()); + if (!srcFnAttr.acceptsAttribute(mayaFnAttr)) { + if (srcAttr.isChild()) { + const auto srcParentPlug = srcAttr.parent(); + MFnAttribute srcParentAttr(srcParentPlug.attribute()); + if (srcParentAttr.acceptsAttribute(mayaFnAttr)) { + srcAttr = srcParentPlug; + } + } else if (mayaAttr.isChild()) { + const auto mayaParentPlug = mayaAttr.parent(); + MFnAttribute mayaParentAttr(mayaParentPlug.attribute()); + if (srcFnAttr.acceptsAttribute(mayaParentAttr)) { + mayaAttr = mayaParentPlug; + } + } + } + UsdMayaUtil::Connect(srcAttr, mayaAttr, false); } } diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/CMakeLists.txt b/lib/mayaUsd/render/MaterialXGenOgsXml/CMakeLists.txt index f7722bfbf8..75d113d070 100644 --- a/lib/mayaUsd/render/MaterialXGenOgsXml/CMakeLists.txt +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/CMakeLists.txt @@ -37,6 +37,17 @@ target_sources(${PROJECT_NAME} ) endif() +if(USD_HAS_BACKPORTED_MX39_OPENPBR) +target_compile_definitions(${PROJECT_NAME} + PRIVATE + USD_HAS_BACKPORTED_MX39_OPENPBR + ) +target_sources(${PROJECT_NAME} + PRIVATE + Nodes/MayaClosureSourceCodeNode.cpp + ) +endif() + set(HEADERS CombinedMaterialXVersion.h GlslFragmentGenerator.h @@ -56,6 +67,12 @@ list(APPEND LIGHT_IMPLEMENTATIONS libraries/mx_lighting_maya_v3.glsl ) +if(USD_HAS_BACKPORTED_MX39_OPENPBR) + list(APPEND LIGHT_IMPLEMENTATIONS + libraries/mx39_lighting_maya_all.glsl + ) +endif() + list(APPEND NODE_DECLARATIONS libraries/maya_surfaces.mtlx libraries/maya_utilities.mtlx diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp index ed180a1fd1..47f713d345 100644 --- a/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/GlslFragmentGenerator.cpp @@ -18,6 +18,9 @@ #include "Nodes/MayaHwImageNode.h" #include "Nodes/MayaSourceCodeNode.h" #endif +#ifdef USD_HAS_BACKPORTED_MX39_OPENPBR +#include "Nodes/MayaClosureSourceCodeNode.h" +#endif #include #include @@ -559,21 +562,33 @@ ShaderPtr GlslFragmentGenerator::generate( emitLineBreak(pixelStage); MX_EMIT_INCLUDE( libRoot + "pbrlib/genglsl/ogsxml/mx_lighting_maya_v3.glsl", context, pixelStage); +#ifdef USD_HAS_BACKPORTED_MX39_OPENPBR + emitLine("#define MAYA_MX39_USING_ENVIRONMENT_FIS", pixelStage, false); +#endif } else if (specularMethod == SPECULAR_ENVIRONMENT_PREFILTER) { if (OgsXmlGenerator::useLightAPI() < 2) { MX_EMIT_INCLUDE( libRoot + "pbrlib/genglsl/ogsxml/mx_lighting_maya_v1.glsl", context, pixelStage); +#ifdef USD_HAS_BACKPORTED_MX39_OPENPBR + emitLine("#define MAYA_MX39_USING_ENVIRONMENT_PREFILTER_V1", pixelStage, false); +#endif } else { MX_EMIT_INCLUDE( libRoot + "pbrlib/genglsl/ogsxml/mx_lighting_maya_v2.glsl", context, pixelStage); +#ifdef USD_HAS_BACKPORTED_MX39_OPENPBR + emitLine("#define MAYA_MX39_USING_ENVIRONMENT_PREFILTER_V2", pixelStage, false); +#endif } } else if (specularMethod == SPECULAR_ENVIRONMENT_NONE) { MX_EMIT_INCLUDE( libRoot + "pbrlib/genglsl/ogsxml/mx_lighting_maya_none.glsl", context, pixelStage); +#ifdef USD_HAS_BACKPORTED_MX39_OPENPBR + emitLine("#define MAYA_MX39_USING_ENVIRONMENT_NONE", pixelStage, false); +#endif } else { throw ExceptionShaderGenError( "Invalid hardware specular environment method specified: '" @@ -954,6 +969,19 @@ GlslFragmentGenerator::getImplementation(const NodeDef& nodedef, GenContext& con context.addNodeImplementation(name, impl); return impl; +#ifdef USD_HAS_BACKPORTED_MX39_OPENPBR + } else if ( + implElement->getName() == "IM_dielectric_tf_bsdf_genglsl" + || implElement->getName() == "IM_generalized_schlick_tf_82_bsdf_genglsl") { + // We need to inject lighting code into the backported OpenPBR: + impl = MayaClosureSourceCodeNode::create(); + impl->initialize(*implElement, context); + + // Cache it. + context.addNodeImplementation(name, impl); + + return impl; +#endif } return GlslShaderGenerator::getImplementation(nodedef, context); } diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/Nodes/MayaClosureSourceCodeNode.cpp b/lib/mayaUsd/render/MaterialXGenOgsXml/Nodes/MayaClosureSourceCodeNode.cpp new file mode 100644 index 0000000000..8a283bfc6a --- /dev/null +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/Nodes/MayaClosureSourceCodeNode.cpp @@ -0,0 +1,39 @@ +// +// Copyright Contributors to the MaterialX Project +// SPDX-License-Identifier: Apache-2.0 +// + +#include "MayaClosureSourceCodeNode.h" + +#include + +MATERIALX_NAMESPACE_BEGIN + +ShaderNodeImplPtr MayaClosureSourceCodeNode::create() +{ + return std::make_shared(); +} + +void MayaClosureSourceCodeNode::emitFunctionDefinition( + const ShaderNode& node, + GenContext& context, + ShaderStage& stage) const +{ + // Pre-inject backported OpenPBR lighting code: + if (_name == "IM_dielectric_tf_bsdf_genglsl" + || _name == "IM_generalized_schlick_tf_82_bsdf_genglsl") { + static const auto allIncludes + = std::array { "pbrlib/genglsl/lib/mx39_microfacet_specular.glsl", + "pbrlib/genglsl/ogsxml/mx39_lighting_maya_all.glsl" }; + for (auto const& toInclude : allIncludes) { + // Update source code to inject our mx39 lighting functions: + FilePath libraryPrefix = context.getOptions().libraryPrefix; + FilePath fullFilename = libraryPrefix.isEmpty() ? toInclude : libraryPrefix / toInclude; + FilePath resolvedFilename = context.resolveSourceFile(fullFilename, FilePath()); + stage.addInclude(fullFilename, resolvedFilename, context); + } + } + return ClosureSourceCodeNode::emitFunctionDefinition(node, context, stage); +} + +MATERIALX_NAMESPACE_END diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/Nodes/MayaClosureSourceCodeNode.h b/lib/mayaUsd/render/MaterialXGenOgsXml/Nodes/MayaClosureSourceCodeNode.h new file mode 100644 index 0000000000..878cb9528f --- /dev/null +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/Nodes/MayaClosureSourceCodeNode.h @@ -0,0 +1,25 @@ +// +// Copyright Contributors to the MaterialX Project +// SPDX-License-Identifier: Apache-2.0 +// + +#ifndef MAYA_MATERIALX_CLOSURESOURCECODENODE_H +#define MAYA_MATERIALX_CLOSURESOURCECODENODE_H + +#include + +MATERIALX_NAMESPACE_BEGIN + +/// Source code node that supports the backported OpenPBR Surface node from MaterialX 1.39 +class MayaClosureSourceCodeNode : public ClosureSourceCodeNode +{ +public: + static ShaderNodeImplPtr create(); + + void emitFunctionDefinition(const ShaderNode& node, GenContext& context, ShaderStage& stage) + const override; +}; + +MATERIALX_NAMESPACE_END + +#endif diff --git a/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/mx39_lighting_maya_all.glsl b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/mx39_lighting_maya_all.glsl new file mode 100644 index 0000000000..6cded42526 --- /dev/null +++ b/lib/mayaUsd/render/MaterialXGenOgsXml/libraries/mx39_lighting_maya_all.glsl @@ -0,0 +1,112 @@ +#ifdef MAYA_MX39_USING_ENVIRONMENT_FIS + +vec3 mx39_environment_radiance(vec3 N, vec3 V, vec3 X, vec2 alpha, int distribution, Mx39FresnelData fd) +{ + if (mayaGetSpecularEnvironmentNumLOD() == 0) { + return vec3(0); + } + + // Generate tangent frame. + X = normalize(X - dot(X, N) * N); + vec3 Y = cross(N, X); + mat3 tangentToWorld = mat3(X, Y, N); + + // Transform the view vector to tangent space. + V = vec3(dot(V, X), dot(V, Y), dot(V, N)); + + // Compute derived properties. + float NdotV = clamp(V.z, M_FLOAT_EPS, 1.0); + float avgAlpha = mx_average_alpha(alpha); + float G1V = mx_ggx_smith_G1(NdotV, avgAlpha); + + // Integrate outgoing radiance using filtered importance sampling. + // http://cgg.mff.cuni.cz/~jaroslav/papers/2008-egsr-fis/2008-egsr-fis-final-embedded.pdf + vec3 radiance = vec3(0.0); + for (int i = 0; i < MX_NUM_FIS_SAMPLES; i++) + { + vec2 Xi = mx_spherical_fibonacci(i, MX_NUM_FIS_SAMPLES); + + // Compute the half vector and incoming light direction. + vec3 H = mx_ggx_importance_sample_VNDF(Xi, V, alpha); + vec3 L = fd.refraction ? mx_refraction_solid_sphere(-V, H, fd.ior.x) : -reflect(V, H); + + // Compute dot products for this sample. + float NdotL = clamp(L.z, M_FLOAT_EPS, 1.0); + float VdotH = clamp(dot(V, H), M_FLOAT_EPS, 1.0); + + // Sample the environment light from the given direction. + vec3 Lw = tangentToWorld * L; + float pdf = mx_ggx_NDF(H, alpha) * G1V / (4.0 * NdotV); + float lod = mx_latlong_compute_lod_adsk(Lw, pdf, float(mayaGetSpecularEnvironmentNumLOD() - 1), MX_NUM_FIS_SAMPLES); + vec3 sampleColor = mayaSampleSpecularEnvironmentAtLOD(Lw, lod); + + // Compute the Fresnel term. + vec3 F = mx39_compute_fresnel(VdotH, fd); + + // Compute the geometric term. + float G = mx_ggx_smith_G2(NdotL, NdotV, avgAlpha); + + // Compute the combined FG term, which is inverted for refraction. + vec3 FG = fd.refraction ? vec3(1.0) - (F * G) : F * G; + + // Add the radiance contribution of this sample. + // From https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf + // incidentLight = sampleColor * NdotL + // microfacetSpecular = D * F * G / (4 * NdotL * NdotV) + // pdf = D * G1V / (4 * NdotV); + // radiance = incidentLight * microfacetSpecular / pdf + radiance += sampleColor * FG; + } + + // Apply the global component of the geometric term and normalize. + radiance /= G1V * float(MX_NUM_FIS_SAMPLES); + + // Return the final radiance. + return radiance; +} + +#endif + +#ifdef MAYA_MX39_USING_ENVIRONMENT_PREFILTER_V1 + +vec3 mx39_environment_radiance(vec3 N, vec3 V, vec3 X, vec2 alpha, int distribution, Mx39FresnelData fd) +{ + N = mx_forward_facing_normal(N, V); + vec3 L = fd.refraction ? mx_refraction_solid_sphere(-V, N, fd.ior.x) : -reflect(V, N); + float NdotV = clamp(dot(N, V), M_FLOAT_EPS, 1.0); + float avgAlpha = mx_average_alpha(alpha); + vec3 F = mx39_compute_fresnel(NdotV, fd); + float G = mx_ggx_smith_G2(NdotV, NdotV, avgAlpha); + vec3 FG = fd.refraction ? vec3(1.0) - (F * G) : F * G; + vec3 Li = mix(g_specularI, g_diffuseI, avgAlpha); + return Li * FG; +} + +#endif + +#ifdef MAYA_MX39_USING_ENVIRONMENT_PREFILTER_V2 + +vec3 mx39_environment_radiance(vec3 N, vec3 V, vec3 X, vec2 alpha, int distribution, Mx39FresnelData fd) +{ + N = mx_forward_facing_normal(N, V); + vec3 L = fd.refraction ? mx_refraction_solid_sphere(-V, N, fd.ior.x) : -reflect(V, N); + float NdotV = clamp(dot(N, V), M_FLOAT_EPS, 1.0); + float avgAlpha = mx_average_alpha(alpha); + vec3 F = mx39_compute_fresnel(NdotV, fd); + float G = mx_ggx_smith_G2(NdotV, NdotV, avgAlpha); + vec3 FG = fd.refraction ? vec3(1.0) - (F * G) : F * G; + float phongExp = mayaRoughnessToPhongExp(sqrt(avgAlpha)); + vec3 Li = mayaGetSpecularEnvironment(N, V, phongExp); + return Li * FG; +} + +#endif + +#ifdef MAYA_MX39_USING_ENVIRONMENT_NONE + +vec3 mx39_environment_radiance(vec3 N, vec3 V, vec3 X, vec2 alpha, int distribution, Mx39FresnelData fd) +{ + return vec3(0.0); +} + +#endif diff --git a/lib/mayaUsd/render/vp2RenderDelegate/material.cpp b/lib/mayaUsd/render/vp2RenderDelegate/material.cpp index 53bcc88ecd..7314267d28 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/material.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/material.cpp @@ -335,21 +335,27 @@ struct _MaterialXData { _MaterialXData() { - _mtlxSearchPath = HdMtlxSearchPaths(); + try { + _mtlxSearchPath = HdMtlxSearchPaths(); #if PXR_VERSION > 2311 - _mtlxLibrary = HdMtlxStdLibraries(); + _mtlxLibrary = HdMtlxStdLibraries(); #else - _mtlxLibrary = mx::createDocument(); - mx::loadLibraries({}, _mtlxSearchPath, _mtlxLibrary); + _mtlxLibrary = mx::createDocument(); + mx::loadLibraries({}, _mtlxSearchPath, _mtlxLibrary); #endif - _FixLibraryTangentInputs(_mtlxLibrary); + _FixLibraryTangentInputs(_mtlxLibrary); - mx::OgsXmlGenerator::setUseLightAPI(MAYA_LIGHTAPI_VERSION_2); + mx::OgsXmlGenerator::setUseLightAPI(MAYA_LIGHTAPI_VERSION_2); - // This environment variable is defined in USD: pxr\usd\usdMtlx\parser.cpp - static const std::string env = TfGetenv("USDMTLX_PRIMARY_UV_NAME"); - _mainUvSetName = env.empty() ? UsdUtilsGetPrimaryUVSetName().GetString() : env; + // This environment variable is defined in USD: pxr\usd\usdMtlx\parser.cpp + static const std::string env = TfGetenv("USDMTLX_PRIMARY_UV_NAME"); + _mainUvSetName = env.empty() ? UsdUtilsGetPrimaryUVSetName().GetString() : env; + + } catch (mx::Exception& e) { + TF_RUNTIME_ERROR( + "Caught exception '%s' while initializing MaterialX library", e.what()); + } } MaterialX::FileSearchPath _mtlxSearchPath; //!< MaterialX library search path MaterialX::DocumentPtr _mtlxLibrary; //!< MaterialX library diff --git a/lib/usd/translators/CMakeLists.txt b/lib/usd/translators/CMakeLists.txt index 8b5282e161..b4c27c45cd 100644 --- a/lib/usd/translators/CMakeLists.txt +++ b/lib/usd/translators/CMakeLists.txt @@ -60,6 +60,13 @@ target_compile_definitions(${TARGET_NAME} $<$:OSMac_> ) +if (MAYA_HAS_OPENPBR_SURFACE_SHADER) + target_compile_definitions(${TARGET_NAME} + PRIVATE + MAYA_HAS_OPENPBR_SURFACE_SHADER=1 + ) +endif() + mayaUsd_compile_config(${TARGET_NAME}) # ----------------------------------------------------------------------------- diff --git a/lib/usd/translators/shading/CMakeLists.txt b/lib/usd/translators/shading/CMakeLists.txt index 71458354bf..741582771c 100644 --- a/lib/usd/translators/shading/CMakeLists.txt +++ b/lib/usd/translators/shading/CMakeLists.txt @@ -23,6 +23,14 @@ target_sources(${TARGET_NAME} usdStandardSurfaceWriter.cpp ) +if (MAYA_HAS_OPENPBR_SURFACE_SHADER) + target_sources(${TARGET_NAME} + PRIVATE + usdOpenPBRSurfaceWriter.cpp + usdOpenPBRSurfaceReader.cpp + ) +endif() + if (BUILD_RFM_TRANSLATORS) target_sources(${TARGET_NAME} PRIVATE @@ -54,10 +62,20 @@ if (MAYA_APP_VERSION VERSION_GREATER 2022) mtlxStandardSurfaceWriter.cpp mtlxSymmetricShaderReader.cpp mtlxSymmetricShaderWriter.cpp + mtlxTranslationTableReader.cpp + mtlxTranslationTableWriter.cpp mtlxFileTextureWriter.cpp ) target_compile_definitions(${TARGET_NAME} PRIVATE WANT_MATERIALX_TRANSLATORS=1 ) + if (USD_HAS_MX_OPENPBR_SURFACE AND MAYA_HAS_OPENPBR_SURFACE_SHADER) + target_sources(${TARGET_NAME} + PRIVATE + mtlxOpenPBRSurfaceReader.cpp + mtlxOpenPBRSurfaceWriter.cpp + ) + endif() + endif() diff --git a/lib/usd/translators/shading/mtlxFileTextureReader.cpp b/lib/usd/translators/shading/mtlxFileTextureReader.cpp index 08ced3cc8a..943cb583e6 100644 --- a/lib/usd/translators/shading/mtlxFileTextureReader.cpp +++ b/lib/usd/translators/shading/mtlxFileTextureReader.cpp @@ -63,6 +63,9 @@ class MtlxUsd_FileTextureReader : public MtlxUsd_BaseReader bool TraverseUnconnectableInput(const TfToken& usdAttrName) override; TfToken GetMayaNameForUsdAttrName(const TfToken& usdAttrName) const override; + +private: + bool _isMonochrome = false; }; PXRUSDMAYA_REGISTER_SHADER_READER(MayaND_fileTexture_float, MtlxUsd_FileTextureReader) @@ -86,6 +89,9 @@ bool MtlxUsd_FileTextureReader::Read(UsdMayaPrimReaderContext& context) return false; } + const auto output = shaderSchema.GetOutput(TrMayaTokens->outColor); + _isMonochrome = output.GetTypeName() == SdfValueTypeNames->Float; + MString mayaNodeName = prim.GetName().GetText(); MObject mayaObject; SdfPath imageNodePath; @@ -195,6 +201,10 @@ TfToken MtlxUsd_FileTextureReader::GetMayaNameForUsdAttrName(const TfToken& usdA if (attrType == UsdShadeAttributeType::Output && (usdPortName == TrMayaTokens->outColor || usdPortName == TrMayaTokens->outAlpha)) { + + if (usdPortName == TrMayaTokens->outColor && _isMonochrome) { + return TrMayaTokens->outColorR; + } return usdPortName; } diff --git a/lib/usd/translators/shading/mtlxImageReader.cpp b/lib/usd/translators/shading/mtlxImageReader.cpp index a7f0edd7f9..8da4b1c4f4 100644 --- a/lib/usd/translators/shading/mtlxImageReader.cpp +++ b/lib/usd/translators/shading/mtlxImageReader.cpp @@ -66,7 +66,7 @@ class MtlxUsd_ImageReader : public MtlxUsd_BaseReader void PostConnectSubtree(UsdMayaPrimReaderContext* context) override; private: - TfToken _shaderID; + bool _isMonochrome = false; }; PXRUSDMAYA_REGISTER_SHADER_READER(ND_image_float, MtlxUsd_ImageReader) @@ -90,6 +90,9 @@ bool MtlxUsd_ImageReader::Read(UsdMayaPrimReaderContext& context) return false; } + const auto output = shaderSchema.GetOutput(TrMtlxTokens->out); + _isMonochrome = output.GetTypeName() == SdfValueTypeNames->Float; + // It is possible the file node already exists if we encountered a post-processor: MObject mayaObject = context.GetMayaNode(prim.GetPath(), false); @@ -157,7 +160,7 @@ TfToken MtlxUsd_ImageReader::GetMayaNameForUsdAttrName(const TfToken& usdAttrNam std::tie(usdOutputName, attrType) = UsdShadeUtils::GetBaseNameAndType(usdAttrName); if (attrType == UsdShadeAttributeType::Output && usdOutputName == TrMtlxTokens->out) { - if (_shaderID == TrMtlxTokens->ND_image_float) { + if (_isMonochrome) { return TrMayaTokens->outColorR; } diff --git a/lib/usd/translators/shading/mtlxOpenPBRSurfaceReader.cpp b/lib/usd/translators/shading/mtlxOpenPBRSurfaceReader.cpp new file mode 100644 index 0000000000..fed4a57cbf --- /dev/null +++ b/lib/usd/translators/shading/mtlxOpenPBRSurfaceReader.cpp @@ -0,0 +1,98 @@ +// +// Copyright 2024 Autodesk +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "mtlxTranslationTableReader.h" +#include "shadingTokens.h" + +#include +#include + +#include + +#include + +PXR_NAMESPACE_OPEN_SCOPE + +namespace { +// Mapping from Maya to MaterialX: +using TokenHashMap = std::unordered_map; +TokenHashMap mtlxToMaya { + { TrMtlxOpenPBRTokens->base_weight, TrMayaOpenPBRTokens->baseWeight }, + { TrMtlxOpenPBRTokens->base_color, TrMayaOpenPBRTokens->baseColor }, + { TrMtlxOpenPBRTokens->base_diffuse_roughness, TrMayaOpenPBRTokens->baseDiffuseRoughness }, + { TrMtlxOpenPBRTokens->base_metalness, TrMayaOpenPBRTokens->baseMetalness }, + { TrMtlxOpenPBRTokens->specular_weight, TrMayaOpenPBRTokens->specularWeight }, + { TrMtlxOpenPBRTokens->specular_color, TrMayaOpenPBRTokens->specularColor }, + { TrMtlxOpenPBRTokens->specular_roughness, TrMayaOpenPBRTokens->specularRoughness }, + { TrMtlxOpenPBRTokens->specular_ior, TrMayaOpenPBRTokens->specularIOR }, + { TrMtlxOpenPBRTokens->specular_roughness_anisotropy, + TrMayaOpenPBRTokens->specularRoughnessAnisotropy }, + { TrMtlxOpenPBRTokens->transmission_weight, TrMayaOpenPBRTokens->transmissionWeight }, + { TrMtlxOpenPBRTokens->transmission_color, TrMayaOpenPBRTokens->transmissionColor }, + { TrMtlxOpenPBRTokens->transmission_depth, TrMayaOpenPBRTokens->transmissionDepth }, + { TrMtlxOpenPBRTokens->transmission_scatter, TrMayaOpenPBRTokens->transmissionScatter }, + { TrMtlxOpenPBRTokens->transmission_scatter_anisotropy, + TrMayaOpenPBRTokens->transmissionScatterAnisotropy }, + { TrMtlxOpenPBRTokens->transmission_dispersion_scale, + TrMayaOpenPBRTokens->transmissionDispersionScale }, + { TrMtlxOpenPBRTokens->transmission_dispersion_abbe_number, + TrMayaOpenPBRTokens->transmissionDispersionAbbeNumber }, + { TrMtlxOpenPBRTokens->subsurface_weight, TrMayaOpenPBRTokens->subsurfaceWeight }, + { TrMtlxOpenPBRTokens->subsurface_color, TrMayaOpenPBRTokens->subsurfaceColor }, + { TrMtlxOpenPBRTokens->subsurface_radius, TrMayaOpenPBRTokens->subsurfaceRadius }, + { TrMtlxOpenPBRTokens->subsurface_radius_scale, TrMayaOpenPBRTokens->subsurfaceRadiusScale }, + { TrMtlxOpenPBRTokens->subsurface_scatter_anisotropy, + TrMayaOpenPBRTokens->subsurfaceScatterAnisotropy }, + { TrMtlxOpenPBRTokens->fuzz_weight, TrMayaOpenPBRTokens->fuzzWeight }, + { TrMtlxOpenPBRTokens->fuzz_color, TrMayaOpenPBRTokens->fuzzColor }, + { TrMtlxOpenPBRTokens->fuzz_roughness, TrMayaOpenPBRTokens->fuzzRoughness }, + { TrMtlxOpenPBRTokens->coat_weight, TrMayaOpenPBRTokens->coatWeight }, + { TrMtlxOpenPBRTokens->coat_color, TrMayaOpenPBRTokens->coatColor }, + { TrMtlxOpenPBRTokens->coat_roughness, TrMayaOpenPBRTokens->coatRoughness }, + { TrMtlxOpenPBRTokens->coat_roughness_anisotropy, + TrMayaOpenPBRTokens->coatRoughnessAnisotropy }, + { TrMtlxOpenPBRTokens->coat_ior, TrMayaOpenPBRTokens->coatIOR }, + { TrMtlxOpenPBRTokens->coat_darkening, TrMayaOpenPBRTokens->coatDarkening }, + { TrMtlxOpenPBRTokens->thin_film_weight, TrMayaOpenPBRTokens->thinFilmWeight }, + { TrMtlxOpenPBRTokens->thin_film_thickness, TrMayaOpenPBRTokens->thinFilmThickness }, + { TrMtlxOpenPBRTokens->thin_film_ior, TrMayaOpenPBRTokens->thinFilmIOR }, + { TrMtlxOpenPBRTokens->emission_luminance, TrMayaOpenPBRTokens->emissionLuminance }, + { TrMtlxOpenPBRTokens->emission_color, TrMayaOpenPBRTokens->emissionColor }, + { TrMtlxOpenPBRTokens->geometry_opacity, TrMayaOpenPBRTokens->geometryOpacity }, + { TrMtlxOpenPBRTokens->geometry_thin_walled, TrMayaOpenPBRTokens->geometryThinWalled }, + { TrMtlxOpenPBRTokens->geometry_normal, TrMayaOpenPBRTokens->normalCamera }, + { TrMtlxOpenPBRTokens->geometry_coat_normal, TrMayaOpenPBRTokens->geometryCoatNormal }, + { TrMtlxOpenPBRTokens->geometry_tangent, TrMayaOpenPBRTokens->tangentUCamera }, + { TrMtlxOpenPBRTokens->geometry_coat_tangent, TrMayaOpenPBRTokens->geometryCoatTangent } +}; + +} // namespace + +class MtlxUsd_OpenPBRSurfaceReader : public MtlxUsd_TranslationTableReader +{ +public: + MtlxUsd_OpenPBRSurfaceReader(const UsdMayaPrimReaderArgs& readArgs) + : MtlxUsd_TranslationTableReader(readArgs) + { + } + + const TfToken& getMaterialName() const override { return TrMayaOpenPBRTokens->openPBRSurface; } + const TfToken& getOutputName() const override { return TrMayaTokens->outColor; } + const TranslationTable& getTranslationTable() const override { return mtlxToMaya; } +}; + +PXRUSDMAYA_REGISTER_SHADER_READER(ND_open_pbr_surface_surfaceshader, MtlxUsd_OpenPBRSurfaceReader); + +PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/translators/shading/mtlxOpenPBRSurfaceWriter.cpp b/lib/usd/translators/shading/mtlxOpenPBRSurfaceWriter.cpp new file mode 100644 index 0000000000..bb41646b74 --- /dev/null +++ b/lib/usd/translators/shading/mtlxOpenPBRSurfaceWriter.cpp @@ -0,0 +1,102 @@ +// +// Copyright 2024 Autodesk +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "mtlxTranslationTableWriter.h" +#include "shadingTokens.h" + +#include +#include + +#include + +PXR_NAMESPACE_OPEN_SCOPE + +namespace { +MtlxUsd_TranslationTableWriter::TranslationTable mayaToMaterialX { + { TrMayaOpenPBRTokens->baseWeight, TrMtlxOpenPBRTokens->base_weight }, + { TrMayaOpenPBRTokens->baseColor, TrMtlxOpenPBRTokens->base_color }, + { TrMayaOpenPBRTokens->baseDiffuseRoughness, TrMtlxOpenPBRTokens->base_diffuse_roughness }, + { TrMayaOpenPBRTokens->baseMetalness, TrMtlxOpenPBRTokens->base_metalness }, + { TrMayaOpenPBRTokens->specularWeight, TrMtlxOpenPBRTokens->specular_weight }, + { TrMayaOpenPBRTokens->specularColor, TrMtlxOpenPBRTokens->specular_color }, + { TrMayaOpenPBRTokens->specularRoughness, TrMtlxOpenPBRTokens->specular_roughness }, + { TrMayaOpenPBRTokens->specularIOR, TrMtlxOpenPBRTokens->specular_ior }, + { TrMayaOpenPBRTokens->specularRoughnessAnisotropy, + TrMtlxOpenPBRTokens->specular_roughness_anisotropy }, + { TrMayaOpenPBRTokens->transmissionWeight, TrMtlxOpenPBRTokens->transmission_weight }, + { TrMayaOpenPBRTokens->transmissionColor, TrMtlxOpenPBRTokens->transmission_color }, + { TrMayaOpenPBRTokens->transmissionDepth, TrMtlxOpenPBRTokens->transmission_depth }, + { TrMayaOpenPBRTokens->transmissionScatter, TrMtlxOpenPBRTokens->transmission_scatter }, + { TrMayaOpenPBRTokens->transmissionScatterAnisotropy, + TrMtlxOpenPBRTokens->transmission_scatter_anisotropy }, + { TrMayaOpenPBRTokens->transmissionDispersionScale, + TrMtlxOpenPBRTokens->transmission_dispersion_scale }, + { TrMayaOpenPBRTokens->transmissionDispersionAbbeNumber, + TrMtlxOpenPBRTokens->transmission_dispersion_abbe_number }, + { TrMayaOpenPBRTokens->subsurfaceWeight, TrMtlxOpenPBRTokens->subsurface_weight }, + { TrMayaOpenPBRTokens->subsurfaceColor, TrMtlxOpenPBRTokens->subsurface_color }, + { TrMayaOpenPBRTokens->subsurfaceRadius, TrMtlxOpenPBRTokens->subsurface_radius }, + { TrMayaOpenPBRTokens->subsurfaceRadiusScale, TrMtlxOpenPBRTokens->subsurface_radius_scale }, + { TrMayaOpenPBRTokens->subsurfaceScatterAnisotropy, + TrMtlxOpenPBRTokens->subsurface_scatter_anisotropy }, + { TrMayaOpenPBRTokens->fuzzWeight, TrMtlxOpenPBRTokens->fuzz_weight }, + { TrMayaOpenPBRTokens->fuzzColor, TrMtlxOpenPBRTokens->fuzz_color }, + { TrMayaOpenPBRTokens->fuzzRoughness, TrMtlxOpenPBRTokens->fuzz_roughness }, + { TrMayaOpenPBRTokens->coatWeight, TrMtlxOpenPBRTokens->coat_weight }, + { TrMayaOpenPBRTokens->coatColor, TrMtlxOpenPBRTokens->coat_color }, + { TrMayaOpenPBRTokens->coatRoughness, TrMtlxOpenPBRTokens->coat_roughness }, + { TrMayaOpenPBRTokens->coatRoughnessAnisotropy, + TrMtlxOpenPBRTokens->coat_roughness_anisotropy }, + { TrMayaOpenPBRTokens->coatIOR, TrMtlxOpenPBRTokens->coat_ior }, + { TrMayaOpenPBRTokens->coatDarkening, TrMtlxOpenPBRTokens->coat_darkening }, + { TrMayaOpenPBRTokens->thinFilmWeight, TrMtlxOpenPBRTokens->thin_film_weight }, + { TrMayaOpenPBRTokens->thinFilmThickness, TrMtlxOpenPBRTokens->thin_film_thickness }, + { TrMayaOpenPBRTokens->thinFilmIOR, TrMtlxOpenPBRTokens->thin_film_ior }, + { TrMayaOpenPBRTokens->emissionLuminance, TrMtlxOpenPBRTokens->emission_luminance }, + { TrMayaOpenPBRTokens->emissionColor, TrMtlxOpenPBRTokens->emission_color }, + { TrMayaOpenPBRTokens->geometryOpacity, TrMtlxOpenPBRTokens->geometry_opacity }, + { TrMayaOpenPBRTokens->geometryThinWalled, TrMtlxOpenPBRTokens->geometry_thin_walled }, + { TrMayaOpenPBRTokens->normalCamera, TrMtlxOpenPBRTokens->geometry_normal }, + { TrMayaOpenPBRTokens->geometryCoatNormal, TrMtlxOpenPBRTokens->geometry_coat_normal }, + { TrMayaOpenPBRTokens->tangentUCamera, TrMtlxOpenPBRTokens->geometry_tangent }, + { TrMayaOpenPBRTokens->geometryCoatTangent, TrMtlxOpenPBRTokens->geometry_coat_tangent } +}; + +MtlxUsd_TranslationTableWriter::AlwaysAuthored mayaAlwaysAuthored {}; + +} // namespace +// This is basically UsdMayaSymmetricShaderWriter with a table for attribute renaming: +class MaterialXTranslators_OpenPBRSurfaceWriter : public MtlxUsd_TranslationTableWriter +{ +public: + MaterialXTranslators_OpenPBRSurfaceWriter( + const MFnDependencyNode& depNodeFn, + const SdfPath& usdPath, + UsdMayaWriteJobContext& jobCtx) + : MtlxUsd_TranslationTableWriter( + depNodeFn, + usdPath, + jobCtx, + TrMtlxOpenPBRTokens->ND_open_pbr_surface_surfaceshader, + mayaToMaterialX, + mayaAlwaysAuthored) + { + } +}; + +PXRUSDMAYA_REGISTER_SHADER_WRITER(openPBRSurface, MaterialXTranslators_OpenPBRSurfaceWriter); + +PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/translators/shading/mtlxStandardSurfaceReader.cpp b/lib/usd/translators/shading/mtlxStandardSurfaceReader.cpp index 91de8d239e..885b9b9178 100644 --- a/lib/usd/translators/shading/mtlxStandardSurfaceReader.cpp +++ b/lib/usd/translators/shading/mtlxStandardSurfaceReader.cpp @@ -13,55 +13,18 @@ // See the License for the specific language governing permissions and // limitations under the License. // -#include "mtlxBaseReader.h" +#include "mtlxTranslationTableReader.h" #include "shadingTokens.h" #include #include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include #include PXR_NAMESPACE_OPEN_SCOPE -class MtlxUsd_StandardSurfaceReader : public MtlxUsd_BaseReader -{ -public: - MtlxUsd_StandardSurfaceReader(const UsdMayaPrimReaderArgs&); - - bool Read(UsdMayaPrimReaderContext& context) override; - - TfToken GetMayaNameForUsdAttrName(const TfToken& usdAttrName) const override; -}; - -PXRUSDMAYA_REGISTER_SHADER_READER(ND_standard_surface_surfaceshader, MtlxUsd_StandardSurfaceReader); - -MtlxUsd_StandardSurfaceReader::MtlxUsd_StandardSurfaceReader(const UsdMayaPrimReaderArgs& readArgs) - : MtlxUsd_BaseReader(readArgs) -{ -} - namespace { // Mapping from Maya to MaterialX: using TokenHashMap = std::unordered_map; @@ -110,103 +73,21 @@ TokenHashMap mtlxToMaya { { TrMtlxTokens->tangent, TrMayaTokens->tangentUCamera } }; -// Read a value that was set on a UsdShadeMaterial instead of the UsdShadeShader. This is something -// we see with materials imported by UsdMtlx: -bool _ReadFromMaterial(const UsdShadeInput& input, VtValue& inputVal) -{ - UsdShadeConnectableAPI source; - TfToken sourceInputName; - UsdShadeAttributeType sourceType; - if (!UsdShadeConnectableAPI::GetConnectedSource( - input, &source, &sourceInputName, &sourceType)) { - return false; - } - - UsdShadeMaterial sourceMaterial(source.GetPrim()); - if (!sourceMaterial) { - return false; - } - - const UsdShadeInput& materialInput = sourceMaterial.GetInput(sourceInputName); - if (!materialInput) { - return false; - } - - return materialInput.Get(&inputVal); -} - } // namespace -/* virtual */ -bool MtlxUsd_StandardSurfaceReader::Read(UsdMayaPrimReaderContext& context) -{ - const UsdPrim& prim = _GetArgs().GetUsdPrim(); - UsdShadeShader shaderSchema = UsdShadeShader(prim); - if (!shaderSchema) { - return false; - } - - MStatus status; - MObject mayaObject; - MFnDependencyNode depFn; - if (!(UsdMayaTranslatorUtil::CreateShaderNode( - MString(prim.GetName().GetText()), - TrMayaTokens->standardSurface.GetText(), - UsdMayaShadingNodeType::Shader, - &status, - &mayaObject) - && depFn.setObject(mayaObject))) { - TF_RUNTIME_ERROR( - "Could not create node of type %s for shader '%s'.\n", - TrMayaTokens->standardSurface.GetText(), - prim.GetPath().GetText()); - return false; - } - - context.RegisterNewMayaNode(prim.GetPath().GetString(), mayaObject); - RegisterConstructorNodes(context, mayaObject); - - for (const UsdShadeInput& input : shaderSchema.GetInputs()) { - TfToken baseName = GetMayaNameForUsdAttrName(input.GetFullName()); - if (baseName.IsEmpty()) { - continue; - } - MPlug mayaAttr = depFn.findPlug(baseName.GetText(), true, &status); - if (status != MS::kSuccess) { - continue; - } - VtValue inputVal; - if (!input.GetAttr().Get(&inputVal) && !_ReadFromMaterial(input, inputVal)) { - continue; - } - - if (UsdMayaReadUtil::SetMayaAttr( - mayaAttr, - inputVal, - /* unlinearizeColors = */ false)) { - UsdMayaReadUtil::SetMayaAttrKeyableState(mayaAttr, input.GetAttr().GetVariability()); - } +class MtlxUsd_StandardSurfaceReader : public MtlxUsd_TranslationTableReader +{ +public: + MtlxUsd_StandardSurfaceReader(const UsdMayaPrimReaderArgs& readArgs) + : MtlxUsd_TranslationTableReader(readArgs) + { } - return true; -} - -/* virtual */ -TfToken MtlxUsd_StandardSurfaceReader::GetMayaNameForUsdAttrName(const TfToken& usdAttrName) const -{ - TfToken baseName; - UsdShadeAttributeType attrType; - std::tie(baseName, attrType) = UsdShadeUtils::GetBaseNameAndType(usdAttrName); + const TfToken& getMaterialName() const override { return TrMayaTokens->standardSurface; } + const TfToken& getOutputName() const override { return TrMayaTokens->outColor; } + const TranslationTable& getTranslationTable() const override { return mtlxToMaya; } +}; - if (attrType == UsdShadeAttributeType::Input) { - auto it = mtlxToMaya.find(baseName); - if (it != mtlxToMaya.end()) { - return it->second; - } - } else if (attrType == UsdShadeAttributeType::Output && baseName == UsdShadeTokens->surface) { - return TrMayaTokens->outColor; - } - return TfToken(); -} +PXRUSDMAYA_REGISTER_SHADER_READER(ND_standard_surface_surfaceshader, MtlxUsd_StandardSurfaceReader); PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/translators/shading/mtlxStandardSurfaceWriter.cpp b/lib/usd/translators/shading/mtlxStandardSurfaceWriter.cpp index 43379782b2..4f96e50d6f 100644 --- a/lib/usd/translators/shading/mtlxStandardSurfaceWriter.cpp +++ b/lib/usd/translators/shading/mtlxStandardSurfaceWriter.cpp @@ -14,36 +14,18 @@ // limitations under the License. // -#include "mtlxBaseWriter.h" +#include "mtlxTranslationTableWriter.h" #include "shadingTokens.h" -#include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include - -#include - PXR_NAMESPACE_OPEN_SCOPE namespace { -// Mapping from Maya to MaterialX: -using TokenHashMap = std::unordered_map; -TokenHashMap mayaToMaterialX { +MtlxUsd_TranslationTableWriter::TranslationTable mayaToMaterialX { { TrMayaTokens->base, TrMtlxTokens->base }, { TrMayaTokens->baseColor, TrMtlxTokens->base_color }, { TrMayaTokens->diffuseRoughness, TrMtlxTokens->diffuse_roughness }, @@ -88,211 +70,33 @@ TokenHashMap mayaToMaterialX { { TrMayaTokens->tangentUCamera, TrMtlxTokens->tangent } }; +MtlxUsd_TranslationTableWriter::AlwaysAuthored mayaAlwaysAuthored { + TrMtlxTokens->base, + TrMtlxTokens->base_color, + TrMtlxTokens->specular, + TrMtlxTokens->specular_roughness +}; + } // namespace // This is basically UsdMayaSymmetricShaderWriter with a table for attribute renaming: -class MaterialXTranslators_StandardSurfaceWriter : public MtlxUsd_BaseWriter +class MaterialXTranslators_StandardSurfaceWriter : public MtlxUsd_TranslationTableWriter { public: MaterialXTranslators_StandardSurfaceWriter( const MFnDependencyNode& depNodeFn, const SdfPath& usdPath, - UsdMayaWriteJobContext& jobCtx); - - void Write(const UsdTimeCode& usdTime) override; - - UsdAttribute - GetShadingAttributeForMayaAttrName(const TfToken&, const SdfValueTypeName&) override; - -private: - std::unordered_map _inputNameAttrMap; + UsdMayaWriteJobContext& jobCtx) + : MtlxUsd_TranslationTableWriter( + depNodeFn, + usdPath, + jobCtx, + TrMtlxTokens->ND_standard_surface_surfaceshader, + mayaToMaterialX, + mayaAlwaysAuthored) + { + } }; PXRUSDMAYA_REGISTER_SHADER_WRITER(standardSurface, MaterialXTranslators_StandardSurfaceWriter); -MaterialXTranslators_StandardSurfaceWriter::MaterialXTranslators_StandardSurfaceWriter( - const MFnDependencyNode& depNodeFn, - const SdfPath& usdPath, - UsdMayaWriteJobContext& jobCtx) - : MtlxUsd_BaseWriter(depNodeFn, usdPath, jobCtx) -{ - UsdShadeShader shaderSchema = UsdShadeShader::Define(GetUsdStage(), GetUsdPath()); - if (!TF_VERIFY( - shaderSchema, - "Could not define UsdShadeShader at path '%s'\n", - GetUsdPath().GetText())) { - return; - } - - _usdPrim = shaderSchema.GetPrim(); - if (!TF_VERIFY( - _usdPrim, - "Could not get UsdPrim for UsdShadeShader at path '%s'\n", - shaderSchema.GetPath().GetText())) { - return; - } - - shaderSchema.CreateIdAttr(VtValue(TrMtlxTokens->ND_standard_surface_surfaceshader)); - - UsdShadeNodeGraph nodegraphSchema; - - for (unsigned int i = 0u; i < depNodeFn.attributeCount(); ++i) { - const MObject attrObj = depNodeFn.reorderedAttribute(i); - const MFnAttribute attrFn(attrObj); - - const TfToken mayaAttrName = TfToken(attrFn.name().asChar()); - TokenHashMap::const_iterator renaming = mayaToMaterialX.find(mayaAttrName); - - if (renaming == mayaToMaterialX.cend()) { - continue; - } - - MPlug attrPlug = depNodeFn.findPlug(attrObj, true); - - const TfToken usdAttrName = renaming->second; - - // Keep our authoring sparse by ignoring attributes with no values set and no connections. - // Some attributes with an history of default value updates will be written always. - if (!(UsdMayaUtil::IsAuthored(attrPlug) || usdAttrName == TrMtlxTokens->base - || usdAttrName == TrMtlxTokens->base_color || usdAttrName == TrMtlxTokens->specular - || usdAttrName == TrMtlxTokens->specular_roughness) - && !attrPlug.isConnected() && !attrPlug.numConnectedChildren()) { - continue; - } - - const SdfValueTypeName valueTypeName = MayaUsd::Converter::getUsdTypeName(attrPlug); - if (!valueTypeName) { - // Unsupported Maya attribute type (e.g. "message" attributes). - continue; - } - - UsdShadeInput input = shaderSchema.CreateInput(usdAttrName, valueTypeName); - if (!input) { - continue; - } - - if (attrPlug.isElement()) { - UsdMayaRoundTripUtil::MarkAttributeAsArray(input.GetAttr(), 0u); - } - - // Add this input to the name/attrPlug map. We'll iterate through - // these entries during Write() to set their values. - _inputNameAttrMap.insert(std::make_pair(usdAttrName, attrPlug)); - - // All connections go directly to the node graph: - if (attrPlug.isConnected() || attrPlug.numConnectedChildren()) { - if (!nodegraphSchema) { - nodegraphSchema = UsdShadeNodeGraph(GetNodeGraph()); - if (!TF_VERIFY( - nodegraphSchema, - "Could not define UsdShadeNodeGraph at path '%s'\n", - GetUsdPath().GetText())) { - return; - } - } - UsdShadeOutput ngOutput = nodegraphSchema.CreateOutput(mayaAttrName, valueTypeName); - input.ConnectToSource(ngOutput); - } - } - - // Surface Output - shaderSchema.CreateOutput( - _GetOutputName(TrMtlxTokens->ND_standard_surface_surfaceshader), SdfValueTypeNames->Token); -} - -/* override */ -void MaterialXTranslators_StandardSurfaceWriter::Write(const UsdTimeCode& usdTime) -{ - UsdMayaShaderWriter::Write(usdTime); - - UsdShadeShader shaderSchema(_usdPrim); - if (!TF_VERIFY( - shaderSchema, - "Could not get UsdShadeShader schema for UsdPrim at path '%s'\n", - _usdPrim.GetPath().GetText())) { - return; - } - - for (const auto& inputAttrPair : _inputNameAttrMap) { - const TfToken& inputName = inputAttrPair.first; - const MPlug& attrPlug = inputAttrPair.second; - - UsdShadeInput input = shaderSchema.GetInput(inputName); - if (!input || attrPlug.isConnected() || attrPlug.numConnectedChildren()) { - continue; - } - - // Color values are all linear on the shader, so do not re-linearize - // them. - VtValue value = UsdMayaWriteUtil::GetVtValue( - attrPlug, - MayaUsd::Converter::getUsdTypeName(attrPlug), - /* linearizeColors = */ false); - - input.Set(value, usdTime); - } -} - -/* override */ -UsdAttribute MaterialXTranslators_StandardSurfaceWriter::GetShadingAttributeForMayaAttrName( - const TfToken& mayaAttrName, - const SdfValueTypeName&) -{ - if (mayaAttrName == TrMayaTokens->outColor) { - UsdShadeShader surfaceSchema(_usdPrim); - if (!surfaceSchema) { - return UsdAttribute(); - } - - // Surface output is on the shader itself - return surfaceSchema.GetOutput( - _GetOutputName(TrMtlxTokens->ND_standard_surface_surfaceshader)); - } - - // All other are outputs of the NodeGraph: - UsdShadeNodeGraph nodegraphSchema(GetNodeGraph()); - if (!nodegraphSchema) { - return UsdAttribute(); - } - - if (mayaAttrName == TrMayaTokens->normalCamera || mayaAttrName == TrMayaTokens->coatNormal) { - // Add the proper nodes for normal mapping: - return AddNormalMapping(nodegraphSchema.GetOutput(mayaAttrName)); - } - - // And they use the camelCase Maya name directly: - UsdShadeOutput output = nodegraphSchema.GetOutput(mayaAttrName); - if (output) { - return output; - } - - // We did not find the attribute directly, but we might be dealing with a subcomponent - // connection on a compound attribute: - MStatus status; - const MFnDependencyNode depNodeFn(GetMayaObject(), &status); - - MPlug childPlug = depNodeFn.findPlug(mayaAttrName.GetText(), &status); - if (!status || childPlug.isNull() || !childPlug.isChild()) { - return {}; - } - - MPlug parentPlug = childPlug.parent(); - unsigned int childIndex = 0; - const unsigned int numChildren = parentPlug.numChildren(); - for (; childIndex < numChildren; ++childIndex) { - if (childPlug.attribute() == parentPlug.child(childIndex).attribute()) { - break; - } - } - - // We need the long name of the attribute: - const TfToken parentAttrName( - parentPlug.partialName(false, false, false, false, false, true).asChar()); - output = nodegraphSchema.GetOutput(parentAttrName); - if (output) { - return AddConstructor(output, static_cast(childIndex), parentPlug); - } - - return {}; -} - PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/translators/shading/mtlxTranslationTableReader.cpp b/lib/usd/translators/shading/mtlxTranslationTableReader.cpp new file mode 100644 index 0000000000..7f12469c27 --- /dev/null +++ b/lib/usd/translators/shading/mtlxTranslationTableReader.cpp @@ -0,0 +1,154 @@ +// +// Copyright 2024 Autodesk +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "mtlxTranslationTableReader.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +PXR_NAMESPACE_OPEN_SCOPE + +MtlxUsd_TranslationTableReader::MtlxUsd_TranslationTableReader( + const UsdMayaPrimReaderArgs& readArgs) + : MtlxUsd_BaseReader(readArgs) +{ +} + +namespace { + +// Read a value that was set on a UsdShadeMaterial instead of the UsdShadeShader. This is something +// we see with materials imported by UsdMtlx: +bool _ReadFromMaterial(const UsdShadeInput& input, VtValue& inputVal) +{ + UsdShadeConnectableAPI source; + TfToken sourceInputName; + UsdShadeAttributeType sourceType; + if (!UsdShadeConnectableAPI::GetConnectedSource( + input, &source, &sourceInputName, &sourceType)) { + return false; + } + + UsdShadeMaterial sourceMaterial(source.GetPrim()); + if (!sourceMaterial) { + return false; + } + + const UsdShadeInput& materialInput = sourceMaterial.GetInput(sourceInputName); + if (!materialInput) { + return false; + } + + return materialInput.Get(&inputVal); +} + +} // namespace +/* virtual */ +bool MtlxUsd_TranslationTableReader::Read(UsdMayaPrimReaderContext& context) +{ + const UsdPrim& prim = _GetArgs().GetUsdPrim(); + UsdShadeShader shaderSchema = UsdShadeShader(prim); + if (!shaderSchema) { + return false; + } + + MStatus status; + MObject mayaObject; + MFnDependencyNode depFn; + if (!(UsdMayaTranslatorUtil::CreateShaderNode( + MString(prim.GetName().GetText()), + getMaterialName().GetText(), + UsdMayaShadingNodeType::Shader, + &status, + &mayaObject) + && depFn.setObject(mayaObject))) { + TF_RUNTIME_ERROR( + "Could not create node of type %s for shader '%s'.\n", + getMaterialName().GetText(), + prim.GetPath().GetText()); + return false; + } + + context.RegisterNewMayaNode(prim.GetPath().GetString(), mayaObject); + RegisterConstructorNodes(context, mayaObject); + + for (const UsdShadeInput& input : shaderSchema.GetInputs()) { + TfToken baseName = GetMayaNameForUsdAttrName(input.GetFullName()); + if (baseName.IsEmpty()) { + continue; + } + MPlug mayaAttr = depFn.findPlug(baseName.GetText(), true, &status); + if (status != MS::kSuccess) { + continue; + } + + VtValue inputVal; + if (!input.GetAttr().Get(&inputVal) && !_ReadFromMaterial(input, inputVal)) { + continue; + } + + if (UsdMayaReadUtil::SetMayaAttr( + mayaAttr, + inputVal, + /* unlinearizeColors = */ false)) { + UsdMayaReadUtil::SetMayaAttrKeyableState(mayaAttr, input.GetAttr().GetVariability()); + } + } + + return true; +} + +/* virtual */ +TfToken MtlxUsd_TranslationTableReader::GetMayaNameForUsdAttrName(const TfToken& usdAttrName) const +{ + TfToken baseName; + UsdShadeAttributeType attrType; + std::tie(baseName, attrType) = UsdShadeUtils::GetBaseNameAndType(usdAttrName); + + if (attrType == UsdShadeAttributeType::Input) { + auto it = getTranslationTable().find(baseName); + if (it != getTranslationTable().end()) { + return it->second; + } + } else if (attrType == UsdShadeAttributeType::Output && baseName == UsdShadeTokens->surface) { + return getOutputName(); + } + return TfToken(); +} + +PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/translators/shading/mtlxTranslationTableReader.h b/lib/usd/translators/shading/mtlxTranslationTableReader.h new file mode 100644 index 0000000000..0d7fb0095c --- /dev/null +++ b/lib/usd/translators/shading/mtlxTranslationTableReader.h @@ -0,0 +1,46 @@ +// +// Copyright 2024 Autodesk +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "mtlxBaseReader.h" + +#include +#include + +#include +#include + +#include + +PXR_NAMESPACE_OPEN_SCOPE + +// A symmetric reader that takes a translation table. Useful when there +// is a 1-to-1 mapping between camelCased and snake_cased names. +class MtlxUsd_TranslationTableReader : public MtlxUsd_BaseReader +{ +public: + MtlxUsd_TranslationTableReader(const UsdMayaPrimReaderArgs&); + + using TranslationTable = std::unordered_map; + + virtual const TfToken& getMaterialName() const = 0; + virtual const TfToken& getOutputName() const = 0; + virtual const TranslationTable& getTranslationTable() const = 0; + + bool Read(UsdMayaPrimReaderContext& context) override; + + TfToken GetMayaNameForUsdAttrName(const TfToken& usdAttrName) const override; +}; + +PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/translators/shading/mtlxTranslationTableWriter.cpp b/lib/usd/translators/shading/mtlxTranslationTableWriter.cpp new file mode 100644 index 0000000000..dcecd525b5 --- /dev/null +++ b/lib/usd/translators/shading/mtlxTranslationTableWriter.cpp @@ -0,0 +1,232 @@ +// +// Copyright 2024 Autodesk +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "mtlxTranslationTableWriter.h" + +#include "shadingTokens.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include + +PXR_NAMESPACE_OPEN_SCOPE + +MtlxUsd_TranslationTableWriter::MtlxUsd_TranslationTableWriter( + const MFnDependencyNode& depNodeFn, + const SdfPath& usdPath, + UsdMayaWriteJobContext& jobCtx, + TfToken materialName, + const TranslationTable& translationTable, + const AlwaysAuthored& alwaysAuthored) + : MtlxUsd_BaseWriter(depNodeFn, usdPath, jobCtx) + , _materialName(materialName) + , _translationTable(translationTable) + , _alwaysAuthored(alwaysAuthored) +{ + UsdShadeShader shaderSchema = UsdShadeShader::Define(GetUsdStage(), GetUsdPath()); + if (!TF_VERIFY( + shaderSchema, + "Could not define UsdShadeShader at path '%s'\n", + GetUsdPath().GetText())) { + return; + } + + _usdPrim = shaderSchema.GetPrim(); + if (!TF_VERIFY( + _usdPrim, + "Could not get UsdPrim for UsdShadeShader at path '%s'\n", + shaderSchema.GetPath().GetText())) { + return; + } + + shaderSchema.CreateIdAttr(VtValue(_materialName)); + + UsdShadeNodeGraph nodegraphSchema; + + for (unsigned int i = 0u; i < depNodeFn.attributeCount(); ++i) { + const MObject attrObj = depNodeFn.reorderedAttribute(i); + const MFnAttribute attrFn(attrObj); + + const TfToken mayaAttrName = TfToken(attrFn.name().asChar()); + TranslationTable::const_iterator renaming = _translationTable.find(mayaAttrName); + + if (renaming == _translationTable.cend()) { + continue; + } + + MPlug attrPlug = depNodeFn.findPlug(attrObj, true); + + const TfToken usdAttrName = renaming->second; + + // Keep our authoring sparse by ignoring attributes with no values set and no connections. + // Some attributes with an history of default value updates will be written always. + if (!(UsdMayaUtil::IsAuthored(attrPlug) || _alwaysAuthored.count(usdAttrName)) + && !attrPlug.isConnected() && !attrPlug.numConnectedChildren()) { + continue; + } + + const SdfValueTypeName valueTypeName = MayaUsd::Converter::getUsdTypeName(attrPlug); + if (!valueTypeName) { + // Unsupported Maya attribute type (e.g. "message" attributes). + continue; + } + + UsdShadeInput input = shaderSchema.CreateInput(usdAttrName, valueTypeName); + if (!input) { + continue; + } + + if (attrPlug.isElement()) { + UsdMayaRoundTripUtil::MarkAttributeAsArray(input.GetAttr(), 0u); + } + + // Add this input to the name/attrPlug map. We'll iterate through + // these entries during Write() to set their values. + _inputNameAttrMap.insert(std::make_pair(usdAttrName, attrPlug)); + + // All connections go directly to the node graph: + if (attrPlug.isConnected() || attrPlug.numConnectedChildren()) { + if (!nodegraphSchema) { + nodegraphSchema = UsdShadeNodeGraph(GetNodeGraph()); + if (!TF_VERIFY( + nodegraphSchema, + "Could not define UsdShadeNodeGraph at path '%s'\n", + GetUsdPath().GetText())) { + return; + } + } + UsdShadeOutput ngOutput = nodegraphSchema.CreateOutput(mayaAttrName, valueTypeName); + input.ConnectToSource(ngOutput); + } + } + + // Surface Output + shaderSchema.CreateOutput(_GetOutputName(_materialName), SdfValueTypeNames->Token); +} + +/* override */ +void MtlxUsd_TranslationTableWriter::Write(const UsdTimeCode& usdTime) +{ + UsdMayaShaderWriter::Write(usdTime); + + UsdShadeShader shaderSchema(_usdPrim); + if (!TF_VERIFY( + shaderSchema, + "Could not get UsdShadeShader schema for UsdPrim at path '%s'\n", + _usdPrim.GetPath().GetText())) { + return; + } + + for (const auto& inputAttrPair : _inputNameAttrMap) { + const TfToken& inputName = inputAttrPair.first; + const MPlug& attrPlug = inputAttrPair.second; + + UsdShadeInput input = shaderSchema.GetInput(inputName); + if (!input || attrPlug.isConnected() || attrPlug.numConnectedChildren()) { + continue; + } + + // Color values are all linear on the shader, so do not re-linearize + // them. + VtValue value = UsdMayaWriteUtil::GetVtValue( + attrPlug, + MayaUsd::Converter::getUsdTypeName(attrPlug), + /* linearizeColors = */ false); + + input.Set(value, usdTime); + } +} + +/* override */ +UsdAttribute MtlxUsd_TranslationTableWriter::GetShadingAttributeForMayaAttrName( + const TfToken& mayaAttrName, + const SdfValueTypeName&) +{ + if (mayaAttrName == TrMayaTokens->outColor) { + UsdShadeShader surfaceSchema(_usdPrim); + if (!surfaceSchema) { + return UsdAttribute(); + } + + // Surface output is on the shader itself + return surfaceSchema.GetOutput(_GetOutputName(_materialName)); + } + + // All other are outputs of the NodeGraph: + UsdShadeNodeGraph nodegraphSchema(GetNodeGraph()); + if (!nodegraphSchema) { + return UsdAttribute(); + } + + if (mayaAttrName == TrMayaTokens->normalCamera || mayaAttrName == TrMayaTokens->coatNormal) { + // Add the proper nodes for normal mapping: + return AddNormalMapping(nodegraphSchema.GetOutput(mayaAttrName)); + } + + // And they use the camelCase Maya name directly: + UsdShadeOutput output = nodegraphSchema.GetOutput(mayaAttrName); + if (output) { + return output; + } + + // We did not find the attribute directly, but we might be dealing with a subcomponent + // connection on a compound attribute: + MStatus status; + const MFnDependencyNode depNodeFn(GetMayaObject(), &status); + + MPlug childPlug = depNodeFn.findPlug(mayaAttrName.GetText(), &status); + if (!status || childPlug.isNull() || !childPlug.isChild()) { + return {}; + } + + MPlug parentPlug = childPlug.parent(); + unsigned int childIndex = 0; + const unsigned int numChildren = parentPlug.numChildren(); + for (; childIndex < numChildren; ++childIndex) { + if (childPlug.attribute() == parentPlug.child(childIndex).attribute()) { + break; + } + } + + // We need the long name of the attribute: + const TfToken parentAttrName( + parentPlug.partialName(false, false, false, false, false, true).asChar()); + output = nodegraphSchema.GetOutput(parentAttrName); + if (output) { + return AddConstructor(output, static_cast(childIndex), parentPlug); + } + + return {}; +} + +PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/translators/shading/mtlxTranslationTableWriter.h b/lib/usd/translators/shading/mtlxTranslationTableWriter.h new file mode 100644 index 0000000000..eba67c979a --- /dev/null +++ b/lib/usd/translators/shading/mtlxTranslationTableWriter.h @@ -0,0 +1,60 @@ +// +// Copyright 2024 Autodesk +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "mtlxBaseWriter.h" + +#include + +#include +#include +#include + +#include +#include + +#include +#include + +PXR_NAMESPACE_OPEN_SCOPE + +// This is basically UsdMayaSymmetricShaderWriter with a table for attribute renaming: +class MtlxUsd_TranslationTableWriter : public MtlxUsd_BaseWriter +{ +public: + using TranslationTable = std::unordered_map; + using AlwaysAuthored = std::unordered_set; + + MtlxUsd_TranslationTableWriter( + const MFnDependencyNode& depNodeFn, + const SdfPath& usdPath, + UsdMayaWriteJobContext& jobCtx, + TfToken materialName, + const TranslationTable& translationTable, + const AlwaysAuthored& alwaysAuthored); + + void Write(const UsdTimeCode& usdTime) override; + + UsdAttribute + GetShadingAttributeForMayaAttrName(const TfToken&, const SdfValueTypeName&) override; + +private: + std::unordered_map _inputNameAttrMap; + TfToken _materialName; + const TranslationTable& _translationTable; + const AlwaysAuthored& _alwaysAuthored; +}; + +PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/translators/shading/shadingTokens.cpp b/lib/usd/translators/shading/shadingTokens.cpp index ff5d6874ac..8014b504fc 100644 --- a/lib/usd/translators/shading/shadingTokens.cpp +++ b/lib/usd/translators/shading/shadingTokens.cpp @@ -24,10 +24,13 @@ TF_DEFINE_PUBLIC_TOKENS( TR_MAYA_MATERIALS TR_MAYA_NODES TR_MAYA_STANDARD_SURFACE TR_MAYA_FILE TR_MAYA_UV TR_MAYA_PRIMVAR); +TF_DEFINE_PUBLIC_TOKENS(TrMayaOpenPBRTokens, TR_MAYA_OPENPBR_SURFACE); + #ifdef WANT_MATERIALX_TRANSLATORS TF_DEFINE_PUBLIC_TOKENS( TrMtlxTokens, TR_MTLX_COMMON TR_MTLX_NODE_DEFS TR_MTLX_STANDARD_SURFACE TR_MTLX_IMAGE TR_MTLX_ATTRIBUTES); +TF_DEFINE_PUBLIC_TOKENS(TrMtlxOpenPBRTokens, TR_MTLX_OPENPBR_SURFACE); #endif PXR_NAMESPACE_CLOSE_SCOPE \ No newline at end of file diff --git a/lib/usd/translators/shading/shadingTokens.h b/lib/usd/translators/shading/shadingTokens.h index 2eefb15453..8f6961b0de 100644 --- a/lib/usd/translators/shading/shadingTokens.h +++ b/lib/usd/translators/shading/shadingTokens.h @@ -199,6 +199,55 @@ TF_DECLARE_PUBLIC_TOKENS( TR_MAYA_MATERIALS TR_MAYA_NODES TR_MAYA_STANDARD_SURFACE TR_MAYA_FILE TR_MAYA_UV TR_MAYA_PRIMVAR); +// clang-format off +#define TR_MAYA_OPENPBR_SURFACE \ + (openPBRSurface) \ + (baseWeight) \ + (baseColor) \ + (baseDiffuseRoughness) \ + (baseMetalness) \ + (specularWeight) \ + (specularColor) \ + (specularRoughness) \ + (specularIOR) \ + (specularRoughnessAnisotropy) \ + (transmissionWeight) \ + (transmissionColor) \ + (transmissionDepth) \ + (transmissionScatter) \ + (transmissionScatterAnisotropy) \ + (transmissionDispersionScale) \ + (transmissionDispersionAbbeNumber) \ + (subsurfaceWeight) \ + (subsurfaceColor) \ + (subsurfaceRadius) \ + (subsurfaceRadiusScale) \ + (subsurfaceScatterAnisotropy) \ + (fuzzWeight) \ + (fuzzColor) \ + (fuzzRoughness) \ + (coatWeight) \ + (coatColor) \ + (coatRoughness) \ + (coatRoughnessAnisotropy) \ + (coatIOR) \ + (coatDarkening) \ + (thinFilmWeight) \ + (thinFilmThickness) \ + (thinFilmIOR) \ + (emissionWeight) \ + (emissionLuminance) \ + (emissionColor) \ + (geometryOpacity) \ + (geometryThinWalled) \ + (normalCamera) \ + (geometryCoatNormal) \ + (tangentUCamera) \ + (geometryCoatTangent) +// clang-format on + +TF_DECLARE_PUBLIC_TOKENS(TrMayaOpenPBRTokens, , TR_MAYA_OPENPBR_SURFACE); + #ifdef WANT_MATERIALX_TRANSLATORS // clang-format off @@ -315,6 +364,54 @@ TF_DECLARE_PUBLIC_TOKENS( , TR_MTLX_COMMON TR_MTLX_NODE_DEFS TR_MTLX_STANDARD_SURFACE TR_MTLX_IMAGE TR_MTLX_ATTRIBUTES); +// clang-format off +#define TR_MTLX_OPENPBR_SURFACE \ + (ND_open_pbr_surface_surfaceshader) \ + (base_weight) \ + (base_color) \ + (base_diffuse_roughness) \ + (base_metalness) \ + (specular_weight) \ + (specular_color) \ + (specular_roughness) \ + (specular_ior) \ + (specular_roughness_anisotropy) \ + (transmission_weight) \ + (transmission_color) \ + (transmission_depth) \ + (transmission_scatter) \ + (transmission_scatter_anisotropy) \ + (transmission_dispersion_scale) \ + (transmission_dispersion_abbe_number) \ + (subsurface_weight) \ + (subsurface_color) \ + (subsurface_radius) \ + (subsurface_radius_scale) \ + (subsurface_scatter_anisotropy) \ + (fuzz_weight) \ + (fuzz_color) \ + (fuzz_roughness) \ + (coat_weight) \ + (coat_color) \ + (coat_roughness) \ + (coat_roughness_anisotropy) \ + (coat_ior) \ + (coat_darkening) \ + (thin_film_weight) \ + (thin_film_thickness) \ + (thin_film_ior) \ + (emission_luminance) \ + (emission_color) \ + (geometry_opacity) \ + (geometry_thin_walled) \ + (geometry_normal) \ + (geometry_coat_normal) \ + (geometry_tangent) \ + (geometry_coat_tangent) +// clang-format on + +TF_DECLARE_PUBLIC_TOKENS(TrMtlxOpenPBRTokens, , TR_MTLX_OPENPBR_SURFACE); + #endif PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/translators/shading/usdOpenPBRSurfaceReader.cpp b/lib/usd/translators/shading/usdOpenPBRSurfaceReader.cpp new file mode 100644 index 0000000000..6ffd4b33ae --- /dev/null +++ b/lib/usd/translators/shading/usdOpenPBRSurfaceReader.cpp @@ -0,0 +1,173 @@ +// +// Copyright 2024 Autodesk +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "shadingTokens.h" +#include "usdMaterialReader.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +PXR_NAMESPACE_OPEN_SCOPE + +/// Shader reader for importing UsdPreviewSurface to Maya's openPBRShader material nodes +class PxrUsdTranslators_OpenPBRSurfaceReader : public PxrUsdTranslators_MaterialReader +{ + using _BaseClass = PxrUsdTranslators_MaterialReader; + +public: + PxrUsdTranslators_OpenPBRSurfaceReader(const UsdMayaPrimReaderArgs&); + + static ContextSupport CanImport(const UsdMayaJobImportArgs& importArgs); + + /// Get the name of the Maya shading attribute that corresponds to the + /// USD attribute named \p usdAttrName. + TfToken GetMayaNameForUsdAttrName(const TfToken& usdAttrName) const override; + +protected: + /// What is the Maya node type name we want to convert to: + const TfToken& _GetMayaNodeTypeName() const override; + + /// Callback called before the attribute \p mayaAttribute is read from UsdShade. This allows + /// setting back values in \p shaderFn that were lost during the export phase. + void + _OnBeforeReadAttribute(const TfToken& mayaAttrName, MFnDependencyNode& shaderFn) const override; +}; + +PXRUSDMAYA_REGISTER_SHADER_READER(UsdPreviewSurface, PxrUsdTranslators_OpenPBRSurfaceReader); + +PxrUsdTranslators_OpenPBRSurfaceReader::PxrUsdTranslators_OpenPBRSurfaceReader( + const UsdMayaPrimReaderArgs& readArgs) + : PxrUsdTranslators_MaterialReader(readArgs) +{ +} + +/* static */ +UsdMayaShaderReader::ContextSupport +PxrUsdTranslators_OpenPBRSurfaceReader::CanImport(const UsdMayaJobImportArgs& importArgs) +{ + // Check to see if import requested conversion + return importArgs.preferredMaterial == UsdMayaPreferredMaterialTokens->openPBRSurface + ? ContextSupport::Supported + : ContextSupport::Unsupported; +} + +const TfToken& PxrUsdTranslators_OpenPBRSurfaceReader::_GetMayaNodeTypeName() const +{ + return UsdMayaPreferredMaterialTokens->openPBRSurface; +} + +void PxrUsdTranslators_OpenPBRSurfaceReader::_OnBeforeReadAttribute( + const TfToken& mayaAttrName, + MFnDependencyNode& shaderFn) const +{ + MFnOpenPBRSurfaceShader surfaceFn; + surfaceFn.setObject(shaderFn.object()); + if (mayaAttrName == TrMayaOpenPBRTokens->baseColor) { + MColor color(surfaceFn.baseColor()); + float scale(surfaceFn.baseWeight()); + if (scale != 0.0f) { + color /= scale; + } + surfaceFn.setBaseColor(color); + surfaceFn.setBaseWeight(1.0f); + } else if (mayaAttrName == TrMayaOpenPBRTokens->emissionColor) { +#ifdef MAYA_OPENPBR_HAS_EMISSION_WEIGHT + MColor color(surfaceFn.emissionColor()); + float luminance(surfaceFn.emissionLuminance()); + float scale(surfaceFn.emissionWeight()); + if (scale != 0.0f) { + color /= scale; + } + if (luminance != 0.0f) { + color /= (luminance / 1000.0F); + } + surfaceFn.setEmissionColor(color); + surfaceFn.setEmissionLuminance(1000.0f); + surfaceFn.setEmissionWeight(1.0f); +#else + MColor color(surfaceFn.emissionColor()); + float scale(surfaceFn.emissionLuminance()); + if (scale != 0.0f) { + color /= (scale / 1000.0f); + } + surfaceFn.setEmissionColor(color); + surfaceFn.setEmissionLuminance(1000.0f); +#endif + } else { + _BaseClass::_OnBeforeReadAttribute(mayaAttrName, shaderFn); + } +} + +/* virtual */ +TfToken +PxrUsdTranslators_OpenPBRSurfaceReader::GetMayaNameForUsdAttrName(const TfToken& usdAttrName) const +{ + TfToken usdInputName; + UsdShadeAttributeType attrType; + std::tie(usdInputName, attrType) = UsdShadeUtils::GetBaseNameAndType(usdAttrName); + + if (attrType == UsdShadeAttributeType::Input) { + if (usdInputName == PxrMayaUsdPreviewSurfaceTokens->DiffuseColorAttrName) { + return TrMayaOpenPBRTokens->baseColor; + } else if (usdInputName == PxrMayaUsdPreviewSurfaceTokens->EmissiveColorAttrName) { + return TrMayaOpenPBRTokens->emissionColor; + } else if (usdInputName == PxrMayaUsdPreviewSurfaceTokens->MetallicAttrName) { + return TrMayaOpenPBRTokens->baseMetalness; + } else if (usdInputName == PxrMayaUsdPreviewSurfaceTokens->SpecularColorAttrName) { + return TrMayaOpenPBRTokens->specularColor; + } else if (usdInputName == PxrMayaUsdPreviewSurfaceTokens->IorAttrName) { + return TrMayaOpenPBRTokens->specularIOR; + } else if (usdInputName == PxrMayaUsdPreviewSurfaceTokens->RoughnessAttrName) { + return TrMayaOpenPBRTokens->specularRoughness; + } else if (usdInputName == PxrMayaUsdPreviewSurfaceTokens->ClearcoatRoughnessAttrName) { + return TrMayaOpenPBRTokens->coatRoughness; + } else if (usdInputName == PxrMayaUsdPreviewSurfaceTokens->NormalAttrName) { + return TrMayaOpenPBRTokens->normalCamera; + } else if (usdInputName == PxrMayaUsdPreviewSurfaceTokens->ClearcoatAttrName) { + return TrMayaOpenPBRTokens->coatWeight; + } else if (usdInputName == PxrMayaUsdPreviewSurfaceTokens->OpacityAttrName) { + return TrMayaOpenPBRTokens->geometryOpacity; + } + } + + return _BaseClass::GetMayaNameForUsdAttrName(usdAttrName); +} + +PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/translators/shading/usdOpenPBRSurfaceWriter.cpp b/lib/usd/translators/shading/usdOpenPBRSurfaceWriter.cpp new file mode 100644 index 0000000000..cf69e2ec82 --- /dev/null +++ b/lib/usd/translators/shading/usdOpenPBRSurfaceWriter.cpp @@ -0,0 +1,420 @@ +// +// Copyright 2024 Autodesk +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#include "pxr/base/gf/math.h" +#include "pxr/base/gf/vec3f.h" +#include "pxr/usd/sdf/types.h" +#include "shadingTokens.h" +#include "usdMaterialWriter.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include + +PXR_NAMESPACE_OPEN_SCOPE + +namespace { + +template T _GetMayaAttributeValue(const MPlug& attrPlug) +{ + SdfValueTypeName typeName = SdfValueTypeNames->Float; + if (std::is_same()) { + typeName = SdfValueTypeNames->Color3f; + } + + VtValue value = UsdMayaWriteUtil::GetVtValue(attrPlug, typeName); + + if (!TF_VERIFY( + !value.IsEmpty() && value.IsHolding(), + "No value found for '%s'. Incorrect type?\n", + MFnAttribute(attrPlug.attribute()).name().asChar())) { + return {}; + } + + return value.UncheckedGet(); +} + +template +T _GetMayaAttributeValue(const MFnDependencyNode& depNodeFn, const TfToken& attrName) +{ + MStatus status; + MPlug attrPlug = depNodeFn.findPlug( + depNodeFn.attribute(attrName.GetText()), + /* wantNetworkedPlug = */ true, + &status); + if (!TF_VERIFY( + status == MS::kSuccess && !attrPlug.isNull(), + "Invalid plug for attribute '%s'\n", + MFnAttribute(attrPlug.attribute()).name().asChar())) { + return {}; + } + + return _GetMayaAttributeValue(attrPlug); +} + +void _AuthorEmissionAndDiffuse( + const MFnDependencyNode& depNodeFn, + UsdShadeShader& shaderSchema, + const UsdTimeCode usdTime) +{ + // All these OpenPBR attribute contribute to Diffuse: + const auto baseWeight + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->baseWeight); + const auto baseColor + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->baseColor); + const auto baseMetalness + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->baseMetalness); + const auto specularWeight + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->specularWeight); + const auto subsurfaceWeight + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->subsurfaceWeight); + const auto subsurfaceColor + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->subsurfaceColor); + const auto coatWeight + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->coatWeight); + const auto coatColor + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->coatColor); + const auto coatIOR = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->coatIOR); + const auto coatDarkening + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->coatDarkening); + + // Diffuse: Converting from OpenPBR to StandardSurface requires a bit of math to compute coat + // darkening effects. + const auto Emetal = baseColor * specularWeight; + const auto Edielectric = GfLerp(subsurfaceWeight, baseColor, subsurfaceColor); + const auto Ebase = GfLerp(baseMetalness, Edielectric, Emetal); + const auto coat_ior_to_F0_sqrt = (coatIOR - 1) / (coatIOR + 1); + const auto coat_ior_to_F0 = coat_ior_to_F0_sqrt * coat_ior_to_F0_sqrt; + const auto one_minus_coat_F0_over_eta2 = (1 - coat_ior_to_F0) / (coatIOR * coatIOR); + const auto Kcoat = 1 - one_minus_coat_F0_over_eta2; + const auto base_darkening = GfCompDiv(GfVec3f(1 - Kcoat), (GfVec3f(1.0) - (Ebase * Kcoat))); + const auto modulated_base_darkening + = GfLerp(coatWeight * coatDarkening, GfVec3f(1.0), base_darkening); + + // Intermediate StandardSurface values (until we get a direct OpenPBR to UsdPreviewSurface + // graph) + const auto ss_base_color = GfCompMult(baseColor, modulated_base_darkening); + const auto ss_base = baseWeight; + const auto ss_coat_color = coatColor; + const auto ss_coat = coatWeight; + + // Using NG_standard_surface_to_UsdPreviewSurface + const auto scaledBaseColor = ss_base_color * ss_base; + const auto coatAttenuation = GfLerp(ss_coat, GfVec3f { 1.0F }, ss_coat_color); + + const auto albedoOpaqueDielectric = GfLerp(subsurfaceWeight, scaledBaseColor, subsurfaceColor); + const auto ps_diffuseColor = GfCompMult(albedoOpaqueDielectric, coatAttenuation); + auto diffuseColorInput = shaderSchema.CreateInput( + PxrMayaUsdPreviewSurfaceTokens->DiffuseColorAttrName, SdfValueTypeNames->Color3f); + diffuseColorInput.Set(ps_diffuseColor, usdTime); + + // EmissionColor requires checking for OpenPBR Surface v1.2 for a potential emissionWeight: + const auto emissionLuminance + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->emissionLuminance); + if (emissionLuminance == 0.0) { + return; + } + + const auto emissionColor + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->emissionColor); + + GfVec3f scaledEmissionColor; + if (depNodeFn.hasAttribute(TrMayaOpenPBRTokens->emissionWeight.GetText())) { + const auto emissionWeight + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->emissionWeight); + if (emissionWeight == 0.0) { + return; + } + scaledEmissionColor = emissionColor * emissionWeight; + } else { + scaledEmissionColor = emissionColor * emissionLuminance / 1000.0F; + } + + const auto ps_emissiveColor = GfCompMult(scaledEmissionColor, coatAttenuation); + auto emissiveColorInput = shaderSchema.CreateInput( + PxrMayaUsdPreviewSurfaceTokens->EmissiveColorAttrName, SdfValueTypeNames->Color3f); + emissiveColorInput.Set(ps_emissiveColor, usdTime); +} + +void _AuthorClearcoat( + const MFnDependencyNode& depNodeFn, + UsdShadeShader& shaderSchema, + const UsdTimeCode usdTime) +{ + // Clearcoat: + // GfVec3f ss_coat_color = op_coat_color; + // float ss_coat = op_coat_weight; + // GfVec3f coatColor = ss_coat * ss_coat_color; + // float ps_clearcoat = GfDot(coatColor, GfVec3(1/3)); + // So: + // GfVec3f coatColor = op_coat_weight * op_coat_color; + // float ps_clearcoat = GfDot(coatColor, GfVec3(1/3)); + // Trigger: + // Can only happen if coat_weight > 0 + MStatus status; + + MPlug weightNodePlug = depNodeFn.findPlug( + depNodeFn.attribute(TrMayaOpenPBRTokens->coatWeight.GetText()), + /* wantNetworkedPlug = */ true, + &status); + if (status != MS::kSuccess) { + return; + } + + if (!UsdMayaUtil::IsAuthored(weightNodePlug)) { + // Ignore this unauthored Maya attribute and return success. + return; + } + + const bool isDestination = weightNodePlug.isDestination(&status); + if (status != MS::kSuccess) { + return; + } + + UsdShadeInput shaderInput = shaderSchema.CreateInput( + PxrMayaUsdPreviewSurfaceTokens->ClearcoatAttrName, SdfValueTypeNames->Float); + + if (isDestination) { + return; + } + + const auto coatColor + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->coatColor); + const auto coatWeight = _GetMayaAttributeValue(weightNodePlug); + + float clearcoat = GfDot(coatColor * coatWeight, GfVec3f(1.0f / 3.0f)); + + shaderInput.Set(clearcoat, usdTime); +} + +void _AuthorRoughness( + const MFnDependencyNode& depNodeFn, + UsdShadeShader& shaderSchema, + const UsdTimeCode usdTime) +{ + // Roughness: + // float ss_specular_roughness = GfLerp(op_coat_weight, op_specular_roughness, + // op_coat_roughness); float ps_roughness = ss_specular_roughness; + MStatus status; + + MPlug specularRoughnessPlug = depNodeFn.findPlug( + depNodeFn.attribute(TrMayaOpenPBRTokens->specularRoughness.GetText()), + /* wantNetworkedPlug = */ true, + &status); + if (status != MS::kSuccess) { + return; + } + + const bool isDestination = specularRoughnessPlug.isDestination(&status); + if (status != MS::kSuccess) { + return; + } + + UsdShadeInput shaderInput = shaderSchema.CreateInput( + PxrMayaUsdPreviewSurfaceTokens->RoughnessAttrName, SdfValueTypeNames->Float); + + if (isDestination) { + return; + } + + float previewRoughness = _GetMayaAttributeValue(specularRoughnessPlug); + const float coatWeight + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->coatWeight); + if (coatWeight) { + const auto coatRoughness + = _GetMayaAttributeValue(depNodeFn, TrMayaOpenPBRTokens->coatRoughness); + previewRoughness = GfLerp(coatWeight, previewRoughness, coatRoughness); + } + + shaderInput.Set(previewRoughness, usdTime); +} +} // namespace + +class PxrUsdTranslators_OpenPBRSurfaceWriter : public PxrUsdTranslators_MaterialWriter +{ + typedef PxrUsdTranslators_MaterialWriter BaseClass; + +public: + PxrUsdTranslators_OpenPBRSurfaceWriter( + const MFnDependencyNode& depNodeFn, + const SdfPath& usdPath, + UsdMayaWriteJobContext& jobCtx); + + void Write(const UsdTimeCode& usdTime) override; + + TfToken GetShadingAttributeNameForMayaAttrName(const TfToken& mayaAttrName) override; +}; + +PXRUSDMAYA_REGISTER_SHADER_WRITER(openPBRSurface, PxrUsdTranslators_OpenPBRSurfaceWriter); + +PxrUsdTranslators_OpenPBRSurfaceWriter::PxrUsdTranslators_OpenPBRSurfaceWriter( + const MFnDependencyNode& depNodeFn, + const SdfPath& usdPath, + UsdMayaWriteJobContext& jobCtx) + : BaseClass(depNodeFn, usdPath, jobCtx) +{ +} + +/* virtual */ +void PxrUsdTranslators_OpenPBRSurfaceWriter::Write(const UsdTimeCode& usdTime) +{ + BaseClass::Write(usdTime); + + MStatus status; + + const MFnDependencyNode depNodeFn(GetMayaObject(), &status); + if (status != MS::kSuccess) { + return; + } + + UsdShadeShader shaderSchema(_usdPrim); + if (!TF_VERIFY( + shaderSchema, + "Could not get UsdShadeShader schema for UsdPrim at path '%s'\n", + _usdPrim.GetPath().GetText())) { + return; + } + + // We are basing the exporter on a concatenation of the MaterialX math found in + // NG_open_pbr_surface_to_standard_surface + // + + // Emission and Diffuse are non-trivial and affected by coat color: + _AuthorEmissionAndDiffuse(depNodeFn, shaderSchema, usdTime); + + // Metallic: trivial + // float ss_metalness = op_base_metalness; + // float ps_metallic = ss_metalness; + + AuthorShaderInputFromShadingNodeAttr( + depNodeFn, + TrMayaOpenPBRTokens->baseMetalness, + shaderSchema, + PxrMayaUsdPreviewSurfaceTokens->MetallicAttrName, + usdTime); + + // Please note that the MaterialX recommended translation completely ignores + // useSpecularWorkflow and specularColor, so these are never converted. + + // IOR: trivial + // float ss_specular_IOR = op_specular_ior; + // float ps_ior = ss_specular_IOR + AuthorShaderInputFromShadingNodeAttr( + depNodeFn, + TrMayaOpenPBRTokens->specularIOR, + shaderSchema, + PxrMayaUsdPreviewSurfaceTokens->IorAttrName, + usdTime); + + // Roughness is non-trivial: + _AuthorRoughness(depNodeFn, shaderSchema, usdTime); + + // Clearcoat is complex: + _AuthorClearcoat(depNodeFn, shaderSchema, usdTime); + + // ClearcoatRoughness: + // float ss_coat_roughness = op_coat_roughness; + // float ps_clearcoatRoughness = ss_coat_roughness; + // So a direct copy: + AuthorShaderInputFromShadingNodeAttr( + depNodeFn, + TrMayaOpenPBRTokens->coatRoughness, + shaderSchema, + PxrMayaUsdPreviewSurfaceTokens->ClearcoatRoughnessAttrName, + usdTime); + + // Opacity: + // GfVec3f ss_opacity = GfVec3f(op_geometry_opacity); + // float ps_opacity = GfDot(ss_opacity, GfVec3f(1.0f/3.0f)); + // Reducing to: + // float ps_opacity = op_geometry_opacity + MPlug opacityPlug = depNodeFn.findPlug( + depNodeFn.attribute(TrMayaOpenPBRTokens->geometryOpacity.GetText()), + /* wantNetworkedPlug = */ true, + &status); + if (UsdMayaUtil::IsAuthored(opacityPlug) || opacityPlug.isDestination()) { + UsdShadeInput opacityInput = shaderSchema.CreateInput( + PxrMayaUsdPreviewSurfaceTokens->OpacityAttrName, SdfValueTypeNames->Float); + + if (!opacityPlug.isDestination()) { + VtValue opacityValue + = UsdMayaWriteUtil::GetVtValue(opacityPlug, SdfValueTypeNames->Float); + + opacityInput.Set(opacityValue, usdTime); + } + } + + // Exported, but unsupported in hdStorm. + AuthorShaderInputFromShadingNodeAttr( + depNodeFn, + TrMayaOpenPBRTokens->normalCamera, + shaderSchema, + PxrMayaUsdPreviewSurfaceTokens->NormalAttrName, + usdTime, + /* ignoreIfUnauthored = */ true, + /* inputTypeName = */ SdfValueTypeNames->Normal3f); +} + +/* virtual */ +TfToken PxrUsdTranslators_OpenPBRSurfaceWriter::GetShadingAttributeNameForMayaAttrName( + const TfToken& mayaAttrName) +{ + TfToken usdAttrName; + + if (mayaAttrName == TrMayaOpenPBRTokens->baseColor) { + usdAttrName = PxrMayaUsdPreviewSurfaceTokens->DiffuseColorAttrName; + } else if (mayaAttrName == TrMayaOpenPBRTokens->emissionColor) { + usdAttrName = PxrMayaUsdPreviewSurfaceTokens->EmissiveColorAttrName; + } else if (mayaAttrName == TrMayaOpenPBRTokens->baseMetalness) { + usdAttrName = PxrMayaUsdPreviewSurfaceTokens->MetallicAttrName; + } else if (mayaAttrName == TrMayaOpenPBRTokens->specularIOR) { + usdAttrName = PxrMayaUsdPreviewSurfaceTokens->IorAttrName; + } else if (mayaAttrName == TrMayaOpenPBRTokens->specularRoughness) { + usdAttrName = PxrMayaUsdPreviewSurfaceTokens->RoughnessAttrName; + } else if (mayaAttrName == TrMayaOpenPBRTokens->coatWeight) { + usdAttrName = PxrMayaUsdPreviewSurfaceTokens->ClearcoatAttrName; + } else if (mayaAttrName == TrMayaOpenPBRTokens->coatRoughness) { + usdAttrName = PxrMayaUsdPreviewSurfaceTokens->ClearcoatRoughnessAttrName; + } else if (mayaAttrName == TrMayaOpenPBRTokens->geometryOpacity) { + usdAttrName = PxrMayaUsdPreviewSurfaceTokens->OpacityAttrName; + } else if (mayaAttrName == TrMayaOpenPBRTokens->normalCamera) { + usdAttrName = PxrMayaUsdPreviewSurfaceTokens->NormalAttrName; + } else { + return BaseClass::GetShadingAttributeNameForMayaAttrName(mayaAttrName); + } + + return UsdShadeUtils::GetFullName(usdAttrName, UsdShadeAttributeType::Input); +} + +PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/translators/shading/usdStandardSurfaceWriter.cpp b/lib/usd/translators/shading/usdStandardSurfaceWriter.cpp index a8bf9c1614..edd6b0907c 100644 --- a/lib/usd/translators/shading/usdStandardSurfaceWriter.cpp +++ b/lib/usd/translators/shading/usdStandardSurfaceWriter.cpp @@ -184,7 +184,7 @@ void PxrUsdTranslators_StandardSurfaceWriter::Write(const UsdTimeCode& usdTime) shaderSchema, PxrMayaUsdPreviewSurfaceTokens->NormalAttrName, usdTime, - /* ignoreIfUnauthored = */ false, + /* ignoreIfUnauthored = */ true, /* inputTypeName = */ SdfValueTypeNames->Normal3f); } diff --git a/plugin/adsk/scripts/mayaUSDRegisterStrings.py b/plugin/adsk/scripts/mayaUSDRegisterStrings.py index bf46606410..72ce2cc384 100644 --- a/plugin/adsk/scripts/mayaUSDRegisterStrings.py +++ b/plugin/adsk/scripts/mayaUSDRegisterStrings.py @@ -302,6 +302,7 @@ "kImportMaterialConvAnn": "Select the preferred conversion method for inbound USD shading data to bind with Maya geometry", "kImportMaterialConvLbl": "Convert to:", "kImportMaterialConvNoneLbl": "Automatic", + "kImportMaterialConvOPBRLbl": "OpenPBR Surface", "kImportMaterialConvSSLbl": "Standard Surface", "kImportMaterialConvLamLbl": "Lambert", "kImportMaterialConvPSLbl": "USD Preview Surface", diff --git a/plugin/adsk/scripts/mayaUsdTranslatorImport.mel b/plugin/adsk/scripts/mayaUsdTranslatorImport.mel index 734ebdc0a1..b7f5085130 100644 --- a/plugin/adsk/scripts/mayaUsdTranslatorImport.mel +++ b/plugin/adsk/scripts/mayaUsdTranslatorImport.mel @@ -525,10 +525,13 @@ global proc int mayaUsdTranslatorImport (string $parent, separator -style "none"; checkBoxGrp -label "" -label1 `getMayaUsdString("kImportMaterialsLbl")` -cw 1 $cw1 -value1 1 -ann `getMayaUsdString("kImportMaterialsAnn")` -cc ("mayaUsdTranslatorImport_MaterialsCB") mayaUsdTranslator_MaterialsCheckBox; - string $apiString = `about -q -apiVersion`; - $apiString = `substring $apiString 1 4`; + string $apiStringFull = `about -q -apiVersion`; + $apiString = `substring $apiStringFull 1 4`; optionMenuGrp -l `getMayaUsdString("kImportMaterialConvLbl")` -cw 1 $cw1 -ann `getMayaUsdString("kImportMaterialConvAnn")` mayaUsdTranslator_MaterialsConversionMenu; menuItem -l `getMayaUsdString("kImportMaterialConvNoneLbl")` -ann "none"; + if ((int)$apiStringFull >= 20250300) { + menuItem -l `getMayaUsdString("kImportMaterialConvOPBRLbl")` -ann "openPBRSurface"; + } if ((int)$apiString >= 2020) { menuItem -l `getMayaUsdString("kImportMaterialConvSSLbl")` -ann "standardSurface"; } diff --git a/test/lib/mayaUsd/render/vp2RenderDelegate/CMakeLists.txt b/test/lib/mayaUsd/render/vp2RenderDelegate/CMakeLists.txt index 5f3bb894df..4ef9695d96 100644 --- a/test/lib/mayaUsd/render/vp2RenderDelegate/CMakeLists.txt +++ b/test/lib/mayaUsd/render/vp2RenderDelegate/CMakeLists.txt @@ -53,6 +53,7 @@ if (CMAKE_WANT_MATERIALX_BUILD) "MATERIALX_VERSION=${MaterialX_VERSION}" "MAYA_HAS_COLOR_MANAGEMENT_SUPPORT_API=${MAYA_HAS_COLOR_MANAGEMENT_SUPPORT_API}" "MAYAUSD_EXPORT_EXPANDED_COLORSPACE_ATTRIBUTE=1" + "USD_HAS_MX_OPENPBR_SURFACE=${USD_HAS_MX_OPENPBR_SURFACE}" # Maya uses a very old version of GLEW, so we need support for # pre-loading a newer version from elsewhere. "LD_PRELOAD=${ADDITIONAL_LD_PRELOAD}" diff --git a/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/OpenPBRShowcase_MTLX_Import_render.png b/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/OpenPBRShowcase_MTLX_Import_render.png new file mode 100644 index 0000000000..dc9e2ce986 Binary files /dev/null and b/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/OpenPBRShowcase_MTLX_Import_render.png differ diff --git a/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/OpenPBRShowcase_UsdPS_Import_render.png b/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/OpenPBRShowcase_UsdPS_Import_render.png new file mode 100644 index 0000000000..9c9ba53ba2 Binary files /dev/null and b/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateMaterialXTest/baseline/OpenPBRShowcase_UsdPS_Import_render.png differ diff --git a/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py b/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py index e6a6a16c45..318275c172 100644 --- a/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py +++ b/test/lib/mayaUsd/render/vp2RenderDelegate/testVP2RenderDelegateMaterialX.py @@ -181,6 +181,64 @@ def testDemoQuads(self): self._StartTest('DemoQuads') + @unittest.skipIf(os.getenv("USD_HAS_MX_OPENPBR_SURFACE", 'FALSE') != 'TRUE', 'Requires OpenPBR in MaterialX') + def testOpenPBRSupport(self): + """Test that OpenPBR imports, exports, and renders""" + mayaUtils.loadPlugin("mayaUsdPlugin") + panel = mayaUtils.activeModelPanel() + cmds.modelEditor(panel, edit=True, displayTextures=True, displayLights = 'all') + + # Too much differences between Linux and Windows otherwise + cmds.setAttr("hardwareRenderingGlobals.multiSampleEnable", True) + + testFile = testUtils.getTestScene("MaterialX", "OpenPBRShowcase.ma") + cmds.file(testFile, force=True, open=True) + cmds.move(0, 7, -1.5, 'persp') + cmds.rotate(-90, 0, 0, 'persp') + usdFilePath = os.path.join(self._testDir, "OpenPBRShowcase_MTLX.usda") + cmds.mayaUSDExport(mergeTransformAndShape=True, file=usdFilePath, + shadingMode='useRegistry', convertMaterialsTo=['MaterialX'], + materialsScopeName='Materials', excludeExportTypes=['Cameras','Lights']) + xform, shape = mayaUtils.createProxyFromFile(usdFilePath) + cmds.move(0, 0, 1, xform) + + # Re-import for a full roundtrip: + # Import back: + import_options = ("shadingMode=[[useRegistry,MaterialX]]", + "primPath=/") + cmds.file(usdFilePath, i=True, type="USD Import", + ignoreVersion=True, ra=True, mergeNamespacesOnClash=False, + namespace="Test", pr=True, importTimeRange="combine", + options=";".join(import_options)) + cmds.move(0, 0, 2, "Test:locator1") + + self.assertSnapshotClose('OpenPBRShowcase_MTLX_Import_render.png', 960, 960) + + cmds.delete(xform) + cmds.delete("Test:locator1") + + # Same test, but in UsdPreviewSurface land: + usdFilePath = os.path.join(self._testDir, "OpenPBRShowcase_UsdPS.usda") + cmds.mayaUSDExport(mergeTransformAndShape=True, file=usdFilePath, + shadingMode='useRegistry', convertMaterialsTo=['UsdPreviewSurface'], + materialsScopeName='Materials', excludeExportTypes=['Cameras','Lights']) + xform, shape = mayaUtils.createProxyFromFile(usdFilePath) + cmds.move(0, 0, 1, xform) + + import_options = ("shadingMode=[[useRegistry,UsdPreviewSurface]]", + "preferredMaterial=openPBRSurface", + "primPath=/") + cmds.file(usdFilePath, i=True, type="USD Import", + ignoreVersion=True, ra=True, mergeNamespacesOnClash=False, + namespace="Test", pr=True, importTimeRange="combine", + options=";".join(import_options)) + cmds.move(0, 0, 2, "Test1:locator1") + + self.assertSnapshotClose('OpenPBRShowcase_UsdPS_Import_render.png', 960, 960) + + cmds.setAttr("hardwareRenderingGlobals.multiSampleEnable", True) + + def testWithEnabledMaterialX(self): """Make sure the absence of MAYAUSD_VP2_USE_ONLY_PREVIEWSURFACE env var has an effect.""" cmds.file(force=True, new=True) diff --git a/test/testSamples/MaterialX/OpenPBRShowcase.ma b/test/testSamples/MaterialX/OpenPBRShowcase.ma new file mode 100644 index 0000000000..8fb3c2ce5a --- /dev/null +++ b/test/testSamples/MaterialX/OpenPBRShowcase.ma @@ -0,0 +1,1422 @@ +//Maya ASCII 2026ff01 scene +//Name: OpenPBRShowcase.ma +//Last modified: Thu, Nov 07, 2024 02:42:16 PM +//Codeset: 1252 +requires maya "2026ff01"; +requires -dataType "pxrUsdStageData" "mayaUsdPlugin" "0.31.0"; +requires "stereoCamera" "10.0"; +requires "stereoCamera" "10.0"; +currentUnit -l centimeter -a degree -t film; +fileInfo "application" "maya"; +fileInfo "product" "Maya 2026"; +fileInfo "version" "Preview Release"; +fileInfo "cutIdentifier" "202410181758-000000"; +fileInfo "osv" "Windows 11 Pro v2009 (Build: 22631)"; +fileInfo "UUID" "9A2CC5C3-44DA-A16A-9721-A583B9F42E3E"; +createNode transform -s -n "persp"; + rename -uid "D2193ACF-4739-3327-B0CF-5BA9FE4257F8"; + setAttr ".v" no; + setAttr ".t" -type "double3" -0.73460220925485975 9.8043568319844283 -2.1094965391604528 ; + setAttr ".r" -type "double3" -93.338352729605674 -0.59999999999981324 -9.939778383928948e-17 ; +createNode camera -s -n "perspShape" -p "persp"; + rename -uid "1A2B5338-4C4F-31DC-4C44-4B848918C97F"; + setAttr -k off ".v" no; + setAttr ".fl" 34.999999999999993; + setAttr ".coi" 9.9925860713258672; + setAttr ".imn" -type "string" "persp"; + setAttr ".den" -type "string" "persp_depth"; + setAttr ".man" -type "string" "persp_mask"; + setAttr ".hc" -type "string" "viewSet -p %camera"; +createNode transform -s -n "top"; + rename -uid "D252ACE3-4DD5-C790-4B07-2BA00B2191FE"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 1000.1 0 ; + setAttr ".r" -type "double3" -90 0 0 ; +createNode camera -s -n "topShape" -p "top"; + rename -uid "D024B3D6-423D-DEEF-3DF0-1DA383B35377"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "top"; + setAttr ".den" -type "string" "top_depth"; + setAttr ".man" -type "string" "top_mask"; + setAttr ".hc" -type "string" "viewSet -t %camera"; + setAttr ".o" yes; +createNode transform -s -n "front"; + rename -uid "E5CECFC6-44E7-E07F-0DB8-1D80219A73A8"; + setAttr ".v" no; + setAttr ".t" -type "double3" 0 0 1000.1 ; +createNode camera -s -n "frontShape" -p "front"; + rename -uid "BB167902-4E32-A20C-F453-F08FAD98995E"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "front"; + setAttr ".den" -type "string" "front_depth"; + setAttr ".man" -type "string" "front_mask"; + setAttr ".hc" -type "string" "viewSet -f %camera"; + setAttr ".o" yes; +createNode transform -s -n "side"; + rename -uid "59200C34-4358-5F40-D865-D3B3A31D7842"; + setAttr ".v" no; + setAttr ".t" -type "double3" 1000.1 0 0 ; + setAttr ".r" -type "double3" 0 90 0 ; +createNode camera -s -n "sideShape" -p "side"; + rename -uid "D7E1F505-481C-AF1E-32CE-7E9075CAC245"; + setAttr -k off ".v" no; + setAttr ".rnd" no; + setAttr ".coi" 1000.1; + setAttr ".ow" 30; + setAttr ".imn" -type "string" "side"; + setAttr ".den" -type "string" "side_depth"; + setAttr ".man" -type "string" "side_mask"; + setAttr ".hc" -type "string" "viewSet -s %camera"; + setAttr ".o" yes; +createNode transform -n "locator1"; + rename -uid "14D52E3F-4350-B007-7D31-F3B9B1FEE5D4"; +createNode locator -n "locatorShape1" -p "locator1"; + rename -uid "DCCC2299-47F7-97A1-CFB0-7798455789F7"; + setAttr -k off ".v"; +createNode transform -n "pPlane1" -p "locator1"; + rename -uid "DC0EEDCF-4CC6-B6EC-FF9A-AFAEB2232448"; + setAttr ".t" -type "double3" -1.9975885706120096 0.010795237000329694 -4 ; +createNode mesh -n "pPlaneShape1" -p "pPlane1"; + rename -uid "632E1570-4999-21C0-0537-A7BFCA42BADA"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; +createNode transform -n "pPlane2" -p "locator1"; + rename -uid "E16E8C5E-4DC8-17EA-2630-9B8BECC82CF8"; + setAttr ".t" -type "double3" -0.99758857061200956 0.010795237000329694 -4 ; +createNode mesh -n "pPlaneShape2" -p "pPlane2"; + rename -uid "5137B3BF-4239-F752-24A4-FE8DE4C2A28A"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 4 ".uvst[0].uvsp[0:3]" -type "float2" 0 0 1 0 0 1 1 1; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 4 ".vt[0:3]" -0.47499999 0 0.47499999 0.47499999 0 0.47499999 + -0.47499999 0 -0.47499999 0.47499999 0 -0.47499999; + setAttr -s 4 ".ed[0:3]" 0 1 0 0 2 0 1 3 0 2 3 0; + setAttr -ch 4 ".fc[0]" -type "polyFaces" + f 4 0 2 -4 -2 + mu 0 4 0 1 3 2; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".pd[0]" -type "dataPolyComponent" Index_Data UV 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode transform -n "pPlane3" -p "locator1"; + rename -uid "F5E7D4CF-41CD-6C56-1A94-B7ADF4C14289"; + setAttr ".t" -type "double3" 0.0024114293879895499 0.010795237000329694 -4 ; +createNode mesh -n "pPlaneShape3" -p "pPlane3"; + rename -uid "FA6AA288-43B2-C9D7-DE0F-148D574095E8"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".pv" -type "double2" 0.31964285036141715 0.65357142857142858 ; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 4 ".uvst[0].uvsp[0:3]" -type "float2" -0.4818908 -0.16877288 + 1.12117648 -0.16877288 -0.4818908 1.47591567 1.12117648 1.47591567; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 4 ".vt[0:3]" -0.47499999 0 0.47499999 0.47499999 0 0.47499999 + -0.47499999 0 -0.47499999 0.47499999 0 -0.47499999; + setAttr -s 4 ".ed[0:3]" 0 1 0 0 2 0 1 3 0 2 3 0; + setAttr -ch 4 ".fc[0]" -type "polyFaces" + f 4 0 2 -4 -2 + mu 0 4 0 1 3 2; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".pd[0]" -type "dataPolyComponent" Index_Data UV 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode transform -n "pPlane4" -p "locator1"; + rename -uid "F73F63F8-4B97-2E5F-F22F-4CA2CE255DE2"; + setAttr ".t" -type "double3" 1.0024114293879904 0.010795237000329694 -4 ; +createNode mesh -n "pPlaneShape4" -p "pPlane4"; + rename -uid "CDF482A5-4CE1-E69B-2415-D485339E29DB"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".pv" -type "double2" 0.5 0.5 ; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 4 ".uvst[0].uvsp[0:3]" -type "float2" -0.34432232 -0.3150183 + 1.34432232 -0.3150183 -0.34432232 1.3150183 1.34432232 1.3150183; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 4 ".vt[0:3]" -0.47499999 0 0.47499999 0.47499999 0 0.47499999 + -0.47499999 0 -0.47499999 0.47499999 0 -0.47499999; + setAttr -s 4 ".ed[0:3]" 0 1 0 0 2 0 1 3 0 2 3 0; + setAttr -ch 4 ".fc[0]" -type "polyFaces" + f 4 0 2 -4 -2 + mu 0 4 0 1 3 2; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".pd[0]" -type "dataPolyComponent" Index_Data UV 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode transform -n "pPlane5" -p "locator1"; + rename -uid "39B79EAF-4A94-C40D-C8BE-74879EBB6CAC"; + setAttr ".t" -type "double3" 2.0024114293879904 0.010795237000329694 -4 ; +createNode mesh -n "pPlaneShape5" -p "pPlane5"; + rename -uid "91C43ECC-4B91-F4F4-3F53-4EAEBE9063F5"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 4 ".uvst[0].uvsp[0:3]" -type "float2" 0 0 1 0 0 1 1 1; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 4 ".vt[0:3]" -0.47499999 0 0.47499999 0.47499999 0 0.47499999 + -0.47499999 0 -0.47499999 0.47499999 0 -0.47499999; + setAttr -s 4 ".ed[0:3]" 0 1 0 0 2 0 1 3 0 2 3 0; + setAttr -ch 4 ".fc[0]" -type "polyFaces" + f 4 0 2 -4 -2 + mu 0 4 0 1 3 2; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".pd[0]" -type "dataPolyComponent" Index_Data UV 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode transform -n "pPlane11" -p "locator1"; + rename -uid "3177C51D-4378-BA4C-6983-57A625948623"; + setAttr ".t" -type "double3" -2.0337935161868788 0.010795237000329694 -1 ; +createNode mesh -n "pPlaneShape11" -p "pPlane11"; + rename -uid "B9E2166E-433F-3669-E30E-0999BB25E93A"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 4 ".uvst[0].uvsp[0:3]" -type "float2" 0 0 1 0 0 1 1 1; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 4 ".vt[0:3]" -0.47499999 0 0.47499999 0.47499999 0 0.47499999 + -0.47499999 0 -0.47499999 0.47499999 0 -0.47499999; + setAttr -s 4 ".ed[0:3]" 0 1 0 0 2 0 1 3 0 2 3 0; + setAttr -ch 4 ".fc[0]" -type "polyFaces" + f 4 0 2 -4 -2 + mu 0 4 0 1 3 2; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".pd[0]" -type "dataPolyComponent" Index_Data UV 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode transform -n "pPlane12" -p "locator1"; + rename -uid "7F5A2435-4290-70E5-5812-D7A878A51AE1"; + setAttr ".t" -type "double3" -1.0337935161868788 0.010795237000329694 -1 ; +createNode mesh -n "pPlaneShape12" -p "pPlane12"; + rename -uid "032247BB-4E2B-70E9-5DA6-C2A233C634DC"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 4 ".uvst[0].uvsp[0:3]" -type "float2" 0 0 1 0 0 1 1 1; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 4 ".vt[0:3]" -0.47499999 0 0.47499999 0.47499999 0 0.47499999 + -0.47499999 0 -0.47499999 0.47499999 0 -0.47499999; + setAttr -s 4 ".ed[0:3]" 0 1 0 0 2 0 1 3 0 2 3 0; + setAttr -ch 4 ".fc[0]" -type "polyFaces" + f 4 0 2 -4 -2 + mu 0 4 0 1 3 2; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".pd[0]" -type "dataPolyComponent" Index_Data UV 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode transform -n "pPlane13" -p "locator1"; + rename -uid "26F06F7F-4DA9-D849-FE9A-EAB2265AE7A2"; + setAttr ".t" -type "double3" -0.033793516186878758 0.010795237000329694 -1 ; +createNode mesh -n "pPlaneShape13" -p "pPlane13"; + rename -uid "4FF49A0E-4684-B710-05C5-9FBFF8E03E47"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 4 ".uvst[0].uvsp[0:3]" -type "float2" 0 0 1 0 0 1 1 1; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 4 ".vt[0:3]" -0.47499999 0 0.47499999 0.47499999 0 0.47499999 + -0.47499999 0 -0.47499999 0.47499999 0 -0.47499999; + setAttr -s 4 ".ed[0:3]" 0 1 0 0 2 0 1 3 0 2 3 0; + setAttr -ch 4 ".fc[0]" -type "polyFaces" + f 4 0 2 -4 -2 + mu 0 4 0 1 3 2; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".pd[0]" -type "dataPolyComponent" Index_Data UV 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode transform -n "pPlane14" -p "locator1"; + rename -uid "8D203146-499D-5F9A-2F83-1BB5DB697FC3"; + setAttr ".t" -type "double3" 0.96620648381312124 0.010795237000329694 -1 ; +createNode mesh -n "pPlaneShape14" -p "pPlane14"; + rename -uid "1A35A301-4DC1-DD96-68A5-C093AE557F8B"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 4 ".uvst[0].uvsp[0:3]" -type "float2" 0 0 1 0 0 1 1 1; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 4 ".vt[0:3]" -0.47499999 0 0.47499999 0.47499999 0 0.47499999 + -0.47499999 0 -0.47499999 0.47499999 0 -0.47499999; + setAttr -s 4 ".ed[0:3]" 0 1 0 0 2 0 1 3 0 2 3 0; + setAttr -ch 4 ".fc[0]" -type "polyFaces" + f 4 0 2 -4 -2 + mu 0 4 0 1 3 2; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".pd[0]" -type "dataPolyComponent" Index_Data UV 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode transform -n "pPlane15" -p "locator1"; + rename -uid "11BA26BC-423B-EA0B-B958-358B15F0E530"; + setAttr ".t" -type "double3" 1.9662064838131212 0.010795237000329694 -1 ; +createNode mesh -n "pPlaneShape15" -p "pPlane15"; + rename -uid "F31643D3-4D52-20C5-3941-2F9DC7F537ED"; + setAttr -k off ".v"; + setAttr ".vir" yes; + setAttr ".vif" yes; + setAttr ".uvst[0].uvsn" -type "string" "map1"; + setAttr -s 4 ".uvst[0].uvsp[0:3]" -type "float2" 0 0 1 0 0 1 1 1; + setAttr ".cuvs" -type "string" "map1"; + setAttr ".dcc" -type "string" "Ambient+Diffuse"; + setAttr ".covm[0]" 0 1 1; + setAttr ".cdvm[0]" 0 1 1; + setAttr -s 4 ".vt[0:3]" -0.47499999 0 0.47499999 0.47499999 0 0.47499999 + -0.47499999 0 -0.47499999 0.47499999 0 -0.47499999; + setAttr -s 4 ".ed[0:3]" 0 1 0 0 2 0 1 3 0 2 3 0; + setAttr -ch 4 ".fc[0]" -type "polyFaces" + f 4 0 2 -4 -2 + mu 0 4 0 1 3 2; + setAttr ".cd" -type "dataPolyComponent" Index_Data Edge 0 ; + setAttr ".cvd" -type "dataPolyComponent" Index_Data Vertex 0 ; + setAttr ".pd[0]" -type "dataPolyComponent" Index_Data UV 0 ; + setAttr ".hfd" -type "dataPolyComponent" Index_Data Face 0 ; +createNode transform -n "directionalLight1"; + rename -uid "8188D161-4521-3457-4334-D6835EFAECFE"; + setAttr ".t" -type "double3" -3.9716813762095233 0 -2.0261681177766286 ; + setAttr ".r" -type "double3" -70.224172396963851 12.489190841674752 -13.977190340184658 ; +createNode directionalLight -n "directionalLightShape1" -p "directionalLight1"; + rename -uid "A1C77082-4BBB-9DCA-B6A5-E6AEDADBAB67"; + setAttr -k off ".v"; +createNode lightLinker -s -n "lightLinker1"; + rename -uid "46442E11-4DBA-0983-D4E4-B894277C6EF7"; + setAttr -s 22 ".lnk"; + setAttr -s 22 ".slnk"; +createNode shapeEditorManager -n "shapeEditorManager"; + rename -uid "40E4D5E9-4344-43F5-A7A1-06903E935C5E"; +createNode poseInterpolatorManager -n "poseInterpolatorManager"; + rename -uid "4FD7CDED-4031-AA69-6117-8F8A3D1EA34E"; +createNode displayLayerManager -n "layerManager"; + rename -uid "1EDCC9FF-4C1A-87D3-AE2A-C28CBFEAAE46"; +createNode displayLayer -n "defaultLayer"; + rename -uid "279B382D-4C23-FF7D-1B8F-30BEDE2BF887"; + setAttr ".ufem" -type "stringArray" 0 ; +createNode renderLayerManager -n "renderLayerManager"; + rename -uid "DABD20DA-493E-04C1-A1F9-6EAF7BF861B2"; +createNode renderLayer -n "defaultRenderLayer"; + rename -uid "5E5B51B9-4BC4-140B-A8AA-7C9E120B7BDB"; + setAttr ".g" yes; +createNode polyPlane -n "polyPlane1"; + rename -uid "300A52C5-420C-D300-E2A7-AB99E2DBD0BF"; + setAttr ".w" 0.95; + setAttr ".h" 0.95; + setAttr ".sw" 1; + setAttr ".sh" 1; + setAttr ".cuv" 2; +createNode nodeGraphEditorInfo -n "MayaNodeEditorSavedTabsInfo"; + rename -uid "5FBA423B-4A0B-B701-F45D-1D8F88B59A41"; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -828.39633523100269 -394.35496843751139 ; + setAttr ".tgi[0].vh" -type "double2" 822.02378654318659 435.67149358316544 ; + setAttr -s 6 ".tgi[0].ni"; + setAttr ".tgi[0].ni[0].x" -714.28570556640625; + setAttr ".tgi[0].ni[0].y" 47.142856597900391; + setAttr ".tgi[0].ni[0].nvs" 18304; + setAttr ".tgi[0].ni[1].x" -29.35944938659668; + setAttr ".tgi[0].ni[1].y" 625.11102294921875; + setAttr ".tgi[0].ni[1].nvs" 18306; + setAttr ".tgi[0].ni[2].x" -383.06085205078125; + setAttr ".tgi[0].ni[2].y" 279.93557739257812; + setAttr ".tgi[0].ni[2].nvs" 18305; + setAttr ".tgi[0].ni[3].x" 514.28570556640625; + setAttr ".tgi[0].ni[3].y" 97.142860412597656; + setAttr ".tgi[0].ni[3].nvs" 18304; + setAttr ".tgi[0].ni[4].x" 207.14285278320312; + setAttr ".tgi[0].ni[4].y" 47.142856597900391; + setAttr ".tgi[0].ni[4].nvs" 18304; + setAttr ".tgi[0].ni[5].x" 514.28570556640625; + setAttr ".tgi[0].ni[5].y" -4.2857141494750977; + setAttr ".tgi[0].ni[5].nvs" 18304; +createNode script -n "uiConfigurationScriptNode"; + rename -uid "023E8166-4529-DD8F-DBF4-298FA4143C12"; + setAttr ".b" -type "string" ( + "// Maya Mel UI Configuration File.\n//\n// This script is machine generated. Edit at your own risk.\n//\n//\n\nglobal string $gMainPane;\nif (`paneLayout -exists $gMainPane`) {\n\n\tglobal int $gUseScenePanelConfig;\n\tint $useSceneConfig = $gUseScenePanelConfig;\n\tint $nodeEditorPanelVisible = stringArrayContains(\"nodeEditorPanel1\", `getPanel -vis`);\n\tint $nodeEditorWorkspaceControlOpen = (`workspaceControl -exists nodeEditorPanel1Window` && `workspaceControl -q -visible nodeEditorPanel1Window`);\n\tint $menusOkayInPanels = `optionVar -q allowMenusInPanels`;\n\tint $nVisPanes = `paneLayout -q -nvp $gMainPane`;\n\tint $nPanes = 0;\n\tstring $editorName;\n\tstring $panelName;\n\tstring $itemFilterName;\n\tstring $panelConfig;\n\n\t//\n\t// get current state of the UI\n\t//\n\tsceneUIReplacement -update $gMainPane;\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Top View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Top View\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|top\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n" + + " -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n" + + " -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Side View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Side View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|side\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n" + + " -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n" + + " -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n" + + " -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Front View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Front View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n -camera \"|front\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n" + + " -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n" + + " -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n" + + " -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 1\n -height 1\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"modelPanel\" (localizedPanelLabel(\"Persp View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tmodelPanel -edit -l (localizedPanelLabel(\"Persp View\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n modelEditor -e \n" + + " -camera \"|persp\" \n -useInteractiveMode 0\n -displayLights \"all\" \n -displayAppearance \"smoothShaded\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 0\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 1\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n" + + " -maxConstantTransparency 1\n -rendererName \"vp2Renderer\" \n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 256 256 \n -bumpResolution 512 512 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 1\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n" + + " -imagePlane 1\n -joints 1\n -ikHandles 1\n -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -excludeObjectPreset \"All\" \n -shadows 0\n -captureSequenceNumber -1\n -width 1755\n -height 1067\n -sceneRenderFilter 0\n $editorName;\n modelEditor -e -viewSelected 0 $editorName;\n modelEditor -e \n -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n" + + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"ToggledOutliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"ToggledOutliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 1\n -showReferenceMembers 1\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n" + + " -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -isSet 0\n -isSetMember 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n" + + " -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -renderFilterIndex 0\n -selectionOrder \"chronological\" \n -expandAttribute 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"outlinerPanel\" (localizedPanelLabel(\"Outliner\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\toutlinerPanel -edit -l (localizedPanelLabel(\"Outliner\")) -mbv $menusOkayInPanels $panelName;\n\t\t$editorName = $panelName;\n outlinerEditor -e \n -showShapes 0\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 0\n -showConnected 0\n -showAnimCurvesOnly 0\n -showMuteInfo 0\n" + + " -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 0\n -showDagOnly 1\n -showAssets 1\n -showContainedOnly 1\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 1\n -ignoreDagHierarchy 0\n -expandConnections 0\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 1\n -showLeafs 1\n -showNumericAttrsOnly 0\n -highlightActive 1\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"defaultSetFilter\" \n -showSetMembers 1\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n" + + " -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 0\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n -ufeFilter \"USD\" \"InactivePrims\" -ufeFilterValue 1\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"graphEditor\" (localizedPanelLabel(\"Graph Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Graph Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n" + + " outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 0\n -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 1\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n" + + " -autoSelectNewObjects 1\n -doNotSelectNewObjects 0\n -dropIsParent 1\n -transmitFilters 1\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 1\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n" + + " -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"GraphEd\");\n animCurveEditor -e \n -displayValues 0\n -snapTime \"integer\" \n -snapValue \"none\" \n -showPlayRangeShades \"on\" \n -lockPlayRangeShades \"off\" \n -smoothness \"fine\" \n -resultSamples 1\n -resultScreenSamples 0\n -resultUpdate \"delayed\" \n -showUpstreamCurves 1\n -tangentScale 1\n -tangentLineThickness 1\n -keyMinScale 1\n -stackedCurvesMin -1\n -stackedCurvesMax 1\n -stackedCurvesSpace 0.2\n -preSelectionHighlight 0\n -limitToSelectedCurves 0\n -constrainDrag 0\n -valueLinesToggle 1\n -highlightAffectedCurves 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n" + + "\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dopeSheetPanel\" (localizedPanelLabel(\"Dope Sheet\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dope Sheet\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"OutlineEd\");\n outlinerEditor -e \n -showShapes 1\n -showAssignedMaterials 0\n -showTimeEditor 1\n -showReferenceNodes 0\n -showReferenceMembers 0\n -showAttributes 1\n -showConnected 1\n -showAnimCurvesOnly 1\n -showMuteInfo 0\n -organizeByLayer 1\n -organizeByClip 1\n -showAnimLayerWeight 1\n -autoExpandLayers 1\n -autoExpand 1\n -showDagOnly 0\n -showAssets 1\n -showContainedOnly 0\n -showPublishedAsConnected 0\n -showParentContainers 0\n" + + " -showContainerContents 0\n -ignoreDagHierarchy 0\n -expandConnections 1\n -showUpstreamCurves 1\n -showUnitlessCurves 0\n -showCompounds 0\n -showLeafs 1\n -showNumericAttrsOnly 1\n -highlightActive 0\n -autoSelectNewObjects 0\n -doNotSelectNewObjects 1\n -dropIsParent 1\n -transmitFilters 0\n -setFilter \"0\" \n -showSetMembers 0\n -allowMultiSelection 1\n -alwaysToggleSelect 0\n -directSelect 0\n -showUfeItems 1\n -displayMode \"DAG\" \n -expandObjects 0\n -setsIgnoreFilters 1\n -containersIgnoreFilters 0\n -editAttrName 0\n -showAttrValues 0\n -highlightSecondary 0\n -showUVAttrsOnly 0\n -showTextureNodesOnly 0\n -attrAlphaOrder \"default\" \n" + + " -animLayerFilterOptions \"allAffecting\" \n -sortOrder \"none\" \n -longNames 0\n -niceNames 1\n -showNamespace 1\n -showPinIcons 0\n -mapMotionTrails 1\n -ignoreHiddenAttribute 0\n -ignoreOutlinerColor 0\n -renderFilterVisible 0\n $editorName;\n\n\t\t\t$editorName = ($panelName+\"DopeSheetEd\");\n dopeSheetEditor -e \n -displayValues 0\n -snapTime \"none\" \n -snapValue \"none\" \n -outliner \"dopeSheetPanel1OutlineEd\" \n -hierarchyBelow 0\n -selectionWindow 0 0 0 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"timeEditorPanel\" (localizedPanelLabel(\"Time Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Time Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"clipEditorPanel\" (localizedPanelLabel(\"Trax Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Trax Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = clipEditorNameFromPanel($panelName);\n clipEditor -e \n -displayValues 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 0 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"sequenceEditorPanel\" (localizedPanelLabel(\"Camera Sequencer\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Camera Sequencer\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = sequenceEditorNameFromPanel($panelName);\n" + + " clipEditor -e \n -displayValues 0\n -snapTime \"none\" \n -snapValue \"none\" \n -initialized 0\n -manageSequencer 1 \n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperGraphPanel\" (localizedPanelLabel(\"Hypergraph Hierarchy\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypergraph Hierarchy\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"HyperGraphEd\");\n hyperGraph -e \n -graphLayoutStyle \"hierarchicalLayout\" \n -orientation \"horiz\" \n -mergeConnections 0\n -zoom 1\n -animateTransition 0\n -showRelationships 1\n -showShapes 0\n -showDeformers 0\n -showExpressions 0\n -showConstraints 0\n" + + " -showConnectionFromSelected 0\n -showConnectionToSelected 0\n -showConstraintLabels 0\n -showUnderworld 0\n -showInvisible 0\n -transitionFrames 1\n -opaqueContainers 0\n -freeform 0\n -imagePosition 0 0 \n -imageScale 1\n -imageEnabled 0\n -graphType \"DAG\" \n -heatMapDisplay 0\n -updateSelection 1\n -updateNodeAdded 1\n -useDrawOverrideColor 0\n -limitGraphTraversal -1\n -range 0 0 \n -iconSize \"smallIcons\" \n -showCachedConnections 0\n $editorName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"hyperShadePanel\" (localizedPanelLabel(\"Hypershade\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Hypershade\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"visorPanel\" (localizedPanelLabel(\"Visor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Visor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"nodeEditorPanel\" (localizedPanelLabel(\"Node Editor\")) `;\n\tif ($nodeEditorPanelVisible || $nodeEditorWorkspaceControlOpen) {\n\t\tif (\"\" == $panelName) {\n\t\t\tif ($useSceneConfig) {\n\t\t\t\t$panelName = `scriptedPanel -unParent -type \"nodeEditorPanel\" -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels `;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n" + + " -connectNodeOnCreation 0\n -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -connectedGraphingMode 1\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -showUnitConversions 0\n -editorMode \"default\" \n -hasWatchpoint 0\n $editorName;\n\t\t\t}\n\t\t} else {\n\t\t\t$label = `panel -q -label $panelName`;\n" + + "\t\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Node Editor\")) -mbv $menusOkayInPanels $panelName;\n\n\t\t\t$editorName = ($panelName+\"NodeEditorEd\");\n nodeEditor -e \n -allAttributes 0\n -allNodes 0\n -autoSizeNodes 1\n -consistentNameSize 1\n -createNodeCommand \"nodeEdCreateNodeCommand\" \n -connectNodeOnCreation 0\n -connectOnDrop 0\n -copyConnectionsOnPaste 0\n -connectionStyle \"bezier\" \n -defaultPinnedState 0\n -additiveGraphingMode 0\n -connectedGraphingMode 1\n -settingsChangedCallback \"nodeEdSyncControls\" \n -traversalDepthLimit -1\n -keyPressCommand \"nodeEdKeyPressCommand\" \n -nodeTitleMode \"name\" \n -gridSnap 0\n -gridVisibility 1\n -crosshairOnEdgeDragging 0\n -popupMenuScript \"nodeEdBuildPanelMenus\" \n -showNamespace 1\n" + + " -showShapes 1\n -showSGShapes 0\n -showTransforms 1\n -useAssets 1\n -syncedSelection 1\n -extendToShapes 1\n -showUnitConversions 0\n -editorMode \"default\" \n -hasWatchpoint 0\n $editorName;\n\t\t\tif (!$useSceneConfig) {\n\t\t\t\tpanel -e -l $label $panelName;\n\t\t\t}\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"createNodePanel\" (localizedPanelLabel(\"Create Node\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Create Node\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"polyTexturePlacementPanel\" (localizedPanelLabel(\"UV Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"UV Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"renderWindowPanel\" (localizedPanelLabel(\"Render View\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Render View\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"shapePanel\" (localizedPanelLabel(\"Shape Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tshapePanel -edit -l (localizedPanelLabel(\"Shape Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextPanel \"posePanel\" (localizedPanelLabel(\"Pose Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tposePanel -edit -l (localizedPanelLabel(\"Pose Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n" + + "\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynRelEdPanel\" (localizedPanelLabel(\"Dynamic Relationships\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Dynamic Relationships\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"relationshipPanel\" (localizedPanelLabel(\"Relationship Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Relationship Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"referenceEditorPanel\" (localizedPanelLabel(\"Reference Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Reference Editor\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"dynPaintScriptedPanelType\" (localizedPanelLabel(\"Paint Effects\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Paint Effects\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"scriptEditorPanel\" (localizedPanelLabel(\"Script Editor\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Script Editor\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"profilerPanel\" (localizedPanelLabel(\"Profiler Tool\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Profiler Tool\")) -mbv $menusOkayInPanels $panelName;\n" + + "\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"contentBrowserPanel\" (localizedPanelLabel(\"Content Browser\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Content Browser\")) -mbv $menusOkayInPanels $panelName;\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\t$panelName = `sceneUIReplacement -getNextScriptedPanel \"Stereo\" (localizedPanelLabel(\"Stereo\")) `;\n\tif (\"\" != $panelName) {\n\t\t$label = `panel -q -label $panelName`;\n\t\tscriptedPanel -edit -l (localizedPanelLabel(\"Stereo\")) -mbv $menusOkayInPanels $panelName;\n{ string $editorName = ($panelName+\"Editor\");\n stereoCameraView -e \n -camera \"|persp\" \n -useInteractiveMode 0\n -displayLights \"default\" \n -displayAppearance \"wireframe\" \n -activeOnly 0\n -ignorePanZoom 0\n -wireframeOnShaded 0\n" + + " -headsUpDisplay 1\n -holdOuts 1\n -selectionHiliteDisplay 1\n -useDefaultMaterial 0\n -bufferMode \"double\" \n -twoSidedLighting 1\n -backfaceCulling 0\n -xray 0\n -jointXray 0\n -activeComponentsXray 0\n -displayTextures 0\n -smoothWireframe 0\n -lineWidth 1\n -textureAnisotropic 0\n -textureHilight 1\n -textureSampling 2\n -textureDisplay \"modulate\" \n -textureMaxSize 32768\n -fogging 0\n -fogSource \"fragment\" \n -fogMode \"linear\" \n -fogStart 0\n -fogEnd 100\n -fogDensity 0.1\n -fogColor 0.5 0.5 0.5 1 \n -depthOfFieldPreview 1\n -maxConstantTransparency 1\n -objectFilterShowInHUD 1\n -isFiltered 0\n -colorResolution 4 4 \n" + + " -bumpResolution 4 4 \n -textureCompression 0\n -transparencyAlgorithm \"frontAndBackCull\" \n -transpInShadows 0\n -cullingOverride \"none\" \n -lowQualityLighting 0\n -maximumNumHardwareLights 0\n -occlusionCulling 0\n -shadingModel 0\n -useBaseRenderer 0\n -useReducedRenderer 0\n -smallObjectCulling 0\n -smallObjectThreshold -1 \n -interactiveDisableShadows 0\n -interactiveBackFaceCull 0\n -sortTransparent 1\n -controllers 1\n -nurbsCurves 1\n -nurbsSurfaces 1\n -polymeshes 1\n -subdivSurfaces 1\n -planes 1\n -lights 1\n -cameras 1\n -controlVertices 1\n -hulls 1\n -grid 1\n -imagePlane 1\n -joints 1\n -ikHandles 1\n" + + " -deformers 1\n -dynamics 1\n -particleInstancers 1\n -fluids 1\n -hairSystems 1\n -follicles 1\n -nCloths 1\n -nParticles 1\n -nRigids 1\n -dynamicConstraints 1\n -locators 1\n -manipulators 1\n -pluginShapes 1\n -dimensions 1\n -handles 1\n -pivots 1\n -textures 1\n -strokes 1\n -motionTrails 1\n -clipGhosts 1\n -bluePencil 1\n -greasePencils 0\n -shadows 0\n -captureSequenceNumber -1\n -width 0\n -height 0\n -sceneRenderFilter 0\n -displayMode \"centerEye\" \n -viewColor 0 0 0 1 \n -useCustomBackground 1\n $editorName;\n stereoCameraView -e -viewSelected 0 $editorName;\n stereoCameraView -e \n" + + " -pluginObjects \"gpuCacheDisplayFilter\" 1 \n $editorName; };\n\t\tif (!$useSceneConfig) {\n\t\t\tpanel -e -l $label $panelName;\n\t\t}\n\t}\n\n\n\tif ($useSceneConfig) {\n string $configName = `getPanel -cwl (localizedPanelLabel(\"Current Layout\"))`;\n if (\"\" != $configName) {\n\t\t\tpanelConfiguration -edit -label (localizedPanelLabel(\"Current Layout\")) \n\t\t\t\t-userCreated false\n\t\t\t\t-defaultImage \"vacantCell.xP:/\"\n\t\t\t\t-image \"\"\n\t\t\t\t-sc false\n\t\t\t\t-configString \"global string $gMainPane; paneLayout -e -cn \\\"single\\\" -ps 1 100 100 $gMainPane;\"\n\t\t\t\t-removeAllPanels\n\t\t\t\t-ap false\n\t\t\t\t\t(localizedPanelLabel(\"Persp View\")) \n\t\t\t\t\t\"modelPanel\"\n" + + "\t\t\t\t\t\"$panelName = `modelPanel -unParent -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels `;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"all\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 1\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -bluePencil 1\\n -greasePencils 0\\n -excludeObjectPreset \\\"All\\\" \\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1755\\n -height 1067\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t\t\"modelPanel -edit -l (localizedPanelLabel(\\\"Persp View\\\")) -mbv $menusOkayInPanels $panelName;\\n$editorName = $panelName;\\nmodelEditor -e \\n -cam `findStartUpCamera persp` \\n -useInteractiveMode 0\\n -displayLights \\\"all\\\" \\n -displayAppearance \\\"smoothShaded\\\" \\n -activeOnly 0\\n -ignorePanZoom 0\\n -wireframeOnShaded 0\\n -headsUpDisplay 1\\n -holdOuts 1\\n -selectionHiliteDisplay 1\\n -useDefaultMaterial 0\\n -bufferMode \\\"double\\\" \\n -twoSidedLighting 0\\n -backfaceCulling 0\\n -xray 0\\n -jointXray 0\\n -activeComponentsXray 0\\n -displayTextures 1\\n -smoothWireframe 0\\n -lineWidth 1\\n -textureAnisotropic 0\\n -textureHilight 1\\n -textureSampling 2\\n -textureDisplay \\\"modulate\\\" \\n -textureMaxSize 32768\\n -fogging 0\\n -fogSource \\\"fragment\\\" \\n -fogMode \\\"linear\\\" \\n -fogStart 0\\n -fogEnd 100\\n -fogDensity 0.1\\n -fogColor 0.5 0.5 0.5 1 \\n -depthOfFieldPreview 1\\n -maxConstantTransparency 1\\n -rendererName \\\"vp2Renderer\\\" \\n -objectFilterShowInHUD 1\\n -isFiltered 0\\n -colorResolution 256 256 \\n -bumpResolution 512 512 \\n -textureCompression 0\\n -transparencyAlgorithm \\\"frontAndBackCull\\\" \\n -transpInShadows 0\\n -cullingOverride \\\"none\\\" \\n -lowQualityLighting 0\\n -maximumNumHardwareLights 1\\n -occlusionCulling 0\\n -shadingModel 0\\n -useBaseRenderer 0\\n -useReducedRenderer 0\\n -smallObjectCulling 0\\n -smallObjectThreshold -1 \\n -interactiveDisableShadows 0\\n -interactiveBackFaceCull 0\\n -sortTransparent 1\\n -controllers 1\\n -nurbsCurves 1\\n -nurbsSurfaces 1\\n -polymeshes 1\\n -subdivSurfaces 1\\n -planes 1\\n -lights 1\\n -cameras 1\\n -controlVertices 1\\n -hulls 1\\n -grid 1\\n -imagePlane 1\\n -joints 1\\n -ikHandles 1\\n -deformers 1\\n -dynamics 1\\n -particleInstancers 1\\n -fluids 1\\n -hairSystems 1\\n -follicles 1\\n -nCloths 1\\n -nParticles 1\\n -nRigids 1\\n -dynamicConstraints 1\\n -locators 1\\n -manipulators 1\\n -pluginShapes 1\\n -dimensions 1\\n -handles 1\\n -pivots 1\\n -textures 1\\n -strokes 1\\n -motionTrails 1\\n -clipGhosts 1\\n -bluePencil 1\\n -greasePencils 0\\n -excludeObjectPreset \\\"All\\\" \\n -shadows 0\\n -captureSequenceNumber -1\\n -width 1755\\n -height 1067\\n -sceneRenderFilter 0\\n $editorName;\\nmodelEditor -e -viewSelected 0 $editorName;\\nmodelEditor -e \\n -pluginObjects \\\"gpuCacheDisplayFilter\\\" 1 \\n $editorName\"\n" + + "\t\t\t\t$configName;\n\n setNamedPanelLayout (localizedPanelLabel(\"Current Layout\"));\n }\n\n panelHistory -e -clear mainPanelHistory;\n sceneUIReplacement -clear;\n\t}\n\n\ngrid -spacing 5 -size 12 -divisions 5 -displayAxes yes -displayGridLines yes -displayDivisionLines yes -displayPerspectiveLabels no -displayOrthographicLabels no -displayAxesBold yes -perspectiveLabelPosition axis -orthographicLabelPosition edge;\nviewManip -drawCompass 0 -compassAngle 0 -frontParameters \"\" -homeParameters \"\" -selectionLockParameters \"\";\n}\n"); + setAttr ".st" 3; +createNode script -n "sceneConfigurationScriptNode"; + rename -uid "FF9AE518-44EC-28DB-9F69-61AEB51B4431"; + setAttr ".b" -type "string" "playbackOptions -min 1 -max 120 -ast 1 -aet 200 "; + setAttr ".st" 6; +createNode openPBRSurface -n "openPBRSurface2"; + rename -uid "1C1AA3A4-471B-020C-B9BB-9493742690C6"; + setAttr ".bc" -type "float3" 1 1 0 ; + setAttr ".s" 0.7630000114440918; + setAttr ".sub" 0.49399998784065247; + setAttr ".subc" -type "float3" 0 1 1 ; + setAttr ".ct" 0.65600001811981201; + setAttr ".ctc" -type "float3" 1 0 1 ; + setAttr ".ctdk" 0.15999999642372131; +createNode shadingEngine -n "openPBRSurface2SG"; + rename -uid "E980C77F-4333-5027-7314-F5A57CC75B07"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo25"; + rename -uid "46896CEF-41FD-3759-9250-A385077A2C06"; +createNode openPBRSurface -n "openPBRSurface3"; + rename -uid "9F343758-459C-E4A1-AD85-1B93F26E5B99"; + setAttr ".b" 0; + setAttr ".s" 0; + setAttr ".ct" 0.5; + setAttr ".ctc" -type "float3" 1 0 0 ; + setAttr ".elu" 500; + setAttr ".ec" -type "float3" 1 1 0 ; +createNode shadingEngine -n "openPBRSurface3SG"; + rename -uid "B274EDD4-4C01-EEAF-1D34-93B3474A2F5F"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo26"; + rename -uid "6DC91661-48DF-0F6C-A987-20A2FC026BA0"; +createNode openPBRSurface -n "openPBRSurface4"; + rename -uid "90E2AF31-456A-29A0-A778-9FBCB2EAEAEC"; + setAttr ".bc" -type "float3" 0.80000001 0.80000001 0 ; + setAttr ".ct" 0.5; + setAttr ".ctc" -type "float3" 1 0 0 ; + setAttr ".ctdk" 0; +createNode shadingEngine -n "openPBRSurface4SG"; + rename -uid "F0A1734D-44DD-98E3-44E3-CFB73A9CAA39"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo27"; + rename -uid "29E71088-408F-C77A-A2ED-7EBFFE3F644F"; +createNode openPBRSurface -n "openPBRSurface5"; + rename -uid "A201DAD8-4C2E-D4D6-1510-5AB8D6720B61"; + setAttr ".fw" 0.5; + setAttr ".fzc" -type "float3" 0 1 0 ; + setAttr ".fzr" 1; +createNode shadingEngine -n "openPBRSurface5SG"; + rename -uid "68D17106-45C5-C557-343F-42AFFD0A7810"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo28"; + rename -uid "2628C62A-4941-1E9A-6041-83AB7293BD05"; +createNode openPBRSurface -n "openPBRSurface6"; + rename -uid "BF404FF3-4C86-6FEB-F4FE-7E8137A9BB44"; + setAttr ".b" 0; + setAttr ".ct" 0.5; + setAttr ".ctc" -type "float3" 0 1 1 ; + setAttr ".elu" 500; +createNode shadingEngine -n "openPBRSurface6SG"; + rename -uid "91E7BB65-4BC6-8F37-B1A9-DC900CD97C70"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo29"; + rename -uid "14BBD5B3-4F40-FE07-7675-9EA537216DFC"; +createNode openPBRSurface -n "openPBRSurface7"; + rename -uid "7544193C-4147-2EE5-5932-F18A6BF170EE"; +createNode shadingEngine -n "openPBRSurface7SG"; + rename -uid "19DE6D6B-4BA5-2855-74AB-799E2BBB3E2C"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo30"; + rename -uid "F5258A64-429E-17A5-10FD-C08F3DDF88D0"; +createNode openPBRSurface -n "openPBRSurface8"; + rename -uid "D0902BE7-44B8-8337-9A87-3D9A0A1F4D38"; +createNode shadingEngine -n "openPBRSurface8SG"; + rename -uid "4B46FA03-457E-A34D-070A-1C850A334576"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo31"; + rename -uid "317F80DF-4DBB-B48F-3A22-068962FF9D88"; +createNode openPBRSurface -n "openPBRSurface9"; + rename -uid "9C211ECB-43B2-919D-02D5-C7A2C5CDF537"; +createNode shadingEngine -n "openPBRSurface9SG"; + rename -uid "5F3DCDBD-43E0-31FB-E049-1499CDDCF1DA"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo32"; + rename -uid "925ACE28-4C04-FC01-298E-C994C809617A"; +createNode openPBRSurface -n "openPBRSurface10"; + rename -uid "3A3FE736-4E51-90CC-1739-448B1B300DED"; + setAttr ".ctc" -type "float3" 1 1 0 ; +createNode shadingEngine -n "openPBRSurface10SG"; + rename -uid "D4B2A6E1-49BA-062A-86F0-89B6E24197E2"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo33"; + rename -uid "F05D704C-470C-A1A8-1179-5D8305DBFBBA"; +createNode openPBRSurface -n "openPBRSurface11"; + rename -uid "D3ECB226-41F5-15F9-B3D9-F5A12919C998"; + setAttr ".ct" 0.5; + setAttr ".ctc" -type "float3" 1 1 0 ; +createNode shadingEngine -n "openPBRSurface11SG"; + rename -uid "18F280F9-4A5F-6303-0947-F494F804811E"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "materialInfo34"; + rename -uid "12A59E0E-4A6C-10A6-67B9-F0BFE2728D42"; +createNode file -n "file25"; + rename -uid "22D5F3EA-4F0A-31DA-C035-F9BDC47836C1"; + setAttr ".ftn" -type "string" "textures/grid.png"; + setAttr ".ft" 0; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "place2dTexture25"; + rename -uid "C0BB2B3C-49F3-A7A0-4983-C5A1C4D53267"; +createNode file -n "file26"; + rename -uid "C3483834-4885-7581-4710-A8A2FAF30E9B"; + setAttr ".ftn" -type "string" "textures/grid.png"; + setAttr ".ft" 0; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "place2dTexture26"; + rename -uid "DECAE214-4623-6A5B-B54A-78A2FDC74FE8"; +createNode file -n "file27"; + rename -uid "F29488DD-4D6E-1A62-1608-FF9DE3674C5B"; + setAttr ".ftn" -type "string" "textures/Mono.png"; + setAttr ".ft" 0; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "place2dTexture27"; + rename -uid "12A0D6AB-4B85-44B2-401D-CBB63709233D"; +createNode file -n "file28"; + rename -uid "7FB0A196-488B-6311-2E70-B0817B5BCB59"; + setAttr ".ftn" -type "string" "textures/Mono.png"; + setAttr ".ft" 0; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "place2dTexture28"; + rename -uid "DB2B1E21-4D9A-4914-F73E-A7A5EA039516"; +createNode file -n "file29"; + rename -uid "2E8C96C2-4C75-CEAC-1989-BCB3F4D2B6BB"; + setAttr ".ftn" -type "string" "textures/Mono.png"; + setAttr ".ft" 0; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "place2dTexture29"; + rename -uid "82103CE4-4003-AC22-FC2C-CC9B996D8D12"; +createNode file -n "file30"; + rename -uid "BCA41936-4FAC-70C3-A1D2-95860CFFE894"; + setAttr ".ftn" -type "string" "textures/Mono.png"; + setAttr ".ft" 0; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "place2dTexture30"; + rename -uid "571A82AE-41C1-09D8-A440-4FA8BA964988"; +createNode file -n "file31"; + rename -uid "9F043626-47A6-1345-2F4B-E3AAAEA83BAD"; + setAttr ".ftn" -type "string" "textures/Mono.png"; + setAttr ".ft" 0; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "place2dTexture31"; + rename -uid "3F631394-42D7-80BE-17A8-9581D147ED10"; +createNode file -n "file32"; + rename -uid "9D026D2F-4CAB-8CDF-BEC8-0C88FD071B27"; + setAttr ".cg" -type "float3" -1 -1 -1 ; + setAttr ".co" -type "float3" 1 1 1 ; + setAttr ".ftn" -type "string" "textures/Mono.png"; + setAttr ".ft" 0; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "place2dTexture32"; + rename -uid "00F0735A-4E1E-6036-71B2-77931933670A"; +createNode bump2d -n "bump2d1"; + rename -uid "2A0A051C-459D-0476-FD85-CDAD3A8AD862"; + setAttr ".bi" 2; + setAttr ".vc1" -type "float3" 0 9.9999997e-06 0 ; + setAttr ".vc2" -type "float3" 9.9999997e-06 9.9999997e-06 0 ; +createNode file -n "file33"; + rename -uid "E023B691-4C81-3481-D284-28B00B7B415E"; + setAttr ".ail" yes; + setAttr ".ftn" -type "string" "textures/normalSpiral.png"; + setAttr ".ft" 0; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "place2dTexture33"; + rename -uid "B6D58200-48D9-685B-3AE3-EB9BCB9F4F8C"; +createNode openPBRSurface -n "WIP1:openPBRSurface2"; + rename -uid "33AEEAD7-4B43-18DF-2C24-DD875FEF5600"; + setAttr ".bc" -type "float3" 0.48172641 0.34399998 0.49399999 ; + setAttr ".sr" 0.10319999605417252; + setAttr ".ct" 0.43733334541320801; +createNode file -n "WIP1:file32"; + rename -uid "F3CEE03B-42CF-152A-9746-668A31C50CD3"; + setAttr ".cg" -type "float3" -1 -1 -1 ; + setAttr ".co" -type "float3" 1 1 1 ; + setAttr ".ftn" -type "string" "C:\\ws\\MayaUSD\\ecg-maya-usd\\maya-usd\\test\\testSamples\\MaterialX\\textures\\Mono.png"; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "WIP1:place2dTexture"; + rename -uid "8F2D9BD1-4020-8C35-C2C8-DEAED71357F1"; +createNode shadingEngine -n "WIP1:openPBRSurface2SG"; + rename -uid "694AE5F0-4D17-E1D5-77AE-8BAE1B7AB800"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "WIP1:materialInfo1"; + rename -uid "402DC8D5-458E-058D-94FC-9F91F51ACE74"; +createNode openPBRSurface -n "WIP1:openPBRSurface3"; + rename -uid "B18F1F2C-4549-FBE6-40EF-D89AE0BD57F7"; + setAttr ".bc" -type "float3" 0 0 0 ; + setAttr ".sr" 0.15000000596046448; + setAttr ".ct" 0.1666666716337204; + setAttr ".elu" 1000; + setAttr ".ec" -type "float3" 0.5 0.25 0 ; +createNode shadingEngine -n "WIP1:openPBRSurface3SG"; + rename -uid "3F05934D-4411-2D4E-54D3-E78EBBF7CB25"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "WIP1:materialInfo2"; + rename -uid "6F4A9D98-4A7A-64F2-4032-F3B655CAB09D"; +createNode openPBRSurface -n "WIP1:openPBRSurface4"; + rename -uid "669EABE0-4738-5531-703C-9E83CAB6979F"; + setAttr ".bc" -type "float3" 0.61206561 0.30603281 0 ; + setAttr ".sr" 0.15000000596046448; + setAttr ".ct" 0.1666666716337204; +createNode shadingEngine -n "WIP1:openPBRSurface4SG"; + rename -uid "6A26179D-4E9E-42A0-057D-D9890A59B183"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "WIP1:materialInfo3"; + rename -uid "1B85CBA7-4079-9E9B-1777-7AA5C2E5EA0C"; +createNode openPBRSurface -n "WIP1:openPBRSurface5"; + rename -uid "586D9979-4403-7A38-2612-D48C1CE3F37F"; +createNode file -n "WIP1:file25"; + rename -uid "54182146-459A-4200-9A45-3A8A21AC7CAC"; + setAttr ".ftn" -type "string" "C:\\ws\\MayaUSD\\ecg-maya-usd\\maya-usd\\test\\testSamples\\MaterialX\\textures\\grid.png"; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "WIP1:place2dTexture1"; + rename -uid "02505DCD-4363-D464-16A5-B5BACC849259"; +createNode shadingEngine -n "WIP1:openPBRSurface5SG"; + rename -uid "FACD2B96-4EFD-552C-4C06-B6B837CABA4F"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "WIP1:materialInfo4"; + rename -uid "6E1298C1-44EF-D989-008E-D7BF01A44128"; +createNode openPBRSurface -n "WIP1:openPBRSurface6"; + rename -uid "F0D337F5-4950-F57E-FB2C-DB90BD6C217D"; + setAttr ".bc" -type "float3" 0 0 0 ; + setAttr ".sr" 0.15000000596046448; + setAttr ".ct" 0.3333333432674408; + setAttr ".elu" 1000; +createNode file -n "WIP1:file26"; + rename -uid "4B5FA0E5-4AE9-9385-18EC-F38FA05148A3"; + setAttr ".ftn" -type "string" "C:\\ws\\MayaUSD\\ecg-maya-usd\\maya-usd\\test\\testSamples\\MaterialX\\textures\\grid.png"; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "WIP1:place2dTexture2"; + rename -uid "23A60384-4685-AE01-E6A4-A19A05E85C01"; +createNode shadingEngine -n "WIP1:openPBRSurface6SG"; + rename -uid "0F2B99B9-4F7A-460F-D769-D38D70EEB08A"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "WIP1:materialInfo5"; + rename -uid "C2D4D8D0-4ACC-EADD-CE25-65AAE1A7D54F"; +createNode openPBRSurface -n "WIP1:openPBRSurface7"; + rename -uid "DFFC27FE-4B15-1DE1-EABB-3FBFD7CBEF29"; + setAttr ".bc" -type "float3" 0.61206561 0.61206561 0.61206561 ; +createNode file -n "WIP1:file27"; + rename -uid "D7763D7A-46B6-6E32-D40D-B7A9238D9E15"; + setAttr ".ftn" -type "string" "C:\\ws\\MayaUSD\\ecg-maya-usd\\maya-usd\\test\\testSamples\\MaterialX\\textures\\Mono.png"; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "WIP1:place2dTexture3"; + rename -uid "F167AD63-47C9-96A3-8D2D-1BA5191055B3"; +createNode shadingEngine -n "WIP1:openPBRSurface7SG"; + rename -uid "8DD76F0B-4CF3-6995-616B-3AA765EE75CB"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "WIP1:materialInfo6"; + rename -uid "555C7A36-47D5-AD61-C6EB-81861FC46903"; +createNode openPBRSurface -n "WIP1:openPBRSurface8"; + rename -uid "7EEA0E15-47C9-AE96-DFAE-A19BA88364D2"; + setAttr ".bc" -type "float3" 0.61206561 0.61206561 0.61206561 ; +createNode file -n "WIP1:file28"; + rename -uid "42AA90FA-4A66-7A20-60E6-4BA431829788"; + setAttr ".ftn" -type "string" "C:\\ws\\MayaUSD\\ecg-maya-usd\\maya-usd\\test\\testSamples\\MaterialX\\textures\\Mono.png"; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "WIP1:place2dTexture4"; + rename -uid "600D94B2-412E-DB83-5F04-BE9ABDF40301"; +createNode shadingEngine -n "WIP1:openPBRSurface8SG"; + rename -uid "2CFBB270-4297-D75B-E2A4-E39048A7E981"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "WIP1:materialInfo7"; + rename -uid "50266890-4D08-C0B3-06E9-619CE5FB91E1"; +createNode openPBRSurface -n "WIP1:openPBRSurface9"; + rename -uid "1CC39550-4A04-D02E-CAA6-87A54288AD88"; + setAttr ".bc" -type "float3" 0.61206561 0.61206561 0.61206561 ; +createNode file -n "WIP1:file29"; + rename -uid "E2BD2155-4229-8C8A-54F6-2186E7CC6425"; + setAttr ".ftn" -type "string" "C:\\ws\\MayaUSD\\ecg-maya-usd\\maya-usd\\test\\testSamples\\MaterialX\\textures\\Mono.png"; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "WIP1:place2dTexture5"; + rename -uid "65DF62F3-4BDA-6CC9-7D99-1EA75021EE7E"; +createNode shadingEngine -n "WIP1:openPBRSurface9SG"; + rename -uid "9E29C1C5-4D16-23DF-A948-099C034332EA"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "WIP1:materialInfo8"; + rename -uid "A0B6AAA4-4FC4-B9E8-3177-1EB204DB3F12"; +createNode openPBRSurface -n "WIP1:openPBRSurface10"; + rename -uid "D034DB93-429B-D44C-9258-B89DAD0C9F90"; + setAttr ".bc" -type "float3" 0.61206561 0.61206561 0.61206561 ; +createNode file -n "WIP1:file30"; + rename -uid "5F03BBA3-4E81-3687-E75C-E19C1C50BC01"; + setAttr ".ftn" -type "string" "C:\\ws\\MayaUSD\\ecg-maya-usd\\maya-usd\\test\\testSamples\\MaterialX\\textures\\Mono.png"; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "WIP1:place2dTexture6"; + rename -uid "B238F17A-4F5E-B081-3075-7EBABA5AA000"; +createNode shadingEngine -n "WIP1:openPBRSurface10SG"; + rename -uid "C8C81575-4468-3478-5BAE-FFB48B20BE6C"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "WIP1:materialInfo9"; + rename -uid "6B59547A-41D9-3910-C6FE-BCB0615BA152"; +createNode openPBRSurface -n "WIP1:openPBRSurface11"; + rename -uid "0A990F1F-456D-6E1E-1D6A-66ACC1E4EC74"; + setAttr ".bc" -type "float3" 0.49027449 0.49027449 0.24513724 ; + setAttr ".sr" 0.15000000596046448; + setAttr ".ct" 0.3333333432674408; +createNode file -n "WIP1:file31"; + rename -uid "84E56ECA-456F-440A-FCE7-DDB60A6F0449"; + setAttr ".ftn" -type "string" "C:\\ws\\MayaUSD\\ecg-maya-usd\\maya-usd\\test\\testSamples\\MaterialX\\textures\\Mono.png"; + setAttr ".cs" -type "string" "sRGB"; +createNode place2dTexture -n "WIP1:place2dTexture7"; + rename -uid "174ED800-47E2-999A-DA9E-92A7DECAC4A0"; +createNode shadingEngine -n "WIP1:openPBRSurface11SG"; + rename -uid "9555BE4E-4A77-AF60-D6F9-1D8AC85F3C31"; + setAttr ".ihi" 0; + setAttr ".ro" yes; +createNode materialInfo -n "WIP1:materialInfo10"; + rename -uid "9D4FD75F-4375-AB6B-9FD5-10B433A439F7"; +createNode nodeGraphEditorInfo -n "hyperShadePrimaryNodeEditorSavedTabsInfo"; + rename -uid "C47505B5-4C8E-7D56-AA95-2D9624CD4E6F"; + setAttr ".tgi[0].tn" -type "string" "Untitled_1"; + setAttr ".tgi[0].vl" -type "double2" -932.43649669505271 236.18308854761577 ; + setAttr ".tgi[0].vh" -type "double2" 418.20285720547633 1609.126578567603 ; + setAttr -s 4 ".tgi[0].ni"; + setAttr ".tgi[0].ni[0].x" -817.14288330078125; + setAttr ".tgi[0].ni[0].y" 1145.7142333984375; + setAttr ".tgi[0].ni[0].nvs" 1923; + setAttr ".tgi[0].ni[1].x" -202.85714721679688; + setAttr ".tgi[0].ni[1].y" 1235.7142333984375; + setAttr ".tgi[0].ni[1].nvs" 1971; + setAttr ".tgi[0].ni[2].x" -510; + setAttr ".tgi[0].ni[2].y" 1168.5714111328125; + setAttr ".tgi[0].ni[2].nvs" 1923; + setAttr ".tgi[0].ni[3].x" 108.57142639160156; + setAttr ".tgi[0].ni[3].y" 1212.857177734375; + setAttr ".tgi[0].ni[3].nvs" 1923; +select -ne :time1; + setAttr ".o" 82; + setAttr ".unw" 82; +select -ne :hardwareRenderingGlobals; + setAttr ".otfna" -type "stringArray" 22 "NURBS Curves" "NURBS Surfaces" "Polygons" "Subdiv Surface" "Particles" "Particle Instance" "Fluids" "Strokes" "Image Planes" "UI" "Lights" "Cameras" "Locators" "Joints" "IK Handles" "Deformers" "Motion Trails" "Components" "Hair Systems" "Follicles" "Misc. UI" "Ornaments" ; + setAttr ".otfva" -type "Int32Array" 22 0 1 1 1 1 1 + 1 1 1 0 0 0 0 0 0 0 0 0 + 0 0 0 0 ; + setAttr ".dli" 1; + setAttr ".fprt" yes; + setAttr ".rtfm" 1; +select -ne :renderPartition; + setAttr -s 22 ".st"; +select -ne :renderGlobalsList1; +select -ne :defaultShaderList1; + setAttr -s 26 ".s"; +select -ne :postProcessList1; + setAttr -s 2 ".p"; +select -ne :defaultRenderUtilityList1; + setAttr -s 18 ".u"; +select -ne :defaultRenderingList1; +select -ne :lightList1; +select -ne :defaultTextureList1; + setAttr -s 17 ".tx"; +select -ne :standardSurface1; + setAttr ".bc" -type "float3" 0.40000001 0.40000001 0.40000001 ; + setAttr ".sr" 0.5; +select -ne :openPBRSurface1; + setAttr ".bc" -type "float3" 0.40000001 0.40000001 0.40000001 ; + setAttr ".sr" 0.5; +select -ne :initialShadingGroup; + setAttr ".ro" yes; +select -ne :initialParticleSE; + setAttr ".ro" yes; +select -ne :defaultRenderGlobals; + addAttr -ci true -h true -sn "dss" -ln "defaultSurfaceShader" -dt "string"; + setAttr ".dss" -type "string" "lambert1"; +select -ne :defaultResolution; + setAttr ".pa" 1; +select -ne :defaultLightSet; +select -ne :defaultColorMgtGlobals; + setAttr ".cfe" yes; + setAttr ".cfp" -type "string" "/OCIO-configs/Maya2022-default/config.ocio"; + setAttr ".vtn" -type "string" "ACES 1.0 SDR-video (sRGB)"; + setAttr ".vn" -type "string" "ACES 1.0 SDR-video"; + setAttr ".dn" -type "string" "sRGB"; + setAttr ".wsn" -type "string" "ACEScg"; + setAttr ".otn" -type "string" "ACES 1.0 SDR-video (sRGB)"; + setAttr ".potn" -type "string" "ACES 1.0 SDR-video (sRGB)"; +select -ne :hardwareRenderGlobals; + setAttr ".ctrs" 256; + setAttr ".btrs" 512; +connectAttr "polyPlane1.out" "pPlaneShape1.i"; +relationship "link" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "openPBRSurface2SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "openPBRSurface3SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "openPBRSurface4SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "openPBRSurface5SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "openPBRSurface6SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "openPBRSurface7SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "openPBRSurface8SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "openPBRSurface9SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "openPBRSurface10SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "openPBRSurface11SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "WIP1:openPBRSurface2SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "WIP1:openPBRSurface3SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "WIP1:openPBRSurface4SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "WIP1:openPBRSurface5SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "WIP1:openPBRSurface6SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "WIP1:openPBRSurface7SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "WIP1:openPBRSurface8SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "WIP1:openPBRSurface9SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "WIP1:openPBRSurface10SG.message" ":defaultLightSet.message"; +relationship "link" ":lightLinker1" "WIP1:openPBRSurface11SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialShadingGroup.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" ":initialParticleSE.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "openPBRSurface2SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "openPBRSurface3SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "openPBRSurface4SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "openPBRSurface5SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "openPBRSurface6SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "openPBRSurface7SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "openPBRSurface8SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "openPBRSurface9SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "openPBRSurface10SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "openPBRSurface11SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "WIP1:openPBRSurface2SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "WIP1:openPBRSurface3SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "WIP1:openPBRSurface4SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "WIP1:openPBRSurface5SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "WIP1:openPBRSurface6SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "WIP1:openPBRSurface7SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "WIP1:openPBRSurface8SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "WIP1:openPBRSurface9SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "WIP1:openPBRSurface10SG.message" ":defaultLightSet.message"; +relationship "shadowLink" ":lightLinker1" "WIP1:openPBRSurface11SG.message" ":defaultLightSet.message"; +connectAttr "layerManager.dli[0]" "defaultLayer.id"; +connectAttr "renderLayerManager.rlmi[0]" "defaultRenderLayer.rlid"; +connectAttr ":lightLinker1.msg" "MayaNodeEditorSavedTabsInfo.tgi[0].ni[3].dn"; +connectAttr ":renderPartition.msg" "MayaNodeEditorSavedTabsInfo.tgi[0].ni[5].dn" + ; +connectAttr "file32.ocr" "openPBRSurface2.geop"; +connectAttr "openPBRSurface2.oc" "openPBRSurface2SG.ss"; +connectAttr "pPlaneShape1.iog" "openPBRSurface2SG.dsm" -na; +connectAttr "openPBRSurface2SG.msg" "materialInfo25.sg"; +connectAttr "openPBRSurface2.msg" "materialInfo25.m"; +connectAttr "openPBRSurface3.oc" "openPBRSurface3SG.ss"; +connectAttr "pPlaneShape2.iog" "openPBRSurface3SG.dsm" -na; +connectAttr "openPBRSurface3SG.msg" "materialInfo26.sg"; +connectAttr "openPBRSurface3.msg" "materialInfo26.m"; +connectAttr "bump2d1.o" "openPBRSurface4.n"; +connectAttr "openPBRSurface4.oc" "openPBRSurface4SG.ss"; +connectAttr "pPlaneShape3.iog" "openPBRSurface4SG.dsm" -na; +connectAttr "openPBRSurface4SG.msg" "materialInfo27.sg"; +connectAttr "openPBRSurface4.msg" "materialInfo27.m"; +connectAttr "file25.oc" "openPBRSurface5.bc"; +connectAttr "openPBRSurface5.oc" "openPBRSurface5SG.ss"; +connectAttr "pPlaneShape4.iog" "openPBRSurface5SG.dsm" -na; +connectAttr "openPBRSurface5SG.msg" "materialInfo28.sg"; +connectAttr "openPBRSurface5.msg" "materialInfo28.m"; +connectAttr "file25.msg" "materialInfo28.t" -na; +connectAttr "file26.oc" "openPBRSurface6.ec"; +connectAttr "openPBRSurface6.oc" "openPBRSurface6SG.ss"; +connectAttr "pPlaneShape5.iog" "openPBRSurface6SG.dsm" -na; +connectAttr "openPBRSurface6SG.msg" "materialInfo29.sg"; +connectAttr "openPBRSurface6.msg" "materialInfo29.m"; +connectAttr "file27.ocr" "openPBRSurface7.m"; +connectAttr "openPBRSurface7.oc" "openPBRSurface7SG.ss"; +connectAttr "pPlaneShape11.iog" "openPBRSurface7SG.dsm" -na; +connectAttr "openPBRSurface7SG.msg" "materialInfo30.sg"; +connectAttr "openPBRSurface7.msg" "materialInfo30.m"; +connectAttr "file28.ocr" "openPBRSurface8.sior"; +connectAttr "openPBRSurface8.oc" "openPBRSurface8SG.ss"; +connectAttr "pPlaneShape12.iog" "openPBRSurface8SG.dsm" -na; +connectAttr "openPBRSurface8SG.msg" "materialInfo31.sg"; +connectAttr "openPBRSurface8.msg" "materialInfo31.m"; +connectAttr "file29.ocr" "openPBRSurface9.sr"; +connectAttr "openPBRSurface9.oc" "openPBRSurface9SG.ss"; +connectAttr "pPlaneShape13.iog" "openPBRSurface9SG.dsm" -na; +connectAttr "openPBRSurface9SG.msg" "materialInfo32.sg"; +connectAttr "openPBRSurface9.msg" "materialInfo32.m"; +connectAttr "file30.ocr" "openPBRSurface10.ct"; +connectAttr "openPBRSurface10.oc" "openPBRSurface10SG.ss"; +connectAttr "pPlaneShape14.iog" "openPBRSurface10SG.dsm" -na; +connectAttr "openPBRSurface10SG.msg" "materialInfo33.sg"; +connectAttr "openPBRSurface10.msg" "materialInfo33.m"; +connectAttr "file31.ocr" "openPBRSurface11.ctr"; +connectAttr "openPBRSurface11.oc" "openPBRSurface11SG.ss"; +connectAttr "pPlaneShape15.iog" "openPBRSurface11SG.dsm" -na; +connectAttr "openPBRSurface11SG.msg" "materialInfo34.sg"; +connectAttr "openPBRSurface11.msg" "materialInfo34.m"; +connectAttr ":defaultColorMgtGlobals.cme" "file25.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "file25.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "file25.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "file25.ws"; +connectAttr "place2dTexture25.c" "file25.c"; +connectAttr "place2dTexture25.tf" "file25.tf"; +connectAttr "place2dTexture25.rf" "file25.rf"; +connectAttr "place2dTexture25.mu" "file25.mu"; +connectAttr "place2dTexture25.mv" "file25.mv"; +connectAttr "place2dTexture25.s" "file25.s"; +connectAttr "place2dTexture25.wu" "file25.wu"; +connectAttr "place2dTexture25.wv" "file25.wv"; +connectAttr "place2dTexture25.re" "file25.re"; +connectAttr "place2dTexture25.of" "file25.of"; +connectAttr "place2dTexture25.r" "file25.ro"; +connectAttr "place2dTexture25.n" "file25.n"; +connectAttr "place2dTexture25.vt1" "file25.vt1"; +connectAttr "place2dTexture25.vt2" "file25.vt2"; +connectAttr "place2dTexture25.vt3" "file25.vt3"; +connectAttr "place2dTexture25.vc1" "file25.vc1"; +connectAttr "place2dTexture25.o" "file25.uv"; +connectAttr "place2dTexture25.ofs" "file25.fs"; +connectAttr ":defaultColorMgtGlobals.cme" "file26.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "file26.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "file26.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "file26.ws"; +connectAttr "place2dTexture26.c" "file26.c"; +connectAttr "place2dTexture26.tf" "file26.tf"; +connectAttr "place2dTexture26.rf" "file26.rf"; +connectAttr "place2dTexture26.mu" "file26.mu"; +connectAttr "place2dTexture26.mv" "file26.mv"; +connectAttr "place2dTexture26.s" "file26.s"; +connectAttr "place2dTexture26.wu" "file26.wu"; +connectAttr "place2dTexture26.wv" "file26.wv"; +connectAttr "place2dTexture26.re" "file26.re"; +connectAttr "place2dTexture26.of" "file26.of"; +connectAttr "place2dTexture26.r" "file26.ro"; +connectAttr "place2dTexture26.n" "file26.n"; +connectAttr "place2dTexture26.vt1" "file26.vt1"; +connectAttr "place2dTexture26.vt2" "file26.vt2"; +connectAttr "place2dTexture26.vt3" "file26.vt3"; +connectAttr "place2dTexture26.vc1" "file26.vc1"; +connectAttr "place2dTexture26.o" "file26.uv"; +connectAttr "place2dTexture26.ofs" "file26.fs"; +connectAttr ":defaultColorMgtGlobals.cme" "file27.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "file27.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "file27.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "file27.ws"; +connectAttr "place2dTexture27.c" "file27.c"; +connectAttr "place2dTexture27.tf" "file27.tf"; +connectAttr "place2dTexture27.rf" "file27.rf"; +connectAttr "place2dTexture27.mu" "file27.mu"; +connectAttr "place2dTexture27.mv" "file27.mv"; +connectAttr "place2dTexture27.s" "file27.s"; +connectAttr "place2dTexture27.wu" "file27.wu"; +connectAttr "place2dTexture27.wv" "file27.wv"; +connectAttr "place2dTexture27.re" "file27.re"; +connectAttr "place2dTexture27.of" "file27.of"; +connectAttr "place2dTexture27.r" "file27.ro"; +connectAttr "place2dTexture27.n" "file27.n"; +connectAttr "place2dTexture27.vt1" "file27.vt1"; +connectAttr "place2dTexture27.vt2" "file27.vt2"; +connectAttr "place2dTexture27.vt3" "file27.vt3"; +connectAttr "place2dTexture27.vc1" "file27.vc1"; +connectAttr "place2dTexture27.o" "file27.uv"; +connectAttr "place2dTexture27.ofs" "file27.fs"; +connectAttr ":defaultColorMgtGlobals.cme" "file28.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "file28.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "file28.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "file28.ws"; +connectAttr "place2dTexture28.c" "file28.c"; +connectAttr "place2dTexture28.tf" "file28.tf"; +connectAttr "place2dTexture28.rf" "file28.rf"; +connectAttr "place2dTexture28.mu" "file28.mu"; +connectAttr "place2dTexture28.mv" "file28.mv"; +connectAttr "place2dTexture28.s" "file28.s"; +connectAttr "place2dTexture28.wu" "file28.wu"; +connectAttr "place2dTexture28.wv" "file28.wv"; +connectAttr "place2dTexture28.re" "file28.re"; +connectAttr "place2dTexture28.of" "file28.of"; +connectAttr "place2dTexture28.r" "file28.ro"; +connectAttr "place2dTexture28.n" "file28.n"; +connectAttr "place2dTexture28.vt1" "file28.vt1"; +connectAttr "place2dTexture28.vt2" "file28.vt2"; +connectAttr "place2dTexture28.vt3" "file28.vt3"; +connectAttr "place2dTexture28.vc1" "file28.vc1"; +connectAttr "place2dTexture28.o" "file28.uv"; +connectAttr "place2dTexture28.ofs" "file28.fs"; +connectAttr ":defaultColorMgtGlobals.cme" "file29.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "file29.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "file29.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "file29.ws"; +connectAttr "place2dTexture29.c" "file29.c"; +connectAttr "place2dTexture29.tf" "file29.tf"; +connectAttr "place2dTexture29.rf" "file29.rf"; +connectAttr "place2dTexture29.mu" "file29.mu"; +connectAttr "place2dTexture29.mv" "file29.mv"; +connectAttr "place2dTexture29.s" "file29.s"; +connectAttr "place2dTexture29.wu" "file29.wu"; +connectAttr "place2dTexture29.wv" "file29.wv"; +connectAttr "place2dTexture29.re" "file29.re"; +connectAttr "place2dTexture29.of" "file29.of"; +connectAttr "place2dTexture29.r" "file29.ro"; +connectAttr "place2dTexture29.n" "file29.n"; +connectAttr "place2dTexture29.vt1" "file29.vt1"; +connectAttr "place2dTexture29.vt2" "file29.vt2"; +connectAttr "place2dTexture29.vt3" "file29.vt3"; +connectAttr "place2dTexture29.vc1" "file29.vc1"; +connectAttr "place2dTexture29.o" "file29.uv"; +connectAttr "place2dTexture29.ofs" "file29.fs"; +connectAttr ":defaultColorMgtGlobals.cme" "file30.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "file30.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "file30.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "file30.ws"; +connectAttr "place2dTexture30.c" "file30.c"; +connectAttr "place2dTexture30.tf" "file30.tf"; +connectAttr "place2dTexture30.rf" "file30.rf"; +connectAttr "place2dTexture30.mu" "file30.mu"; +connectAttr "place2dTexture30.mv" "file30.mv"; +connectAttr "place2dTexture30.s" "file30.s"; +connectAttr "place2dTexture30.wu" "file30.wu"; +connectAttr "place2dTexture30.wv" "file30.wv"; +connectAttr "place2dTexture30.re" "file30.re"; +connectAttr "place2dTexture30.of" "file30.of"; +connectAttr "place2dTexture30.r" "file30.ro"; +connectAttr "place2dTexture30.n" "file30.n"; +connectAttr "place2dTexture30.vt1" "file30.vt1"; +connectAttr "place2dTexture30.vt2" "file30.vt2"; +connectAttr "place2dTexture30.vt3" "file30.vt3"; +connectAttr "place2dTexture30.vc1" "file30.vc1"; +connectAttr "place2dTexture30.o" "file30.uv"; +connectAttr "place2dTexture30.ofs" "file30.fs"; +connectAttr ":defaultColorMgtGlobals.cme" "file31.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "file31.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "file31.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "file31.ws"; +connectAttr "place2dTexture31.c" "file31.c"; +connectAttr "place2dTexture31.tf" "file31.tf"; +connectAttr "place2dTexture31.rf" "file31.rf"; +connectAttr "place2dTexture31.mu" "file31.mu"; +connectAttr "place2dTexture31.mv" "file31.mv"; +connectAttr "place2dTexture31.s" "file31.s"; +connectAttr "place2dTexture31.wu" "file31.wu"; +connectAttr "place2dTexture31.wv" "file31.wv"; +connectAttr "place2dTexture31.re" "file31.re"; +connectAttr "place2dTexture31.of" "file31.of"; +connectAttr "place2dTexture31.r" "file31.ro"; +connectAttr "place2dTexture31.n" "file31.n"; +connectAttr "place2dTexture31.vt1" "file31.vt1"; +connectAttr "place2dTexture31.vt2" "file31.vt2"; +connectAttr "place2dTexture31.vt3" "file31.vt3"; +connectAttr "place2dTexture31.vc1" "file31.vc1"; +connectAttr "place2dTexture31.o" "file31.uv"; +connectAttr "place2dTexture31.ofs" "file31.fs"; +connectAttr ":defaultColorMgtGlobals.cme" "file32.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "file32.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "file32.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "file32.ws"; +connectAttr "place2dTexture32.c" "file32.c"; +connectAttr "place2dTexture32.tf" "file32.tf"; +connectAttr "place2dTexture32.rf" "file32.rf"; +connectAttr "place2dTexture32.mu" "file32.mu"; +connectAttr "place2dTexture32.mv" "file32.mv"; +connectAttr "place2dTexture32.s" "file32.s"; +connectAttr "place2dTexture32.wu" "file32.wu"; +connectAttr "place2dTexture32.wv" "file32.wv"; +connectAttr "place2dTexture32.re" "file32.re"; +connectAttr "place2dTexture32.of" "file32.of"; +connectAttr "place2dTexture32.r" "file32.ro"; +connectAttr "place2dTexture32.n" "file32.n"; +connectAttr "place2dTexture32.vt1" "file32.vt1"; +connectAttr "place2dTexture32.vt2" "file32.vt2"; +connectAttr "place2dTexture32.vt3" "file32.vt3"; +connectAttr "place2dTexture32.vc1" "file32.vc1"; +connectAttr "place2dTexture32.o" "file32.uv"; +connectAttr "place2dTexture32.ofs" "file32.fs"; +connectAttr "file33.oa" "bump2d1.bv"; +connectAttr ":defaultColorMgtGlobals.cme" "file33.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "file33.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "file33.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "file33.ws"; +connectAttr "place2dTexture33.c" "file33.c"; +connectAttr "place2dTexture33.tf" "file33.tf"; +connectAttr "place2dTexture33.rf" "file33.rf"; +connectAttr "place2dTexture33.mu" "file33.mu"; +connectAttr "place2dTexture33.mv" "file33.mv"; +connectAttr "place2dTexture33.s" "file33.s"; +connectAttr "place2dTexture33.wu" "file33.wu"; +connectAttr "place2dTexture33.wv" "file33.wv"; +connectAttr "place2dTexture33.re" "file33.re"; +connectAttr "place2dTexture33.of" "file33.of"; +connectAttr "place2dTexture33.r" "file33.ro"; +connectAttr "place2dTexture33.n" "file33.n"; +connectAttr "place2dTexture33.vt1" "file33.vt1"; +connectAttr "place2dTexture33.vt2" "file33.vt2"; +connectAttr "place2dTexture33.vt3" "file33.vt3"; +connectAttr "place2dTexture33.vc1" "file33.vc1"; +connectAttr "place2dTexture33.o" "file33.uv"; +connectAttr "place2dTexture33.ofs" "file33.fs"; +connectAttr "WIP1:file32.ocr" "WIP1:openPBRSurface2.geop"; +connectAttr ":defaultColorMgtGlobals.cme" "WIP1:file32.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "WIP1:file32.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "WIP1:file32.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "WIP1:file32.ws"; +connectAttr "WIP1:place2dTexture.o" "WIP1:file32.uv"; +connectAttr "WIP1:place2dTexture.ofs" "WIP1:file32.fs"; +connectAttr "WIP1:place2dTexture.c" "WIP1:file32.c"; +connectAttr "WIP1:place2dTexture.tf" "WIP1:file32.tf"; +connectAttr "WIP1:place2dTexture.rf" "WIP1:file32.rf"; +connectAttr "WIP1:place2dTexture.mu" "WIP1:file32.mu"; +connectAttr "WIP1:place2dTexture.mv" "WIP1:file32.mv"; +connectAttr "WIP1:place2dTexture.s" "WIP1:file32.s"; +connectAttr "WIP1:place2dTexture.wu" "WIP1:file32.wu"; +connectAttr "WIP1:place2dTexture.wv" "WIP1:file32.wv"; +connectAttr "WIP1:place2dTexture.re" "WIP1:file32.re"; +connectAttr "WIP1:place2dTexture.of" "WIP1:file32.of"; +connectAttr "WIP1:place2dTexture.r" "WIP1:file32.ro"; +connectAttr "WIP1:place2dTexture.n" "WIP1:file32.n"; +connectAttr "WIP1:place2dTexture.vt1" "WIP1:file32.vt1"; +connectAttr "WIP1:place2dTexture.vt2" "WIP1:file32.vt2"; +connectAttr "WIP1:place2dTexture.vt3" "WIP1:file32.vt3"; +connectAttr "WIP1:place2dTexture.vc1" "WIP1:file32.vc1"; +connectAttr "WIP1:openPBRSurface2.oc" "WIP1:openPBRSurface2SG.ss"; +connectAttr "WIP1:openPBRSurface2SG.msg" "WIP1:materialInfo1.sg"; +connectAttr "WIP1:openPBRSurface2.msg" "WIP1:materialInfo1.m"; +connectAttr "WIP1:openPBRSurface3.oc" "WIP1:openPBRSurface3SG.ss"; +connectAttr "WIP1:openPBRSurface3SG.msg" "WIP1:materialInfo2.sg"; +connectAttr "WIP1:openPBRSurface3.msg" "WIP1:materialInfo2.m"; +connectAttr "WIP1:openPBRSurface4.oc" "WIP1:openPBRSurface4SG.ss"; +connectAttr "WIP1:openPBRSurface4SG.msg" "WIP1:materialInfo3.sg"; +connectAttr "WIP1:openPBRSurface4.msg" "WIP1:materialInfo3.m"; +connectAttr "WIP1:file25.oc" "WIP1:openPBRSurface5.bc"; +connectAttr ":defaultColorMgtGlobals.cme" "WIP1:file25.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "WIP1:file25.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "WIP1:file25.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "WIP1:file25.ws"; +connectAttr "WIP1:place2dTexture1.o" "WIP1:file25.uv"; +connectAttr "WIP1:place2dTexture1.ofs" "WIP1:file25.fs"; +connectAttr "WIP1:place2dTexture1.c" "WIP1:file25.c"; +connectAttr "WIP1:place2dTexture1.tf" "WIP1:file25.tf"; +connectAttr "WIP1:place2dTexture1.rf" "WIP1:file25.rf"; +connectAttr "WIP1:place2dTexture1.mu" "WIP1:file25.mu"; +connectAttr "WIP1:place2dTexture1.mv" "WIP1:file25.mv"; +connectAttr "WIP1:place2dTexture1.s" "WIP1:file25.s"; +connectAttr "WIP1:place2dTexture1.wu" "WIP1:file25.wu"; +connectAttr "WIP1:place2dTexture1.wv" "WIP1:file25.wv"; +connectAttr "WIP1:place2dTexture1.re" "WIP1:file25.re"; +connectAttr "WIP1:place2dTexture1.of" "WIP1:file25.of"; +connectAttr "WIP1:place2dTexture1.r" "WIP1:file25.ro"; +connectAttr "WIP1:place2dTexture1.n" "WIP1:file25.n"; +connectAttr "WIP1:place2dTexture1.vt1" "WIP1:file25.vt1"; +connectAttr "WIP1:place2dTexture1.vt2" "WIP1:file25.vt2"; +connectAttr "WIP1:place2dTexture1.vt3" "WIP1:file25.vt3"; +connectAttr "WIP1:place2dTexture1.vc1" "WIP1:file25.vc1"; +connectAttr "WIP1:openPBRSurface5.oc" "WIP1:openPBRSurface5SG.ss"; +connectAttr "WIP1:openPBRSurface5SG.msg" "WIP1:materialInfo4.sg"; +connectAttr "WIP1:openPBRSurface5.msg" "WIP1:materialInfo4.m"; +connectAttr "WIP1:file25.msg" "WIP1:materialInfo4.t" -na; +connectAttr "WIP1:file26.oc" "WIP1:openPBRSurface6.ec"; +connectAttr ":defaultColorMgtGlobals.cme" "WIP1:file26.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "WIP1:file26.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "WIP1:file26.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "WIP1:file26.ws"; +connectAttr "WIP1:place2dTexture2.o" "WIP1:file26.uv"; +connectAttr "WIP1:place2dTexture2.ofs" "WIP1:file26.fs"; +connectAttr "WIP1:place2dTexture2.c" "WIP1:file26.c"; +connectAttr "WIP1:place2dTexture2.tf" "WIP1:file26.tf"; +connectAttr "WIP1:place2dTexture2.rf" "WIP1:file26.rf"; +connectAttr "WIP1:place2dTexture2.mu" "WIP1:file26.mu"; +connectAttr "WIP1:place2dTexture2.mv" "WIP1:file26.mv"; +connectAttr "WIP1:place2dTexture2.s" "WIP1:file26.s"; +connectAttr "WIP1:place2dTexture2.wu" "WIP1:file26.wu"; +connectAttr "WIP1:place2dTexture2.wv" "WIP1:file26.wv"; +connectAttr "WIP1:place2dTexture2.re" "WIP1:file26.re"; +connectAttr "WIP1:place2dTexture2.of" "WIP1:file26.of"; +connectAttr "WIP1:place2dTexture2.r" "WIP1:file26.ro"; +connectAttr "WIP1:place2dTexture2.n" "WIP1:file26.n"; +connectAttr "WIP1:place2dTexture2.vt1" "WIP1:file26.vt1"; +connectAttr "WIP1:place2dTexture2.vt2" "WIP1:file26.vt2"; +connectAttr "WIP1:place2dTexture2.vt3" "WIP1:file26.vt3"; +connectAttr "WIP1:place2dTexture2.vc1" "WIP1:file26.vc1"; +connectAttr "WIP1:openPBRSurface6.oc" "WIP1:openPBRSurface6SG.ss"; +connectAttr "WIP1:openPBRSurface6SG.msg" "WIP1:materialInfo5.sg"; +connectAttr "WIP1:openPBRSurface6.msg" "WIP1:materialInfo5.m"; +connectAttr "WIP1:file27.ocr" "WIP1:openPBRSurface7.m"; +connectAttr ":defaultColorMgtGlobals.cme" "WIP1:file27.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "WIP1:file27.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "WIP1:file27.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "WIP1:file27.ws"; +connectAttr "WIP1:place2dTexture3.o" "WIP1:file27.uv"; +connectAttr "WIP1:place2dTexture3.ofs" "WIP1:file27.fs"; +connectAttr "WIP1:place2dTexture3.c" "WIP1:file27.c"; +connectAttr "WIP1:place2dTexture3.tf" "WIP1:file27.tf"; +connectAttr "WIP1:place2dTexture3.rf" "WIP1:file27.rf"; +connectAttr "WIP1:place2dTexture3.mu" "WIP1:file27.mu"; +connectAttr "WIP1:place2dTexture3.mv" "WIP1:file27.mv"; +connectAttr "WIP1:place2dTexture3.s" "WIP1:file27.s"; +connectAttr "WIP1:place2dTexture3.wu" "WIP1:file27.wu"; +connectAttr "WIP1:place2dTexture3.wv" "WIP1:file27.wv"; +connectAttr "WIP1:place2dTexture3.re" "WIP1:file27.re"; +connectAttr "WIP1:place2dTexture3.of" "WIP1:file27.of"; +connectAttr "WIP1:place2dTexture3.r" "WIP1:file27.ro"; +connectAttr "WIP1:place2dTexture3.n" "WIP1:file27.n"; +connectAttr "WIP1:place2dTexture3.vt1" "WIP1:file27.vt1"; +connectAttr "WIP1:place2dTexture3.vt2" "WIP1:file27.vt2"; +connectAttr "WIP1:place2dTexture3.vt3" "WIP1:file27.vt3"; +connectAttr "WIP1:place2dTexture3.vc1" "WIP1:file27.vc1"; +connectAttr "WIP1:openPBRSurface7.oc" "WIP1:openPBRSurface7SG.ss"; +connectAttr "WIP1:openPBRSurface7SG.msg" "WIP1:materialInfo6.sg"; +connectAttr "WIP1:openPBRSurface7.msg" "WIP1:materialInfo6.m"; +connectAttr "WIP1:file28.ocr" "WIP1:openPBRSurface8.sior"; +connectAttr ":defaultColorMgtGlobals.cme" "WIP1:file28.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "WIP1:file28.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "WIP1:file28.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "WIP1:file28.ws"; +connectAttr "WIP1:place2dTexture4.o" "WIP1:file28.uv"; +connectAttr "WIP1:place2dTexture4.ofs" "WIP1:file28.fs"; +connectAttr "WIP1:place2dTexture4.c" "WIP1:file28.c"; +connectAttr "WIP1:place2dTexture4.tf" "WIP1:file28.tf"; +connectAttr "WIP1:place2dTexture4.rf" "WIP1:file28.rf"; +connectAttr "WIP1:place2dTexture4.mu" "WIP1:file28.mu"; +connectAttr "WIP1:place2dTexture4.mv" "WIP1:file28.mv"; +connectAttr "WIP1:place2dTexture4.s" "WIP1:file28.s"; +connectAttr "WIP1:place2dTexture4.wu" "WIP1:file28.wu"; +connectAttr "WIP1:place2dTexture4.wv" "WIP1:file28.wv"; +connectAttr "WIP1:place2dTexture4.re" "WIP1:file28.re"; +connectAttr "WIP1:place2dTexture4.of" "WIP1:file28.of"; +connectAttr "WIP1:place2dTexture4.r" "WIP1:file28.ro"; +connectAttr "WIP1:place2dTexture4.n" "WIP1:file28.n"; +connectAttr "WIP1:place2dTexture4.vt1" "WIP1:file28.vt1"; +connectAttr "WIP1:place2dTexture4.vt2" "WIP1:file28.vt2"; +connectAttr "WIP1:place2dTexture4.vt3" "WIP1:file28.vt3"; +connectAttr "WIP1:place2dTexture4.vc1" "WIP1:file28.vc1"; +connectAttr "WIP1:openPBRSurface8.oc" "WIP1:openPBRSurface8SG.ss"; +connectAttr "WIP1:openPBRSurface8SG.msg" "WIP1:materialInfo7.sg"; +connectAttr "WIP1:openPBRSurface8.msg" "WIP1:materialInfo7.m"; +connectAttr "WIP1:file29.ocr" "WIP1:openPBRSurface9.sr"; +connectAttr ":defaultColorMgtGlobals.cme" "WIP1:file29.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "WIP1:file29.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "WIP1:file29.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "WIP1:file29.ws"; +connectAttr "WIP1:place2dTexture5.o" "WIP1:file29.uv"; +connectAttr "WIP1:place2dTexture5.ofs" "WIP1:file29.fs"; +connectAttr "WIP1:place2dTexture5.c" "WIP1:file29.c"; +connectAttr "WIP1:place2dTexture5.tf" "WIP1:file29.tf"; +connectAttr "WIP1:place2dTexture5.rf" "WIP1:file29.rf"; +connectAttr "WIP1:place2dTexture5.mu" "WIP1:file29.mu"; +connectAttr "WIP1:place2dTexture5.mv" "WIP1:file29.mv"; +connectAttr "WIP1:place2dTexture5.s" "WIP1:file29.s"; +connectAttr "WIP1:place2dTexture5.wu" "WIP1:file29.wu"; +connectAttr "WIP1:place2dTexture5.wv" "WIP1:file29.wv"; +connectAttr "WIP1:place2dTexture5.re" "WIP1:file29.re"; +connectAttr "WIP1:place2dTexture5.of" "WIP1:file29.of"; +connectAttr "WIP1:place2dTexture5.r" "WIP1:file29.ro"; +connectAttr "WIP1:place2dTexture5.n" "WIP1:file29.n"; +connectAttr "WIP1:place2dTexture5.vt1" "WIP1:file29.vt1"; +connectAttr "WIP1:place2dTexture5.vt2" "WIP1:file29.vt2"; +connectAttr "WIP1:place2dTexture5.vt3" "WIP1:file29.vt3"; +connectAttr "WIP1:place2dTexture5.vc1" "WIP1:file29.vc1"; +connectAttr "WIP1:openPBRSurface9.oc" "WIP1:openPBRSurface9SG.ss"; +connectAttr "WIP1:openPBRSurface9SG.msg" "WIP1:materialInfo8.sg"; +connectAttr "WIP1:openPBRSurface9.msg" "WIP1:materialInfo8.m"; +connectAttr "WIP1:file30.ocr" "WIP1:openPBRSurface10.ct"; +connectAttr ":defaultColorMgtGlobals.cme" "WIP1:file30.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "WIP1:file30.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "WIP1:file30.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "WIP1:file30.ws"; +connectAttr "WIP1:place2dTexture6.o" "WIP1:file30.uv"; +connectAttr "WIP1:place2dTexture6.ofs" "WIP1:file30.fs"; +connectAttr "WIP1:place2dTexture6.c" "WIP1:file30.c"; +connectAttr "WIP1:place2dTexture6.tf" "WIP1:file30.tf"; +connectAttr "WIP1:place2dTexture6.rf" "WIP1:file30.rf"; +connectAttr "WIP1:place2dTexture6.mu" "WIP1:file30.mu"; +connectAttr "WIP1:place2dTexture6.mv" "WIP1:file30.mv"; +connectAttr "WIP1:place2dTexture6.s" "WIP1:file30.s"; +connectAttr "WIP1:place2dTexture6.wu" "WIP1:file30.wu"; +connectAttr "WIP1:place2dTexture6.wv" "WIP1:file30.wv"; +connectAttr "WIP1:place2dTexture6.re" "WIP1:file30.re"; +connectAttr "WIP1:place2dTexture6.of" "WIP1:file30.of"; +connectAttr "WIP1:place2dTexture6.r" "WIP1:file30.ro"; +connectAttr "WIP1:place2dTexture6.n" "WIP1:file30.n"; +connectAttr "WIP1:place2dTexture6.vt1" "WIP1:file30.vt1"; +connectAttr "WIP1:place2dTexture6.vt2" "WIP1:file30.vt2"; +connectAttr "WIP1:place2dTexture6.vt3" "WIP1:file30.vt3"; +connectAttr "WIP1:place2dTexture6.vc1" "WIP1:file30.vc1"; +connectAttr "WIP1:openPBRSurface10.oc" "WIP1:openPBRSurface10SG.ss"; +connectAttr "WIP1:openPBRSurface10SG.msg" "WIP1:materialInfo9.sg"; +connectAttr "WIP1:openPBRSurface10.msg" "WIP1:materialInfo9.m"; +connectAttr "WIP1:file31.ocr" "WIP1:openPBRSurface11.ctr"; +connectAttr ":defaultColorMgtGlobals.cme" "WIP1:file31.cme"; +connectAttr ":defaultColorMgtGlobals.cfe" "WIP1:file31.cmcf"; +connectAttr ":defaultColorMgtGlobals.cfp" "WIP1:file31.cmcp"; +connectAttr ":defaultColorMgtGlobals.wsn" "WIP1:file31.ws"; +connectAttr "WIP1:place2dTexture7.o" "WIP1:file31.uv"; +connectAttr "WIP1:place2dTexture7.ofs" "WIP1:file31.fs"; +connectAttr "WIP1:place2dTexture7.c" "WIP1:file31.c"; +connectAttr "WIP1:place2dTexture7.tf" "WIP1:file31.tf"; +connectAttr "WIP1:place2dTexture7.rf" "WIP1:file31.rf"; +connectAttr "WIP1:place2dTexture7.mu" "WIP1:file31.mu"; +connectAttr "WIP1:place2dTexture7.mv" "WIP1:file31.mv"; +connectAttr "WIP1:place2dTexture7.s" "WIP1:file31.s"; +connectAttr "WIP1:place2dTexture7.wu" "WIP1:file31.wu"; +connectAttr "WIP1:place2dTexture7.wv" "WIP1:file31.wv"; +connectAttr "WIP1:place2dTexture7.re" "WIP1:file31.re"; +connectAttr "WIP1:place2dTexture7.of" "WIP1:file31.of"; +connectAttr "WIP1:place2dTexture7.r" "WIP1:file31.ro"; +connectAttr "WIP1:place2dTexture7.n" "WIP1:file31.n"; +connectAttr "WIP1:place2dTexture7.vt1" "WIP1:file31.vt1"; +connectAttr "WIP1:place2dTexture7.vt2" "WIP1:file31.vt2"; +connectAttr "WIP1:place2dTexture7.vt3" "WIP1:file31.vt3"; +connectAttr "WIP1:place2dTexture7.vc1" "WIP1:file31.vc1"; +connectAttr "WIP1:openPBRSurface11.oc" "WIP1:openPBRSurface11SG.ss"; +connectAttr "WIP1:openPBRSurface11SG.msg" "WIP1:materialInfo10.sg"; +connectAttr "WIP1:openPBRSurface11.msg" "WIP1:materialInfo10.m"; +connectAttr "WIP1:place2dTexture3.msg" "hyperShadePrimaryNodeEditorSavedTabsInfo.tgi[0].ni[0].dn" + ; +connectAttr "WIP1:openPBRSurface7.msg" "hyperShadePrimaryNodeEditorSavedTabsInfo.tgi[0].ni[1].dn" + ; +connectAttr "WIP1:file27.msg" "hyperShadePrimaryNodeEditorSavedTabsInfo.tgi[0].ni[2].dn" + ; +connectAttr "WIP1:openPBRSurface7SG.msg" "hyperShadePrimaryNodeEditorSavedTabsInfo.tgi[0].ni[3].dn" + ; +connectAttr "openPBRSurface2SG.pa" ":renderPartition.st" -na; +connectAttr "openPBRSurface3SG.pa" ":renderPartition.st" -na; +connectAttr "openPBRSurface4SG.pa" ":renderPartition.st" -na; +connectAttr "openPBRSurface5SG.pa" ":renderPartition.st" -na; +connectAttr "openPBRSurface6SG.pa" ":renderPartition.st" -na; +connectAttr "openPBRSurface7SG.pa" ":renderPartition.st" -na; +connectAttr "openPBRSurface8SG.pa" ":renderPartition.st" -na; +connectAttr "openPBRSurface9SG.pa" ":renderPartition.st" -na; +connectAttr "openPBRSurface10SG.pa" ":renderPartition.st" -na; +connectAttr "openPBRSurface11SG.pa" ":renderPartition.st" -na; +connectAttr "WIP1:openPBRSurface2SG.pa" ":renderPartition.st" -na; +connectAttr "WIP1:openPBRSurface3SG.pa" ":renderPartition.st" -na; +connectAttr "WIP1:openPBRSurface4SG.pa" ":renderPartition.st" -na; +connectAttr "WIP1:openPBRSurface5SG.pa" ":renderPartition.st" -na; +connectAttr "WIP1:openPBRSurface6SG.pa" ":renderPartition.st" -na; +connectAttr "WIP1:openPBRSurface7SG.pa" ":renderPartition.st" -na; +connectAttr "WIP1:openPBRSurface8SG.pa" ":renderPartition.st" -na; +connectAttr "WIP1:openPBRSurface9SG.pa" ":renderPartition.st" -na; +connectAttr "WIP1:openPBRSurface10SG.pa" ":renderPartition.st" -na; +connectAttr "WIP1:openPBRSurface11SG.pa" ":renderPartition.st" -na; +connectAttr "openPBRSurface2.msg" ":defaultShaderList1.s" -na; +connectAttr "openPBRSurface3.msg" ":defaultShaderList1.s" -na; +connectAttr "openPBRSurface4.msg" ":defaultShaderList1.s" -na; +connectAttr "openPBRSurface5.msg" ":defaultShaderList1.s" -na; +connectAttr "openPBRSurface6.msg" ":defaultShaderList1.s" -na; +connectAttr "openPBRSurface7.msg" ":defaultShaderList1.s" -na; +connectAttr "openPBRSurface8.msg" ":defaultShaderList1.s" -na; +connectAttr "openPBRSurface9.msg" ":defaultShaderList1.s" -na; +connectAttr "openPBRSurface10.msg" ":defaultShaderList1.s" -na; +connectAttr "openPBRSurface11.msg" ":defaultShaderList1.s" -na; +connectAttr "WIP1:openPBRSurface2.msg" ":defaultShaderList1.s" -na; +connectAttr "WIP1:openPBRSurface3.msg" ":defaultShaderList1.s" -na; +connectAttr "WIP1:openPBRSurface4.msg" ":defaultShaderList1.s" -na; +connectAttr "WIP1:openPBRSurface5.msg" ":defaultShaderList1.s" -na; +connectAttr "WIP1:openPBRSurface6.msg" ":defaultShaderList1.s" -na; +connectAttr "WIP1:openPBRSurface7.msg" ":defaultShaderList1.s" -na; +connectAttr "WIP1:openPBRSurface8.msg" ":defaultShaderList1.s" -na; +connectAttr "WIP1:openPBRSurface9.msg" ":defaultShaderList1.s" -na; +connectAttr "WIP1:openPBRSurface10.msg" ":defaultShaderList1.s" -na; +connectAttr "WIP1:openPBRSurface11.msg" ":defaultShaderList1.s" -na; +connectAttr "place2dTexture25.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "place2dTexture26.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "place2dTexture27.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "place2dTexture28.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "place2dTexture29.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "place2dTexture30.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "place2dTexture31.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "place2dTexture32.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "bump2d1.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "place2dTexture33.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "WIP1:place2dTexture.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "WIP1:place2dTexture1.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "WIP1:place2dTexture2.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "WIP1:place2dTexture3.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "WIP1:place2dTexture4.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "WIP1:place2dTexture5.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "WIP1:place2dTexture6.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "WIP1:place2dTexture7.msg" ":defaultRenderUtilityList1.u" -na; +connectAttr "defaultRenderLayer.msg" ":defaultRenderingList1.r" -na; +connectAttr "directionalLightShape1.ltd" ":lightList1.l" -na; +connectAttr "file25.msg" ":defaultTextureList1.tx" -na; +connectAttr "file26.msg" ":defaultTextureList1.tx" -na; +connectAttr "file27.msg" ":defaultTextureList1.tx" -na; +connectAttr "file28.msg" ":defaultTextureList1.tx" -na; +connectAttr "file29.msg" ":defaultTextureList1.tx" -na; +connectAttr "file30.msg" ":defaultTextureList1.tx" -na; +connectAttr "file31.msg" ":defaultTextureList1.tx" -na; +connectAttr "file32.msg" ":defaultTextureList1.tx" -na; +connectAttr "file33.msg" ":defaultTextureList1.tx" -na; +connectAttr "WIP1:file32.msg" ":defaultTextureList1.tx" -na; +connectAttr "WIP1:file25.msg" ":defaultTextureList1.tx" -na; +connectAttr "WIP1:file26.msg" ":defaultTextureList1.tx" -na; +connectAttr "WIP1:file27.msg" ":defaultTextureList1.tx" -na; +connectAttr "WIP1:file28.msg" ":defaultTextureList1.tx" -na; +connectAttr "WIP1:file29.msg" ":defaultTextureList1.tx" -na; +connectAttr "WIP1:file30.msg" ":defaultTextureList1.tx" -na; +connectAttr "WIP1:file31.msg" ":defaultTextureList1.tx" -na; +connectAttr "directionalLight1.iog" ":defaultLightSet.dsm" -na; +// End of OpenPBRShowcase.ma