Skip to content

Commit

Permalink
Merge pull request #3786 from Autodesk/bailp/EMSUSD-1134/export-assig…
Browse files Browse the repository at this point in the history
…ned-materials

EMSUSD-1134 export assigned materials
  • Loading branch information
seando-adsk authored May 30, 2024
2 parents 2d46393 + 9078908 commit 969b20d
Show file tree
Hide file tree
Showing 19 changed files with 401 additions and 51 deletions.
1 change: 1 addition & 0 deletions lib/mayaUsd/commands/Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ their own purposes, similar to the Alembic export chaser example.
| `-exportCollectionBasedBindings` | `-cbb` | bool | false | Enable or disable export of collection-based material assigments. If this option is enabled, export of material collections (`-mcs`) is also enabled, which causes collections representing sets of geometry with the same material binding to be exported. Materials are bound to the created collections on the prim at `materialCollectionsPath` (specfied via the `-mcp` option). Direct (or per-gprim) bindings are not authored when collection-based bindings are enabled. |
| `-exportColorSets` | `-cls` | bool | true | Enable or disable the export of color sets |
| `-exportMaterials` | `-mat` | bool | true | Enable or disable the export of materials |
| `-exportAssignedMaterials` | `-ama` | bool | true | Export materials only if they are assigned to a mesh |
| `-exportMaterialUnderPrim` | `-mup` | bool | false | Export materials under the prim that is using them |
| `-exportInstances` | `-ein` | bool | true | Enable or disable the export of instances |
| `-referenceObjectMode` | `-rom` | string | `none` | Determines how to export reference objects for meshes. The reference object's points are exported as a primvar on the mesh object; the primvar name is determined by querying `UsdUtilsGetPrefName()`, which defaults to `pref`. Valid values are: `none` - No reference objects are exported, `attributeOnly` - Only meshes set with a valid "referenceObject" attached will be exported, `defaultToMesh` - Meshes with no "referenceObject" attached will export their own points |
Expand Down
4 changes: 4 additions & 0 deletions lib/mayaUsd/commands/baseExportCommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,10 @@ MSyntax MayaUSDExportCommand::createSyntax()
kExportMaterialsFlag,
UsdMayaJobExportArgsTokens->exportMaterials.GetText(),
MSyntax::kBoolean);
syntax.addFlag(
kExportAssignedMaterialsFlag,
UsdMayaJobExportArgsTokens->exportAssignedMaterials.GetText(),
MSyntax::kBoolean);
syntax.addFlag(
kExportMaterialUnderPrimFlag,
UsdMayaJobExportArgsTokens->exportMaterialUnderPrim.GetText(),
Expand Down
1 change: 1 addition & 0 deletions lib/mayaUsd/commands/baseExportCommand.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class MAYAUSD_CORE_PUBLIC MayaUSDExportCommand : public MPxCommand
static constexpr auto kDefaultUSDFormatFlag = "duf";
static constexpr auto kExportColorSetsFlag = "cls";
static constexpr auto kExportMaterialsFlag = "mat";
static constexpr auto kExportAssignedMaterialsFlag = "ama";
static constexpr auto kExportMaterialUnderPrimFlag = "mup";
static constexpr auto kExportUVsFlag = "uvs";
static constexpr auto kExportRelativeTexturesFlag = "rtx";
Expand Down
6 changes: 6 additions & 0 deletions lib/mayaUsd/fileio/jobs/jobArgs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,8 @@ UsdMayaJobExportArgs::UsdMayaJobExportArgs(
extractBoolean(userArgs, UsdMayaJobExportArgsTokens->exportCollectionBasedBindings))
, exportColorSets(extractBoolean(userArgs, UsdMayaJobExportArgsTokens->exportColorSets))
, exportMaterials(extractBoolean(userArgs, UsdMayaJobExportArgsTokens->exportMaterials))
, exportAssignedMaterials(
extractBoolean(userArgs, UsdMayaJobExportArgsTokens->exportAssignedMaterials))
, exportMaterialUnderPrim(
extractBoolean(userArgs, UsdMayaJobExportArgsTokens->exportMaterialUnderPrim))
, exportDefaultCameras(extractBoolean(userArgs, UsdMayaJobExportArgsTokens->defaultCameras))
Expand Down Expand Up @@ -715,6 +717,8 @@ std::ostream& operator<<(std::ostream& out, const UsdMayaJobExportArgs& exportAr
<< TfStringify(exportArgs.exportCollectionBasedBindings) << std::endl
<< "exportColorSets: " << TfStringify(exportArgs.exportColorSets) << std::endl
<< "exportMaterials: " << TfStringify(exportArgs.exportMaterials) << std::endl
<< "exportAssignedMaterials: " << TfStringify(exportArgs.exportAssignedMaterials)
<< std::endl
<< "exportMaterialUnderPrim: " << TfStringify(exportArgs.exportMaterialUnderPrim)
<< std::endl
<< "exportDefaultCameras: " << TfStringify(exportArgs.exportDefaultCameras) << std::endl
Expand Down Expand Up @@ -1005,6 +1009,7 @@ const VtDictionary& UsdMayaJobExportArgs::GetDefaultDictionary()
d[UsdMayaJobExportArgsTokens->exportCollectionBasedBindings] = false;
d[UsdMayaJobExportArgsTokens->exportColorSets] = true;
d[UsdMayaJobExportArgsTokens->exportMaterials] = true;
d[UsdMayaJobExportArgsTokens->exportAssignedMaterials] = true;
d[UsdMayaJobExportArgsTokens->exportMaterialUnderPrim] = false;
d[UsdMayaJobExportArgsTokens->exportDisplayColor] = false;
d[UsdMayaJobExportArgsTokens->exportDistanceUnit] = true;
Expand Down Expand Up @@ -1109,6 +1114,7 @@ const VtDictionary& UsdMayaJobExportArgs::GetGuideDictionary()
d[UsdMayaJobExportArgsTokens->exportCollectionBasedBindings] = _boolean;
d[UsdMayaJobExportArgsTokens->exportColorSets] = _boolean;
d[UsdMayaJobExportArgsTokens->exportMaterials] = _boolean;
d[UsdMayaJobExportArgsTokens->exportAssignedMaterials] = _boolean;
d[UsdMayaJobExportArgsTokens->exportMaterialUnderPrim] = _boolean;
d[UsdMayaJobExportArgsTokens->exportDisplayColor] = _boolean;
d[UsdMayaJobExportArgsTokens->exportDistanceUnit] = _boolean;
Expand Down
2 changes: 2 additions & 0 deletions lib/mayaUsd/fileio/jobs/jobArgs.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ TF_DECLARE_PUBLIC_TOKENS(
(exportCollectionBasedBindings) \
(exportColorSets) \
(exportMaterials) \
(exportAssignedMaterials) \
(exportMaterialUnderPrim) \
(exportDisplayColor) \
(exportDistanceUnit) \
Expand Down Expand Up @@ -208,6 +209,7 @@ struct UsdMayaJobExportArgs
const bool exportCollectionBasedBindings;
const bool exportColorSets;
const bool exportMaterials;
const bool exportAssignedMaterials;
const bool exportMaterialUnderPrim;
const bool exportDefaultCameras;
const bool exportDisplayColor;
Expand Down
67 changes: 35 additions & 32 deletions lib/mayaUsd/fileio/shading/shadingModeExporterContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,10 +234,10 @@ MObject UsdMayaShadingModeExportContext::GetDisplacementShader() const
return _GetShaderFromShadingEngine(_shadingEngine, _displacementShaderPlugName);
}

UsdMayaShadingModeExportContext::AssignmentVector
UsdMayaShadingModeExportContext::AssignmentsInfo
UsdMayaShadingModeExportContext::GetAssignments() const
{
AssignmentVector ret;
AssignmentsInfo ret;

MStatus status;
MFnDependencyNode seDepNode(_shadingEngine, &status);
Expand Down Expand Up @@ -300,12 +300,20 @@ UsdMayaShadingModeExportContext::GetAssignments() const
MDagPath dagPath = allDagPaths[instanceNumber];
TF_VERIFY(dagPath.instanceNumber() == instanceNumber);
#endif

MFnDagNode dagNode(dagPath, &status);
if (!status) {
continue;
}

ret.hasAnyAssignment = true;

// Note: the connections will be to the mesh, but the selection often
// contains the transform above the mesh or a higher-up ancestor,
// so also check the ancestors of the mesh.
for (MDagPath walkUpPath(dagPath); walkUpPath.length() > 0; walkUpPath.pop())
if (GetExportArgs().fullObjectList.hasItem(walkUpPath))
ret.hasAnyAssignmentInSelection = true;

auto iter = _dagPathToUsdMap.find(dagPath);
if (iter == _dagPathToUsdMap.end()) {
// Geometry w/ this material bound doesn't seem to exist in USD.
Expand Down Expand Up @@ -350,7 +358,7 @@ UsdMayaShadingModeExportContext::GetAssignments() const
faceIndices.push_back(faceIt.index());
}
}
ret.push_back(Assignment {
ret.assignments.push_back(Assignment {
usdPath, faceIndices, TfToken(dagNode.name().asChar()), dagNode.object() });
}
}
Expand Down Expand Up @@ -500,48 +508,43 @@ std::string getMaterialName(
}

bool shouldExportMaterial(
const UsdMayaShadingModeExportContext::AssignmentVector& assignmentsToBind,
const MObject& surfaceShader,
const UsdMayaJobExportArgs& exportArgs)
const UsdMayaShadingModeExportContext::AssignmentsInfo& assignmentsInfo,
const MObject& surfaceShader,
const UsdMayaJobExportArgs& exportArgs)
{
// If export-selected is on, only export selected materials
// and materials that are assigned to exported meshes.
//
// In the future, we plan to make exporting assigned materials
// that were not selected an option instead.
// The export-assigned-materials flag means to remove materials
// that are not assigned to any meshes. (We take into consideration
// even meshes that are not exported.)
if (exportArgs.exportAssignedMaterials) {
if (!assignmentsInfo.hasAnyAssignment) {
return false;
}
}

// In export-selected mode, ony export selected materials.
// Materials of exported meshes are also added to the selection.
if (exportArgs.exportSelected) {
if (assignmentsToBind.size() == 0) {
if (!exportArgs.fullObjectList.hasItem(surfaceShader)) {
return false;
}
if (assignmentsInfo.hasAnyAssignmentInSelection) {
return true;
}
return exportArgs.fullObjectList.hasItem(surfaceShader);
} else {
// If not exporting selected, then if exporting meshes, we only export
// assigned materials for now to avoid exporting too many unwanted and
// unused materials.
//
// In the future, we plan to make exporting only assigned materials
// an option instead.
if (exportArgs.isExportingMeshes()) {
return assignmentsToBind.size() > 0;
}
// In export-all mode, export all materials by default.
return true;
}

// By default we export the material.
return true;
}

} // namespace

UsdPrim UsdMayaShadingModeExportContext::MakeStandardMaterialPrim(
const AssignmentVector& assignmentsToBind,
const std::string& name) const
const AssignmentsInfo& assignmentsInfo,
const std::string& name) const
{
static const AssignmentVector emptyAssignments;

const UsdMayaJobExportArgs& exportArgs = GetExportArgs();

if (!shouldExportMaterial(assignmentsToBind, GetSurfaceShader(), exportArgs))
if (!shouldExportMaterial(assignmentsInfo, GetSurfaceShader(), exportArgs))
return UsdPrim();

const std::string materialName
Expand All @@ -550,7 +553,7 @@ UsdPrim UsdMayaShadingModeExportContext::MakeStandardMaterialPrim(
return UsdPrim();

const AssignmentVector& assignments
= exportArgs.exportMaterialUnderPrim ? assignmentsToBind : emptyAssignments;
= exportArgs.exportMaterialUnderPrim ? assignmentsInfo.assignments : emptyAssignments;

UsdStageRefPtr stage = GetUsdStage();
UsdPrim materialParent = _GetMaterialParent(
Expand Down
19 changes: 16 additions & 3 deletions lib/mayaUsd/fileio/shading/shadingModeExporterContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,17 +90,30 @@ class UsdMayaShadingModeExportContext
/// Vector of assignments.
typedef std::vector<Assignment> AssignmentVector;

// Information about the material assignments.
struct AssignmentsInfo
{
/// Assignments for this material.
std::vector<Assignment> assignments;
/// Flag indicating if the material has any assigments,
/// even to meshes that are not being exported.
bool hasAnyAssignment = false;
/// Flag indicating if the material has any assignments to a
/// mesh that was in the selection, even if meshes are not exported.
bool hasAnyAssignmentInSelection = false;
};

/// Returns a vector of binding assignments associated with the shading
/// engine.
MAYAUSD_CORE_PUBLIC
AssignmentVector GetAssignments() const;
AssignmentsInfo GetAssignments() const;

/// Use this function to create a UsdShadeMaterial prim at a "standard"
/// location computed by browsing the \p assignmentsToBind
MAYAUSD_CORE_PUBLIC
UsdPrim MakeStandardMaterialPrim(
const AssignmentVector& assignmentsToBind,
const std::string& name = std::string()) const;
const AssignmentsInfo& assignmentsInfo,
const std::string& name = std::string()) const;

/// Use this function to bind a UsdShadeMaterial prim to all assignments provided.
///
Expand Down
4 changes: 2 additions & 2 deletions lib/mayaUsd/fileio/shading/shadingModePxrRis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -273,11 +273,11 @@ class PxrRisShadingModeExporter : public UsdMayaShadingModeExporter
UsdShadeMaterial* const mat,
SdfPathSet* const boundPrimPaths) override
{
const UsdMayaShadingModeExportContext::AssignmentVector& assignments
const UsdMayaShadingModeExportContext::AssignmentsInfo& assignments
= context.GetAssignments();

UsdPrim materialPrim = context.MakeStandardMaterialPrim(assignments);
context.BindStandardMaterialPrim(materialPrim, assignments, boundPrimPaths);
context.BindStandardMaterialPrim(materialPrim, assignments.assignments, boundPrimPaths);
UsdShadeMaterial material(materialPrim);
if (!material) {
return;
Expand Down
6 changes: 3 additions & 3 deletions lib/mayaUsd/fileio/shading/shadingModeUseRegistry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -365,10 +365,10 @@ class UseRegistryShadingModeExporter : public UsdMayaShadingModeExporter
return;
}

const UsdMayaShadingModeExportContext::AssignmentVector& assignments
const UsdMayaShadingModeExportContext::AssignmentsInfo& assignments
= context.GetAssignments();

UsdPrim materialPrim = context.MakeStandardMaterialPrim(assignments, std::string());
UsdPrim materialPrim = context.MakeStandardMaterialPrim(assignments);
UsdShadeMaterial material(materialPrim);
if (!material) {
return;
Expand Down Expand Up @@ -422,7 +422,7 @@ class UseRegistryShadingModeExporter : public UsdMayaShadingModeExporter
}
}
}
context.BindStandardMaterialPrim(materialPrim, assignments, boundPrimPaths);
context.BindStandardMaterialPrim(materialPrim, assignments.assignments, boundPrimPaths);
}
};

Expand Down
1 change: 1 addition & 0 deletions lib/mayaUsd/python/wrapPrimWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,7 @@ void wrapJobExportArgs()
"exportCollectionBasedBindings", &UsdMayaJobExportArgs::exportCollectionBasedBindings)
.def_readonly("exportColorSets", &UsdMayaJobExportArgs::exportColorSets)
.def_readonly("exportMaterials", &UsdMayaJobExportArgs::exportMaterials)
.def_readonly("exportAssignedMaterials", &UsdMayaJobExportArgs::exportAssignedMaterials)
.def_readonly("exportComponentTags", &UsdMayaJobExportArgs::exportComponentTags)
.def_readonly("exportDefaultCameras", &UsdMayaJobExportArgs::exportDefaultCameras)
.def_readonly("exportDisplayColor", &UsdMayaJobExportArgs::exportDisplayColor)
Expand Down
Loading

0 comments on commit 969b20d

Please sign in to comment.