# 0.61.0.0

## Features

• Arnold : Added support for Arnold 7, including multiple simultaneous interactive renders. This is in addition to continuing support for Arnold 6.2 - the appropriate version of GafferArnold is chosen automatically on startup based on the \$ARNOLD_ROOT environment variable.

• GraphEditor :

• Added new “Focus Node” concept. Clicking on the top right of a node tags it as the focus node, and editors and viewers can be set to follow the focus node. This is useful when you have several viewers that you want to view the same node, but you don’t want them to follow selection.

• Nodes and connections which don’t contribute to computing the Focus Node are now dimmed. This helps see what part of the graph is active, taking into account the current context.

• Image Viewer : Added Luminance option to the channel selection menu.

• Animation :

• Added new “Cubic” and “Bezier” interpolation modes which will smoothly interpolate between key values. The shape of the interpolated curves can be controlled by adjusting the slope and scale of key tangents, which are displayed and can be interactively manipulated in the Animation Editor.

• Added new user interface panel in the Animation Editor with controls for key value, time, interpolation mode and tangent slope, scale and tie mode.

## Improvements

• HierarchyView : Moved processing to a background thread, so that displaying slow scenes does not cause the HierarchyView to lock up the UI.

• GraphEditor :

• Improved drawing performance for large node graphs. Gains of about 40% are typical, with much greater gains when looking at a small region of a large graph or performing selection tests (for example when hovering over something or dragging a connection).

• Added support for middle-drag panning while dragging nodes and connections using G.

• Made connections slightly more visible when zoomed out.

• Cancellation : Improved responsiveness of cancellation of tasks waiting on results from another thread.

• ImageReader : Channels from EXR subimages named rgb, rgba or depth (either uppercase or lowercase) are now loaded into Gaffer’s primary image layer.

• PathFilter : Removed scene:filter:inputScene and scene:path variables from the context used to evaluate the paths plug. This improves performance in some scenarios, and prevents the creation of invalid filters where the paths themselves depend on the current scene location.

• Switch : Removed variables such as scene:path and image:channelName from the context used to evaluate the enabled plug. This improves performance in some scenarios, and prevents the creation of invalid switches.

• NodeEditor : Added option in node editor context menu to set interpolation of an animated value.

• Animation : Added new ConstantNext interpolation mode, evaluates to the value of the next key for all times greater than the time of the key.

• USD : Added support for loading constant primvars from non-geometric prims. These are represented in Gaffer as attributes with a render: prefix.

• Arnold : Added support for render: prefixed attributes. For example, a Color3f attribute called render:displayColor will be readable as displayColor from a user_data_rgb shader.

## Fixes

• PathListingWidget :

• Fixed subtle bugs in the underlying Qt model, although they haven’t been observed to cause problems in practice.

• Fixed potential hangs when displaying Paths which launch threaded computes.

• Animation :

• Fixed bug in Key.setType(). Previously it modified the value instead of the type.

• Fixed crash when dragging multiple keys around in editor.

• Fixed bug which resulted in preview key being incorrectly drawn at the origin.

• Fixed bug that cleared key selection when selecting multiple curves via path listing or gadget.

• Fixed bug when pressing f to frame viewport which resulted in a blank background in certain cases (#4410).

• Inserting a new key in editor (Hold “Ctrl” and left click on curve) is now undone/redone as a distinct step.

• Fixed bug when selecting curve for first time via gadget, keys appear, then disappear (#4443)

• Fixed bug where curves would not become visible in gadget until the path listing expansion was changed (#4408)

• ParallelAlgo : Fixed deadlock in callOnUIThread().

• NameSwitch : Fixed context management bug that allowed variables such as scene:path to leak into the context used to evaluate the selector plug.

• GafferTest.TestCase : Fixed assertNodesConstructWithDefaultValues() to recurse through all plugs.

• NodeBinding : Fixed bug that could cause type queries to fail if types derived from Switch or ContextProcessor were wrapped for subclassing in Python.

• Arnold : Fixed bug that prevented the type of a user: attribute from being changed during an interactive render.

## API

• ScriptNode : Added focus node API.

• GraphComponent : Inlined children() method, yielding 20-40% improvements in various child iteration benchmarks.

• Added layerMask() and renderBound() virtual functions.

• Added BackMidBack render layer.

• Added gadgetsAt() overload which returns the gadgets rather than taking an output parameter by reference.

• Added gadgetsAt() overload taking a raster space region (rather than position) and an optional layer filter.

• PathListingWidget :

• setSortable() and getSortable() are no longer deprecated. The underlying bug that made them unreliable has been fixed.

• Path processing has been moved to a background thread. The API remains unchanged, but updates to the displayed data are made asynchronously with respect to calls to methods of the PathListingWidget.

• GafferTest.TestCase : Added assertFloat32Equal() function, raises AssertionError if two values do not compare equal after conversion to single precision float.

• GafferUITest.TestCase : Unexpected Qt messages are now reported as test failures.

• Context : Modified ChangedSignal to use a CatchingSignalCombiner, which prevents exceptions from one slot preventing the execution of another.

• Menu : callable passed as the “checkBox” parameter of a menu item can now return None.

• Path :

• Added optional canceller argument to isValid(), isLeaf(), propertyNames(), property() and children() methods.

• Added cancellationSubject() virtual function that must be implemented by any paths which access the node graph.

• ScenePath : Added support for cancellation of calls to isValid() and children().

• FileSystemPath : Added support for cancellation of calls to children() and property().

• PathFilter : Added support for cancellation of calls to filter().

• Animation :

• curve.addKey() and key.setTime() now return active clashing key

• curve.addKey() now has optional remove parameter that defaults to true, if false active clashing key is not removed and becomes inactive.

• key.setTime() will not remove active clashing key, instead it becomes become inactive. inactive key at old time becomes active.

• Added curve.removeInactiveKeys() function, removes all the inactive keys parented to a curve.

• Added key.isActive() function, returns true if key is parented to curve and is the active key at its current time.

• Added curve.insertKey() functions, insert key at specified time with optionally specified value.

• Added curve.keyTimeChangedSignal() function, returns a signal that is called when a key’s time has changed

• Added curve.keyValueChangedSignal() function, returns a signal that is called when a key’s value has changed

• Added curve.keyInterpolationChangedSignal() function, returns a signal that is called when a key’s interpolation has changed

• Added new api for cubic interpolation modes, key tangents and tie mode (see header Animation.h for full details)

• Added selectedKeys() function, returns current set of selected keys.

• Added onTimeAxis() function, returns true if specified line is over the time axis of the gadget.

• Added onValueAxis() function, returns true if specified line is over the value axis of the gadget.

## Breaking Changes

• ImageReader : Channels from EXR subimages named rgb, rgba or depth (either uppercase or lowercase) are now loaded into Gaffer’s primary image layer.

• FilteredChildIterator/FilteredRecursiveChildIterator : Removed all namespace-level typedefs, which were deprecated in Gaffer 0.59.0.0. Use the class-level typedefs instead, for example Plug::Iterator in place of PlugIterator.

• Moved render() and renderRequestSignal() to ViewportGadget.

• Removed select() method.

• Replaced hasLayer() virtual function with layerMask().

• Added renderBound() virtual function.

• Renamed doRenderLayer() to renderLayer(), and added new renderReason argument, which can be used to check for selection renders without needing to query Selector::currentSelector().

• ViewportGadget : Deprecated old gadgetsAt() signature. Please use the new form instead.

• ArnoldOptions : Removed support for the ai:ignore_motion_blur option. Turn off the sampleMotion option using a StandardOptions node instead.

• Fullscreen hotkey is now F11 instead of .

• Removed support for linking editors (following the focus node replaces most practical uses of this feature).

• Animation :

• Renamed Type enum to Interpolation.

• Interpolation of a key now affects span to next instead of previous key.

• Renamed Key’s set/getType() accessors to set/getInterpolation().

• Renamed Step interpolation mode to Constant.

• Removed customised Key equality operators, the default operators compare on object identity.

• Path : Added canceller arguments to virtual methods. Note that Python subclasses can be made compatible with both Gaffer 0.60 and 0.61 simply by adding a canceller = None argument.

• PathFilter : Added canceller argument to doFilter() method. Note that Python subclasses can be made compatible with both Gaffer 0.60 and 0.61 simply by adding a canceller = None argument.

• CopyAttributes : Removed backwards compatibility for accessing input and source scenes as in[0] and in[1] respectively. Use in and source` instead.

## Build

• Updated to GafferHQ/dependencies 4.0.0 :

• OpenVDB : Updated to version 8.1.0.

• TBB : Updated to version 2020.2.

• Qt : Updated to version 5.15.2.

• PySide : Updated to version 5.15.2.

• Cortex : Updated to version 10.3.0.0.