Files
bluflame/ev4k/mark.h_1_dbg
2026-04-18 22:31:51 +02:00

515 lines
5.4 KiB
Plaintext

#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);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// riesiges Hexgitter
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
float A(vec3 p)
{
vec3 o= p;
p.x= mod( p.x + step( 2.0 * h, mod( p.y, 4.0 * h ) ), 2.0 ) - 1.0;
p.y= mod( p.y, 2.0 * h )- h;
//sHex( p.xy );
o-= p;
p.z-= (k == 10.0 ? 0.0 : 44.0) + 2.0 * smoothstep( -0.3, 0.3, cos( o.x * 0.03 + cos( o.y * 0.03 ) + j * 4.0 ) * cos( o.y * 0.01 + cos( o.x * 0.02 ) ) );
float z= length( p )- 1.5;
s( p.xy, 0.7, g/3.0);
return max( z, p.x );
}
float B(vec3 p)
{
return length( p+vec3(sin( j* 3.0) * 22.0,j * 11.0,-22.0))- 22.0;
}
float C(vec3 p)
{
vec3 o= p;
p.x= mod( p.x + step( 2.0 * h, mod( p.y, 4.0 * h ) ), 2.0 ) - 1.0;
p.y= mod( p.y, 2.0 * h )- h;
//sHex( p.xy );
return max( abs( p.z + 1.0 ) - 0.2, h - length( p.xy ) );
}
float D(vec3 p)
{
return length( p-vec3(22.0,22.0,-14.0))- Y.z * 33.0 - 12.0;
}
float f(vec3 p)
{
float z= min( min( A(p), B(p) ), C(p) );
return max(length(p) - 77.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 == 10.0 )
{
p= vec3( 33.0, 33.0, -11.0 + j * 5.0);
q.yz= r( q.yz, 0.8 - j );
q.xz= r( q.xz, 0.5 + j );
}
else if( k == 11.0 )
{
p= vec3(-11.0, -11.0, -11.0);
q.yz= r( q.yz, -j * 0.7 );
q.xz= r( q.xz, -j );
}
else if( k == 12.0 )
{
p= vec3(33.0, 11.0, 33.0);
q.yz= r( q.yz, j * 0.4 );
q.xz= r( q.xz, 1.2 + j * 0.6);
}
else if( k == 13.0 )
{
p= vec3( mix( 22.0 - 88.0 * Y.z, -44.0 * j, j), 22.0, 6.0 );
q.yz= r( q.yz, j * 0.2 );
q.xz= r( q.xz, 3.4 + sqrt(j) * 1.4 );
}
/////////////////////////////////////////////////////////////////////
//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.8,.0,.0 );
d= .15;
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(0.05,.1,.2 );
d= .7;
e.y= 0.3;
}
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= 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);
}