Skip to content

Commit

Permalink
Merge pull request #822 from Autodesk/t_gamaj/MAYA-102319/multi_mater…
Browse files Browse the repository at this point in the history
…ial_import

MAYA-102319 - Material import options rework
  • Loading branch information
Krystian Ligenza authored Oct 14, 2020
2 parents a388f16 + 7140d64 commit 96d40b7
Show file tree
Hide file tree
Showing 60 changed files with 1,310 additions and 1,140 deletions.
7 changes: 4 additions & 3 deletions lib/mayaUsd/commands/baseImportCommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,10 @@ MayaUSDImportCommand::createSyntax()
// UsdMayaJobImportArgs::GetDefaultDictionary.
syntax.addFlag(kShadingModeFlag,
UsdMayaJobImportArgsTokens->shadingMode.GetText(),
MSyntax::kString);
syntax.addFlag(kShadingConversionFlag,
UsdMayaJobImportArgsTokens->shadingConversion.GetText(),
MSyntax::kString, MSyntax::kString);
syntax.makeFlagMultiUse(kShadingModeFlag);
syntax.addFlag(kPreferredMaterialFlag,
UsdMayaJobImportArgsTokens->preferredMaterial.GetText(),
MSyntax::kString);
syntax.addFlag(kAssemblyRepFlag,
UsdMayaJobImportArgsTokens->assemblyRep.GetText(),
Expand Down
2 changes: 1 addition & 1 deletion lib/mayaUsd/commands/baseImportCommand.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class MAYAUSD_CORE_PUBLIC MayaUSDImportCommand : public MPxCommand
//
// The list of short forms of flags defined as Arg Tokens:
static constexpr auto kShadingModeFlag = "shd";
static constexpr auto kShadingConversionFlag = "shc";
static constexpr auto kPreferredMaterialFlag = "prm";
static constexpr auto kAssemblyRepFlag = "ar";
static constexpr auto kMetadataFlag = "md";
static constexpr auto kApiSchemaFlag = "api";
Expand Down
154 changes: 108 additions & 46 deletions lib/mayaUsd/commands/baseListShadingModesCommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,27 +35,34 @@ TF_DEFINE_PRIVATE_TOKENS(

((NoneOption, "none"))
((NoneNiceName, "None"))
((NoneDescription, "No material data gets exported."))
((NoneExportDescription, "No material data gets exported."))
((NoneImportDescription,
"Stop the search for materials. Can signal that no materials are to be"
" imported when used alone."))
);

namespace {
std::pair<TfToken, TfToken> _GetOptions(const MString& niceName) {
std::pair<TfToken, TfToken> _GetOptions(const MString& niceName, bool isExport) {
TfToken niceToken(niceName.asChar());

TfToken shadingMode, convertMaterialsTo;
if (niceToken == _tokens->NoneNiceName) {
return std::make_pair(_tokens->NoneOption, convertMaterialsTo);
}

for (auto const& e: UsdMayaShadingModeRegistry::ListExporters()) {
if (niceToken == UsdMayaShadingModeRegistry::GetExporterNiceName(e)) {
for (auto const& e : (isExport ? UsdMayaShadingModeRegistry::ListExporters()
: UsdMayaShadingModeRegistry::ListImporters())) {
if (niceToken == (isExport ? UsdMayaShadingModeRegistry::GetExporterNiceName(e)
: UsdMayaShadingModeRegistry::GetImporterNiceName(e))) {
shadingMode = e;
break;
}
}
if (shadingMode.IsEmpty()) {
for (auto const& r: UsdMayaShadingModeRegistry::ListExportConversions()) {
if (niceToken == UsdMayaShadingModeRegistry::GetExportConversionInfo(r).niceName) {
for (auto const& r : UsdMayaShadingModeRegistry::ListMaterialConversions()) {
auto const& info = UsdMayaShadingModeRegistry::GetMaterialConversionInfo(r);
if (niceToken == info.niceName
&& (isExport ? info.hasExporter : info.hasImporter)) {
shadingMode = UsdMayaShadingModeTokens->useRegistry;
convertMaterialsTo = r;
}
Expand All @@ -75,41 +82,63 @@ MayaUSDListShadingModesCommand::doIt(const MArgList& args) {
}

if (argData.isFlagSet("export")) {
// We have these default exporters which are always 1-2-3 in the options:
appendToResult(UsdMayaShadingModeRegistry::GetExportConversionInfo(
// We have these default exporters which are always 1-2 in the options:
appendToResult(UsdMayaShadingModeRegistry::GetMaterialConversionInfo(
UsdImagingTokens->UsdPreviewSurface)
.niceName.GetText());
appendToResult(
UsdMayaShadingModeRegistry::GetExporterNiceName(UsdMayaShadingModeTokens->displayColor)
.c_str());
appendToResult(_tokens->NoneNiceName.GetText());
// Then we explore the registries:
for (auto const& shadingMode : UsdMayaShadingModeRegistry::ListExporters()) {
if (shadingMode != UsdMayaShadingModeTokens->useRegistry
&& shadingMode != UsdMayaShadingModeTokens->displayColor) {
appendToResult(
UsdMayaShadingModeRegistry::GetExporterNiceName(shadingMode).c_str());
for (auto const& s : UsdMayaShadingModeRegistry::ListExporters()) {
if (s != UsdMayaShadingModeTokens->useRegistry) {
appendToResult(UsdMayaShadingModeRegistry::GetExporterNiceName(s).c_str());
}
}
for (auto const& materialConversion : UsdMayaShadingModeRegistry::ListExportConversions()) {
appendToResult(
UsdMayaShadingModeRegistry::GetExportConversionInfo(materialConversion)
.niceName.GetText());
for (auto const& c : UsdMayaShadingModeRegistry::ListMaterialConversions()) {
if (c != UsdImagingTokens->UsdPreviewSurface) {
auto const& info = UsdMayaShadingModeRegistry::GetMaterialConversionInfo(c);
if (info.hasExporter) {
appendToResult(info.niceName.GetText());
}
}
}
} else if (argData.isFlagSet("import")) {
// Always include the "none" shading mode.
appendToResult(UsdMayaShadingModeTokens->none.GetText());
for (const auto& e : UsdMayaShadingModeRegistry::ListImporters()) {
appendToResult(e.GetText());
// Default priorities for searching for materials is defined here:
// - Specialized importers using registry based import.
// - Specialized importers, non-registry based.
// - Universal importers (MaterialX? UsdPreviewSurface) using registry based import.
// - Display colors as last resort
// This is to be used when importing via the dialog. Finer grained import is available at
// the command level.
//
for (const auto c : UsdMayaShadingModeRegistry::ListMaterialConversions()) {
if (c != UsdImagingTokens->UsdPreviewSurface) {
auto const& info = UsdMayaShadingModeRegistry::GetMaterialConversionInfo(c);
if (info.hasImporter) {
appendToResult(info.niceName.GetText());
}
}
}
for (const auto s : UsdMayaShadingModeRegistry::ListImporters()) {
if (s != UsdMayaShadingModeTokens->useRegistry
&& s != UsdMayaShadingModeTokens->displayColor) {
appendToResult(UsdMayaShadingModeRegistry::GetImporterNiceName(s).c_str());
}
}
appendToResult(UsdMayaShadingModeRegistry::GetMaterialConversionInfo(
UsdImagingTokens->UsdPreviewSurface)
.niceName.GetText());
appendToResult(
UsdMayaShadingModeRegistry::GetImporterNiceName(UsdMayaShadingModeTokens->displayColor)
.c_str());
appendToResult(_tokens->NoneNiceName.GetText());
} else if (argData.isFlagSet("exportOptions")) {
MString niceName;
MString niceName;
status = argData.getFlagArgument("exportOptions", 0, niceName);
if (status != MS::kSuccess) {
return status;
}
TfToken shadingMode, materialConversion;
std::tie(shadingMode, materialConversion) = _GetOptions(niceName);
std::tie(shadingMode, materialConversion) = _GetOptions(niceName, true);
if (shadingMode.IsEmpty()) {
return MS::kNotFound;
}
Expand All @@ -120,29 +149,58 @@ MayaUSDListShadingModesCommand::doIt(const MArgList& args) {
options += materialConversion.GetText();
}
setResult(options);
} else if (argData.isFlagSet("exportAnnotation")) {
MString niceName;
status = argData.getFlagArgument("exportAnnotation", 0, niceName);
} else if (argData.isFlagSet("importOptions")) {
MString niceName;
status = argData.getFlagArgument("importOptions", 0, niceName);
if (status != MS::kSuccess) {
return status;
}
TfToken shadingMode, materialConversion;
std::tie(shadingMode, materialConversion) = _GetOptions(niceName);
std::tie(shadingMode, materialConversion) = _GetOptions(niceName, false);
if (shadingMode.IsEmpty()) {
return MS::kNotFound;
}
appendToResult(shadingMode.GetText());
if (!materialConversion.IsEmpty()) {
appendToResult(materialConversion.GetText());
} else {
appendToResult(UsdMayaShadingModeTokens->none.GetText());
}
} else if (argData.isFlagSet("exportAnnotation") || argData.isFlagSet("importAnnotation")) {
const bool isExport = argData.isFlagSet("exportAnnotation");
MString niceName;
status = argData.getFlagArgument(
isExport ? "exportAnnotation" : "importAnnotation", 0, niceName);
if (status != MS::kSuccess) {
return status;
}
TfToken shadingMode, materialConversion;
std::tie(shadingMode, materialConversion) = _GetOptions(niceName, isExport);
if (shadingMode.IsEmpty()) {
return MS::kNotFound;
} else if (materialConversion.IsEmpty()) {
if (shadingMode == _tokens->NoneOption) {
setResult(_tokens->NoneDescription.GetText());
setResult(
isExport ? _tokens->NoneExportDescription.GetText()
: _tokens->NoneImportDescription.GetText());
} else {
setResult(UsdMayaShadingModeRegistry::GetExporterDescription(shadingMode).c_str());
setResult(
isExport
? UsdMayaShadingModeRegistry::GetExporterDescription(shadingMode).c_str()
: UsdMayaShadingModeRegistry::GetImporterDescription(shadingMode).c_str());
}
} else {
setResult(UsdMayaShadingModeRegistry::GetExportConversionInfo(materialConversion)
.description.GetText());
auto const& info
= UsdMayaShadingModeRegistry::GetMaterialConversionInfo(materialConversion);
setResult(
isExport ? info.exportDescription.GetText()
: info.importDescription.GetText());
}
} else if (argData.isFlagSet("findExportName")) {
MString optName;
status = argData.getFlagArgument("findExportName", 0, optName);
} else if (argData.isFlagSet("findExportName") || argData.isFlagSet("findImportName")) {
const bool isExport = argData.isFlagSet("findExportName");
MString optName;
status
= argData.getFlagArgument(isExport ? "findExportName" : "findImportName", 0, optName);
if (status != MS::kSuccess) {
return status;
}
Expand All @@ -151,16 +209,17 @@ MayaUSDListShadingModesCommand::doIt(const MArgList& args) {
setResult(_tokens->NoneNiceName.GetText());
return MS::kSuccess;
}
for (auto const& r: UsdMayaShadingModeRegistry::ListExportConversions()) {
if (r == optToken) {
setResult(
UsdMayaShadingModeRegistry::GetExportConversionInfo(r).niceName.GetText());
return MS::kSuccess;
}
auto const& info = UsdMayaShadingModeRegistry::GetMaterialConversionInfo(optToken);
if (isExport ? info.hasExporter : info.hasImporter) {
setResult(info.niceName.GetText());
return MS::kSuccess;
}
for (auto const& s: UsdMayaShadingModeRegistry::ListExporters()) {
if (s == optToken && s != UsdMayaShadingModeTokens->useRegistry) {
setResult(UsdMayaShadingModeRegistry::GetExporterNiceName(s).c_str());
if (optToken != UsdMayaShadingModeTokens->useRegistry) {
const std::string& niceName = isExport
? UsdMayaShadingModeRegistry::GetExporterNiceName(optToken)
: UsdMayaShadingModeRegistry::GetImporterNiceName(optToken);
if (!niceName.empty()) {
setResult(niceName.c_str());
return MS::kSuccess;
}
}
Expand All @@ -176,8 +235,11 @@ MayaUSDListShadingModesCommand::createSyntax() {
syntax.addFlag("-ex", "-export", MSyntax::kNoArg);
syntax.addFlag("-im", "-import", MSyntax::kNoArg);
syntax.addFlag("-eo", "-exportOptions", MSyntax::kString);
syntax.addFlag("-io", "-importOptions", MSyntax::kString);
syntax.addFlag("-ea", "-exportAnnotation", MSyntax::kString);
syntax.addFlag("-ia", "-importAnnotation", MSyntax::kString);
syntax.addFlag("-fen", "-findExportName", MSyntax::kString);
syntax.addFlag("-fin", "-findImportName", MSyntax::kString);

syntax.enableQuery(false);
syntax.enableEdit(false);
Expand Down
86 changes: 69 additions & 17 deletions lib/mayaUsd/fileio/jobs/jobArgs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,51 @@ _ChaserArgs(const VtDictionary& userArgs, const TfToken& key)
return result;
}

// The shadingMode args are stored as vectors of vectors (since this is how you
// would need to pass them in the Maya Python command API).
static UsdMayaJobImportArgs::ShadingModes
_shadingModesImportArgs(const VtDictionary& userArgs, const TfToken& key)
{
const std::vector<std::vector<VtValue>> shadingModeArgs
= _Vector<std::vector<VtValue>>(userArgs, key);

const TfTokenVector modes = UsdMayaShadingModeRegistry::ListImporters();

UsdMayaJobImportArgs::ShadingModes result;
for (const std::vector<VtValue>& argTuple : shadingModeArgs) {
if (argTuple.size() != 2) {
TF_CODING_ERROR(
"Each shadingMode arg must be a tuple (shadingMode, convertMaterialFrom)");
return UsdMayaJobImportArgs::ShadingModes();
}

TfToken shadingMode = TfToken(argTuple[0].Get<std::string>().c_str());
TfToken convertMaterialFrom = TfToken(argTuple[1].Get<std::string>().c_str());

if (shadingMode == UsdMayaShadingModeTokens->none) {
break;
}

if (std::find(modes.cbegin(), modes.cend(), shadingMode) == modes.cend()) {
TF_CODING_ERROR("Unknown shading mode '%s'", shadingMode.GetText());
return UsdMayaJobImportArgs::ShadingModes();
}

if (shadingMode == UsdMayaShadingModeTokens->useRegistry) {
auto const& info
= UsdMayaShadingModeRegistry::GetMaterialConversionInfo(convertMaterialFrom);
if (!info.hasImporter) {
TF_CODING_ERROR("Unknown material conversion '%s'", convertMaterialFrom.GetText());
return UsdMayaJobImportArgs::ShadingModes();
}
// Do not validate second parameter if not in a useRegistry scenario.
}

result.push_back(UsdMayaJobImportArgs::ShadingMode{shadingMode, convertMaterialFrom});
}
return result;
}

static
TfToken
_GetMaterialsScopeName(const std::string& materialsScopeName)
Expand Down Expand Up @@ -342,7 +387,7 @@ UsdMayaJobExportArgs::UsdMayaJobExportArgs(
_Token(userArgs,
UsdMayaJobExportArgsTokens->convertMaterialsTo,
UsdImagingTokens->UsdPreviewSurface,
UsdMayaShadingModeRegistry::ListExportConversions())),
UsdMayaShadingModeRegistry::ListMaterialConversions())),
verbose(
_Boolean(userArgs, UsdMayaJobExportArgsTokens->verbose)),

Expand Down Expand Up @@ -466,7 +511,7 @@ UsdMayaJobExportArgs::GetDefaultDictionary()
d[UsdMayaJobExportArgsTokens->eulerFilter] = false;
d[UsdMayaJobExportArgsTokens->exportCollectionBasedBindings] = false;
d[UsdMayaJobExportArgsTokens->exportColorSets] = true;
d[UsdMayaJobExportArgsTokens->exportDisplayColor] = true;
d[UsdMayaJobExportArgsTokens->exportDisplayColor] = false;
d[UsdMayaJobExportArgsTokens->exportInstances] = true;
d[UsdMayaJobExportArgsTokens->exportMaterialCollections] = false;
d[UsdMayaJobExportArgsTokens->exportReferenceObjects] = false;
Expand Down Expand Up @@ -565,16 +610,13 @@ UsdMayaJobImportArgs::UsdMayaJobImportArgs(
_TokenSet(userArgs, UsdMayaJobImportArgsTokens->apiSchema)),
includeMetadataKeys(
_TokenSet(userArgs, UsdMayaJobImportArgsTokens->metadata)),
shadingMode(
shadingModes(
_shadingModesImportArgs(userArgs, UsdMayaJobImportArgsTokens->shadingMode)),
preferredMaterial(
_Token(userArgs,
UsdMayaJobImportArgsTokens->shadingMode,
UsdMayaShadingModeTokens->none,
UsdMayaShadingModeRegistry::ListImporters())),
shadingConversion(
_Token(userArgs,
UsdMayaJobImportArgsTokens->shadingConversion,
UsdMayaShadingConversionTokens->none,
UsdMayaShadingConversionTokens->allTokens)),
UsdMayaJobImportArgsTokens->preferredMaterial,
UsdMayaPreferredMaterialTokens->none,
UsdMayaPreferredMaterialTokens->allTokens)),
useAsAnimationCache(
_Boolean(userArgs,
UsdMayaJobImportArgsTokens->useAsAnimationCache)),
Expand All @@ -584,6 +626,11 @@ UsdMayaJobImportArgs::UsdMayaJobImportArgs(
{
}

TfToken
UsdMayaJobImportArgs::GetMaterialConversion() const {
return shadingModes.empty() ? TfToken() : shadingModes.front().materialConversion;
}

/* static */
UsdMayaJobImportArgs UsdMayaJobImportArgs::CreateFromDictionary(
const VtDictionary& userArgs,
Expand Down Expand Up @@ -613,10 +660,11 @@ const VtDictionary& UsdMayaJobImportArgs::GetDefaultDictionary()
VtValue(SdfFieldKeys->Instanceable.GetString()),
VtValue(SdfFieldKeys->Kind.GetString())
});
d[UsdMayaJobImportArgsTokens->shadingMode] =
UsdMayaShadingModeTokens->displayColor.GetString();
d[UsdMayaJobImportArgsTokens->shadingConversion] =
UsdMayaShadingConversionTokens->lambert.GetString();
d[UsdMayaJobImportArgsTokens->shadingMode] = std::vector<VtValue> { VtValue(
std::vector<VtValue> { VtValue(UsdMayaShadingModeTokens->useRegistry.GetString()),
VtValue(UsdImagingTokens->UsdPreviewSurface.GetString()) }) };
d[UsdMayaJobImportArgsTokens->preferredMaterial]
= UsdMayaPreferredMaterialTokens->none.GetString();
d[UsdMayaJobImportArgsTokens->useAsAnimationCache] = false;

// plugInfo.json site defaults.
Expand All @@ -634,8 +682,12 @@ const VtDictionary& UsdMayaJobImportArgs::GetDefaultDictionary()
std::ostream&
operator <<(std::ostream& out, const UsdMayaJobImportArgs& importArgs)
{
out << "shadingMode: " << importArgs.shadingMode << std::endl
<< "shadingConversion: " << importArgs.shadingConversion << std::endl
out << "shadingModes (" << importArgs.shadingModes.size() << ")" << std::endl;
for (const auto& shadingMode : importArgs.shadingModes) {
out << " " << TfStringify(shadingMode.mode) << ", "
<< TfStringify(shadingMode.materialConversion) << std::endl;
}
out << "preferredMaterial: " << importArgs.preferredMaterial << std::endl
<< "assemblyRep: " << importArgs.assemblyRep << std::endl
<< "timeInterval: " << importArgs.timeInterval << std::endl
<< "useAsAnimationCache: " << TfStringify(importArgs.useAsAnimationCache) << std::endl
Expand Down
Loading

0 comments on commit 96d40b7

Please sign in to comment.