The images are generated in a reverse polish notation stack expression. The expression is calculated for every pixel in the image, with x and y indicating the current pixel location within the image. The codes that stackie understands are:
x : push x (x is in range 0...1)
y : push y (y is in range 0...1)
0...9 : push constant 0...9
P : push PI
d : duplicate top item on the stack
: : swap top two items on the stack
; : swap top and third items on the stack
s : sin
c : cos
q : sqrt
~ : abs
! : flip 1-a implemented as push(1-pop())
# : round to nearest integer
? : threshold ( value<=0 becomes 0, value>0 becomes 1 );
p : perlin noise (using top two stack values)
w : wraparound perlin noise using three stack valuesx,y,size
W : wraparound perlin noise using 4 stack values x,y,x_size, y_size
a : atan2
+ : add
- : subtract
* : multiply
/ : divide
^ : pow
> : max
< : min
While the final strings can look incomprehensible, writing a texture code is easier than it seems. You can build it up by constructing simple pieces and mixing them together
x | y |
x! | y! |
xy* | xy+2/ |
xyp | x8*y8*p1+2/ |
x9^ | y9^ |
x9^ y9^ + | x9^ y9^ + x!9^ y!9^ + + |
By combining simple sequences together you can construct more complex images.
x8* y3* p 1+ | x9^ x!9^ + y! + + |
x8* y3* p 1+ x9^ x!9^ + y! + - | Palette xy!1+* |
Stackie is on github