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

MAYA-102319 - Material import options rework #822

Merged
merged 5 commits into from
Oct 14, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
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);
JGamache-autodesk marked this conversation as resolved.
Show resolved Hide resolved
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
148 changes: 102 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,59 @@ 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());
JGamache-autodesk marked this conversation as resolved.
Show resolved Hide resolved
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) {
appendToResult(UsdMayaShadingModeRegistry::GetImporterNiceName(s).c_str());
}
}
appendToResult(UsdMayaShadingModeRegistry::GetMaterialConversionInfo(
UsdImagingTokens->UsdPreviewSurface)
.niceName.GetText());
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 +145,56 @@ 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, false);
if (shadingMode.IsEmpty()) {
return MS::kNotFound;
}
appendToResult(shadingMode.GetText());
if (!materialConversion.IsEmpty()) {
appendToResult(materialConversion.GetText());
} else {
appendToResult(UsdMayaShadingModeTokens->default.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);
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(_tokens->NoneExportDescription.GetText());
JGamache-autodesk marked this conversation as resolved.
Show resolved Hide resolved
} 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 +203,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 +229,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
81 changes: 64 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);

TfTokenVector modes = UsdMayaShadingModeRegistry::ListImporters();
JGamache-autodesk marked this conversation as resolved.
Show resolved Hide resolved

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.emplace_back(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;
JGamache-autodesk marked this conversation as resolved.
Show resolved Hide resolved
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 Down Expand Up @@ -613,10 +655,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 +677,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.first) << ", " << TfStringify(shadingMode.second)
<< 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
7 changes: 4 additions & 3 deletions lib/mayaUsd/fileio/jobs/jobArgs.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ TF_DECLARE_PUBLIC_TOKENS(
(excludePrimvar) \
(metadata) \
(shadingMode) \
(shadingConversion) \
(preferredMaterial) \
(useAsAnimationCache) \
/* assemblyRep values */ \
(Collapsed) \
Expand Down Expand Up @@ -250,8 +250,9 @@ struct UsdMayaJobImportArgs
const TfToken::Set excludePrimvarNames;
const TfToken::Set includeAPINames;
const TfToken::Set includeMetadataKeys;
TfToken shadingMode; // XXX can we make this const?
const TfToken shadingConversion;
using ShadingModes = std::vector<std::pair<TfToken, TfToken>>;
ShadingModes shadingModes; // XXX can we make this const?
const TfToken preferredMaterial;
const bool useAsAnimationCache;

const bool importWithProxyShapes;
Expand Down
Loading