1.0.0.0
Note
This release requires Arnold version 7.1.0.0 or newer.
Features
Viewer :
Added optional raytraced rendering, to provide high quality preview of lighting and shading. Initially only Arnold is supported, but other renderers will be added in future.
Added FPS counter option to Gadget menu.
ImageReader : Improved support for multi-part OpenEXR files, including fixes for reading many non-standard-conforming files from 3rd party software (#4559). The new
channelInterpretationplug controls the naming of channels loaded from multi-part files.ImageWriter : Added support for writing multi-part OpenEXR files using a new
layoutplug. This includes presets for standard conforming single-part and multi-part files, and several presets that match Nuke’s behaviour.ImageNode : Added support for multi-view images.
ImageNodes can now output multiple “views”. Views are effectively independent images, and may have separate data windows, formats, channels and metadata, and even be mixtures of deep and flat images.
The multi-view feature was originally intended for storing stereo renders, but may also may used for general processing where it is convenient to group multiple images into one stream.
A new
image:viewNamecontext variable specifies which view is currently being processed. This can be used to process each view with different settings, for instance via an Expression or Spreadsheet.Multi-view images can be read from and written to EXR files via the ImageReader and ImageWriter nodes.
Added new nodes specifically for working with multi-view images :
CreateViews : For combining single view images into a multi-view image.
SelectView : For choosing one view from a multi-view image as a single view image.
CopyViews : For combining views from multi-view sources.
DeleteViews : For removing views from multi-view images.
Anaglyph : For viewing stereo images in a format appropriate for red-blue anaglyph glasses.
A new dropdown menu in the Viewer chooses which view is being displayed.
ContextQuery : Added node to access a context variable value directly without needing to use an expression.
Improvements
Viewer : Improved accuracy of OpenColorIO display transforms when applied using the GPU.
Outputs :
Added support for
layerNamestring parameter, which can be used to customise the naming of channels in EXR outputs. Currently only supported for Arnold renders.Added support for
layerPerLightGroupboolean parameter, which automatically splits the outputs into separate layers, one for each light group.
USD :
Added support for purpose-based material assignments in SceneReader and SceneWriter. To render or author such assignments, a ShuffleAttributes node must currently be used to shuffle to and from the standard shader attributes.
Added basic support for loading UsdLux lights. The data is available in Gaffer, but needs manual conversion to meet the requirements of a specific renderer.
ImageReader/ImageWriter : Added support for JPEG 2000 (
.jp2) images.Spreadsheet : Added
activeRowIndexplug, which outputs the index of the currently active row.InteractiveArnoldRender : Added support for an
updateInteractivelybool parameter for render outputs. This can be used to request more frequent updates for AOVs other than the beauty image.ChannelPlugValueWidget : Improved the ordering of channel names presented in the menu.
PresetsPlugValueWidget : The children of compound plugs are now shown when in “Custom” mode.
LightEditor/SceneViewInspector : Improved performance when viewing complex scenes, by improving cache usage during history queries.
Node menu : Removed unsupported Arnold shaders
ramp_rgbandramp_float. The OSLColorSplineandFloatSplineshaders should be used instead.Image Channel Selectors : Channel names are now shown in “natural order”. This means a numerical part of the name is compared numerically, instead of alphabetically (so “channel13” comes after “channel2”).
Fixes
Seeds : Fixed point distribution generated on MacOS to match the point distribution generated on Linux.
RenderController : Fixed duplicate
callback( Completed )calls fromupdateInBackground()when priority paths are specified.PresetsPlugValueWidget/FormatPlugValueWidget : Fixed handling of evaluation errors (now turns red instead of failing to draw).
ImageTestCase : Fixed bug in
assertImagesEqual()where bad pixel data could go undetected when usingignoreDataWindow.Merge : Fixed rare failure to update when changing which channels existed on input.
CollectScenes : An empty
rootNameVariablevalue no longer causes the creation of a context variable named"". Instead, no context variable is created (but the scenes are still collected).TransformQuery : Removed unnecessary elements from hash.
ViewportGadget :
Fixed bug which could cause
setCamera()to emitcameraChangedSignal()even when the camera was unchanged.Fixed
setCenterOfInterest()so that it doesn’t emitcameraChangedSignal()if the center of interest is unchanged.Added GIL release in
setViewport()Python bindings.
AnimationEditor : Fixed glitches in the drawing of tangent handles during drags.
ArnoldMeshLight : Fixed bug which caused
ai:autobump_visibilityattributes to be inadvertently modified.ArnoldShader/ArnoldLight : Fixed potential buffer overrun when loading color parameters with
gaffer.plugTypemetadata.Plug :
The
removeOutputs()method now also removes any outputs from child plugs. This is consistent with thesetInput()method, which has always managed child plug inputs.Fixed bug which meant that child output connections were not removed when a plug was removed from a node.
Expression : Fixed error when updating an expression which was previously connected to a deleted spreadsheet row (#4614).
ArnoldRender : Fixed rendering of single-channel AOVs specified using Gaffer’s generic
float|int|uint <name>syntax. Outputs specified using Arnold’s<name> FLOAT|INT|UINTsyntax will now issue a warning, and should be updated to use the generic syntax.Constraint : Restricted
targetVertexto positive integers.ScriptContainer : Fixed
typeName(), which was omitting theGaffer::prefix.Text : Fixed wrapping bug that caused blank lines to be inserted if a single word was too long for the line.
SceneReader : Fixed loading of USD asset paths containing
<UDIM>tokens.
API
ImageNode : Added virtual
hashViewNames()andcomputeViewNames()methods which must be implemented by derived classes (unless an input connection is made forout.viewNames).ImagePlug :
Added
viewNamesplug for outputting the names of the views in an image.Added ViewScope class for specifying the
image:viewNamecontext variable.Added optional
viewNamearguments to the convenience accessors such aschannelNames()andchannelData().
ImageAlgo :
Added optional
viewNamearguments toimage(),imageHash()andtiles().Added
viewIsValid()function.Added
sortedChannelNames()function.
PlugAlgo : Added optional
valueargument tocanSetValueFromData().RenderController :
Added Python bindings for optional
callbackargument toupdate()andupdateMatchingPaths().Added Python binding for
updateInBackground().Added
pathForID(),pathsForIDs(),idForPath()andidsForPaths()methods. These make it possible to identify an object in the scene from auint idAOV.
TestCase : Added
assertNodeIsDocumented()method.ImageTestCase : Added
metadataBlacklistargument toassertImagesEqual().MenuButton : Added
setErrored()andgetErrored()methods.SceneView :
Added
registerRenderer()andregisteredRenderers()methods. These allow any suitableIECoreScenePreview::Rendererto be used to draw the scene.Added
renderer.nameplug to control which renderer is used.Added
renderer.arnoldplug to control Arnold render settings.
PlugLayout : Improved activator support. The
layout:activatorandlayout:visibilityActivatormetadata may now take boolean values to control activation directly. This is useful when an activator only applies to one plug, or it applies to several but depends on properties of each plug. String values are treated as before, referring to a predefined activator.ViewportGadget : Added a
CameraFlagsenum, which is used incameraChangedSignal()to specify what aspects of the camera have changed.NodeAlgo : Added support for presets on compound plugs. If all child plugs have a particular preset then the parent plug is considered to have it too, and calling
applyPreset( parent, preset )will apply it to all the children.Signals :
Added a new Signals namespace with Signal, Connection, ScopedConnection and Trackable classes. This provides significant performance and memory usage improvements over the old
boost::signalslibrary.Removed usage of
boost::signals::detail::unusableas a substitute for thevoidreturn type in the Signal bindings. Custom SlotCallers may now use a standardvoidreturn type.The following signals now use a
CatchingCombinerso that exceptions in one slot will not interfere with calls to other slots :ApplicationRoot : ClipboardSignal.
GraphComponent : UnarySignal and BinarySignal.
Gadget : VisibilityChangedSignal, EnterLeaveSignal and IdleSignal.
Node : UnaryPlugSignal, BinaryPlugSignal, ErrorSignal.
ScriptNode : ActionSignal, UndoAddedSignal.
ViewportGadget : UnarySignal.
The following signals now handle exceptions thrown from C++ slots as well as Python slots :
Gadget : ButtonSignal, DragBeginSignal, DragDropSignal, KeySignal.
The following signals no longer suppress exceptions thrown from Python slots :
StandardSet : MemberAcceptanceSignal.
Monitor : Subclasses may now override
mightForceMonitoring()andforceMonitoring()in order to ensure the monitored processes always run, instead of being skipped when they are cached.ValuePlug : Added
hashCacheTotalUsage()function.ScriptContainer : Added Python binding.
Version.h : Added
versionString()function.
Breaking Changes
ImagePlug : The
image:viewNamecontext variable must now be set when evaluating plugs other thanviewNamesPlug(). Theguiapp provides a default, but standalone scripts may need to be adjusted to specifyimage:viewNameexplicitly.ImageWriter/SceneWriter : The overrides for TaskNode virtual methods are now
protectedrather thanpublic. Use theTaskPlugAPI instead.ShaderQuery :
addQuery()now createsqueryandoutplugs with numeric suffixes starting at 0 (rather than 1).TweakPlug and TweaksPlug :
Moved to
Gaffermodule.Removed methods for tweaking shader networks.
Backwards compatibility is provided when loading old
.gfrfiles.
Arnold : Removed support for Arnold versions prior to 7.1.0.0.
CollectScenes : Changed behaviour when
rootNameVariableis empty.PopupWindow :
Removed
sizeModeandcloseOnLeaveconstructor arguments.Removed visibility animation.
Removed drag&drop positioning.
ViewportGadget : Added a
changesargument to CameraChangedSignal.ImageReader : Changed the default interpretation of channel names in multi-part OpenEXR files. Set the
channelInterpretationplug toLegacyto preserve the old behaviour.ImageWriter : Multi-part OpenEXR files are now written by default. Set the
layoutplug toSingle Partto write a single-part file instead.SubTree : Removed the
/root location from generated sets, because root membership is unsupported elsewhere in Gaffer.OSLShader : Removed
prepareSplineCVsForOSL()method. UseIECoreScene::ShaderNetworkAlgo::expandSplineParameters()instead.ArnoldMeshLight : The
ai:autobump_visibilityattributes are no longer modified. Use a separate ArnoldAttributes node if necessary.Spreadsheet :
Renamed
activeRowNamesplug toenabledRowNames. Backwards compatibility is provided when loading old.gfrfiles.Renamed
ui:spreadsheet:activeRowNamesConnectionmetadata toui:spreadsheet:enabledRowNamesConnection.
Signals :
Replaced all usage of
boost::signalswithGaffer::Signals. These are largely source-compatible, with the following changes :Boost
snake_casenaming has been replaced withCamelCase.Connection groups are not supported. Use
connectFront()to connect in front of existing slots.The Connection class has simple
setBlocked()/getBlocked()accessors, rather thanblock()/unblock()/blocked()methods.
Removed the
Gaffer/BlockedConnection.hheader file. BlockedConnection can now be found in the Signals namespace provided byGaffer/Signals.h.Remove the
Gaffer/CatchingSignalCombiner.hheader file. CatchingSignalCombiner can now be found asSignals::CatchingCombinerinGaffer/Signals.h.Moved all Python classes into the
Gaffer.Signalssubmodule.Deprecated the default value for the
scopedargument toSignal.connect(). Passscoped = Trueto maintain the previous behaviour, or consider using an unscoped connection.
ViewportGadget : Removed
RenderRequestSignaltype. Use the identicalUnarySignalinstead.Replaced all usage of
boost::optionalwithstd::optional.Random : Renamed
contextEntryplug toseedVariable. Old.gfrfiles will be converted automatically on loading.SceneAlgo : Removed
historyIDContextName()function.history()no longer uses an ID in the context to ensure fresh evaluations, it instead usesMonitor::forceMonitoring()to temporarily disable caching.
Build
Moved minimum required C++ standard to C++17.
Updated to GCC 9.3.1 for Linux builds.
Updated to GafferHQ/dependencies 5.0.0 :
Alembic : Updated to version 1.8.3.
Blosc : Updated to 1.21.1.
Boost : Updated to version 1.76.0.
CMark : Updated to 0.29.0.
Cortex : Updated to 10.4.0.0.
CMark : Updated to 0.29.0.
HDF5 : Updated to 1.12.0.
LibFFI : Updated to 3.4.2.
LibPNG : Updated to 1.6.37.
LLVM : Updated to version 11.1.0.
OpenColorIO : Updated to version 2.1.1.
OpenJPEG : Added version 2.4.0.
OpenImageIO : Updated to version 2.3.11.0.
OpenShadingLanguage : Updated to version 1.11.17.0.
OpenSSL : Updated to 1.1.1i.
OpenVDB : Updated to version 9.1.0, and added nanovdb.
PySide : Updated to 5.15.4.
Python : Updated to 3.8.13 (MacOS only).
Qt : Updated to 5.15.4.
Subprocess32 : Now packaged as a regular module rather than as a
.eggpackage.TBB : Updated to version 2020.3.
USD : Updated to version 21.11.