#version 100 // 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); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // Schlange im Tunnel ///////////////////////////////////////////////////////////////////////////////////////////////////////////// float A(vec3 p) { //p.z-= 5.5; vec3 o= p; p.z= mod( p.z, 11.0 ) - 5.5; o-= p; p.xy= r( p.xy, o.z + smoothstep( -0.2, 0.2, cos( j * 5.0 + cos( o.z * 33.0 ) ) ) ); s( p.xy, 4.8, g/4.5 ); return i( p.xz, 1.0, 0.3 ); } float B(vec3 p) { return 99.0; } float C(vec3 p) { //p.z-= j * 33.0; p.z= mod( p.z, 7.0 ) - 3.5; s( p.xy, 0.0, g/4.0 ); return max( abs( length( p.xy ) - 9.0 ) - 0.2, 3.0 - length( p.yz ) ); } float D(vec3 p) { p.z+= j * 33.0; p.xy= r( p.xy, p.z * 0.2 - j * 8.0 ); p.x+= 1.0; float z= 3.5 * smoothstep( -22.0, 0.0, p.z ) - 3.0 + Y.z * 17.0; p.z= mod( p.z, 0.2 ) - 0.1; return l( p.xzy, z ) - 1.0; } float f(vec3 p) { float z= min( min( A(p), B(p) ), C(p) ); return max( length( p ) - 66.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 == 7.0 ) { p= vec3( -11.0, 3.0, -28.0 - j * 11.0); q.yz= r( q.yz, 0.2 ); q.xz= r( q.xz, -2.0 + j ); } else if( k == 8.0 ) { p= vec3( -1.0, 1.0, -33.0 - j * 7.0); //q.yz= r( q.yz, 0.2 ); //q.xz= r( q.xz, -2.0 + j ); } else if( k == 9.0 ) { p= vec3( Y.z * 18.0 + 3.0 * smoothstep( 0.3, 0.4, j ), Y.z * 3.0 + 3.0, j * -60.0 ); q.yz= r( q.yz, 0.1 ); q.xz= r( q.xz, j ); } ///////////////////////////////////////////////////////////////////// //Debugzeug fuer Kamerasteuerung if( true ) { p.x= gl_ModelViewMatrix[0][0]; p.y= gl_ModelViewMatrix[0][1]; p.z= gl_ModelViewMatrix[0][2]; float a1= gl_ModelViewMatrix[1][1]; float c1,s1;vec3 q1= vec3((Z.xy - 0.5), 1.0); c1 = cos(a1); s1 = sin(a1); q.y = c1 * q1.y - s1 * q1.z; q.x= q1.x; q.z = s1 * q1.y + c1 * q1.z; a1= gl_ModelViewMatrix[1][0]; q1=q; c1 = cos(a1); s1 = sin(a1); q.x = c1 * q1.x + s1 * q1.z; q.z = -s1 * q1.x + c1 * q1.z; } //Ende Debugzeug fuer Kamerasteuerung ///////////////////////////////////////////////////////////////////// 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.95,1.0,0.95 ); d= .18; 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= .6; } 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= .1; e.y= 2.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); }