1// Compatibility #ifdefs needed for parameters
2#ifdef GL_ES
3#define COMPAT_PRECISION mediump
4#else
5#define COMPAT_PRECISION
6#endif
7
8// Parameter lines go here:
9#pragma parameter RETRO_PIXEL_SIZE "Retro Pixel Size" 0.84 0.0 1.0 0.01
10#ifdef PARAMETER_UNIFORM
11// All parameter floats need to have COMPAT_PRECISION in front of them
12uniform COMPAT_PRECISION float RETRO_PIXEL_SIZE;
13#else
14#define RETRO_PIXEL_SIZE 0.84
15#endif
16
17#if defined(VERTEX)
18
19#if __VERSION__ >= 130
20#define COMPAT_VARYING out
21#define COMPAT_ATTRIBUTE in
22#define COMPAT_TEXTURE texture
23#else
24#define COMPAT_VARYING varying
25#define COMPAT_ATTRIBUTE attribute
26#define COMPAT_TEXTURE texture2D
27#endif
28
29#ifdef GL_ES
30#define COMPAT_PRECISION mediump
31#else
32#define COMPAT_PRECISION
33#endif
34
35COMPAT_ATTRIBUTE vec4 VertexCoord;
36COMPAT_ATTRIBUTE vec4 COLOR;
37COMPAT_ATTRIBUTE vec4 TexCoord;
38COMPAT_VARYING vec4 COL0;
39COMPAT_VARYING vec4 TEX0;
40// out variables go here as COMPAT_VARYING whatever
41
42vec4 _oPosition1;
43uniform mat4 MVPMatrix;
44uniform COMPAT_PRECISION int FrameDirection;
45uniform COMPAT_PRECISION int FrameCount;
46uniform COMPAT_PRECISION vec2 OutputSize;
47uniform COMPAT_PRECISION vec2 TextureSize;
48uniform COMPAT_PRECISION vec2 InputSize;
49
50// compatibility #defines
51#define vTexCoord TEX0.xy
52#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
53#define OutSize vec4(OutputSize, 1.0 / OutputSize)
54
55void main()
56{
57    gl_Position = MVPMatrix * VertexCoord;
58    TEX0.xy = VertexCoord.xy;
59// Paste vertex contents here:
60}
61
62#elif defined(FRAGMENT)
63
64#if __VERSION__ >= 130
65#define COMPAT_VARYING in
66#define COMPAT_TEXTURE texture
67out vec4 FragColor;
68#else
69#define COMPAT_VARYING varying
70#define FragColor gl_FragColor
71#define COMPAT_TEXTURE texture2D
72#endif
73
74#ifdef GL_ES
75#ifdef GL_FRAGMENT_PRECISION_HIGH
76precision highp float;
77#else
78precision mediump float;
79#endif
80#define COMPAT_PRECISION mediump
81#else
82#define COMPAT_PRECISION
83#endif
84
85uniform COMPAT_PRECISION int FrameDirection;
86uniform COMPAT_PRECISION int FrameCount;
87uniform COMPAT_PRECISION vec2 OutputSize;
88uniform COMPAT_PRECISION vec2 TextureSize;
89uniform COMPAT_PRECISION vec2 InputSize;
90uniform sampler2D Texture;
91COMPAT_VARYING vec4 TEX0;
92// in variables go here as COMPAT_VARYING whatever
93
94// compatibility #defines
95#define Source Texture
96#define vTexCoord TEX0.xy
97
98#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
99#define OutSize vec4(OutputSize, 1.0 / OutputSize)
100
101// delete all 'params.' or 'registers.' or whatever in the fragment
102float iGlobalTime = float(FrameCount)*0.025;
103vec2 iResolution = OutputSize.xy;
104
105// Created by inigo quilez - iq/2013
106// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
107
108// A port of my 2007 demo Kindernoiser: https://www.youtube.com/watch?v=9AX8gNyrSWc (http://www.pouet.net/prod.php?which=32549)
109//
110// More info here:  http://iquilezles.org/www/articles/juliasets3d/juliasets3d.htm
111
112// antialias level (1, 2, 3...)
113#define AA 1
114
115float map( in vec3 p, out vec4 oTrap, in vec4 c )
116{
117    vec4 z = vec4(p,0.0);
118    float md2 = 1.0;
119    float mz2 = dot(z,z);
120
121    vec4 trap = vec4(abs(z.xyz),dot(z,z));
122
123    for( int i=0; i<11; i++ )
124    {
125        // |dz|^2 -> 4*|dz|^2
126        md2 *= 4.0*mz2;
127
128        // z -> z2 + c
129        z = vec4( z.x*z.x-dot(z.yzw,z.yzw),
130                  2.0*z.x*z.yzw ) + c;
131
132        trap = min( trap, vec4(abs(z.xyz),dot(z,z)) );
133
134        mz2 = dot(z,z);
135        if(mz2>4.0) break;
136    }
137
138    oTrap = trap;
139
140    return 0.25*sqrt(mz2/md2)*log(mz2);
141}
142
143// analytic normal for quadratic formula
144vec3 calcNormal( in vec3 p, in vec4 c )
145{
146    vec4 z = vec4(p,0.0);
147
148	vec4 dz0 = vec4(1.0,0.0,0.0,0.0);
149	vec4 dz1 = vec4(0.0,1.0,0.0,0.0);
150	vec4 dz2 = vec4(0.0,0.0,1.0,0.0);
151    vec4 dz3 = vec4(0.0,0.0,0.0,1.0);
152
153  	for(int i=0;i<11;i++)
154    {
155        vec4 mz = vec4(z.x,-z.y,-z.z,-z.w);
156
157		// derivative
158		dz0 = vec4(dot(mz,dz0),z.x*dz0.yzw+dz0.x*z.yzw);
159		dz1 = vec4(dot(mz,dz1),z.x*dz1.yzw+dz1.x*z.yzw);
160		dz2 = vec4(dot(mz,dz2),z.x*dz2.yzw+dz2.x*z.yzw);
161        dz3 = vec4(dot(mz,dz3),z.x*dz3.yzw+dz3.x*z.yzw);
162
163        z = vec4( dot(z, mz), 2.0*z.x*z.yzw ) + c;
164
165	    if( dot(z,z)>4.0 ) break;
166    }
167
168	return normalize(vec3(dot(z,dz0),
169	                      dot(z,dz1),
170	                      dot(z,dz2)));
171}
172
173float intersect( in vec3 ro, in vec3 rd, out vec4 res, in vec4 c )
174{
175    vec4 tmp;
176    float resT = -1.0;
177	float maxd = 10.0;
178    float h = 1.0;
179    float t = 0.0;
180    for( int i=0; i<150; i++ )
181    {
182        if( h<0.002||t>maxd ) break;
183	    h = map( ro+rd*t, tmp, c );
184        t += h;
185    }
186    if( t<maxd ) { resT=t; res = tmp; }
187
188	return resT;
189}
190
191float softshadow( in vec3 ro, in vec3 rd, float mint, float k, in vec4 c )
192{
193    float res = 1.0;
194    float t = mint;
195    for( int i=0; i<64; i++ )
196    {
197        vec4 kk;
198        float h = map(ro + rd*t, kk, c);
199        res = min( res, k*h/t );
200        if( res<0.001 ) break;
201        t += clamp( h, 0.01, 0.5 );
202    }
203    return clamp(res,0.0,1.0);
204}
205
206vec3 render( in vec3 ro, in vec3 rd, in vec4 c )
207{
208    vec3 light1 = vec3(  0.577, 0.577,  0.577 );
209	vec3 light2 = vec3( -0.707, 0.000, -0.707 );
210
211	vec4 tra;
212	vec3 col;
213    float t = intersect( ro, rd, tra, c );
214    if( t < 0.0 )
215    {
216     	col = vec3(0.8,0.9,1.0)*(0.7+0.3*rd.y);
217		col += vec3(0.8,0.7,0.5)*pow( clamp(dot(rd,light1),0.0,1.0), 48.0 );
218	}
219	else
220	{
221        col = vec3(1.0,0.8,0.7)*0.3;
222
223        vec3 pos = ro + t*rd;
224        vec3 nor = calcNormal( pos, c );
225        vec3 ref = reflect( rd, nor );
226
227		float dif1 = clamp( dot( light1, nor ), 0.0, 1.0 );
228		float dif2 = clamp( 0.5 + 0.5*dot( light2, nor ), 0.0, 1.0 );
229		float occ = clamp(2.5*tra.w-0.15,0.0,1.0);
230        float sha = softshadow( pos, light1, 0.001, 64.0, c );
231        float fre = pow( clamp( 1.+dot(rd,nor), 0.0, 1.0 ), 2.0 );
232
233		vec3 lin  = 1.5*vec3(0.15,0.20,0.25)*(0.6+0.4*nor.y)*(0.1+0.9*occ);
234		     lin += 3.5*vec3(1.00,0.90,0.70)*dif1*sha;
235		     lin += 1.5*vec3(0.14,0.14,0.14)*dif2*occ;
236             lin += 0.3*vec3(1.00,0.80,0.60)*fre*(0.5+0.5*occ);
237
238		col *= lin;
239        col += pow( clamp( dot( ref, light1 ), 0.0, 1.0 ), 32.0 )*dif1*sha;
240        col += 0.1*vec3(0.8,0.9,1.0)*smoothstep( 0.0, 0.1, ref.y )*occ*(0.5+0.5*nor.y);
241	}
242
243	return pow( col, vec3(0.4545) );
244}
245
246void mainImage( out vec4 fragColor, in vec2 fragCoord )
247{
248    // anim
249    float time = iGlobalTime*.15;
250    vec4 c = 0.4*cos( vec4(0.5,3.9,1.4,1.1) + time*vec4(1.2,1.7,1.3,2.5) ) - vec4(0.3,0.0,0.0,0.0);
251
252    // camera
253	float r = 1.4+0.15*cos(0.0+0.29*time);
254	vec3 ro = vec3(           r*cos(0.3+0.37*time),
255					0.3 + 0.8*r*cos(1.0+0.33*time),
256					          r*cos(2.2+0.31*time) );
257	vec3 ta = vec3(0.0,0.0,0.0);
258    float cr = 0.1*cos(0.1*time);
259
260
261    // render
262    vec3 col = vec3(0.0);
263    for( int j=0; j<AA; j++ )
264    for( int i=0; i<AA; i++ )
265    {
266        vec2 p = (-iResolution.xy + 2.0*(fragCoord + vec2(float(i),float(j))/float(AA))) / iResolution.y;
267
268        vec3 cw = normalize(ta-ro);
269        vec3 cp = vec3(sin(cr), cos(cr),0.0);
270        vec3 cu = normalize(cross(cw,cp));
271        vec3 cv = normalize(cross(cu,cw));
272        vec3 rd = normalize( p.x*cu + p.y*cv + 2.0*cw );
273
274        col += render( ro, rd, c );
275    }
276    col /= float(AA*AA);
277
278    vec2 uv = fragCoord.xy / iResolution.xy;
279	col *= 0.7 + 0.3*pow(16.0*uv.x*uv.y*(1.0-uv.x)*(1.0-uv.y),0.25);
280
281	fragColor = vec4( col, 1.0 );
282}
283
284 void main(void)
285{
286  //just some shit to wrap shadertoy's stuff
287  vec2 FragCoord = vTexCoord.xy*OutputSize.xy;
288  mainImage(FragColor,FragCoord);
289}
290#endif
291