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

Viewer doesn't draw correctly when switching between images/frames #6043

Closed
ivanimanishi opened this issue Sep 13, 2024 · 1 comment
Closed

Comments

@ivanimanishi
Copy link
Member

Version: Gaffer 1.4.12.0-linux and Gaffer 1.3.16.7-linux
Third-party tools: Cycles (and Arnold)
Third-party modules: None

Description

We have noticed that in gaffer 1.3 and 1.4 (this wasn’t a problem in gaffer 1.2), that switching between images with the Numeric Bookmarks, or frames, when the IPR is running cause the image to not correctly draw sometimes resulting in an anaglyph type look. As far as we can tell this only happens when the IPR is running and cannot reproduce when just switching between images.

Steps to reproduce

See attached video and script.

Debug log

Click to Expand

import Gaffer
import GafferArnold
import GafferImage
import GafferScene
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", 16, persistent=False )
Gaffer.Metadata.registerValue( parent, "serialiser:patchVersion", 7, persistent=False )

__children = {}

parent["variables"].addChild( Gaffer.NameValuePlug( "image:catalogue:port", Gaffer.IntPlug( "value", defaultValue = 0, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "imageCataloguePort", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
parent["variables"].addChild( Gaffer.NameValuePlug( "project:name", Gaffer.StringPlug( "value", defaultValue = 'default', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "projectName", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
parent["variables"].addChild( Gaffer.NameValuePlug( "project:rootDirectory", Gaffer.StringPlug( "value", defaultValue = '$HOME/gaffer/projects/${project:name}', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "projectRootDirectory", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
parent["variables"].addChild( Gaffer.NameValuePlug( "image:viewName", Gaffer.StringPlug( "value", defaultValue = 'default', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "defaultViewName", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
parent["variables"].addChild( Gaffer.NameValuePlug( "workingPath", Gaffer.StringPlug( "value", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "workingPath", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
parent["variables"].addChild( Gaffer.NameValuePlug( "job", Gaffer.StringPlug( "value", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "job", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
parent["variables"].addChild( Gaffer.NameValuePlug( "sequence", Gaffer.StringPlug( "value", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "sequence", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
parent["variables"].addChild( Gaffer.NameValuePlug( "shot", Gaffer.StringPlug( "value", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "shot", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
parent["variables"].addChild( Gaffer.NameValuePlug( "scene", Gaffer.StringPlug( "value", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "scene", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
parent["variables"].addChild( Gaffer.NameValuePlug( "jabuka:location", Gaffer.StringPlug( "value", defaultValue = '/SNC/build/drone', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "jabuka_location", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
parent["variables"].addChild( Gaffer.NameValuePlug( "jabuka:lightingReferenceShotLocation", Gaffer.StringPlug( "value", defaultValue = '/SNC/build/drone', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "jabuka_lightingReferenceShotLocation", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
parent["variables"].addChild( Gaffer.NameValuePlug( "jabuka:databaseRefreshTrigger", Gaffer.StringPlug( "value", defaultValue = '', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "jabuka_databaseRefreshTrigger", Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic ) )
__children["openColorIO"] = GafferImage.OpenColorIOConfigPlug( "openColorIO", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, )
parent.addChild( __children["openColorIO"] )
__children["defaultFormat"] = GafferImage.FormatPlug( "defaultFormat", defaultValue = GafferImage.Format( 1920, 1080, 1.000 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, )
parent.addChild( __children["defaultFormat"] )
__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["Group"] = GafferScene.Group( "Group" )
parent.addChild( __children["Group"] )
__children["Group"]["in"].addChild( GafferScene.ScenePlug( "in1", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Group"]["in"].addChild( GafferScene.ScenePlug( "in2", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Group"]["in"].addChild( GafferScene.ScenePlug( "in3", flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Group"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["SpotLight"] = GafferArnold.ArnoldLight( "SpotLight" )
parent.addChild( __children["SpotLight"] )
__children["SpotLight"].loadShader( "spot_light" )
__children["SpotLight"].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( "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( "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( "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"]["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( "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( "catalogue:imageName", Gaffer.StringPlug( "value", defaultValue = 'Image', flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ), "catalogue_imageName", 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["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["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["foo"] = GafferImage.Catalogue( "foo" )
parent.addChild( __children["foo"] )
__children["foo"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Checkerboard"] = GafferImage.Checkerboard( "Checkerboard" )
parent.addChild( __children["Checkerboard"] )
__children["Checkerboard"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["ImageTransform"] = GafferImage.ImageTransform( "ImageTransform" )
parent.addChild( __children["ImageTransform"] )
__children["ImageTransform"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Expression"] = Gaffer.Expression( "Expression" )
parent.addChild( __children["Expression"] )
__children["Expression"]["__out"].addChild( Gaffer.FloatPlug( "p0", direction = Gaffer.Plug.Direction.Out, defaultValue = 0.0, flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
__children["Expression"].addChild( Gaffer.V2fPlug( "__uiPosition", defaultValue = imath.V2f( 0, 0 ), flags = Gaffer.Plug.Flags.Default | Gaffer.Plug.Flags.Dynamic, ) )
parent["frameRange"]["start"].setValue( 1001 )
parent["frameRange"]["end"].setValue( 1100 )
parent["frame"].setValue( 1022.0 )
parent["variables"]["imageCataloguePort"]["value"].setValue( 44287 )
parent["variables"]["workingPath"]["value"].setValue( '/data/jobs/SNC/sequences/build/shots/drone' )
parent["variables"]["job"]["value"].setValue( 'SNC' )
parent["variables"]["sequence"]["value"].setValue( 'build' )
parent["variables"]["shot"]["value"].setValue( 'drone' )
parent["variables"]["scene"]["value"].setValue( '${script:name}' )
parent["variables"]["jabuka_databaseRefreshTrigger"]["value"].setValue( ';22e0d4ded72944fab5f026d32eded489' )
Gaffer.Metadata.registerValue( parent["variables"]["imageCataloguePort"], 'readOnly', True )
Gaffer.Metadata.registerValue( parent["variables"]["projectName"]["name"], 'readOnly', True )
Gaffer.Metadata.registerValue( parent["variables"]["projectRootDirectory"]["name"], 'readOnly', True )
Gaffer.Metadata.registerValue( parent["variables"]["defaultViewName"], 'layout:visibilityActivator', False )
Gaffer.Metadata.registerValue( parent["variables"]["defaultViewName"]["name"], 'readOnly', True )
Gaffer.Metadata.registerValue( parent["variables"]["defaultViewName"]["value"], 'readOnly', True )
__children["Cube"]["dimensions"].setValue( imath.V3f( 0.720000029, 1, 1 ) )
__children["Cube"]["__uiPosition"].setValue( imath.V2f( 21.8834, 5.4140625 ) )
__children["Camera"]["transform"]["translate"].setValue( imath.V3f( 0, 0, 3.24662089 ) )
__children["Camera"]["__uiPosition"].setValue( imath.V2f( 34.5499992, 5.4140625 ) )
__children["Group"]["in"][0].setInput( __children["Cube"]["out"] )
__children["Group"]["in"][1].setInput( __children["Camera"]["out"] )
__children["Group"]["in"][2].setInput( __children["SpotLight"]["out"] )
__children["Group"]["__uiPosition"].setValue( imath.V2f( 36.0499992, -2.75 ) )
__children["SpotLight"]["name"].setValue( 'spotLight' )
__children["SpotLight"]["transform"]["translate"].setValue( imath.V3f( 0, 0.487982512, 2.1964047 ) )
__children["SpotLight"]["parameters"]["color"].setValue( imath.Color3f( 1, 0.0985915661, 0.0985915661 ) )
__children["SpotLight"]["__uiPosition"].setValue( imath.V2f( 46.7184143, 5.4140625 ) )
__children["Outputs"]["in"].setInput( __children["Group"]["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( 36.0499992, -14.2802143 ) )
__children["StandardOptions"]["in"].setInput( __children["Outputs"]["out"] )
__children["StandardOptions"]["options"]["renderCamera"]["value"].setValue( '/group/camera' )
__children["StandardOptions"]["options"]["renderCamera"]["enabled"].setValue( True )
__children["StandardOptions"]["options"]["renderResolution"]["value"].setValue( imath.V2i( 2880, 1620 ) )
__children["StandardOptions"]["options"]["renderResolution"]["enabled"].setValue( True )
__children["StandardOptions"]["__uiPosition"].setValue( imath.V2f( 36.0499992, -22.4442768 ) )
__children["InteractiveRender"]["in"].setInput( __children["StandardOptions"]["out"] )
__children["InteractiveRender"]["renderer"].setValue( 'Arnold' )
__children["InteractiveRender"]["__uiPosition"].setValue( imath.V2f( 36.0499992, -30.6083412 ) )
Gaffer.MetadataAlgo.setNumericBookmark( __children["foo"].scriptNode(), 1, __children["foo"] )
__children["foo"]["__uiPosition"].setValue( imath.V2f( 52.596714, -30.2615891 ) )
__children["Checkerboard"]["format"].setValue( GafferImage.Format( 2880, 1620, 1.000 ) )
Gaffer.Metadata.registerValue( __children["Checkerboard"]["format"], 'formatPlugValueWidget:mode', 'standard' )
__children["Checkerboard"]["size"]["y"].setInput( __children["Checkerboard"]["size"]["x"] )
__children["Checkerboard"]["__uiPosition"].setValue( imath.V2f( 74.7874756, -21.9511738 ) )
Gaffer.MetadataAlgo.setNumericBookmark( __children["ImageTransform"].scriptNode(), 2, __children["ImageTransform"] )
__children["ImageTransform"]["in"].setInput( __children["Checkerboard"]["out"] )
__children["ImageTransform"]["transform"]["pivot"].setValue( imath.V2f( 1440, 810 ) )
__children["ImageTransform"]["transform"]["rotate"].setInput( __children["Expression"]["__out"]["p0"] )
__children["ImageTransform"]["__uiPosition"].setValue( imath.V2f( 74.7874756, -30.1152363 ) )
__children["Expression"]["__uiPosition"].setValue( imath.V2f( 62.4156265, -30.1160564 ) )
__children["Expression"]["__engine"].setValue( 'python' )
__children["Expression"]["__expression"].setValue( 'parent["__out"]["p0"] = context.getFrame() * 17' )


del __children


2024-09-13_09-21-51.mp4
@johnhaddon
Copy link
Member

Thanks for the simple example for showing the problem - it reproduces here. I suspect that somehow the update is getting cancelled but we're not detecting that and doing a restart. Will investigate further...

johnhaddon added a commit to johnhaddon/gaffer that referenced this issue Sep 18, 2024
In most cases this didn't matter, because we were only getting cancelled by a graph edit which would eventually dirty the input plug anyway. But cancellation could be due to an edit in an unrelated part of the graph, in which case our input plug won't be dirtied again, but we do want to restart the update.

Fixes GafferHQ#6043
johnhaddon added a commit to johnhaddon/gaffer that referenced this issue Sep 18, 2024
In most cases this didn't matter, because we were only getting cancelled by a graph edit which would eventually dirty the input plug anyway. But cancellation could be due to an edit in an unrelated part of the graph, in which case our input plug won't be dirtied again, but we do want to restart the update.

Fixes GafferHQ#6043
johnhaddon added a commit to johnhaddon/gaffer that referenced this issue Sep 19, 2024
In most cases this didn't matter, because we were only getting cancelled by a graph edit which would eventually dirty the input plug anyway. But cancellation could be due to an edit in an unrelated part of the graph, in which case our input plug won't be dirtied again, but we do want to restart the update.

Fixes GafferHQ#6043
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants