0.58.0.0

Caution

References containing promoted Spreadsheets, when saved from Gaffer 0.58, can not be loaded in previous versions of Gaffer.

Features

  • InteractiveRender : Added message log to the node’s UI, displaying output from the last render (#3419).
  • Viewer : Added a floating inspector to allow quick inspection and editing of lights and other shaders (#3661).
  • Viewer : Added GPU support for gamma/exposure and OCIO display transforms.

Improvements

  • Caching : Improved interactive performance using an improved hash cache invalidation strategy.
  • SceneNode : Improved performance for all nodes that must propagate bounds from children to parents.
  • PointsType : Removed unnecessary bounds computation overhead.
  • OSLObject/ClosestPointSampler/CurveSampler : Improved performance for cases where multiple downstream computes require the same upstream object.
  • Stats app : Added -location argument, to allow profiling of a single location in a scene.
  • AnimationEditor : Improved performance.
  • MessageWidget : Added alternate presentation options allowing log-style message display, search, etc.
  • Viewer : Added warning/error message count to Render Control overlay.

Fixes

  • GraphEditor : Implemented undo for node drags (#423).
  • Reference (#3810) :
    • Fixed bug which caused promoted Spreadsheet values to be lost when exporting a Box for referencing.
    • Fixed bug which caused promoted Spreadsheet cells to be duplicated by copy/paste.
    • Prevented addition and removal of rows and columns for promoted Spreadsheets, as changes will be lost when reloading the reference.
  • DeleteSets : Fixed bug which allowed the deletion of Gaffer’s internal __lights, __cameras and __lightFilters sets. These are now always preserved, because they are needed to output the scene for rendering.
  • TransformTool :
    • Fixed handle orientation for transforms with negative scaling.
    • Fixed handle positions for locations with PointConstraints or ParentConstraints applied.
    • Fixed translation and rotation of locations with a ParentConstraint applied.
    • Fixed rotation of locations with negative scaling.
  • ImageReader/ImageWriter : Fixed handling of errors in Python functions registered using setDefaultColorSpaceFunction().
  • StyleSheet : Fixed monospace font stack.
  • GafferUI : Fixed lingering highlight state if a Button was disabled whilst the cursor was over it.
  • Signal : Fixed hang which could occur if a result combiner implemented in Python tried to handle exceptions.
  • NumericWidget : Fixed errors when trying to use a virtual slider with an empty value.
  • GraphComponent : Fixed return value for items() method. The returned keys are now regular str() objects rather than InternedString.
  • Fixed dependency tracking bugs in the following nodes :
    • UDIMQuery
    • Shader
    • FilterResults
    • FreezeTransform
    • ImageMetadata
    • FlatImageProcessor
    • FlatToDeep
    • OpenImageIOReader
    • LevelSetOffset
    • MeshToLevelSet
    • CopyPrimitiveVariables
    • CopyAttributes
    • SubTree
    • MergeScenes
    • CollectScenes
    • Instancer
    • Duplicate
    • ClosestPointSampler
    • CurveSampler
    • DeleteSets
  • SetAlgo : Fixed affectsSetExpression() to return True for ScenePlug::setNamesPlug().
  • GafferTractor: Fixed evaluation of ‘tag’ and ‘service’ plugs on Task nodes. Previously, these plugs were evaluated in the default context, which prevented one from using custom context variables (e.g. from Wedge node) to compute tags or service keys dynamically.
  • NodeEditor : Reduced layout flicker when switching between nodes.
  • Spreadsheet : Fixed bug that could result in editor windows being placed partially off screen.
  • ValuePlug : Fixed bug that could cause the wrong plug to be reported in ProcessExceptions.

API

  • ValuePlug
    • Improved interactive performance by not clearing the entire hash cache every time a plug is dirtied. Beware : this can reveal subtle bugs in DependencyNode::affects() implementations, causing hashes to be reused if a plug has not been dirtied appropriately. These bugs may previously have gone unnoticed but will now need fixing as a matter of urgency. The GAFFER_HASHCACHE_MODE environment variable may be set to “Legacy” to enable legacy behaviour in the interim, or to “Checked” to enable a slow mode which throws exceptions at the source of hash cache cache errors caused by bad affects() implementations.
    • Added clearHashCache() static method.
    • Added resetDefault() method.
  • ScenePlug :
    • Added existsPlug() accessor, and deprecated the argumentless overload of the exists() method.
    • Added childBoundsPlug(), childBounds() and childBoundsHash() methods.
  • ObjectProcessor : Added processedObjectComputeCachePolicy() virtual method. This should be overridden to choose an appropriate cache policy when computeProcessedObject() spawns TBB tasks.
  • SceneNode :
    • Deprecated hashOfTransformedChildBounds(). Use ScenePlug::childBoundsHash() instead.
    • Deprecated unionOfTransformedChildBounds(). Use ScenePlug::childBounds() instead.
  • IECorePreview::Renderer : Added optional message handler to renderer construction to allow output message streams to be re-directed if required (#3419).
  • InteractiveRender :
    • Changed base to Gaffer::ComputeNode (#3419).
    • Added messages plug containing the output of the node’s renderer output (#3419).
  • InteractiveRenderTest :
    • Scoped a UIThreadCallHandler for all test methods, available via self.uiThreadCallHandler.
    • Refactored _createInteractiveRender method to provide a default implementation that creates a render node with suitable error propagation.
  • Graphics : Renamed errorNotificationSmall icon to errorSmall.
  • NotificationMessageHandler : Constructor now accepts GafferUI.MessageWidget constructor kwargs to configure the widget.
  • PlugValueWidget : Added the capability to edit more than one plug at a time.
    • Added setPlugs() and getPlugs() methods. The previous setPlug() and getPlug() methods remain as a convenience.
    • Derived classes should now override setPlugs() rather than setPlug(), but backwards compatibility is preserved for classes which have not been converted yet.
    • Derived classes should now implement _updateFromPlugs() rather than _updateFromPlug(), but backwards compatibility is preserved for classes which have not been converted yet.
    • create() now optionally accepts a list of plugs in place of a single plug.
    • Updated the following subclasses to fully support multiple plugs :
      • NumericPlugValueWidget
      • CompoundNumericPlugValueWidget
      • ColorSwatchPlugValueWidget
      • ColorPlugValueWidget
      • StringPlugValueWidget
      • TweakPlugValueWidget
      • BoolPlugValueWidget
      • PresetsPlugValueWidget
  • SetAlgo : Added Python binding for affectsSetExpression().
  • Shader : Added affectsAttributes() protected method.
  • MessageWidget :
    • Added MessageSummaryWidget class to simplify the display of message counts in other UIs.
    • Added scrollToNextMessage() and scrollToPreviousMessage() methods.
  • MetadataAlgo : Added readOnlyReason, returning the outer-most GraphComponent that causes the specified component to be read-only.
  • EditScopeAlgo : Added prunedReadOnlyReason, transformEditReadOnlyReason and parameterEditReadOnlyReason to determine the outer-most GraphComponent causing and edit (or potential edit) to be read-only.
  • Window : Changed setPosition such that the whole window will remain on screen. Set forcePosition to False to disable this behaviour.
  • ImageGadget : Added support for GPU-based clipping, exposure, gamma and display transform.
  • TestCase : Added failureMessageLevel attribute to control which messages trigger test failures.
  • GafferSceneTest : Added exposure FloatPlug to TestLight.

Breaking Changes

  • Filter : Removed virtual sceneAffectsMatch() method. Derived classes should implement affects() instead.
  • FilterPlug : Replaced sceneAffectsMatch() method with a more general sceneAffects() method. This should be used to replace any calls to the old method.
  • PointsType : Changed base class from Deformer to ObjectProcessor.
  • Gaffer : Removed lazyImport() method.
  • GafferUI : Removed deprecated _qtImport() method. Use from Qt import instead.
  • Startup :
    • Removed several compatibility shims for loading files from Gaffer versions prior to 0.20.0.0. Either resave the file from version 0.57.0.0 or adopt the appropriate shim into your own configuration. The following are affected :
      • RemoveChannels nodes.
      • OpenColorIO nodes.
      • Certain ImageWriter settings from version 0.17.0.0 and prior.
      • Expression nodes from version 0.18.0.0 and prior.
      • Invalid Node.user plug inputs from version 0.18.0.0 and prior.
      • Reformat nodes from version 0.19.0.0 and prior.
      • Crop nodes from version 0.20.0.0 and prior.
      • TaskNodes from version 0.20.0.0 and prior.
    • Removed several compatibility shims for running old Python code without modification. Either update your code or adopt the appropriate shim into your own configuration.
      • Gaffer.MetadataAlgo and Gaffer.MonitorAlgo can no longer be accessed without namespace qualification.
      • GafferImage.ImageAlgo and GafferImage.BufferAlgo can no longer be accessed without namespace qualification.
      • GafferScene.SceneAlgo can no longer be accessed without namespace qualification.
      • GafferDispatch attributes can no longer be accessed via the Gaffer namespace.
      • Gaffer.UndoContext is no longer an alias for Gaffer.UndoScope.
      • GafferDispatchUI attributes can no longer be accessed via the GafferUI namespace.
      • GafferDispatch.ExecutableNode is no longer an alias for GafferDispatch.TaskNode.
      • GafferCortex.ParameterisedHolderExecutableNode is no longer an alias for GafferCortex.ParameterisedHolderTaskNode.
      • GafferCortex attributes can no longer be accessed via the Gaffer namespace.
      • GafferCortexUI attributes can no longer be accessed via the GafferUI namespace.
  • RecursiveChildIterator : Changed private member data. Source compatibility is maintained.
  • IECorePreview::Renderer : Changed signature for create and registerType to include optional message handler.
  • ObjectProcessor : Added a virtual method.
  • PlugValueWidget :
    • Renamed create() argument from plug to plugs. A single plug may still be passed.
    • Renamed constructor argument from plug to plugs. A single plug may still be passed. The same applies to the constructors for the following subclasses :
      • NumericPlugValueWidget
      • CompoundNumericPlugValueWidget
      • ColorSwatchPlugValueWidget
      • ColorPlugValueWidget
      • StringPlugValueWidget
      • TweakPlugValueWidget
      • BoolPlugValueWidget
      • PresetsPlugValueWidget
    • Removed connections to plugFlagsChangedSignal(). In the unlikely event that a derived class depends on plug flags, it must now manage the updates itself.
  • InteractiveRender :
    • Changed base class from Node to ComputeNode, added members.
    • state and renderer plugs can no longer be connected to compute node outputs due to dirty propagation constraints.
  • InteractiveRenderTest : Added interactiveRenderNodeClass member that must be populated with render node class by derived test cases (#3803).
  • MessageWidget : Removed deprecated appendMessage method, use messageHandler().handle() instead.
  • Shader : Added virtual method.
  • MetadataAlgo : readOnly( None ) will now raise an Exception instead of returning False.
  • FormatPlug :
    • Removed private member.
    • Changed signature of defaultValue() method.
  • ValuePlug : Added virtual method.

Build

  • Updated to GafferHQ/dependencies 1.6.0.