0.54.0.0¶
This major release brings support for Arnold’s light blockers and adds a new UVInspector panel for viewing UVs and textures. It also brings a host of core UI changes, including a new look and improvements to layout management and node pinning. Additionally we’ve made advances under the hood, resulting in improved performance and lower memory usage in many cases. Read on for further details of these and numerous other enhancements and fixes…
Caution
This release brings substantial performance improvements in the generation
of ShaderAssignments, but at the expense of removing support for using the scene:path
context variable in shader networks. We recommend migrating such setups to use a
CustomAttributes node to generate a context-varying attribute which is then referenced
by the shader. This approach improves scene generation performance in Gaffer and
prevents the passing of large numbers of unique shader networks to the renderer.
Temporary backwards compatibility for old networks can be enabled by setting the
GAFFERSCENE_SHADERASSIGNMENT_CONTEXTCOMPATIBILITY
environment variable to 1
.
The same optimisation applies to the OSLObject node, with temporary backwards compatibility
being available separately by setting the GAFFEROSL_OSLOBJECT_CONTEXTCOMPATIBILITY
environment
variable to 1
.
Features¶
- Light filters : Extended support for Arnold’s light filters by adding blockers (#3020) :
- Added new ArnoldLightFilter node for creating blockers.
- Added attribute for linking blockers to lights to StandardAttributes node.
- UVInspector : Added new editor for viewing UVs and associated textures (#3273).
- SetVisualiser : Added node to allow visualisation of set membership in the Viewer (#3117).
Improvements¶
- Layouts :
- Improved tab management
- Added advanced pinning options, available from the context menu for the pinning icon (#3270)
- Editors can now follow the source node for the current scene selection.
- Editors can be linked so that an editor follows all pinning changes applied to another editor.
- OSLImage :
- OSLObject :
- Appleseed : Updated to Appleseed 2.0.5 (#3288).
- FilterResults : Improved performance. For certain FilterResults-heavy production graphs, we have seen 4-5x speedups in total scene generation time (#3174).
- Instancer/Parent/Seeds : Added a filter input to allow operation on multiple locations at once (#2917, #3176).
- TransformTools : Added precision mode enabled by holding
Shift
. Added basic snapping to increments by holdingControl
(#3277). - Viewer : Prioritised update of objects being manipulated, resulting in much more fluid update (#3144).
- Node Menu :
- SceneReader : Added support for USD files that reference Alembic archives.
- Text : Added support for unicode characters (#2999).
- PythonCommand : Improved performance (#3029).
- GraphEditor :
- Added support for arbitrary node annotations specified by metadata.
Use “annotation:
:text” to specify the text to render, and “annotation: :color” to specify an associated colour (#3028). - Added Ctrl-Drag functionality to deselect nodes (#3090).
- Made it show the root instead of removing the GraphEditor when the viewed Box is deleted (#3163).
- Added support for arbitrary node annotations specified by metadata.
Use “annotation:
- UIEditor : Added support for setting the icon for a node (#3204).
- Stats app :
- Added
annotatedScript
argument to allow the saving of the script with monitor annotations added to it (#3028). - Added
-cacheMemoryLimit
and-hashCacheSizeLimit
arguments for controlling cache limits (#3033). - Added support for render output profiling via
-scene
argument (#3053). - Added a
-contextSanitiser
argument, used to check for common context handling errors (#3060). - Added entries for SharedSceneInterface limits and usage (#3126).
- Added
- ArnoldTextureBake (#3026) : Added optional median filter.
- Hash cache (#3033) : Reduced memory usage and improved performance.
- GraphComponent : Reduced memory usage and improved script loading times (#3080).
- Shader : Improved performance of network generation (#3074).
- ShaderAssignment : Improved performance by removing support for varying shader networks by scene location (via the “scene:path” context variable) (#3074).
- AnimationEditor : Improved behaviour of the plug listing (#3106).
- Only selected nodes are shown, not their descendants.
- The ancestor node hierarchy is not shown redundantly.
- Improved performance.
- Test app :
- MeshTangents : Added support for additional computation modes (#3030).
- ImageWriter : Added DWA compression presets (#3153).
- Numeric Bookmarks : Added serialisation to preserve numeric bookmarks across sessions (#3157).
- SetExpressions : Added support for wildcard characters in set names (#3172).
- Lights :
- OpenGLAttributes : Added new “Light Visualiser” section, with control over visualisation scale and maximum texture resolution (#3219).
- UI : Improved stylesheet (#3193, #3229, #3246, #3249).
- SystemCommand : Added
shell
plug, to determine whether or not the supplied command is interpreted as a shell command or executed directly (#3230). - ArnoldShader : Added metadata for new shader parameters introduced in Arnold 5.3 (#3243).
Fixes¶
- Dispatcher (#3024) :
- Added support for Switch nodes. The dedicated TaskSwitch node is still available, but will be removed in a future release.
- Added support for ContextProcessor nodes such as ContextVariables and TimeWarp. The dedicated TaskContextVariables node is still available, but will be removed in a future release.
- Light linking (#3265) :
- Fixed crash when hiding a linked light during an interactive Arnold render.
- Fixed crash when changing parameters on a linked light during an interactive Arnold render.
- Fixed bug which caused light links to be output unnecessarily if non-lights
where inadvertently added to the
defaultLights
set.
- TransformTool : Fixed crash when using the tool while a Catalogue node saves an image in the background (#3196).
- GraphEditor (#3028) : Added bookmark annotations for Dots and other auxiliary nodes.
- ArnoldTextureBake (#3026) :
- Connected external dispatcher settings to internal render task.
- Connected preTasks plug to internal tasks.
- Fixed leakage of internal context variables.
- Viewer :
- Fixed keyboard modifier handling for object selection. Previously, holding down any modifier key whilst drag selecting or clicking an object in the Viewer would modify the current selection. This behaviour was only intended to be triggered by the Shift key (#3095).
- Fixed bug that prevented image updates after a computation error had occurred (#3273).
- Scene : Fixed context handling bugs in Transform, SceneWriter, SceneAlgo, Set, Isolate and Prune. This improves performance on some complex scenes (#3060).
- Offset : Fixed context handling bug (#3073).
- AnimationEditor (#3106) :
- Fixed visibility glitch in timeline hover indicator. It wasn’t being hidden when the mouse left the editor.
- Fixed bug when deselecting a curve - the plug listing selection was not being updated to reflect the change.
- PythonCommand :
- Fixed widget signal/slot lifetime issues (#3179).
- Using ScopedConnections is no longer needed as
Widget
now derives fromTrackable
. - ScopedConnections can still be used when wanting to replace connections on the fly.
- Using ScopedConnections is no longer needed as
- NodeMenu : Fixed Delight/Light/DistantLight menu item (#3216).
- CropWindowTool :
- Dispatch app : Fixed configuration bug which caused GafferUI to be loaded unnecessarily.
This could cause a
QXcbConnection Could not connect to display
when run on a machine without an X server (#3237). - Execute app : Stopped current frame of saved script leaking into the context for
TaskNode::executeSequence()
(#3262). - Stats app : Fixed VTuneMonitor scoping (#3196).
- Monitor : Fixed thread safety and scoping of monitors. Monitors now only see processes launched on the thread they were scoped on, and parallel tasks that are spawned by those processes (#3196).
- Reference : Fixed problems that meant that metadata was lost when promoting a plug from a reference (#3258).
- GraphComponent : Fixed crashes caused by passing
None
as a child argument from Python (#3276, #3279). - Expression : Fixed bug whereby expressions could break if nodes were renamed during copy/paste (#3283).
- CustomAttributes : Fixed performance regression caused by addition of the
extraAttributes
plug (#3280). - Warp : Fixed bug which prevented a derived class from using a single Engine for the whole
image. It is no longer necessary to append
tileOrigin
inengineHash()
(#3299).
Documentation¶
- Added “Anatomy of a Camera” which gives an overview of Gaffer’s camera model, the terminology, the camera data in the scene, and how the data flows through the graph (#3050).
- Added a “Camera” section to “Working with Scenes” which covers usage and task information about the Camera node, manipulating camera objects, the CameraTweaks node, render overrides, and demos of a spherical and anamorphic camera setup (#3050).
- Added “Light Linking” which shows how light linking is set up and runs through an example scenario that would necessitate light links (#3114).
- Added mechanism for providing example node networks in the help menu. Examples can optionally be associated with certain node types. The Cog menu in the Node Editor lists any applicable Examples for the node type being edited (#3108).
- Added general improvements to readability and appearance in the stylesheet. Most notably, this makes the headings consistent, and the spacing between elements uniform (#3149).
- Added bootstrap scrollspy to improve signposting and to provide a mini-nav for articles (#3159).
- Moved tutorials to appropriate sections (#3210).
- Fixed broken links (#3210).
API¶
- ComputeNode : Added
hashCachePolicy()
andcomputeCachePolicy()
methods which can be overridden to provide additional control over caching. Default behaviour is unchanged. The newStandard
policy can be used to prevent multiple threads computing the same result in parallel, which is of particular relevance to expensive computes that load external resources. Computes which spawn TBB tasks must use theTaskCollaboration
orTaskIsolation
policies (#3174). - ThreadState : Added new class to consolidate tracking of current context, process and
monitors on a per-thread basis. When spawning tasks from a compute, it is your responsibility
to transfer thread state onto the threads executing the tasks, whereas
before only context needed to be transferred. New constructors for the various
Context::EditableScope
classes make this relatively painless (#3196). - ProcessException : Added new class used to wrap exceptions thrown during computation. This provides information about the plug and context where the exception was thrown (#3223).
- TextWidget/MultiLineTextWidget : Added support for unicode characters. In this
case the
getText()
method will return a UTF8 encoded string (#2999). - ContextSanitisers : Added new ContextSanitiser classes to GafferSceneTest and GafferImageTest. These are Monitors which warn about common context handling mistakes (#3060, #3073).
- TaskNode (#3024, #3025) :
- Simplified implementation requirements for
preTasks()
andpostTasks()
methods. It is now sufficient to constructTasks
directly from the input plugs, with no requirement to find their source and check for a TaskNode. - Added missing bindings for
Task( TaskPlug )
andTask::plug()
.
- Simplified implementation requirements for
- ContextProcessor (#3024) :
- Added
inPlugContext()
method. - Added support for working with
Plugs
rather than onlyValuePlugs
.
- Added
- AnnotationsGadget (#3028) : Added new gadget for rendering annotations for GraphGadgets.
- MonitorAlgo (#3028) : Added
annotate()
methods for turning Monitor statistics into GraphEditor annotations. - ValuePlug :
- Context (#3060) : Added
EditableScope::context()
method. - SceneTestCase (#3060) :
- Added a ContextSanitiser that is active for the duration of the tests.
- Improved assert methods.
- GraphComponent : Added protected
parentChanged()
virtual method (#3080). - ImagePlug : Added convenience methods for evaluating global image properties (#3073).
- GraphComponentPath : Added property for accessing the GraphComponent (#3106).
- LightFilter : Added LightFilter class used as base for renderer-specific implementations (#3020).
- NameValuePlug : Introduced new plug type for associating a name with a value (#3161).
- SceneAlgo :
history()
now returns a nullptr when called for empty scenes instead of precipitating a segfault (#3207). - ExtensionAlgo : Added mechanism to export Boxes as Gaffer extensions via
exportExtension()
(#3158). Gaffer extensions each define a new node type and are automatically integrated into the node menu. - StringPlugValueWidget : Added support for “stringPlugValueWidget:placeholderText” metadata (#3218).
- Widget : Improved interaction with stylesheet. Widgets now provide “gafferClass” and “gafferClasses” Qt properties which allows stylesheets more precise control (#3229).
- MetadataWidget : Added new class and derived classes to allow editing of metadata values via the UI (#3143).
- UIEditor : Added support for registering custom PlugValueWidgets and associated metadata (#3143).
- TestRunner : Added new class with features for detecting performance regressions. Use the
PerformanceTestMethod
andPerformanceScope
nested classes to annotate unit tests which test performance (#3127, (#3265). - Plug : Deprecated
Cacheable
flag. OverridecomputeCachePolicy()
instead (#3174). - Reference : Added
hasMetadataEdit()
method (#3258). - ImageGadget : Added
set/getLabelsVisible()
accessors (#3273). - ImageView : Added
createDisplayTransform()
static method (#3273). - UVView : Added new View subclass for viewing UVs and textures (#3273).
- SourceSet : Added new Set subclass whose contents automatically track the source node for the current scene selection (#3270).
- NodeSetEditor (#3270) :
- Added
setNodeSetDriver()
/getNodeSetDriver()
methods to link editors. - Added
drivenNodeSets()
method to query linked editors. - Added
nodeSetDriverChangedSignal()
anddrivenNodeSetsChangedSignal()
signals to allow editor links to be observed. - Added
registerNodeSetDriverMode()
to allow custom link modes to be added.
- Added
Build¶
- Arnold : Updated to version 5.3.1.0.
- Appleseed : Updated to version 2.0.5-beta.
- OpenEXR : Updated to version 2.3.0.
- OpenVDB : Updated to version 6.0.0.
- Blosc : Updated to version 1.15.1.
- PySide : Updated to version corresponding with Maya 2018 Update 6.
- Cortex : Updated to version 10.0.0-a59.
- TBB : Updated to version 2018 Update 5.
- Alembic : Added python bindings.
- Improved debugging support (#3070) :
- Added support for using ASAN option with GCC.
- Enabled TBB debugging features in DEBUG builds.
- Added
-fno-omit-frame-pointer
compiler flag for RELWITHDEBINFO builds.
- Fixed warnings when building with XCode 10.2 (#3094).
- Fixed problem where some Arnold modules were installed when ARNOLD_ROOT was not specified (#3101).
- Made GafferCortex an optional component at build time (#3168).
- Reduced the number of errors thrown during documentation build (#3212).
Breaking Changes¶
OSLObject/OSLImage :
ShaderAssignment : Removed support for using the “scene:path” context variable in shader networks. Temporary backwards compatibility can be enabled by setting the
GAFFERSCENE_SHADERASSIGNMENT_CONTEXTCOMPATIBILITY
environment variable to1
(#3074).OSLObject : Removed support for using the “scene:path” context variable in shader networks. Temporary backwards compatibility can be enabled by setting the
GAFFEROSL_OSLOBJECT_CONTEXTCOMPATIBILITY
environment variable to1
(#3074).GraphComponent :
Added
parentChanged()
virtual method (#3080).Caution
Experience in the Gaffer codebase suggests that
parentChanged()
was a relatively common method name, which may now be inadvertently overriding the new virtual method. Clang will warn for these cases if-Wall
is used, but GCC requires-Woverloaded-virtual
to be used.
TaskNode::Task (#3024, #3025) :
- Removed
hash()
method and associated member data. - Removed deprecated
node()
method. - Removed less-than operator.
- The equality operator now compares plug and context instead of hash.
- Removed
ArrayPlug : Inputs are now required to be ArrayPlugs too (#3116).
BackdropNodeGadget/StandardNodeGadget (#3028) : Removed private member variables.
SceneTestCase (#3060) : Changed signatures for the following functions :
assertPathsEqual()
assertScenesEqual()
assertPathHashesEqual()
assertPathHashesNotEqual()
assertSceneHashesEqual()
assertSceneHashesNotEqual()
Shader : Changed base class to ComputeNode (#3074).
TweakPlug : Added compulsory ValuePlug argument to constructor used for serialisation (#3084).
AnimationEditor : Removed
connectedCurvePlug()
method (#3106).ParallelAlgo : Replaced
registerUIThreadCallHandler()
withpush/popUIThreadCallHandler()
(#3101).Renderer API : Added
lightBlocker()
virtual method (#3020).CompoundDataPlug : Removed MemberPlug and
addMember()
as well asaddOptionalMember()
. Use NameValuePlug instead (#3161).TransformTool : Added private members (ABI change only - source compatibility is maintained) (#3144).
RenderController : Added argument to
updateInBackground()
(ABI change only, source compatibility is maintained) (#3144).SceneGadget : Added new private member (ABI change only, source compatibility is maintained) (#3144).
LightVisualiser : The signature for
visualise()
now also includes the attributes (#3180).StandardLightVisualiser :
LightFilterVisualiser :
visualise()
now takesattributes
as additional argument (#3260).BranchCreator : Added
affectsBranch*()
andconstantBranchSetNames()
virtual methods (#3176).EvaluateLightLinks : Removed. This was a node used internally to translate light links to renderers, work that is now done in RendererAlgo (#3265).
Context : Changed base class for Scope/EditableScope, and removed private member from Scope. Source compatibility is preserved (#3196).
Process : Changed base class, and removed optional
currentContext
argument from protected constructor (#3196).Monitor (#3196) :
- Changed base class to
IECore::RefCounted
. - Removed
setActive()/getActive()
methods. Use the Scope class instead.
- Changed base class to
ComputeNode : Added virtual methods (#3174).
ValuePlug : Removed
getObjectValueIfCached()
method (#3174).TypedObjectPlug : Removed
getValueIfCached()
method (#3174).GafferCortex : Removed GafferCortex module from standard builds (#3253).
Style : Changed colour arguments to
renderLine()
andrenderText()
from Color3f to Color4f (#3273).