Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

IPR over a Plate disables Render Control UI #3888

Closed
andrewkaufman opened this issue Aug 26, 2020 · 2 comments
Closed

IPR over a Plate disables Render Control UI #3888

andrewkaufman opened this issue Aug 26, 2020 · 2 comments
Assignees
Labels
ui Issues related to the UI/UX in Gaffer

Comments

@andrewkaufman
Copy link
Contributor

Version: Gaffer 0.58.0.1-linux
Third-party tools: Arnold (or Appleseed)
Third-party modules: Many in practice, none in demo scipt

Description

Doing an IPR composited over a plate can result in both "fileFormat" and "gaffer:sourceScene" metadata in the same stream (via a bit of metadata copying), which in turn disables the Render Control UI.

def __imageIsRendering( self, imagePlug ) :
# Make-shift detection of an in-progress render.
# Finished images have the `fileFormat` key courtesy of OIIO.
## \TODO add more formal metadata to determine this
try :
return "fileFormat" not in imagePlug.metadata()
except :
return False

It would be great to address the todo here rather than relying on manual metadata cleanup.

It'd be even better if the common operation of "IPR over Plate" somehow maintained the Render Control UI on its own (via "gaffer:sourceScene" metadata or some new mechanism) rather than relying on a downstream CopyImageMetadata.

Steps to reproduce

  1. Load the example script below
  2. View Bookmark 1 and start the IPR via the NodeEditor
  3. View Bookmark 4
    • Note the Render Control UI is visible but disabled
  4. View Bookmark 3
    • Render Control UI disappears
  5. View Bookmark 2
    • Render Control UI is still enabled (and still running)
  6. Stop the render via Render Control UI
  7. View Bookmark 4 again
    • Render Control UI is enabled now
  8. Start a new render via Render Control UI
    • Render Control UI will disable immediately after starting the render

Example Script

Click to Expand

import Gaffer
import GafferAppleseed
import GafferImage
import GafferScene
import IECore
import imath

Gaffer.Metadata.registerValue( parent, "serialiser:milestoneVersion", 0, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:majorVersion", 58, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:minorVersion", 0, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:patchVersion", 1, persistent=False )

__children = {}

__children["Sphere"] = GafferScene.Sphere( "Sphere" )
parent.addChild( __children["Sphere"] )
__children["Sphere"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Cube"] = GafferScene.Cube( "Cube" )
parent.addChild( __children["Cube"] )
__children["Cube"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Camera"] = GafferScene.Camera( "Camera" )
parent.addChild( __children["Camera"] )
__children["Camera"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Parent"] = GafferScene.Parent( "Parent" )
parent.addChild( __children["Parent"] )
__children["Parent"]["children"].addChild( GafferScene.ScenePlug( "child1", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Parent"]["children"].addChild( GafferScene.ScenePlug( "child2", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Parent"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["StandardOptions"] = GafferScene.StandardOptions( "StandardOptions" )
parent.addChild( __children["StandardOptions"] )
__children["StandardOptions"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outputs"] = GafferScene.Outputs( "Outputs" )
parent.addChild( __children["Outputs"] )
__children["Outputs"]["outputs"].addChild( Gaffer.ValuePlug( "output1", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outputs"]["outputs"]["output1"].addChild( Gaffer.StringPlug( "name", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outputs"]["outputs"]["output1"].addChild( Gaffer.BoolPlug( "active", defaultValue = True, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outputs"]["outputs"]["output1"].addChild( Gaffer.StringPlug( "fileName", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outputs"]["outputs"]["output1"].addChild( Gaffer.StringPlug( "type", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outputs"]["outputs"]["output1"].addChild( Gaffer.StringPlug( "data", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outputs"]["outputs"]["output1"].addChild( Gaffer.CompoundDataPlug( "parameters", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Outputs"]["outputs"]["output1"]["parameters"].addChild( Gaffer.NameValuePlug( "quantize", Gaffer.IntVectorDataPlug( "value", defaultValue = IECore.IntVectorData( [ 0, 0, 0, 0 ] ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "quantize", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
__children["Outputs"]["outputs"]["output1"]["parameters"].addChild( Gaffer.NameValuePlug( "displayHost", Gaffer.StringPlug( "value", defaultValue = 'localhost', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "displayHost", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
__children["Outputs"]["outputs"]["output1"]["parameters"].addChild( Gaffer.NameValuePlug( "remoteDisplayType", Gaffer.StringPlug( "value", defaultValue = 'GafferImage::GafferDisplayDriver', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "remoteDisplayType", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
__children["Outputs"]["outputs"]["output1"]["parameters"].addChild( Gaffer.NameValuePlug( "driverType", Gaffer.StringPlug( "value", defaultValue = 'ClientDisplayDriver', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "driverType", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
__children["Outputs"]["outputs"]["output1"]["parameters"].addChild( Gaffer.NameValuePlug( "displayPort", Gaffer.StringPlug( "value", defaultValue = '${image:catalogue:port}', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "displayPort", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
__children["Outputs"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["InteractiveAppleseedRender"] = GafferAppleseed.InteractiveAppleseedRender( "InteractiveAppleseedRender" )
parent.addChild( __children["InteractiveAppleseedRender"] )
__children["InteractiveAppleseedRender"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Catalogue"] = GafferImage.Catalogue( "Catalogue" )
parent.addChild( __children["Catalogue"] )
__children["Catalogue"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Merge"] = GafferImage.Merge( "Merge" )
parent.addChild( __children["Merge"] )
__children["Merge"]["in"].addChild( GafferImage.ImagePlug( "in2", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Merge"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["ImageReader"] = GafferImage.ImageReader( "ImageReader" )
parent.addChild( __children["ImageReader"] )
__children["ImageReader"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["CopyImageMetadata"] = GafferImage.CopyImageMetadata( "CopyImageMetadata" )
parent.addChild( __children["CopyImageMetadata"] )
__children["CopyImageMetadata"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Sphere"]["transform"]["translate"].setValue( imath.V3f( -3.30550456, 0, 0 ) )
__children["Sphere"]["__uiPosition"].setValue( imath.V2f( -14.6999941, 35.2748947 ) )
__children["Cube"]["transform"]["translate"].setValue( imath.V3f( 2.56078744, 0, 0 ) )
__children["Cube"]["__uiPosition"].setValue( imath.V2f( -2.19999695, 35.2748947 ) )
__children["Camera"]["transform"]["translate"].setValue( imath.V3f( 0, 0, 9.70609951 ) )
__children["Camera"]["__uiPosition"].setValue( imath.V2f( -28.2000008, 35.2765274 ) )
__children["Parent"]["in"].setInput( __children["Camera"]["out"] )
__children["Parent"]["parent"].setValue( '/' )
__children["Parent"]["children"][0].setInput( __children["Sphere"]["out"] )
__children["Parent"]["children"][1].setInput( __children["Cube"]["out"] )
__children["Parent"]["__uiPosition"].setValue( imath.V2f( -14.6999941, 27.1108303 ) )
__children["StandardOptions"]["in"].setInput( __children["Parent"]["out"] )
__children["StandardOptions"]["options"]["renderCamera"]["value"].setValue( '/camera' )
__children["StandardOptions"]["options"]["renderCamera"]["enabled"].setValue( True )
__children["StandardOptions"]["options"]["renderCropWindow"]["value"].setValue( imath.Box2f( imath.V2f( 0, 0 ), imath.V2f( 0.786226869, 1 ) ) )
__children["StandardOptions"]["options"]["renderCropWindow"]["enabled"].setValue( True )
__children["StandardOptions"]["__uiPosition"].setValue( imath.V2f( -14.6999941, 18.9467697 ) )
__children["Outputs"]["in"].setInput( __children["StandardOptions"]["out"] )
__children["Outputs"]["outputs"]["output1"]["name"].setValue( 'Interactive/Beauty' )
__children["Outputs"]["outputs"]["output1"]["fileName"].setValue( 'beauty' )
__children["Outputs"]["outputs"]["output1"]["type"].setValue( 'ieDisplay' )
__children["Outputs"]["outputs"]["output1"]["data"].setValue( 'rgba' )
__children["Outputs"]["__uiPosition"].setValue( imath.V2f( -14.6999941, 10.7827072 ) )
Gaffer.MetadataAlgo.setNumericBookmark( __children["InteractiveAppleseedRender"].scriptNode(), 1, __children["InteractiveAppleseedRender"] )
__children["InteractiveAppleseedRender"]["in"].setInput( __children["Outputs"]["out"] )
__children["InteractiveAppleseedRender"]["__uiPosition"].setValue( imath.V2f( -14.6999941, 2.61864233 ) )
Gaffer.MetadataAlgo.setNumericBookmark( __children["Catalogue"].scriptNode(), 2, __children["Catalogue"] )
__children["Catalogue"]["imageIndex"].setValue( 1 )
__children["Catalogue"]["__uiPosition"].setValue( imath.V2f( -8.76958179, -5.24839973 ) )
Gaffer.MetadataAlgo.setNumericBookmark( __children["Merge"].scriptNode(), 3, __children["Merge"] )
__children["Merge"]["in"][0].setInput( __children["ImageReader"]["out"] )
__children["Merge"]["in"][1].setInput( __children["Catalogue"]["out"] )
__children["Merge"]["operation"].setValue( 8 )
__children["Merge"]["__uiPosition"].setValue( imath.V2f( -19.2412262, -13.4124622 ) )
__children["ImageReader"]["fileName"].setValue( '${GAFFER_ROOT}/doc/gaffer/html/_images/exampleGaffyAttacksResults.png' )
__children["ImageReader"]["__uiPosition"].setValue( imath.V2f( -22.2412224, -5.24839973 ) )
Gaffer.MetadataAlgo.setNumericBookmark( __children["CopyImageMetadata"].scriptNode(), 4, __children["CopyImageMetadata"] )
__children["CopyImageMetadata"]["in"].setInput( __children["Merge"]["out"] )
__children["CopyImageMetadata"]["copyFrom"].setInput( __children["Catalogue"]["out"] )
__children["CopyImageMetadata"]["names"].setValue( 'gaffer:sourceScene' )
__children["CopyImageMetadata"]["__uiPosition"].setValue( imath.V2f( -10.2695818, -21.5765247 ) )


del __children

@andrewkaufman andrewkaufman added the ui Issues related to the UI/UX in Gaffer label Aug 26, 2020
@themissingcow themissingcow self-assigned this Aug 27, 2020
@themissingcow
Copy link

Thanks for the helpful repro Andrew. We'll get this sorted soon.

@themissingcow
Copy link

@andrewkaufman This should be fixed in https://github.com/GafferHQ/gaffer/releases/tag/0.58.6.0, but pipeline nodes may need to be updated to pass-through gaffer:isRendering metadata.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ui Issues related to the UI/UX in Gaffer
Projects
None yet
Development

No branches or pull requests

2 participants