diff --git a/Changes.md b/Changes.md index 89497319dcc..da57768a087 100644 --- a/Changes.md +++ b/Changes.md @@ -8,6 +8,9 @@ Improvements - USD : Added automatic render-time translation of UsdPreviewSurface shaders to Cycles. - SetEditor : Added support for dragging a set name onto a node in the Graph Editor to create or modify a connected `SetFilter` node. Holding Shift while dragging will add to the set expression. Holding Control will remove from the set expression. Only set expressions with a simple list of sets are supported. Expressions with boolean or hierarchy operators are not supported. - GraphEditor : Improved pointer used to indicate when dropping a location would find the source node. +- RenderPassEditor : + - Added "Camera Inclusions" and "Camera Exclusions" columns, providing control over the camera visibility of scene locations in each render pass. + - Added "Matte Inclusions" and "Matte Exclusions" columns, providing control over the scene locations used as holdout mattes in each render pass. Fixes ----- diff --git a/doc/examples/rendering/renderPassEditorArnold.gfr b/doc/examples/rendering/renderPassEditorArnold.gfr index 0d094fabcbc..3a27386f216 100644 --- a/doc/examples/rendering/renderPassEditorArnold.gfr +++ b/doc/examples/rendering/renderPassEditorArnold.gfr @@ -8,9 +8,9 @@ import IECore import imath Gaffer.Metadata.registerValue( parent, "serialiser:milestoneVersion", 1, persistent=False ) -Gaffer.Metadata.registerValue( parent, "serialiser:majorVersion", 3, persistent=False ) -Gaffer.Metadata.registerValue( parent, "serialiser:minorVersion", 13, persistent=False ) -Gaffer.Metadata.registerValue( parent, "serialiser:patchVersion", 1, persistent=False ) +Gaffer.Metadata.registerValue( parent, "serialiser:majorVersion", 4, persistent=False ) +Gaffer.Metadata.registerValue( parent, "serialiser:minorVersion", 0, persistent=False ) +Gaffer.Metadata.registerValue( parent, "serialiser:patchVersion", 0, persistent=False ) __children = {} @@ -357,63 +357,6 @@ __children["Assets"]["Chars"]["Image"].loadShader( "image" ) __children["Assets"]["Chars"]["Image"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) __children["Assets"]["Chars"].addChild( GafferScene.PathFilter( "PathFilter" ) ) __children["Assets"]["Chars"]["PathFilter"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"] = Gaffer.Box( "RenderPassVisibility" ) -parent.addChild( __children["RenderPassVisibility"] ) -__children["RenderPassVisibility"].addChild( Gaffer.NameSwitch( "NameSwitch" ) ) -__children["RenderPassVisibility"]["NameSwitch"].setup( GafferScene.ScenePlug( "value", ) ) -__children["RenderPassVisibility"]["NameSwitch"]["in"].addChild( Gaffer.NameValuePlug( "", GafferScene.ScenePlug( "value", ), True, "in2", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) -__children["RenderPassVisibility"]["NameSwitch"]["in"].addChild( Gaffer.NameValuePlug( "", GafferScene.ScenePlug( "value", ), True, "in3", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) -__children["RenderPassVisibility"]["NameSwitch"]["in"].addChild( Gaffer.NameValuePlug( "", GafferScene.ScenePlug( "value", ), True, "in4", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) ) -__children["RenderPassVisibility"]["NameSwitch"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( GafferScene.ScenePlug( "out_value", direction = Gaffer.Plug.Direction.Out, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( GafferArnold.ArnoldAttributes( "ArnoldAttributes" ) ) -__children["RenderPassVisibility"]["ArnoldAttributes"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( GafferScene.PathFilter( "PathFilter" ) ) -__children["RenderPassVisibility"]["PathFilter"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( GafferScene.ScenePlug( "in", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( Gaffer.Dot( "Dot3" ) ) -__children["RenderPassVisibility"]["Dot3"].setup( GafferScene.ScenePlug( "in", ) ) -__children["RenderPassVisibility"]["Dot3"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( Gaffer.Dot( "Dot4" ) ) -__children["RenderPassVisibility"]["Dot4"].setup( GafferScene.ScenePlug( "in", ) ) -__children["RenderPassVisibility"]["Dot4"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( Gaffer.Dot( "Dot6" ) ) -__children["RenderPassVisibility"]["Dot6"].setup( GafferScene.ScenePlug( "in", ) ) -__children["RenderPassVisibility"]["Dot6"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( GafferScene.PathFilter( "PathFilter2" ) ) -__children["RenderPassVisibility"]["PathFilter2"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( GafferArnold.ArnoldAttributes( "ArnoldAttributes2" ) ) -__children["RenderPassVisibility"]["ArnoldAttributes2"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( GafferArnold.ArnoldAttributes( "ArnoldAttributes4" ) ) -__children["RenderPassVisibility"]["ArnoldAttributes4"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( GafferScene.PathFilter( "PathFilter3" ) ) -__children["RenderPassVisibility"]["PathFilter3"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( Gaffer.Dot( "Dot8" ) ) -__children["RenderPassVisibility"]["Dot8"].setup( GafferScene.ScenePlug( "in", ) ) -__children["RenderPassVisibility"]["Dot8"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( Gaffer.Dot( "Dot9" ) ) -__children["RenderPassVisibility"]["Dot9"].setup( GafferScene.ScenePlug( "in", ) ) -__children["RenderPassVisibility"]["Dot9"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( GafferArnold.ArnoldAttributes( "ArnoldAttributes5" ) ) -__children["RenderPassVisibility"]["ArnoldAttributes5"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( GafferScene.PathFilter( "PathFilter5" ) ) -__children["RenderPassVisibility"]["PathFilter5"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( Gaffer.Dot( "Dot10" ) ) -__children["RenderPassVisibility"]["Dot10"].setup( GafferScene.ScenePlug( "in", ) ) -__children["RenderPassVisibility"]["Dot10"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( Gaffer.BoxOut( "BoxOut" ) ) -__children["RenderPassVisibility"]["BoxOut"].setup( GafferScene.ScenePlug( "in", ) ) -__children["RenderPassVisibility"]["BoxOut"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( Gaffer.BoxIn( "BoxIn" ) ) -__children["RenderPassVisibility"]["BoxIn"].setup( GafferScene.ScenePlug( "out", ) ) -__children["RenderPassVisibility"]["BoxIn"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( Gaffer.Dot( "Dot" ) ) -__children["RenderPassVisibility"]["Dot"].setup( GafferScene.ScenePlug( "in", ) ) -__children["RenderPassVisibility"]["Dot"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["RenderPassVisibility"].addChild( Gaffer.Dot( "Dot11" ) ) -__children["RenderPassVisibility"]["Dot11"].setup( GafferScene.ScenePlug( "in", ) ) -__children["RenderPassVisibility"]["Dot11"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) __children["Backdrop10"] = Gaffer.Backdrop( "Backdrop10" ) parent.addChild( __children["Backdrop10"] ) __children["Backdrop10"].addChild( Gaffer.Box2fPlug( "__uiBound", defaultValue = imath.Box2f( imath.V2f( -10, -10 ), imath.V2f( 10, 10 ) ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) @@ -424,14 +367,6 @@ __children["Goal"].addChild( Gaffer.Box2fPlug( "__uiBound", defaultValue = imath __children["Goal"].addChild( Gaffer.Box2fPlug( "__uiBound1", defaultValue = imath.Box2f( imath.V2f( -10, -10 ), imath.V2f( 10, 10 ) ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) __children["Goal"].addChild( Gaffer.Box2fPlug( "__uiBound2", defaultValue = imath.Box2f( imath.V2f( -10, -10 ), imath.V2f( 10, 10 ) ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) __children["Goal"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["Backdrop8"] = Gaffer.Backdrop( "Backdrop8" ) -parent.addChild( __children["Backdrop8"] ) -__children["Backdrop8"].addChild( Gaffer.Box2fPlug( "__uiBound", defaultValue = imath.Box2f( imath.V2f( -10, -10 ), imath.V2f( 10, 10 ) ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["Backdrop8"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["Backdrop6"] = Gaffer.Backdrop( "Backdrop6" ) -parent.addChild( __children["Backdrop6"] ) -__children["Backdrop6"].addChild( Gaffer.Box2fPlug( "__uiBound", defaultValue = imath.Box2f( imath.V2f( -10, -10 ), imath.V2f( 10, 10 ) ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["Backdrop6"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) __children["Backdrop13"] = Gaffer.Backdrop( "Backdrop13" ) parent.addChild( __children["Backdrop13"] ) __children["Backdrop13"].addChild( Gaffer.Box2fPlug( "__uiBound", defaultValue = imath.Box2f( imath.V2f( -10, -10 ), imath.V2f( 10, 10 ) ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) @@ -464,6 +399,12 @@ __children["Backdrop18"] = Gaffer.Backdrop( "Backdrop18" ) parent.addChild( __children["Backdrop18"] ) __children["Backdrop18"].addChild( Gaffer.Box2fPlug( "__uiBound", defaultValue = imath.Box2f( imath.V2f( -10, -10 ), imath.V2f( 10, 10 ) ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) __children["Backdrop18"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) +__children["Render"] = GafferScene.Render( "Render" ) +parent.addChild( __children["Render"] ) +__children["Render"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) +__children["InteractiveRender"] = GafferScene.InteractiveRender( "InteractiveRender" ) +parent.addChild( __children["InteractiveRender"] ) +__children["InteractiveRender"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) __children["RenderPassDefinitions"] = Gaffer.EditScope( "RenderPassDefinitions" ) parent.addChild( __children["RenderPassDefinitions"] ) __children["RenderPassDefinitions"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) @@ -479,22 +420,25 @@ __children["RenderPassDefinitions"].addChild( Gaffer.BoolPlug( "enabled", defaul __children["RenderPassDefinitions"].addChild( GafferScene.SceneProcessor( "RenderPassOptionEdits" ) ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"].addChild( Gaffer.Spreadsheet( "Spreadsheet" ) ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '', ), "render:exclusions", ), adoptEnabledPlug = True ) -__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["Spreadsheet"]["rows"].addRows( 3 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '', ), "render:matteInclusions", ), adoptEnabledPlug = True ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '/', ), "render:cameraInclusions", ), adoptEnabledPlug = True ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["Spreadsheet"]["rows"].addColumn( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '', ), "render:cameraExclusions", ), adoptEnabledPlug = True ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["Spreadsheet"]["rows"].addRows( 5 ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"].addChild( GafferScene.OptionTweaks( "OptionTweaks" ) ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["OptionTweaks"]["tweaks"].addChild( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '', ), "tweak", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["OptionTweaks"]["tweaks"].addChild( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '', ), "tweak1", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["OptionTweaks"]["tweaks"].addChild( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '/', ), "tweak2", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["OptionTweaks"]["tweaks"].addChild( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '', ), "tweak3", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"].addChild( Gaffer.Spreadsheet.RowsPlug( "edits", ) ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"].addColumn( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '', ), "render:exclusions", ), adoptEnabledPlug = True ) -__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"].addRows( 3 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"].addColumn( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '', ), "render:matteInclusions", ), adoptEnabledPlug = True ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"].addColumn( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '/', ), "render:cameraInclusions", ), adoptEnabledPlug = True ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"].addColumn( Gaffer.TweakPlug( Gaffer.StringPlug( "value", defaultValue = '', ), "render:cameraExclusions", ), adoptEnabledPlug = True ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"].addRows( 5 ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) __children["RenderPassDefinitions"].addChild( GafferScene.RenderPasses( "RenderPasses" ) ) __children["RenderPassDefinitions"]["RenderPasses"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["Render"] = GafferScene.Render( "Render" ) -parent.addChild( __children["Render"] ) -__children["Render"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -__children["InteractiveRender"] = GafferScene.InteractiveRender( "InteractiveRender" ) -parent.addChild( __children["InteractiveRender"] ) -__children["InteractiveRender"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) ) -parent["variables"]["imageCataloguePort"]["value"].setValue( 43023 ) +parent["variables"]["imageCataloguePort"]["value"].setValue( 35887 ) parent["variables"]["renderPass"]["value"].setValue( 'all' ) Gaffer.Metadata.registerValue( parent["variables"]["imageCataloguePort"], 'readOnly', True ) Gaffer.Metadata.registerValue( parent["variables"]["projectName"]["name"], 'readOnly', True ) @@ -511,8 +455,8 @@ Gaffer.Metadata.registerValue( __children["Dot"]["out"], 'noduleLayout:section', __children["Dot"]["__uiPosition"].setValue( imath.V2f( 220.336197, -92.8719864 ) ) Gaffer.MetadataAlgo.setNumericBookmark( __children["Catalogue"].scriptNode(), 2, __children["Catalogue"] ) __children["Catalogue"]["directory"].setValue( '${project:rootDirectory}/catalogues/examples/renderPassEditorArnold' ) -__children["Catalogue"]["__uiPosition"].setValue( imath.V2f( 252.701294, -101.018044 ) ) -__children["StandardOptions"]["in"].setInput( __children["RenderPassVisibility"]["out_value"] ) +__children["Catalogue"]["__uiPosition"].setValue( imath.V2f( 252.701294, -102.036049 ) ) +__children["StandardOptions"]["in"].setInput( __children["RenderPassDefinitions"]["out"] ) __children["StandardOptions"]["options"]["renderCamera"]["value"].setValue( '/cameras/renderCamera' ) __children["StandardOptions"]["options"]["renderCamera"]["enabled"].setValue( True ) __children["StandardOptions"]["options"]["renderResolution"]["value"].setValue( imath.V2i( 1280, 720 ) ) @@ -958,7 +902,7 @@ Gaffer.Metadata.registerValue( __children["Lights"], 'noduleLayout:customGadget: Gaffer.Metadata.registerValue( __children["Lights"], 'noduleLayout:customGadget:addButtonBottom:visible', False ) Gaffer.Metadata.registerValue( __children["Lights"], 'noduleLayout:customGadget:addButtonLeft:visible', False ) Gaffer.Metadata.registerValue( __children["Lights"], 'noduleLayout:customGadget:addButtonRight:visible', False ) -__children["Lights"]["__uiPosition"].setValue( imath.V2f( 212.451736, 31.1341209 ) ) +__children["Lights"]["__uiPosition"].setValue( imath.V2f( 212.451721, 13.6018562 ) ) __children["Lights"]["BoxIn"]["__in"].setInput( __children["Lights"]["in"] ) Gaffer.Metadata.registerValue( __children["Lights"]["BoxIn"]["__in"], 'description', 'The processed output scene.' ) Gaffer.Metadata.registerValue( __children["Lights"]["BoxIn"]["__in"], 'nodule:type', 'GafferUI::StandardNodule' ) @@ -1035,7 +979,7 @@ __children["Cameras"]["Camera1"]["transform"]["rotate"].setValue( imath.V3f( -9. __children["Cameras"]["Camera1"]["perspectiveMode"].setValue( 1 ) __children["Cameras"]["Camera1"]["focalLength"].setValue( 21.0 ) __children["Cameras"]["Camera1"]["__uiPosition"].setValue( imath.V2f( -16.697319, 16.179493 ) ) -__children["Cameras"]["__uiPosition"].setValue( imath.V2f( 212.451736, 39.6341133 ) ) +__children["Cameras"]["__uiPosition"].setValue( imath.V2f( 212.451721, 22.1018429 ) ) __children["Cameras"]["BoxOut"]["in"].setInput( __children["Cameras"]["Parent"]["out"] ) Gaffer.Metadata.registerValue( __children["Cameras"]["BoxOut"]["in"], 'noduleLayout:section', 'top' ) Gaffer.Metadata.registerValue( __children["Cameras"]["BoxOut"]["__out"], 'nodule:color', imath.Color3f( 0.240099996, 0.339399993, 0.485000014 ) ) @@ -1076,7 +1020,7 @@ Gaffer.Metadata.registerValue( __children["Assets"], 'noduleLayout:customGadget: Gaffer.Metadata.registerValue( __children["Assets"], 'noduleLayout:customGadget:addButtonBottom:visible', False ) Gaffer.Metadata.registerValue( __children["Assets"], 'noduleLayout:customGadget:addButtonLeft:visible', False ) Gaffer.Metadata.registerValue( __children["Assets"], 'noduleLayout:customGadget:addButtonRight:visible', False ) -__children["Assets"]["__uiPosition"].setValue( imath.V2f( 212.451736, 48.1340981 ) ) +__children["Assets"]["__uiPosition"].setValue( imath.V2f( 212.451721, 30.6018238 ) ) __children["Assets"]["BoxOut"]["in"].setInput( __children["Assets"]["Parent"]["out"] ) Gaffer.Metadata.registerValue( __children["Assets"]["BoxOut"]["in"], 'noduleLayout:section', 'top' ) Gaffer.Metadata.registerValue( __children["Assets"]["BoxOut"]["__out"], 'nodule:type', 'GafferUI::StandardNodule' ) @@ -1325,108 +1269,14 @@ __children["Assets"]["Chars"]["Image"]["parameters"]["color_space"].setValue( 'l __children["Assets"]["Chars"]["Image"]["__uiPosition"].setValue( imath.V2f( 162.909683, 23.3302917 ) ) __children["Assets"]["Chars"]["PathFilter"]["paths"].setValue( IECore.StringVectorData( [ '/GAFFERBOT' ] ) ) __children["Assets"]["Chars"]["PathFilter"]["__uiPosition"].setValue( imath.V2f( 208.821304, 24.6123257 ) ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"], 'noduleLayout:customGadget:addButtonBottom:visible', False ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"], 'noduleLayout:customGadget:addButtonTop:visible', False ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"], 'noduleLayout:customGadget:addButtonLeft:visible', False ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"], 'noduleLayout:customGadget:addButtonRight:visible', False ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["NameSwitch"], 'annotation:user:text', 'A NameSwitch selecting based on ${renderPass} can be used to apply scene edits specific to each render pass. Here ArnoldAttributes nodes are being used to define Arnold-specific matte and camera visibility attributes.\n\nThe same approach of selecting based on ${renderPass} can also be used within a Spreadsheet node.' ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["NameSwitch"], 'annotation:user:color', imath.Color3f( 0.150000006, 0.25999999, 0.25999999 ) ) -__children["RenderPassVisibility"]["NameSwitch"]["__index"].setInput( __children["RenderPassVisibility"]["NameSwitch"]["__outIndex"] ) -__children["RenderPassVisibility"]["NameSwitch"]["selector"].setValue( '${renderPass}' ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["NameSwitch"]["in"], 'noduleLayout:section', 'top' ) -__children["RenderPassVisibility"]["NameSwitch"]["in"][0]["name"].setValue( '*' ) -__children["RenderPassVisibility"]["NameSwitch"]["in"][0]["value"].setInput( __children["RenderPassVisibility"]["Dot4"]["out"] ) -__children["RenderPassVisibility"]["NameSwitch"]["in"][1]["name"].setValue( 'gafferBot*' ) -__children["RenderPassVisibility"]["NameSwitch"]["in"][1]["value"].setInput( __children["RenderPassVisibility"]["Dot11"]["out"] ) -__children["RenderPassVisibility"]["NameSwitch"]["in"][2]["name"].setValue( 'env' ) -__children["RenderPassVisibility"]["NameSwitch"]["in"][2]["value"].setInput( __children["RenderPassVisibility"]["ArnoldAttributes2"]["out"] ) -__children["RenderPassVisibility"]["NameSwitch"]["in"][3]["name"].setValue( 'fx' ) -__children["RenderPassVisibility"]["NameSwitch"]["in"][3]["value"].setInput( __children["RenderPassVisibility"]["Dot6"]["out"] ) -__children["RenderPassVisibility"]["NameSwitch"]["in"][4]["name"].setValue( 'props' ) -__children["RenderPassVisibility"]["NameSwitch"]["in"][4]["value"].setInput( __children["RenderPassVisibility"]["Dot9"]["out"] ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["NameSwitch"]["out"], 'noduleLayout:section', 'bottom' ) -__children["RenderPassVisibility"]["NameSwitch"]["__uiPosition"].setValue( imath.V2f( 62.1992531, -48.7939224 ) ) -__children["RenderPassVisibility"]["out_value"].setInput( __children["RenderPassVisibility"]["BoxOut"]["__out"] ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["out_value"], 'noduleLayout:label', 'out' ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["out_value"], 'spreadsheet:columnName', 'outValue' ) -__children["RenderPassVisibility"]["ArnoldAttributes"]["in"].setInput( __children["RenderPassVisibility"]["Dot"]["out"] ) -__children["RenderPassVisibility"]["ArnoldAttributes"]["filter"].setInput( __children["RenderPassVisibility"]["PathFilter"]["out"] ) -__children["RenderPassVisibility"]["ArnoldAttributes"]["attributes"]["matte"]["value"].setValue( True ) -__children["RenderPassVisibility"]["ArnoldAttributes"]["attributes"]["matte"]["enabled"].setValue( True ) -__children["RenderPassVisibility"]["ArnoldAttributes"]["__uiPosition"].setValue( imath.V2f( 30.8222542, -28.9776306 ) ) -__children["RenderPassVisibility"]["PathFilter"]["paths"].setValue( IECore.StringVectorData( [ '/env', '/props' ] ) ) -__children["RenderPassVisibility"]["PathFilter"]["__uiPosition"].setValue( imath.V2f( 47.0293198, -23.6277046 ) ) -__children["RenderPassVisibility"]["in"].setInput( __children["RenderPassDefinitions"]["out"] ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["in"], 'nodule:type', 'GafferUI::StandardNodule' ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["in"], 'description', 'The input scene' ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["in"], 'plugValueWidget:type', '' ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["in"], 'noduleLayout:spacing', 2.0 ) -__children["RenderPassVisibility"]["Dot3"]["in"].setInput( __children["RenderPassVisibility"]["BoxIn"]["out"] ) -__children["RenderPassVisibility"]["Dot3"]["__uiPosition"].setValue( imath.V2f( 20.7837486, -4.98777008 ) ) -__children["RenderPassVisibility"]["Dot4"]["in"].setInput( __children["RenderPassVisibility"]["Dot3"]["out"] ) -__children["RenderPassVisibility"]["Dot4"]["__uiPosition"].setValue( imath.V2f( 20.7837486, -41.4618912 ) ) -__children["RenderPassVisibility"]["Dot6"]["in"].setInput( __children["RenderPassVisibility"]["ArnoldAttributes4"]["out"] ) -__children["RenderPassVisibility"]["Dot6"]["__uiPosition"].setValue( imath.V2f( 86.8747559, -35.2800217 ) ) -__children["RenderPassVisibility"]["PathFilter2"]["paths"].setValue( IECore.StringVectorData( [ '/chars', '/fx', '/props' ] ) ) -__children["RenderPassVisibility"]["PathFilter2"]["__uiPosition"].setValue( imath.V2f( 72.3031235, -22.8324337 ) ) -__children["RenderPassVisibility"]["ArnoldAttributes2"]["in"].setInput( __children["RenderPassVisibility"]["BoxIn"]["out"] ) -__children["RenderPassVisibility"]["ArnoldAttributes2"]["filter"].setInput( __children["RenderPassVisibility"]["PathFilter2"]["out"] ) -__children["RenderPassVisibility"]["ArnoldAttributes2"]["attributes"]["cameraVisibility"]["value"].setValue( False ) -__children["RenderPassVisibility"]["ArnoldAttributes2"]["attributes"]["cameraVisibility"]["enabled"].setValue( True ) -__children["RenderPassVisibility"]["ArnoldAttributes2"]["__uiPosition"].setValue( imath.V2f( 60.6984558, -28.8007774 ) ) -__children["RenderPassVisibility"]["ArnoldAttributes4"]["in"].setInput( __children["RenderPassVisibility"]["Dot8"]["out"] ) -__children["RenderPassVisibility"]["ArnoldAttributes4"]["filter"].setInput( __children["RenderPassVisibility"]["PathFilter3"]["out"] ) -__children["RenderPassVisibility"]["ArnoldAttributes4"]["attributes"]["matte"]["value"].setValue( True ) -__children["RenderPassVisibility"]["ArnoldAttributes4"]["attributes"]["matte"]["enabled"].setValue( True ) -__children["RenderPassVisibility"]["ArnoldAttributes4"]["__uiPosition"].setValue( imath.V2f( 86.8747559, -27.9479904 ) ) -__children["RenderPassVisibility"]["PathFilter3"]["paths"].setValue( IECore.StringVectorData( [ '/chars', '/env' ] ) ) -__children["RenderPassVisibility"]["PathFilter3"]["__uiPosition"].setValue( imath.V2f( 101.957809, -22.7599411 ) ) -__children["RenderPassVisibility"]["Dot8"]["in"].setInput( __children["RenderPassVisibility"]["BoxIn"]["out"] ) -__children["RenderPassVisibility"]["Dot8"]["__uiPosition"].setValue( imath.V2f( 86.8747559, -10.2455683 ) ) -__children["RenderPassVisibility"]["Dot9"]["in"].setInput( __children["RenderPassVisibility"]["ArnoldAttributes5"]["out"] ) -__children["RenderPassVisibility"]["Dot9"]["__uiPosition"].setValue( imath.V2f( 123.652382, -41.4618912 ) ) -__children["RenderPassVisibility"]["ArnoldAttributes5"]["in"].setInput( __children["RenderPassVisibility"]["Dot10"]["out"] ) -__children["RenderPassVisibility"]["ArnoldAttributes5"]["filter"].setInput( __children["RenderPassVisibility"]["PathFilter5"]["out"] ) -__children["RenderPassVisibility"]["ArnoldAttributes5"]["attributes"]["matte"]["value"].setValue( True ) -__children["RenderPassVisibility"]["ArnoldAttributes5"]["attributes"]["matte"]["enabled"].setValue( True ) -__children["RenderPassVisibility"]["ArnoldAttributes5"]["__uiPosition"].setValue( imath.V2f( 123.652382, -26.5973492 ) ) -__children["RenderPassVisibility"]["PathFilter5"]["paths"].setValue( IECore.StringVectorData( [ '/chars', '/env' ] ) ) -__children["RenderPassVisibility"]["PathFilter5"]["__uiPosition"].setValue( imath.V2f( 138.735443, -21.4092999 ) ) -__children["RenderPassVisibility"]["Dot10"]["in"].setInput( __children["RenderPassVisibility"]["BoxIn"]["out"] ) -__children["RenderPassVisibility"]["Dot10"]["__uiPosition"].setValue( imath.V2f( 123.652382, -4.98777008 ) ) -__children["RenderPassVisibility"]["BoxOut"]["name"].setValue( 'out_value' ) -__children["RenderPassVisibility"]["BoxOut"]["in"].setInput( __children["RenderPassVisibility"]["NameSwitch"]["out"]["value"] ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["BoxOut"]["__out"], 'noduleLayout:label', 'out' ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["BoxOut"]["__out"], 'spreadsheet:columnName', 'outValue' ) -__children["RenderPassVisibility"]["BoxOut"]["__uiPosition"].setValue( imath.V2f( 63.6992531, -57.1259537 ) ) -__children["RenderPassVisibility"]["BoxIn"]["__in"].setInput( __children["RenderPassVisibility"]["in"] ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["BoxIn"]["__in"], 'nodule:type', 'GafferUI::StandardNodule' ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["BoxIn"]["__in"], 'description', 'The input scene' ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["BoxIn"]["__in"], 'plugValueWidget:type', '' ) -Gaffer.Metadata.registerValue( __children["RenderPassVisibility"]["BoxIn"]["__in"], 'noduleLayout:spacing', 2.0 ) -__children["RenderPassVisibility"]["BoxIn"]["__uiPosition"].setValue( imath.V2f( 60.6984558, 2.51222992 ) ) -__children["RenderPassVisibility"]["__uiPosition"].setValue( imath.V2f( 212.451736, -24.2252541 ) ) -__children["RenderPassVisibility"]["Dot"]["in"].setInput( __children["RenderPassVisibility"]["BoxIn"]["out"] ) -__children["RenderPassVisibility"]["Dot"]["__uiPosition"].setValue( imath.V2f( 30.8222542, -10.8546295 ) ) -__children["RenderPassVisibility"]["Dot11"]["in"].setInput( __children["RenderPassVisibility"]["ArnoldAttributes"]["out"] ) -__children["RenderPassVisibility"]["Dot11"]["__uiPosition"].setValue( imath.V2f( 30.8222542, -36.3096619 ) ) __children["Backdrop10"]["title"].setValue( '' ) __children["Backdrop10"]["__uiBound"].setValue( imath.Box2f( imath.V2f( 0, 0 ), imath.V2f( 97, 27.6319656 ) ) ) -__children["Backdrop10"]["__uiPosition"].setValue( imath.V2f( 167.887482, 54.1762047 ) ) +__children["Backdrop10"]["__uiPosition"].setValue( imath.V2f( 167.887466, 36.6439323 ) ) __children["Goal"]["title"].setValue( 'Example: Render Pass Editor (Arnold)' ) __children["Goal"]["scale"].setValue( 1.5 ) __children["Goal"]["description"].setValue( 'In this graph, we show how to use the RenderPasses and RenderPassWedge nodes to create and render multiple render passes, breaking our scene down into multiple images for compositing. This example also demonstrates using the Render Pass Editor to adjust render settings within an EditScope and to activate a render pass for interactive preview.' ) __children["Goal"]["__uiBound"].setValue( imath.Box2f( imath.V2f( 0, 0 ), imath.V2f( 70, 27.3606033 ) ) ) -__children["Goal"]["__uiPosition"].setValue( imath.V2f( 180.637482, 54.1762047 ) ) -Gaffer.Metadata.registerValue( __children["Backdrop8"], 'nodeGadget:color', imath.Color3f( 0.347949386, 0.438627928, 0.5 ) ) -__children["Backdrop8"]["title"].setValue( '' ) -__children["Backdrop8"]["__uiBound"].setValue( imath.Box2f( imath.V2f( 0, -0.488481522 ), imath.V2f( 62.0365562, 19.2328033 ) ) ) -__children["Backdrop8"]["__uiPosition"].setValue( imath.V2f( 201.392303, -33.4485359 ) ) -Gaffer.Metadata.registerValue( __children["Backdrop6"], 'nodeGadget:color', imath.Color3f( 0.347949386, 0.438627928, 0.5 ) ) -__children["Backdrop6"]["title"].setValue( 'Note: Ray Visibility and Mattes' ) -__children["Backdrop6"]["description"].setValue( 'This RenderPassVisibility box demonstrates how to define renderer-specific ray-visibility and holdout settings. In the future, this kind of setup will be able to be performed directly via additional columns in the Render Pass Editor.' ) -__children["Backdrop6"]["__uiBound"].setValue( imath.Box2f( imath.V2f( 0, 0.487016678 ), imath.V2f( 40, 20.2198372 ) ) ) -__children["Backdrop6"]["__uiPosition"].setValue( imath.V2f( 223.769272, -34.4841347 ) ) +__children["Goal"]["__uiPosition"].setValue( imath.V2f( 180.637466, 36.6439323 ) ) __children["Backdrop13"]["title"].setValue( '' ) __children["Backdrop13"]["__uiBound"].setValue( imath.Box2f( imath.V2f( 0, -1.7935791 ), imath.V2f( 62.0365562, 19.2328033 ) ) ) __children["Backdrop13"]["__uiPosition"].setValue( imath.V2f( 161.430695, -106.538216 ) ) @@ -1449,13 +1299,19 @@ __children["Backdrop16"]["description"].setValue( 'The Render Pass Editor can be __children["Backdrop16"]["__uiBound"].setValue( imath.Box2f( imath.V2f( -3.94014359, -7.6455574 ), imath.V2f( 40, 20 ) ) ) __children["Backdrop16"]["__uiPosition"].setValue( imath.V2f( 265.371613, -106.806831 ) ) __children["Backdrop17"]["title"].setValue( '' ) -__children["Backdrop17"]["__uiBound"].setValue( imath.Box2f( imath.V2f( 0, -15.1777916 ), imath.V2f( 62.0365562, 19.2328033 ) ) ) -__children["Backdrop17"]["__uiPosition"].setValue( imath.V2f( 201.323837, 7.18385315 ) ) +__children["Backdrop17"]["__uiBound"].setValue( imath.Box2f( imath.V2f( 0, -22.1102619 ), imath.V2f( 62.0365562, 19.2328033 ) ) ) +__children["Backdrop17"]["__uiPosition"].setValue( imath.V2f( 201.323822, -10.3484173 ) ) __children["Backdrop18"]["title"].setValue( 'Defining render passes' ) -__children["Backdrop18"]["description"].setValue( 'Render passes can be created using the Render Pass Editor panel, by choosing an EditScope and pressing the `+` button in the bottom left. Here an EditScope called `RenderPassDefinitions` has been used to create several render passes.\n\nThe content of each render pass is defined using the Inclusions and Exclusions columns in the Render Pass Editor. These have also been defined in the RenderPassDefinitions node.\n\nTip : The list of render passes is stored within the "renderPass:names" option in the scene globals, and may also be viewed in the Globals tab of the Scene Inspector. For more procedural workflows, render passes may also be defined using a RenderPasses node. Likewise, inclusions and exclusions are also just options, and may be edited procedurally using a StandardOptions node.' ) -__children["Backdrop18"]["__uiBound"].setValue( imath.Box2f( imath.V2f( 0, -14.0220098 ), imath.V2f( 40, 20.2198372 ) ) ) -__children["Backdrop18"]["__uiPosition"].setValue( imath.V2f( 222.978378, 6.14825439 ) ) -__children["RenderPassDefinitions"]["__uiPosition"].setValue( imath.V2f( 213.951736, 16.4589558 ) ) +__children["Backdrop18"]["description"].setValue( 'Render passes can be created using the Render Pass Editor panel, by choosing an EditScope and pressing the `+` button in the bottom left. Here an EditScope called `RenderPassDefinitions` has been used to create several render passes.\n\nThe content of each render pass is defined using the Inclusions and Exclusions columns in the Render Pass Editor. These have also been defined in the RenderPassDefinitions node.\n\nCamera visibility and matte (holdout) settings are defined using the Camera Inclusions/Exclusions and Matte Inclusions/Exclusions columns in the Render Pass Editor. These have been defined for specific render passes in the RenderPassDefinitions node.\n\nTip : The list of render passes is stored within the "renderPass:names" option in the scene globals, and may also be viewed in the Globals tab of the Scene Inspector. For more procedural workflows, render passes may also be defined using a RenderPasses node. Likewise, inclusions and exclusions are also just options, and may be edited procedurally using a StandardOptions node.' ) +__children["Backdrop18"]["__uiBound"].setValue( imath.Box2f( imath.V2f( 0, -20.4171124 ), imath.V2f( 40, 20.2198372 ) ) ) +__children["Backdrop18"]["__uiPosition"].setValue( imath.V2f( 222.978363, -11.384016 ) ) +__children["Render"]["in"].setInput( __children["BatchOutputs"]["out"] ) +__children["Render"]["renderer"].setValue( 'Arnold' ) +__children["Render"]["__uiPosition"].setValue( imath.V2f( 210.251862, -93.8719864 ) ) +__children["InteractiveRender"]["in"].setInput( __children["InteractiveOutputs"]["out"] ) +__children["InteractiveRender"]["renderer"].setValue( 'Arnold' ) +__children["InteractiveRender"]["__uiPosition"].setValue( imath.V2f( 235.020142, -102.036049 ) ) +__children["RenderPassDefinitions"]["__uiPosition"].setValue( imath.V2f( 213.951721, -1.36708736 ) ) __children["RenderPassDefinitions"]["BoxIn"]["__in"].setInput( __children["RenderPassDefinitions"]["in"] ) Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["BoxIn"]["__in"], 'description', 'The processed output scene.' ) Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["BoxIn"]["__in"], 'nodule:type', 'GafferUI::StandardNodule' ) @@ -1469,7 +1325,7 @@ Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["BoxOut"]["__ Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["BoxOut"]["__out"], 'nodule:type', 'GafferUI::StandardNodule' ) __children["RenderPassDefinitions"]["BoxOut"]["passThrough"].setInput( __children["RenderPassDefinitions"]["BoxIn"]["out"] ) __children["RenderPassDefinitions"]["BoxOut"]["enabled"].setInput( __children["RenderPassDefinitions"]["enabled"] ) -__children["RenderPassDefinitions"]["BoxOut"]["__uiPosition"].setValue( imath.V2f( 0, -8.50000191 ) ) +__children["RenderPassDefinitions"]["BoxOut"]["__uiPosition"].setValue( imath.V2f( -0.999479055, -17.0000019 ) ) __children["RenderPassDefinitions"]["out"].setInput( __children["RenderPassDefinitions"]["BoxOut"]["__out"] ) Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["out"], 'description', 'The processed output scene.' ) Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["out"], 'nodule:type', 'GafferUI::StandardNodule' ) @@ -1485,37 +1341,100 @@ __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["OptionTweaks"]["en __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["OptionTweaks"]["in"].setInput( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["in"] ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["OptionTweaks"]["ignoreMissing"].setValue( True ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["OptionTweaks"]["tweaks"]["tweak"].setInput( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["Spreadsheet"]["out"]["render:exclusions"] ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["OptionTweaks"]["tweaks"]["tweak1"].setInput( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["Spreadsheet"]["out"]["render:matteInclusions"] ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["OptionTweaks"]["tweaks"]["tweak2"].setInput( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["Spreadsheet"]["out"]["render:cameraInclusions"] ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["OptionTweaks"]["tweaks"]["tweak3"].setInput( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["Spreadsheet"]["out"]["render:cameraExclusions"] ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:exclusions"]["value"]["name"].setValue( 'render:exclusions' ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:exclusions"]["value"]["enabled"].setValue( False ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:exclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:matteInclusions"]["value"]["name"].setValue( 'render:matteInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:matteInclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:matteInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:cameraInclusions"]["value"]["name"].setValue( 'render:cameraInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:cameraInclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:cameraInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:cameraExclusions"]["value"]["name"].setValue( 'render:cameraExclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:cameraExclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:cameraExclusions"]["value"]["mode"].setValue( 5 ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["name"].setValue( 'gafferBot' ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:exclusions"]["value"]["name"].setValue( 'render:exclusions' ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:exclusions"]["value"]["mode"].setValue( 5 ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:exclusions"]["value"]["value"].setValue( '/fx' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:matteInclusions"]["value"]["name"].setValue( 'render:matteInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:matteInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:matteInclusions"]["value"]["value"].setValue( '/env /props' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:cameraInclusions"]["value"]["name"].setValue( 'render:cameraInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:cameraInclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:cameraInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:cameraExclusions"]["value"]["name"].setValue( 'render:cameraExclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:cameraExclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][1]["cells"]["render:cameraExclusions"]["value"]["mode"].setValue( 5 ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["name"].setValue( 'fx' ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:exclusions"]["value"]["name"].setValue( 'render:exclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:exclusions"]["value"]["enabled"].setValue( False ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:exclusions"]["value"]["mode"].setValue( 5 ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:exclusions"]["value"]["value"].setValue( '/props' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:matteInclusions"]["value"]["name"].setValue( 'render:matteInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:matteInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:matteInclusions"]["value"]["value"].setValue( '/chars /env' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:cameraInclusions"]["value"]["name"].setValue( 'render:cameraInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:cameraInclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:cameraInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:cameraExclusions"]["value"]["name"].setValue( 'render:cameraExclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:cameraExclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][2]["cells"]["render:cameraExclusions"]["value"]["value"].setValue( '/props' ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["name"].setValue( 'props' ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:exclusions"]["value"]["name"].setValue( 'render:exclusions' ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:exclusions"]["value"]["mode"].setValue( 5 ) __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:exclusions"]["value"]["value"].setValue( '/fx' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:matteInclusions"]["value"]["name"].setValue( 'render:matteInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:matteInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:matteInclusions"]["value"]["value"].setValue( '/chars /env' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:cameraInclusions"]["value"]["name"].setValue( 'render:cameraInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:cameraInclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:cameraInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:cameraExclusions"]["value"]["name"].setValue( 'render:cameraExclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:cameraExclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][3]["cells"]["render:cameraExclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["name"].setValue( 'gafferBot_alt' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:exclusions"]["value"]["name"].setValue( 'render:exclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:exclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:exclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:matteInclusions"]["value"]["name"].setValue( 'render:matteInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:matteInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:matteInclusions"]["value"]["value"].setValue( '/env /props' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:cameraInclusions"]["value"]["name"].setValue( 'render:cameraInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:cameraInclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:cameraInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:cameraExclusions"]["value"]["name"].setValue( 'render:cameraExclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:cameraExclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][4]["cells"]["render:cameraExclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["name"].setValue( 'env' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:exclusions"]["value"]["name"].setValue( 'render:exclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:exclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:exclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:matteInclusions"]["value"]["name"].setValue( 'render:matteInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:matteInclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:matteInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:cameraInclusions"]["value"]["name"].setValue( 'render:cameraInclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:cameraInclusions"]["value"]["mode"].setValue( 5 ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:cameraInclusions"]["value"]["value"].setValue( '/env' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:cameraExclusions"]["value"]["name"].setValue( 'render:cameraExclusions' ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:cameraExclusions"]["value"]["enabled"].setValue( False ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][5]["cells"]["render:cameraExclusions"]["value"]["mode"].setValue( 5 ) Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"], 'spreadsheet:defaultRowVisible', False ) Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0], 'spreadsheet:rowNameWidth', 150 ) Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:exclusions"]["value"], 'tweakPlugValueWidget:allowCreate', True ) -__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["__uiPosition"].setValue( imath.V2f( -0.500521243, -1.65402889e-06 ) ) +Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:matteInclusions"]["value"], 'tweakPlugValueWidget:allowCreate', True ) +Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:cameraInclusions"]["value"], 'tweakPlugValueWidget:allowCreate', True ) +Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["edits"][0]["cells"]["render:cameraExclusions"]["value"], 'tweakPlugValueWidget:allowCreate', True ) +__children["RenderPassDefinitions"]["RenderPassOptionEdits"]["__uiPosition"].setValue( imath.V2f( -11.8863335, -1.65402889e-06 ) ) Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["RenderPasses"], 'editScope:processorType', 'RenderPasses' ) Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["RenderPasses"], 'icon', 'editScopeProcessorNode.png' ) Gaffer.Metadata.registerValue( __children["RenderPassDefinitions"]["RenderPasses"], 'nodeGadget:color', imath.Color3f( 0.187600002, 0.390799999, 0.600000024 ) ) __children["RenderPassDefinitions"]["RenderPasses"]["in"].setInput( __children["RenderPassDefinitions"]["RenderPassOptionEdits"]["out"] ) __children["RenderPassDefinitions"]["RenderPasses"]["names"].setValue( IECore.StringVectorData( [ 'gafferBot', 'fx', 'env', 'props', 'all', 'gafferBot_alt' ] ) ) __children["RenderPassDefinitions"]["RenderPasses"]["__uiPosition"].setValue( imath.V2f( -11.8863335, -8.50000191 ) ) -__children["Render"]["in"].setInput( __children["BatchOutputs"]["out"] ) -__children["Render"]["renderer"].setValue( 'Arnold' ) -__children["Render"]["__uiPosition"].setValue( imath.V2f( 210.251862, -93.8719864 ) ) -__children["InteractiveRender"]["in"].setInput( __children["InteractiveOutputs"]["out"] ) -__children["InteractiveRender"]["renderer"].setValue( 'Arnold' ) -__children["InteractiveRender"]["__uiPosition"].setValue( imath.V2f( 235.020142, -101.076241 ) ) del __children diff --git a/python/GafferSceneTest/RenderAdaptorTest.py b/python/GafferSceneTest/RenderAdaptorTest.py index d2a985733c1..290625265b9 100644 --- a/python/GafferSceneTest/RenderAdaptorTest.py +++ b/python/GafferSceneTest/RenderAdaptorTest.py @@ -413,3 +413,263 @@ def assertIncludedObjects( scene, paths, inclusions = None, exclusions = None, a additionalLights = "C", exclusions = "( __lights - C ) | /group/groupA" ) + + def testCameraVisibilityAdaptor( self ) : + + # /groupA + # /cube (A, CUBE) + # /sphere (A, SPHERE) + + cubeA = GafferScene.Cube() + cubeA["sets"].setValue( "A CUBE" ) + + sphereA = GafferScene.Sphere() + sphereA["sets"].setValue( "A SPHERE" ) + + groupA = GafferScene.Group() + groupA["name"].setValue( "groupA" ) + groupA["in"][0].setInput( cubeA["out"] ) + groupA["in"][1].setInput( sphereA["out"] ) + + customOptions = GafferScene.CustomOptions() + customOptions["in"].setInput( groupA["out"] ) + customOptions["options"].addChild( Gaffer.NameValuePlug( "render:cameraInclusions", "", False, "cameraInclusions" ) ) + customOptions["options"].addChild( Gaffer.NameValuePlug( "render:cameraExclusions", "", True, "cameraExclusions" ) ) + + inclusionAttributesFilter = GafferScene.SetFilter() + inclusionAttributes = GafferScene.CustomAttributes() + inclusionAttributes["in"].setInput( customOptions["out"] ) + inclusionAttributes["filter"].setInput( inclusionAttributesFilter["out"] ) + inclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "ai:visibility:camera", True, True ) ) + inclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "cycles:visibility:camera", True, True ) ) + inclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "dl:visibility.camera", True, True ) ) + + exclusionAttributesFilter = GafferScene.SetFilter() + exclusionAttributes = GafferScene.CustomAttributes() + exclusionAttributes["in"].setInput( inclusionAttributes["out"] ) + exclusionAttributes["filter"].setInput( exclusionAttributesFilter["out"] ) + exclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "ai:visibility:camera", False, True ) ) + exclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "cycles:visibility:camera", False, True ) ) + exclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "dl:visibility.camera", False, True ) ) + + # Create adaptors for the CapturingRenderer + testAdaptors = GafferScene.SceneAlgo.createRenderAdaptors() + testAdaptors["in"].setInput( exclusionAttributes["out"] ) + + def assertCameraVisibleObjects( paths, cameraInclusions = None, cameraExclusions = None, inclusionOverrides = "", exclusionOverrides = "" ) : + + if cameraInclusions is not None : + customOptions["options"]["cameraInclusions"]["value"].setValue( cameraInclusions ) + customOptions["options"]["cameraInclusions"]["enabled"].setValue( cameraInclusions is not None ) + + if cameraExclusions is not None : + customOptions["options"]["cameraExclusions"]["value"].setValue( cameraExclusions ) + customOptions["options"]["cameraExclusions"]["enabled"].setValue( cameraExclusions is not None ) + + inclusionAttributesFilter["setExpression"].setValue( inclusionOverrides ) + exclusionAttributesFilter["setExpression"].setValue( exclusionOverrides ) + + allPaths = { + "/groupA/cube", + "/groupA/sphere", + } + + renderer = GafferScene.Private.IECoreScenePreview.CapturingRenderer( + GafferScene.Private.IECoreScenePreview.Renderer.RenderType.Batch + ) + GafferScene.Private.RendererAlgo.outputObjects( + testAdaptors["out"], GafferScene.Private.RendererAlgo.RenderOptions( testAdaptors["out"] ), GafferScene.Private.RendererAlgo.RenderSets( testAdaptors["out"] ), GafferScene.Private.RendererAlgo.LightLinks(), + renderer + ) + + if paths != {} : + self.assertTrue( paths.issubset( allPaths ) ) + + for path in allPaths : + capturedObject = renderer.capturedObject( path ) + for attribute in [ "ai:visibility:camera", "cycles:visibility:camera", "dl:visibility.camera" ] : + if path in paths : + # path is visible by the absence of the attribute, or its presence with a value of True + if attribute in capturedObject.capturedAttributes().attributes() : + self.assertTrue( capturedObject.capturedAttributes().attributes()[attribute].value ) + else : + # path is invisible only by the presence of the attribute with a value of False + self.assertTrue( attribute in capturedObject.capturedAttributes().attributes() ) + self.assertFalse( capturedObject.capturedAttributes().attributes()[attribute].value ) + + # By default everything should be camera visible + assertCameraVisibleObjects( { "/groupA/cube", "/groupA/sphere" } ) + + # All should be visible with the root included + assertCameraVisibleObjects( { "/groupA/cube", "/groupA/sphere" }, cameraInclusions = "/" ) + + # All should be visible with the group included + assertCameraVisibleObjects( { "/groupA/cube", "/groupA/sphere" }, cameraInclusions = "/groupA" ) + + # Only the included location should be visible + assertCameraVisibleObjects( { "/groupA/sphere" }, cameraInclusions = "/groupA/sphere" ) + + # Nothing should be visible if nothing is included + assertCameraVisibleObjects( {}, cameraInclusions = "" ) + + # Test a variety of cameraInclusions set expressions + assertCameraVisibleObjects( { "/groupA/cube", "/groupA/sphere" }, cameraInclusions = "A" ) + assertCameraVisibleObjects( { "/groupA/sphere" }, cameraInclusions = "SPHERE" ) + assertCameraVisibleObjects( { "/groupA/cube" }, cameraInclusions = "CUBE" ) + assertCameraVisibleObjects( { "/groupA/cube" }, cameraInclusions = "A - SPHERE" ) + + # Test a variety of cameraExclusions set expressions + assertCameraVisibleObjects( {}, cameraExclusions = "A" ) + assertCameraVisibleObjects( { "/groupA/cube" }, cameraExclusions = "SPHERE" ) + assertCameraVisibleObjects( { "/groupA/sphere" }, cameraExclusions = "CUBE" ) + assertCameraVisibleObjects( { "/groupA/sphere" }, cameraExclusions = "A - SPHERE" ) + + # Camera exclusions overrides camera inclusions at the same location + assertCameraVisibleObjects( {}, cameraInclusions = "A", cameraExclusions = "A" ) + + # Camera exclusions overrides camera inclusions at a parent location + assertCameraVisibleObjects( {}, cameraInclusions = "/", cameraExclusions = "A" ) + + # Test a variety of camera inclusions and exclusions combinations + assertCameraVisibleObjects( { "/groupA/sphere" }, cameraInclusions = "A", cameraExclusions = "CUBE" ) + assertCameraVisibleObjects( { "/groupA/sphere" }, cameraInclusions = "/groupA", cameraExclusions = "CUBE" ) + assertCameraVisibleObjects( { "/groupA/cube" }, cameraInclusions = "A", cameraExclusions = "SPHERE" ) + assertCameraVisibleObjects( { "/groupA/cube" }, cameraInclusions = "/groupA", cameraExclusions = "SPHERE" ) + + # Camera inclusions overrides camera exclusions at lower locations + assertCameraVisibleObjects( { "/groupA/sphere" }, cameraInclusions = "/groupA/sphere", cameraExclusions = "/groupA" ) + assertCameraVisibleObjects( { "/groupA/sphere" }, cameraInclusions = "SPHERE", cameraExclusions = "/groupA" ) + + # Excluding nothing should leave everything visible + assertCameraVisibleObjects( { "/groupA/cube", "/groupA/sphere" }, cameraExclusions = "" ) + + # Test interaction with scene attributes + assertCameraVisibleObjects( { "/groupA/sphere" }, cameraInclusions = "A", exclusionOverrides = "/groupA/cube" ) + assertCameraVisibleObjects( { "/groupA/cube", "/groupA/sphere" }, cameraInclusions = "A", exclusionOverrides = "/groupA" ) + assertCameraVisibleObjects( { "/groupA/cube", "/groupA/sphere" }, cameraInclusions = "CUBE", inclusionOverrides = "/groupA/sphere" ) + assertCameraVisibleObjects( { "/groupA/cube", "/groupA/sphere" }, cameraInclusions = "", inclusionOverrides = "A" ) + assertCameraVisibleObjects( {}, cameraInclusions = "/", exclusionOverrides = "A" ) + + def testMatteAdaptor( self ) : + + # /groupA + # /cube (A, CUBE) + # /sphere (A, SPHERE) + + cubeA = GafferScene.Cube() + cubeA["sets"].setValue( "A CUBE" ) + + sphereA = GafferScene.Sphere() + sphereA["sets"].setValue( "A SPHERE" ) + + groupA = GafferScene.Group() + groupA["name"].setValue( "groupA" ) + groupA["in"][0].setInput( cubeA["out"] ) + groupA["in"][1].setInput( sphereA["out"] ) + + customOptions = GafferScene.CustomOptions() + customOptions["in"].setInput( groupA["out"] ) + customOptions["options"].addChild( Gaffer.NameValuePlug( "render:matteInclusions", "", True, "matteInclusions" ) ) + customOptions["options"].addChild( Gaffer.NameValuePlug( "render:matteExclusions", "", True, "matteExclusions" ) ) + + inclusionAttributesFilter = GafferScene.SetFilter() + inclusionAttributes = GafferScene.CustomAttributes() + inclusionAttributes["in"].setInput( customOptions["out"] ) + inclusionAttributes["filter"].setInput( inclusionAttributesFilter["out"] ) + inclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "ai:matte", True, True, "aiMatte" ) ) + inclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "cycles:use_holdout", True, True, "cyclesUseHoldout" ) ) + inclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "dl:matte", True, True, "dlMatte" ) ) + + exclusionAttributesFilter = GafferScene.SetFilter() + exclusionAttributes = GafferScene.CustomAttributes() + exclusionAttributes["in"].setInput( inclusionAttributes["out"] ) + exclusionAttributes["filter"].setInput( exclusionAttributesFilter["out"] ) + exclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "ai:matte", False, True, "aiMatte" ) ) + exclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "cycles:use_holdout", False, True, "cyclesUseHoldout" ) ) + exclusionAttributes["attributes"].addChild( Gaffer.NameValuePlug( "dl:matte", False, True, "dlMatte" ) ) + + # Create adaptors for the CapturingRenderer + testAdaptors = GafferScene.SceneAlgo.createRenderAdaptors() + testAdaptors["in"].setInput( exclusionAttributes["out"] ) + + def assertMatte( paths, matteInclusions = None, matteExclusions = None, inclusionOverrides = "", exclusionOverrides = "" ) : + + if matteInclusions is not None : + customOptions["options"]["matteInclusions"]["value"].setValue( matteInclusions ) + customOptions["options"]["matteInclusions"]["enabled"].setValue( matteInclusions is not None ) + + if matteExclusions is not None : + customOptions["options"]["matteExclusions"]["value"].setValue( matteExclusions ) + customOptions["options"]["matteExclusions"]["enabled"].setValue( matteExclusions is not None ) + + inclusionAttributesFilter["setExpression"].setValue( inclusionOverrides ) + exclusionAttributesFilter["setExpression"].setValue( exclusionOverrides ) + + allPaths = { + "/groupA/cube", + "/groupA/sphere", + } + + renderer = GafferScene.Private.IECoreScenePreview.CapturingRenderer( + GafferScene.Private.IECoreScenePreview.Renderer.RenderType.Batch + ) + GafferScene.Private.RendererAlgo.outputObjects( + testAdaptors["out"], GafferScene.Private.RendererAlgo.RenderOptions( testAdaptors["out"] ), GafferScene.Private.RendererAlgo.RenderSets( testAdaptors["out"] ), GafferScene.Private.RendererAlgo.LightLinks(), + renderer + ) + + for path in allPaths : + capturedObject = renderer.capturedObject( path ) + for attribute in [ "ai:matte", "cycles:use_holdout", "dl:matte" ] : + if path in paths : + # path is matte only by the presence of the attribute with a value of True + self.assertTrue( attribute in capturedObject.capturedAttributes().attributes() ) + self.assertTrue( capturedObject.capturedAttributes().attributes()[attribute].value ) + else : + # path isn't matte by the absence of the attribute, or its presence with a value of False + if attribute in capturedObject.capturedAttributes().attributes() : + self.assertFalse( capturedObject.capturedAttributes().attributes()[attribute].value ) + + # Nothing should be matte when matte inclusions and exclusions are empty or undefined + assertMatte( {} ) + assertMatte( {}, matteInclusions = "" ) + assertMatte( {}, matteExclusions = "" ) + assertMatte( {}, matteInclusions = "", matteExclusions = "" ) + + # Including the root of the scene should make everything matte + assertMatte( { "/groupA/cube", "/groupA/sphere" }, matteInclusions = "/" ) + + # Including the group should make its descendants matte + assertMatte( { "/groupA/cube", "/groupA/sphere" }, matteInclusions = "/groupA" ) + # Unless a descendant has been excluded + assertMatte( { "/groupA/cube" }, matteInclusions = "/groupA", matteExclusions = "/groupA/sphere" ) + + # Including a specific location should not affect its siblings + assertMatte( { "/groupA/cube" }, matteInclusions = "/groupA/cube" ) + + # Test a variety of set expressions + assertMatte( { "/groupA/cube", "/groupA/sphere" }, matteInclusions = "A" ) + assertMatte( { "/groupA/sphere" }, matteInclusions = "SPHERE" ) + assertMatte( { "/groupA/cube" }, matteInclusions = "CUBE" ) + assertMatte( { "/groupA/sphere" }, matteInclusions = "A - CUBE" ) + + # Exclusions should override inclusions + assertMatte( {}, matteInclusions = "A", matteExclusions = "A" ) + assertMatte( {}, matteInclusions = "/groupA/sphere", matteExclusions = "/groupA/sphere" ) + assertMatte( { "/groupA/sphere" }, matteInclusions = "A", matteExclusions = "CUBE" ) + assertMatte( { "/groupA/cube" }, matteInclusions = "/groupA", matteExclusions = "SPHERE" ) + assertMatte( { "/groupA/sphere" }, matteInclusions = "A", matteExclusions = "/groupA/cube" ) + + # Matte inclusions override matte exclusions at lower locations + assertMatte( { "/groupA/sphere" }, matteInclusions = "/groupA/sphere", matteExclusions = "/groupA" ) + + # Test interaction with scene attributes + assertMatte( { "/groupA/sphere" }, inclusionOverrides = "/groupA/sphere" ) + assertMatte( { "/groupA/cube", "/groupA/sphere" }, matteInclusions = "/groupA/cube", inclusionOverrides = "/groupA/sphere" ) + assertMatte( { "/groupA/sphere" }, matteExclusions = "/groupA/sphere", inclusionOverrides = "/groupA/sphere" ) + assertMatte( { "/groupA/sphere" }, matteExclusions = "/groupA", inclusionOverrides = "/groupA/sphere" ) + assertMatte( { "/groupA/cube", "/groupA/sphere" }, matteInclusions = "/groupA", matteExclusions = "/groupA/sphere", inclusionOverrides = "/groupA/sphere" ) + + assertMatte( {}, matteInclusions = "/groupA/sphere", exclusionOverrides = "/groupA/sphere" ) + assertMatte( { "/groupA/sphere" }, matteInclusions = "/groupA/sphere", exclusionOverrides = "/groupA" ) + assertMatte( { "/groupA/sphere" }, matteInclusions = "/groupA", exclusionOverrides = "/groupA/cube" ) diff --git a/startup/GafferScene/cameraVisibilityAdaptor.py b/startup/GafferScene/cameraVisibilityAdaptor.py new file mode 100644 index 00000000000..9d6f6c3c534 --- /dev/null +++ b/startup/GafferScene/cameraVisibilityAdaptor.py @@ -0,0 +1,111 @@ +########################################################################## +# +# Copyright (c) 2024, Cinesite VFX Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above +# copyright notice, this list of conditions and the following +# disclaimer. +# +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with +# the distribution. +# +# * Neither the name of John Haddon nor the names of +# any other contributors to this software may be used to endorse or +# promote products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +########################################################################## + +import inspect + +import Gaffer +import GafferScene + +def __cameraVisibilityAdaptor() : + + processor = GafferScene.SceneProcessor() + + processor["__optionQuery"] = GafferScene.OptionQuery() + processor["__optionQuery"]["scene"].setInput( processor["in"] ) + + processor["__optionQuery"].addQuery( Gaffer.StringPlug() ) + processor["__optionQuery"].addQuery( Gaffer.StringPlug() ) + + processor["__optionQuery"]["queries"][0]["name"].setValue( "render:cameraInclusions" ) + processor["__optionQuery"]["queries"][1]["name"].setValue( "render:cameraExclusions" ) + + processor["__cameraInclusionsFilter"] = GafferScene.SetFilter() + processor["__cameraInclusionsExpression"] = Gaffer.Expression() + processor["__cameraInclusionsExpression"].setExpression( + inspect.cleandoc( + """ + cameraInclusions = parent["__optionQuery"]["out"]["out0"]["value"] + cameraExclusions = parent["__optionQuery"]["out"]["out1"]["value"] + parent["__cameraInclusionsFilter"]["setExpression"] = "({}) - ({})".format( cameraInclusions, cameraExclusions ) if ( cameraInclusions and cameraExclusions ) else cameraInclusions + """ + ) + ) + + processor["__filterQuery"] = GafferScene.FilterQuery() + processor["__filterQuery"]["scene"].setInput( processor["in"] ) + processor["__filterQuery"]["filter"].setInput( processor["__cameraInclusionsFilter"]["out"] ) + processor["__filterQuery"]["location"].setValue( "/" ) + + processor["__allCameraExcluded"] = GafferScene.CustomAttributes() + processor["__allCameraExcluded"]["in"].setInput( processor["in"] ) + processor["__allCameraExcluded"]["attributes"].addChild( Gaffer.NameValuePlug( "ai:visibility:camera", Gaffer.BoolPlug() ) ) + processor["__allCameraExcluded"]["attributes"].addChild( Gaffer.NameValuePlug( "cycles:visibility:camera", Gaffer.BoolPlug() ) ) + processor["__allCameraExcluded"]["attributes"].addChild( Gaffer.NameValuePlug( "dl:visibility.camera", Gaffer.BoolPlug() ) ) + processor["__allCameraExcluded"]["global"].setValue( True ) + # __allCameraExcluded is only required when `render:cameraInclusions` exists and does not match the root of the scene. + processor["__allCameraExcludedExpression"] = Gaffer.Expression() + processor["__allCameraExcludedExpression"].setExpression( + """parent["__allCameraExcluded"]["enabled"] = parent["__optionQuery"]["out"]["out0"]["exists"] and not parent["__filterQuery"]["exactMatch"]""" + ) + + processor["__cameraInclusions"] = GafferScene.AttributeTweaks() + processor["__cameraInclusions"]["in"].setInput( processor["__allCameraExcluded"]["out"] ) + processor["__cameraInclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "ai:visibility:camera", Gaffer.BoolPlug( defaultValue = True ), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + processor["__cameraInclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "cycles:visibility:camera", Gaffer.BoolPlug( defaultValue = True ), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + processor["__cameraInclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "dl:visibility.camera", Gaffer.BoolPlug( defaultValue = True ), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + + processor["__cameraInclusions"]["filter"].setInput( processor["__cameraInclusionsFilter"]["out"] ) + # __cameraInclusions is only required when `render:cameraInclusions` exists + processor["__cameraInclusions"]["enabled"].setInput( processor["__optionQuery"]["out"][0]["exists"] ) + + processor["__cameraExclusionsFilter"] = GafferScene.SetFilter() + processor["__cameraExclusionsFilter"]["setExpression"].setInput( processor["__optionQuery"]["out"][1]["value"] ) + + processor["__cameraExclusions"] = GafferScene.AttributeTweaks() + processor["__cameraExclusions"]["in"].setInput( processor["__cameraInclusions"]["out"] ) + processor["__cameraExclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "ai:visibility:camera", Gaffer.BoolPlug(), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + processor["__cameraExclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "cycles:visibility:camera", Gaffer.BoolPlug(), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + processor["__cameraExclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "dl:visibility.camera", Gaffer.BoolPlug(), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + + processor["__cameraExclusions"]["filter"].setInput( processor["__cameraExclusionsFilter"]["out"] ) + # __cameraExclusions is only required when `render:cameraExclusions` exists + processor["__cameraExclusions"]["enabled"].setInput( processor["__optionQuery"]["out"][1]["exists"] ) + + processor["out"].setInput( processor["__cameraExclusions"]["out"] ) + + return processor + +GafferScene.SceneAlgo.registerRenderAdaptor( "CameraVisibilityAdaptor", __cameraVisibilityAdaptor ) diff --git a/startup/GafferScene/matteAdaptor.py b/startup/GafferScene/matteAdaptor.py new file mode 100644 index 00000000000..2f36c0a5b4f --- /dev/null +++ b/startup/GafferScene/matteAdaptor.py @@ -0,0 +1,111 @@ +########################################################################## +# +# Copyright (c) 2024, Cinesite VFX Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above +# copyright notice, this list of conditions and the following +# disclaimer. +# +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with +# the distribution. +# +# * Neither the name of John Haddon nor the names of +# any other contributors to this software may be used to endorse or +# promote products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +########################################################################## + +import inspect + +import Gaffer +import GafferScene + +def __matteAdaptor() : + + processor = GafferScene.SceneProcessor() + + processor["__optionQuery"] = GafferScene.OptionQuery() + processor["__optionQuery"]["scene"].setInput( processor["in"] ) + + processor["__optionQuery"].addQuery( Gaffer.StringPlug() ) + processor["__optionQuery"].addQuery( Gaffer.StringPlug() ) + + processor["__optionQuery"]["queries"][0]["name"].setValue( "render:matteInclusions" ) + processor["__optionQuery"]["queries"][1]["name"].setValue( "render:matteExclusions" ) + + processor["__matteInclusionsFilter"] = GafferScene.SetFilter() + processor["__matteInclusionsExpression"] = Gaffer.Expression() + processor["__matteInclusionsExpression"].setExpression( + inspect.cleandoc( + """ + matteInclusions = parent["__optionQuery"]["out"]["out0"]["value"] + matteExclusions = parent["__optionQuery"]["out"]["out1"]["value"] + parent["__matteInclusionsFilter"]["setExpression"] = "({}) - ({})".format( matteInclusions, matteExclusions ) if ( matteInclusions and matteExclusions ) else matteInclusions + """ + ) + ) + + processor["__filterQuery"] = GafferScene.FilterQuery() + processor["__filterQuery"]["scene"].setInput( processor["in"] ) + processor["__filterQuery"]["filter"].setInput( processor["__matteInclusionsFilter"]["out"] ) + processor["__filterQuery"]["location"].setValue( "/" ) + + processor["__allMatte"] = GafferScene.CustomAttributes() + processor["__allMatte"]["in"].setInput( processor["in"] ) + processor["__allMatte"]["attributes"].addChild( Gaffer.NameValuePlug( "ai:matte", Gaffer.BoolPlug( defaultValue = True ) ) ) + processor["__allMatte"]["attributes"].addChild( Gaffer.NameValuePlug( "cycles:use_holdout", Gaffer.BoolPlug( defaultValue = True ) ) ) + processor["__allMatte"]["attributes"].addChild( Gaffer.NameValuePlug( "dl:matte", Gaffer.BoolPlug( defaultValue = True ) ) ) + processor["__allMatte"]["global"].setValue( True ) + # all locations are matte if `render:matteInclusions` matches the root of the scene + processor["__allMatte"]["enabled"].setInput( processor["__filterQuery"]["exactMatch"] ) + + processor["__matteInclusions"] = GafferScene.AttributeTweaks() + processor["__matteInclusions"]["in"].setInput( processor["__allMatte"]["out"] ) + processor["__matteInclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "ai:matte", Gaffer.BoolPlug( defaultValue = True ), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + processor["__matteInclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "cycles:use_holdout", Gaffer.BoolPlug( defaultValue = True ), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + processor["__matteInclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "dl:matte", Gaffer.BoolPlug( defaultValue = True ), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + + processor["__matteInclusions"]["filter"].setInput( processor["__matteInclusionsFilter"]["out"] ) + # __matteInclusions is only required when `render:matteInclusions` exists and the root of the scene hasn't been set as matte + processor["__matteInclusionsEnabledExpression"] = Gaffer.Expression() + processor["__matteInclusionsEnabledExpression"].setExpression( + """parent["__matteInclusions"]["enabled"] = parent["__optionQuery"]["out"]["out0"]["exists"] and not parent["__filterQuery"]["exactMatch"]""" + ) + + processor["__matteExclusionsFilter"] = GafferScene.SetFilter() + processor["__matteExclusionsFilter"]["setExpression"].setInput( processor["__optionQuery"]["out"][1]["value"] ) + + processor["__matteExclusions"] = GafferScene.AttributeTweaks() + processor["__matteExclusions"]["in"].setInput( processor["__matteInclusions"]["out"] ) + processor["__matteExclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "ai:matte", Gaffer.BoolPlug(), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + processor["__matteExclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "cycles:use_holdout", Gaffer.BoolPlug(), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + processor["__matteExclusions"]["tweaks"].addChild( Gaffer.TweakPlug( "dl:matte", Gaffer.BoolPlug(), mode = Gaffer.TweakPlug.Mode.CreateIfMissing ) ) + + processor["__matteExclusions"]["filter"].setInput( processor["__matteExclusionsFilter"]["out"] ) + # __matteExclusions is only required when `render:matteExclusions` exists + processor["__matteExclusions"]["enabled"].setInput( processor["__optionQuery"]["out"][1]["exists"] ) + + processor["out"].setInput( processor["__matteExclusions"]["out"] ) + + return processor + +GafferScene.SceneAlgo.registerRenderAdaptor( "MatteAdaptor", __matteAdaptor ) diff --git a/startup/GafferScene/standardOptions.py b/startup/GafferScene/standardOptions.py index b9acb555fdc..125af0187f7 100644 --- a/startup/GafferScene/standardOptions.py +++ b/startup/GafferScene/standardOptions.py @@ -156,3 +156,51 @@ by this set expression. """ ) + +Gaffer.Metadata.registerValue( "option:render:cameraInclusions", "label", "Camera Inclusions" ) +Gaffer.Metadata.registerValue( "option:render:cameraInclusions", "defaultValue", IECore.StringData( "/" ) ) +Gaffer.Metadata.registerValue( + "option:render:cameraInclusions", + "description", + """ + A set expression that limits the objects visible to camera rays to only those matched + and their descendants. Camera visibility attributes authored in the scene take + precedence over this option. + """ +) + +Gaffer.Metadata.registerValue( "option:render:cameraExclusions", "label", "Camera Exclusions" ) +Gaffer.Metadata.registerValue( "option:render:cameraExclusions", "defaultValue", IECore.StringData( "" ) ) +Gaffer.Metadata.registerValue( + "option:render:cameraExclusions", + "description", + """ + A set expression that excludes the matched objects and their descendants from camera + ray visibility. Camera visibility attributes authored in the scene take precedence + over this option. + """ +) + +Gaffer.Metadata.registerValue( "option:render:matteInclusions", "label", "Matte Inclusions" ) +Gaffer.Metadata.registerValue( "option:render:matteInclusions", "defaultValue", IECore.StringData( "" ) ) +Gaffer.Metadata.registerValue( + "option:render:matteInclusions", + "description", + """ + A set expression that specifies objects that should be treated as matte (holdout) + objects along with their descendants. Matte attributes authored in the scene take + precedence over this option. + """ +) + +Gaffer.Metadata.registerValue( "option:render:matteExclusions", "label", "Matte Exclusions" ) +Gaffer.Metadata.registerValue( "option:render:matteExclusions", "defaultValue", IECore.StringData( "" ) ) +Gaffer.Metadata.registerValue( + "option:render:matteExclusions", + "description", + """ + A set expression that excludes the matched objects and their descendants from being + treated as matte (holdout) objects. Matte attributes authored in the scene take + precedence over this option. + """ +) diff --git a/startup/gui/renderPassEditor.py b/startup/gui/renderPassEditor.py index ef91f11fbff..2ab396d22da 100644 --- a/startup/gui/renderPassEditor.py +++ b/startup/gui/renderPassEditor.py @@ -44,6 +44,10 @@ GafferSceneUI.RenderPassEditor.registerOption( "*", "render:inclusions" ) GafferSceneUI.RenderPassEditor.registerOption( "*", "render:exclusions" ) GafferSceneUI.RenderPassEditor.registerOption( "*", "render:additionalLights" ) +GafferSceneUI.RenderPassEditor.registerOption( "*", "render:cameraInclusions" ) +GafferSceneUI.RenderPassEditor.registerOption( "*", "render:cameraExclusions" ) +GafferSceneUI.RenderPassEditor.registerOption( "*", "render:matteInclusions" ) +GafferSceneUI.RenderPassEditor.registerOption( "*", "render:matteExclusions" ) GafferSceneUI.RenderPassEditor.registerOption( "*", "render:defaultRenderer", "Render" ) GafferSceneUI.RenderPassEditor.registerOption( "*", "render:camera", "Render" )