Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HYDRA-1291 : Fix default maya material is not picked up correctly #201

Merged
merged 2 commits into from
Nov 14, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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>
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did a bit of headers cleaning in this PR.

#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>
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All that has been removed is not used any more

#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();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recall there's already an Maya API (MMaterial::defaultMaterial()) to get the default Material, no need to query again. Just use MObject defaultMaterialShadingGroupObj = MMaterial::defaultMaterial().shadingEngine();

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

here's the API doc:
https://help.autodesk.com/view/MAYAUL/2024/ENU/?guid=MAYA_API_REF_cpp_ref_class_m_material_html

static MMaterial defaultMaterial()

Get the default material.
There will always be a default material in the scene and therefore the result of this function should always succeed. The default material will correspond to the initialShadingGroup node that is in the scene.

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