G4P – part 6 – Node defaults

For this instalment in our ground-up series about integrating Gaffer into a pipeline, we cover how to change node defaults.

All Gaffer nodes have plugs, whether they are visible in the Graph Editor for easy connection, or in the Node Editor as settings. These plugs have default values defined by the node’s programming. It may be the case however, that these defaults aren’t the most useful values for your use. To help with this, Gaffer allows you to provide your own, “user” defaults.

TL;DR

Gaffer.Metadata.registerValue( <cls>, <plugPath>, "userDefault", <value> )
Gaffer.NodeAlgo.applyUserDefaults( node )

Registering user defaults

When a node is created from the Node Menu, Gaffer will apply any user defaults on top of the programmed default values for its plugs. User defaults are stored in Gaffer’s metadata system, and accessed using the Gaffer.Metadata API.

To define a new default value for a particular plug, register it under the userDefault key for the node class, additionally including the path to the plug like so:

Gaffer.Metadata.registerValue(
    GafferScene.Camera, "apertureAspectRatio",
    "userDefault", 1.77777777778
)

This changes the default aspect ratio for newly created cameras.

tip

Shaders need a different technique, as they are loaded through a common node such as ArnoldShader or ArnoldLight. Use the following pattern instead:

Gaffer.Metadata.registerValue(
"<renderer:type>:<shaderName>:<parameterName>",
"userDefault", <newDefaultValue>
)

eg, for an Arnold quad light’s intensity, it would be:
"ai:light:quad_light:intensity"

The most common place to do this is in a suitable startup script for the node’s module. Eg: GafferScene for the GafferScene.Camera node.

warning

Saved scripts don’t contain values for plugs set to their defaults. This means that changing the default value can change the results of existing scripts.

Special behaviour

The gaffer UI distinguishes node defaults and user defaults in a plugs context menu – allowing people to reset values to either one. But more generally, the plug logically has a single ‘default’, which will be the user one if specified, otherwise the programmed one.

Whether or not a plug is set to its default affects a couple of things:

  • Editor UIs for the plug will decorate plugs will non-default values with a little green star .
  • The value of the plug will not be stored in a saved/copied script if set to the default value.

DIY

Gaffer only applies user defaults when nodes are made in the UI, this is to help keep scripts and other pipeline tools stable, and unaffected user-local changes .

As such, when creating your own node instances, you need to apply the user defaults to it yourself, if you want it to behave like a node made by the user from the node menu:

myCamera = GafferScene.Camera()
Gaffer.NodeAlgo.applyUserDefaults( myCamera )

Useful links

Leave a Reply