Variables, Linking and Expressions

All of the math functions can be found in the include/nreal.h file. You can declare your own functions in your own .h file.

To set an expression on a string (text) parameter, you need to add a : (colon) at the start of the expression, otherwise it is treated as text rather than getting compiled and evaluated.

Arithmetic Operators  
* Multiply
/ Divide
+ Plus
- Subtract
Relational Operators  
< Less than
> Greater than
<= Less than or equal to
>= Greater than or equal to
== Equal to
!= Not equal to
Logical Operators  
&& And
|| Or
! Not
Conditional Expression  
expr1?expr2:expr3 If expr1 is true (non-zero), then to expr2, else do expr3
Global Variables  
time Current frame number

Image Variables

These are variables carried by each node.

parameterName Value of parameterName from inside that node.
nodeName.parameterName Value of parameterName in nodeName from outside of that node.
parameterName@@time

Allows you to access a value at a different frame. For example:

Blur1.xPixel@@(time-3) looks at the value from 3 frames earlier.

bytes The number of bytes in that image. This takes the input bit-depth when called from inside of the node, and the output bit-depth when called from outside of the node.
width Width of the image. Takes the input width when called from inside of the node, and the output width when called from outside of the node.
height Height of the image. Takes the input height when called from inside of the node, and the output height when called from outside of the node.
_curImageName

Returns the name of the actual file being used for the current frame. Useful when plugged into a Text node:

{FileIn1._curImageName}

dod[0], dod[1], dod[2], dod[3] The variable for the Domain of Definition xMin, yMin, xMax, yMax, respectively.

In-Node Variables

These are channel variables used in nodes such as ColorX, LayerX, Reorder, etc. Check the documentation for specific support of any variable.

nr, ng, nb, na, nz New red, green, blue, alpha, Z channel
r, g, b, a, z Original red, green, blue, alpha, Z channels
l Luminance channel for Reorder
n Null channel. Strips out the alpha in Reorder when used like this: rgbn
r2, g2, b2, a2, z2 Second image's channel for LayerX
Condtional Statements
if (expression evaluates to non-zero) { 
       do_this 
} else if { 
       do_this 
} else if { 
       do_this 
} else { 
       do_this 
}

If/Else

Used to express decisions. If the test expression is true, then the first statement is executed. If false (and if an "else" part exists), then the second statement is executed. If "else" is left off, Shake does nothing and moves on.

for (initialize; test; increment) 
{ 
    do_this 
}

For

Normally, the three expressions of the "for" loop are an initialization (a=1), a relational test (a<10), and an increment (a++): for (a=1; a<10; a++). So "a" is set to one, checked if it is less than 10, then if that is true, a statement performed, and "a" is incremented by one. The test is checked again and this cycle continues until "a" is found to be not less than 10 (untrue).

while (this_expression_is_true) 
{ 
    do_this 
}

While

If the given expression is true or non-zero, the following statements are performed, and the expression is reevaluated. The cycle continues until the expression becomes false. If there is no initialization or re-initialization, "while" often makes more sense than "for".

do { 
  do_this 
} while (this_expression_is_true);

Do/While

This variation of "while" is different in that it tests at the bottom of the loop, so the statement body is done at least once. In the "while" above, the test may be false the first time and so nothing is done. Note on all of the other statements, a semicolon was not needed. This expression does need it at the end.

Math Functions
abs(x) Integer absolute value. abs(-4) = 4. Be careful, as this will return an integer, not a float. Use fabs for float.
biasedGain(value, gain, bias) This gives a ContrastLum-like curve that gives rolloff between two values.
cbrt(x) Cubic root. cbrt(8) = 2
ceil(x) Truncates to next integer. ceil(5.3) = 6
clamp(x, lo, hi) Clamps x to between lo and hi
clamp(1.5,0,1) = 1
exp(x) Natural exponent. exp(0) = 1
fabs(x) Float absolute value. fabs(-4.1) = 4.1
floor(x) Truncates to next lowest integer. floor(5.8) = 5
fmod(x,y) Float modulus. Returns the remainder in float.
fmod(11.45,3) = 2 , ie, (3x3+2.45 = 11.45)
log(x) Natural log. log(1) = 0
log10(x) Returns base 10 log. log10(10) = 1
M_PI A variable set to pi at 20 decimal places
max(a,b) Returns maximum between a and b
max(5,10) = 10
max3(a,b,c) Returns maximum between a, b, and c.
max3(5,2,4) = 5
min(a,b) Returns minumum between a and b.
min(5,10) = 10
min3(a,b,c) Returns minumum between a, b, and c.
min3(5,2,4) = 2
a%b Modulus. 27%20 = 7
pow(x,y) Returns x to the y power. pow(2,4) = 16
round(x) Rounds number off. Values below x.5 are rounded to x, values equal to or above x.5 are rounded to x+1. round(4.3) = 4
sqrt(x) Square root. sqrt(9) = 3

Noise Functions

These are ideal for WarpX and ColorX.

noise(seed) 1 dimensional cubic spline interpolation of noise
noise2d(seed,seed) 2d noise
noise3d(seed,seed,seed) 3d noise
noise4d(seed,seed,seed,seed) 4d noise
lnoise(seed) 1d linear interpolation of noise
lnoise2d(seed,seed) 2d noise
lnoise3d(seed,seed,seed) 3d noise
lnoise4d(seed,seed,seed,seed) 4d noise
fnoise(x,xScale) 1d fractal noise based on noise()
fnoise2d(x,y,xScale,yScale)  
fnoise3d(x, y, z, xScale, yScale, zScale)  
turbulence(x, xScale) A cheaper, rougher version of fnoise().
turbulence2d(x, y, xScale, yScale ) Continuous 2d noise
turbulence3d(x, y, z, xScale, yScale, zScale) Continuous 3d noise
rnd(seed) Hash-based pseudo-random numbers. Non-hash based RNG (like rand() or drand48()) should not be used in Shake because they can't be reproduced from one machine to another, and even on the same machine, repeated evaluations of the same node at the same time would produce different results. Note that because this function has different values for every single unit of time (frame 1, frame 1.1, frame 1.11, etc), the shutterTiming function is unaffected. If you need to generate random values for motion blur, bake the curve and read it back in.
rnd1d(seed, seed) 1d random value
rnd2d(seed,seed,seed) 2d random value
rnd3d(seed,seed,seed,seed) 3d random value
rnd4d(seed,seed,seed,seed,seed) 4d random value
Trig Functions (in radians)
M_PI A variable set to pi at 20 decimal places.
acos(A) Arc cosine in radians
asin(A) Arc sine
atan(A) Arc tangent
atan2(y,x) Returns the radian verifying sin(a) = y and cos(a) = x.
cos(A) Cosine
sin(A) Sin
Trig Functions (in degrees)
Hmmm, yummy trigonometry! Welcome back. For those of you who may have forgotten, here is a helpful chart for some commonly used equations.
acosd(A) arc cosine in degrees
asind(A) arc sine in degrees
atand(A) arc tangent in degrees
atan2d(y,x) returns the angle verifying sin(a) = y and cos(a) = x.
cosd(A) cosine in degrees
distance(x1,y1,x2,y2) calculates the distance between two points, (x1,y1) and (x2, y2)
sind(A) sin in degrees
tand(A) tangent in degrees
String Functions
stringf( "xyz", ...)

Since you basically can write books on this, here is an example. Otherwise, it is recommended to purchase a book on C. There are also several examples under the Scripts documentation. This example takes the scriptName parameter and uses the system function echo to print it:

extern "C" int system(const char*);
const char *z= stringf("echo %s",scriptName);
system(z);

printf( "xyz", ...)  
strlen("mystring") Returns the length of the string

strsub(
const char *string,
int offset,
int length
)

Extracts a string from another string.

Curve Functions

The curve functions with implicit time (Linear, CSpline, etc.) all assume that time is the first argument, so the following statements are identical:

LinearV(time,0,1@1,20@20)
Linear(0,1@1,20@20)

You can, however, adjust the time value explictly with the V version of each curve type.

These are the cycle type codes:

0 = KeepValue
1 = KeepSlope
2 = RepeatValue
3 = MirrorValue

biasedGain(x,gain,bias) Gives a smoothly ramped interpolation between 0 and 1, similar to Shake's contrast curve. gain increase the contrast, and bias offsets the center.
Linear(cycle,
value@key1,
value@key2,
...)
Linear interpolation from value at key1 to value at key2, etc.
LinearV(time_value, cycle, value@key1,
value@key2,
...)
Linear interpolation from value at key1 to value at key2, etc.
CSpline(cycle,
value@key1,
value@key2,
...)
Cardinal-spline interpolation, a.k.a. Catmull-Rom splines
CSplineV(time_value, cycle, value@key1,
value@key2,
...)
Cardinal-spline interpolation, a.k.a. Catmull-Rom splines
JSpline(cycle,
value@key1,
value@key2,
...)
Jeffress-spline interpolation

JSplineV(time_value, cycle, value@key1,
value@key2,
...)

Jeffress-spline interpolation
NSpline(cycle,
value@key1,
value@key2,
...)
Natural-spline interpolation
NSplineV(time_value, cycle, value@key1, value@key2,...) Natural-spline interpolation

Hermite(cycle,
[value,tangent1,tangent2]@key1,
[value,tangent1,tangent2]@key2,
...)

Hermite-spline interpolation
HermiteV(time_value, cycle,
[value,tangent1,tangent2]@key1,
[value,tangent1,tangent2]@key2,
...)
Hermite-spline interpolation