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#define PI 3.14159
106
107mat3 xrot(float t)
108{
109    return mat3(1.0, 0.0, 0.0,
110                0.0, cos(t), -sin(t),
111                0.0, sin(t), cos(t));
112}
113
114mat3 yrot(float t)
115{
116    return mat3(cos(t), 0.0, -sin(t),
117                0.0, 1.0, 0.0,
118                sin(t), 0.0, cos(t));
119}
120
121mat3 zrot(float t)
122{
123    return mat3(cos(t), -sin(t), 0.0,
124                sin(t), cos(t), 0.0,
125                0.0, 0.0, 1.0);
126}
127
128float sdBox( vec3 p, vec3 b )
129{
130  vec3 d = abs(p) - b;
131  return min(max(d.x,max(d.y,d.z)),0.0) +
132         length(max(d,0.0));
133}
134
135float map(vec3 pos)
136{
137    float speed = 1.0;
138    vec3 grid = floor(pos);
139    vec3 gmod = mod(grid, 2.0);
140    vec3 rmod = mod(grid, 4.0) - 2.0;
141    float tm = fract(iGlobalTime * speed);
142    rmod *= (cos(tm*PI)-1.0);
143
144    float g = floor(mod(iGlobalTime*speed,3.0));
145    if (g==0.0){
146        if (gmod.y*gmod.x==1.0) {
147            pos.z += rmod.x*rmod.y*0.5;
148        }
149    } else if (g==1.0){
150        if (gmod.y*gmod.z==1.0) {
151            pos.x += rmod.y;
152        }
153    } else if (g==2.0){
154        if (gmod.z==0.0) {
155            pos.y += rmod.z*rmod.x*0.5;
156        }
157    }
158
159    grid = floor(pos);
160    pos = pos - grid;
161    pos = pos * 2.0 - 1.0;
162
163    float len = 0.9;
164
165    float d = sdBox(pos,vec3(len));
166
167    bool skip = false;
168
169    if (mod(grid.x,2.0)==0.0 && mod(grid.y,2.0)==0.0) {
170        skip = true;
171    }
172
173    if (mod(grid.x,2.0)==0.0 && mod(grid.z,2.0)==0.0) {
174        skip = true;
175    }
176
177    if (mod(grid.y,2.0)==0.0 && mod(grid.z,2.0)==1.0) {
178        skip = true;
179    }
180
181    if (skip) {
182        d = 100.0;
183        vec3 off = vec3(2.0,0.0,0.0);
184        for (int i = 0; i < 3; ++i) {
185            float a = sdBox(pos + off,vec3(len));
186            float b = sdBox(pos - off,vec3(len));
187            d = min(d,min(a,b));
188            off = off.zxy;
189        }
190        d *= 0.5;
191    } else {
192        d *= 0.8;
193    }
194
195    return d;
196}
197
198vec3 surfaceNormal(vec3 pos) {
199 	vec3 delta = vec3(0.01, 0.0, 0.0);
200    vec3 normal;
201    normal.x = map(pos + delta.xyz) - map(pos - delta.xyz);
202    normal.y = map(pos + delta.yxz) - map(pos - delta.yxz);
203    normal.z = map(pos + delta.zyx) - map(pos - delta.zyx);
204    return normalize(normal);
205}
206
207float aoc(vec3 origin, vec3 ray)
208{
209    float delta = 0.05;
210    const int samples = 8;
211    float r = 0.0;
212    for (int i = 1; i <= samples; ++i) {
213        float t = delta * float(i);
214     	vec3 pos = origin + ray * t;
215        float dist = map(pos);
216        float len = abs(t - dist);
217        r += len * pow(2.0, -float(i));
218    }
219    return r;
220}
221
222void mainImage( out vec4 fragColor, in vec2 fragCoord )
223{
224	vec2 uv = fragCoord.xy / iResolution.xy;
225    uv = uv * 2.0 - 1.0;
226    uv.x *= iResolution.x / iResolution.y;
227
228	vec3 eye = normalize(vec3(uv, 1.0 - dot(uv,uv) * 0.33));
229    vec3 origin = vec3(0.0);
230
231    eye = eye * yrot(iGlobalTime) * xrot(iGlobalTime);
232
233    float speed = 0.5;
234
235    float j = iGlobalTime * speed;
236
237    float f = fract(j);
238    float g = 1.0 - f;
239    f = f*f * g + (1.0-g*g) * f;
240    f = f * 2.0 - 1.0;
241	float a = floor(j) + f * floor(mod(j,2.0));
242    float b = floor(j) + f * floor(mod(j+1.0,2.0));
243
244    origin.x += 0.5 + a;
245    origin.y += 0.5;
246    origin.z += 0.5 + b;
247
248    float t = 0.0;
249    float d = 0.0;
250
251    for (int i = 0; i < 32; ++i){
252        vec3 pos = origin + eye * t;
253        d = map(pos);
254        t += d;
255    }
256
257    vec3 worldPos = origin + eye * t;
258
259    vec3 norm = surfaceNormal(worldPos);
260
261    float prod = max(0.0, dot(norm, -eye));
262
263    float amb = 0.0;//aoc(worldPos, -eye);
264
265    vec3 ref = reflect(eye, norm);
266
267    vec3 spec = vec3(0.0);//texture(iChannel0, ref).xyz;
268
269    prod = pow(1.0 - prod, 2.0);
270
271    vec3 col = vec3(0.1, 0.3, 0.5);
272
273    spec *= col;
274
275    col = mix(col, spec, prod);
276
277    float shade = pow(max(1.0 - amb, 0.0), 4.0);
278
279    float fog = 1.0 / (1.0 + t * t * 0.2) * shade;
280
281    vec3 final = col;
282
283    final = mix(final, vec3(1.0), fog);
284
285    fog = 1.0 / (1.0 + t * t * 0.1);
286
287	fragColor = vec4(final*fog,0.0);
288}
289
290 void main(void)
291{
292  //just some shit to wrap shadertoy's stuff
293  vec2 FragCoord = vTexCoord.xy*OutputSize.xy;
294  mainImage(FragColor,FragCoord);
295}
296#endif
297