SeExprSimple node

This documentation is for version 2.0 of SeExprSimple.

Description

Use the SeExpr expression language (by Walt Disney Animation Studios) to process images.

What is SeExpr?

SeExpr is a very simple mathematical expression language used in graphics software (RenderMan, Maya, Mudbox, Yeti).

See the SeExpr Home Page and SeExpr Language Documentation for more information.

SeExpr is licensed under the Apache License, Version 2.0, and is Copyright Disney Enterprises, Inc.

SeExpr vs. SeExprSimple

The SeExpr plugin comes in two versions:

  • SeExpr has a single vector expression for the color channels, and a scalar expression for the alpha channel. The source color is accessed through the Csvector, and alpha through the As scalar, as specified in the original SeExpr language.
  • SeExprSimple has one scalar expression per channel, and the source channels may also be accessed through scalars (r, g, b, a).

SeExpr extensions

A few pre-defined variables and functions were added to the language for filtering and blending several input images.

The following pre-defined variables can be used in the script:

  • x: X coordinate (in pixel units) of the pixel to render.
  • y: Y coordinate (in pixel units) of the pixel to render.
  • u: X coordinate (normalized in the [0,1] range) of the output pixel to render.
  • v: Y coordinate (normalized in the [0,1] range) of the output pixel to render.
  • sx, sy: Scale at which the image is being rendered. Depending on the zoom level of the viewer, the image might be rendered at a lower scale than usual. This parameter is useful when producing spatial effects that need to be invariant to the pixel scale, especially when using X and Y coordinates. (0.5,0.5) means that the image is being rendered at half of its original size.
  • par: The pixel aspect ratio.
  • cx, cy: Shortcuts for (x + 0.5)/par/sx and (y + 0.5)/sy, i.e. the canonical coordinates of the current pixel.
  • frame: Current frame being rendered
  • SeExprSimple only: r, g, b, a: RGBA channels (scalar) of the image from input 1.
  • SeExprSimple only: rN, gN, bN, aN: RGBA channels (scalar) of the image from input N, e.g. r2 and a2 are red and alpha channels from input 2.
  • Cs, As: Color (RGB vector) and alpha (scalar) of the image from input 1.
  • CsN, AsN: Color (RGB vector) and alpha (scalar) of the image from input N, e.g. Cs2 and As2 for input 2.
  • output_width, output_height: Dimensions of the output image being rendered.
  • input_width, input_height: Dimensions of image from input 1, in pixels.
  • input_widthN, input_heightN: Dimensions of image from input N, e.g. input_width2 and input_height2 for input 2.

The following additional functions are available:

  • color cpixel(int i, int f, float x, float y, int interp = 0): interpolates the color from input i at the pixel position (x,y) in the image, at frame f.
  • float apixel(int i, int f, float x, float y, int interp = 0): interpolates the alpha from input i at the pixel position (x,y) in the image, at frame f.

The pixel position of the center of the bottom-left pixel is (0., 0.).

The first input has index i=1.

interp controls the interpolation filter, and can take one of the following values:

  • 0: impulse - (nearest neighbor / box) Use original values
  • 1: bilinear - (tent / triangle) Bilinear interpolation between original values
  • 2: cubic - (cubic spline) Some smoothing
  • 3: Keys - (Catmull-Rom / Hermite spline) Some smoothing, plus minor sharpening (*)
  • 4: Simon - Some smoothing, plus medium sharpening (*)
  • 5: Rifman - Some smoothing, plus significant sharpening (*)
  • 6: Mitchell - Some smoothing, plus blurring to hide pixelation (*+)
  • 7: Parzen - (cubic B-spline) Greatest smoothing of all filters (+)
  • 8: notch - Flat smoothing (which tends to hide moire’ patterns) (+)

Some filters may produce values outside of the initial range (*) or modify the values even at integer positions (+).

Sample scripts

Add green channel to red, keep green, and apply a 50% gain on blue

SeExprSimple:

r+g
g
0.5*b

SeExpr:

[Cs[0]+Cs[1], Cs[1], 0.5*Cs[2]]

“Multiply” merge operator on inputs 1 and 2

SeExprSimple:

r*r2
g*g2
b*b2
a+a2-a*a2

SeExpr:

Cs * Cs2
As + As2 - As * As2

“Over” merge operator on inputs 1 and 2

SeExprSimple:

r+r2*(1-a)
g+g2*(1-a)
b+b2*(1-a)
a+a2-a*a2

SeExpr:

Cs + Cs2 * (1 -  As)
As + As2 - As * As2

Generating a time-varying colored Perlin noise with size x1

cnoise([cx/x1,cy/x1,frame])

Average pixels over the previous, current and next frame

SeExpr:

prev = cpixel(1,frame - 1,x,y);
cur = Cs;
next = cpixel(1,frame + 1,x,y);
(prev + cur + next) / 3;

Custom parameters

To use custom variables that are pre-defined in the plug-in (scalars, positions and colors) you must reference them using their script-name in the expression. For example, the parameter x1 can be referenced using x1 in the script:

Cs + x1

Multi-instruction expressions

If an expression spans multiple instructions (usually written one per line), each instruction must end with a semicolumn (‘;’). The last instruction of the expression is considered as the final value of the pixel (a RGB vector or an Alpha scalar, depending on the script), and must not be terminated by a semicolumn. More documentation is available on the SeExpr website.

Accessing pixel values from other frames

The input frame range used to render a given output frame is computed automatically if the following conditions hold:

  • The frame parameter to cpixel/apixel must not depend on the color or alpha of a pixel, nor on the result of another call to cpixel/apixel

  • A call to cpixel/apixel must not depend on the color or alpha of a pixel, as in the following:

    if (As > 0.1) { src = cpixel(1,frame,x,y); } else { src = [0,0,0]; }

If one of these conditions does not hold, all frames from the specified input frame range are asked for.

Inputs

Input Description Optional
1   Yes
2   Yes
3   Yes
4   Yes

Controls

Parameter / script name Type Default Function
Region of Definition / rod Choice Union
Region of definition (extent) of the output.
Union: The output region is the union of the regions of definition of all connected inputs.
Intersection: The output region is the intersection the regions of definition of all connected inputs.
Size: The output region is the size of the rectangle overlay.
Format: The output region is the specified format.
Project: The output region is the size of the project.
Input1: The output region is the region of definition of input 1
Input2: The output region is the region of definition of input 2
Input3: The output region is the region of definition of input 3
Input4: The output region is the region of definition of input 4
Input5: The output region is the region of definition of input 5
Input6: The output region is the region of definition of input 6
Input7: The output region is the region of definition of input 7
Input8: The output region is the region of definition of input 8
Input9: The output region is the region of definition of input 9
Input10: The output region is the region of definition of input 10
Output components / outputComponents Choice RGBA Specify what components to output. In RGB only, the alpha script will not be executed. Similarily, in alpha only, the RGB script will not be executed.
Format / format Choice PC_Video 640x480 The output format
Bottom Left / bottomLeft Double x: 0 y: 0 Coordinates of the bottom left corner of the size rectangle.
Size / size Double w: 1 w: 1 Width and height of the size rectangle.
Interactive Update / interactive Boolean Off If checked, update the parameter values during interaction with the image viewer, else update the values when pen is released.
Input Layer 1 / layerInput1 Choice Color Select which layer from the input to use when calling cpixel/apixel on input 1
Input Layer 2 / layerInput2 Choice Color Select which layer from the input to use when calling cpixel/apixel on input 2
Input Layer 3 / layerInput3 Choice Color Select which layer from the input to use when calling cpixel/apixel on input 3
Input Layer 4 / layerInput4 Choice Color Select which layer from the input to use when calling cpixel/apixel on input 4
Input Layer 5 / layerInput5 Choice Color Select which layer from the input to use when calling cpixel/apixel on input 5
Input Layer 6 / layerInput6 Choice Color Select which layer from the input to use when calling cpixel/apixel on input 6
Input Layer 7 / layerInput7 Choice Color Select which layer from the input to use when calling cpixel/apixel on input 7
Input Layer 8 / layerInput8 Choice Color Select which layer from the input to use when calling cpixel/apixel on input 8
Input Layer 9 / layerInput9 Choice Color Select which layer from the input to use when calling cpixel/apixel on input 9
Input Layer 10 / layerInput10 Choice Color Select which layer from the input to use when calling cpixel/apixel on input 10
No. of Scalar Params / doubleParamsNb Integer 0 Use this to control how many scalar parameters should be exposed to the SeExpr expression.
x1 / x1 Double 0 A custom 1-dimensional variable that can be referenced in the expression by its script-name, x1
x2 / x2 Double 0 A custom 1-dimensional variable that can be referenced in the expression by its script-name, x2
x3 / x3 Double 0 A custom 1-dimensional variable that can be referenced in the expression by its script-name, x3
x4 / x4 Double 0 A custom 1-dimensional variable that can be referenced in the expression by its script-name, x4
x5 / x5 Double 0 A custom 1-dimensional variable that can be referenced in the expression by its script-name, x5
x6 / x6 Double 0 A custom 1-dimensional variable that can be referenced in the expression by its script-name, x6
x7 / x7 Double 0 A custom 1-dimensional variable that can be referenced in the expression by its script-name, x7
x8 / x8 Double 0 A custom 1-dimensional variable that can be referenced in the expression by its script-name, x8
x9 / x9 Double 0 A custom 1-dimensional variable that can be referenced in the expression by its script-name, x9
x10 / x10 Double 0 A custom 1-dimensional variable that can be referenced in the expression by its script-name, x10
No. of 2D Params / double2DParamsNb Integer 0 Use this to control how many 2D (position) parameters should be exposed to the SeExpr expression.
pos1 / pos1 Double x: 0 y: 0 A custom 2-dimensional variable that can be referenced in the expression by its script-name, pos1
pos2 / pos2 Double x: 0 y: 0 A custom 2-dimensional variable that can be referenced in the expression by its script-name, pos2
pos3 / pos3 Double x: 0 y: 0 A custom 2-dimensional variable that can be referenced in the expression by its script-name, pos3
pos4 / pos4 Double x: 0 y: 0 A custom 2-dimensional variable that can be referenced in the expression by its script-name, pos4
pos5 / pos5 Double x: 0 y: 0 A custom 2-dimensional variable that can be referenced in the expression by its script-name, pos5
pos6 / pos6 Double x: 0 y: 0 A custom 2-dimensional variable that can be referenced in the expression by its script-name, pos6
pos7 / pos7 Double x: 0 y: 0 A custom 2-dimensional variable that can be referenced in the expression by its script-name, pos7
pos8 / pos8 Double x: 0 y: 0 A custom 2-dimensional variable that can be referenced in the expression by its script-name, pos8
pos9 / pos9 Double x: 0 y: 0 A custom 2-dimensional variable that can be referenced in the expression by its script-name, pos9
pos10 / pos10 Double x: 0 y: 0 A custom 2-dimensional variable that can be referenced in the expression by its script-name, pos10
No. of Color Params / colorParamsNb Integer 0 Use this to control how many color parameters should be exposed to the SeExpr expression.
color1 / color1 Color r: 0 g: 0 b: 0 A custom RGB variable that can be referenced in the expression by its script-name, color1
color2 / color2 Color r: 0 g: 0 b: 0 A custom RGB variable that can be referenced in the expression by its script-name, color2
color3 / color3 Color r: 0 g: 0 b: 0 A custom RGB variable that can be referenced in the expression by its script-name, color3
color4 / color4 Color r: 0 g: 0 b: 0 A custom RGB variable that can be referenced in the expression by its script-name, color4
color5 / color5 Color r: 0 g: 0 b: 0 A custom RGB variable that can be referenced in the expression by its script-name, color5
color6 / color6 Color r: 0 g: 0 b: 0 A custom RGB variable that can be referenced in the expression by its script-name, color6
color7 / color7 Color r: 0 g: 0 b: 0 A custom RGB variable that can be referenced in the expression by its script-name, color7
color8 / color8 Color r: 0 g: 0 b: 0 A custom RGB variable that can be referenced in the expression by its script-name, color8
color9 / color9 Color r: 0 g: 0 b: 0 A custom RGB variable that can be referenced in the expression by its script-name, color9
color10 / color10 Color r: 0 g: 0 b: 0 A custom RGB variable that can be referenced in the expression by its script-name, color10
Input Frame Range / frameRange Integer min: 0 max: 0 Default input frame range to fetch images from (may be relative or absolute, depending on the “frameRangeAbsolute” parameter). Only used if the frame range cannot be statically computed from the expression. This parameter can be animated.
Absolute Frame Range / frameRangeAbsolute Boolean Off If checked, the frame range is given as absolute frame numbers, else it is relative to the current frame.
R= / rExpr String   Expression to compute the output red channel. If empty, the channel is left unchanged.
G= / gExpr String   Expression to compute the output green channel. If empty, the channel is left unchanged.
B= / bExpr String   Expression to compute the output blue channel. If empty, the channel is left unchanged.
A= / aExpr String   Expression to compute the output alpha channel. If empty, the channel is left unchanged.
Help... / helpButton Button   Display help about using SeExpr.
Invert Mask / maskInvert Boolean Off When checked, the effect is fully applied where the mask is 0.
Mix / mix Double 1 Mix factor between the original and the transformed image.