Skip to content

Commit

Permalink
InteractiveRender : Fix source of globals for resolvedRenderer
Browse files Browse the repository at this point in the history
We were pulling on the adapted globals, which themselves could depend on `resolvedRenderer` via the `renderer` input to the adaptor.
  • Loading branch information
johnhaddon committed May 29, 2024
1 parent c649367 commit 7d6dcbb
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 1 deletion.
3 changes: 3 additions & 0 deletions Changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ Fixes
- Fixed errors when the input image didn't contain the main `RGBA` channels.
- Fixed inaccurate hash.
- SceneAlgo : Fixed exception handling for Python render adaptors. Previously an exception during adaptor construction caused a `SystemError`.
- InteractiveRender :
- Fixed crash triggered by a render adaptor depending on its `renderer` input to adapt the scene globals.
- Removed unintentional ability for render adaptors to change the renderer being used.

API
---
Expand Down
46 changes: 46 additions & 0 deletions python/GafferSceneTest/InteractiveRenderTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -2252,6 +2252,52 @@ def testResolvedRenderer( self ) :
render["renderer"].setValue( "Other" )
self.assertEqual( render["resolvedRenderer"].getValue(), "Other" )

def testAdaptorsCantChangeRenderer( self ) :

def adaptor() :

result = GafferScene.StandardOptions()
result["options"]["defaultRenderer"]["enabled"].setValue( True )
result["options"]["defaultRenderer"]["value"].setValue( "IAmNotAllowed" )
return result

GafferScene.SceneAlgo.registerRenderAdaptor( "Test", adaptor )

standardOptions = GafferScene.StandardOptions()
standardOptions["options"]["defaultRenderer"]["enabled"].setValue( True )
standardOptions["options"]["defaultRenderer"]["value"].setValue( self.renderer )

interactiveRender = GafferScene.InteractiveRender()
interactiveRender["in"].setInput( standardOptions["out"] )

self.assertEqual( interactiveRender["resolvedRenderer"].getValue(), self.renderer )

def testAdaptorGlobalsDependingOnRenderer( self ) :

def adaptor() :

result = GafferScene.SceneProcessor()
result["renderer"] = Gaffer.StringPlug()

result["__customOptions"] = GafferScene.CustomOptions()
result["__customOptions"]["options"].addChild( Gaffer.NameValuePlug( "test", Gaffer.StringPlug() ) )
result["__customOptions"]["options"][0]["value"].setInput( result["renderer"] )

result["out"].setInput( result["__customOptions"]["out"] )
return result

GafferScene.SceneAlgo.registerRenderAdaptor( "Test", adaptor )

standardOptions = GafferScene.StandardOptions()
standardOptions["options"]["defaultRenderer"]["enabled"].setValue( True )
standardOptions["options"]["defaultRenderer"]["value"].setValue( self.renderer )

interactiveRender = GafferScene.InteractiveRender()
interactiveRender["in"].setInput( standardOptions["out"] )

self.assertEqual( interactiveRender["resolvedRenderer"].getValue(), self.renderer )
self.assertEqual( interactiveRender["__adaptedIn"].globals()["option:test"], IECore.StringData( self.renderer ) )

def tearDown( self ) :

GafferSceneTest.SceneTestCase.tearDown( self )
Expand Down
2 changes: 1 addition & 1 deletion src/GafferScene/InteractiveRender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,7 @@ void InteractiveRender::compute( Gaffer::ValuePlug *output, const Gaffer::Contex
std::string renderer = rendererPlug()->getValue();
if( renderer.empty() )
{
ConstCompoundObjectPtr globals = adaptedInPlug()->globals();
ConstCompoundObjectPtr globals = inPlug()->globals();
if( auto rendererData = globals->member<const StringData>( g_rendererOptionName ) )
{
renderer = rendererData->readable();
Expand Down

0 comments on commit 7d6dcbb

Please sign in to comment.