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.