Fixed SceneReader hashing, and made childNames hash constant.

The SceneReader::hash() method was lazily hashing in time for everything, regardless of whether it was even related to outPlug(). It now correctly implements the hash*() methods instead, but omits hashChildNames() because the hierarchy provided by SceneInterfaces is static over time. This shaves approximately 6% off the time to traverse 20 frames of an animated scene.
Added ValuePlug.cacheMemoryUsage() static method.
Optimised SceneReader by detecting non-animating properties.

This knocks about 30% off of the time to traverse a 20 frame test animation with a mixture of deforming and static geometry. It also reduces cache memory usage by some 60%. There is a small time overhead for single frame display, but that will be addressed in a future commit.
Optimised SceneReader::scene() for repeated access to the same scene.

This knocks 8% off the time taken to traverse a 20 frame test animation, and restores previous performance for traversing a single frame.
Added 'auto expand' mode to the scene viewer.

This is implemented with a "minimumExpansionDepth" plug on the SceneView class, which specifies a number of levels to always expand by, regardless of any other settings. Currently this is exposed simply as an on/off menu item in the viewer toolbar as Ben originally requested it. Also added menu items for the existing expand/collapse selection functionality, which should make the keyboard shortcuts a bit more discoverable even if the menu items aren't that convenient in themselves.

This continues the accumulation of nonsense into the SceneProcedural in support of viewer functionality, so I added a todo to remove all the nonsense when we find the time to have the viewer do its own conversion of the scene to OpenGL.

Fixes #163
Tidied up graphics file.

Some bizarre "spiro path" effects had snuck in, which made editing the paths very confusing, even if they looked alright to the eye.
Replaced duplicate code in SceneView with call to ScenePlug::stringToPath().
Added Shift+Down shortcut for full expansion in the scene viewer.

The logic for this is a little complicated, and the chances are high that we'll refactor this code in the future when the viewer does its own scene management, so I also added test cases to check that things work as expected in the new code and will continue to in the future. This also fixes one bug, where leaf level items were being marked as expanded, meaning that they'd require two presses of the Up key to get them to collapse.

Fixes #556.
Added a newline to keep GCC happy on Linux.
Refactored Timeline to use new Playback class.

The Playback class provides a central controller for all clients who wish to initiate playback or react when playback occurs. Playback classes exist for each Context so that different Editors can have different playback states if they also have different contexts. Signals on the Playback class can be used to be notified when the playback frame range changes or when playback starts or stops.

This also fixes the following bugs in the Timeline class :

- Wraparound during playback would remove the fractional part of the frame number.
- Entering a value in the frame field which was outside the frame range would make it impossible to subsequently enter a fractional frame number.
- Changing the frame number via the numeric field didn't update until focus left the field.
Optimised SceneHierarchy update for improved playback performance.

When I say optimised, I mean that SceneHierarchy update is now disabled completely during playback. It's incredibly unlikely that the hierarchy changes with time (although it is allowed), and during playback the user is far more interested in the contents of the Viewer than of the SceneHierarchy, so wasting time updating it can't be justified. A final update it performed when playback stopped, in case the hierarchy has changed in some way.

This change alone reduces the time to playback a 20 frame test animation by 75%. The improvement should be even greater in conjunction with the SceneReader optimisations currently being reviewed, because once they are merged, SceneHierarchy update would represent an even greater proportion of playback processing.
Merge pull request #664 from johnhaddon/sceneReaderOptimisation

Scene reader optimisation
Merge pull request #668 from johnhaddon/playback

SceneHierarchy playback optimisations
Merge pull request #671 from johnhaddon/viewerExpansion

Viewer expansion