1#version 120
2// Compatibility #ifdefs needed for parameters
3#ifdef GL_ES
4#define COMPAT_PRECISION mediump
5#else
6#define COMPAT_PRECISION
7#endif
8
9// Parameter lines go here:
10#pragma parameter RETRO_PIXEL_SIZE "Retro Pixel Size" 0.84 0.0 1.0 0.01
11#ifdef PARAMETER_UNIFORM
12// All parameter floats need to have COMPAT_PRECISION in front of them
13uniform COMPAT_PRECISION float RETRO_PIXEL_SIZE;
14#else
15#define RETRO_PIXEL_SIZE 0.84
16#endif
17
18#if defined(VERTEX)
19
20#if __VERSION__ >= 130
21#define COMPAT_VARYING out
22#define COMPAT_ATTRIBUTE in
23#define COMPAT_TEXTURE texture
24#else
25#define COMPAT_VARYING varying
26#define COMPAT_ATTRIBUTE attribute
27#define COMPAT_TEXTURE texture2D
28#endif
29
30#ifdef GL_ES
31#define COMPAT_PRECISION mediump
32#else
33#define COMPAT_PRECISION
34#endif
35
36COMPAT_ATTRIBUTE vec4 VertexCoord;
37COMPAT_ATTRIBUTE vec4 COLOR;
38COMPAT_ATTRIBUTE vec4 TexCoord;
39COMPAT_VARYING vec4 COL0;
40COMPAT_VARYING vec4 TEX0;
41// out variables go here as COMPAT_VARYING whatever
42
43vec4 _oPosition1;
44uniform mat4 MVPMatrix;
45uniform COMPAT_PRECISION int FrameDirection;
46uniform COMPAT_PRECISION int FrameCount;
47uniform COMPAT_PRECISION vec2 OutputSize;
48uniform COMPAT_PRECISION vec2 TextureSize;
49uniform COMPAT_PRECISION vec2 InputSize;
50
51// compatibility #defines
52#define vTexCoord TEX0.xy
53#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
54#define OutSize vec4(OutputSize, 1.0 / OutputSize)
55
56void main()
57{
58    gl_Position = MVPMatrix * VertexCoord;
59    TEX0.xy = VertexCoord.xy;
60// Paste vertex contents here:
61}
62
63#elif defined(FRAGMENT)
64
65#if __VERSION__ >= 130
66#define COMPAT_VARYING in
67#define COMPAT_TEXTURE texture
68out vec4 FragColor;
69#else
70#define COMPAT_VARYING varying
71#define FragColor gl_FragColor
72#define COMPAT_TEXTURE texture2D
73#endif
74
75#ifdef GL_ES
76#ifdef GL_FRAGMENT_PRECISION_HIGH
77precision highp float;
78#else
79precision mediump float;
80#endif
81#define COMPAT_PRECISION mediump
82#else
83#define COMPAT_PRECISION
84#endif
85
86uniform COMPAT_PRECISION int FrameDirection;
87uniform COMPAT_PRECISION int FrameCount;
88uniform COMPAT_PRECISION vec2 OutputSize;
89uniform COMPAT_PRECISION vec2 TextureSize;
90uniform COMPAT_PRECISION vec2 InputSize;
91uniform sampler2D Texture;
92COMPAT_VARYING vec4 TEX0;
93// in variables go here as COMPAT_VARYING whatever
94
95// compatibility #defines
96#define Source Texture
97#define vTexCoord TEX0.xy
98
99#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
100#define OutSize vec4(OutputSize, 1.0 / OutputSize)
101
102// delete all 'params.' or 'registers.' or whatever in the fragment
103float iGlobalTime = float(FrameCount)*0.025;
104vec2 iResolution = OutputSize.xy;
105
106float zigzag( float x )
107{
108   /* float y = mod(x,3.142 ) / 3.142;
109    if ( y > 0.5 )
110    {
111        return 1.0-(y -0.5)/0.5;
112    }
113    return (y*2.0); */
114
115    return cos(x);
116}
117
118float box( vec3 position, vec3 lengths, vec3 raypos )
119{
120    vec3 p = raypos - position;
121
122    float d0 = max( p.x - lengths.x, -p.x - lengths.x );
123    float d1 = max( p.y - lengths.y, -p.y - lengths.y );
124    float d2 = max( p.z - lengths.z, -p.z - lengths.z );
125    return vec4( max( d0, max(d1,d2 )), 1.0,0, 0.8).x;
126}
127
128float cylinder( vec3 position, vec2 dim, vec3 raypos )
129{
130    vec3 p = raypos - position;
131    return max( length( p.zy ) - dim.x,
132                 max( p.x - dim.y, -p.x - dim.y));
133}
134
135
136
137float feature( vec3 position, vec2 dim, vec3 raypos )
138{
139
140   // float zoff = float(int(raypos.z / 10.0));
141    float y = (iGlobalTime*100.0);
142    float x = -zigzag( (y+raypos.z)/100.0 )*40.0;
143
144    position.y -= floor( mod( (raypos.z + y) / 1000.0 , 2.0 )) * 10.0;
145
146    //roadpos.y += iGlobalTime*100.0;
147    //position.x += x; //zigzag( raypos.z/100.0 )*40.0 ;
148
149    //position.x = x;
150    float c0, c1, c2;
151    {
152    vec3 r = vec3( raypos.x, raypos.y, mod( raypos.z + y + 1000.0, 10.0 ) );
153  //  vec3 r = mod( raypos,10.0 );
154    vec3 p = r - vec3( position.x + x, position.y, position.z  );
155    c0 =  max( length( p.zx ) - dim.x,
156                 max( p.y - dim.y, -p.y - dim.y));
157    }
158
159     {
160    vec3 r = vec3( raypos.x, raypos.y, mod( raypos.z + 1000.0 + y, 10.0 ) );
161    vec3 p = r - vec3( -position.x + x, position.y, position.z );
162    c1 =  max( length( p.zx ) - dim.x,
163                 max( p.y - dim.y, -p.y - dim.y));
164    }
165
166    {
167    vec3 r = vec3( raypos.x, raypos.y, mod( raypos.z + 1000.0 + y, 10.0 ) );
168    vec3 p = r - vec3(  x, position.y + dim.y, position.z );
169    c2 =  max( length( p.zy ) - dim.x * 0.5,
170                 max( p.x - 15.0, -p.x - 15.0));
171    }
172
173    return min( min(c0,c1 ), c2 );
174}
175
176
177
178vec4 road( vec2 roadpos )
179{
180    vec4 surface = vec4( 0.5,0.5,0.5,1.0);
181
182
183    roadpos.y += iGlobalTime*100.0;
184    roadpos.x += zigzag( roadpos.y/100.0 )*40.0 ;
185    vec2 roadabs = abs(roadpos );
186
187    if ( roadabs.x > 10.0 )
188    {
189
190        if ( roadabs.x > 12.0)
191        {
192        	surface = vec4(0.0,1.0,0.0,1.0 );
193        }
194        else
195        {
196            float fy =  floor( (roadabs.y) / 0.8 );
197            if ( mod( fy, 2.0 ) == 0.0 )
198            {
199            	surface = vec4( 1,1,1,1.0);
200            }
201            else
202            {
203                surface = vec4( 1.0,0.0,0.0,1.0);
204            }
205        }
206    }
207    else
208    {
209        if ( roadabs.x < 0.1 )
210        {
211            float fy =  floor( (roadabs.y + 2.0 ) / 4.0 );
212            if ( mod( fy, 2.0 ) == 0.0 )
213            {
214            	surface = vec4( 1,1,1,1.0);
215            }
216            else
217            {
218                surface = vec4( 0.5,0.5,0.5,1.0);
219            }
220        }
221        else
222        {
223        	surface = vec4( 0.5,0.5,0.5,1.0);
224        }
225    }
226
227    float fy = floor( roadabs.y / 20.0 );
228
229
230
231
232    if ( mod( fy, 2.0 ) == 0.0 )
233    {
234        surface *= 0.8;
235    }
236
237    return surface;
238
239}
240
241float sphere( vec3 spherepos, float r, vec3 raypos )
242{
243    return distance( spherepos, raypos ) - r;
244}
245
246vec4 getlight( vec3 normal, vec3 position, vec3 lightpos, vec4 lightcolour  )
247{
248    vec4 amb = vec4(0.3,0.3,0.3,1.0);
249    float d = distance( position, lightpos );
250    vec3 n = normalize( position - lightpos );
251    if ( dot( normal, n ) > 0.5 )
252    {
253        return lightcolour + amb;;
254    }
255    else if ( dot( normal, n ) > 0.1 )
256    {
257        return lightcolour * 0.5 + amb;;
258    }
259
260    return amb;
261
262}
263
264
265float smin( float a,  float b, float k )
266{
267    float res = exp( -k*a ) + exp( -k*b );
268    float blend = -log( res )/k;
269    return blend;
270}
271
272
273float sdf( vec3 raypos )
274{
275#ifdef MOUSE
276    float xpos = iMouse.x / iResolution.x - 0.5 ;
277#else
278    float xpos = 0.0 / iResolution.x - 0.5 ;
279#endif
280    float y = (iGlobalTime-3.0)*100.0;
281    float x = (xpos * 0.0 + zigzag( y/100.0 ))*40.0;
282    //float e = 1.0; //abs( 0.5 + abs( cos( iGlobalTime )) * 3.0 ) ;
283    float sdf0 = cylinder( vec3( x, 0.5, 0.0 ), vec2( 0.49,1.3 ), raypos  );
284    float sdf1 = cylinder( vec3( x, 0.5, 2.0 ), vec2( 0.49,1.2 ), raypos  );
285    float sdf2 =  box( vec3( x, 0.7, 1.0 ), vec3( 1.0, 0.5, 1.0), raypos);
286    float sdf3 =  feature( vec3(15.0,0,5.0), vec2(1.0,4.0), raypos );
287
288    return
289        	 min( sdf3,
290                min( sdf2,
291                    min( sdf1,
292                        min( sdf0, min(raypos.y, 20.0-raypos.y ))
293                    )
294                )
295              );
296                    //sphere( vec3( 0,10, 0.0), 2.0, raypos ), e );
297}
298
299vec4 contact( vec3 position, vec3 normal, float scale )
300{
301    float s = sdf( position + normal * scale );
302
303    if ( s < scale )
304    {
305        return vec4(0.8,0.8,0.8,1.0);
306    }
307
308    return   vec4(1.0,1.0,1.0,1.0);
309
310
311}
312
313vec3 grad( vec3 raypos, float delta )
314{
315    float dx =  sdf( raypos + vec3( delta, 0,0 ) ) - sdf( raypos - vec3( delta,0,0 ) );
316    float dy =  sdf( raypos + vec3( 0, delta,0 ) ) - sdf( raypos - vec3( 0,delta,0 ) );
317    float dz =  sdf( raypos + vec3( 0,0, delta ) ) - sdf( raypos - vec3( 0,0,delta ) );
318    return vec3( dx,dy,dz );
319    //return vec3(0,-1.0,0);
320}
321
322vec4 march( vec3 ray, vec3 origin, float ep, vec2 uv)
323{
324    vec3 p = origin;
325    //int pscale = int(  float(iFrameRate) / 60.0 * 1024.0);
326    for ( int i = 0; i < 256; i++ )
327    {
328       /* if ( i == pscale )
329        {
330            break;
331        } */
332        float step = sdf(p);
333        if ( step  <  ep )
334        {
335            if ( p.y  > 19.0 )
336            {
337    			return vec4( 0.3,0.3,1.0,1.0) *  ( (uv.y - 0.5) / 0.5  ) +
338                       vec4( 1.0,1.0,1.0,1.0) *  (1.0 - ( (uv.y-0.5) / 0.5  )) ;
339            }
340            else if ( p.y  > ep )
341            {
342            	vec3 normal = normalize( grad( p, 0.1 ) );
343            	return getlight( normal, p,  vec3( 500 ,0,1000 ), vec4(1.0, 1.0, 1.0, 0 ));
344                	   //getlight( normal, p,  vec3( -100,-100,-100 ), vec4(0.0,1.0,1.0,1.0 )) ;
345            }
346
347            else
348        	{
349            	return road( vec2( p.x, p.z ) ) * contact( p, vec3(0.0,1.0,0.0), 0.25 );
350        	}
351        }
352
353        p += ray * step;
354    }
355
356    if ( ray.y < 0.0 )
357    {
358    	vec3 h = ray * -origin.y / ray.y + origin;
359 		return road( vec2( h.x, h.z ) ) * contact( p, vec3(0.0,1.0,0.0), 0.25 );
360    }
361    else
362    {
363
364    return vec4( 0.3,0.3,1.0,1.0) *  ( (uv.y - 0.5) / 0.5  ) +
365           vec4( 1.0,1.0,1.0,1.0) *  (1.0 - ( (uv.y-0.5) / 0.5  )) ;
366    }
367}
368
369vec3 rotatevecY( vec3 vec, float angle )
370{
371    vec3 m0 = vec3( -cos( angle ), 0, sin( angle ));
372    vec3 m1 = vec3( 0            , 1.0,   0      );
373    vec3 m2 = vec3( sin( angle ), 0, cos( angle ) );
374
375    return vec3(  dot( m0, vec ), dot( m1, vec ), dot( m2, vec )) ;
376}
377
378
379void mainImage( out vec4 fragColor, in vec2 fragCoord )
380{
381	vec2 uv = fragCoord.xy / iResolution.xy;
382
383    /*if ( uv.y > 0.8 )
384    {
385        fragColor = vec4( 0.3,0.3,1.0,1.0) *  ( (uv.y - 0.5) / 0.5  ) +
386                    vec4( 1.0,1.0,1.0,1.0) *  (1.0 - ( (uv.y-0.5) / 0.5  )) ;
387    }
388    else */
389    {
390         float aspect = iResolution.y / iResolution.x;
391
392    	 vec3 origin = vec3(0.0, 2.0,-5.0 );
393    	 vec3 ray = vec3( uv.x - 0.5, (uv.y - 0.5) * aspect, 0.5 );
394
395
396        float y = (iGlobalTime-0.0)*100.0;
397        float x = zigzag( y/100.0 )*40.0;
398
399    	ray = rotatevecY( ray, x/80.0 );
400        origin.x += x;
401    	origin = rotatevecY( origin, 0.0 );
402
403		fragColor = march( ray, origin, 0.01, uv );
404
405        //float y = (iGlobalTime-0.0)*100.0;
406        //float x = zigzag( y/100.0 )*40.0;
407
408        //vec2 vp = uv - vec2(0.5,0.5 );
409  		//vec2 rp = vec2( -x + vp.x / -vp.y * 5.0,  5.0 / -vp.y 	);
410
411		//fragColor = road( rp);
412    }
413}
414
415 void main(void)
416{
417  //just some shit to wrap shadertoy's stuff
418  vec2 FragCoord = vTexCoord.xy*OutputSize.xy;
419  mainImage(FragColor,FragCoord);
420}
421#endif
422