1// A 3D version of Liquid Paint.
2// try: Iter=2, Amp=3
3// Inspired by: http://glslsandbox.com/e#8067.3
4// for 3D printing: curv -Ovsize=.15 -Ojit -o hypno_coral.{x3d,curv}
5
6parametric
7    Iter :: int_slider[0,50] = 10;
8    Amp :: slider[0,3] = 0.6;
9    Scale :: scale_picker = 0.7;
10    Speed :: slider[0,4] = 1;
11    Offset :: slider[-1.5, 2] = 0;
12    Smooth :: slider[0,5] = 3.2;
13in let
14    plasma3D = make_texture ([x,y,z,t] ->
15        let p = [x,y,z]*Scale;
16        in do
17            local t = t*Speed;
18            for (i in 1..Iter)
19                p := p + Amp/i*sin(i*p.[[Y,Z,X]] + t + [0,tau/3,tau*(2/3)]) + 1;
20        in  sRGB(0.5*sin(p*pi)+0.5));
21    gyre = gyroid >> offset (Offset) >> lipschitz 1.5;
22    gsphere = smooth Smooth .intersection [gyre, sphere 20];
23in gsphere >> colour plasma3D >> scale 2
24