0.18.0.0

This release brings a number of updates to GafferImage, including user-editable Formats, bug fixes to Resize and Crop, and a new Offset node. It also fixes a few bugs todo with Expressions, Switches, and UI crashes.

Core

  • Node::userPlug() is now a Plug instead of a CompoundPlug.
  • Preventing unwanted child connection tracking on userPlug().
  • Changed scriptNode() to return this when node is a ScriptNode.
  • Support indirect connections to Switch index
    • Emitting Node::plugInputChangedSignal() for all downstream connections.
  • Expressions don’t let __in plug track child inputs.
  • Added top level plug argument to Expression::Engine::apply().
  • PythonExpressionEngine drives apply() by plug type not data type.
  • PythonExpressionEngine supports arbitrary compound plugs types.
  • Improved PythonExpressionEngine::defaultExpression().
  • Fixed a bug in plugs/nodesWithMetadata.
  • Fixed errors when serialising parent metadata only.
  • Reference/Box no longer export user plugs (#801).

UI

  • Skipping intermediate dots in tooltips.
  • Fixed crash in the GraphGadget when a non-nodule plug was removed from a node.
  • Improved UI robustness for errors on enabledPlug() expressions.
  • Fixed potential connection lifetime bugs in the Viewer.

Image

  • Added AtomicFormatPlug and replaced all non-user facing FormatPlugs with this.
    • This plug does not perform default format substitutions.
    • This plug does not serialise registered Formats.
  • Changed FormatPlug to be a user-editable Format specification
    • Using FormatPlug in all user facing scenarios (e.g. Constant, Resize, etc).
  • Deprecated Reformat. Use Resize instead.
  • Moved default Format mechanism onto FormatPlug.
  • Fixed default Format issues inside boxes (#888).
  • Fixed nodes which were unusable if no default format was specified in the context (#888).
    • We now fall back to a default default format in that case.
  • The default format was not getting transferred to the script context after loading (#888).
  • Rationalised and simplified the Format registry.
    • Fixed registerFormat() so that a second registration overrides the first.
    • Requiring name when registering a format.
    • Names should no longer include the numeric values.
    • Renamed removeFormat() to deregisterFormat().
    • Removed unused signals and not-so-useful methods.
    • Separated registered names and ostream output.
      • The ostream output just uses numeric values, keeping it in line with the Imath classes.
      • Querying the registered name for a format returns an empty string if it hasn’t been registered. Previously it returned a generated name, making it hard to tell if it had actually been registered or not.
  • FormatPlugValueWidget supports manual entry of custom formats.
    • This widget only supports FormatPlugs, not AtomicFormatPlugs.
  • ImageStats now uses a postCreate to set plug values via the UI only.
  • Renamed CropUI.postCreateCrop to CropUI.postCreate.
  • Fixed Resize disabling.
  • Add Offset node.
  • Fixed bug in Crop::affects().
  • Added Crop “resetOrigin” plug.
    • This resets the origin of the format back to [0,0], which is intuitively what is expected.

Incompatibilities

  • Changed type of Node::userPlug()
  • Moved default Format API from Format class onto FormatPlug class.
  • Changed Format registry API.
  • Crop now resets the display window origin to 0,0. Turn off the “resetOrigin” plug for the old behaviour.
  • Renamed CropUI.postCreateCrop to CropUI.postCreate.