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
enabled
plug may not be varied using thescene:path
context 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
name
plug. - GraphEditor : Added tool menu with options to control visibility of annotations.
- Render : Improved scene generation times for renders that use
dispatcher.batchSize
to 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
PYTHONHOME
environment 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 returnsnullptr
if a variable doesn’t exist. - Added
getAsData()
method, which returns a copy of a variable asIECore::Data
. - Added
TypeDescription
registration 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 -
channelNameR
etc. - SceneAlgo : Added optional
root
argument tofilteredParallelTraverse( scene, pathMatcher )
. - MetadataAlgo :
- Added optional
user
argument toaddAnnotationTemplate()
. - Added optional
userOnly
argument 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
Ownership
enum. The copy constructor now always performs a full copy. - Removed
changed()
method. - Removed
_copy
argument fromget()
Python binding.
- Removed
- Slider/NumericSlider :
- Refactored Slider to provide all the functionality of NumericSlider, and removed NumericSlider.
- Renamed initial constructor argument from
value
tovalues
. - Removed
setPositions()/getPositions()
andsetPosition()/getPosition()
methods fromSlider
. UsesetValues()/getValues()
andsetValue()/getValue()
instead. - Removed
positionChangedSignal()
fromSlider
. UsevalueChangedSignal()
instead. - Removed
PositionChangedReason
fromSlider
. UseValueChangedReason
instead. - Removed
setPositionIncrement()/getPositionIncrement()
fromSlider
. UsesetIncrement()/getIncrement()
instead. - Replaced
_drawPosition()
method with_drawValue()
.
- StandardOptions : Removed
cameraBlur
plug. This never functioned as advertised, as the regulartransformBlur
anddeformationBlur
blur 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 aSerialisation *
where it used to take aconst Serialisation *
.valueRepr()
now has an optionalserialisation
argument.
- Metadata : Renamed signal types :
NodeValueChangedSignal
->LegacyNodeValueChangedSignal
PlugValueChangedSignal
->LegacyPlugValueChangedSignal
NodeValueChangedSignal2
->NodeValueChangedSignal
PlugValueChangedSignal2
->PlugValueChangedSignal
- MetadataBinding :
- Added
serialisation
required 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 appropriateTaskIsolation
orTaskCollaboration
policy. In this case, theGAFFER_PYTHONEXPRESSION_CACHEPOLICY
environment variable may be set toLegacy
orTaskIsolation
while 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
storage
argument 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::Iterator
in 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
filter
input, 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
adjustBounds
plug.
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.