Skip to content

Commit

Permalink
HYDRA-1291 : Fix default maya material is not picked up correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
lanierd-adsk committed Nov 14, 2024
1 parent 520c8bd commit efdcd48
Show file tree
Hide file tree
Showing 9 changed files with 59 additions and 40 deletions.
4 changes: 0 additions & 4 deletions lib/mayaHydra/hydraExtensions/adapters/renderItemAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,7 @@
#include <pxr/usdImaging/usdImaging/tokens.h>

#include <maya/MAnimControl.h>
#include <maya/MDGContext.h>
#include <maya/MDGContextGuard.h>
#include <maya/MHWGeometry.h>
#include <maya/MShaderManager.h>
#include <maya/MViewport2Renderer.h>

#include <functional>

Expand Down
34 changes: 33 additions & 1 deletion lib/mayaHydra/hydraExtensions/mayaUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <maya/MSelectionList.h>
#include <maya/MObjectArray.h>
#include <maya/MFnAttribute.h>
#include <maya/MItDependencyNodes.h>

namespace
{
Expand Down Expand Up @@ -193,6 +194,37 @@ bool IsDagPathAnArnoldSkyDomeLight(const MDagPath& dagPath)
shapeDagPath.extendToShape();
return _aiSkyDomeLight == MFnDependencyNode(shapeDagPath.node()).typeName();
}



MObject getDefaultMaterialShadingGroupNode()
{
MStatus status;

// Iterate over all shading engines
MItDependencyNodes itDep(MFn::kShadingEngine, &status);
if (status != MStatus::kSuccess) {
MGlobal::displayError("Failed to create dependency node iterator.");
return MObject::kNullObj;
}

while (!itDep.isDone()) {
MObject shadingEngine = itDep.item();
MFnDependencyNode shadingEngineFn(shadingEngine, &status);
if (status != MStatus::kSuccess) {
MGlobal::displayError("Failed to create dependency node function set.");
return MObject::kNullObj;
}

// Is this shading engine the default material ?
if (shadingEngineFn.name() == "initialShadingGroup") {
return shadingEngine;
}

itDep.next();
}

MGlobal::displayError("Failed to find the default material shader.");
return MObject::kNullObj;
}

} // namespace MAYAHYDRA_NS_DEF
8 changes: 8 additions & 0 deletions lib/mayaHydra/hydraExtensions/mayaUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,14 @@ MObject GetShadingGroupFromShader(const MObject& shader);
*/
bool IsDagPathAnArnoldSkyDomeLight(const MDagPath& dagPath);

/**
* @brief Get the default material shading group node using the shadingEngine named "initialShadingGroup".
*
* @return a valid MObject if we succeeded finding the default material shading group or MObject::kNullObj otherwise
*/

MObject getDefaultMaterialShadingGroupNode();

} // namespace MAYAHYDRA_NS_DEF

#endif // MAYAHYDRALIB_MAYA_UTILS_H
38 changes: 14 additions & 24 deletions lib/mayaHydra/hydraExtensions/sceneIndex/mayaHydraSceneIndex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,11 @@
#include <maya/MDagPath.h>
#include <maya/MDagPathArray.h>
#include <maya/MFnComponent.h>
#include <maya/MFnMesh.h>
#include <maya/MItDag.h>
#include <maya/MMatrixArray.h>
#include <maya/MObjectHandle.h>
#include <maya/MPlug.h>
#include <maya/MPlugArray.h>
#include <maya/MProfiler.h>
#include <maya/MObjectArray.h>
#include <maya/MSelectionList.h>
#include <maya/MShaderManager.h>
#include <maya/MString.h>
#include <maya/MGlobal.h>
#include <maya/MItSelectionList.h>
Expand Down Expand Up @@ -163,7 +159,7 @@ TF_DEFINE_PRIVATE_TOKENS(

SdfPath MayaHydraSceneIndex::_fallbackMaterial;
SdfPath MayaHydraSceneIndex::_mayaDefaultMaterialPath; // Common to all scene indexes
VtValue MayaHydraSceneIndex::_mayaDefaultMaterialFallback;//Used only if we cannot find the default material named standardSurface1
VtValue MayaHydraSceneIndex::_mayaDefaultMaterialFallback;//Used only if we cannot find the maya default material
SdfPath MayaHydraSceneIndex::_mayaDefaultLightPath; // Common to all scene indexes
SdfPath MayaHydraSceneIndex::_mayaFacesSelectionMaterialPath; // Common to all scene indexes

Expand Down Expand Up @@ -773,26 +769,20 @@ VtValue MayaHydraSceneIndex::GetMaterialResource(const SdfPath& id)
return ret.IsEmpty() ? MayaHydraMaterialAdapter::GetPreviewMaterialResource(id) : ret;
}

//Create the default material from the "standardSurface1" maya material or create a fallback material if it cannot be found
//Create the default maya material or create a fallback material if it cannot be found
void MayaHydraSceneIndex::CreateMayaDefaultMaterialData()
{
// Try to get the standardSurface1 material
MObject defaultShaderObj;
GetDependNodeFromNodeName("standardSurface1", defaultShaderObj); // From mayautils.cpp
bool defaultMaterialSuccessfullyCreated = false;
if (MObjectHandle(defaultShaderObj).isValid()) {
//Get its shading group as it is what we use to create a material adapter
MObject defaultMaterialShadingGroupObj
= GetShadingGroupFromShader(defaultShaderObj); // From mayautils.cpp
if (MObjectHandle(defaultMaterialShadingGroupObj).isValid()) {
defaultMaterialSuccessfullyCreated = _CreateMaterial(MayaHydraSceneIndex::_mayaDefaultMaterialPath, defaultMaterialShadingGroupObj);
}
}

if (! defaultMaterialSuccessfullyCreated){
TF_CODING_WARNING("standardSurface1 material and its shading group could not be retrieved, using a fallback material");
// In case we could not create the default material from the standardSurface1 material, we
// create a fallback material
bool defaultMaterialCreatedSuccessfully = false;

MObject defaultMaterialShadingGroupObj = getDefaultMaterialShadingGroupNode();
if (defaultMaterialShadingGroupObj != MObject::kNullObj) {
defaultMaterialCreatedSuccessfully = _CreateMaterial(
MayaHydraSceneIndex::_mayaDefaultMaterialPath, defaultMaterialShadingGroupObj);
}

if (! defaultMaterialCreatedSuccessfully){
TF_CODING_WARNING("maya default material and its shading group could not be retrieved, using a fallback material");

_mayaDefaultMaterialFallback = MayaHydraSceneIndex::_CreateDefaultMaterialFallback();

auto mayaHydraDefaultMaterialDataSource = MayaHydraMaterialDataSource::New(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
#include <maya/MFrameContext.h>
#include <maya/MObject.h>
#include <maya/MSelectionList.h>
#include <maya/MViewport2Renderer.h>
#include <maya/MDrawContext.h>

#include <mayaHydraLib/api.h>
Expand Down Expand Up @@ -257,7 +256,7 @@ class MAYAHYDRALIB_API MayaHydraSceneIndex : public HdRetainedSceneIndex, public
/// Is using an environment variable to tell if we should pass normals to Hydra when using the render item and mesh adapters
static bool passNormalsToHydra();

///Create the default material from the "standardSurface1" maya material or create a fallback material if it cannot be found
///Create the default hydra material from maya default material or create a fallback material if it cannot be found
void CreateMayaDefaultMaterialData();

/// Get the maya default light path to be used in filtering scene indices to recognize the default light in primitives path
Expand Down Expand Up @@ -342,7 +341,7 @@ class MAYAHYDRALIB_API MayaHydraSceneIndex : public HdRetainedSceneIndex, public
static SdfPath _fallbackMaterial;
/// _mayaDefaultMaterialPath is common to all scene indexes
static SdfPath _mayaDefaultMaterialPath;
static VtValue _mayaDefaultMaterialFallback;//Used only if we cannot find the default material named standardSurface1
static VtValue _mayaDefaultMaterialFallback;//Used only if we cannot find the maya default material

/// _mayaFacesSelectionMaterialPath is a path to a Hydra material used to display the faces selection on nodes when being in components selection mode
static SdfPath _mayaFacesSelectionMaterialPath;
Expand Down
3 changes: 0 additions & 3 deletions lib/mayaHydra/mayaPlugin/renderOverride.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,7 @@
#include <pxr/pxr.h>

#include <maya/MCallbackIdArray.h>
#include <maya/MMessage.h>
#include <maya/MObjectHandle.h>
#include <maya/MString.h>
#include <maya/MViewport2Renderer.h>

#include <atomic>
#include <chrono>
Expand Down
2 changes: 0 additions & 2 deletions lib/mayaHydra/mayaPlugin/renderOverrideUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@

#include <pxr/pxr.h>

#include <maya/MViewport2Renderer.h>

PXR_NAMESPACE_OPEN_SCOPE

class MayaHydraPreRender : public MHWRender::MSceneRender
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@

#include <pxr/imaging/hd/tokens.h>

#include <maya/MViewport2Renderer.h>
#include <maya/MDagPath.h>
#include <maya/MMatrix.h>

#include <gtest/gtest.h>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@

#include <pxr/imaging/hd/tokens.h>

#include <maya/MViewport2Renderer.h>

#include <gtest/gtest.h>

PXR_NAMESPACE_USING_DIRECTIVE
Expand Down

0 comments on commit efdcd48

Please sign in to comment.