Skip to content

Commit

Permalink
Merge pull request #6030 from johnhaddon/renderPassWedgeAdaptors
Browse files Browse the repository at this point in the history
RenderPassWedge : Support customisation via render adaptors
  • Loading branch information
johnhaddon authored Sep 9, 2024
2 parents 6a6b20c + 38337a3 commit d8c720d
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 2 deletions.
1 change: 1 addition & 0 deletions Changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ API
---

- MetadataWidget : Added `NumericMetadataWidget` class.
- RenderPassWedge : Render adaptors may now be used to delete and/or disable render passes, by passing `client = "RenderPassWedge"` to `SceneAlgo.registerRenderAdaptor()`.

Build
-----
Expand Down
8 changes: 6 additions & 2 deletions python/GafferScene/RenderPassWedge.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,19 @@ def __init__( self, name = "RenderPassWedge" ) :
self["out"].setInput( self["in"] )
self["out"].setFlags( Gaffer.Plug.Flags.Serialisable, False )

self["__Adaptor"] = GafferScene.SceneAlgo.createRenderAdaptors()
self["__Adaptor"]["in"].setInput( self["in"] )
self["__Adaptor"]["client"].setValue( "RenderPassWedge" )

self["__ContextQuery"] = Gaffer.ContextQuery()
self["__ContextQuery"].addQuery( Gaffer.IntPlug( defaultValue = 1 ) )
self["__ContextQuery"].addQuery( Gaffer.StringPlug() )
self["__ContextQuery"]["queries"][0]["name"].setValue( "frameRange:start" )
self["__ContextQuery"]["queries"][1]["name"].setValue( "renderPass" )

self["__TimeWarp"] = Gaffer.TimeWarp()
self["__TimeWarp"].setup( self["in"] )
self["__TimeWarp"]["in"].setInput( self["in"] )
self["__TimeWarp"].setup( self["__Adaptor"]["out"] )
self["__TimeWarp"]["in"].setInput( self["__Adaptor"]["out"] )
self["__TimeWarp"]["speed"].setValue( 0 )
self["__TimeWarp"]["offset"].setInput( self["__ContextQuery"]["out"][0]["value"] )

Expand Down
76 changes: 76 additions & 0 deletions python/GafferSceneTest/RenderPassWedgeTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,5 +248,81 @@ def testPassNamesEvaluationUsesScriptStartFrame( self ) :
}
)

def testAdaptorDeletingPasses( self ) :

def createAdaptor() :

node = GafferScene.DeleteRenderPasses()
node["names"].setValue( "fx*" )
return node

GafferScene.SceneAlgo.registerRenderAdaptor( "RenderPassWedgeTest", createAdaptor, client = "RenderPassWedge" )
self.addCleanup( GafferScene.SceneAlgo.deregisterRenderAdaptor, "RenderPassWedgeTest" )

script = Gaffer.ScriptNode()

script["renderPasses"] = GafferScene.RenderPasses()
script["renderPasses"]["names"].setValue( IECore.StringVectorData( [ "char1", "char2", "fx1", "fx2" ] ) )

script["log"] = GafferDispatchTest.LoggingTaskNode()
script["log"]["dependsOnPass"] = Gaffer.StringPlug( defaultValue = "${renderPass}" )

script["wedge"] = GafferScene.RenderPassWedge()
script["wedge"]["preTasks"].next().setInput( script["log"]["task"] )
script["wedge"]["in"].setInput( script["renderPasses"]["out"] )

script["dispatcher"] = self.__dispatcher()
script["dispatcher"]["tasks"].next().setInput( script["wedge"]["task"] )
script["dispatcher"]["task"].execute()

self.assertEqual(
{ l.context["renderPass"] for l in script["log"].log },
{ "char1", "char2" }
)

def testAdaptorDisablingPasses( self ) :

def createAdaptor() :

node = GafferScene.SceneProcessor()
node["options"] = GafferScene.CustomOptions()
node["options"]["in"].setInput( node["in"] )
node["options"]["options"].addChild( Gaffer.NameValuePlug( "renderPass:enabled", False ) )

node["switch"] = Gaffer.NameSwitch()
node["switch"].setup( node["options"]["out"] )
node["switch"]["in"][0]["value"].setInput( node["in"] )
node["switch"]["in"][1]["value"].setInput( node["options"]["out"] )
node["switch"]["in"][1]["name"].setValue( "char*" )
node["switch"]["selector"].setValue( "${renderPass}" )

node["out"].setInput( node["switch"]["out"]["value"] )

return node

GafferScene.SceneAlgo.registerRenderAdaptor( "RenderPassWedgeTest", createAdaptor, client = "RenderPassWedge" )
self.addCleanup( GafferScene.SceneAlgo.deregisterRenderAdaptor, "RenderPassWedgeTest" )

script = Gaffer.ScriptNode()

script["renderPasses"] = GafferScene.RenderPasses()
script["renderPasses"]["names"].setValue( IECore.StringVectorData( [ "char1", "char2", "fx1", "fx2" ] ) )

script["log"] = GafferDispatchTest.LoggingTaskNode()
script["log"]["dependsOnPass"] = Gaffer.StringPlug( defaultValue = "${renderPass}" )

script["wedge"] = GafferScene.RenderPassWedge()
script["wedge"]["preTasks"].next().setInput( script["log"]["task"] )
script["wedge"]["in"].setInput( script["renderPasses"]["out"] )

script["dispatcher"] = self.__dispatcher()
script["dispatcher"]["tasks"].next().setInput( script["wedge"]["task"] )
script["dispatcher"]["task"].execute()

self.assertEqual(
{ l.context["renderPass"] for l in script["log"].log },
{ "fx1", "fx2" }
)

if __name__ == "__main__":
unittest.main()
12 changes: 12 additions & 0 deletions python/GafferSceneUI/RenderPassWedgeUI.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,18 @@
Specific passes can be disabled from wedging by setting the
`renderPass:enabled` option to `False` in contexts where that render
pass name is the value of the `renderPass` context variable.
Customisation
-------------
The behaviour of the RenderPassWedge node can be customised by registering
an adaptor that conditionally deletes, renames or disables passes. A common
use case is to conditionally enable passes on a per-shot basis according to
the presence or absence of particular assets within the scene.
Adaptors should be registered using a client value of "RenderPassWedge" - for example :
`GafferScene.SceneAlgo.registerRenderAdaptor( "MyConditionalPassAdaptor", adaptorCreationFunction, client = "RenderPassWedge" )`
""",

plugs = {
Expand Down

0 comments on commit d8c720d

Please sign in to comment.