From 9578137ba1ef3fd300c1a8f0b7bd159f9e3f1929 Mon Sep 17 00:00:00 2001 From: Dhruv Govil Date: Wed, 11 Nov 2020 13:45:13 -0800 Subject: [PATCH] Add Opacity Threshold Attribute to USD Preview Shader --- .../AEusdPreviewSurfaceTemplate.mel | 1 + .../usdPreviewSurface.cpp | 37 ++++++++++++++++++- .../pxrUsdPreviewSurface/usdPreviewSurface.h | 2 + .../usdPreviewSurfaceReader.cpp | 1 + .../usdPreviewSurfaceWriter.cpp | 9 +++++ ...tUsdExportImportRoundtripPreviewSurface.py | 3 ++ 6 files changed, 52 insertions(+), 1 deletion(-) diff --git a/lib/usd/pxrUsdPreviewSurface/AEusdPreviewSurfaceTemplate.mel b/lib/usd/pxrUsdPreviewSurface/AEusdPreviewSurfaceTemplate.mel index 0435acd8a8..b207ce6324 100644 --- a/lib/usd/pxrUsdPreviewSurface/AEusdPreviewSurfaceTemplate.mel +++ b/lib/usd/pxrUsdPreviewSurface/AEusdPreviewSurfaceTemplate.mel @@ -41,6 +41,7 @@ global proc AE${PREVIEWSURFACE_MAYA_TYPE_NAME}Template(string $nodeName) editorTemplate -addControl "emissiveColor"; editorTemplate -addControl "occlusion"; editorTemplate -addControl "opacity"; + editorTemplate -addControl "opacityThreshold"; editorTemplate -beginLayout "Specular" -collapse false; editorTemplate -addControl "useSpecularWorkflow" diff --git a/lib/usd/pxrUsdPreviewSurface/usdPreviewSurface.cpp b/lib/usd/pxrUsdPreviewSurface/usdPreviewSurface.cpp index 91892f1328..efee0a7f69 100644 --- a/lib/usd/pxrUsdPreviewSurface/usdPreviewSurface.cpp +++ b/lib/usd/pxrUsdPreviewSurface/usdPreviewSurface.cpp @@ -42,6 +42,7 @@ TF_DEFINE_PUBLIC_TOKENS( PxrMayaUsdPreviewSurfaceTokens, PXRUSDPREVIEWSURFACE_USD_PREVIEW_SURFACE_TOKENS); + /* static */ void* PxrMayaUsdPreviewSurface::creator() { return new PxrMayaUsdPreviewSurface(); } @@ -60,6 +61,7 @@ MStatus PxrMayaUsdPreviewSurface::initialize() MObject normalAttr; MObject occlusionAttr; MObject opacityAttr; + MObject opacityThresholdAttr; MObject roughnessAttr; MObject specularColorAttr; MObject useSpecularWorkflowAttr; @@ -228,6 +230,24 @@ MStatus PxrMayaUsdPreviewSurface::initialize() status = addAttribute(opacityAttr); CHECK_MSTATUS_AND_RETURN_IT(status); + opacityThresholdAttr = numericAttrFn.create( + PxrMayaUsdPreviewSurfaceTokens->OpacityThresholdAttrName.GetText(), + "opt", + MFnNumericData::kFloat, + 0.0, + &status); + CHECK_MSTATUS_AND_RETURN_IT(status); + status = numericAttrFn.setSoftMin(0.0); + CHECK_MSTATUS_AND_RETURN_IT(status); + status = numericAttrFn.setSoftMax(1.0); + CHECK_MSTATUS_AND_RETURN_IT(status); + status = numericAttrFn.setKeyable(true); + CHECK_MSTATUS_AND_RETURN_IT(status); + status = numericAttrFn.setAffectsAppearance(true); + CHECK_MSTATUS_AND_RETURN_IT(status); + status = addAttribute(opacityThresholdAttr); + CHECK_MSTATUS_AND_RETURN_IT(status); + roughnessAttr = numericAttrFn.create( PxrMayaUsdPreviewSurfaceTokens->RoughnessAttrName.GetText(), "rgh", @@ -345,6 +365,8 @@ MStatus PxrMayaUsdPreviewSurface::initialize() CHECK_MSTATUS_AND_RETURN_IT(status); status = attributeAffects(opacityAttr, outColorAttr); CHECK_MSTATUS_AND_RETURN_IT(status); + status = attributeAffects(opacityThresholdAttr, outColorAttr); + CHECK_MSTATUS_AND_RETURN_IT(status); status = attributeAffects(roughnessAttr, outColorAttr); CHECK_MSTATUS_AND_RETURN_IT(status); status = attributeAffects(specularColorAttr, outColorAttr); @@ -354,6 +376,8 @@ MStatus PxrMayaUsdPreviewSurface::initialize() status = attributeAffects(opacityAttr, outTransparencyAttr); CHECK_MSTATUS_AND_RETURN_IT(status); + status = attributeAffects(opacityThresholdAttr, outTransparencyAttr); + CHECK_MSTATUS_AND_RETURN_IT(status); status = attributeAffects(opacityAttr, outTransparencyOnAttr); CHECK_MSTATUS_AND_RETURN_IT(status); @@ -399,7 +423,18 @@ MStatus PxrMayaUsdPreviewSurface::compute(const MPlug& plug, MDataBlock& dataBlo = depNodeFn.attribute(PxrMayaUsdPreviewSurfaceTokens->OpacityAttrName.GetText()); const MDataHandle opacityData = dataBlock.inputValue(opacityAttr, &status); CHECK_MSTATUS(status); - const float opacity = opacityData.asFloat(); + float opacity = opacityData.asFloat(); + + MObject opacityThresholdAttr + = depNodeFn.attribute(PxrMayaUsdPreviewSurfaceTokens->OpacityThresholdAttrName.GetText()); + const MDataHandle opacityThresholdData + = dataBlock.inputValue(opacityThresholdAttr, &status); + CHECK_MSTATUS(status); + const float opacityThreshold = opacityThresholdData.asFloat(); + + if (opacity < opacityThreshold) { + opacity = 0.0f; + } const float transparency = 1.0f - opacity; const MFloatVector transparencyColor(transparency, transparency, transparency); diff --git a/lib/usd/pxrUsdPreviewSurface/usdPreviewSurface.h b/lib/usd/pxrUsdPreviewSurface/usdPreviewSurface.h index 7aaf583b6a..7c7c6a9ece 100644 --- a/lib/usd/pxrUsdPreviewSurface/usdPreviewSurface.h +++ b/lib/usd/pxrUsdPreviewSurface/usdPreviewSurface.h @@ -45,6 +45,7 @@ PXR_NAMESPACE_OPEN_SCOPE ((NormalAttrName, "normal")) \ ((OcclusionAttrName, "occlusion")) \ ((OpacityAttrName, "opacity")) \ + ((OpacityThresholdAttrName, "opacityThreshold")) \ ((RoughnessAttrName, "roughness")) \ ((SpecularColorAttrName, "specularColor")) \ ((UseSpecularWorkflowAttrName, "useSpecularWorkflow")) \ @@ -82,6 +83,7 @@ class PxrMayaUsdPreviewSurface : public MPxNode PxrMayaUsdPreviewSurface(const PxrMayaUsdPreviewSurface&) = delete; PxrMayaUsdPreviewSurface& operator=(const PxrMayaUsdPreviewSurface&) = delete; + MObject opacityThresholdAttr; }; PXR_NAMESPACE_CLOSE_SCOPE diff --git a/lib/usd/pxrUsdPreviewSurface/usdPreviewSurfaceReader.cpp b/lib/usd/pxrUsdPreviewSurface/usdPreviewSurfaceReader.cpp index 0019aa2139..1a763893e1 100644 --- a/lib/usd/pxrUsdPreviewSurface/usdPreviewSurfaceReader.cpp +++ b/lib/usd/pxrUsdPreviewSurface/usdPreviewSurfaceReader.cpp @@ -137,6 +137,7 @@ TfToken PxrMayaUsdPreviewSurface_Reader::GetMayaNameForUsdAttrName(const TfToken || baseName == PxrMayaUsdPreviewSurfaceTokens->NormalAttrName || baseName == PxrMayaUsdPreviewSurfaceTokens->OcclusionAttrName || baseName == PxrMayaUsdPreviewSurfaceTokens->OpacityAttrName + || baseName == PxrMayaUsdPreviewSurfaceTokens->OpacityThresholdAttrName || baseName == PxrMayaUsdPreviewSurfaceTokens->RoughnessAttrName || baseName == PxrMayaUsdPreviewSurfaceTokens->SpecularColorAttrName || baseName == PxrMayaUsdPreviewSurfaceTokens->UseSpecularWorkflowAttrName) { diff --git a/lib/usd/pxrUsdPreviewSurface/usdPreviewSurfaceWriter.cpp b/lib/usd/pxrUsdPreviewSurface/usdPreviewSurfaceWriter.cpp index ec4bab7ce5..82c72763b3 100644 --- a/lib/usd/pxrUsdPreviewSurface/usdPreviewSurfaceWriter.cpp +++ b/lib/usd/pxrUsdPreviewSurface/usdPreviewSurfaceWriter.cpp @@ -253,6 +253,14 @@ void PxrMayaUsdPreviewSurface_Writer::Write(const UsdTimeCode& usdTime) SdfValueTypeNames->Float, usdTime); + // Opacity Threshold + _AuthorShaderInputFromShadingNodeAttr( + depNodeFn, + shaderSchema, + PxrMayaUsdPreviewSurfaceTokens->OpacityThresholdAttrName, + SdfValueTypeNames->Float, + usdTime); + // Roughness _AuthorShaderInputFromShadingNodeAttr( depNodeFn, @@ -306,6 +314,7 @@ PxrMayaUsdPreviewSurface_Writer::GetShadingAttributeNameForMayaAttrName(const Tf || mayaAttrName == PxrMayaUsdPreviewSurfaceTokens->NormalAttrName || mayaAttrName == PxrMayaUsdPreviewSurfaceTokens->OcclusionAttrName || mayaAttrName == PxrMayaUsdPreviewSurfaceTokens->OpacityAttrName + || mayaAttrName == PxrMayaUsdPreviewSurfaceTokens->OpacityThresholdAttrName || mayaAttrName == PxrMayaUsdPreviewSurfaceTokens->RoughnessAttrName || mayaAttrName == PxrMayaUsdPreviewSurfaceTokens->SpecularColorAttrName || mayaAttrName == PxrMayaUsdPreviewSurfaceTokens->UseSpecularWorkflowAttrName) { diff --git a/test/lib/usd/translators/testUsdExportImportRoundtripPreviewSurface.py b/test/lib/usd/translators/testUsdExportImportRoundtripPreviewSurface.py index 77152da21f..782ccbd90e 100644 --- a/test/lib/usd/translators/testUsdExportImportRoundtripPreviewSurface.py +++ b/test/lib/usd/translators/testUsdExportImportRoundtripPreviewSurface.py @@ -68,6 +68,7 @@ def testUsdPreviewSurfaceRoundtrip(self): cmds.setAttr(material_node + ".specularColor", 0.125, 0.25, 0.75, type="double3") cmds.setAttr(material_node + ".useSpecularWorkflow", True) + cmds.setAttr(material_node + ".opacityThreshold", 0.5) file_node = cmds.shadingNode("file", asTexture=True, isColorManaged=True) @@ -131,6 +132,8 @@ def testUsdPreviewSurfaceRoundtrip(self): # Check values: self.assertAlmostEqual(cmds.getAttr("usdPreviewSurface2.roughness"), 0.25) + self.assertAlmostEqual(cmds.getAttr("usdPreviewSurface2.opacityThreshold"), + 0.5) self.assertEqual(cmds.getAttr("usdPreviewSurface2.specularColor"), [(0.125, 0.25, 0.75)]) self.assertTrue(cmds.getAttr("usdPreviewSurface2.useSpecularWorkflow"))