104 lines
1.8 KiB
GLSL
104 lines
1.8 KiB
GLSL
// Code by Flopine
|
|
// Thanks to wsmind and leon for teaching me!
|
|
|
|
#define PI 3.14
|
|
|
|
mat2 rot(float angle)
|
|
{
|
|
float c = cos(angle);
|
|
float s = sin(angle);
|
|
return mat2(c,s,-s,c);
|
|
}
|
|
|
|
vec2 moda (vec2 p, float per)
|
|
{
|
|
float angle = atan(p.y,p.x);
|
|
float l = length(p);
|
|
angle = mod(angle-per/2.,per)-per/2.;
|
|
return vec2 (cos(angle),sin(angle))*l;
|
|
}
|
|
|
|
float cylY (vec3 p, float r)
|
|
{
|
|
return length(p.xz)-r;
|
|
}
|
|
|
|
float cylZ (vec3 p, float r)
|
|
{
|
|
return length(p.xy)-r;
|
|
}
|
|
|
|
|
|
float base (vec3 p)
|
|
{
|
|
p.xy *= rot(abs(p.z)-iTime);
|
|
p.xy = moda(p.xy,2.*PI/3.);
|
|
p.x -= 0.4;
|
|
|
|
return cylZ(p,0.2);
|
|
}
|
|
|
|
|
|
float prim(vec3 p)
|
|
{
|
|
p.xz = moda(p.xz, 2.*PI/7.);
|
|
p.x -= 4.;
|
|
return base(p);
|
|
}
|
|
|
|
float elevator (vec3 p)
|
|
{
|
|
float per = 8.;
|
|
p.yz = mod (p.yz-per/2.,per)-per/2.;
|
|
float rep1 = prim(p);
|
|
|
|
float per2 = 15.;
|
|
p.yz *= rot(PI/2.);
|
|
p.x = mod (p.x-per2/2.,per2)-per2/2.;
|
|
float rep2 = prim(p);
|
|
|
|
return min(rep1,rep2);
|
|
}
|
|
|
|
float background (vec3 p)
|
|
{
|
|
float per = 5.;
|
|
p.yz *= rot(PI/2.);
|
|
p.x = mod (p.x-per/2.,per)-per/2.;
|
|
return prim(p);
|
|
}
|
|
|
|
float SDF(vec3 p)
|
|
{
|
|
return min(elevator(p), background(p));
|
|
}
|
|
|
|
|
|
|
|
void mainImage( out vec4 fragColor, in vec2 fragCoord )
|
|
{
|
|
vec2 uv = 2.*(fragCoord.xy / iResolution.xy)-1.;
|
|
uv.x *= iResolution.x/iResolution.y;
|
|
|
|
vec3 p = vec3 (-.001,iTime,-3.);
|
|
vec3 dir = normalize(vec3(uv,1.));
|
|
|
|
float shad = 0.;
|
|
vec3 color = vec3 (0.);
|
|
|
|
for (int i=0; i<100;i++)
|
|
{
|
|
float d = elevator(p);
|
|
if (d<0.01)
|
|
{
|
|
shad = float(i)/80.;
|
|
break;
|
|
}
|
|
else shad = .0;
|
|
p+=d*0.2*dir;
|
|
}
|
|
color = vec3(shad)*vec3(0.8,p.z,abs(p.x*0.5));
|
|
fragColor = vec4(color,1.0);
|
|
}
|
|
|
|
// https://www.shadertoy.com/view/XtSBRK
|