Skip to content

Commit c5d6dbc

Browse files
committed
New attribute for active Hydra renderer
1 parent 6dbcf98 commit c5d6dbc

6 files changed

Lines changed: 124 additions & 0 deletions

File tree

lib/mayaUsd/nodes/sceneRenderSettings.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,26 @@ bool setActiveSettingPath(const std::string& ufePath)
170170
return node->setActiveSettingsPath(ufePath);
171171
}
172172

173+
std::string getCurrentRenderer()
174+
{
175+
MayaUsd::UsdSettingsNode* node
176+
= MayaUsd::UsdSceneSettingsManager::getNodeForNodeName(kRenderSettingsNodeName);
177+
if (!node) {
178+
return {};
179+
}
180+
return node->currentRenderer();
181+
}
182+
183+
bool setCurrentRenderer(const std::string& rendererName)
184+
{
185+
MayaUsd::UsdSettingsNode* node
186+
= MayaUsd::UsdSceneSettingsManager::getNodeForNodeName(kRenderSettingsNodeName);
187+
if (!node) {
188+
return false;
189+
}
190+
return node->setCurrentRenderer(rendererName);
191+
}
192+
173193
const PXR_NS::TfToken& externalCameraAttrName() { return kExternalCameraAttrName; }
174194

175195
bool setRenderSettingsCamera(

lib/mayaUsd/nodes/sceneRenderSettings.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ MAYAUSD_CORE_PUBLIC std::string getActiveSettingPath();
4848
//! if the singleton node is unavailable or the plug write fails.
4949
MAYAUSD_CORE_PUBLIC bool setActiveSettingPath(const std::string& ufePath);
5050

51+
//! Hydra renderer plugin name that drives USD Hydra rendering for the scene,
52+
//! or an empty string when none has been chosen.
53+
MAYAUSD_CORE_PUBLIC std::string getCurrentRenderer();
54+
55+
//! Author the Hydra renderer plugin name on the render-settings singleton.
56+
//! Returns false if the singleton node is unavailable or the plug write fails.
57+
MAYAUSD_CORE_PUBLIC bool setCurrentRenderer(const std::string& rendererName);
58+
5159
//! Name of the custom string attribute that records the UFE path of a camera
5260
//! that does not live on the same stage as the render-settings prim
5361
//! (e.g. a Maya native camera shape, or a camera in another USD stage).

lib/mayaUsd/nodes/usdSettingsNode.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const MString UsdSettingsNode::typeName("UsdDefaultSettings");
3636
MObject UsdSettingsNode::serializedRootLayerAttr;
3737
MObject UsdSettingsNode::serializedSessionLayerAttr;
3838
MObject UsdSettingsNode::activeSettingsPathAttr;
39+
MObject UsdSettingsNode::currentRendererAttr;
3940

4041
/* static */
4142
void* UsdSettingsNode::creator() { return new UsdSettingsNode(); }
@@ -84,6 +85,18 @@ MStatus UsdSettingsNode::initialize()
8485
status = addAttribute(activeSettingsPathAttr);
8586
CHECK_MSTATUS_AND_RETURN_IT(status);
8687

88+
// Hydra renderer plugin name persisted on the node to select which Hydra
89+
// backend is used for USD rendering. Hidden/internal: reads/writes go
90+
// through the typed accessors.
91+
currentRendererAttr = typedAttrFn.create(
92+
"currentRenderer", "crn", MFnData::kString, defaultStringDataObj, &status);
93+
CHECK_MSTATUS_AND_RETURN_IT(status);
94+
typedAttrFn.setStorable(true);
95+
typedAttrFn.setHidden(true);
96+
typedAttrFn.setInternal(true);
97+
status = addAttribute(currentRendererAttr);
98+
CHECK_MSTATUS_AND_RETURN_IT(status);
99+
87100
return status;
88101
}
89102

@@ -119,6 +132,19 @@ bool UsdSettingsNode::setActiveSettingsPath(const std::string& ufePath)
119132
return status == MS::kSuccess;
120133
}
121134

135+
std::string UsdSettingsNode::currentRenderer() const
136+
{
137+
MPlug plug(thisMObject(), currentRendererAttr);
138+
return plug.asString().asChar();
139+
}
140+
141+
bool UsdSettingsNode::setCurrentRenderer(const std::string& rendererName)
142+
{
143+
MPlug plug(thisMObject(), currentRendererAttr);
144+
MStatus status = plug.setString(MString(rendererName.c_str()));
145+
return status == MS::kSuccess;
146+
}
147+
122148
void UsdSettingsNode::ensureStage() const
123149
{
124150
if (_stage) {

lib/mayaUsd/nodes/usdSettingsNode.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class MAYAUSD_CORE_PUBLIC UsdSettingsNode
6161
static MObject serializedRootLayerAttr;
6262
static MObject serializedSessionLayerAttr;
6363
static MObject activeSettingsPathAttr;
64+
static MObject currentRendererAttr;
6465

6566
static void* creator();
6667
static MStatus initialize();
@@ -85,6 +86,13 @@ class MAYAUSD_CORE_PUBLIC UsdSettingsNode
8586
//! false on plug-write failure.
8687
bool setActiveSettingsPath(const std::string& ufePath);
8788

89+
//! Hydra renderer plugin name that drives USD Hydra rendering for the
90+
//! scene, or an empty string when no renderer has been chosen.
91+
std::string currentRenderer() const;
92+
93+
//! Author the Hydra renderer plugin name. Returns false on plug-write failure.
94+
bool setCurrentRenderer(const std::string& rendererName);
95+
8896
// Serialization (called by UsdSceneSettingsManager scene callbacks)
8997
void serializeToAttributes();
9098
void deserializeFromAttributes();

lib/mayaUsd/python/wrapSceneRenderSettings.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ void wrapSceneRenderSettings()
3737
.staticmethod("getActiveRenderSettingsPath")
3838
.def("setActiveRenderSettingsPath", &MayaUsd::SceneRenderSettings::setActiveSettingPath)
3939
.staticmethod("setActiveRenderSettingsPath")
40+
.def("getCurrentRenderer", &MayaUsd::SceneRenderSettings::getCurrentRenderer)
41+
.staticmethod("getCurrentRenderer")
42+
.def("setCurrentRenderer", &MayaUsd::SceneRenderSettings::setCurrentRenderer)
43+
.staticmethod("setCurrentRenderer")
4044
.def(
4145
"externalCameraAttrName",
4246
+[]() { return MayaUsd::SceneRenderSettings::externalCameraAttrName().GetString(); })

test/lib/mayaUsd/nodes/testSceneRenderSettings.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,64 @@ def testActiveSettingsPathResetOnFileNew(self):
415415
UsdDefaultRenderSettings.getActiveRenderSettingsPath(),
416416
defaultPath)
417417

418+
# ------------------------------------------------------------------
419+
# Hydra renderer selection (currentRenderer)
420+
# ------------------------------------------------------------------
421+
422+
def testCurrentRendererDefault(self):
423+
'''Default currentRenderer is empty; no Hydra renderer is chosen yet.'''
424+
nodeName = UsdDefaultRenderSettings.find()
425+
self.assertEqual(UsdDefaultRenderSettings.getCurrentRenderer(), '')
426+
self.assertEqual(
427+
cmds.getAttr(nodeName + '.currentRenderer'), '')
428+
429+
def testCurrentRendererSetter(self):
430+
'''Writing through the helper updates every read path.'''
431+
rendererName = 'HdStormRendererPlugin'
432+
self.assertTrue(
433+
UsdDefaultRenderSettings.setCurrentRenderer(rendererName))
434+
435+
self.assertEqual(
436+
UsdDefaultRenderSettings.getCurrentRenderer(), rendererName)
437+
nodeName = UsdDefaultRenderSettings.find()
438+
self.assertEqual(
439+
cmds.getAttr(nodeName + '.currentRenderer'), rendererName)
440+
441+
def testCurrentRendererRoundTrip(self):
442+
'''A custom currentRenderer survives a save/open cycle.'''
443+
rendererName = 'SomeCustomRenderer'
444+
self.assertTrue(
445+
UsdDefaultRenderSettings.setCurrentRenderer(rendererName))
446+
447+
tmpDir = tempfile.mkdtemp(prefix='testSceneRenderSettings_')
448+
try:
449+
tmpFile = os.path.join(tmpDir, 'currentRendererRoundTrip.ma')
450+
cmds.file(rename=tmpFile)
451+
cmds.file(save=True, type='mayaAscii')
452+
cmds.file(new=True, force=True)
453+
cmds.file(tmpFile, open=True, force=True)
454+
455+
self.assertEqual(
456+
UsdDefaultRenderSettings.getCurrentRenderer(),
457+
rendererName)
458+
finally:
459+
cmds.file(new=True, force=True)
460+
shutil.rmtree(tmpDir, ignore_errors=True)
461+
462+
def testCurrentRendererResetOnFileNew(self):
463+
'''File > New restores the empty default value.'''
464+
self.assertEqual(UsdDefaultRenderSettings.getCurrentRenderer(), '')
465+
466+
rendererName = 'TemporaryRenderer'
467+
self.assertTrue(
468+
UsdDefaultRenderSettings.setCurrentRenderer(rendererName))
469+
self.assertEqual(
470+
UsdDefaultRenderSettings.getCurrentRenderer(), rendererName)
471+
472+
cmds.file(new=True, force=True)
473+
474+
self.assertEqual(UsdDefaultRenderSettings.getCurrentRenderer(), '')
475+
418476
# ------------------------------------------------------------------
419477
# Locked-node invariant
420478
# ------------------------------------------------------------------

0 commit comments

Comments
 (0)