diff --git a/lib/mayaUsd/commands/baseImportCommand.cpp b/lib/mayaUsd/commands/baseImportCommand.cpp index ae08bf54ce..548a31a256 100644 --- a/lib/mayaUsd/commands/baseImportCommand.cpp +++ b/lib/mayaUsd/commands/baseImportCommand.cpp @@ -77,6 +77,11 @@ MSyntax MayaUSDImportCommand::createSyntax() UsdMayaJobImportArgsTokens->excludePrimvar.GetText(), MSyntax::kString); syntax.makeFlagMultiUse(kExcludePrimvarFlag); + syntax.addFlag( + kExcludePrimvarNamespaceFlag, + UsdMayaJobImportArgsTokens->excludePrimvarNamespace.GetText(), + MSyntax::kString); + syntax.makeFlagMultiUse(kExcludePrimvarNamespaceFlag); syntax.addFlag( kUseAsAnimationCacheFlag, UsdMayaJobImportArgsTokens->useAsAnimationCache.GetText(), diff --git a/lib/mayaUsd/commands/baseImportCommand.h b/lib/mayaUsd/commands/baseImportCommand.h index 3dbb9056cb..6f57cd3704 100644 --- a/lib/mayaUsd/commands/baseImportCommand.h +++ b/lib/mayaUsd/commands/baseImportCommand.h @@ -49,6 +49,7 @@ class MAYAUSD_CORE_PUBLIC MayaUSDImportCommand : public MPxCommand static constexpr auto kApiSchemaFlag = "api"; static constexpr auto kJobContextFlag = "jc"; static constexpr auto kExcludePrimvarFlag = "epv"; + static constexpr auto kExcludePrimvarNamespaceFlag = "epn"; static constexpr auto kUseAsAnimationCacheFlag = "uac"; static constexpr auto kImportChaserFlag = "chr"; static constexpr auto kImportChaserArgsFlag = "cha"; diff --git a/lib/mayaUsd/fileio/jobs/jobArgs.cpp b/lib/mayaUsd/fileio/jobs/jobArgs.cpp index 7fb645e2be..25e27784fa 100644 --- a/lib/mayaUsd/fileio/jobs/jobArgs.cpp +++ b/lib/mayaUsd/fileio/jobs/jobArgs.cpp @@ -1127,6 +1127,8 @@ UsdMayaJobImportArgs::UsdMayaJobImportArgs( UsdMayaJobImportArgsTokens->Import, UsdMayaJobImportArgsTokens->Unloaded })) , excludePrimvarNames(extractTokenSet(userArgs, UsdMayaJobImportArgsTokens->excludePrimvar)) + , excludePrimvarNamespaces( + extractTokenSet(userArgs, UsdMayaJobImportArgsTokens->excludePrimvarNamespace)) , includeAPINames(extractTokenSet(userArgs, UsdMayaJobImportArgsTokens->apiSchema)) , jobContextNames(extractTokenSet(userArgs, UsdMayaJobImportArgsTokens->jobContext)) , includeMetadataKeys(extractTokenSet(userArgs, UsdMayaJobImportArgsTokens->metadata)) @@ -1185,6 +1187,7 @@ const VtDictionary& UsdMayaJobImportArgs::GetDefaultDictionary() = UsdMayaJobImportArgsTokens->Collapsed.GetString(); d[UsdMayaJobImportArgsTokens->apiSchema] = std::vector(); d[UsdMayaJobImportArgsTokens->excludePrimvar] = std::vector(); + d[UsdMayaJobImportArgsTokens->excludePrimvarNamespace] = std::vector(); d[UsdMayaJobImportArgsTokens->jobContext] = std::vector(); d[UsdMayaJobImportArgsTokens->metadata] = std::vector({ VtValue(SdfFieldKeys->Hidden.GetString()), @@ -1267,6 +1270,7 @@ const VtDictionary& UsdMayaJobImportArgs::GetGuideDictionary() d[UsdMayaJobImportArgsTokens->assemblyRep] = _string; d[UsdMayaJobImportArgsTokens->apiSchema] = _stringVector; d[UsdMayaJobImportArgsTokens->excludePrimvar] = _stringVector; + d[UsdMayaJobImportArgsTokens->excludePrimvarNamespace] = _stringVector; d[UsdMayaJobImportArgsTokens->jobContext] = _stringVector; d[UsdMayaJobImportArgsTokens->metadata] = _stringVector; d[UsdMayaJobImportArgsTokens->shadingMode] = _stringTupletVector; diff --git a/lib/mayaUsd/fileio/jobs/jobArgs.h b/lib/mayaUsd/fileio/jobs/jobArgs.h index 486ec8851f..f078ce2c53 100644 --- a/lib/mayaUsd/fileio/jobs/jobArgs.h +++ b/lib/mayaUsd/fileio/jobs/jobArgs.h @@ -141,6 +141,7 @@ TF_DECLARE_PUBLIC_TOKENS( (apiSchema) \ (assemblyRep) \ (excludePrimvar) \ + (excludePrimvarNamespace) \ (jobContext) \ (metadata) \ (shadingMode) \ @@ -327,6 +328,7 @@ struct UsdMayaJobImportArgs { const TfToken assemblyRep; const TfToken::Set excludePrimvarNames; + const TfToken::Set excludePrimvarNamespaces; const TfToken::Set includeAPINames; const TfToken::Set jobContextNames; const TfToken::Set includeMetadataKeys; diff --git a/lib/mayaUsd/fileio/primReaderArgs.cpp b/lib/mayaUsd/fileio/primReaderArgs.cpp index 4ee7ce8081..f00ec094c5 100644 --- a/lib/mayaUsd/fileio/primReaderArgs.cpp +++ b/lib/mayaUsd/fileio/primReaderArgs.cpp @@ -43,6 +43,11 @@ const TfToken::Set& UsdMayaPrimReaderArgs::GetExcludePrimvarNames() const return _jobArgs.excludePrimvarNames; } +const TfToken::Set& UsdMayaPrimReaderArgs::GetExcludePrimvarNamespaces() const +{ + return _jobArgs.excludePrimvarNamespaces; +} + bool UsdMayaPrimReaderArgs::GetUseAsAnimationCache() const { return _jobArgs.useAsAnimationCache; } PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/mayaUsd/fileio/primReaderArgs.h b/lib/mayaUsd/fileio/primReaderArgs.h index bab9a5ce65..d6649f2f0d 100644 --- a/lib/mayaUsd/fileio/primReaderArgs.h +++ b/lib/mayaUsd/fileio/primReaderArgs.h @@ -59,6 +59,9 @@ class UsdMayaPrimReaderArgs MAYAUSD_CORE_PUBLIC const TfToken::Set& GetExcludePrimvarNames() const; + MAYAUSD_CORE_PUBLIC + const TfToken::Set& GetExcludePrimvarNamespaces() const; + MAYAUSD_CORE_PUBLIC bool GetUseAsAnimationCache() const; diff --git a/lib/mayaUsd/fileio/utils/meshReadUtils.cpp b/lib/mayaUsd/fileio/utils/meshReadUtils.cpp index ad0797fef1..bc8a7c33a7 100644 --- a/lib/mayaUsd/fileio/utils/meshReadUtils.cpp +++ b/lib/mayaUsd/fileio/utils/meshReadUtils.cpp @@ -596,7 +596,8 @@ void UsdMayaMeshReadUtils::setEmitNormalsTag(MFnMesh& meshFn, const bool emitNor void UsdMayaMeshReadUtils::assignPrimvarsToMesh( const UsdGeomMesh& mesh, const MObject& meshObj, - const TfToken::Set& excludePrimvarSet) + const TfToken::Set& excludePrimvarSet, + const TfToken::Set& excludePrivarNamespaceSet) { if (meshObj.apiType() != MFn::kMesh) { return; @@ -621,6 +622,25 @@ void UsdMayaMeshReadUtils::assignPrimvarsToMesh( continue; } + // Exclude primvars if they match with the exclude namespac + if (primvar.NameContainsNamespaces()) { + std::string primVarString = fullName.GetString(); + bool skipPrimvar = false; + for (const TfToken& primVarNameSpace : excludePrivarNamespaceSet) { + std::string primVarNameSpaceString = primVarNameSpace.GetString(); + + // The primVarString is a substring of excludePrimVarNamespace string from the + // beginning + if (primVarString.find(primVarNameSpaceString) == 0) { + skipPrimvar = true; + break; + } + } + if (skipPrimvar) { + continue; + } + } + // If the primvar is called either displayColor or displayOpacity check // if it was really authored from the user. It may not have been // authored by the user, for example if it was generated by shader diff --git a/lib/mayaUsd/fileio/utils/meshReadUtils.h b/lib/mayaUsd/fileio/utils/meshReadUtils.h index 222a17cd98..06f1389b31 100644 --- a/lib/mayaUsd/fileio/utils/meshReadUtils.h +++ b/lib/mayaUsd/fileio/utils/meshReadUtils.h @@ -82,7 +82,8 @@ MAYAUSD_CORE_PUBLIC void assignPrimvarsToMesh( const UsdGeomMesh& mesh, const MObject& meshObj, - const TfToken::Set& excludePrimvarSet); + const TfToken::Set& excludePrimvarSet, + const TfToken::Set& excludePrimvarNamespaceSet); MAYAUSD_CORE_PUBLIC void assignInvisibleFaces(const UsdGeomMesh& mesh, const MObject& meshObj); diff --git a/lib/mayaUsd/python/wrapPrimReader.cpp b/lib/mayaUsd/python/wrapPrimReader.cpp index b00ff54bbb..66c0f6822d 100644 --- a/lib/mayaUsd/python/wrapPrimReader.cpp +++ b/lib/mayaUsd/python/wrapPrimReader.cpp @@ -453,6 +453,11 @@ void wrapJobImportArgs() make_getter( &UsdMayaJobImportArgs::excludePrimvarNames, return_value_policy())) + .add_property( + "excludePrimvarNamespaces", + make_getter( + &UsdMayaJobImportArgs::excludePrimvarNamespaces, + return_value_policy())) .def_readonly("importInstances", &UsdMayaJobImportArgs::importInstances) .def_readonly("importUSDZTextures", &UsdMayaJobImportArgs::importUSDZTextures) .def_readonly( @@ -512,6 +517,10 @@ void wrapPrimReaderArgs() "GetExcludePrimvarNames", &UsdMayaPrimReaderArgs::GetExcludePrimvarNames, return_internal_reference<>()) + .def( + "GetExcludePrimvarNamespaces", + &UsdMayaPrimReaderArgs::GetExcludePrimvarNamespaces, + return_internal_reference<>()) .def("GetUseAsAnimationCache", &UsdMayaPrimReaderArgs::GetUseAsAnimationCache); } diff --git a/lib/usd/translators/meshReader.cpp b/lib/usd/translators/meshReader.cpp index ab84f7b9e3..5710c91121 100644 --- a/lib/usd/translators/meshReader.cpp +++ b/lib/usd/translators/meshReader.cpp @@ -126,7 +126,10 @@ bool MayaUsdPrimReaderMesh::Read(UsdMayaPrimReaderContext& context) // assign primvars to mesh UsdMayaMeshReadUtils::assignPrimvarsToMesh( - mesh, meshRead.meshObject(), _GetArgs().GetExcludePrimvarNames()); + mesh, + meshRead.meshObject(), + _GetArgs().GetExcludePrimvarNames(), + _GetArgs().GetExcludePrimvarNamespaces()); // assign invisible faces UsdMayaMeshReadUtils::assignInvisibleFaces(mesh, meshRead.meshObject()); diff --git a/test/lib/usd/translators/UsdImportColorSetsTest/UsdImportColorSetsTest.usda b/test/lib/usd/translators/UsdImportColorSetsTest/UsdImportColorSetsTest.usda index 0007169833..3c62807bfa 100644 --- a/test/lib/usd/translators/UsdImportColorSetsTest/UsdImportColorSetsTest.usda +++ b/test/lib/usd/translators/UsdImportColorSetsTest/UsdImportColorSetsTest.usda @@ -63,6 +63,12 @@ def Xform "UsdImportColorSetsTest" ( float[] primvars:ExcludeMeNot = [.5] ( interpolation = "constant" ) + float[] primvars:ExcludeMeNamespace:ExcludeMeToo:testExclude = [.5] ( + interpolation = "constant" + ) + float[] primvars:ExcludeMeNotNamespace:ExcludeMeNotEither:testExclude = [.5] ( + interpolation = "constant" + ) int[] primvars:FaceColor_Full_kAlpha:indices = [0, 1, 2, 3, 4, 5] color3f[] primvars:FaceColor_Full_kRGB = [(1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 0), (1, 0, 1), (0, 1, 1)] ( interpolation = "uniform" diff --git a/test/lib/usd/translators/testUsdImportColorSets.py b/test/lib/usd/translators/testUsdImportColorSets.py index a81a052366..5c4c17de3e 100644 --- a/test/lib/usd/translators/testUsdImportColorSets.py +++ b/test/lib/usd/translators/testUsdImportColorSets.py @@ -131,7 +131,7 @@ def setUpClass(cls): usdFile = os.path.join(inputPath, "UsdImportColorSetsTest", "UsdImportColorSetsTest.usda") cmds.usdImport(file=usdFile, shadingMode=[['none', 'default'], ], - excludePrimvar='ExcludeMe') + excludePrimvar='ExcludeMe',excludePrimvarNamespace="ExcludeMeNamespace:ExcludeMeToo") def _GetMayaMesh(self, meshName): selectionList = OpenMaya.MSelectionList() @@ -596,6 +596,13 @@ def testExcludePrimvars(self): self.assertNotIn("ExcludeMe", colorSets) self.assertIn("ExcludeMeNot", colorSets) + def testExcludePrimvarNameSpaces(self): + """Tests excluding primvars when importing color sets.""" + mayaCubeMesh = self._GetMayaMesh('ColorSetsCubeShape') + colorSets = mayaCubeMesh.getColorSetNames() + self.assertNotIn("ExcludeMeNamespace:ExcludeMeToo:testExclude", colorSets) + self.assertIn("ExcludeMeNotNamespace:ExcludeMeNotEither:testExclude", colorSets) + if __name__ == '__main__': unittest.main(verbosity=2)