diff --git a/lib/usd/translators/shading/usdFileTextureWriter.cpp b/lib/usd/translators/shading/usdFileTextureWriter.cpp index bd6f7cf518..a9f7f7f759 100644 --- a/lib/usd/translators/shading/usdFileTextureWriter.cpp +++ b/lib/usd/translators/shading/usdFileTextureWriter.cpp @@ -37,6 +37,7 @@ #include #include +#include #include #include #include @@ -72,6 +73,7 @@ TF_DEFINE_PRIVATE_TOKENS( (alphaOffset) (colorGain) (colorOffset) + (colorSpace) (defaultColor) (fileTextureName) (outAlpha) @@ -233,11 +235,20 @@ PxrUsdTranslators_FileTextureWriter::Write(const UsdTimeCode& usdTime) fileTextureName = relativePath.generic_string(); } - shaderSchema.CreateInput( - _tokens->file, - SdfValueTypeNames->Asset).Set( - SdfAssetPath(fileTextureName.c_str()), - usdTime); + UsdShadeInput fileInput = shaderSchema.CreateInput(_tokens->file, SdfValueTypeNames->Asset); + fileInput.Set(SdfAssetPath(fileTextureName.c_str()), usdTime); + + MPlug colorSpacePlug = depNodeFn.findPlug(_tokens->colorSpace.GetText(), true, &status); + if (status == MS::kSuccess) { + MString colorRuleCmd; + colorRuleCmd.format( + "colorManagementFileRules -evaluate \"^1s\";", fileTextureNamePlug.asString()); + const MString colorSpaceByRule(MGlobal::executeCommandStringResult(colorRuleCmd)); + const MString colorSpace(colorSpacePlug.asString(&status)); + if (status == MS::kSuccess && colorSpace != colorSpaceByRule) { + fileInput.GetAttr().SetColorSpace(TfToken(colorSpace.asChar())); + } + } // The Maya file node's 'colorGain' and 'alphaGain' attributes map to the // UsdUVTexture's scale input. diff --git a/lib/usd/translators/shading/usdUVTextureReader.cpp b/lib/usd/translators/shading/usdUVTextureReader.cpp index a79a022cc5..49fecdcf96 100644 --- a/lib/usd/translators/shading/usdUVTextureReader.cpp +++ b/lib/usd/translators/shading/usdUVTextureReader.cpp @@ -60,6 +60,7 @@ TF_DEFINE_PRIVATE_TOKENS( (alphaOffset) (colorGain) (colorOffset) + (colorSpace) (defaultColor) (fileTextureName) (outAlpha) @@ -190,6 +191,15 @@ bool PxrMayaUsdUVTexture_Reader::Read(UsdMayaPrimReaderContext* context) if (status == MS::kSuccess) { UsdMayaReadUtil::SetMayaAttr(mayaAttr, val); } + + // colorSpace: + if (usdInput.GetAttr().HasColorSpace()) { + MString colorSpace = usdInput.GetAttr().GetColorSpace().GetText(); + mayaAttr = depFn.findPlug(_tokens->colorSpace.GetText(), true, &status); + if (status == MS::kSuccess) { + mayaAttr.setString(colorSpace); + } + } } // The Maya file node's 'colorGain' and 'alphaGain' attributes map to the diff --git a/test/lib/usd/translators/testUsdExportImportRoundtripPreviewSurface.py b/test/lib/usd/translators/testUsdExportImportRoundtripPreviewSurface.py index c824cf2d3e..77152da21f 100644 --- a/test/lib/usd/translators/testUsdExportImportRoundtripPreviewSurface.py +++ b/test/lib/usd/translators/testUsdExportImportRoundtripPreviewSurface.py @@ -86,6 +86,7 @@ def testUsdPreviewSurfaceRoundtrip(self): txfile = os.path.join("UsdExportImportRoundtripPreviewSurface", "Brazilian_rosewood_pxr128.png") cmds.setAttr(file_node+".fileTextureName", txfile, type="string") + cmds.setAttr(file_node+".colorSpace", "ACEScg", type="string") cmds.setAttr(file_node + ".defaultColor", 0.5, 0.25, 0.125, type="double3") @@ -135,6 +136,7 @@ def testUsdPreviewSurfaceRoundtrip(self): self.assertTrue(cmds.getAttr("usdPreviewSurface2.useSpecularWorkflow")) self.assertEqual(cmds.getAttr("file2.defaultColor"), [(0.5, 0.25, 0.125)]) + self.assertEqual(cmds.getAttr(file_node+".colorSpace"), "ACEScg") original_path = cmds.getAttr(file_node+".fileTextureName") imported_path = cmds.getAttr("file2.fileTextureName") # imported path will be absolute: