Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use "mtl" as default scope name on export #2903

Merged
merged 1 commit into from
Feb 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions lib/mayaUsd/commands/Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -255,9 +255,16 @@ primitive. The original name will be preserved in custom data for roundtripping.

#### Material Scopes

The default material scope when exporting materials is named `mtl`. Users can
change this default material scope name by setting the environment variable
named `MAYAUSD_MATERIALS_SCOPE_NAME`.
The recommended way of selecting a global scope name for materials is to use the
materialsScopeName argument of MayaUSDExportCommand.

If that argument is not specified, we will use "mtl" as a globally defined default.
This follows the [Guidelines for Structuring USD Assets](https://wiki.aswf.io/display/WGUSD/Guidelines+for+Structuring+USD+Assets)
as defined by the USD Assets WG.

The `MAYAUSD_MATERIALS_SCOPE_NAME` environment variable can be used to change
that default on a global level. The value defined in that env var will take
precedence over any value passed in the materialsScopeName argument.
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Not sure I like that. Maybe this should override only when a materialsScopeName argument is not provided?)


This environment variable was added in part to support legacy user of mayaUSD:
in past versions of the plugin, the material scope was named `Looks`. The change
Expand Down
19 changes: 17 additions & 2 deletions lib/mayaUsd/fileio/jobs/jobArgs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <pxr/base/tf/diagnostic.h>
#include <pxr/base/tf/envSetting.h>
#include <pxr/base/tf/fileUtils.h>
#include <pxr/base/tf/getenv.h>
#include <pxr/base/tf/staticTokens.h>
#include <pxr/base/tf/token.h>
#include <pxr/base/vt/array.h>
Expand Down Expand Up @@ -78,6 +79,10 @@ TF_DEFINE_PRIVATE_TOKENS(

namespace {

// Default material scope name as defined by USD Assets working group.
// See https://wiki.aswf.io/display/WGUSD/Guidelines+for+Structuring+USD+Assets
static constexpr auto kDefaultMaterialScopeName = "mtl";

using namespace MayaUsd::DictUtils;

// The chaser args are stored as vectors of vectors (since this is how you
Expand Down Expand Up @@ -176,6 +181,12 @@ TfToken _GetMaterialsScopeName(const std::string& materialsScopeName)
// If the env setting is set, make sure we don't allow the materials
// scope name to be overridden by a parameter value.
return defaultMaterialsScopeName;
} else {
const std::string mayaUsdDefaultMaterialsScopeName
= TfGetenv("MAYAUSD_MATERIALS_SCOPE_NAME");
if (!mayaUsdDefaultMaterialsScopeName.empty()) {
return TfToken(mayaUsdDefaultMaterialsScopeName);
}
}

if (SdfPath::IsValidIdentifier(materialsScopeName)) {
Expand Down Expand Up @@ -826,8 +837,7 @@ const VtDictionary& UsdMayaJobExportArgs::GetDefaultDictionary()
d[UsdMayaJobExportArgsTokens->kind] = std::string();
d[UsdMayaJobExportArgsTokens->disableModelKindProcessor] = false;
d[UsdMayaJobExportArgsTokens->materialCollectionsPath] = std::string();
d[UsdMayaJobExportArgsTokens->materialsScopeName]
= UsdUtilsGetMaterialsScopeName().GetString();
d[UsdMayaJobExportArgsTokens->materialsScopeName] = kDefaultMaterialScopeName;
d[UsdMayaJobExportArgsTokens->melPerFrameCallback] = std::string();
d[UsdMayaJobExportArgsTokens->melPostCallback] = std::string();
d[UsdMayaJobExportArgsTokens->mergeTransformAndShape] = true;
Expand Down Expand Up @@ -940,6 +950,11 @@ const VtDictionary& UsdMayaJobExportArgs::GetGuideDictionary()
return d;
}

const std::string UsdMayaJobExportArgs::GetDefaultMaterialsScopeName()
{
return _GetMaterialsScopeName(kDefaultMaterialScopeName);
}

std::string UsdMayaJobExportArgs::GetResolvedFileName() const
{
MFileObject fileObj;
Expand Down
8 changes: 7 additions & 1 deletion lib/mayaUsd/fileio/jobs/jobArgs.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ TF_DECLARE_PUBLIC_TOKENS(
/* geomSidedness values */ \
(derived) \
(single) \
((double_, "double")) \
((double_, "double"))
// clang-format on

TF_DECLARE_PUBLIC_TOKENS(
Expand Down Expand Up @@ -294,6 +294,12 @@ struct UsdMayaJobExportArgs
MAYAUSD_CORE_PUBLIC
static const VtDictionary& GetGuideDictionary();

/// Gets the resolved default material scope name.
///
/// Accounts for all env vars that can affect the scope name.
MAYAUSD_CORE_PUBLIC
static const std::string GetDefaultMaterialsScopeName();

/// Returns the resolved file name of the final export location
MAYAUSD_CORE_PUBLIC
std::string GetResolvedFileName() const;
Expand Down
4 changes: 3 additions & 1 deletion lib/mayaUsd/python/wrapPrimWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -592,7 +592,9 @@ void wrapJobExportArgs()
&UsdMayaJobExportArgs::usdModelRootOverridePath,
return_value_policy<return_by_value>()))
.def_readonly("verbose", &UsdMayaJobExportArgs::verbose)
.def("GetResolvedFileName", &UsdMayaJobExportArgs::GetResolvedFileName);
.def("GetResolvedFileName", &UsdMayaJobExportArgs::GetResolvedFileName)
.def("GetDefaultMaterialsScopeName", &UsdMayaJobExportArgs::GetDefaultMaterialsScopeName)
.staticmethod("GetDefaultMaterialsScopeName");
}

void wrapPrimWriter()
Expand Down
15 changes: 2 additions & 13 deletions lib/mayaUsd/ufe/UsdUndoMaterialCommands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@
//
#include "UsdUndoMaterialCommands.h"

#include <mayaUsd/fileio/jobs/jobArgs.h>
#include <mayaUsd/ufe/Utils.h>

#include <pxr/base/tf/envSetting.h>
#include <pxr/base/tf/getenv.h>
#include <pxr/usd/sdr/registry.h>
#include <pxr/usd/sdr/shaderProperty.h>
#include <pxr/usd/usd/prim.h>
Expand Down Expand Up @@ -286,17 +285,7 @@ Ufe::SceneItem::Ptr UsdUndoAssignNewMaterialCommand::insertedChild() const

std::string UsdUndoAssignNewMaterialCommand::resolvedMaterialScopeName()
{
std::string materialsScopeName = kDefaultMaterialScopeName;
if (TfGetEnvSetting(USD_FORCE_DEFAULT_MATERIALS_SCOPE_NAME)) {
materialsScopeName = UsdUtilsGetMaterialsScopeName().GetString();
} else {
const std::string mayaUsdDefaultMaterialsScopeName
= TfGetenv("MAYAUSD_MATERIALS_SCOPE_NAME");
if (!mayaUsdDefaultMaterialsScopeName.empty()) {
materialsScopeName = mayaUsdDefaultMaterialsScopeName;
}
}
return materialsScopeName;
return UsdMayaJobExportArgs::GetDefaultMaterialsScopeName();
}

void UsdUndoAssignNewMaterialCommand::execute()
Expand Down
10 changes: 0 additions & 10 deletions plugin/adsk/scripts/mayaUsdTranslatorExport.mel
Original file line number Diff line number Diff line change
Expand Up @@ -219,14 +219,6 @@ proc string mayaUsdTranslatorExport_AppendFromTextField(string $currentOptions,
return $currentOptions + ";" + $arg + "=" + $value;
}

proc string mayaUsdTranslatorExport_AppendFromEnvElseDefault(string $currentOptions, string $arg, string $envVarName, string $defaultValue) {
string $value = `getenv $envVarName`;
if ($value == "") {
$value = $defaultValue;
}
return $currentOptions + ";" + $arg + "=" + $value;
}

global proc mayaUsdTranslatorExport_AnimationCB() {
if (`checkBoxGrp -exists animationCheckBox` == 0)
return;
Expand Down Expand Up @@ -797,8 +789,6 @@ global proc int mayaUsdTranslatorExport (string $parent,
$currentOptions = mayaUsdTranslatorExport_AppendJobContexts($currentOptions, "jobContext");
}

$currentOptions = mayaUsdTranslatorExport_AppendFromEnvElseDefault($currentOptions, "materialsScopeName", "MAYAUSD_MATERIALS_SCOPE_NAME", `getMayaUsdString("kExportMaterialsDefaultScopeName")`);

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No longer necessary.

eval($resultCallback+" \""+$currentOptions+"\"");
$bResult = 1;

Expand Down
1 change: 0 additions & 1 deletion test/lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ endif()
# Interactive Unit test scripts.
set(INTERACTIVE_TEST_SCRIPT_FILES
testMayaUsdInteractiveLayerEditorCommands.py
testMayaUsdInteractiveMaterialsScopeName.py
)

foreach(script ${TEST_SCRIPT_FILES})
Expand Down
1 change: 1 addition & 0 deletions test/lib/mayaUsd/fileio/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ foreach(script ${TEST_SCRIPT_FILES})
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
ENV
"UFE_PREVIEW_VERSION_NUM=${UFE_PREVIEW_VERSION_NUM}"
"USD_FORCE_DEFAULT_MATERIALS_SCOPE_NAME=1"
)

# Add a ctest label to these tests for easy filtering.
Expand Down
49 changes: 0 additions & 49 deletions test/lib/testMayaUsdInteractiveMaterialsScopeName.py

This file was deleted.

2 changes: 2 additions & 0 deletions test/lib/usd/pxrUsdPreviewSurface/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ foreach(script ${TEST_SCRIPT_FILES})
mayaUsd_add_test(${target}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
PYTHON_MODULE ${target}
ENV
"USD_FORCE_DEFAULT_MATERIALS_SCOPE_NAME=1"
)
set_property(TEST ${target} APPEND PROPERTY LABELS usdPreviewSurface)
endforeach()
37 changes: 31 additions & 6 deletions test/lib/usd/translators/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ set(TEST_SCRIPT_FILES
testUsdExportCamera.py
testUsdExportColorSets.py
testUsdExportConnected.py
testUsdExportDisplacement.py
testUsdExportDisplayColor.py
testUsdExportEulerFilter.py
testUsdExportFileFormat.py
Expand Down Expand Up @@ -39,8 +38,6 @@ set(TEST_SCRIPT_FILES
testUsdExportRootsAndParentScope.py
testUsdExportSelection.py
testUsdExportSelectionHierarchy.py
testUsdExportShadingInstanced.py
testUsdExportShadingModePxrRis.py
testUsdExportSkeleton.py
testUsdExportStripNamespaces.py
testUsdExportStroke.py
Expand Down Expand Up @@ -76,7 +73,6 @@ set(TEST_SCRIPT_FILES
testUsdImportUVSetMappings.py
testUsdImportUSDZTextures.py
testUsdExportImportRoundtripPreviewSurface.py
testUsdExportImportUDIM.py
testUsdImportSkeleton.py
testUsdImportXforms.py
testUsdImportXformAnim.py
Expand Down Expand Up @@ -104,12 +100,40 @@ endif()

if (BUILD_RFM_TRANSLATORS)
list(APPEND TEST_SCRIPT_FILES
testUsdExportRfMShaders.py
testUsdImportRfMShaders.py
)
endif()

foreach(script ${TEST_SCRIPT_FILES})
mayaUsd_get_unittest_target(target ${script})
mayaUsd_add_test(${target}
PYTHON_MODULE ${target}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
ENV
"USD_FORCE_DEFAULT_MATERIALS_SCOPE_NAME=1"
)

# Add a ctest label to these tests for easy filtering.
set_property(TEST ${target} APPEND PROPERTY LABELS translators)
endforeach()

# These tests use custom material scope names and must not use
# the USD_FORCE_DEFAULT_MATERIALS_SCOPE_NAME env var because
# it takes precedence over the provided material scope name.
set(TEST_SCRIPT_FILES_WITH_MATERIAL_SCOPE
testUsdExportDisplacement.py
testUsdExportShadingInstanced.py
testUsdExportShadingModePxrRis.py
testUsdExportImportUDIM.py
)

if (BUILD_RFM_TRANSLATORS)
list(APPEND TEST_SCRIPT_FILES_WITH_MATERIAL_SCOPE
testUsdExportRfMShaders.py
)
endif()

foreach(script ${TEST_SCRIPT_FILES_WITH_MATERIAL_SCOPE})
mayaUsd_get_unittest_target(target ${script})
mayaUsd_add_test(${target}
PYTHON_MODULE ${target}
Expand Down Expand Up @@ -202,7 +226,8 @@ if (MAYA_APP_VERSION VERSION_GREATER_EQUAL 2020)
"${PXR_OVERRIDE_PLUGINPATH_NAME}=${CMAKE_CURRENT_BINARY_DIR}/../plugin/${plugin_type}"
"INPUT_PATH=${CMAKE_CURRENT_SOURCE_DIR}"
"PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}"
)
"USD_FORCE_DEFAULT_MATERIALS_SCOPE_NAME=1"
)
set_property(TEST ${target} APPEND PROPERTY LABELS translators)
endforeach()
endforeach()
Expand Down
18 changes: 17 additions & 1 deletion test/lib/usd/translators/testUsdExportMultiMaterial.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,21 @@ def testStageOpens(self):
'''
self.assertTrue(self._stage)

def testMaterialScopeResolution(self):
# New default value as per USD Asset WG:
self.assertEqual(mayaUsdLib.JobExportArgs.GetDefaultMaterialsScopeName(), "mtl")

# This override is low-priority
os.environ["MAYAUSD_MATERIALS_SCOPE_NAME"] = "MyMaterialScope"
self.assertEqual(mayaUsdLib.JobExportArgs.GetDefaultMaterialsScopeName(), "MyMaterialScope")

# The USD_FORCE_DEFAULT_MATERIALS_SCOPE_NAME override has higher priority, but is read
# at startup and can not be turned on/off for this test. It was used on all tests that
# relied on "Looks" being the default name instead of "mtl"

os.environ.pop("MAYAUSD_MATERIALS_SCOPE_NAME")
self.assertEqual(mayaUsdLib.JobExportArgs.GetDefaultMaterialsScopeName(), "mtl")

def testExportedUsdShadeNodeTypes(self):
'''
Tests that all node ids are what we expect:
Expand Down Expand Up @@ -154,7 +169,8 @@ def testVarnameMerging(self):
cmds.usdExport(mergeTransformAndShape=True,
file=usd_path,
shadingMode='useRegistry',
convertMaterialsTo=['MaterialX', 'UsdPreviewSurface'])
convertMaterialsTo=['MaterialX', 'UsdPreviewSurface'],
materialsScopeName='Looks')

# We expect 2 primvar readers, and 2 st transforms:
stage = Usd.Stage.Open(usd_path)
Expand Down