Skip to content

Commit

Permalink
Add Opacity Threshold Attribute to USD Preview Shader
Browse files Browse the repository at this point in the history
  • Loading branch information
dgovil committed Nov 16, 2020
1 parent fc769db commit 9578137
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
37 changes: 36 additions & 1 deletion lib/usd/pxrUsdPreviewSurface/usdPreviewSurface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ TF_DEFINE_PUBLIC_TOKENS(
PxrMayaUsdPreviewSurfaceTokens,
PXRUSDPREVIEWSURFACE_USD_PREVIEW_SURFACE_TOKENS);


/* static */
void* PxrMayaUsdPreviewSurface::creator() { return new PxrMayaUsdPreviewSurface(); }

Expand All @@ -60,6 +61,7 @@ MStatus PxrMayaUsdPreviewSurface::initialize()
MObject normalAttr;
MObject occlusionAttr;
MObject opacityAttr;
MObject opacityThresholdAttr;
MObject roughnessAttr;
MObject specularColorAttr;
MObject useSpecularWorkflowAttr;
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions lib/usd/pxrUsdPreviewSurface/usdPreviewSurface.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ PXR_NAMESPACE_OPEN_SCOPE
((NormalAttrName, "normal")) \
((OcclusionAttrName, "occlusion")) \
((OpacityAttrName, "opacity")) \
((OpacityThresholdAttrName, "opacityThreshold")) \
((RoughnessAttrName, "roughness")) \
((SpecularColorAttrName, "specularColor")) \
((UseSpecularWorkflowAttrName, "useSpecularWorkflow")) \
Expand Down Expand Up @@ -82,6 +83,7 @@ class PxrMayaUsdPreviewSurface : public MPxNode

PxrMayaUsdPreviewSurface(const PxrMayaUsdPreviewSurface&) = delete;
PxrMayaUsdPreviewSurface& operator=(const PxrMayaUsdPreviewSurface&) = delete;
MObject opacityThresholdAttr;
};

PXR_NAMESPACE_CLOSE_SCOPE
Expand Down
1 change: 1 addition & 0 deletions lib/usd/pxrUsdPreviewSurface/usdPreviewSurfaceReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
9 changes: 9 additions & 0 deletions lib/usd/pxrUsdPreviewSurface/usdPreviewSurfaceWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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"))
Expand Down

0 comments on commit 9578137

Please sign in to comment.