0.60.0.0¶
Note
This version is built against Arnold 6.2.0.1, and is not compatible with earlier Arnold versions.
Features¶
- Spreadsheet : Added drag and drop reordering of rows.
- InteractiveRender : Added support for motion blur.
- Profiling : Added “Tools/Profiling” menu to annotate nodes with performance metrics.
Improvements¶
- Serialisation : Reduced script save times by around 50%.
- Cancellation : Improved responsiveness by supporting cancellation of long computes in the following nodes :- SceneReader
- LevelSetOffset
- MeshToLevelSet
- Plane
- Sphere
- DeleteFaces
- MeshDistortion
- MeshTangents
- MeshType
- PrimitiveSampler
- ResamplePrimitiveVariables
- ReverseWinding
- Seeds
 
- Expression :- Improved performance of Python expression evaluation when the same result is required in multiple threads. Specific expression benchmarks have shown a 10x speedup and some production scenes show an overall 15-30% improvement. Caution : This can expose pre-existing bugs in other nodes - see Breaking Changes for details.
- Improved error message when Python expression assigns an invalid value.
 
- Numeric Bookmarks : Changed the Editor 1-9 hotkeys to follow the bookmark rather than pinning it (#4074).
- Editors : Simplified the Editor Focus Menu, removing some seldom used (but potentially ambiguous) modes (#4074).
- Timeline :- Added support for sub-frame dragging with a Ctrl modifier, and fixed snapping of the frame indicator for regular drag operations.
- The current frame is now drawn next to the playhead.
 
- Increased image processing tile size from 64 pixels to 128 pixels. This reduces per-tile overhead on large images, dramatically increasing effective image performance in many cases.
- SceneNode/SceneProcessor : Enforced that the value of the enabledplug may not be varied using thescene:pathcontext variable. Attempts to do so could result in the generation of invalid scenes. Filters are the appropriate way to enable or disable a node on a per-location basis, and should be used instead. This change yielded a 5-10% performance improvement for a moderately complex scene.
- OSLImage : Avoided some unnecessary computes and hashing when calculating channel names or passing through channel data unaltered.
- Context : Optimized hash()method, and reduced overhead inEditableScope.
- NameSwitch/Spreadsheet : Rows with an empty name are now treated as if they were disabled. See Breaking Changes for further details.
- ContextVariables : Improved performance by around 50%.
- FilterResults : Improved performance.
- SceneAlgo : Reduced threading overhead for parallelProcessLocations(),parallelTraverse()andfilteredParallelTraverse(). This is particularly noticeable when visiting locations with many children.
- Set : Added wildcard support to the nameplug.
- GraphEditor : Added tool menu with options to control visibility of annotations.
- Render : Improved scene generation times for renders that use dispatcher.batchSizeto render multiple frames at once. Previously Gaffer’s cache was cleared after scene generation on each frame, but this is now only done for single-frame batches.
Fixes¶
- Instancer : Fixed variation of prototype root attributes using context variables.
- ScriptNode : Fixed bugs that allowed global variables to remain in the context after they had been disabled, renamed or deleted.
- SceneReader :- Fixed crash when reading Alembic caches with non-scalar userProperties.
- Fixed crash when reading Alembic caches with invalid primitive variables.
 
- Fixed crash when reading Alembic caches with non-scalar 
- UDIMQuery and OSLImage : Fixed incorrectly isolated TBB which could cause hang when other nodes use Standard cache policy. Now uses TaskCollaboration to improve performance.
- Wrapper : Removed the PYTHONHOMEenvironment variable. This fixes problems running Gaffer in python-enabled versions ofgdb.
- CompoundNumericPlug : Fixed serialisation of dynamic plugs with non-default interpretations.
API¶
- Context :- Refactored to allow EditableScope to avoid memory allocation where possible.
- Added fast non-allocating EditableScope::set( name, const T * )overload. This should be used in preference to the oldset( name, const T & )method.
- Added EditableScope::setAllocated()method to replace the oldset()method in the rare circumstance where allocation is required.
- Added variableHash()method, which returns the hash for an individual variable.
- Added getIfExists()method, which returnsnullptrif a variable doesn’t exist.
- Added getAsData()method, which returns a copy of a variable asIECore::Data.
- Added TypeDescriptionregistration class, which must be used to register any custom data types used in context variables.
 
- GraphComponent : Added reorderChildren()andchildrenReorderedSignal()methods.
- Serialisation : Added addModule()method, for adding imports to the serialisation.
- Slider :- Added optional value snapping for drag and button press operations. This is controlled via the setSnapIncrement()andgetSnapIncrement()methods.
- Added setHoverPositionVisible()andgetHoverPositionVisible()accessors to control an optional position indicator drawn under the pointer.
 
- Added optional value snapping for drag and button press operations. This is controlled via the 
- Expression : Added Engine::executeCachePolicy()method which must be implemented by subclasses.
- ImageAlgo : Added constants for the default channel names - channelNameRetc.
- SceneAlgo : Added optional rootargument tofilteredParallelTraverse( scene, pathMatcher ).
- MetadataAlgo :- Added optional userargument toaddAnnotationTemplate().
- Added optional userOnlyargument toannotationTemplates().
 
- Added optional 
- AnnotationsGadget : Added setVisibleAnnotations()andgetVisibleAnnotations()methods to allow filtering of annotations.
- MonitorAlgo : Added removePerformanceAnnotations()andremoveContextAnnotations()methods.
- Deformer : Added affectsProcessedObjectBound(),hashProcessedObjectBound()andcomputeProcessedObjectBound()virtual methods. These can optionally be overridden by derived classes to compute faster approximate bounds where possible.
Breaking Changes¶
- NameSwitch/Spreadsheet : Rows with an empty name are now treated as if they were disabled. Previously they would cause confusion by being matched against empty selectors. Use the default row for empty selectors instead, or alternatively use a catch-all *row.
- Context :- Removed Ownershipenum. The copy constructor now always performs a full copy.
- Removed changed()method.
- Removed _copyargument fromget()Python binding.
 
- Removed 
- Slider/NumericSlider :- Refactored Slider to provide all the functionality of NumericSlider, and removed NumericSlider.
- Renamed initial constructor argument from valuetovalues.
- Removed setPositions()/getPositions()andsetPosition()/getPosition()methods fromSlider. UsesetValues()/getValues()andsetValue()/getValue()instead.
- Removed positionChangedSignal()fromSlider. UsevalueChangedSignal()instead.
- Removed PositionChangedReasonfromSlider. UseValueChangedReasoninstead.
- Removed setPositionIncrement()/getPositionIncrement()fromSlider. UsesetIncrement()/getIncrement()instead.
- Replaced _drawPosition()method with_drawValue().
 
- StandardOptions : Removed cameraBlurplug. This never functioned as advertised, as the regulartransformBluranddeformationBlurblur settings were applied to cameras instead. As before, a StandardAttributes node may be used to customise blur for individual cameras.
- SceneAlgo :- Changed signature of the following methods to use GafferScene::FilterPlug:matchingPaths,filteredParallelTraverse,Detail::ThreadableFilteredFunctor.
- Removed filteredParallelTraverse()overload which accepted aFilter *. Passfilter->outPlug()instead.
 
- Changed signature of the following methods to use 
- DeleteFaces / DeletePoints / DeleteCurves : The PrimitiveVariable name is now taken verbatim, rather than stripping whitespace.
- Serialisation :- Disabled copy construction.
- The following methods now take a const object &where they used to takeobject &:- modulePath()
- classPath()
 
- The following methods now take a Serialisation &argument where they used to takeconst Serialisation &:- constructor()
- postConstructor()
- postHierarchy()
- postScript()
 
 
- ValuePlugBinding :- repr()now takes a- Serialisation *where it used to take a- const Serialisation *.
- valueRepr()now has an optional- serialisationargument.
 
- Metadata : Renamed signal types :- NodeValueChangedSignal->- LegacyNodeValueChangedSignal
- PlugValueChangedSignal->- LegacyPlugValueChangedSignal
- NodeValueChangedSignal2->- NodeValueChangedSignal
- PlugValueChangedSignal2->- PlugValueChangedSignal
 
- MetadataBinding :- Added serialisationrequired argument tometadataSerialisation().
- Removed metadataModuleDependencies()method. Module dependencies are now declared automatically bymetadataSerialisation().
 
- Added 
- Editors : Removed the ‘Follow Scene Selection’ mode from the Node Editor Focus menu (#4074).
- GafferSceneUI : Removed SourceSet.
- ScriptNode : Added private member data.
- Expression : Changed the Python expression cache policy to Standard. This executes expressions behind a lock, and can cause hangs if buggy upstream nodes perform TBB tasks without an appropriateTaskIsolationorTaskCollaborationpolicy. In this case, theGAFFER_PYTHONEXPRESSION_CACHEPOLICYenvironment variable may be set toLegacyorTaskIsolationwhile the bugs are fixed.
- Node : Removed plugFlagsChangedSignal(). We aim to phase flags out completely in future, and none of the current flags are expected to be changed after construction.
- ContextProcessor : Added storageargument toprocessContext()method.
- FilteredChildIterator/FilteredRecursiveChildIterator : Annotated all namespace-level typedefs with [[deprecated]]. These were already documented as deprecated in Gaffer 0.59.0.0, but their use will now trigger compiler warnings. Please use the class-level typedefs instead, for examplePlug::Iteratorin place ofPlugIterator.
- RendererAlgo : Removed from the API. The render adaptor registry and applyCameraGlobals()are still available, but have been moved to SceneAlgo.
- MonitorAlgo : Removed deprecated annotate()overloads. Source compatibility is retained.
- Instancer : Attributes from the prototype root are now placed at the instance root, rather than on the instance group. This allows context variation to potentially vary these attributes. Usually attribute inheritance will mean that this behaves the same, but scenes which explicitly override attributes at specific locations in the hierarchy after an instancer could see modified behaviour.
- PointsGridToPoints : Changed default value of filterinput, so that a filter must now be connected to specify the objects to modify.
- GafferVDB : Changed base class of the following nodes :- LevelSetToMesh
- MeshToLevelSet
- LevelSetOffset
- PointsGridToPoints
 
- LevelSetToMesh : Changed default value for adjustBoundsplug.
Build¶
- Moved minimum required C++ standard to C++14.
- Moved minimum required TBB version to 2018 Update 3.
- Dependencies : Updated to GafferHQ/dependencies 3.0.0 :- USD 21.05.
- OpenImageIO 2.2.15.1.
- OpenShadingLanguage 1.11.14.1.
- LibTIFF 4.1.0.
- LLVM 10.0.1.
- OpenVDB 7.2.2.
- Cortex 10.2.0.0.