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
106//#define SHOW_DISTANCE
107
108#define BACK_COL_TOP vec3(1,0,1)
109#define BACK_COL_BOTTOM vec3(0,0,1)
110
111#define TEXT_COL1_TOP vec3(0.05, 0.05, 0.40)
112#define TEXT_COL1_BOTTOM vec3(0.60, 0.90, 1.00)
113#define TEXT_COL2_TOP vec3(0.10, 0.10, 0.00)
114#define TEXT_COL2_BOTTOM vec3(1.90, 1.30, 1.00)
115
116//--- Primiives ---
117float dfSemiArc(float rma, float rmi, vec2 uv)
118{
119	return max(abs(length(uv) - rma) - rmi, uv.x-0.0);
120}
121
122//p0 = bottom left, clockwise winding
123float dfQuad(vec2 p0, vec2 p1, vec2 p2, vec2 p3, vec2 uv)
124{
125	vec2 s0n = normalize((p1 - p0).yx * vec2(-1,1));
126	vec2 s1n = normalize((p2 - p1).yx * vec2(-1,1));
127	vec2 s2n = normalize((p3 - p2).yx * vec2(-1,1));
128	vec2 s3n = normalize((p0 - p3).yx * vec2(-1,1));
129
130	return max(max(dot(uv-p0,s0n),dot(uv-p1,s1n)), max(dot(uv-p2,s2n),dot(uv-p3,s3n)));
131}
132
133float dfRect(vec2 size, vec2 uv)
134{
135	return max(max(-uv.x,uv.x - size.x),max(-uv.y,uv.y - size.y));
136}
137//-----------------
138
139//--- Letters ---
140void S(inout float df, vec2 uv)
141{
142	df = min(df, dfSemiArc(0.25, 0.125, uv - vec2(-0.250,0.250)));
143	df = min(df, dfSemiArc(0.25, 0.125, (uv - vec2(-0.125,-0.25)) * vec2(-1)));
144	df = min(df, dfRect(vec2(0.125, 0.250), uv - vec2(-0.250,-0.125)));
145	df = min(df, dfQuad(vec2(-0.625,-0.625), vec2(-0.500,-0.375), vec2(-0.125,-0.375), vec2(-0.125,-0.625), uv));
146	df = min(df, dfQuad(vec2(-0.250,0.375), vec2(-0.250,0.625), vec2(0.250,0.625), vec2(0.125,0.375), uv));
147}
148
149void N(inout float df, vec2 uv)
150{
151	df = min(df, dfRect(vec2(0.250, 1.250), uv - vec2(-0.625,-0.625)));
152    df = min(df, dfRect(vec2(0.250, 1.250), uv - vec2(-0.000,-0.625)));
153	df = min(df, dfQuad(vec2(-0.375,-0.125), vec2(-0.375,0.125), vec2(0.000, 0.125), vec2(-0.125,-0.125), uv));
154}
155
156void A(inout float df, vec2 uv)
157{
158	df = min(df, dfRect(vec2(0.250, 0.825), uv - vec2(-0.625,-0.625)));
159    df = min(df, dfRect(vec2(0.250, 0.825), uv - vec2(-0.000,-0.625)));
160	df = min(df, dfQuad(vec2(-0.375,-0.125), vec2(-0.375,0.125), vec2(0.000, 0.125), vec2(-0.125,-0.125), uv));
161    df = min(df, dfSemiArc(0.3125, 0.125, (uv.yx - vec2(0.1875,-0.1875)) * -1.0));
162}
163
164void D(inout float df, vec2 uv)
165{
166	df = min(df, dfRect(vec2(0.250, 1.25), uv - vec2(-0.625,-0.625)));
167    df = min(df, dfSemiArc(0.5, 0.125, (uv.xy * vec2(-1,1) - vec2(0.375,-0.00))));
168}
169
170void E(inout float df, vec2 uv)
171{
172	df = min(df, dfRect(vec2(0.250, 1.250), uv - vec2(-0.625,-0.625)));
173    df = min(df, dfQuad(vec2(-0.375,-0.625), vec2(-0.375,-0.375), vec2(0.250, -0.375), vec2( 0.125,-0.625), uv));
174    df = min(df, dfQuad(vec2(-0.375,0.375), vec2(-0.375,0.625), vec2(0.250, 0.625), vec2(0.125, 0.375), uv));
175    df = min(df, dfQuad(vec2(-0.375,-0.125), vec2(-0.375,0.125), vec2(0.000, 0.125), vec2(-0.125,-0.125), uv));
176}
177
178void R(inout float df, vec2 uv)
179{
180	df = min(df, dfRect(vec2(0.250, 1.250), uv - vec2(-0.625,-0.625)));
181    df = min(df, dfSemiArc(0.25, 0.125, (uv.xy * vec2(-1,1) - vec2(0.125,0.25))));
182    df = min(df, dfRect(vec2(0.25, 0.250), uv - vec2(-0.375,0.375)));
183    df = min(df, dfQuad(vec2(-0.375,-0.125), vec2(-0.250,0.125), vec2(0.000, 0.125), vec2(-0.125,-0.125), uv));
184    df = min(df, dfQuad(vec2(-0.375,-0.125), vec2(-0.1,-0.125), vec2(0.250,-0.625), vec2(-0.025,-0.625), uv));
185
186}
187
188void T(inout float df, vec2 uv)
189{
190    df = min(df, dfRect(vec2(0.250, 1.0), uv - vec2(-0.3125,-0.625)));
191	df = min(df, dfQuad(vec2(-0.625, 0.375), vec2(-0.625,0.625), vec2(0.250, 0.625), vec2(0.125, 0.375), uv));
192}
193
194void O(inout float df, vec2 uv)
195{
196    df = min(df, dfRect(vec2(0.25, 0.375), uv - vec2( 0.000,-0.1875)));
197    df = min(df, dfRect(vec2(0.25, 0.375), uv - vec2(-0.625,-0.1875)));
198    df = min(df, dfSemiArc(0.3125, 0.125, (uv.yx - vec2(0.1875,-0.1875)) * -1.0));
199    df = min(df, dfSemiArc(0.3125, 0.125, (uv.yx - vec2(-0.1875,-0.1875)) ));
200}
201
202void Y(inout float df, vec2 uv)
203{
204    df = min(df, dfRect(vec2(0.25, 0.25), uv - vec2( 0.000,0.375)));
205    df = min(df, dfRect(vec2(0.25, 0.25), uv - vec2(-0.625,0.375)));
206    df = min(df, dfSemiArc(0.3125, 0.125, (uv.yx - vec2(0.375,-0.1875)) ));
207    df = min(df, dfRect(vec2(0.250, 0.75), uv - vec2(-0.3125,-0.625)));
208}
209
210void X(inout float df, vec2 uv)
211{
212    df = min(df, dfRect(vec2(0.25, 0.25), uv - vec2( 0.000,0.375)));
213    df = min(df, dfRect(vec2(0.25, 0.25), uv - vec2(-0.625,0.375)));
214    df = min(df, dfSemiArc(0.3125, 0.125, (uv.yx - vec2(0.375,-0.1875)) ));
215    df = min(df, dfSemiArc(0.3125, 0.125, (-uv.yx + vec2(-0.375,-0.1855)) ));
216    //df = min(df, dfRect(vec2(0.250, 0.75), uv - vec2(-0.3125,-0.625)));
217
218    df = min(df, dfRect(vec2(0.25, 0.25), uv - vec2( 0.000,-0.575)));
219    df = min(df, dfRect(vec2(0.25, 0.25), uv - vec2(-0.625,-0.575)));
220}
221
222//---------------
223
224//--- Gradient Stuff ---
225//returns 0-1 when xn is between x0-x1
226float linstep(float x0, float x1, float xn)
227{
228	return (xn - x0) / (x1 - x0);
229}
230
231vec3 retrograd(float x0, float x1, float m, vec2 uv)
232{
233	float mid = x0+(x1 - x0) * m;
234
235	vec3 grad1 = mix(TEXT_COL1_BOTTOM, TEXT_COL1_TOP, linstep(mid, x1, uv.y));
236    vec3 grad2 = mix(TEXT_COL2_BOTTOM, TEXT_COL2_TOP, linstep(x0, mid, uv.y));
237
238	return mix(grad2, grad1, smoothstep(mid, mid + 0.04, uv.y));
239}
240//----------------------
241
242void mainImage( out vec4 fragColor, in vec2 fragCoord )
243{
244	vec2 aspect = iResolution.xy/iResolution.y;
245	vec2 uv = ( fragCoord.xy / iResolution.y );
246
247	uv = (uv - aspect/2.0)*8.0;
248
249    //Text distance field
250	float dist = 1e6;
251
252	vec2 chSpace = vec2(1.125,1.500);
253
254	vec2 chuv = uv;
255	chuv.x += (chSpace.x * 7.0) / 2.0 - 0.75;
256
257	Y(dist, chuv); chuv.x -= chSpace.x;
258	A(dist, chuv); chuv.x -= chSpace.x;
259	N(dist, chuv); chuv.x -= chSpace.x;
260	D(dist, chuv); chuv.x -= chSpace.x;
261    E(dist, chuv); chuv.x -= chSpace.x;
262    X(dist, chuv); chuv.x -= chSpace.x;
263
264    dist /= 2.0;
265
266    //Colors and mixing mask
267	float mask = smoothstep(4.0 / iResolution.y, 0.00, dist);
268
269	vec3 textcol = retrograd(-0.75, 0.50, 0.40 + pow(abs(dist), 0.25) * 0.08, uv);
270
271	vec3 backcol = mix(BACK_COL_BOTTOM, BACK_COL_TOP, (uv.y/4.0)+0.5) * smoothstep(0.02, 0.025, dist);
272
273    //Grid Stuff
274	vec2 gdef = vec2(uv.x / abs(uv.y), 1.0 / (uv.y));
275	gdef.y = clamp(gdef.y,-1e2, 1e2);
276
277	vec2 gpos = vec2(0.0,-iGlobalTime);
278
279	gdef += gpos;
280
281	vec2 grep = mod(gdef*vec2(1.0,2.0), vec2(1.0));
282
283	float grid = max(abs(grep.x - 0.5),abs(grep.y - 0.5));
284
285	float gs = length(gdef-gpos)*0.01;
286
287	backcol *= mix(smoothstep(0.46-gs,0.48+gs,grid), 1.0, step(0.0,uv.y))*0.75+0.25;
288
289    //Mixing text with background
290	vec3 color = mix(backcol,textcol,mask);
291
292    #ifdef SHOW_DISTANCE
293    color = vec3(sin(dist*48.0));
294    #endif
295
296	fragColor = vec4( vec3( color ), 1.0 );
297}
298
299 void main(void)
300{
301  //just some shit to wrap shadertoy's stuff
302  vec2 FragCoord = vTexCoord.xy*OutputSize.xy;
303  mainImage(FragColor,FragCoord);
304}
305#endif
306