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 channelInterpretation plug controls the naming of channels loaded from multi-part files.

  • ImageWriter : Added support for writing multi-part OpenEXR files using a new layout plug. 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:viewName context 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 layerName string parameter, which can be used to customise the naming of channels in EXR outputs. Currently only supported for Arnold renders.

    • Added support for layerPerLightGroup boolean 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 activeRowIndex plug, which outputs the index of the currently active row.

  • InteractiveArnoldRender : Added support for an updateInteractively bool 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_rgb and ramp_float. The OSL ColorSpline and FloatSpline shaders 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 from updateInBackground() 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 using ignoreDataWindow.

  • Merge : Fixed rare failure to update when changing which channels existed on input.

  • CollectScenes : An empty rootNameVariable value 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 emit cameraChangedSignal() even when the camera was unchanged.

    • Fixed setCenterOfInterest() so that it doesn’t emit cameraChangedSignal() 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_visibility attributes to be inadvertently modified.

  • ArnoldShader/ArnoldLight : Fixed potential buffer overrun when loading color parameters with gaffer.plugType metadata.

  • Plug :

    • The removeOutputs() method now also removes any outputs from child plugs. This is consistent with the setInput() 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|UINT syntax will now issue a warning, and should be updated to use the generic syntax.

  • Constraint : Restricted targetVertex to positive integers.

  • ScriptContainer : Fixed typeName(), which was omitting the Gaffer:: 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() and computeViewNames() methods which must be implemented by derived classes (unless an input connection is made for out.viewNames).

  • ImagePlug :

    • Added viewNames plug for outputting the names of the views in an image.

    • Added ViewScope class for specifying the image:viewName context variable.

    • Added optional viewName arguments to the convenience accessors such as channelNames() and channelData().

  • ImageAlgo :

    • Added optional viewName arguments to image(), imageHash() and tiles().

    • Added viewIsValid() function.

    • Added sortedChannelNames() function.

  • PlugAlgo : Added optional value argument to canSetValueFromData().

  • RenderController :

    • Added Python bindings for optional callback argument to update() and updateMatchingPaths().

    • Added Python binding for updateInBackground().

    • Added pathForID(), pathsForIDs(), idForPath() and idsForPaths() methods. These make it possible to identify an object in the scene from a uint id AOV.

  • TestCase : Added assertNodeIsDocumented() method.

  • ImageTestCase : Added metadataBlacklist argument to assertImagesEqual().

  • MenuButton : Added setErrored() and getErrored() methods.

  • SceneView :

    • Added registerRenderer() and registeredRenderers() methods. These allow any suitable IECoreScenePreview::Renderer to be used to draw the scene.

    • Added renderer.name plug to control which renderer is used.

    • Added renderer.arnold plug to control Arnold render settings.

  • PlugLayout : Improved activator support. The layout:activator and layout:visibilityActivator metadata 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 CameraFlags enum, which is used in cameraChangedSignal() 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::signals library.

    • Removed usage of boost::signals::detail::unusable as a substitute for the void return type in the Signal bindings. Custom SlotCallers may now use a standard void return type.

    • The following signals now use a CatchingCombiner so 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() and forceMonitoring() 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:viewName context variable must now be set when evaluating plugs other than viewNamesPlug(). The gui app provides a default, but standalone scripts may need to be adjusted to specify image:viewName explicitly.

  • ImageWriter/SceneWriter : The overrides for TaskNode virtual methods are now protected rather than public. Use the TaskPlug API instead.

  • ShaderQuery : addQuery() now creates query and out plugs with numeric suffixes starting at 0 (rather than 1).

  • TweakPlug and TweaksPlug :

    • Moved to Gaffer module.

    • Removed methods for tweaking shader networks.

    • Backwards compatibility is provided when loading old .gfr files.

  • Arnold : Removed support for Arnold versions prior to 7.1.0.0.

  • CollectScenes : Changed behaviour when rootNameVariable is empty.

  • PopupWindow :

    • Removed sizeMode and closeOnLeave constructor arguments.

    • Removed visibility animation.

    • Removed drag&drop positioning.

  • ViewportGadget : Added a changes argument to CameraChangedSignal.

  • ImageReader : Changed the default interpretation of channel names in multi-part OpenEXR files. Set the channelInterpretation plug to Legacy to preserve the old behaviour.

  • ImageWriter : Multi-part OpenEXR files are now written by default. Set the layout plug to Single Part to 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. Use IECoreScene::ShaderNetworkAlgo::expandSplineParameters() instead.

  • ArnoldMeshLight : The ai:autobump_visibility attributes are no longer modified. Use a separate ArnoldAttributes node if necessary.

  • Spreadsheet :

    • Renamed activeRowNames plug to enabledRowNames. Backwards compatibility is provided when loading old .gfr files.

    • Renamed ui:spreadsheet:activeRowNamesConnection metadata to ui:spreadsheet:enabledRowNamesConnection.

  • Signals :

    • Replaced all usage of boost::signals with Gaffer::Signals. These are largely source-compatible, with the following changes :

      • Boost snake_case naming has been replaced with CamelCase.

      • Connection groups are not supported. Use connectFront() to connect in front of existing slots.

      • The Connection class has simple setBlocked()/getBlocked() accessors, rather than block()/unblock()/blocked() methods.

    • Removed the Gaffer/BlockedConnection.h header file. BlockedConnection can now be found in the Signals namespace provided by Gaffer/Signals.h.

    • Remove the Gaffer/CatchingSignalCombiner.h header file. CatchingSignalCombiner can now be found as Signals::CatchingCombiner in Gaffer/Signals.h.

    • Moved all Python classes into the Gaffer.Signals submodule.

    • Deprecated the default value for the scoped argument to Signal.connect(). Pass scoped = True to maintain the previous behaviour, or consider using an unscoped connection.

  • ViewportGadget : Removed RenderRequestSignal type. Use the identical UnarySignal instead.

  • Replaced all usage of boost::optional with std::optional.

  • Random : Renamed contextEntry plug to seedVariable. Old .gfr files 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 uses Monitor::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 .egg package.

    • TBB : Updated to version 2020.3.

    • USD : Updated to version 21.11.