-
Notifications
You must be signed in to change notification settings - Fork 1
/
Aexions_TetraBox2.frag
102 lines (81 loc) · 2.36 KB
/
Aexions_TetraBox2.frag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// added new color option mclarekin 16/04/20
#info Aexion's TetraBox2.http://www.fractalforums.com/mandelbulb-3d/how-to-make-a-sphere/msg90387/#msg90387
#define providesInit
#include "MathUtils.frag"
#include "DE-Raytracer.frag"
#group TetraBox2
// Number of fractal iterations.
uniform int Iterations; slider[0,17,300]
uniform int ColorIterations; slider[0,8,60]
uniform float CToffset; slider[-3.0,3.0,5.0]
// box
uniform vec4 Offset; slider[(0.0,0.0,0.0,0.0),(1.0,1.0,1.0,1.0),(5.0,5.0,5.0,5.0)]
// sphere fold
uniform float minRR; slider[0.0,0.25,5.0]
uniform float maxRR; slider[0.0,1.0,5.0]
float maxDivMin = maxRR / minRR;
uniform vec4 offsetSph; slider[(-5.0,-5.0,-5.0,-5.0),(0.0,0.0,0.0,0.0),(5.0,5.0,5.0,5.0)]
// scale
uniform float Scale; slider[0.0,2.0,5.0]
// precomputed constants
uniform vec3 Rotation; slider[(-180,-180,-180),(0,0,0),(180,180,180)]
mat3 rot;
void init() {
rot = rotationMatrixXYZ(Rotation);
}
float DE(vec3 pos)
{
vec4 CT =abs( vec4(pos.x+pos.y+pos.z,-pos.x-pos.y+pos.z,-pos.x+pos.y-pos.z,pos.x-pos.y-pos.z));
CT = abs(CT - CToffset);
float r=0.0;
float rr=0.0;
vec4 z = CT;
int i = 0;
float dd = 1.0;
for (int i=0; i<Iterations; i++)
{
z = abs(z + Offset) - abs(z - Offset) - z;
float rr = dot(z,z);
z += offsetSph; // test
if(rr < minRR)
{
z *= maxDivMin;
dd *= maxDivMin;
}
else if(rr < maxRR)
{
float maxDivRR = maxRR / rr;
z *= maxDivRR;
dd *= maxDivRR;
}
z -= offsetSph; // test
z = z * Scale;
dd = dd * Scale + 1.0;
//rotation // test
vec3 zr = vec3(z.x, z.y, z.z);
zr *= rot;
z = vec4(zr.x, zr.y, zr.z, z.w);
z = z + CT;
rr=dot(z,z);
if (i<ColorIterations)
{
vec4 p = abs(z);
orbitTrap.x = min(orbitTrap.x, abs(p.x-p.y-p.z+p.w));
orbitTrap.y = min(orbitTrap.y, abs(p.x-p.y+p.z-p.w));
orbitTrap.z = min(orbitTrap.z, abs(p.x+p.y-p.z+p.w));
orbitTrap.w = min(orbitTrap.w, abs(p.x+p.y+p.z-p.w));
}
/*if (i<ColorIterations)
{
orbitTrap.x = abs(z.x-z.y-z.z+z.w);
orbitTrap.y = abs(z.x-z.y+z.z-z.w);
orbitTrap.z = abs(z.x+z.y-z.z-z.w);
orbitTrap.w = length(orbitTrap.xyz);
}*/
//if (i<ColorIterations) orbitTrap = min(orbitTrap, abs(vec4(z.xyz,rr)));
if ( rr>10000.0) break;
}
//float r = sqrt(rr);
// r = length(z);
return length(z) / dd;
}