From 02fc36ddd83633d91e758920e70023a448bc0cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petri=20J=C3=A4rvisalo?= Date: Sun, 28 Jul 2024 22:41:20 +0300 Subject: [PATCH] optimoitu --- minified.config | 4 +- music/4k_entry.xrns | Bin 0 -> 19973 bytes music/4k_sg_v3.xrns | Bin 0 -> 25865 bytes petrinshader.glsl | 237 ++++++++++++------------- shader.glsl | 399 ++++++++++++++--------------------------- shader_minified.h | 422 ++++++++++++++++++++------------------------ 6 files changed, 441 insertions(+), 621 deletions(-) create mode 100644 music/4k_entry.xrns create mode 100644 music/4k_sg_v3.xrns diff --git a/minified.config b/minified.config index 3e74b8a..e277170 100644 --- a/minified.config +++ b/minified.config @@ -10,8 +10,8 @@ include $(PARENT_CONFIG) EXE_LINKER_PROGRAM=Crinkler CRINKLER_ORDERTRIES=4000 SHADER_FILE=shader_minified.h -TIME_UNIFORM_NAME='v' -RESOLUTION_UNIFORM_NAME='y' +TIME_UNIFORM_NAME='y' +RESOLUTION_UNIFORM_NAME='v' TEXTS_UNIFORM_NAME='f' USE_WIDECHAR_TEXTS=1 TIME_DIVIDER=91241.383 diff --git a/music/4k_entry.xrns b/music/4k_entry.xrns new file mode 100644 index 0000000000000000000000000000000000000000..bb49a29b71e4b91be416728333a722eae22ab8a7 GIT binary patch literal 19973 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.0)?x2:0.0)+((y>0.0)?y2:0.0)); + + return sign(d)*sqrt(abs(d))/baba; +} + +float sdPlane( vec3 p, vec4 n ) +{ + // n must be normalized + return dot(p,n.xyz) + n.w; +} + + // Scene vec2 mapScene(in vec3 p) { float mat = 0.; - float d = 1e10; + float d = 1e9; - //float dGround = p.y + 2.5; - //d = min(d, dGround); + float dGround = sdPlane(p, vec4(0., 1.0, 0., 5.)); + // d = min(d, dGround); + vec3 po = p; //po.y += sin(u_time); // pMod3(po, vec3(3.)); - po.xy *= scale(vec2(1.3, 1.3)); + po.xy *= scale(vec2(1.1)); - const float num = 6.; + const float num = 2.; for (float i = 1.; i <= num; i++) { // pos.z += i*.1; float a = sdHex(po,i*0.35, u_time + abs( 2. + 0.4 * sin(u_time)) * i*3.1415/num); @@ -673,60 +705,43 @@ vec2 mapScene(in vec3 p) { if (d == a) mat = 1. + mod(i,3.); } - + float b = fSphere(p, 0.5); + d = min(d, b); + if (d == b) { + mat = 1.; + } //float c2 = sdText(p, u_time); //d = min(d, c2); //if ( d == c2) mat = 4.; +/* + float c3 = fBox(p+vec3(0.5, .0, 0.), vec3(1., 1.,1.)); + d = min(d, c3); + if ( d == c3) mat = 1.; - // float c3 = fBox(p+vec3(0.5, .87, 0.), vec3(1., 1.,1.)); - // d = min(d, c3); - - - - // if ( d == c1) mat = 1.; - - //if ( d == c3) mat = 3.; + float c1= fBox(p+vec3(-2., 0, -2.), vec3(1., 1.,1.)); + d = min(d, c1); + if (d == c1) mat = 3.; +*/ return vec2(d, mat); } vec3 castRay(vec3 ro, vec3 rd, inout vec3 pos) { - float t = 0.0; - float mat = 0.; - float hit = 0.; + float t = 0.; + float mat = 0.; + float hit = 0.; for(int i=0; i < 150; i++) { pos = ro + rd * t; vec2 res = mapScene(pos); t += res.x; mat = res.y; - if (t > 80.) break; + if (t > 100.) break; if (res.x < abs(0.001*t) ) { hit = 1.; break; } } - if (t > 80.) t = -1.0; - return vec3(t, mat, hit); -} - - -vec3 castReflectedRay(vec3 ro, vec3 rd, vec3 pos) { - float t = 0.0; - float mat = 0.; - float hit = 0.; - for(int i=0; i < 50; i++) { - pos = ro + rd * t; - vec2 res = mapScene(pos); - t += res.x; - mat = res.y; - if (t > 40.) break; - if (res.x < abs(0.001*t) ) { - hit = 1.; - break; - } - - } - if (t > 40.) t = -1.0; + if (t > 100.) t = 0.; return vec3(t, mat, hit); } @@ -739,12 +754,11 @@ float softshadow( in vec3 ro, in vec3 rd, float mint, float maxt, float w ) if (t > maxt) break; float h = mapScene(ro + t*rd).x; res = min( res, h/(w*t) ); - t += clamp(h, 0.005, 0.50); - if( res < -1.0 || t>maxt ) break; - + t += clamp(h, 0.05, 0.50); + if(res < -1.0) break; } res = max(res,-1.0); - return 0.25*(1.0+res)*(1.0+res)*(2.0-res); + return 0.25 * (1.0+res)*(1.0+res)*(2.0-res); } float castShadow(vec3 ro, vec3 rd) { @@ -773,25 +787,19 @@ vec3 fresnel( vec3 F0, vec3 h, vec3 l ) { return F0 + ( 1.0 - F0 ) * pow( clamp( 1.0 - dot( h, l ), 0.0, 1.0 ), 5.0 ); } -// https://suricrasia.online/blog/shader-functions/ -vec3 eRot(vec3 p, vec3 ax, float ro) { - return mix(dot(ax,p)*ax, p, cos(ro)) + sin(ro)*cross(ax,p); -} - - - vec3 addPointLight(vec3 light_pos, vec3 light_color, float shininess, vec3 v, vec3 dir, vec3 n, float occ) { vec3 Ks = vec3( .5454 ); vec3 Kd = vec3( 1. ); - vec3 ref = reflect( dir, n ); - vec3 vl = normalize( v ); + vec3 ref = reflect( dir, n); + vec3 vl = normalize( v ); vec3 diffuse = Kd * vec3( max( 0.0, dot( vl, n ) ) ); vec3 specular = vec3( max( 0.0, dot( vl, ref ) ) ); - vec3 F = fresnel( Ks, normalize( vl - dir ), vl )*occ; - float shadow = softshadow(v+n*0.01,light_pos, .01, 30., 18.); + vec3 F = fresnel( Ks, normalize( vl - dir ), vl ); + float shadow = softshadow(v+n*0.02,light_pos, .01, 30., 8.); //float shadow = castShadow(v + n*0.02, light_pos); - specular = pow( specular, vec3( shininess ) )*occ; - return light_color * mix( diffuse, specular, F ) * shadow; + //float shadow = 1.; + specular = pow( specular, vec3( shininess )) * occ; + return light_color * mix( diffuse, specular, F ) * shadow * occ; } @@ -808,44 +816,40 @@ float getAmbientOcc(vec3 p, vec3 n) { } vec3 shading(vec3 v, vec3 n, vec3 dir, float material) { - float shininess = 1.; + float shininess = 0.; float occ = getAmbientOcc(v,n); - vec3 outMaterial = vec3(0.1529, 0.1529, 0.1529); + vec3 outMaterial = vec3(0.0, 0.0, 0.0); if (material == 0.) { - outMaterial = vec3(0.2863, 0.1059, 0.2431); - shininess = 1.5; + outMaterial = vec3(0.4667, 0.4667, 0.4667); + shininess = 10.; } else if (material == 1.) { - outMaterial = vec3(0.3294, 0.0941, 0.6); - shininess = 0.6; - } else if (material == 2.) { - outMaterial = vec3(0.5804, 0.9647, 1.0); + outMaterial = vec3(0.6275, 0.1569, 0.9412); shininess = 1.; - } else if (material == 3.) { - outMaterial = vec3(0.0, 0.0, 0.0); + } else if (material == 2.) { + outMaterial = vec3(0.0314, 0.0314, 0.0314); shininess = 100.; + } else if (material == 3.) { + outMaterial = vec3(0.5451, 0.5451, 0.5451); + shininess = 1.0; } else if (material == 4.) { outMaterial = vec3(0.9961, 1.0, 0.9922); shininess = .3; } vec3 lights = vec3(0.); - lights += addPointLight(vec3( 0., -40., -1. ),vec3(0.56, 0.44, 0.18)*2., shininess, v, dir, n, occ); - lights += addPointLight(vec3( -20.,4., 10. ),vec3(0.04, 0.2, 0.71)*2., shininess, v, dir, n, occ); - // lights += addPointLight(vec3( 2., -1.0, -1.0 ),vec3(0.12, 0.51, 0.63)*2., shininess, v,dir,n,occ ); + lights += addPointLight(vec3( 2., 0., 2. ),vec3(0.12, 0.43, 0.77)*4., shininess, v, dir, n, occ); + lights += addPointLight(vec3( -2., -2., -5. ),vec3(0.27, 0.65, 0.46)*3., shininess, v, dir, n, occ); + //lights += addPointLight(vec3( 2., 1.0, 1.0 ),vec3(0.01, 1.0, 0.09)*2., shininess, v,dir,n,occ ); - vec3 lightDir = vec3(0. , 4., 2.); + vec3 lightDir = vec3( 0. , 1., 6.); float sun_dif = clamp(dot(n, lightDir), 0., 1.); float shadow = softshadow(v+n*0.01,lightDir, .01, 30., 18.); - lights += vec3(0.6627, 0.7098, 0.8863) * sun_dif*shadow*occ; //* shadow; //* mix( vec3(sun_dif), specular, F ) - - - // final += texture( iChannel0, ref ).rgb * fresnel( Ks, n, -dir ); - // vec3 col = vec3(0.4)* ref.x; + //lights += vec3(0.6431, 0.7804, 0.8588) *sun_dif*shadow*occ; - float ind = clamp( dot( n, normalize(lightDir*vec3(-1.0,.0,-1.0)) ), 0.0, 1.0 ); - lights += vec3(0.1333, 0.1333, 0.1216) * ind *occ; + float ind = clamp( dot( n, normalize(lightDir*vec3(.0,-1.0,-1.0)) ), 0.0, 1.0 ); + lights += vec3(0.1255, 0.1255, 0.1255) * ind; // * occ; return outMaterial * max(vec3(0.), lights); } @@ -909,34 +913,31 @@ vec3 getCameraFov(vec2 uv, vec3 camPos, vec3 camTarget) { vec3 camUp = normalize(cross(camForward,camRight)); float fov = 1.7; // Depth of field - float dof = .25; - vec2 h = vec2( noise(gl_FragCoord.xy, .13), noise(gl_FragCoord.xy, .4)); - //vec3 h= rnd23(gl_FragCoord.xy); + float dof = .3; + vec2 h = vec2( noise(gl_FragCoord.xy, u_time*0.1)); vec3 voff = sqrt(h.x)*(camRight*sin(h.y*6.283)+camUp*cos(h.y*6.283))*dof; - // camTarget -=voff; - float focusdistance = 150.2; + voff -=camTarget; + float focusdistance = 50.; return normalize(uv.x * camRight + uv.y * camUp + fov * camForward + voff * fov/focusdistance); } vec3 applyFog(vec3 col, float t, vec3 rd, vec3 lightDir, float b ) { float fogAmount = 1.0 - exp(-t*b); - float sunAmount = max( dot(rd, lightDir), 0.0 ); - vec3 fogColor = mix( vec3(0.3686, 0.2431, 0.4392), // blue - vec3(0.4, 0.7294, 0.9216), // yellow - pow(sunAmount,8.0) ); + float sunAmount = max( dot(rd, lightDir), 0. ); + vec3 fogColor = mix( vec3(0.1529, 0.1137, 0.2), // blue + vec3(0.2588, 0.1765, 0.3529), // yellow + pow(sunAmount,1.0) ); return mix( col, fogColor, fogAmount ); } vec3 render(vec2 uv) { bool useDof = !true; - //vec2 uv = (2.0 * gl_FragCoord.xy - u_resolution.xy) / u_resolution.y; - float angle = -2.4 +u_time*0.4; //angle = 0.; // camera - vec3 camPos = vec3(0., 5., -3.); + vec3 camPos = vec3( 0., 0., -2.); vec3 camTarget = vec3(0., 0., 0.); vec3 rayDir; @@ -945,41 +946,31 @@ vec3 render(vec2 uv) { } else { rayDir = getCameraRayDir2(uv, camPos, camTarget, 1.0); } - vec3 col = vec3(0.051, 0.0667, 0.1529); - //vec3 col = vec3(0.0314, 0.0118, 0.1255) + rayDir.y * 0.4; - vec3 hitPos = vec3(0.); - - vec3 t = castRay(camPos, rayDir, hitPos); - vec3 rd = rayDir; - - if (t.z > 0.) { - vec3 nor = calcNormal(hitPos); - col = shading(hitPos, nor, rayDir , t.y); - float fogAmount = 0.04; - col = col*exp(-t.x*fogAmount) + applyFog(col, t.x, rd, vec3(0., .3, -1.), fogAmount) * (1.0-exp(-t.x*fogAmount)); - - rayDir = normalize(reflect(rayDir, nor)); - vec3 rayOrigin = hitPos + (rayDir * 0.01); - vec3 t2 = castReflectedRay(rayOrigin, rayDir, hitPos); - if (t2.z > 0.) { - hitPos = rayOrigin + rayDir * t2.x; - nor = calcNormal(hitPos); - col += 0.1 * shading(hitPos, nor, rayDir , t2.y); - - /* rayDir = normalize(reflect(rayDir, nor)); - rayOrigin = hitPos + (rayDir * 0.01); - vec3 t3 = castReflectedRay(rayOrigin, rayDir, hitPos); - - if (t3.z > 0.) { - hitPos = rayOrigin + rayDir * t3.x; - nor = calcNormal(hitPos); - col += 0.025 * shading(hitPos, nor, rayDir , t3.y); - } */ - } - } - // pixelColor*exp(-distance*b) + fogColor*(1.0-exp(-distance*b)); + vec3 col = vec3(0.0471, 0.0471, 0.0471); + //vec3 col = vec3(0.0314, 0.0118, 0.1255) + rayDir.y * 0.4; + vec3 hitPos = vec3(0.); + vec3 t = castRay(camPos, rayDir, hitPos); + + if (t.z > 0.) { + vec3 nor = calcNormal(hitPos); + col = shading(hitPos, nor, rayDir, t.y); + + float fogAmount = 0.03; + //col = col*exp(-t.x*fogAmount) + applyFog(col, t.x, rayDir, vec3(-1., .0, 1.), fogAmount) * (1.0-exp(-t.x*fogAmount)); + col = applyFog(col, t.x, rayDir, vec3(0., .3, 1.), fogAmount); + + nor = calcNormal(hitPos); + vec3 rayDir2 = normalize(reflect(rayDir, nor)); + vec3 rayOrigin = hitPos + (rayDir2 * 0.1); + vec3 t2 = castRay(rayOrigin, rayDir2,hitPos); + if (t2.z > 0.) { + hitPos = rayOrigin + rayDir*0.01; + nor = calcNormal(hitPos); + col = .2 * shading(hitPos, nor, rayDir2 , t2.y); + } + } return col; } diff --git a/shader.glsl b/shader.glsl index 5b52754..97d6203 100644 --- a/shader.glsl +++ b/shader.glsl @@ -1,7 +1,7 @@ +// precision mediump float; uniform vec2 u_resolution; uniform float u_time; -uniform sampler2D texture_sampler; -uniform sampler2D texts; +const float PI = 22./7.; // Rotate mat2 rot2D(float angle) { @@ -10,14 +10,6 @@ mat2 rot2D(float angle) { return mat2(c, -s, s, c); } -// Exponential smoothing -float smin( float a, float b, float k ) -{ - k *= 1.0; - float r = exp2(-a/k) + exp2(-b/k); - return -k*log2(r); -} - float smax( float a, float b, float k ) { float h = max(k-abs(a-b),0.0); @@ -41,10 +33,9 @@ float noise( in vec2 p, float scale ) hash( i + vec2(1.0,1.0) ), u.x), u.y); } - float displacement( vec3 p ) { - return noise(10.*p.xy+u_time+999., 0.2) + 0.5*noise(10.*(p.xy+2.0)-u_time+999., 0.2); + return noise(10.*p.xy+u_time+1e3, 0.2) + 0.5*noise(10.*(p.xy+2.0)-u_time+1e3, 0.2); } ///////////////// @@ -59,42 +50,28 @@ float sdCappedCylinder( vec3 p, float h, float r ) float sdBox( in vec2 p, in vec2 r ) { - return length( max(abs(p)-r,0.0) ); + return length( max(abs(p)-r,0.) ); } float sdBox2(vec3 p, vec3 b) { vec3 q = abs(p) - b; - return length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0); -} - -float sdSphere(vec3 p, float r){ - return length(p) -r; + return length(max(q,0.)) + min(max(q.x,max(q.y,q.z)),0.); } float sdTriPrism( vec3 p, vec2 h, float rot ) { p.xy *= rot2D(rot); - const float k = sqrt(3.0); - h.x *= 0.5*k; - p.xy /= h.x; - p.x = abs(p.x) - 1.0; - p.y = p.y + 1.0/k; - if( p.x+k*p.y>0.0 ) p.xy=vec2(p.x-k*p.y,-k*p.x-p.y)/2.0; - p.x -= clamp( p.x, -2.0, 0.0 ); - float d1 = length(p.xy)*sign(-p.y)*h.x; - float d2 = abs(p.z)-h.y; - - return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.); + vec3 q = abs(p); + return max(q.z-h.y,max(q.x*.866025+p.y*.5,-p.y)-h.x*.5); } ////////////////// // ANIMATION // ////////////////// -const float TWOPI = 6.28318530718; // POSITIONS -vec3 lookAtPoint = vec3(0, -0.5, 0.); +/* const vec3 glyph1Pos = vec3(1.7,-1.1,0.0); const vec3 glyph2Pos = vec3(2.0,0.0,0.0); const vec3 glyph3Pos = vec3(1.5,1.4,0.0); @@ -102,47 +79,42 @@ const vec3 glyph4Pos = vec3(0.0,2.0,0.0); const vec3 glyph5Pos = vec3(1.5,1.4,0.0); const vec3 glyph6Pos = vec3(1.5 * -1.,1.4,0.0); const vec3 glyph7Pos = vec3(1.7 * -1.,-1.1,0.0); +*/ // DELAYS -const float STARTDELAY = 9.0; -const float glyphPhase = 2.0; +const float STARTDELAY = 9.; +const float glyphPhase = 2.; -// COLORS - vec3 glyphColor = vec3(0.95, 0.35, 0.06); // glyph color - vec3 color1 = vec3(0.44, 0.29, 0.46); // fog color1 - vec3 color2 = vec3(0.75, 0.45, 0.23); // fog color2 - vec3 color3 = vec3(0.29, 0.17, 0.35); // indirect light color - vec3 color4 = vec3(0.7, 0.27, 0.09); // sky color1 - vec3 color5 = vec3(0.09, 0.05, 0.66); // sky color2 - - vec3 light1Color = vec3(0.91, 0.57, 0.73); - vec3 light2Color = vec3(0.83, 0.71, 0.54); +// COLORS +vec3 fogColor1 = vec3(.4, .2, .4); // fog color1 +vec3 fogColor2 = vec3(.7, .4, .2); // fog color2 +vec3 indirColor = vec3(.2, .1, .3); // indirect light color +vec3 light1Color = vec3(.9, .5, .7); +vec3 light2Color = vec3(.8, .7, .5); // with duration d, startTime s and speed up with timeFact -float timedSine(float maxCycles, float startTime, float timeFact) { - float pi = TWOPI / 2.0; - startTime *= timeFact; - float phase = ((u_time * timeFact) - startTime) / pi; - phase = min(phase, maxCycles); - return pi * phase; +float timedSine(float maxCycles, float startTime, float timeFact) { + startTime *= timeFact; + float phase = ((u_time * timeFact) - startTime) / PI; + return PI * min(phase, maxCycles); } float calcFactor (float startTime) { - float factor = 9.0 + 9.0*clamp(sin(timedSine(1.5, startTime, 4.0) * 0.06), -0.9, 0.9); + float factor = 9. + 9.*clamp(sin(timedSine(1.5, startTime, 4.) * 0.06), -.9, .9); return factor; } // Animate ring movements vec3 ringAnim( in vec3 p) { - for (float i = 0.0; i<7.0; i++) { + for (float i = 0.; i < 7.; i++) { float rotateDelay = STARTDELAY + (i * glyphPhase); if(u_time > rotateDelay) { - if(mod(i,2.0) >= 1.0) { - p.xy = rot2D(calcFactor(rotateDelay) * -1.0) * p.xy; - } else { - p.xy = rot2D(calcFactor(rotateDelay)) * p.xy; - } + float o = 1.; + if(mod(i,2.) >= 1.) { + o = -1.; + } + p.xy *= rot2D(calcFactor(rotateDelay)*o); } } return p; @@ -151,7 +123,7 @@ vec3 ringAnim( in vec3 p) { // Animate prism movements float prismAnim(in float x, in float delay) { if(u_time >= delay) { - x += (0.045*clamp(sin((timedSine(3.0, delay, 40.0) * 0.4)),-0.8, 0.8)); + x += (.045*clamp(sin((timedSine(3., delay, 40.) * .4)),-.8, .8)); } return x; } @@ -166,108 +138,80 @@ vec2 map(in vec3 p) // Stargate // Ring boxes - const float an = TWOPI/24.0; - float sector = floor(atan(p.y,p.x)/an + 0.5); - float angrot = sector*an; + const float an = PI/12.; + float angrot = floor(atan(p.y,p.x)/an + .5)*an; vec3 q = p; q.xy = mat2(cos(angrot),-sin(angrot), sin(angrot), cos(angrot))*q.xy; - float d = sdBox( q.xy - vec2(1.8,0.0), vec2(0.24,0.14) ) - 0.02; + float d = sdBox( q.xy - vec2(1.8,0.), vec2(0.24,0.14) ) - .02; // Main ring - float d2 = abs(length(p.xy) - 1.8) - 0.2; + float d2 = abs(length(p.xy) - 1.8) - .2; d = min(d,d2); // Inner ring - float d3 = abs(length(p.xy) - 1.75) - 0.08; - d3 = smax( d3, abs(p.z - 0.1)-0.04, 0.005 ); + float d3 = abs(length(p.xy) - 1.75) - .08; + d3 = smax( d3, abs(p.z - .1)-.04, .005 ); d = max(-d3,d); // Depth slice rings - d = smax( d, abs(p.z)-0.1, 0.02 ); + d = smax( d, abs(p.z)-.1, .02 ); // Prisms - float index = 1.0; - for(int i=0; i<8; i++ ) { - - float secDist = TWOPI / 8.0; // sector distance - float angle = ((24.67 / TWOPI )); // sector size + + for(float i = 0.; i < 8.; i++ ) { + float secDist = PI / 4.; // sector distance + float angle = 24.67 / (PI * 2.); // sector size vec3 q = p; - float rotationIncrement = angle + (index * secDist); + float rotationIncrement = angle + ((i+1.)*secDist); // Nudge first and the last prism out of the ground - if (i == 1) { - rotationIncrement = rotationIncrement + 0.2; - } - if (i == 7) { - rotationIncrement = rotationIncrement - 0.2; - } - + if (i == 1.) rotationIncrement += .2; + if (i == 7.) rotationIncrement -= .2; q.xy = rot2D(rotationIncrement) * q.xy; - float rotateDelay = STARTDELAY + ((index - 2.0) * glyphPhase + 1.5); + float rotateDelay = STARTDELAY + ((i - 1.) * glyphPhase + 1.5); // We can now call each prism by it's index // draw all except the middle bottom prism - if (i > 0) { + if (i > 0.) { q.x -= 1.95; vec3 q2 = q; // new point for movable parts - - if(u_time > rotateDelay) { - q2.x = prismAnim(q2.x, rotateDelay); - } - - float prismOut = sdTriPrism(vec3(q2.x - 0.14, q2.y - 0.0 , q2.z), vec2(0.22,0.22), 0.5) - 0.01; - float prismIn = sdTriPrism(vec3(q2.x, q2.y, q2.z ), vec2(0.2,0.12), 0.5) - 0.02; - float prismTop = sdTriPrism(vec3(q.x - 0.06, q.y, q.z), vec2(0.10,0.15), 0.5) - 0.01; + if(u_time > rotateDelay) q2.x = prismAnim(q2.x, rotateDelay); + float prismOut = sdTriPrism(vec3(q2.x - .14, q2.y - 0. , q2.z), vec2(.22,.22), .5) - .01; + float prismIn = sdTriPrism(vec3(q2.x, q2.y, q2.z ), vec2(.2,.12), .5) - .02; + float prismTop = sdTriPrism(vec3(q.x - .06, q.y, q.z), vec2(.1,.15), .5) - .01; float d4 = max(-prismOut, prismIn); d4 = min(d4, prismTop); d = min(d, d4); // glyph locking thing material - if (d == d4) { - mat = 4.; - } - + if (d == d4) mat = 4.; // glyph locking prism material - if(d == prismTop) { - if(u_time > rotateDelay + 0.2) { - mat = 5.; - } - } - } - - index += 1.0; + if( d == prismTop && u_time > rotateDelay + .2) mat = 5.; + } } //Rotating glyphs vec3 p2 = ringAnim(p); - float an2 = (TWOPI/32.0); - float sector2 = floor((atan(p2.y,p2.x)/an2) + 0.5 ); - float angrot2 = sector2*an2; + float an2 = PI/16.; vec3 q2 = p2; - q2.xy = rot2D(angrot2)*q2.xy; - float d5 = sdBox2( q2.xyz - vec3(1.75,0.0,0.0), vec3(0.04, 0.14, 0.05) ) - 0.02; + q2.xy = rot2D(floor((atan(p2.y,p2.x)/an2) + .5)*an2)*q2.xy; + float d5 = sdBox2( q2.xyz - vec3(1.75,0.,0.), vec3(.04, .14, .05) ) - .02; d = min(d, d5); - if (d==d5) { - mat = 4.; - } - + if (d==d5) mat = 4.; + // Gate Base - const float stepHeight = 0.1; - float stepDist = 1.5; - const float stepWidth = 2.0; - float steps = 1000.; - + float stepDist = 1.5; + float steps = 1e3; for(int i = 0; i < 4; i++) { - float step = sdBox2(vec3(p.x,p.y+stepDist,p.z), vec3(stepWidth,stepHeight,stepDist)) - 0.05; + float step = sdBox2(vec3(p.x,p.y+stepDist,p.z), vec3(2., .1,stepDist)) - .05; steps = min(steps, step); d = min(d, step); - stepDist += stepHeight * 2.0; + stepDist += .2; } - float sand = (p.y + 4.25) + 1.5*noise((vec2((p.x*0.04),(p.z-40.0)*0.04))+100., 15.); - sand += noise(p.yz, .25); - sand += 0.025*noise(p.xz*50.+100., .05); + float sand = (p.y + 4.25) + 1.5*noise((vec2((p.x*.04),(p.z-40.)*.04))+100., 15.); + //sand += noise(p.yz, .25); // + 0.025*noise(p.xz*50.+100., .05); d = min(d,sand); float water = 1000.; @@ -281,17 +225,9 @@ vec2 map(in vec3 p) water = max(water, cylinder3); d = min(d, water); - if (d==water) - { - mat = 1.0; - } - else if (d==steps) - { - mat = 2.0; - } - else if (d==sand) { - mat = 3.0; - } + if (d==water) mat = 1.0; + if (d==steps) mat = 2.0; + if (d==sand) mat = 3.0; return vec2( d, mat ); } @@ -304,18 +240,17 @@ float rayMarch(vec3 ro, vec3 rd) { float t = 0.; // total distance travelled float d; // Raymarching - for (int i = 0; i < 100; i++) { + for (int i = 0; i < 90; i++) { vec3 p = ro + rd * t; // "cast" rays d = map(p).x; // Get distance to objects t += d; // "march" the ray - if (d < .001 || t > 500.) break; + if (abs(d) < .002 || t > 400.) break; } return t; } vec3 getNormal(vec3 p) { float d = map(p).x; - vec2 e = vec2(.01, 0); - + vec2 e = vec2(.01, 0.); vec3 n = d - vec3( map(p-e.xyy).x, map(p-e.yxy).x, @@ -327,27 +262,24 @@ float getLight(vec3 p, vec3 lightPos, float intensity, float shadow) { vec3 l = normalize(lightPos - p); vec3 n = getNormal(p); float dif = clamp(dot(n, l), 0., intensity); - // Shadows float d = rayMarch(p+n*.0025, l); - if(d delay) { - o += (0.25 - smoothstep(-0.7,0.5,sin((timedSine(1.5, delay, 35.0))))) * 0.1; - } - -return o; -} - vec3 cameraPos() { // first zoom in to the gate - vec3 cPos = vec3(0, clamp(6.-u_time,2.,6.), clamp((75.-u_time*8.0),6.,75.)); - if (u_time > 7.5) - { - cPos += vec3(0, clamp(7.5-u_time,-1.,0.), 0.); - } + vec3 cPos = vec3(0., clamp(6.-u_time,2.,6.), clamp((75.-u_time*8.),6.,75.)); + if (u_time > 7.5) cPos += vec3(0., clamp(7.5-u_time,-1.,0.), 0.); // close up shot for 1st glyph lock - if (u_time > 10.5) { - cPos = vec3(2.0,-1.0,1.0); - } - - //zoom away for 2nd glyph animation - if (u_time > 12.) { - cPos = vec3(-1.0, -1.0, 4.0); - } - + if (u_time > 10.5) cPos = vec3(2.,-1.,1.); + //zoom away for 2nd glyph animation + if (u_time > 12.) cPos = vec3(-1., -1., 4.); + //close up shot for the 2nd glyph lock - - cPos.z = cameraZoomAnim(cPos.z); - + // !NOTE: disabled by petri due takes alot of space and has small visual impact on the scene + /* + float delay = 11.2; + if(u_time > delay) cPos.z += (0.25 - smoothstep(-0.7,0.5,sin((timedSine(1.5, delay, 35.0))))) * 0.1; + */ + return cPos; } -vec3 cameraPointAt(vec3 p) { - +vec3 cameraPointAt() { + vec3 p = vec3(0., -.5, 0.); // look at 1st glyph - if(u_time > 10.5) { - p = glyph1Pos; - } - - if(u_time > 12.) { - p = vec3(0.0,0.1,0.0); - } - + if (u_time > 10.5) p = vec3(1.7,-1.1,0.); + // look gate at distance + if(u_time > 12.) p = vec3(.0,.1,0.); return p; } // flash screen with glyph color when it is locked vec3 colorFlashesAnim(in vec3 col) { - float delay = 10.75; if(u_time > delay) { - float x = smoothstep(-1.0,0.8,sin((timedSine(0.8, delay, 8.0)*2.0))); - col = mix(col, glyphColor * (x * 1.4), x * 0.76); + float x = smoothstep(-1.,.8,sin((timedSine(.8, delay, 8.)*2.))); + col = mix(col, vec3(.95, .35, .06) * (x * 1.4), x *.76); } -return col; + return col; } void main() { // Initialization vec2 uv = (gl_FragCoord.xy * 2. - u_resolution.xy) / u_resolution.y; - vec3 ro = cameraPos(); - - vec3 rd = getCameraRayDir(uv, ro, cameraPointAt(lookAtPoint), 2.); // ray direction - vec3 col = vec3(0); // color - + vec3 rd = getCameraRayDir(uv, ro, cameraPointAt(), 2.); // ray direction + vec3 col = vec3(0.); // color float d = rayMarch(ro, rd); - if (d < 500.) { + if (d < 150.) { // Lighting vec3 p = ro + rd * d; - float mat = map(p).y; // Light 1 Arguments @@ -463,68 +362,42 @@ void main() float dif = 0.; //getLight(p, vec3( 2, 50, 2), .5, .2); // Color for light 1 // col = vec3(dif * vec3(0.9216, 0.9294, 0.9412)); + // Light 2 - dif = getLight(p, vec3( -3, 5, 5), 1., 0.2); - // Color for light 2 - col += vec3(dif * light1Color); + dif = getLight(p, vec3( 10., 15., 25.), 1., .2); + col += dif * light1Color; - dif = getLight(p, vec3( 3, -2, 5), 0.75, .8); - // Color for light 2 - col += vec3(dif * light2Color); + dif = getLight(p, vec3( 4., 2., -15.), 1., 1.); + col += dif * light2Color; - vec3 lightPosition = glyph1Pos; - lightPosition.z = lightPosition.z + 0.3; - // dif = getLight(p, lightPosition, 3.75, 1.0); - - - // float minLight = 0.01; - // float radius = sqrt(1.0 / (lightPosition * minLight)) - vec3 ld = lightPosition-p; - float len = length( ld ); // Distance from the light to the surface point. - ld /= len; // Normalizing the light-to-surface, aka light-direction, vector. - // float lightAtten = min( 1.0 / ( 0.25*len*len ), 1.0 ); // Keeps things between 0 and 1. - - // float att = clamp(1.0 - len/radius, 0.0, 1.0); - - + /*vec3 lightPosition = vec3(1.7,-1.1,0.3); + float len = length( lightPosition - p); float att = 8.0 / (1.0 + 8.1*len + 0.01*len*len); // light attenuation - if(u_time > 10.76) { - col += vec3(dif * glyphColor * att); - } + col += vec3(dif * vec3(0.95, 0.35, 0.06) * att); + }*/ - vec3 n = getNormal(p); - vec3 dir = vec3(1. , 10., 1.); - float ind = clamp( dot( n, normalize(dir )), 0.0, 1.0 ); - col += color3 * ind; + // indirect lightning -> vec3 in normalize is light direction + col += indirColor * clamp( dot( getNormal(p), normalize(vec3(0. , 1., 10.))), 0., 1.); - if(mat==0.){ - col *= vec3(.3,0.3,0.3); - } - else if(mat==1.){ - col *= vec3(0.,0.,0.5); // + (noise(5.*(p.xy+2.)+u_time, -1.0) * noise(50.*(p.xy+2.), -0.4) + 0.5*noise(20.*(p.xy+2.0)-u_time, -0.5) * noise(5.*(p.xy+2.0), -0.75))*smoothstep(0.,0.75,(u_time-5.0)*0.1) + vec3(0.,0.,0.5*noise(10.*(p.xy+4.0)-u_time, -0.5)); - } - else if(mat==2.){ - col *= vec3(0.3608, 0.1765, 0.0471); // - 0.2*noise((vec2(100.*p.x+300.,75.*p.z+150.0)), -2.2) * noise((vec2(15.*p.x+2.0,3.*p.z+2.)), -1.) + noise((vec2(15.*p.x+2.4,3.*p.z+2.)), -0.25); - } - else if(mat==3.){ - col *= vec3(0.8471, 0.8549, 0.4667); // + noise(p.xz*1000.+5000., 0.1) + noise(p.xz*1000.+5000., 0.1); - } - else if(mat==4.){ - col *= vec3(.1,0.1,0.1); - } else if(mat ==5.) { - col *= glyphColor; // activated glyph color - } - - float fogAmount = 0.02; - col = col*exp(-d*fogAmount) + applyFog(col, d, rd, vec3(0., .3, -1.), fogAmount) * (1.0-exp(-d*fogAmount)); - - } else { - col = mix(color4, color5, rd.y * 1.2); - } - - col = colorFlashesAnim(col); // animated color flash - - gl_FragColor = vec4(postProcess(col), 1); + if(mat==0.) + col *= vec3(.3); + else if(mat==1.) + col *= vec3(0.,0.,.5); // + (noise(5.*(p.xy+2.)+u_time, -1.0) * noise(50.*(p.xy+2.), -0.4) + 0.5*noise(20.*(p.xy+2.0)-u_time, -0.5) * noise(5.*(p.xy+2.0), -0.75))*smoothstep(0.,0.75,(u_time-5.0)*0.1) + vec3(0.,0.,0.5*noise(10.*(p.xy+4.0)-u_time, -0.5)); + else if(mat==2.) + col *= vec3(.3, .1, .0); // - 0.2*noise((vec2(100.*p.x+300.,75.*p.z+150.0)), -2.2) * noise((vec2(15.*p.x+2.0,3.*p.z+2.)), -1.) + noise((vec2(15.*p.x+2.4,3.*p.z+2.)), -0.25); + else if(mat==3.) + col *= vec3(.8, .8, .5) + noise(p.xz*500.+100., .3); // + noise(p.xz*1000.+5000., 0.1) + noise(p.xz*1000.+5000., 0.1); + else if(mat==4.) + col *= vec3(.1); + else if(mat ==5.) + col *= vec3(0.9, 0.3, 0.); // activated glyph color + } + float fogAmount = .01; + // col = col*exp(-d*fogAmount) + applyFog(col, d, rd, vec3(0., .3, -1.), fogAmount) * (1.0-exp(-d*fogAmount)); + col = applyFog(col, d, rd, vec3(0., -.1, -1.), fogAmount); + + col = colorFlashesAnim(col); // animated color flash + gl_FragColor = vec4(postProcess(col), 1.); } diff --git a/shader_minified.h b/shader_minified.h index 6fd6402..4586aba 100644 --- a/shader_minified.h +++ b/shader_minified.h @@ -1,294 +1,250 @@ // Generated with Shader Minifier 1.3.6 (https://github.com/laurentlb/Shader_Minifier/) #ifndef SHADER_MINIFIED_H_ # define SHADER_MINIFIED_H_ -# define VAR_texts "f" -# define VAR_texture_sampler "x" -# define VAR_u_resolution "i" -# define VAR_u_time "v" +# define VAR_u_resolution "v" +# define VAR_u_time "y" const char *__temp_cleaned_shader_glsl = - "uniform vec2 i;" - "uniform float v;" - "uniform sampler2D x,f;" - "mat2 n(float v)" + "uniform vec2 v;" + "uniform float y;" + "const float m=22./7.;" + "mat2 f(float v)" "{" - "float f=sin(v),y=cos(v);" - "return mat2(y,-f,f,y);" + "float y=sin(v),f=cos(v);" + "return mat2(f,-y,y,f);" "}" - "float n(float v,float y,float x)" + "float f(float v,float y,float m)" "{" - "float i=max(x-abs(v-y),0.);" - "return max(v,y)+i*i*.25/x;" + "float f=max(m-abs(v-y),0.);" + "return max(v,y)+f*f*.25/m;" "}" - "float s(vec2 v)" + "float n(vec2 v)" "{" "v=50.*fract(v*.3183099);" "return fract(v.x*v.y*(v.x+v.y));" "}" - "float n(vec2 v,float y)" + "float f(vec2 v,float y)" "{" - "vec2 f=floor(v),m=fract(v),c=m*m*(3.-2.*m);" - "return-y+y*mix(mix(s(f+vec2(0)),s(f+vec2(1,0)),c.x),mix(s(f+vec2(0,1)),s(f+vec2(1)),c.x),c.y);" + "vec2 m=floor(v),f=fract(v),c=f*f*(3.-2.*f);" + "return-y+y*mix(mix(n(m+vec2(0)),n(m+vec2(1,0)),c.x),mix(n(m+vec2(0,1)),n(m+vec2(1)),c.x),c.y);" "}" - "float m(vec3 y)" + "float x(vec3 v)" "{" - "return n(10.*y.xy+v+999.,.2)+.5*n(10.*(y.xy+2.)-v+999.,.2);" + "return f(10.*v.xy+y+1e3,.2)+.5*f(10.*(v.xy+2.)-y+1e3,.2);" "}" - "float m(vec3 v,vec3 y,vec3 m,float x)" + "float n(vec3 v,float y,float m)" "{" - "vec3 f=m-y,c=v-y;" - "float i=dot(f,f),a=dot(c,f),s=length(c*i-f*a)-x*i,z=abs(a-i*.5)-i*.5,d=s*s,D=z*z*i,g=max(s,z)<0.?" - "-min(d,D):" - "(s>0.?" - "d:" - "0.)+(z>0.?" - "D:" - "0.);" - "return sign(g)*sqrt(abs(g))/i;" + "vec2 f=abs(vec2(length(v.xy),v.z))-vec2(m,y);" + "return min(max(f.x,f.y),0.)+length(max(f,0.));" "}" - "float m(vec3 v,vec3 y)" + "float n(vec3 v,vec3 y)" "{" "vec3 f=abs(v)-y;" "return length(max(f,0.))+min(max(f.x,max(f.y,f.z)),0.);" "}" - "float s(vec3 v,vec2 f)" + "float x(vec3 v,vec2 y)" "{" - "v.xy*=n(.5);" - "const float y=sqrt(3.);" - "f.x*=.5*y;" - "v.xy/=f.x;" - "v.x=abs(v.x)-1.;" - "v.y=v.y+1./y;" - "if(v.x+y*v.y>0.)" - "v.xy=vec2(v.x-y*v.y,-y*v.x-v.y)/2.;" - "v.x-=clamp(v.x,-2.,0.);" - "float i=length(v.xy)*sign(-v.y)*f.x,z=abs(v.z)-f.y;" - "return length(max(vec2(i,z),0.))+min(max(i,z),0.);" + "v.xy*=f(.5);" + "vec3 m=abs(v);" + "return max(m.z-y.y,max(m.x*.866025+v.y*.5,-v.y)-y.x*.5);" "}" - "vec3 y=vec3(0,-.5,0);" - "const vec3 l=vec3(1.7,-1.1,0),c=vec3(2,0,0),a=vec3(1.5,1.4,0),z=vec3(0,2,0),p=vec3(1.5,1.4,0),r=vec3(-1.5,1.4,0),C=vec3(-1.7,-1.1,0);" - "vec3 d=vec3(.95,.35,.06),g=vec3(.44,.29,.46),D=vec3(.75,.45,.23),F=vec3(.29,.17,.35),K=vec3(.7,.27,.09),J=vec3(.09,.05,.66),e=vec3(.91,.57,.73),H=vec3(.83,.71,.54);" - "float m(float y,float f,float m)" + "vec3 i=vec3(.4,.2,.4),c=vec3(.7,.4,.2),a=vec3(.2,.1,.3),s=vec3(.9,.5,.7),k=vec3(.8,.7,.5);" + "float x(float v,float f,float x)" "{" - "float i=2.*acos(-1.)/2.;" - "f*=m;" - "float r=(v*m-f)/i;" - "r=min(r,y);" - "return i*r;" + "f*=x;" + "float i=(y*x-f)/m;" + "return m*min(i,v);" "}" - "float t(float v)" + "vec3 p(vec3 v)" "{" - "return 9.+9.*clamp(sin(m(1.5,v,4.)*.06),-.9,.9);" - "}" - "vec3 h(vec3 y)" - "{" - "for(float f=0.;f<7.;f++)" + "for(float m=0.;m<7.;m++)" "{" - "float i=9.+f*2.;" - "if(v>i)" - "if(mod(f,2.)>=1.)" - "y.xy=n(t(i)*-1.)*y.xy;" - "else" - " y.xy=n(t(i))*y.xy;" - "}" - "return y;" - "}" - "float h(float y,float f)" - "{" - "if(v>=f)" - "y+=.045*clamp(sin(m(3.,f,40.)*.4),-.8,.8);" - "return y;" - "}" - "vec2 w(vec3 f)" - "{" - "float y=0.;" - "const float i=2.*acos(-1.)/24.;" - "float z=floor(atan(f.y,f.x)/i+.5)*i;" - "vec3 r=f;" - "r.xy=mat2(cos(z),-sin(z),sin(z),cos(z))*r.xy;" - "float c=length(max(abs(r.xy-vec2(1.8,0))-vec2(.24,.14),0.))-.02;" - "c=min(c,abs(length(f.xy)-1.8)-.2);" - "float x=abs(length(f.xy)-1.75)-.08;" - "x=n(x,abs(f.z-.1)-.04,.005);" - "c=max(-x,c);" - "c=n(c,abs(f.z)-.1,.02);" - "float a=1.;" - "for(int e=0;e<8;e++)" - "{" - "vec3 d=f;" - "float g=24.67/(2.*acos(-1.))+a*(2.*acos(-1.)/8.);" - "if(e==1)" - "g+=.2;" - "if(e==7)" - "g-=.2;" - "d.xy=n(g)*d.xy;" - "float D=(a-2.)*2.+1.5+9.;" - "if(e>0)" + "float c=9.+m*2.;" + "if(y>c)" "{" - "d.x-=1.95;" - "vec3 l=d;" - "if(v>D)" - "l.x=h(l.x,D);" - "float J=s(vec3(l.x-.14,l.yz),vec2(.22))-.01,H=s(vec3(l),vec2(.2,.12))-.02,w=s(vec3(d.x-.06,d.yz),vec2(.1,.15))-.01,K=max(-J,H);" - "K=min(K,w);" - "c=min(c,K);" - "if(c==K)" - "y=4.;" - "if(c==w)" - "if(v>D+.2)" - "y=5.;" + "float i=1.;" + "if(mod(m,2.)>=1.)" + "i=-1.;" + "v.xy*=f((9.+9.*clamp(sin(x(1.5,c,4.)*.06),-.9,.9))*i);" "}" - "a+=1.;" "}" - "vec3 d=h(f);" - "float e=2.*acos(-1.)/32.;" - "vec3 l=d;" - "l.xy=n(floor(atan(d.y,d.x)/e+.5)*e)*l.xy;" - "float D=m(l.xyz-vec3(1.75,0,0),vec3(.04,.14,.05))-.02;" - "c=min(c,D);" - "if(c==D)" - "y=4.;" - "float g=1.5,K=1e3;" - "for(int J=0;J<4;J++)" - "{" - "float w=m(vec3(f.x,f.y+g,f.z),vec3(2,.1,g))-.05;" - "K=min(K,w);" - "c=min(c,w);" - "g+=.2;" - "}" - "float w=f.y+4.25+1.5*n(vec2(f.x*.04,(f.z-40.)*.04)+1e2,15.);" - "w+=n(f.yz,.25);" - "w+=.025*n(f.xz*50.+1e2,.05);" - "c=min(c,w);" - "float J=1e3,H=m(f,vec3(0),vec3(0,0,-.01),1.6),p=m(f,vec3(0,0,1),vec3(0,0,-1),clamp(2.-v*2.+46.,0.,2.)),C=m(f,vec3(0,0,1),vec3(0,0,-1),1.6),F=0.;" - "F=m(f)*clamp((v-24.)*.5,0.,.25);" - "H+=F;" - "J=max(-p,H);" - "J=max(J,C);" - "c=min(c,J);" - "if(c==J)" - "y=1.;" - "else if(c==K)" - "y=2.;" - "else if(c==w)" - "y=3.;" - "return vec2(c,y);" + "return v;" "}" - "float t(vec3 v,vec3 y)" + "float p(float v,float f)" "{" - "float f=0.,c;" - "for(int i=0;i<100;i++)" + "if(y>=f)" + "v+=.045*clamp(sin(x(3.,f,40.)*.4),-.8,.8);" + "return v;" + "}" + "vec2 h(vec3 v)" + "{" + "float c=0.;" + "const float i=m/12.;" + "float a=floor(atan(v.y,v.x)/i+.5)*i;" + "vec3 r=v;" + "r.xy=mat2(cos(a),-sin(a),sin(a),cos(a))*r.xy;" + "float e=length(max(abs(r.xy-vec2(1.8,0))-vec2(.24,.14),0.))-.02;" + "e=min(e,abs(length(v.xy)-1.8)-.2);" + "float s=abs(length(v.xy)-1.75)-.08;" + "s=f(s,abs(v.z-.1)-.04,.005);" + "e=max(-s,e);" + "e=f(e,abs(v.z)-.1,.02);" + "for(float l=0.;l<8.;l++)" "{" - "vec3 z=v+y*f;" - "c=w(z).x;" - "f+=c;" - "if(c<.001||f>5e2)" + "vec3 h=v;" + "float z=24.67/(m*2.)+(l+1.)*(m/4.);" + "if(l==1.)" + "z+=.2;" + "if(l==7.)" + "z-=.2;" + "h.xy=f(z)*h.xy;" + "float k=(l-1.)*2.+1.5+9.;" + "if(l>0.)" + "{" + "h.x-=1.95;" + "vec3 d=h;" + "if(y>k)" + "d.x=p(d.x,k);" + "float t=x(vec3(d.x-.14,d.yz),vec2(.22))-.01,C=x(vec3(d),vec2(.2,.12))-.02,F=x(vec3(h.x-.06,h.yz),vec2(.1,.15))-.01,g=max(-t,C);" + "g=min(g,F);" + "e=min(e,g);" + "if(e==g)" + "c=4.;" + "if(e==F&&y>k+.2)" + "c=5.;" + "}" + "}" + "vec3 h=p(v);" + "float z=m/16.;" + "vec3 l=h;" + "l.xy=f(floor(atan(h.y,h.x)/z+.5)*z)*l.xy;" + "float g=n(l.xyz-vec3(1.75,0,0),vec3(.04,.14,.05))-.02;" + "e=min(e,g);" + "if(e==g)" + "c=4.;" + "float k=1.5,d=1e3;" + "for(int t=0;t<4;t++)" + "{" + "float C=n(vec3(v.x,v.y+k,v.z),vec3(2,.1,k))-.05;" + "d=min(d,C);" + "e=min(e,C);" + "k+=.2;" + "}" + "float C=v.y+4.25+1.5*f(vec2(v.x*.04,(v.z-40.)*.04)+1e2,15.);" + "e=min(e,C);" + "float t=1e3,F=n(v,.025,1.6),E=n(v,2.,clamp(2.-y*2.+46.,0.,2.)),D=n(v,.3,1.6),u=0.;" + "u=x(v)*clamp((y-24.)*.5,0.,.25);" + "F+=u;" + "t=max(-E,F);" + "t=max(t,D);" + "e=min(e,t);" + "if(e==t)" + "c=1.;" + "if(e==d)" + "c=2.;" + "if(e==C)" + "c=3.;" + "return vec2(e,c);" + "}" + "float h(vec3 v,vec3 y)" + "{" + "float i=0.,f;" + "for(int e=0;e<90;e++)" + "{" + "vec3 m=v+y*i;" + "f=h(m).x;" + "i+=f;" + "if(abs(f)<.002||i>4e2)" "break;" "}" - "return f;" + "return i;" "}" - "vec3 A(vec3 v)" + "vec3 r(vec3 v)" "{" - "float y=w(v).x;" - "vec2 f=vec2(.01,0);" - "vec3 c=y-vec3(w(v-f.xyy).x,w(v-f.yxy).x,w(v-f.yyx));" - "return normalize(c);" + "float m=h(v).x;" + "vec2 y=vec2(.01,0);" + "vec3 f=m-vec3(h(v-y.xyy).x,h(v-y.yxy).x,h(v-y.yyx));" + "return normalize(f);" "}" - "float A(vec3 v,vec3 f,float y,float m)" + "float h(vec3 v,vec3 m,float y)" "{" - "vec3 c=normalize(f-v),i=A(v);" - "float x=clamp(dot(i,c),0.,y),z=t(v+i*.0025,c);" - "if(z10.7)" - "y+=(.25-smoothstep(-.7,.5,sin(m(1.5,10.7,35.))))*.1;" - "return y;" + "vec3 v=vec3(0,clamp(6.-y,2.,6.),clamp(75.-y*8.,6.,75.));" + "if(y>7.5)" + "v+=vec3(0,clamp(7.5-y,-1.,0.),0);" + "if(y>10.5)" + "v=vec3(2,-1,1);" + "if(y>12.)" + "v=vec3(-1,-1,4);" + "return v;" "}" - "vec3 A()" + "vec3 f()" "{" - "vec3 f=vec3(0,clamp(6.-v,2.,6.),clamp(75.-v*8.,6.,75.));" - "if(v>7.5)" - "f+=vec3(0,clamp(7.5-v,-1.,0.),0);" - "if(v>10.5)" - "f=vec3(2,-1,1);" - "if(v>12.)" - "f=vec3(-1,-1,4);" - "f.z=E(f.z);" - "return f;" + "vec3 v=vec3(0,-.5,0);" + "if(y>10.5)" + "v=vec3(1.7,-1.1,0);" + "if(y>12.)" + "v=vec3(0,.1,0);" + "return v;" "}" - "vec3 G(vec3 y)" + "vec3 t(vec3 v)" "{" - "if(v>10.5)" - "y=l;" - "if(v>12.)" - "y=vec3(0,.1,0);" - "return y;" - "}" - "vec3 I(vec3 f)" - "{" - "if(v>10.75)" + "if(y>10.75)" "{" - "float y=smoothstep(-1.,.8,sin(m(.8,10.75,8.)*2.));" - "f=mix(f,y*1.4*d,y*.76);" + "float f=smoothstep(-1.,.8,sin(x(.8,10.75,8.)*2.));" + "v=mix(v,f*1.4*vec3(.95,.35,.06),f*.76);" "}" - "return f;" + "return v;" "}" "void main()" "{" - "vec2 f=(gl_FragCoord.xy*2.-i.xy)/i.y;" - "vec3 c=A(),z=A(f,c,G(y)),m=vec3(0);" - "float x=t(c,z);" - "if(x<5e2)" + "vec2 m=(gl_FragCoord.xy*2.-v.xy)/v.y;" + "vec3 y=e(),x=p(m,y,f()),l=vec3(0);" + "float d=h(y,x);" + "if(d<150.)" "{" - "vec3 s=c+z*x;" - "float a=w(s).y,r=0.;" - "r=A(s,vec3(-3,5,5),1.,.2);" - "m+=vec3(r*e);" - "r=A(s,vec3(3,-2,5),.75,.8);" - "m+=vec3(r*H);" - "vec3 n=l;" - "n.z=n.z+.3;" - "vec3 C=n-s;" - "float p=length(C);" - "C/=p;" - "float E=8./(1.+8.1*p+.01*p*p);" - "if(v>10.76)" - "m+=vec3(r*d*E);" - "vec3 h=A(s);" - "m+=F*clamp(dot(h,normalize(vec3(1,10,1))),0.,1.);" - "if(a==0.)" - "m*=vec3(.3);" - "else if(a==1.)" - "m*=vec3(0,0,.5);" - "else if(a==2.)" - "m*=vec3(.3608,.1765,.0471);" - "else if(a==3.)" - "m*=vec3(.8471,.8549,.4667);" - "else if(a==4.)" - "m*=vec3(.1);" - "else if(a==5.)" - "m*=d;" - "m=m*exp(-x*.02)+mix(m,mix(g,D,pow(max(dot(z,vec3(0,.3,-1)),0.),8.)),1.-exp(-x*.02))*(1.-exp(-x*.02));" + "vec3 z=y+x*d;" + "float g=h(z).y,C=0.;" + "C=h(z,vec3(10,15,25),.2);" + "l+=C*s;" + "C=h(z,vec3(4,2,-15),1.);" + "l+=C*k;" + "l+=a*clamp(dot(r(z),normalize(vec3(0,1,10))),0.,1.);" + "if(g==0.)" + "l*=vec3(.3);" + "else if(g==1.)" + "l*=vec3(0,0,.5);" + "else if(g==2.)" + "l*=vec3(.3,.1,0);" + "else if(g==3.)" + "l*=vec3(.8,.8,.5)+f(z.xz*5e2+1e2,.3);" + "else if(g==4.)" + "l*=vec3(.1);" + "else if(g==5.)" + "l*=vec3(.9,.3,0);" "}" - "else" - " m=mix(K,J,z.y*1.2);" - "m=I(m);" - "gl_FragColor=vec4(B(m),1);" + "l=mix(l,mix(i,c,pow(max(dot(x,vec3(0,-.1,-1)),0.),8.)),1.-exp(-d*.01));" + "l=t(l);" + "gl_FragColor=vec4(e(l),1);" "}"; #endif // SHADER_MINIFIED_H_