Houdini 22.0 Nodes Copernicus nodes

Paint 3D Copernicus node

Paint on a COP layer or UV-mapped geometry.

On this page
Since 22.0
This feature is still under development. The current functionality is unfinished and subject to change, and may have thin or no documentation. Please bear this in mind when using it.

Wire in either a COP layer or a geometry with a uv attribute to paint on. The canvas input layer serves as the background image on which paint is applied. If both uvgeo and canvas are wired in, canvas is still used as the background layer, but uvgeo provides the surface on which to visualize the painted texture and project brush strokes.

Work with this COP is typically done through its two GUI components: its panel and its viewer state. These components allow you to manipulate the higher-level objects this COP conceptually stores and processes: PaintLayers, the blend stack, brushes, and alphas.

Concepts

PaintLayers

A PaintLayer has a color image, an alpha image, and optionally a mask image. It is essentially a bundle of COP layers treated as a single layer. PaintLayers are stored and output by the node as 3 distinct COP layers, all with the same resolution and COP layer properties (same resolution, same display and data window). The color layer can have 1, 2, or 3 channels, referred to by their COP type names: Mono, UV, and RGB. In a sense, these are your “data” channels, because these channels aren’t given a particular meaning by this COP, aside from how you choose to blend them with other PaintLayers. Typically, the color layer stores actual color. The alpha and mask layer are both single-channel (Mono) COP layers.

All the node’s PaintLayers are returned by the layers node output, which is a COP cable. Since a COP cable stores COP wires and PaintLayers are a higher-level abstraction over COP layers, you see the individual underlying constituent COP layers in this cable as separate cable wires. The names of these wires stored in the cable are derived from the name of the PaintLayer, as stored in the blend stack: a layer named foo in the blend stack appears in the layers output cable as foo.color, foo.alpha, and an optional foo.mask entry. You may want to use Cable Unpack to extract individual wires from this cable.

Add PaintLayers by pressing the layer icon underneath the blend stack. To delete a range of layers in the blend stack, select the range and click Delete, or Delete All to delete all the PaintLayers in the blend stack. This brings the node back to its default state of outputting the canvas input with nothing blended onto it. You can also duplicate a range of layers by selecting it in the blend stack, and choosing Duplicate Selected.

PaintLayers are identified by their names so these must be unique. If you attempt to rename a PaintLayer to have the same name as another existing PaintLayer, they are disambiguated by a #<integer> discrimination suffix automatically appended to the name of the PaintLayer being renamed.

Note

Color and alpha are stored as separate COP layers, but color is stored premultiplied by the associated alpha layer. This is because premultiplied representation is used internally to evaluate the blend stack, combined with the fact that while it’s possible to create 1- and 2-channel color layers, there are no COP layer types that semantically represent Mono+Alpha or UV+Alpha, that would be interpreted correctly by nodes like Blend.

Note

A PaintLayer is simply these 3 COP layers. There is currently no support for painting geometries with multiple UV tiles (UDIMs). To work with such geometries, you may wish to split the geometry by UV tile, shift the UV coordinates into the 0-to-1 range, and use a separate Paint 3D node to paint textures for each UV tile.

Blend Stack

Displayed by the bottom-left widget in the panel, the blend stack is a description of how to blend together all the stored PaintLayers, along with the input canvas. It is a list of PaintLayers. In the blend stack widget, this list is visually ordered from bottom to top; lower layers come before higher layers. The canvas layer is displayed at the bottom of this list widget, although this visual entry is not a PaintLayer because it represents the live input to the node. The canvas does correspond to entries in the layers output, because it is not stored on the node. Each PaintLayer entry in the blend stack, along with its image contents, also defines a blend mode and an opacity. This describes how to blend it onto the accumulation of layers that come before it (below it).

Conceptually, this list of PaintLayers translates into a sequence of blend operations, that is, a chain of Blend COP nodes. Each Blend in the chain corresponds to a PaintLayer in the stack, and is invoked with:

  • mode parameter: The blend mode of the corresponding PaintLayer entry in the blend stack

  • mask parameter: The opacity of the corresponding PaintLayer entry in the blend stack

  • bg input: The result of the previous Blend node in the chain

  • fg input: The current PaintLayer’s color and alpha, combined

  • mask input: The current PaintLayer’s mask, if it has one (otherwise unwired)

For the initial Blend in the chain, the canvas input is used as the bg. If no canvas is wired, a default canvas is constructed using the COP network context settings. For the final Blend in the chain, the output is used as the paint output of this COP.

Note

Blend stack evaluation is the non-interactive function of this COP. When you are not interacting with the node through its viewer state or panel, the behavior of this node is essentially equivalent to the Blend chain described above.

Note

Regardless of the signature chosen for this node and regardless of the datatypes of the color images of the stored PaintLayers, the intermediate datatype passed through this conceptual chain of blend nodes is RGBA. After the chain is evaluated, if the node’s signature is Mono, UV, or RGB, the color is divided by the alpha to disassociate it. When the node’s signature is RGBA or Metadata, in both cases the output type is RGBA, so the result of the conceptual blend chain is output directly. As a consequence, the final alpha channel is always computed, but is only output for these two signatures.

It may sometimes be useful to collapse a range of layers in the blend stack into a single layer. To do this, select the range, and choose Merge Selected. This replaces the range with a single layer named “Merged”, with a blend mode of Over. The way this merged layer is produced is identical to how the node evaluates the entire blend stack, except only the selected range of PaintLayers is used to produce the conceptual Blend chain, and instead of the canvas layer being used as the initial value in the chain, a transparent color=(0,0,0), alpha=0 canvas is used instead. The properties of this ephemeral canvas are taken from the initial (bottom) layer being merged.

Brushes and Alphas

Three of the node’s viewer state tools are brushes: the Paint, Erase, and Smooth tools. Brush settings can be modified through the parameter dialog, while previewing their look using the brush and alpha preview images.

Pressing the Save Brush as Recipe or Save Alpha as Recipe button in the parameter dialog causes a “Save Brush” or “Save Alpha” dialog to open, allowing you to save the brush or alpha used by the current tool as a partial node preset recipe. An alpha recipe is a subset of a brush recipe, meaning brush recipes also contain all the parameters describing a brush’s alpha.

To load a saved recipe, click on either the brush or alpha preview image.

An alpha may be procedural (a circle or square with falloff) or a raster image. When painting with a procedural alpha, the alpha is sampled with infinite precision, and so the precision of the brush is only limited by the resolution of the writing layer. A raster image may be used as the alpha by loading it from a file path. When a brush or alpha recipe referencing such a raster image file is saved, the raster is embedded as a PNG inside the generated recipe HDA.

Note

The performance of brushes may be impacted by using an alpha with too high of a resolution.

Note

While the brush and alpha recipes generated by this button are partial node preset recipes, it is not possible to edit the parameters stored by these recipes through the recipe manager. This is because, in order for the same recipe to be applicable to all 3 brush tools (Paint, Erase, and Smooth), the recipes make use of recipe prescripts to dynamically populate the correct parameters upon application. This allows you to save a recipe for the Paint brush and load it into the Erase brush. Thus the intended workflow for modifying these recipes is loading them into an instance of Paint 3D, changing some parameters, and re-saving the recipe.

GUI

Panel

The panel allows you to modify the metadata of PaintLayers, the blend stack, and the settings of the viewerstate tools. It is split into three main sections:

Brush and Alpha Preview

These images show you what the current brush for the current tool looks like if you start painting. When the Sample or Fill tools are selected, because these tools are not brushes, the Paint tool’s preview is shown instead.

Clicking on either of these images opens a catalog window of all the saved recipes of the corresponding type. Picking a recipe from the catalog sets the relevant parameters on the node: picking a brush recipe sets all the parameters for the current brush tool, and picking an alpha recipe sets only the alpha parameters for the current brush.

Parameter dialog

All of the non-internal node parameters are shown here. This is a native parameter dialog widget, the same kind you can see normally by clicking the Show/Hide Parameters button in the toolbar of a Node Parameters pane. All of the parameters here control interactive behavior of the node. None of them affect the two node outputs that are meant to be used downstream: paint and layers. The only parameters that affect the paint and layers outputs are the blendtree and layers internal data parameters, which are typically manipulated through the blend stack widget.

See also: Parameters.

Viewer State

The viewer state lets you edit the contents of PaintLayers, and is therefore how you actually paint. It has five tools and exactly one of these is active at any time. Three of these tools are brushes (Paint, Erase, and Smooth), and two are discrete operations (Sample and Fill). Tools are used with a drag (or drawing tablet pen stroke), or in the case of Fill, just a click. The current tool is indicated in the top row of the HUD. With the default keybinds, the current tool can be changed in the viewer state with 1, 2, 3, 4, 5. It’s also possible to use the radial menu to change the current tool.

Note

Which tool is active is stored as the value of the tool parm tuple, which is actually a virtual parameter representing the currently open tab of the Tools parameter folder, in the parameter dialog. Because of this, it’s possible to switch tools by opening the desired tool’s tab, and the currently open tool tab always reflects what tool is currently active.

In addition to a current tool, a PaintLayer must also be selected for modification in order to paint. If the canvas is not selected in the blend stack widget, a PaintLayer is. This PaintLayer is called “the writing layer”, since any viewer state tool that modifies a layer only affects this one.

Finally, with a PaintLayer selected, you are either writing to its color and alpha, or its mask. This is determined by the Write to Mask parameter, and can be changed by clicking on the corresponding thumbnail in the blend stack. Clicking on the color thumbnail causes the color and alpha to be selected for writing, and clicking on the mask thumbnail causes the mask to be selected.

Brush Tools

There are three brush tools: Paint, Erase, and Smooth. In addition to changing between these tools with 1, 2, 3, the radial menu, or clicking open the corresponding tool tab in the parameter dialog, you can also temporarily switch to a different tool by holding down either ⇧ Shift to temporarily switch to the Smooth tool or ⌃ Ctrl to temporarily switch to the Erase tool. Temporarily switching tools uses all the parameters from that respective temporary tool.

For all three brush tools, strokes are divided into “stamps”. The placement of these stamps is handled exactly the same between the three brush tools: mouse events are processed by the viewer state and spaced out into evenly spaced “stamp transforms” according to the brush’s parameters (which can be saved and loaded as recipes). These tools only differ in what operation is applied for each stamp. Given a stamp transform,

  • the Paint tool adds more paint using the foreground color to the region. This increases the alpha value.

  • the Erase tool subtracts paint from the region, by decreasing the alpha.

  • the Smooth tool, for every stamp transform, uses the transform to rasterize the UV attribute of the given geometry, samples the writing layer mapped to the geometry at those UVs, blurs the resulting snapshot, and projects it back onto the writing layer. This is a significantly more expensive operation.

Note

Each stamp transform is a description of how to apply a brush stamp. It describes the local coordinate system of the stamp with respect to the world. The transformation between world-space and this local coordinate system is projective, and so can be orthographic or perspective.

  • When using Surface stroke alignment, the tangent plane and normal vector of the surface under the mouse is used to construct an orthographic stamp transform.

  • When using Screen stroke alignment, the projection of each stamp transform is derived from the viewport NDC-to-world transform, and so the projection type matches that of the viewport.

All three brush tools position their alpha image according to each stamp’s local coordinate system, to determine how the effect of the stamp varies across the paintable surface.

Sample Tool

This tool replaces the current foreground color with the color of the texture under the mouse. Either the writing layer or the blend result can be sampled, and which is used is determined by the Sample All Visible Layers parameter. When writing to a mask, the mask value is sampled instead and stored as the new foreground mask color.

Fill Tool

This tool floodfills a region of the writing layer with the foreground color. The region filled depends on the location pressed, the value of the color image at that location (or the mask image, if writing to a mask), and the fill threshold. Essentially, the floodfilled area extends as long as the currently traversed color is close enough to the color that was originally clicked.

Parameters

Signature

The canvas type. For a metadata or RGBA signature the type of the paint output is RGBA. For a metadata canvas, RGBA (0,0,0,0) is used as the canvas color. Otherwise, for the Mono, UV, and RGB signatures the type of the paint output is the same as that of the canvas input, and 1 is used as the input alpha value.

Group

A group expression selecting surface primitives to paint on. Only this region of uvgeo is paintable, as texels outside this group remain unmodified.

Hide Rest

Shows only the region of uvgeo in the specified group. When off, visualize the entire uvgeo, regardless of what “Group” is set to.

FG Color

The color currently used for writing to a PaintLayer’s color.

BG Color

An extra color that can be swapped with the foreground color in the viewer state. Swapping is bound to X by default in the viewer state.

FG Mask

The value currently used for writing to a PaintLayer’s mask.

BG Mask

An extra value that can be swapped with the foreground mask value in the viewer state. Swapping is bound to X by default in the viewer state.

Preferences

2D Paint Mode

Whether to ignore the input geometry for visualization purposes. This is a way to switch from painting directly on the input 3D geometry to the 2D texturemap. By default, it’s bound to F in the viewer state.

Stroke Alignment

How the stroke is positioned and oriented in 3D space while painting. Surface: A ray is repeatedly cast from the mouse position to the input geometry. Where it hits, a local coordinate system is constructed for each stamp, with the surface normal as Z, either the stroke direction or tangent vector most closely directed toward Up Direction as Y, and the cross product of these as X. Each stamp can thus be thought of as a rectangular prism centred on this local coordinate system, whose depth (along the Z axis) is determined by the Depth Falloff.

Screen: Stamps are positioned along the screen-space stroke. For each stamp, a local coordinate system is constructed, with either the stroke direction or screenspace “up” as Y, the screen-space orthogonal direction as X, and the direction from the viewport camera toward the mouse’s screenspace position as Z. Because there is no notion of depth, Depth Falloff doesn’t apply in this mode and each stamp can be thought of as a rectangular pyramid extending to infinity.

Only Write to Visible

When on and stroke alignment is set to Surface, only texels visible by the viewport camera can be affected by viewer state paint operations.

Only Write to Visible

When on and stroke alignment is set to Screen, only texels visible by the viewport camera can be affected by viewer state paint operations.

Use Lazy Mouse

Whether to use the viewer state’s lazy mouse feature. When on, instead of the brush cursor following the operating system pointer directly, it trails behind as if dragged by a string with a fixed length.

Lazy Mouse Radius

How far the brush cursor trails behind the OS pointer. This can be thought of as the length of the string attaching the brush cursor to the OS pointer, measured in viewport widths.

Write to Mask

Whether to write to the mask of the currently selected PaintLayer. This is typically toggled by clicking on either the color or mask thumbnail of a PaintLayer in the blend stack widget, in the Python panel.

Visualize Mask

Whether to visualize the mask of the writing layer. This shows the mask as a tinted overlay on top of the final blended texture. In the viewer state, this is bound to G by default.

Mask Tint

The color of the mask overlay used when Visualize Mask is on.

Mask Visibility

How visible the mask overlay is when Visualize Mask is on. To see only the mask, set this to 1.

When set to 1, you may also want to set Mask Tint to white (1,1,1).

Up Direction

When stroke alignment is Surface and Orient to is set to Up Direction, this is the direction toward which to orient the Y (up) axis of each stamp before any rotation (static or dynamic) is applied.

Symmetry

Tile Symmetry

When painting a COP layer, whether to make paint applied near the edges of the canvas wrap around to the other side.

Tile Symmetry

Visualize Tile Symmetry

When painting a COP layer, whether to replace the canvas with a 3-by-3 grid for the purpose of visualizing how painted features wrap around the border of the canvas.

Reflection

Turns on 3D reflection symmetry.

Reflection

Origin

The origin of the reflection plane.

Direction

The direction of the reflection plane.

Offset

The additional amount by which Origin is shifted along Direction.

Tools

Paint

Save Brush as Recipe

Save the current paint brush as a partial node preset recipe. The recipe becomes accessible as an entry in the Brush Catalog, which can be opened by clicking on the brush preview image in the Python panel.

Brush Radius

When stroke alignment is Surface, this is the current size of the paint brush cursor. This can be adjusted in the viewer state by ⌃ Ctrl + ⇧ Shift + drag or mouse wheel.

Brush Radius

When stroke alignment is Screen, this is the current size of the paint brush cursor. This can be adjusted in the viewer state by ⌃ Ctrl + ⇧ Shift + drag or mouse wheel.

Opacity

A final opacity multiplier for each independent paint stroke. A paint stroke, regardless of dynamics, can’t surpass this amount of alpha being added to the writing Paintlayer.

Flow

A multiplier for the amount flow used by the paint brush. Flow is the rate at which alpha is added to the writing PaintLayer.

Stroke Spacing

The space between adjacent stamps, measured in stroke widths. A value of 1 means stamps are touching end-to-end. A value of 0.5 means the left half of a stamp is completely overlapped by its left neighbor and its right half is completely overlapped by its right neighbor.

Adjust Flow to Compensate for Spacing

Adjusts the amount of flow to compensate for variable stroke spacing. When on, changing stroke spacing results in the overall alpha-applied-per-distance to remain constant, modulo quantisation due the starts and ends of stroke stamps.

Rotation

A constant amount of rotation to apply to every stamp transform, after its local coordinate system is constructed according to the current stroke alignment.

Orient to

When stroke alignment is Screen, this indicates whether to orient the stamp’s Y (up) axis along the stroke direction or to match the screen space “up” direction.

Orient to

When stroke alignment is Surface, this indicates whether to orient the stamp’s Y (up) axis along the stroke direction or toward the specified Up Direction parameter as closely as possible. With surface alignment, stamps are always placed tangent to the surface at the brush cursor, so in most cases the world space up direction can’t exactly be aligned to the stamp’s up direction. However, there is typically a surface tangent direction most closely aligned with the worldspace up direction, which is what we use as the stamp up direction.

Alpha

Save Alpha as Recipe

Save the current brush alpha as a node partial node preset recipe. If a raster image is being used as the current alpha, the saved partial node preset recipe HDA contains the raster image embedded as an HDA section to avoid the possibility of a brush recipe becoming unlinked from the image used to create it. If the current alpha is procedural (circle or square), a low resolution image is still saved as part of the preset recipe and is used as a thumbnail to display the recipe in the Alpha Catalogue.

Shape

What kind of alpha image to use.

File

The file in which the alpha image is stored.

Catalog File (hidden)

The HDA section in which an alpha image is stored, when a recipe is loaded from the asset catalogue.

Soft Edge

When using the Circle or Square alpha shapes, this is the amount of feathering around the edges of each stamp. This parameter is forwarded to Stamp Point’s Shape Falloff parameter.

Depth Falloff

When alignment is Surface, this is the amount by which each brush stamp extends in 3D space along its normal axis. When using Surface stroke alignment, for each brush stamp we construct a local coordinate system on the input geometry surface at the location of the brush cursor, using two surface tangents and the surface normal. Because the painted surface is typically not completely flat, we need a way to describe how much paint to apply to texels that don’t lie directly on the stamp plane. Thus we compute a “Z alpha”, a multiplier for the stamp’s alpha based on its distance to the stamp plane. This multiplier is computed as smoothstep(-z_falloff, 0, -abs(z_distance)). This parameter is forwarded to Stamp Point’s Z Falloff parameter.

Squish

The amount by which to shrink the alpha image along its horizontal axis. 0 means to leave unchanged. 1 means fully collapsed into a line with no area.

Flow Dynamics

Use Flow Dynamics

Whether flow is a dynamics output (driven by dynamics).

Distance Input

Use Distance

Whether to multiply the flow by a value based on the screen-space accumulated stroke distance.

Max Distance

The accumulated screen-space stroke distance (measured in viewport widths) at which this flow dynamics input multiplier reaches its final value. If Increase with Distance is on, that final value is 1. Otherwise, it is Min Flow Scale. Even when stroke alignment is Surface, the node measures the screen-space distance for this dynamics input.

Min Flow Scale

The minimum value of this flow dynamics input multiplier.

Increase with Distance

Whether this flow dynamics input multiplier increases or decreases as accumulated screens-space stroke distance increases. Min Flow Scale to 1, or 1 to Min Flow Scale.

Pressure Input

Use Pressure

Whether to multiply the flow by a value-based pen pressure.

Min Flow Scale

The minimum value of this flow dynamics input multiplier.

Increase with Pressure

Whether this flow dynamics input multiplier increases or decreases as pen pressure increases. Min Flow Scale to 1, or 1 to Min Flow Scale.

Random Input

Use Random

Whether to scale the flow of each brush stamp by a random amount.

Random Scale

The amount by which each brush stamp’s flow is randomised. 0 means no randomisation. A value of x means that each stamp’s flow is multiplied by a number uniformly randomly selected between 1-x and 1+x. If the final flow surpasses 1, a flow of 1 is used instead.

Speed Input

Use Speed

Whether to scale the flow by a value based on the current stroke speed.

Max Speed

The speed (measured in viewport widths/second) at which this flow dynamics input multiplier reaches its final value. If Increase with Speed is on, that final value is 1. Otherwise, it is Min Flow Scale. Even when stroke alignment is Surface, the node measures screen-space distance for this dynamics input.

Min Flow Scale

The minimum value of this flow dynamics input multiplier.

Increase with Speed

Whether this flow dynamics input multiplier increases or decreases as speed increases. Min Flow Scale to 1, or 1 to Min Flow Scale.

Radius Dynamics

Use Radius Dynamics

Whether brush radius is a dynamics output (driven by dynamics).

Distance Input

Use Distance

Whether to multiply the radius by a value based on the screen-space accumulated stroke distance.

Max Distance

The accumulated screen-space stroke distance (measured in viewport widths) at which this radius dynamics input multiplier reaches its final value. If Increase with Distance is on, that final value is 1. Otherwise, it is Min Radius Scale. Even when stroke alignment is Surface, the node measures screen-space distance for this dynamics input.

Min Radius Scale

The minimum value of this radius dynamics input multiplier.

Increase with Distance

Whether this radius dynamics input multiplier increases or decreases as accumulated screens-space stroke distance increases. Min Radius Scale to 1, or 1 to Min Radius Scale.

Pressure Input

Use Pressure

Whether to multiply the radius by a value-based pen pressure.

Min Radius Scale

The minimum value of this radius dynamics input multiplier.

Increase with Pressure

Whether this radius dynamics input multiplier increases or decreases as pen pressure increases. Min Radius Scale to 1, or 1 to Min Radius Scale.

Random Input

Use Random

Whether to scale the radius of each brush stamp by a random amount.

Random Scale

The amount by which each brush stamp’s radius is randomised. 0 means no randomisation. A value of x means that each stamp’s radius is multiplied by a number uniformly randomly selected between 1-x and 1+x.

Speed Input

Use Speed

Whether to scale the radius by a value based on the current stroke speed.

Max Speed

The speed (measured in viewport widths/second) at which this radius dynamics input multiplier reaches its final value. If Increase with Speed is on, that final value is 1. Otherwise, it is Min Radius Scale. Even when stroke alignment is Surface, we measure screen-space distance for this dynamics input.

Min Radius Scale

The minimum value of this radius dynamics input multiplier.

Increase with Speed

Whether this radius dynamics input multiplier increases or decreases as speed increases. Min Radius Scale to 1, or 1 to Min Radius Scale.

Rotation Dynamics

Use Rotation Dynamics

Whether rotation is a dynamics output (driven by dynamics).

Use Distance

Whether to add a value to the brush’s rotation based on the screen-space accumulated stroke distance.

Turns per Distance

The count of turns to add to the brush’s rotation for every viewport-width of accumulated stroke distance.

Use Pressure

Whether to add a value to the brush’s rotation based on pen pressure.

Turns at Full Pressure

The count of turns to add to the brush’s rotation at full pen pressure. Rotation is unchanged at minimal pen pressure.

Use Random

Whether to rotate every brush stamp by a random amount.

Random Offset

The amount by which to randomly rotate every brush stamp. A value of x means that each stamp is rotated by a value uniformly randomly selected between -x/2 and x/2.

Use Speed

Whether to add a value to the brush’s rotation based on the screen-space stroke speed.

Turns per Speed

The count of turns to add to the brush’s rotation for every viewport-width-per-second of stroke speed.

Erase

Save Brush as Recipe

Save the current erase brush as a partial node preset recipe. The recipe becomes accessible as an entry in the Brush Catalogue, which can be opened by clicking on the brush preview image in the Python panel.

Brush Radius

When stroke alignment is Surface, this is the current size of the erase brush cursor. This can be adjusted in the viewer state by ⌃ Ctrl + ⇧ Shift + drag or mouse wheel.

Brush Radius

When stroke alignment is Screen, this is the current size of the erase brush cursor. This can be adjusted in the viewer state by ⌃ Ctrl + ⇧ Shift + drag or mouse wheel.

Opacity

A final opacity multiplier for each independent erase stroke. An erase stroke, regardless of dynamics, can’t surpass this amount of alpha being added to the writing Paintlayer.

Flow

A multiplier for the amount flow used by the erase brush. Flow is the rate at which alpha is removed from the writing PaintLayer.

Stroke Spacing

The space between adjacent stamps, measured in stroke widths. A value of 1 here means stamps are touching end-to-end. A value of 0.5 means the left half of a stamp is completely overlapped by its left neighbor, and its right half is completely overlapped by its right neighbor.

Adjust Flow to Compensate for Spacing

Whether to adjust the amount of flow to compensate for variable stroke spacing. When on, changing stroke spacing results in the overall alpha-applied-per-distance to remain constant, modulo quantisation due the starts and ends of stroke stamps.

Rotation

A constant amount of rotation to apply to every stamp transform after its local coordinate system is constructed according to the current stroke alignment.

Orient to

When stroke alignment is Screen, this indicates whether to orient the stamp’s Y (up) axis along the stroke direction or to match the screen space “up” direction.

Orient to

When stroke alignment is Surface, this indicates whether to orient the stamp’s Y (up) axis along the stroke direction or toward the specified Up Direction parameter as closely as possible. With surface alignment, stamps are always placed tangent to the surface at the brush cursor, so in most cases the world space up direction can’t exactly be aligned to the stamp’s up direction. However, there is typically a surface tangent direction most closely aligned with the worldspace up direction that’s used as the stamp up direction.

Alpha

Save Alpha as Recipe

Save the current brush alpha as a node partial node preset recipe. If a raster image is being used as the current alpha, the saved partial node preset recipe HDA contains the raster image embedded as an HDA section to avoid the possibility of a brush recipe becoming unlinked from the image used to create it. If the current alpha is procedural (circle or square), a low resolution image is still saved as part of the preset recipe and is used as a thumbnail to display the recipe in the Alpha Catalogue.

Shape

The kind of alpha image to use.

File

The file in which the alpha image is stored.

Catalog File (hidden)

The HDA section in which an alpha image is stored when a recipe is loaded from the asset catalogue.

Soft Edge

When using the Circle or Square alpha shapes, this is the amount of feathering around the edges of each stamp. This parameter is forwarded to Stamp Point’s Shape Falloff parameter.

Depth Falloff

When alignment is Surface, this is the amount by which each brush stamp extends in 3D space along its normal axis. When using Surface stroke alignment, for each brush stamp the node constructs a local coordinate system on the input geometry surface at the location of the brush cursor, using two surface tangents and the surface normal. Since the erased surface is typically not completely flat, the node computes a “Z alpha” as a multiplier for the stamp’s alpha based on its distance to the stamp plane. This multiplier is computed as smoothstep(-z_falloff, 0, -abs(z_distance)). This parameter is forwarded to Stamp Point’s Z Falloff parameter.

Squish

The amount by which to shrink the alpha image along its horizontal axis. 0 means to leave unchanged. 1 means fully collapsed into a line with no area.

Flow Dynamics

Use Flow Dynamics

Whether flow is a dynamics output (driven by dynamics).

Distance Input

Use Distance

Whether to multiply the flow by a value based on the screen-space accumulated stroke distance.

Max Distance

The accumulated screen-space stroke distance (measured in viewport widths) at which this flow dynamics input multiplier reaches its final value. If Increase with Distance is on, that final value is 1. Otherwise, it is Min Flow Scale. Even when stroke alignment is Surface, the ndoe measures screen-space distance for this dynamics input.

Min Flow Scale

The minimum value of this flow dynamics input multiplier.

Increase with Distance

Whether this flow dynamics input multiplier increases or decreases as accumulated screens-space stroke distance increases. Min Flow Scale to 1, or 1 to Min Flow Scale.

Pressure Input

Use Pressure

Whether to multiply the flow by a value-based pen pressure.

Min Flow Scale

The minimum value of this flow dynamics input multiplier.

Increase with Pressure

Whether this flow dynamics input multiplier increases or decreases as pen pressure increases. Min Flow Scale to 1, or 1 to Min Flow Scale.

Random Input

Use Random

Whether to scale the flow of each brush stamp by a random amount.

Random Scale

The amount by which each brush stamp’s flow is randomised. 0 means no randomisation. A value of x means that each stamp’s flow is multiplied by a number uniformly randomly selected between 1-x and 1+x. If the final flow surpasses 1, a flow of 1 is used instead.

Speed Input

Use Speed

Whether to scale the flow by a value based on the current stroke speed.

Max Speed

The speed (measured in viewport widths/second) at which this flow dynamics input multiplier reaches its final value. If Increase with Speed is on, that final value is 1. Otherwise, it is Min Flow Scale. Even when stroke alignment is Surface, the node measures screen-space distance for this dynamics input.

Min Flow Scale

The minimum value of this flow dynamics input multiplier.

Increase with Speed

Whether this flow dynamics input multiplier increases or decreases as speed increases. Min Flow Scale to 1, or 1 to Min Flow Scale.

Radius Dynamics

Use Radius Dynamics

Whether brush radius is a dynamics output (driven by dynamics).

Distance Input

Use Distance

Whether to multiply the radius by a value based on the screen-space accumulated stroke distance.

Max Distance

The accumulated screen-space stroke distance (measured in viewport widths) at which this radius dynamics input multiplier reaches its final value. If Increase with Distance is on, that final value is 1. Otherwise, it is Min Radius Scale. Even when stroke alignment is Surface, we measure screen-space distance for this dynamics input.

Min Radius Scale

The minimum value of this radius dynamics input multiplier.

Increase with Distance

Whether this radius dynamics input multiplier increases or decreases as accumulated screens-space stroke distance increases. Min Radius Scale to 1, or 1 to Min Radius Scale.

Pressure Input

Use Pressure

Whether to multiply the radius by a value-based pen pressure.

Min Radius Scale

The minimum value of this radius dynamics input multiplier.

Increase with Pressure

Whether this radius dynamics input multiplier increases or decreases as pen pressure increases. Min Radius Scale to 1, or 1 to Min Radius Scale.

Random Input

Use Random

Whether to scale the radius of each brush stamp by a random amount.

Random Scale

The amount by which each brush stamp’s radius is randomised. 0 means no randomisation. A value of x means that each stamp’s radius is multiplied by a number uniformly randomly selected between 1-x and 1+x.

Speed Input

Use Speed

Whether to scale the radius by a value based on the current stroke speed.

Max Speed

The speed (measured in viewport widths/second) at which this radius dynamics input multiplier reaches its final value. If Increase with Speed is on, that final value is 1. Otherwise, it is Min Radius Scale. Even when stroke alignment is Surface, we measure screen-space distance for this dynamics input.

Min Radius Scale

The minimum value of this radius dynamics input multiplier.

Increase with Speed

Whether this radius dynamics input multiplier increases or decreases as speed increases. Min Radius Scale to 1, or 1 to Min Radius Scale.

Rotation Dynamics

Use Rotation Dynamics

Whether rotation is a dynamics output (driven by dynamics).

Use Distance

Whether to add a value to the brush’s rotation based on the screen-space accumulated stroke distance.

Turns per Distance

The count of turns to add to the brush’s rotation for every viewport-width of accumulated stroke distance.

Use Pressure

Whether to add a value to the brush’s rotation based on pen pressure.

Turns at Full Pressure

The count of turns to add to the brush’s rotation at full pen pressure. Rotation is unchanged at minimal pen pressure.

Use Random

Whether to rotate every brush stamp by a random amount.

Random Offset

The amount by which to randomly rotate every brush stamp. A value of x means that each stamp is rotated by a value uniformly randomly selected between -x/2 and x/2.

Use Speed

Whether to add a value to the brush’s rotation based on the screen-space stroke speed.

Turns per Speed

The count of turns to add to the brush’s rotation for every viewport-width-per-second of stroke speed.

Smooth

Save Brush as Recipe

Save the current smooth brush as a partial node preset recipe. The recipe becomes accessible as an entry in the Brush Catalog, which can be opened by clicking on the brush preview image in the Python panel.

Brush Radius

When stroke alignment is Surface, this is the current size of the smooth brush cursor. This can be adjusted in the viewer state by ⌃ Ctrl + ⇧ Shift + drag or mouse wheel.

Brush Radius

When stroke alignment is Screen, this is the current size of the smooth brush cursor. This can be adjusted in the viewer state by ⌃ Ctrl + ⇧ Shift + drag or mouse wheel.

Flow

A multiplier for the amount flow used by the smooth brush. For the smooth brush, “flow” is interpreted as is the amount by which the writing PaintLayer is locally blurred at the brush cursor.

Stroke Spacing

The space between adjacent stamps, measured in stroke widths. A value of 1 here means stamps are touching end-to-end. A value of 0.5 means the left half a stamp is completely overlapped by its left neighbor, and its right half is completely overlapped by its right neighbor.

Adjust Flow to Compensate for Spacing

Whether to adjust the amount of flow to compensate for variable stroke spacing. When on, changing stroke spacing results in the overall alpha-applied-per-distance to remain constant, modulo quantisation due the starts and ends of stroke stamps.

Rotation

A constant amount of rotation to apply to every stamp transform after its local coordinate system is constructed according to the current stroke alignment.

Orient to

When stroke alignment is Screen, this indicates whether to orient the stamp’s Y (up) axis along the stroke direction or to match the screen space “up” direction.

Orient to

When stroke alignment is Surface, this indicates whether to orient the stamp’s Y (up) axis along the stroke direction or toward the specified Up Direction parameter as closely as possible. With surface alignment, stamps are always placed tangent to the surface at the brush cursor, so in most cases the world space up direction can’t exactly be aligned to the stamp’s up direction. However, there is typically a surface tangent direction most closely aligned with the worldspace up direction that’s used as the stamp up direction.

Alpha

Save Alpha as Recipe

Save the current brush alpha as a node partial node preset recipe. If a raster image is being used as the current alpha, the saved partial node preset recipe HDA contains the raster image embedded as an HDA section to avoid the possibility of a brush recipe becoming unlinked from the image used to create it. If the current alpha is procedural (circle or square), a low resolution image is still saved as part of the preset recipe and is used as a thumbnail to display the recipe in the Alpha Catalogue.

Shape

The kind of alpha image to use.

File

The file in which the alpha image is stored.

Catalog File (hidden)

The HDA section in which an alpha image is stored when a recipe is loaded from the asset catalogue.

Soft Edge

When using the Circle or Square alpha shapes, this is the amount of feathering around the edges of each stamp.

Depth Falloff

When alignment is Surface, this is the amount by which each brush stamp extends in 3D space along its normal axis. When using Surface stroke alignment, for each brush stamp the node constructs a local coordinate system on the input geometry surface at the location of the brush cursor, using two surface tangents and the surface normal. Since the erased surface is typically not completely flat, the node computes a “Z alpha” as a multiplier for the stamp’s alpha based on its distance to the stamp plane. This multiplier is computed as smoothstep(-z_falloff, 0, -abs(z_distance)).

Squish

The amount by which to shrink the alpha image along its horizontal axis. 0 means to leave unchanged. 1 means fully collapsed into a line with no area.

Flow Dynamics

Use Flow Dynamics

Whether flow is a dynamics output (driven by dynamics). For the smooth brush, flow is interpreted as the local blur radius.

Distance Input

Use Distance

Whether to multiply the flow by a value based on the screen-space accumulated stroke distance.

Max Distance

The accumulated screen-space stroke distance (measured in viewport widths) at which this flow dynamics input multiplier reaches its final value. If Increase with Distance is on, that final value is 1. Otherwise, it is Min Flow Scale. Even when stroke alignment is Surface, we measure screen-space distance for this dynamics input.

Min Flow Scale

The minimum value of this flow dynamics input multiplier.

Increase with Distance

Whether this flow dynamics input multiplier increases or decreases as accumulated screens-space stroke distance increases. Min Flow Scale to 1, or 1 to Min Flow Scale.

Pressure Input

Use Pressure

Whether to multiply the flow by a value-based pen pressure.

Min Flow Scale

The minimum value of this flow dynamics input multiplier.

Increase with Pressure

Whether this flow dynamics input multiplier increases or decreases as pen pressure increases. Min Flow Scale to 1, or 1 to Min Flow Scale.

Random Input

Use Random

Whether to scale the flow of each brush stamp by a random amount.

Random Scale

The amount by which each brush stamp’s flow is randomised. 0 means no randomisation. A value of x means that each stamp’s flow is multiplied by a number uniformly randomly selected between 1-x and 1+x. If the final flow surpasses 1, a flow of 1 is used instead.

Speed Input

Use Speed

Whether to scale the flow by a value based on the current stroke speed.

Max Speed

The speed (measured in viewport widths/second) at which this flow dynamics input multiplier reaches its final value. If Increase with Speed is on, that final value is 1. Otherwise, it is Min Flow Scale. Even when stroke alignment is Surface, the node measures screen-space distance for this dynamics input.

Min Flow Scale

The minimum value of this flow dynamics input multiplier.

Increase with Speed

Whether this flow dynamics input multiplier increases or decreases as speed increases. Min Flow Scale to 1, or 1 to Min Flow Scale.

Radius Dynamics

Use Radius Dynamics

Whether brush radius is a dynamics output (driven by dynamics).

Distance Input

Use Distance

Whether to multiply the radius by a value based on the screen-space accumulated stroke distance.

Max Distance

The accumulated screen-space stroke distance (measured in viewport widths) at which this radius dynamics input multiplier reaches its final value. If Increase with Distance is on, that final value is 1. Otherwise, it is Min Radius Scale. Even when stroke alignment is Surface, we measure screen-space distance for this dynamics input.

Min Radius Scale

The minimum value of this radius dynamics input multiplier.

Increase with Distance

Whether this radius dynamics input multiplier increases or decreases as accumulated screens-space stroke distance increases. Min Radius Scale to 1, or 1 to Min Radius Scale.

Pressure Input

Use Pressure

Whether to multiply the radius by a value-based pen pressure.

Min Radius Scale

The minimum value of this radius dynamics input multiplier.

Increase with Pressure

Whether this radius dynamics input multiplier increases or decreases as pen pressure increases. Min Radius Scale to 1, or 1 to Min Radius Scale.

Random Input

Use Random

Whether to scale the radius of each brush stamp by a random amount.

Random Scale

The amount by which each brush stamp’s radius is randomised. 0 means no randomisation. A value of x means that each stamp’s radius is multiplied by a number uniformly randomly selected between 1-x and 1+x.

Speed Input

Use Speed

Whether to scale the radius by a value based on the current stroke speed.

Max Speed

The speed (measured in viewport widths/second) at which this radius dynamics input multiplier reaches its final value. If Increase with Speed is on, that final value is 1. Otherwise, it is Min Radius Scale. Even when stroke alignment is Surface, the node measures screen-space distance for this dynamics input.

Min Radius Scale

The minimum value of this radius dynamics input multiplier.

Increase with Speed

Whether this radius dynamics input multiplier increases or decreases as speed increases. Min Radius Scale to 1, or 1 to Min Radius Scale.

Rotation Dynamics

Use Rotation Dynamics

Whether rotation is a dynamics output (driven by dynamics).

Use Distance

Whether to add a value to the brush’s rotation based on the screen-space accumulated stroke distance.

Turns per Distance

The count of turns to add to the brush’s rotation for every viewport-width of accumulated stroke distance.

Use Pressure

Whether to add a value to the brush’s rotation based on pen pressure.

Turns at Full Pressure

The count of turns to add to the brush’s rotation at full pen pressure. Rotation is unchanged at minimal pen pressure.

Use Random

Whether to rotate every brush stamp by a random amount.

Random Offset

The amount by which to randomly rotate every brush stamp. A value of x means that each stamp is rotated by a value uniformly randomly selected between -x/2 and x/2.

Use Speed

Whether to add a value to the brush’s rotation based on the screen-space stroke speed.

Turns per Speed

The count of turns to add to the brush’s rotation for every viewport-width-per-second of stroke speed.

Sample

Sample All Visible Layers

When on, the Sample tool samples the result of evaluating the full blend stack, to store as the new foreground color. When off, only the writing layer is sampled.

Fill

Sample All Visible Layers

When on, the Fill tool uses the result of evaluating the full blend stack to determine which texels to floodfill based on the provided Threshold. When off, only the writing layer is used to determine the floodfilled area.

Opacity

The fill operation applies a color to a group of flooded texels. It applies this color by performing an “over” blend, with this parameter’s value as the opacity.

Threshold

The maximum distance in Euclidean RGB-space at which floodfill proceeds from the color of the texel clicked on in the viewer state to every texel traversed while flood filling. Because the maximum distance between colors in an RGB cube is sqrt(3), this parameter is multiplied by this value to normalize the parameter to a [0,1] range. For example, if in the viewer state a red (1,0,0) texel is clicked and this parameter is set to x, floodfill proceeds so long as it can traverse texels whose color satisfies |(1,0,0) - (r,g,b)|_2 <= x/sqrt(3). This parameter is forwarded to Segment by Connectivity’s Threshold parameter.

To fill the entire writing layer with a single color, set this to 1 to ensure all texels get flooded.

Inputs

canvas

The layer onto which every layer in the blend stack is repeatedly blended onto. See the blend stack for more information. This input is the initial conceptual Blend COP node’s bg input, or, if the blend stack is empty, this input is forwarded straight to the paint output unchanged. If no canvas is provided, a blank canvas is used instead. For the Mono, UV, and RGB signatures, a black color = (0,0,0), alpha = 1 canvas is used by default. For the Metadata and RGBA signatures, a transparent color = (0,0,0), alpha = 0 canvas is used by default.

uvgeo

A UV-mapped geometry to paint on. This is output as visgeo with the paint output applied as its base color for visualization. The final alpha value is also applied as this geometry’s opacity.

Outputs

paint

The result of evaluating the blend stack by repeatedly blending each PaintLayer onto the accumulation of layers occuring before it. The initial accumulation is the canvas node input. In the blend stack widget, layers further down come before layers higher up, so blending proceeds “up” the stack.

visgeo

A geometry for visualizing the result of evaluating the blend stack, as paint is applied in the viewer state.

layers

A COP cable containing the PaintLayers shown in the blend stack widget. Each PaintLayer consists of two or three COP layers: a color, an alpha, and an optional mask layer. If a PaintLayer is named foo, it appears in this output as a Mono, UV, or RGB foo.color layer, a Mono foo.alpha layer, and an optional Mono foo.mask layer.

Note

visgeo is meant to be displayed while in the node’s viewer state, and paint and layers are meant to be used downstream in the network.

See also

Copernicus nodes