515 lines
4.5 KiB
Plaintext
515 lines
4.5 KiB
Plaintext
|
|
|
|
|
|
|
|
// Parameters from our host
|
|
// x: Scene
|
|
// y: Zeit
|
|
// z: Quadratzeit mit Faktor
|
|
// w: Aspect ratio
|
|
varying vec4 Y,Z;
|
|
|
|
// All data of our world
|
|
float j, k, g=acos(-1.0), h= sqrt( 0.75 );
|
|
|
|
vec2 r(vec2 v,float y)
|
|
{
|
|
return cos(y)*v+sin(y)*vec2(-v.y,v.x);
|
|
}
|
|
|
|
//s around y axis w times
|
|
void s(inout vec2 v,float x, float y)
|
|
{
|
|
float z=mod(atan(v.y,v.x),y)-y*.5;
|
|
v=(length(v))*vec2(cos(z),sin(z));
|
|
v.x-=x;
|
|
}
|
|
|
|
//radius of the l/ radius of the ring
|
|
float l(vec3 p,float f)
|
|
{
|
|
return length(vec2(length(p.xz) - f,p.y));
|
|
}
|
|
|
|
float i( vec2 p, float y, float z )
|
|
{
|
|
return length( max( abs(p) - vec2(y) + vec2(z), 0.0 ) ) - z;
|
|
}
|
|
|
|
float u( vec3 p )
|
|
{
|
|
return fract( sin( p.x * 151.0 + p.y * 33.0 + p.z ) * 11.0 );
|
|
}
|
|
|
|
float w(vec3 p)
|
|
{
|
|
vec2 e = vec2(1.0, 0.0);
|
|
vec3 o= smoothstep(0.0,1.0,fract( p ));
|
|
p= floor( p );
|
|
|
|
vec4 n= mix(
|
|
vec4(
|
|
u( p+e.yyy),//n000,
|
|
u( p+e.xyy),//n100,
|
|
u( p+e.yxy),//n010,
|
|
u( p+e.xxy)),//n110),
|
|
vec4(
|
|
u( p+e.yyx),//n001,
|
|
u( p+e.xyx),//n101,
|
|
u( p+e.yxx),//n011,
|
|
u( p+e.xxx)),//n111),
|
|
o.z);
|
|
e = mix(n.xy, n.zw, o.y);
|
|
return mix(e.x, e.y, o.x);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Kugel ueber Plattform
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
float A(vec3 p)
|
|
{
|
|
return p.y - w( p + j * 3.0 ) * 0.2 + 1.0;
|
|
}
|
|
|
|
float B(vec3 p)
|
|
{
|
|
return min( length( p+vec3(0.0,8.0,0.0))- 8.5, l( p, 2.3)-0.5 );
|
|
}
|
|
|
|
float C(vec3 p)
|
|
{
|
|
p.xz= r( p.xz, Y.z * 11.0 );
|
|
float d1= max( length( p )- 6.0, p.y );
|
|
s( p.xz, 5.0, g/32.0);
|
|
p.x= abs( p.x ) - 2.;
|
|
float dist= mix( length(p.yz),length(p.xyz), step(0.0, p.x) );
|
|
return min( d1 , dist - 0.4 );
|
|
}
|
|
|
|
float D(vec3 p)
|
|
{
|
|
p.y -= 4.0;
|
|
p.xz= r( p.xz, j * 6.0 );
|
|
s( p.xz,0.0, g/1.5);
|
|
p.yz= r( p.yz, g/2.0 );
|
|
float z= l(p, 2.4)-0.5;
|
|
return min( max( 0.5 - z , length(p) - 1.5 - Y.z * 22.0 ), z );
|
|
}
|
|
|
|
float f(vec3 p)
|
|
{
|
|
float z= min( min( A(p), B(p) ), C(p) );
|
|
return max( length( p ) - 33.0, min( z, max( 0.5 - z, D(p) ) ) );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void main()
|
|
{
|
|
k= Y.x;
|
|
j= Y.y;
|
|
// Get the look direction for the current gxel (always look forwards)
|
|
vec3 q = vec3((Z.xy - 0.5), 1.0);
|
|
|
|
//Kamera sitzt an dieser Position
|
|
vec3 p;
|
|
|
|
if( k == 0.0 )
|
|
{
|
|
p= vec3( 12.0, 1.0, 0.0);
|
|
q.yz= r( q.yz, 1.0 + j * -1.2 );
|
|
q.xz= r( q.xz, 3.0 - j * 1.5 );
|
|
}
|
|
else if( k == 1.0 )
|
|
{
|
|
p= vec3( -3.0, 3.0, -16.0 + j * 10.0);
|
|
q.xz= r( q.xz, j * -0.6 );
|
|
}
|
|
else if( k == 2.0 )
|
|
{
|
|
p= vec3( 0.0, 12.0 - j * 8.0, -16.0 + j * 12.0);
|
|
q.yz= r( q.yz, 0.4 + j * 0.4 );
|
|
}
|
|
else if( k == 3.0 )
|
|
{
|
|
p= vec3( 2.0, 2.0, -6.0 - Y.z * 22.0);
|
|
//q.yz= r( q.yz, 0.0 );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
q = normalize(q);
|
|
|
|
vec3 b= vec3( .0,.0,.0 );
|
|
float a=1.0;
|
|
|
|
float t=w( q*666.0 )*0.2,y,z,d,m=0;
|
|
|
|
while (m++<2.0)
|
|
{
|
|
|
|
//bis zu einer Oberflaeche steppen
|
|
for (d=1.0;t<66.0 && d>t*.003;t+=max( 0.01, d+0.01) )
|
|
{
|
|
d = f(p+q*t);
|
|
}
|
|
|
|
if( t > 66.0 )
|
|
{
|
|
break;
|
|
}
|
|
|
|
//Startpunkt und Richtung fuer reflektierten Strahl;
|
|
p+= q*t;
|
|
//vec3 n = normal(p);
|
|
|
|
vec2 e = vec2(0.04, 0.0);
|
|
vec3 n= vec3( f(p + e.xyy) - f(p - e.xyy), f(p + e.yxy) - f(p - e.yxy), f(p + e.yyx) - f(p - e.yyx) );
|
|
n= normalize(n);
|
|
z= A(p);
|
|
|
|
//d ab hier == Reflektion !!!
|
|
|
|
vec3 c = vec3(0.05,.1,.2 ) * (t+5.0) * 0.2;
|
|
d= .7;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if( z > D(p) )
|
|
{
|
|
z= D(p);
|
|
|
|
c = vec3(1.0,0.0,0.0 );
|
|
d= .15;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
if( z > B(p) )
|
|
{
|
|
z= B(p);
|
|
|
|
c = vec3(.1);
|
|
d= .8;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
if( z > C(p) )
|
|
{
|
|
z= C(p);
|
|
c = vec3(0.0,0.6,0.8 ) * (0.9 - 0.15 / clamp(dot( n, q ), -1.0, -0.05));
|
|
|
|
d= .2;
|
|
e.y= 8.0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
n+= (w( p * e.y ) + w( p * e.y * 2.0 ) + w( p * e.y * 4.0 )) * e.x;
|
|
n= normalize(n);
|
|
q= reflect( q, n );
|
|
|
|
y= 6.0;
|
|
for (z=1.0;y>0.;y--)
|
|
{
|
|
z-=(y*.5-f(p+n*y*.5))/exp2(y);
|
|
}
|
|
c*= z;
|
|
|
|
//lambertlight
|
|
n.yz= r( n.yz, 0.6 );
|
|
|
|
c*= .4 + .3 * ( 1.0 - abs( n.y - .9 ) );
|
|
|
|
|
|
b+= a*c;//*(1.0-Reflect);
|
|
a*= d;// Reflect * (1.0-t/tmax);
|
|
t= 0.3;
|
|
}
|
|
|
|
p=vec3(0.8);
|
|
q.yz= r( q.yz, 0.6 );
|
|
p+= q.y * 0.2;
|
|
if( m < 2 )
|
|
{
|
|
p*= vec3( 0.95, 1.1, 1.2);
|
|
}
|
|
|
|
if( q.y > 0.0 )
|
|
{
|
|
s(q.xz, 0.4, g/8.0);
|
|
q.x= abs( q.x ) - .2;
|
|
p+= pow( smoothstep(.2, .0, mix( abs(q.z),length(q.xz), step(0.0, q.x) ) ), 22.0 );
|
|
}
|
|
|
|
vec3 color = b + a*p;
|
|
gl_FragColor.xyz = length(color) * (cos((Z.y + color)*g*2)*.125+.5);
|
|
}
|