forked from GafferHQ/gaffer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathChanges
More file actions
3293 lines (2078 loc) · 166 KB
/
Changes
File metadata and controls
3293 lines (2078 loc) · 166 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# 0.4.0.0
#### Core
- Plugs and ValuePlugs now accept children (#1043).
- Added child matching to connected Plugs (#1043).
- Added LocalDispatcher.Job and LocalDispatcher.JobPool to track running batches (#1064).
- Failing batches not stop a LocalDispatch job.
#### UI
- Improved Object section of SceneInspector (#897).
- Added a window for tracking currently running LocalDispatcher jobs (#872).
- Fixed reparenting bug with DispatcherWindows (#1064).
#### Scene
- Fixed poor performance of Prune/Isolate in presence of SetFilter.
- Added sets support to Parent node (#1065).
- Outputting all cameras, not just the primary camera, to the renderer.
- Added support for per-camera resolution overrides, specified with a "resolutionOverride" V2iData in the camera parameters.
#### API
- Plugs and ValuePlugs now accept children. CompoundPlug will be deprecated.
- Added BranchCreator::hashBranchGlobals() and computeBranchGlobals(), and implemented them for Parent.
- Added outputCameras() and overload for outputCamera() to RendererAlgo.h.
- Added LocalDispatcher.Job and LocalDispatcher.JobPool to track running batches.
#### Incompatible changes
- Added additional virtual methods to BranchCreator
- ValuePlug::settable() is no longer virtual
- Removed methods and member variable from CompoundPlug
- InteractiveRender "updateCamera" plug renamed to "updateCameras".
# 0.3.0.0
#### Core
- Added SubGraph base class, which Reference and Box now derive from, allowing them both to be enabled/disabled.
- Redesigned Dispatcher registration (#922) (see API section for details).
#### UI
- Nodes created via the NodeMenu apply default values to their plugs, using the "userDefault" key in the Metadata (#1038).
- Exposed the DispatcherWindow to the public API.
#### Cortex
- Moved Cortex-specific functionality into new GafferCortex library and module.
- The Gaffer core itself remains heavily dependent on Cortex, and always will. Here we're splitting out "end user" functionality such as OpHolders and ProceduralHolders, so that GafferCortex can be thought of as the user-visible presence of Cortex within Gaffer.
- This remains backwards compatible for now via startup files, which allows a grace period for dependent code to update to the new module layout.
#### RenderMan
- Added basic support for RenderMan volume shaders.
#### API
- Added Gaffer.NodeAlgo python scope with applyUserDefaults( node ) (#1038).
- Redesigned Dispatcher registration (#922).
- Dispatchers are registered with Creator functions rather than instances.
- Added get/setDefaultDispatcherType(), which can be used to create a new instance of the default type.
- SetupPlugsFn is now a static function that can be registered along with a Creator, rather than a virtual method of Dispatcher instances.
- Added gil release to GafferScene.matchingPaths python binding.
- Fixed StringPlug string substitution bug.
- Catching error_already_set in Dispatcher bindings.
#### Incompatible changes
- Reference and Box now derive from SubGraph rather than Node or DependencyNode.
- Redesigned Dispatcher registration (#922) (see API section for details).
# 0.2.1.0
#### Core
* Expression node optimizations
#### Scene
* Made ShaderAssignment use the shader type as an attribute name.
* Added Group::nextInPlug() method
* InteractiveRender now updates all attributes, not just shaders
#### UI
* Dispatcher FrameRange UI displays the value that will actually be dispatched.
* Removed unwanted horizontal padding from frameless Buttons.
# 0.2.0.0
This release brings significant optimisations, further additions to the SceneInspector, and the usual collection of miscellaneous enhancements and bug fixes.
#### Core
- Optimised Context::substitute(). This gives a 73% reduction in runtime for a substitutions benchmark.
- Added '\' as an escape character in Context::substitute() (#997).
- Boxes may now be enabled/disabled and define pass-through behaviours (#1015).
- Significant optimisations to the computation engine.
- Added TaskList node for grouping the dispatch of several input requirements.
#### Image
- Fixed Display node for bucket sizes larger than the native tile size.
- Fixed problems when running embedded in Maya.
#### Scene
- Added code to clear caches after full procedural expansion in batch renders.
- Added scene pass-through to the InteractiveRender node. This allows it to be seen in the Viewer, SceneHierarchy, SceneInspector etc.
- Significant optimisations. A benchmark scene can now be generated in 3% of its previous runtime.
#### RenderMan
- Added "command" plug to RenderManRender. This allows the user to customise the command used to render the RIB (#1017).
#### UI
- SceneInspector improvements
- Added set membership section (#930).
- Added sets section to globals (#895).
- Improved responsiveness.
- MenuButton improvements
- Menus are shown on press rather than release (#742).
- Added menu indicator (#493).
- Fixed OpDialogue bug which caused it to return to the parameters pane when it should have been displaying an error.
- Dispatcher improvements
- Added PlaybackRange to the frames mode menu (#1007).
- Renamed ScriptRange to FullRange.
#### API
- Added custom Diff support to SceneInspector.
- Fixed crashes when passing None to PathMatcher python methods.
- Added accessors for the buttons on VectorDataWidget (#1003).
- Fixed broken SceneInspector.Row.getAlternate() method.
- Added SceneProcedural::allRenderedSignal().
- Added Context::remove() method.
#### Incompatible changes
- SceneInspector API changes.
- Box rederived from DependencyNode.
- Dispatcher ScriptRange renamed to FullRange.
#### Build
- Improved Travis continuous integration setup
- Added running of unit tests
- Added GafferRenderMan support
- Fixed installation to paths starting with "./"
- Fixed RenderManShader compilation in Clang 3.4
- GafferOSL compatibility for OSL version 1.5
# 0.1.1.0
#### Core
- Optimised computation for long chains of nodes (#963).
- Optimised repeat calls to Context::hash().
- Added Context::changed() method.
- Made Context::hash() ignore "ui:" prefixed entries.
- Refactored ValuePlug::hash() to delegate to Computation.
#### UI
- Fixed Execute->Repeat Previous menu item.
- Fixed display of '<', '>' and '&' in SceneInspector.
#### Scene
- Added an ExternalProcedural node (#722).
- Added pass-through plugs to ExecutableRender nodes and SceneWriter.
- Added pixelAspectRatio, overscan, and resolutionMultiplier options (#979).
#### Image
- Added pass-through plugs for ImageWriter.
#### Build
- Requires Cortex 9.0.0-a6
- Fixed typedef issues when building with GCC 4.8
- Added Travis config for build verification (doesn't run the tests yet)
# 0.1.0.0
#### Apps
- The "gui" app now tolerates errors when loading scripts from the command line. Note that currently errors are only reported to the shell.
- The "execute" app can now handle nodes inside Boxes.
#### Core
- Improved version numbering (#980)
- Versions are now MILESTONE.MAJOR.MINOR.PATCH
- Changes to MILESTONE version denote major development landmarks
- Changes to MAJOR version denote backwards incompatible changes
- Changes to MINOR version denote new backwards compatible features
- Changes to PATCH version denote bug fixes
- Added Gaffer.About.compatibilityVersion() method
- Added GAFFER_COMPATIBILITY_VERSION macro for conditional compilation of C++ extensions
- Fixed bug whereby GraphComponent::setName() could allow duplicate names
- Dispatcher improvements
- `Dispatcher::postDispatchSignal()` is now always executed, even if execution is cancelled or fails. A new boolean argument is passed to specify whether or not dispatch succeeded.
- Dispatcher now creates job directories automatically, so derived classes don't have to
#### Incompatible changes
- `Dispatcher::postDispatchSignal()` signature change.
- Dispatcher jobDirectory() semantics change.
- Dispatcher jobDirectoryPlug() -> jobsDirectoryPlug() rename.
#### Build
- Requires Cortex 9.0.0-a5
# 0.101.0
#### Core
- ExecutableNodes now accept Boxes as requirements inputs and outputs.
- Dispatchers accept Boxes for direct dispatching (#925).
- Added SystemCommand executable node.
- Optimised plug dirty propagation.
- Added matchMultiple() function to StringAlgo.h.
#### Scene
- Renamed Displays node to Outputs. Also changed "label" plug to "name" and the old "name" plug to "fileName" (#54).
- Fixed dirty propagation bug in Outputs node.
- Added an outputOutputs() method to RendererAlgo.h, so outputOptions() need only output actual options.
- Added DeleteGlobals node.
- Added DeleteOutputs node.
- Added DeleteOptions node (#965).
- Added wildcard matching to DeleteAttributes and DeletePrimitiveVariables.
- Prefixed options in scene globals with "option:".
- Added global mode to Attributes node, which places the attributes in the globals (with "attribute:" prefixes).
- Updated render nodes to support global attributes.
- Added global attribute support to SceneProcedural (#964).
- Fixed RendererAlgo outputScene() to include coordinate systems.
#### UI
- Added Outputs section to the SceneInspector (#921).
- Updated SceneInspector to display global attributes.
- Fixed display of single empty bounding box in SceneInspector.
#### RenderMan
- Added FrameBegin/FrameEnd in RIBs generated by RenderManRender (#358). Requires Cortex 9.0.0-a5.
#### OSL
- Fixed default arguments for OSL In* and Out* shaders.
#### Build
- Set default compiler optimisation level to -O3.
- Added missing OSL, OIIO, OCIO includes to the dependency package.
- Clang compatibility fixes.
# 0.100.0
This release features significant improvements to Dispatcher and SceneInspector functionality, along with the usual bunch of small fixes and improvements.
#### Apps
- Changed shutdown warnings to debug messages.
#### Core
- Dispatcher improvements
- Dispatching can be cancelled via preDispatchSignal() (#929).
- Added batching (#870, #871).
- Optimised foreground execution in LocalDispatcher.
- Added per-node foreground execution overrides for LocalDispatcher (#927).
- Added support for module level config files.
#### UI
- SceneInspector improvements
- Added history tracebacks (#834).
- Added attribute inheritance diagramming (#206).
- Added value drag/drop (#830).
- Improved transform section (#896).
- Optimised by deferring updates during playback.
- Optimised by deferring updates when not directly visible.
- Fixed errors where the selected path doesn't exist.
#### Scene
- Fixed SceneWriter::hash() to include file path.
- Fixed SceneWriter when caching multiple time samples.
- Added support for coordinate systems.
#### API
- Fixed Fixed python bindings crash when passing None for a scene path.
- Added removeOnClose argument to Window.addChildWindow() method.
- Fixed EventLoop bug where exection was thrown if an idle callback was removed and re-added during the same idle event.
- Added hotspots to Pointer class.
- Refactored ExecutableNode API
- Removed "execution" prefix from method names.
- ExecutableNodes now execute() using the current Context. Multi-context execution can be accomplished using executeSequence( frames ) assuming the client only needs to vary the frame of the current Context. requiresSequenceExecution() can be defined by nodes with special needs (SceneWriter for example), to alert clients that sequence execution is more appropriate.
- Dispatcher::doDispatch() is now passed a DAG of TaskBatch nodes, simplifying the task of implementing more complex dispatchers.
- Fixed call sequence for GraphComponent::parentChanging(). When a child is being transferred from one parent to another, it is now called at a point where the child still has the original parent.
- Added ViewportGadget raster<->world space conversion methods.
- Added Handle::dragOffset() method.
#### Build
- Best used with 3delight version 11.0.96. This has bug fixes to support moving coordinate systems during IPR.
- Requires Cortex 9.0.0-a3.
# 0.99.0
#### 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
- Reimplemented as a hierarchy with a registration mechanism for custom sections (#36, #821).
- Improved diff formatting (#894).
- Improved numeric formatting and alignment.
- Added options section (#197).
- 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.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.
# 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 provided by 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.
# 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.
# 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
- Fixes 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.
# 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.
# 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.
# 0.92.1
#### Scene
- Improved shader assignment reporting in SceneInspector (#335)
- Improved shader handle generation
# 0.92.0
#### Core
- Made Plug flags serialisation more future proof (#684).
- Removed redundant serialisation of default values. This reduced file sizes by 25% and load times by nearly 20% for a large production script. Note that changing the default value for a plug or shader parameter now represents a backwards compatibility break with old scripts.
- Optimised python bindings, giving speedups in many areas, including file loading and shader generation.
- Removed parameter mapping from ObjectReader
- Fixed threading bugs in ObjectReader.
- Fixed bugs preventing expressions being used with filenames in ObjectReader.
#### UI
- Improved plug "Edit Input..." menu item. It now ensures that the input plug widget is directly visible on screen, whereas before it could only show the node editor for the input node.
- Prevented nodes from being created offscreen (#640).
- Exposed "enabled" plugs in a new Node Editor "Node" tab (#759).
- Fixed MessageWidget crashes encountered in Maya.
- Fixed bug preventing positioning of new nodes within backdrops (#769).
- Added workaround for PyQt/uuid crashes (#775).
- Added filtering so that DirNameParameter file browsers will only show directories and not files (#774).
- Fixes image viewer colour swatches when the image doesn't contain an alpha channel.
- Improved scene preview support to include .abc, .cob, and .pdc files (any files for which Cortex has a Reader implementation).
#### Scene
- Options and Attributes nodes now have sensible default values for their plugs.
#### Image
- Fixed bugs associated with negative display window origins.
- Fixed crash when creating ImageWriters with another image node selected (#681 #255).
#### Arnold
- Arnold shader names are now prefixed with "ai" within the node search menu, to aid finding them amongst the other nodes.
#### API
- Added Widget.reveal() method (#503).
- Added extend argument to NodeGraph.frame(). The default value of false behaves exactly as before - the specified set of nodes are framed in the viewport. A value of true still causes the nodes to be included in the framing, but in addition to the original contents of the frame.
- Properly implemented CompoundNumericPlugValueWidget.childPlugValueWidget().
- Removed MessageWidget.textWidget() method. The internal text widget should now be considered private. The currently displayed messages may be cleared using the new MessageWidget.clear() method.
- Removed deprecated MessageWidget.appendException() method.
- Added control over the default button to the OpDialogue. This controls whether the OK or Cancel button is focussed by default when displaying the Op. The default value is as before, focussing the OK button, but the value can be controlled either by user data in the Op or by passing an alternative argument to the OpDialogue constructor.
- Adopted new Python wrapping mechanism from Cortex.
- Fixed pollution of GafferUI namespace with IECore module.
- Added DirNameParameterValueWidget.
- PathPreviewWidget now respects registration order.
#### Build
- Requires Cortex 8.2.0.
# 0.91.0
#### Apps
- Fixed gui startup error in ocio.py.
#### Core
- Fixed copy/paste problems where inappropriate values would be copied for plugs with inputs, where the input was not in the selection being copied (#740).
#### UI
- Added a first implementation of an automatic node layout algorithm. This is available via the Edit/Arrange menu item (#638).
- Fixed image viewer data window display in the presence of an offset display window.
- Fixed TextGadget vertical bound. It was slightly different depending on the text contents, causing different nodes to appear with slightly different heights.
- Moved OSLObject and OSLImage shader inputs to the left of the node.
- Added message filtering to MessageWidget.
#### Scene
- Fixed AlembicSource refresh failure (#737).
- Fixed errors when AlembicSource filename is "".
#### RenderMan
- Added support for multiple types in RSL "coshaderType" annotation (#621).
#### OSL
- Added support for arbitrary image channels to the OSLImage node. The InChannel and InLayer shaders should be used to fetch channels and layers from the input image, and the OutChannel and OutLayer shaders may be used to write values to the output channels and layers. The Out* shaders should be plugged into an OutImage shader which is then plugged into the OSLImage node.
- Added support for arbitrary primitive variables to the OSLObject node. The InFloat, InColor, InNormal, InPoint and InVector shaders provide access to vertex primitive variables on the input primitive, and the corresponding Out* shaders
can be used to write values to the output primitive variables. The Out* shaders should be pluggined into an OutObject shader which is then plugged in to the OSLObject node.
- Added V3fVectorData support to OSLRenderer user data queries.
- Fixed dirty propagation through OSLShader closure outputs.
- Improved OSL processor shader input acceptance.
- Only accepts OSLShader nodes if they hold a surface shader, as other shader types can't be used directly.
- Also accepts Box and ShaderSwitch connections so that shaders can be connected indirectly.
- Revised shader naming convention to UpperCamelCase. The names of existing shaders have therefore changed.
#### API
- Moved OSLImage::shadingEngine() method to OSLShader::shadingEngine().
- Removed FormatPlugSerialiser from the public interface - it was not intended to be subclassed.
- Removed FormatBindings namespace and moved formatRepr() into the GafferImageBindings namespace.
- Switched formatRepr() signature to take a reference rather than a pointer.
- Added MessageWidget setMessageLevel() and getMessageLevel() methods.
# 0.90.0
#### Scene
- Fixed off-by-one error in scene cache preview frame ranges.
#### UI
- Fixed slight jump when connections are first drawn.
- Removed PathFilter paths plug representation in the NodeGraph. There aren't really any nodes we would connect to it.
- Improved OpDialogue warning display. If an Op completes successfully, but emits error or warning messages in the process, these will now always be flagged before the user can continue.
#### API
- Refactored ConnectionGadget into an abstract base class with a factory, to allow for the creation of custom subclasses. A new StandardConnectionGadget class contains the functionality of the old ConnectionGadget. Config files may register creation function for connections to control the type of gadget created, and its style etc.
- Added MessageWidget.messageCount() method. This returns the number of messages currently being displayed.
- Added OpDialogue.messageWidget() method. This provides access to the message display for the Op being executed.
- Added MessageWidget.forwardingMessageHandler(), to allow messages received by the widget to be propagated on to other handlers. This can be useful for connecting the OpDialogue to a centralised logging system.
- Deprecated MessageWidget appendMessage() and appendException() methods. The same result can be achieved by passing messages via the message handler instead.
# 0.89.0
#### Core
- Added Support for NumericPlug->BoolPlug and BoolPlug->NumericPlug connections.
#### UI
- Added additional types to the user plug creation menu.
- Added pre-selection highlighting in the NodeGraph (#94).
- Added "Create Expression..." menu option for bool plugs.
- Fixed NodeGraph resizing to crop rather than scale (#10).
- Fixed read only CompoundPlug labels.
- Added workarounds for Qt OpenGL problem on OS X (#404 and #396).
#### Scene
- Added Parent node. This allows one hierarchy to be parented into another (#91).
- Fixed bug which could cause incorrect bound computation at the parent node in the Instancer.
- Seeds and Instancer classes now preserve existing children of the parent location, renaming the new locations to avoid name clashes if necessary.
- Added tag filtering to the SceneReader node.
- Enabled input connections to PathFilter "paths" plug. This allows it to be promoted to box level and be driven by expressions etc (#704).
#### Apps
- Updated view app to contain tabs with different views (info, header, preview etc).
- Added scene cache previews to the browser and view apps (#416).
#### API
- Removed BranchCreator name plug - derived classes are now responsible for generating the entirety of their branch.
- Modified BranchCreator hashing slightly to improve performance - derived classes hashBranch*() methods are now responsible for calling the base class implementation.
- Fixed Box::canPromotePlug( readOnlyPlug ) to return false.
- Fixed Box::canPromotePlug() to check child plugs too.
- Fixed bug in read only Plugs with input connections.
- Added Gadget setHighlighted() and getHighlighted() methods.
- Added supportedExtensions() methods to ImageReader and SceneReader.
- Added Viewer.view() and Viewer.viewGadgetWidget() methods.
- Added NodeToolbar and StandardNodeToolbar classes.
#### Build
- Updated public build to use OpenEXR 2.1.
- Updated public build to use OpenImageIO 1.3.12.
- Updated public build to use OpenShadingLanguage 1.4.1.
- Removed pkg-config from the dependency requirements.
# 0.88.1
#### Core
- Added env app which mimics /usr/bin/env
- Enabled Python threading by default in Gaffer python module
#### UI
- Renaming is available for promoted children of CompoundDataPlugs
- Moved scene node filter plugs to the right hand side of the node
#### Image
- Fixed threading issue in Display node
# 0.88.0
#### Core
- Fixed threading issue in caching code.
- Implemented per-instance metadata for Box nodes. This will provide the basis for the user to make further customisations to Boxes, like setting descriptions for plugs and so on.
- Fixed bug in Switch node which could cause crashes when promoting the index plug.
- Added pivot to TransformPlug.
#### UI
- NodeGraph node tooltips now display a helpful description for the node. Node authors can define this text using the "description" Metadata entry (which is intended to provide a static description of the node's purpose) and the "summary" Metadata which may optionally be computed dynamically to describe the current state of the node (#157).
- Fixed initial value jump in viewer gamma/exposure virtual sliders.
- NodeGraph nodes may now display plugs on all sides, rather than just top/bottom or left/right as before. Node authors may control plug placement by defining a "nodeGadget:nodulePosition" Metadata entry.
- ShaderAssignment nodes now receive their shader input from the left (#82).
- Fixed OpDialogue hangs caused by the rapid output of many messages from an Op.
- Fixed strange browser behaviour when editing a path which is no longer valid (#64).
- Improved image viewer responsiveness, especially when used as a render viewer.
- Fixed position of plugs in the NodeGraph when the node gadget was very narrow.
- Made Box nodule positions match internal nodule positions (#608).
- Simplified OpDialogue error display - long error messages are now only visible in the Details view, rather than cluttering up the main window, and potentially making it very large on screen.
#### Scene
- Added a ParentConstraint node (#26).
- Added "includeRoot" plug to GafferScene::SubTree. This means that when choosing /path/to/theNewRoot as the root, the subtree will be output under /theNewRoot rather than /. Previously this was only possible by using an Isolate node followed by a Subtree (#565).
- Added "targetOffset" plug to the Constraint node. This is of most use for offsetting the aim point in the AimConstraint node (#278).
- Fixed bug in copying a node which has an input from an unselected PathFilter.
- Fixed bug in ShaderAssignment node which could cause crashes when querying for acceptable inputs.
- Improved the transform node
- Added a pivot plug (#156)
- Added a space plug to specify whether the transform is applied in World or Object space.
#### Image
- Fixed ImageReader problem which caused the green and blue channels of non-float images to be offset horizontally.
- Fixed bug which could cause the OpenColorIO node to output greyscale images.
- Optimised Display node.
- Optimised ChannelDataProcessor::channelEnabled().
#### OSL
- Updated for compatibility with OSL 1.3, 1.4 and 1.5 (master branch).
- Removed unsupported closures from OSLRenderer.
- Added debug() closure support to OSLRenderer to allow the output of multiple values via ShadingEngine::shade(). The closure takes an optional "type" keyword argument to define the type of the resulting output.
#### API
- Added GafferUI.SpacerGadget class.
- Reimplemented GafferUI.Metadata in C++, so it can be used from C++ code as well as from Python.
- Fixed bug in Widget.mousePosition() with GLWidget overlays.
- Fixed GafferScene.ScenePath.isValid() to only consider a path as valid if all parents up to the root exist according to ScenePlug.childNames().
- Added space conversion methods to GafferImage::Format. These are useful for converting between the Cortex and OpenEXR Y-down space to the Gaffer y-up space.
- Fixed GafferImage::FormatData serialisation.
- Removed deprecated ImageView( name, inputPlug ) constructor. This was being used by old View subclasses which would pass their own input plug and then use setPreprocessor() to insert some conversion network. Subclasses should now use insertConverter(), following the example in GafferImageUITest.ImageViewTest.testDeriving.
- Moved Metadata class from libGafferUI module to libGaffer.
#### Build
- Fixed compilation with GCC 4.4.
# 0.87.1
#### UI
- Constrained slider positions inside range by default (#99). Shift modifier allows slides to exceed range.
- Key modifiers are now correctly updated during drags.
- Fixed PySide incompatibility in Slider.
#### Image
- Added ImageSampler node to GafferImage
- Fixed colour space used for ImageView colour sampling (now in linear space).
# 0.87.0
#### UI
- Added visualisation of clipping colours in the image viewer (#572).
#### Core
- Boxes now export all non-hidden plugs for referencing. Prior to this they only exported "in", "out" and user plugs.
- Fixed unwanted plug promotion when nesting Boxes inside Boxes.
#### Scene
- Fixed Subtree update problem.
- Added enabling/disabling support to SceneTimeWarp and SceneContextVariables.
- Added a SceneSwitch node. This can be used to choose between different scene hierarchies.
- Added a ShaderSwitch node. This can be used to switch between different shaders being fed into a ShaderAssignment. It is also compatible with RenderMan coshaders, so can be used to switch between different coshaders in a network.
#### Image
- Added a Clamp node
- Fixed bug in Display node which caused problems when using multiple Displays at once.
- Added ImageTimeWarp, ImageContextVariables and ImageSwitch nodes - these are equivalent to their Scene module counterparts.
#### API
- Added missing IntrusivePtr typedefs to GafferImage
- Added RecursionPredicate to FilteredRecursiveChildIterator. This allows the definition of iterators which automatically prune the recursion based on some condition.
- Redefined RecursivePlugIterators so that they do not recurse into nested nodes - instead they just visit all the plugs of the parent node.
- Improved Node::plugSetSignal() behaviour. The signal is now emitted for all the outputs of the plug being set in addition to the source plug - otherwise plugSetSignal() could not be used effectively for plugs which had been promoted to Box level.
- Renamed SceneContextProcessorBase to SceneMixinBase.
#### Build
- Fixed build for Ubuntu 12.04.
- Updated public build to use Arnold 4.1.
- Removed OIIO versioning workaround - previously we had to rename the OIIO library to avoid conflicts with Arnold, but since Arnold 4.1 such conflicts no longer exist.
- Updated default boost version to 1.51.0.
- Added dependenciesPackage build target. This can be used to make a package of prebuilt dependencies to seed a build. from.
- Updated default Cortex version to 8.0.0b5.
# 0.86.0
#### UI
- Added exposure and gamma controls to the image viewer (#571).
- Added colourspace management to the image viewer (#573). By default display colourspaces are taken from the OCIO config, but any image processing node (or Box containing them) can be registered via config files to provide alternative methods of colour management.
- Added auto expand option to the scene viewer (#163).
- Added Shift+Down shortcut for full expansion in the scene viewer (#556).
- Added "look through camera" in the scene viewer (#49).
- Added global Left/Right keyboard shortcuts for frame increment/decrement (#52).
- Added background operation to op dialogues in the op and browser apps. The UI now remains responsive during execution and displays IECore messages and results (#591).
- Objects can now be dragged from the Viewer and SceneHierarchy into path fields such as the AimConstraint target or the StandardOptions camera.