Releases: GafferHQ/gaffer
Version 0.96.2
This is just a bug fix release for the Cortex 8 compatible branch. The latest public release at this point is version 0.99.0, below.
UI
- Added OpDialogue preExecuteSignal() and postExecuteSignal().
- Added OpDialogue.parameterisedHolder() method.
Version 0.99.0
This release contains several IPR improvements and bug fixes and the beginnings of an improved SceneInspector, along with the usual set of additions, optimisations and fixes.
Apps
- Fixed potential startup error in gui viewer.py configuration file.
Core
- Added background execution mode to the LocalDispatcher.
UI
- Added a gnomon to the 3d viewer (#41).
- Improved SceneInspector
- Implemented error tolerant loading for file menu operations. Errors are reported via a dialogue, and will no longer prevent loading of a script (#746).
- Fixed ScriptEditor to execute code in the right context. Prior to this, any queries performed in the script editor were always evaluated at frame 1.
- Dispatcher UI no longer forces background execution - this is now controlled by per-dispatcher settings.
Scene
- Improved IPR
- Fixed hang during shutdown with active IPR render (#855).
- Implemented camera edits for IPR rendering (#190).
- Prevented errors in other nodes from causing incomplete edits.
- Fixed UI errors caused by deleting camera during IPR (#898).
- Optimised updates by pruning invisible hierarchies.
- Fixed bug in shader edits at non-leaf locations.
- Optimised Instancer, especially the computation of the bounding box for all the instances. This particular operation is now 18x faster on a 6 core machine, 7x faster on a 2 core machine.
- Added an automatically created set for tracking all cameras in the scene.
- Improved reporting of invalid cameras (#371).
- Fixed FilteredSceneProcessor::acceptsInput() crash when inputPlug is null.
API
- Registered automatic from-python conversions for ScenePlug::ScenePath. This replaces the need to manually wrap any functions taking a ScenePath, making the bindings simpler.
- Added exists() method to SceneAlgo. This can be used to query whether or not a particular location exists within a scene.
- Replaced boost_intrusive_ptr with raw pointer where appropriate, to follow the convention laid out in Cortex.
- Removed deprecated Box metadata methods. The standard Metadata API should be used instead.
- Added missing wrapper for NodeGadget::nodule() overload.
- Added OpDialogue preExecuteSignal() and postExecuteSignal().
- Added OpDialogue parameterisedHolder() method.
- Added a flags argument to ParameterHandler::setupPlug(). This allows clients to choose the default flags for their plugs, rather than being forced to have (Default | Dynamic) plugs.
- Added ViewDescription constructor for 3 argument registerView.
- Added Style::renderTranslateHandle() method.
- Added GafferUI::Handle gadget.
- Moved translatePythonException() to a new ExceptionAlgo.h header.
- Added formatPythonException() function to ExceptionAlgo.h.
- Added continueOnError argument to ScriptNode execution methods.
- Added error return value to ScriptNode execution methods.
- Improved EventLoop.executeOnUIThread() to execute immediately when used on main thread.
Build
- Requires Cortex-9.0.0a2
- Updated default build to use PySide 1.2.2.
- Stopped using python-config for build configuration. It was unreliable on Mac, and the hardcoded paths it returns prevented us from building with prebuilt binary dependencies.
0.96.1
This is just a bug fix release for the Cortex 8 compatible branch. The latest public release at this point is version 0.98.0, below.
Scene
- Changed SceneProcedural to fix IPR shader edit bug
Version 0.98.0
This release makes dispatchers available via the UI for the first time. Dispatchers allow many tasks (such as rib generation, rendering and compositing) to be processed for a series of frames, with dependencies between the tasks determining the execution order. It also adds support for adding and removing lights during IPR renders, and the usual small fixes and improvements.
Apps
- Added context parameter to the execute app. This takes a series of key/value pairs that allow additional context variables to be specified.
- Fixed shutdown warning when running
gaffer test GafferTest
. - Added repeat parameter to test app.
UI
- Integrated Dispatchers into the UI with a Dispatcher window, which can be launched in any of the following ways :
- The /Execute/ExecuteSelected menu item (Ctrl+E)
- The Execute button the NodeEditor
- The right click node menu in the NodeGraph.
- Fixed several shutdown warnings.
- Fixed bug in Reference node menu item.
Core
- Added jobName and jobDirectory plugs to Dispatcher. These control the creation of a location for storing temporary files needed for the dispatch.
- Added Frame Range options to Dispatcher.
- Improved LocalDispatcher to dispatch tasks in a subprocess (#866).
- Fixed ExecutableOpHolder hash computation.
- Implemented variable substitutions for ExecutableOpHolder.
- Fixed ObjectWriter hash computation (#878).
Scene
- Implemented light add/remove/hide/show for IPR (#874).
- Stopped ExecutableRender saving the script when it executes (#310). This is now done automatically by the dispatchers, which save a copy into the job directory.
- Fixed ExecutableRender hash computation.
- Fixed SceneWriter hash computation.
Image
- Fixed ImageWriter hash computation.
API
- Added ScenePlug::pathToString() method.
- Added outputLight() method to RendererAlgo.h.
- Fixed bug in DependencyNode dirty propagation order. This ensures that dirtiness is only signalled for a plug after it has been signalled for all the plugs it depends on and all its children.
- Derived all Gaffer unit tests from GafferTest.TestCase.
- Simplified Dispatcher implementations by providing doDispatch with the unique task list.
- Made Dispatcher::uniqueTasks() private.
- Dispatchers now require that all nodes belong to the same ScriptNode.
- Fixed ExecutableNode::Task comparison functions and member access (#865).
- Improved Plug bindings with a new PlugClass helper class.
- ExecutableNode::executionHash() must now call the base class implementation first - see documentation for details.
Version 0.97.0
This release is focussed mainly on optimisation and bug fixes, with significant speedups being provided by moving to a new caching implementation in Cortex 9. Behind the scenes it also contains progress towards exposing Dispatcher functionality at the user level.
Core
- Optimised FilteredChildIterator and PlugIterator. This alone gives more than a 5% speedup in a simple Instancer benchmark.
- Fixed serialisation of non-dynamic ArrayPlugs. This bug caused the appearance of duplicate requirements plugs on executable nodes (#580).
UI
- Added a grid to the 3D viewer.
- Added NodeGraph menu item for selecting objects affected by a node - accessed by right clicking on a filtered scene node.
- Fixed several causes of zombie widgets which could cause errors at shutdown.
- Moved the Execute button for ExecutableNodes to a prominent position in the header of the NodeEditor.
- Added SceneWriter to the node menu. Also reorganised the Scene menu to include a File submenu, and simplified the Object menu by moving generators into the Source submenu.
Scene
- Optimised Shader network computation - reducing runtime by 35% for typical production networks.
Arnold
- Fixed ArnoldRender "Generate expanded .ass" mode. It was using a "-resaveop" command line flag removed from kick in Arnold version 4.0.10.0.
API
- Added ability for Gadgets to have child Gadgets. Previously only ContainerGadgets could have children.
- Rederived NodeGadget from Gadget rather than IndividualContainer. This allows more flexibility in NodeGadget implementations, and also better hides the implementation details.
- Added methods for controlling Gadget visibility.
- Rederived ViewportGadget from Gadget rather than IndividualContainer. This allows viewports to have multiple child gadgets, which paves the way for more complex views and interactive manipulators.
- Made UI registration methods accept classes in place of TypeIds.
- Added public GafferScene::Filter methods for specifying input scene via Context.
- Added SceneAlgo.h with methods for querying all objects matching a filter.
- Continued refactoring the Executable framework, in preparation for exposing it to users
- Americanized spelling.
- Renamed ExecuteUI to DispatcherUI.
- Renamed ExecutableNode "dispatcherParameters" plug to simply "dispatcher".
- Rederived SceneWriter from ExecutableNode.
- Rederived Dispatcher from Node, to allow settings to be specified via plugs.
- Renamed Dispatcher::addAllPlugs() to Dispatcher::setupPlugs().
- Renamed Dispatcher::addPlugs() to Dispatcher::doSetupPlugs.
- Added shutdown checks for zombie widgets and scripts.
- Fixed "base class not created yet" GafferRenderMan import error.
- Added _copy parameter to Shader::state() python binding.
Documentation
- Improved formatting of Doxygen documentation - a brief description of each class is now shown above the detailed member documentation.
Build
- Requires Cortex 9.0.0-a1.
- Recent Cortex LRUCache improvements offer significant performance gains.
- Updated default TBB version to 4.2.
Version 0.96.0
Core
- Added support for Box data to CompoundDataPlug.
- Optimised the Context class considerably, particularly for temporary Contexts created during computation. A synthetic test which does nothing but create temporary Contexts shows a reduction in runtime of 97%, resulting in a 30% reduction in total runtime for a more real-world test using the Instancer node (#427).
- Fixed Context copy construction doubling in Python bindings.
- Fixed circular references within the undo system, which caused memory leaks where scripts were not destroyed at the appropriate time (#397).
- Optimised ComputeNode::hash(). This yields ~14% reduction in runtime for a simple Reformat benchmark.
UI
- Fixed PyQt circular references within GafferUI.Menu (#397).
- Fixed crash caused by File->Quit menu item.
- Improved UI for BoxPlugs.
Scene
- Added crop window to StandardOptions node (#688).
- Renamed gaffer:visibility attribute to scene:visible, to support the standard attribute with that name in Cortex scene caches.
- Added a SetFilter node (#92).
- Fixed deadlock removing input from running InteractiveRender node, or undoing or redoing such an operation.
- Added pausing for interactive renders (#646).
API
- Renamed BoxPlug min() and max() methods to minPlug() and maxPlug().
- Made Context::Scope noncopyable.
- Added GAFFERTEST_ASSERT macro. This should be used by test cases implemented in C++, and throws an exception which can be caught and reported by the Python unit test runner.
- Added _copy argument to Context::get() bindings.
- Added optimised Context copy constructor, primarily for use in constructing temporary Contexts. See class documentation for details.
- Added checks for zombie ScriptNodes and Widgets at app shutdown. This can catch many common programming errors.
- Added BoxPlugValueWidget class.
Version 0.95.0
UI
- Improved SceneReader UI with right click menu for toggling tags on and off in the tags and sets plugs.
Core
- Fixed bug with references containing non-default plug values (#844).
Scene
- Added preliminary support for sets (#92).
- Added a Set node. This allows users to manage sets of named locations (with optional wildcards) as part of their graph flow.
- Replaced "gaffer:forwardDeclarations" globals entry with a private set named "__lights".
- Updated hierarchy modifying nodes to also modify sets to keep them in sync with the hierarchy.
- Implemented loading of tags as sets in SceneReader.
- An upcoming release will contain a SetFilter for actually making the sets useful.
- Added a FreezeTransform node (#822).
RenderMan
- Fixed IPR bug where shaders could leak onto the wrong objects.
API
- Typedefed PathMatcherData into GafferScene namespace.
- Optimised PathMatcher (the underlying data structure for sets).
- Replaced GafferScene::Render base class with RendererAlgo.h header.
- Simplified Executable nodes and tidied up implementation, in preparation for actually integrating Despatchers properly.
Version 0.94.0
Apps
- Increased default size of browser app (#795).
- Added bookmarks support to Op windows in the browser app (#787).
- Fixed position of quit confirmation dialogue (#751).
- Fixed parsing of command line arguments with spaces.
UI
- Fixed PySide incompatibility in VectorDataWidget.
- Improved VectorDataWidget numeric editing (#637).
- Simplified OpDialogue exception reporting (#806).
- Fixed "Open Recent..." crash bug in PySide builds (#548).
- Used OpDialogue to improve progress/error reports in OpPathPreview (#792).
- Enabled background mode for OpDialogue launched from BrowserEditor.
- Fixed OpPathPreview UI glitch.
- Fixed "KeyError: 'currentTab'" error when loading custom layouts.
- Added more sensible initial widget sizes to BrowserEditor. The sizes are also saved and restored when modes are switched.
- Improved Bookmarks
- Identifies recent items by full paths, so multiple recent items with the same basename may coexist.
- Prevents heavy usage of one bookmarks category from removing the recent items for the general (no category) bookmarks.
- Improves bookmarks UI in PathChooserWidget to display full paths of recent items.
- Most recent items are now displayed at the top.
- Added creation of bookmarks by dragging on to bookmarks icon.
- Fixed cursor bug in StringPlugValueWidget continuous update mode (#796).
- Fixed bug in non-editable MultiLineStringPlugValueWidgets.
- Fixed upside down nodule labels.
- Fixed overzealous Viewport drag tracking (#550).
- Improved SceneHierarchy to view any output ScenePlug, regardless of name. This improves compatibility with Boxes, where the user can make an output plug with any name they want.
- Added right click menu for Box plugs in NodeGraph. This allows the renaming and deletion of promoted nodules.
- Added dropdown menu for Displays node quantize parameters.
- Improved Displays node UI (#15).
- Added command-line representation of Op values in the UI (#793).
- Added workaround for squash/stretch in viewport camera look-through (#826).
- Added custom editor to PathVectorDataWidget. This enables tab completion, nice dropdown menus and a browser for PathVectorDataParameters.
- Added indexing methods to VectorDataWidget.
- Added presetsOnly dropdown menus to CompoundVectorParameterValueWidget (#470).
- Added an auto-load preset for ops (#804).
- Added filtering by image type for ImageReader and ImageWriter file dialogues.
Core
- Combined setValue() serialisation for CompoundNumericPlugs (#761).
- Fixed Box plug promotion to support ImagePlugs and ScenePlugs.
Scene
- Renamed GLSL shaders to UpperCamelCase. This matches the naming convention we use for OSL shaders.
- Added a Grid node.
- Fixed FilteredSceneProcessor to allow Box promotion of Filter plug.
Image
- Fixed a bug in ImageTransform that could result in corrupted output.
API
- Added GraphComponentClass and GadgetClass to improve bindings.
- Added NodeGadgetClass to improve bindings of NodeGadgets.
- Added immediate execution mode to OpDialogue.
- Fixed NodeGadget::noduleTangent() binding.
- Fixed potential bug in NodeGadget::create().
- Fixed LRUCache getter cost calculations.
- Fixed Metadata test hang.
- Improved Window.resizeToFitChild() behaviour. If called on an as-yet unshown window, it would move the window to the top left corner of the screen. Now the window will still be opened in a sensible place. Added additional shrink and expand arguments to further control the resize behaviour.
- Added support for fixed size CompoundVectorParameterValueWidget. The ["UI"]["sizeEditable"] user data entry can be given a BoolData value of False, which will cause the +/- buttons to be hidden in the UI, enforcing a fixed length on the data in the vector parameters.
- Added per-column editability to CompoundVectorParameterValueWidget. This uses a ["UI"]["editable"] user data entry in each child parameter, where a BoolData value of False will make the column for that parameter read-only (#766).
- Made Bookmarks.acquire() support passing Widgets and GraphComponents.
- Added support for callable dialogue keywords in PathPlugValueWidget.
- Fixed drag/drop to allow modal dialogue creation in dropSignal().
- Added public Serialisation::acquireSerialiser() method.
- Added ValuePlugSerialiser::valueNeedsSerialisation() method. This can be reimplemented by derived classes to provide more control over the serialisation of values.
- Privatised numeric and string PlugValueWidget implementations.
- Added ViewportGadget viewportChangedSignal() and cameraChangedSignal().
- Added SpacerGadget size accessors.
- Added iterator typedefs for all GafferUI::Gadget subclasses.
- Improved Box plug promotion API.
- Made BlockedConnection and UndoContext non-copyable.
- Added useNameAsPlugName argument to CompoundDataPlug::addMembers(). Also added python bindings for CompoundDataPlug::fillCompoundData() and CompoundDataPlug::fillCompoundObject().
- Gave Displays node parameter plugs more useful names.
- Added VectorDataWidget.editSignal(). This allows custom Widgets to be provided to edit the values held in the table cells.
- Added Widget.focusChangedSignal().
- Added VectorDataWidget setColumnEditable/getColumnEditable methods.
- Added right click preset menu for CompoundVectorParameterValueWidget. This also adds the ability for any custom parameter menu to operate with CompoundVectorParameters, whereas before they couldn't.
Build
- Now using Coverity static analysis - this resulted in a number of bugs being found and fixed in this version.
Version 0.93.0
Core
- Added the ability to specify Metadata overrides to specify instances of Plugs and Nodes.
UI
- Added UI Editor. This allows the user plug layout for any node to be edited - plugs can be reordered, dividers added and help strings specified. In particular this allows the creation of custom UIs for Boxes, which can then be exported and loaded by References.
- Fixed initial unsortedness of PathListingWidgets.
Scene
- Added PrimitiveVariables node. This allows arbitrary primitive variables with constant interpolation to be added to objects.
- Added Duplicate node. This allows arbitrary numbers of duplicates of subhierarchies to be created, each with their own transform.
OSL
- Specifying lockgeom=1 by default for all OSL shading engines. This means that primitive variables (user data in OSL parlance) are not automatically mapped to shader inputs unless those inputs have explicitly set lockgeom=0 in the source (which is rare). This almost doubles the speed of a simple image noising operation.
- Fixed OSLShader::acceptsInput( NULL ) crash.
API
- Added PlugLayout class, which creates node editor UIs driven by Metadata. This will replace all existing plug layouts over time.
- Added StringAlgo.h, containing various string utilities, including wildcard matching (#707).
- Added metadata accessors to OSLShader.
- Fixed module import order and namespace pollution issues.
- Replaced Metadata regexes with new string matching code.
- Added Metadata signals emitted on registration of values.
- Made NameWidget accept None for the the GraphComponent.
- Added borderWidth argument to SplitContainer constructor.
- Added PathListingWidget setHeaderVisible()/getHeaderVisible() methods.
- Added PathListingWidget.pathAt() method.
- Fixed bug in GafferUI::Pointer::setFromFile( "" )
- Added a DictPath.dict() accessor.
- Moved NodeEditor.acquire() to NodeSetEditor.acquire(). This allows it to be used to acquire an editor of any type.
- Added fallbackResult to WeakMethod.
- Fixed CompoundPlug plugSetSignal() emission when children change.
Version 0.92.1
Scene
- Improved shader assignment reporting in SceneInspector (#335)
- Improved shader handle generation