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// Atari ST Union Demo old skool intro recreated using ShaderToy fragment shader
107// Created by Simon Morris (ZippyCoder)
108// License: Creative Commons CC0 1.0 Universal (CC-0)
109//
110// Inspired by other ShaderToy work:
111// Gerard Geer - https://www.shadertoy.com/view/4dtGD2
112// P_Malin - https://www.shadertoy.com/view/4sBSWW
113// Uses Gerard Geer's neat bit extraction approach with no division
114//
115// SoundCloud audioclip of Jochen Hippel's awesmome "Ikari Union" chiptune recorded by RockABit
116// https://soundcloud.com/rockabit/jochen-hippel-ikari-union?in=rockabit/sets/union-demo-jochen-hippel
117//
118// Original demo - https://www.youtube.com/watch?v=l2i859S_4no
119//
120// ---------------------------------------------------------------------------------------
121// My first shadertoy project, so probably not as optimized as it could be.
122//
123// The bitmaps were encoded into shader functions from source GIF/PNG images using
124// a python scipt I threw together - https://github.com/simondotm/shadertoys
125// The logo is 4-bits per pixel, the background is 2-bit and the text is 1-bit
126// all packed into vec4's so there's less if checks when decoding.
127// I was originally going to render/animate each text letter individually
128// but in the end I just took a shortcut and rendered the whole text as one image.
129// I also tried unpacking the bitmaps to a separate buffer first, thinking that texture lookup
130// might be faster than computing each pixel from encoded floats, but it actually seemed slower.
131// ----------------------------------------------------------------------------------------
132
133
134
135void drawSpriteUnionDemoLogo( inout vec4 color, in float x, in float y )
136{
137
138	vec4 tile = vec4(0.0);
139
140	// unpack the bitmap on a row-by-row basis
141	if (y == 0.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee) : ( x < 48.0 ) ? vec4(0xaeeeee, 0xeeea03, 0xeeeeee, 0xeeeeee) : vec4(0xeeeeee, 0xeeeeee, 0x00eeee, 0x000000);
142	if (y == 1.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee) : ( x < 48.0 ) ? vec4(0x3eeeee, 0xeec09c, 0xeeeeee, 0xeeeeee) : vec4(0xeeeeee, 0xeeeeee, 0x00eeee, 0x000000);
143	if (y == 2.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee) : ( x < 48.0 ) ? vec4(0xc3eeee, 0xec3966, 0xeeeeee, 0xeeeeee) : vec4(0xeeeeee, 0xeeeeee, 0x00eeee, 0x000000);
144	if (y == 3.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee) : ( x < 48.0 ) ? vec4(0x9a3eee, 0xc3ae66, 0xeeeeee, 0xeeeeee) : vec4(0xeeeeee, 0xeeeeee, 0x00eeee, 0x000000);
145	if (y == 4.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee) : ( x < 48.0 ) ? vec4(0xe9a0ee, 0x3a6e66, 0xeeeeec, 0xeeeeee) : vec4(0xeeeeee, 0xeeeeee, 0x00eeee, 0x000000);
146	if (y == 5.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee) : ( x < 48.0 ) ? vec4(0xee6a3e, 0xae6e66, 0xeeeee3, 0xeeeeee) : vec4(0xeeeeee, 0xeeeeee, 0x00eeee, 0x000000);
147	if (y == 6.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee) : ( x < 48.0 ) ? vec4(0xe6e9a0, 0xee6e66, 0xeeeeaa, 0xeeeeee) : vec4(0xeeeeee, 0xeeeeee, 0x00eeee, 0x000000);
148	if (y == 7.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee, 0xeeeeee, 0xeeeeee, 0x0eeeee) : ( x < 48.0 ) ? vec4(0xe66e9a, 0x6e6e64, 0xeeea3e, 0xeeeeee) : vec4(0xeeeeee, 0xeeeeee, 0x00eeee, 0x000000);
149	if (y == 8.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee, 0xeeeeee, 0xeeeeee, 0xa0eeee) : ( x < 48.0 ) ? vec4(0xe66ee9, 0xee6eee, 0xeea066, 0xeeeeee) : vec4(0xeeeeee, 0xeeeeee, 0x00eeee, 0x000000);
150	if (y == 9.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee, 0xeeeeee, 0xeeeeee, 0x9a3eee) : ( x < 48.0 ) ? vec4(0xe66e4e, 0x4e6e64, 0xea0666, 0xeeeeee) : vec4(0xeeeeee, 0xeeeeee, 0x00eeee, 0x000000);
151	if (y == 10.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee, 0xeeeeee, 0xeeeeee, 0x99a3ee) : ( x < 48.0 ) ? vec4(0xe46e64, 0xee6e44, 0xa06eee, 0xeeeeee) : vec4(0xeeeeee, 0xeeeeee, 0x00eeee, 0x000000);
152	if (y == 11.0) tile = ( x < 24.0 ) ? vec4(0x58eeee, 0xeeee82, 0x8258ee, 0x499a3e) : ( x < 48.0 ) ? vec4(0x666646, 0x646666, 0x066666, 0x55eeea) : vec4(0xeeeee5, 0xec88ee, 0x00eeee, 0x000000);
153	if (y == 12.0) tile = ( x < 24.0 ) ? vec4(0x22eeee, 0xeeee88, 0x8122ee, 0x469ca3) : ( x < 48.0 ) ? vec4(0x664644, 0x666466, 0x946666, 0x22eea3) : vec4(0xeeee81, 0xe125ee, 0x00eeee, 0x000000);
154	if (y == 13.0) tile = ( x < 24.0 ) ? vec4(0x22eeee, 0xeeee88, 0x8112ee, 0x4669ca) : ( x < 48.0 ) ? vec4(0x666646, 0x666666, 0x466666, 0x15ea39) : vec4(0xeee812, 0xe211ee, 0x00eeee, 0x000000);
155	if (y == 14.0) tile = ( x < 24.0 ) ? vec4(0x22eeee, 0xeeee88, 0x8212ee, 0x44822c) : ( x < 48.0 ) ? vec4(0x465266, 0x266621, 0x021122, 0x25c352) : vec4(0xee8201, 0xe025ee, 0x00eeee, 0x000000);
156	if (y == 15.0) tile = ( x < 24.0 ) ? vec4(0x22eeee, 0xeeee88, 0x8221ee, 0x652129) : ( x < 48.0 ) ? vec4(0x642246, 0x256611, 0x221022, 0x020612) : vec4(0xe12212, 0xe012ee, 0x00eeee, 0x000000);
157	if (y == 16.0) tile = ( x < 24.0 ) ? vec4(0x21eeee, 0xeeee88, 0x8222ee, 0x802214) : ( x < 48.0 ) ? vec4(0x642244, 0x256601, 0x566662, 0x256420) : vec4(0x820221, 0xe215ee, 0x00eeee, 0x000000);
158	if (y == 17.0) tile = ( x < 24.0 ) ? vec4(0x22d7ee, 0xbbbd88, 0x8022bb, 0x22122d) : ( x < 48.0 ) ? vec4(0xdd22b8, 0x25dd21, 0x5bbbd2, 0x05dd20) : vec4(0x2120d2, 0xe225e8, 0x00eedd, 0x000000);
159	if (y == 18.0) tile = ( x < 24.0 ) ? vec4(0x22ddde, 0xdddd88, 0x8222b7, 0x22d12b) : ( x < 48.0 ) ? vec4(0xbd2251, 0x25bd21, 0x5bbbb2, 0x22bd12) : vec4(0x121bd2, 0xd12282, 0x00eddd, 0x000000);
160	if (y == 19.0) tile = ( x < 24.0 ) ? vec4(0x77dddd, 0x7dddbb, 0xb777db, 0x7bb77b) : ( x < 48.0 ) ? vec4(0xbb7777, 0x77bb77, 0xbbbbb7, 0x7bbb77) : vec4(0x7bbbd7, 0xd77b77, 0x00dddd, 0x000000);
161	if (y == 20.0) tile = ( x < 24.0 ) ? vec4(0xbbbddd, 0xddeedd, 0xddbbbd, 0xdddbbd) : ( x < 48.0 ) ? vec4(0xddbbbb, 0xbdddbb, 0xdddddb, 0xbddbbd) : vec4(0xddddbb, 0xbbbbbb, 0x00dbbb, 0x000000);
162	if (y == 21.0) tile = ( x < 24.0 ) ? vec4(0x22eeee, 0x828582, 0x821288, 0x646226) : ( x < 48.0 ) ? vec4(0x662226, 0x266621, 0x122211, 0x256662) : vec4(0xec3a62, 0xe02221, 0x00eeee, 0x000000);
163	if (y == 22.0) tile = ( x < 24.0 ) ? vec4(0x25eeee, 0x222021, 0x822022, 0x646666) : ( x < 48.0 ) ? vec4(0x666666, 0x664666, 0x464466, 0x226666) : vec4(0xe3a642, 0xe2012e, 0x00eeee, 0x000000);
164	if (y == 23.0) tile = ( x < 24.0 ) ? vec4(0x1eeeee, 0x222122, 0x822212, 0x666666) : ( x < 48.0 ) ? vec4(0x666669, 0x646666, 0x464449, 0x254966) : vec4(0xaa6661, 0xe222ee, 0x00eeee, 0x000000);
165	if (y == 24.0) tile = ( x < 24.0 ) ? vec4(0xdeeeee, 0x222118, 0x422211, 0x666666) : ( x < 48.0 ) ? vec4(0x666669, 0x966666, 0x666644, 0x664466) : vec4(0x066664, 0xe12eea, 0x00eeee, 0x000000);
166	if (y == 25.0) tile = ( x < 24.0 ) ? vec4(0xeeeeee, 0x4669a0, 0x646664, 0x666666) : ( x < 48.0 ) ? vec4(0x666666, 0x666666, 0x666666, 0x466666) : vec4(0x6666c6, 0xeeeea0, 0x00eeee, 0x000000);
167	if (y == 26.0) tile = ( x < 24.0 ) ? vec4(0x0eeeee, 0x44496a, 0x6cc466, 0xcc66cc) : ( x < 48.0 ) ? vec4(0xcc6c66, 0x9c6c6c, 0xcc6c4c, 0x6c6c6c) : vec4(0x6666c6, 0xeeea06, 0x00eeee, 0x000000);
168	if (y == 27.0) tile = ( x < 24.0 ) ? vec4(0xa0eeee, 0x644666, 0x666c64, 0x6c66cc) : ( x < 48.0 ) ? vec4(0xc4c6c6, 0x6c6c66, 0xc66c6c, 0x6cc446) : vec4(0x646666, 0xeea066, 0x00eeee, 0x000000);
169	if (y == 28.0) tile = ( x < 24.0 ) ? vec4(0x630eee, 0x444446, 0x6cc466, 0xcc6c4c) : ( x < 48.0 ) ? vec4(0xc6c6c9, 0xc96c66, 0xc66c66, 0x66cc64) : vec4(0x4666c6, 0xea0646, 0x00eeee, 0x000000);
170	if (y == 29.0) tile = ( x < 24.0 ) ? vec4(0x6c3aee, 0x666444, 0x466646, 0x466644) : ( x < 48.0 ) ? vec4(0x646466, 0x666444, 0x464666, 0x666666) : vec4(0x646466, 0xa09464, 0x00eeee, 0x000000);
171	if (y == 30.0) tile = ( x < 24.0 ) ? vec4(0x0000ee, 0x000000, 0x000000, 0x000000) : ( x < 48.0 ) ? vec4(0x000000) : vec4(0x000000, 0x300000, 0x00eeec, 0x000000);
172	if (y == 31.0) tile = ( x < 24.0 ) ? vec4(0xccccee, 0xcccccc, 0xcccccc, 0xcccccc) : ( x < 48.0 ) ? vec4(0xcccccc) : vec4(0xcccccc, 0xcccccc, 0x00eeee, 0x000000);
173
174	float n = mod(x, 24.0); // quantize x coordinate to nearest 24 pixels and get float containing 6 pixels
175	float t = ( ( n < 6.0 ) ? tile.x : ( n < 12.0 ) ? tile.y : (n < 18.0 ) ? tile.z : tile.w );
176	float p = mod( x, 6.0 ) * 4.0; // quantize x coordinate to nearest 6 pixels to determine pixel bit index
177    int idx = int( mod( floor( t*exp2(-p) ), 16.0 ));
178
179	// look up colour palette for the indexed pixel
180	if (idx == 0) color = vec4(0.913725, 0.913725, 0.913725, 1.0);
181	if (idx == 1) color = vec4(0.913725, 0.913725, 0.309804, 1.0);
182	if (idx == 2) color = vec4(0.913725, 0.670588, 0.309804, 1.0);
183	if (idx == 3) color = vec4(0.670588, 0.670588, 0.670588, 1.0);
184	if (idx == 4) color = vec4(0.670588, 0.670588, 0.431373, 1.0);
185	if (idx == 5) color = vec4(0.913725, 0.552941, 0.670588, 1.0);
186	if (idx == 6) color = vec4(0.552941, 0.552941, 0.309804, 1.0);
187	if (idx == 7) color = vec4(0.431373, 0.552941, 0.913725, 1.0);
188	if (idx == 8) color = vec4(0.792157, 0.431373, 0.309804, 1.0);
189	if (idx == 9) color = vec4(0.552941, 0.431373, 0.309804, 1.0);
190	if (idx == 10) color = vec4(0.431373, 0.431373, 0.431373, 1.0);
191	if (idx == 11) color = vec4(0.309804, 0.431373, 0.913725, 1.0);
192	if (idx == 12) color = vec4(0.309804, 0.309804, 0.309804, 1.0);
193	if (idx == 13) color = vec4(0.188235, 0.188235, 0.792157, 1.0);
194	if (idx == 14) color = vec4(0.070588, 0.070588, 0.070588, 0.0);
195	if (idx == 15) color = vec4(0.000000, 0.000000, 0.000000, 0.0);
196}
197
198
199void drawSpriteUnionBackground( inout vec4 color, float x, float y )
200{
201
202	vec4 tile = vec4(0.0);
203
204	// unpack the bitmap on a row-by-row basis
205	if (y == 0.0) tile = vec4(0xe46e6e, 0x1ba41a, 0xfbae6e, 0xffffff);
206	if (y == 1.0) tile = vec4(0xffffff);
207	if (y == 2.0) tile = vec4(0xffffff, 0xffffff, 0xbbffff, 0xbb6e6e);
208	if (y == 3.0) tile = vec4(0x9bbfbf, 0xfefffb, 0xfffe6f, 0xffffff);
209	if (y == 4.0) tile = vec4(0xbfffff, 0xffeeae, 0xffffff, 0xeb9bae);
210	if (y == 5.0) tile = vec4(0xffffff);
211	if (y == 6.0) tile = vec4(0xae6e56, 0xbbefbb, 0x6e91b9, 0xbaffae);
212	if (y == 7.0) tile = vec4(0xffffff);
213	if (y == 8.0) tile = vec4(0xffffff, 0xffffff, 0xb9baff, 0xffbb95);
214	if (y == 9.0) tile = vec4(0x1b9bef, 0x9b96e9, 0xffffeb, 0xffffff);
215	if (y == 10.0) tile = vec4(0xffffff, 0xffffff, 0xbaeeff, 0xeb9b91);
216	if (y == 11.0) tile = vec4(0xfffeeb, 0xffffff, 0xffffff, 0xbfffff);
217	if (y == 12.0) tile = vec4(0xffffff);
218	if (y == 13.0) tile = vec4(0x1b9b9f, 0xe79b99, 0xffffbe, 0xafbeff);
219	if (y == 14.0) tile = vec4(0xffffff, 0xffffff, 0x9bafff, 0xfffffb);
220	if (y == 15.0) tile = vec4(0xebabaf, 0xfffffe, 0xfffeeb, 0xbfffff);
221	if (y == 16.0) tile = vec4(0xffffff, 0xbaffff, 0xffffff, 0xffffff);
222	if (y == 17.0) tile = vec4(0xeffbeb, 0xfffaea, 0x7efbff, 0xeb6d2e);
223	if (y == 18.0) tile = vec4(0xffffff, 0xffffff, 0xfffffb, 0xffffff);
224	if (y == 19.0) tile = vec4(0xffffff, 0xffffff, 0xffffff, 0xbfffff);
225	if (y == 20.0) tile = vec4(0xb9baef, 0xa41ae4, 0xb9b91b, 0xfeffbf);
226	if (y == 21.0) tile = vec4(0xffffff);
227	if (y == 22.0) tile = vec4(0xffffff);
228	if (y == 23.0) tile = vec4(0xbae6e1, 0xfffeff, 0xbeffff, 0xb9baed);
229	if (y == 24.0) tile = vec4(0xffffff, 0xafbfff, 0xffefab, 0xffffff);
230	if (y == 25.0) tile = vec4(0xffefff, 0xffffff, 0xffffff, 0xbfffff);
231	if (y == 26.0) tile = vec4(0xffffff, 0x92ebef, 0x92e41b, 0xffeb9b);
232	if (y == 27.0) tile = vec4(0xffffff);
233	if (y == 28.0) tile = vec4(0xbae46e, 0xeffffb, 0xffffef, 0x6ebfff);
234	if (y == 29.0) tile = vec4(0xffffff);
235	if (y == 30.0) tile = vec4(0xfffffe, 0x7afafb, 0xef6e1e, 0xffeffb);
236	if (y == 31.0) tile = vec4(0xfbffff, 0xffffff, 0xffffff, 0xffffff);
237	if (y == 32.0) tile = vec4(0xffffff, 0xffffff, 0x6effff, 0xffffae);
238	if (y == 33.0) tile = vec4(0x9b96e9, 0xefffeb, 0xffefff, 0x1b9bef);
239	if (y == 34.0) tile = vec4(0xffffff);
240	if (y == 35.0) tile = vec4(0xfeffef, 0x86e6eb, 0x86e41b, 0xfffbeb);
241	if (y == 36.0) tile = vec4(0xffffff);
242	if (y == 37.0) tile = vec4(0xbae6e4, 0xfffbe7, 0xffbfff, 0xb9baef);
243	if (y == 38.0) tile = vec4(0xffffff, 0xffffff, 0xfffffe, 0xffffff);
244	if (y == 39.0) tile = vec4(0xffffff);
245	if (y == 40.0) tile = vec4(0x1b9bae, 0x9416b9, 0xe6e46e, 0xffffba);
246	if (y == 41.0) tile = vec4(0xffffff, 0xffffff, 0xffffff, 0xffbfff);
247	if (y == 42.0) tile = vec4(0xbabaef, 0xefffee, 0xe6e4ba, 0xafffba);
248	if (y == 43.0) tile = vec4(0xffffff);
249	if (y == 44.0) tile = vec4(0xeeb9b9, 0xffffff, 0xbebfbf, 0x1b92f9);
250	if (y == 45.0) tile = vec4(0xffffff, 0xb9e6eb, 0xffffff, 0xffffff);
251	if (y == 46.0) tile = vec4(0xfffffe, 0xffffff, 0xaeffff, 0xebfabf);
252	if (y == 47.0) tile = vec4(0xffffff, 0xffffff, 0xffffff, 0xffbffb);
253
254	float n = mod(x, 48.0); // quantize x coordinate to nearest 48 pixels and get float containing 12 pixels
255	float t = ( ( n < 12.0 ) ? tile.x : ( n < 24.0 ) ? tile.y : (n < 36.0 ) ? tile.z : tile.w );
256	float p = mod( x, 12.0 ) * 2.0; // quantize x coordinate to nearest 12 pixels to determine pixel bit index
257    int idx = int( mod( floor( t*exp2(-p) ), 4.0 ));
258
259	// look up colour palette for the indexed pixel
260	if (idx == 0) color = vec4(0.431373, 0.552941, 0.913725, 1.0);
261	if (idx == 1) color = vec4(0.309804, 0.431373, 0.913725, 1.0);
262	if (idx == 2) color = vec4(0.188235, 0.188235, 0.792157, 1.0);
263	if (idx == 3) color = vec4(0.070588, 0.070588, 0.070588, 1.0);
264}
265
266
267void drawSpriteUnionLettersWhite( inout vec4 color, float x, float y )
268{
269
270	vec4 tile = vec4(0.0);
271
272	// unpack the bitmap on a row-by-row basis
273	if (y == 0.0) tile = ( x < 96.0 ) ? vec4(0xc0c4c0, 0xccffff, 0xc0f3cc, 0xe0ffcc) : vec4(0xc09cc0, 0x0000f3, 0x000000, 0x000000);
274	if (y == 1.0) tile = ( x < 96.0 ) ? vec4(0xc4c4f3, 0xccffff, 0xccf3c8, 0xccffc8) : vec4(0xcc88c4, 0x0000f3, 0x000000, 0x000000);
275	if (y == 2.0) tile = ( x < 96.0 ) ? vec4(0xfcccf3, 0xccffff, 0xccf3c0, 0xccffc0) : vec4(0xcc80fc, 0x0000f3, 0x000000, 0x000000);
276	if (y == 3.0) tile = ( x < 96.0 ) ? vec4(0xc0c0f3, 0xccffff, 0xc8f3c0, 0xccc040) : vec4(0xc894c0, 0x0000f3, 0x000000, 0x000000);
277	if (y == 4.0) tile = ( x < 96.0 ) ? vec4(0xfcccf1, 0xc4ffff, 0xc8f1cc, 0xc8c04c) : vec4(0xc89cfc, 0x0000f3, 0x000000, 0x000000);
278	if (y == 5.0) tile = ( x < 96.0 ) ? vec4(0xc4c8f1, 0xc4ffff, 0xc8f1c8, 0xc8ffc8) : vec4(0xc88cc4, 0x0000ff, 0x000000, 0x000000);
279	if (y == 6.0) tile = ( x < 96.0 ) ? vec4(0xc0c8f1, 0xc0ffff, 0xc0f1c8, 0xc0ffc8) : vec4(0xc08cc0, 0x0000f3, 0x000000, 0x000000);
280	if (y == 7.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
281	if (y == 8.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
282	if (y == 9.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
283	if (y == 10.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
284	if (y == 11.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
285	if (y == 12.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
286	if (y == 13.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
287	if (y == 14.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
288	if (y == 15.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
289	if (y == 16.0) tile = ( x < 96.0 ) ? vec4(0xc0ffff, 0xc09cc0, 0xf3c4ff, 0xc0c0cc) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
290	if (y == 17.0) tile = ( x < 96.0 ) ? vec4(0xc4ffff, 0xc488cc, 0xf3c4ff, 0xc4f3c8) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
291	if (y == 18.0) tile = ( x < 96.0 ) ? vec4(0xfcffff, 0xfc80cc, 0xf3ccff, 0xfcf3c0) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
292	if (y == 19.0) tile = ( x < 96.0 ) ? vec4(0xe1ffff, 0xc094c8, 0xf3c0ff, 0xe1f3c0) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
293	if (y == 20.0) tile = ( x < 96.0 ) ? vec4(0xcfffff, 0xfc9cc8, 0xf1ccff, 0xcff1cc) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
294	if (y == 21.0) tile = ( x < 96.0 ) ? vec4(0xccffff, 0xc48cc8, 0xf1c8ff, 0xccf1c8) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
295	if (y == 22.0) tile = ( x < 96.0 ) ? vec4(0xc0ffff, 0xc08cc0, 0xf1c8ff, 0xc0f1c8) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
296	if (y == 23.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
297	if (y == 24.0) tile = ( x < 96.0 ) ? vec4(0xfffff3, 0xc0ccff, 0xc0ffc0, 0xccf8cc) : vec4(0xc4c0ff, 0x0000c0, 0x000000, 0x000000);
298	if (y == 25.0) tile = ( x < 96.0 ) ? vec4(0xfffff1, 0xc4ccff, 0xccffc4, 0xccf8c8) : vec4(0xc4f3ff, 0x0000c4, 0x000000, 0x000000);
299	if (y == 26.0) tile = ( x < 96.0 ) ? vec4(0xfffff0, 0xfcccff, 0xccfffc, 0xccf8c0) : vec4(0xccf3ff, 0x0000fc, 0x000000, 0x000000);
300	if (y == 27.0) tile = ( x < 96.0 ) ? vec4(0xfffff3, 0xe1ccff, 0xc8ffc0, 0xc0f9c0) : vec4(0xc0f3ff, 0x0000c0, 0x000000, 0x000000);
301	if (y == 28.0) tile = ( x < 96.0 ) ? vec4(0xfffff3, 0xcfc4ff, 0xc8fffc, 0xf3f9cc) : vec4(0xccf1ff, 0x0000fc, 0x000000, 0x000000);
302	if (y == 29.0) tile = ( x < 96.0 ) ? vec4(0xfff3f3, 0xccc4ff, 0xc8ffc4, 0xe3c9c8) : vec4(0xc8f1ff, 0x0000c4, 0x000000, 0x000000);
303	if (y == 30.0) tile = ( x < 96.0 ) ? vec4(0xfff3c0, 0xc0c0ff, 0xc0ffc0, 0xe3c1c8) : vec4(0xc8f1ff, 0x0000c0, 0x000000, 0x000000);
304	if (y == 31.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
305	if (y == 32.0) tile = ( x < 96.0 ) ? vec4(0xf3cce0, 0xffe0f8, 0xffccf3, 0xc0c0c0) : vec4(0xc0ffcc, 0x0000c0, 0x000000, 0x000000);
306	if (y == 33.0) tile = ( x < 96.0 ) ? vec4(0xf3cce4, 0xffccf8, 0xffc8f3, 0xcccccc) : vec4(0xf3ffcc, 0x0000cc, 0x000000, 0x000000);
307	if (y == 34.0) tile = ( x < 96.0 ) ? vec4(0xf3cce4, 0xffccf8, 0xffc0f3, 0xccccfc) : vec4(0xf3ffcc, 0x0000cc, 0x000000, 0x000000);
308	if (y == 35.0) tile = ( x < 96.0 ) ? vec4(0xf3ccc0, 0xc04cf9, 0xffc0f3, 0xc0c8f8) : vec4(0xf3ffc0, 0x0000c8, 0x000000, 0x000000);
309	if (y == 36.0) tile = ( x < 96.0 ) ? vec4(0xf1c4cc, 0xc048f9, 0xffccf1, 0xfcc8f8) : vec4(0xf1fff3, 0x0000c8, 0x000000, 0x000000);
310	if (y == 37.0) tile = ( x < 96.0 ) ? vec4(0xf1c4cc, 0xffc8c9, 0xffc8f1, 0xf8c8c8) : vec4(0xf1ffe3, 0x0000c8, 0x000000, 0x000000);
311	if (y == 38.0) tile = ( x < 96.0 ) ? vec4(0xf1c0c0, 0xffc0c1, 0xffc8f1, 0xf8c0c0) : vec4(0xf1ffe3, 0x0000c0, 0x000000, 0x000000);
312	if (y == 39.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
313	if (y == 40.0) tile = ( x < 96.0 ) ? vec4(0xc0cce0, 0xc0f3f8, 0xc0c0e1, 0xc0f3ff) : vec4(0xc0ccff, 0x0000c0, 0x000000, 0x000000);
314	if (y == 41.0) tile = ( x < 96.0 ) ? vec4(0xcccccc, 0xccf3f8, 0xc4f3ed, 0xf3f3ff) : vec4(0xc4ccff, 0x0000c4, 0x000000, 0x000000);
315	if (y == 42.0) tile = ( x < 96.0 ) ? vec4(0xcccccc, 0xfcf3f8, 0xfcf3ed, 0xf3f3ff) : vec4(0xfcccff, 0x0000fc, 0x000000, 0x000000);
316	if (y == 43.0) tile = ( x < 96.0 ) ? vec4(0xc0cccc, 0xf8f3f9, 0xc0f3c0, 0xf3f3ff) : vec4(0xe1ccff, 0x0000c0, 0x000000, 0x000000);
317	if (y == 44.0) tile = ( x < 96.0 ) ? vec4(0xfcc4c8, 0xf8f1f9, 0xfcf1cc, 0xf1f1ff) : vec4(0xcfc4ff, 0x0000fc, 0x000000, 0x000000);
318	if (y == 45.0) tile = ( x < 96.0 ) ? vec4(0xf8c4c8, 0xc8f1c9, 0xc4f1c4, 0xf1f1ff) : vec4(0xccc4f3, 0x0000c4, 0x000000, 0x000000);
319	if (y == 46.0) tile = ( x < 96.0 ) ? vec4(0xf8c0c0, 0xc0f1c1, 0xc0f1c4, 0xf1f1ff) : vec4(0xc0c0f3, 0x0000c0, 0x000000, 0x000000);
320	if (y == 47.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
321	if (y == 48.0) tile = ( x < 96.0 ) ? vec4(0x9cfff3, 0xffc0c0, 0xf3c0e0, 0xc0c0c4) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
322	if (y == 49.0) tile = ( x < 96.0 ) ? vec4(0x88fff1, 0xffccc4, 0xf3cccc, 0xc4c4c4) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
323	if (y == 50.0) tile = ( x < 96.0 ) ? vec4(0x80fff0, 0xfffcfc, 0xf3cccc, 0xfcfcc4) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
324	if (y == 51.0) tile = ( x < 96.0 ) ? vec4(0x94fff3, 0xffc4c0, 0xf3c0cc, 0xe1c0cc) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
325	if (y == 52.0) tile = ( x < 96.0 ) ? vec4(0x9cfff3, 0xffc4fc, 0xf1e4c8, 0xcffccc) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
326	if (y == 53.0) tile = ( x < 96.0 ) ? vec4(0x8cfff3, 0xffccc4, 0xf1c4c8, 0xccc4e1) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
327	if (y == 54.0) tile = ( x < 96.0 ) ? vec4(0x8cffc0, 0xffc0c0, 0xf1c4c0, 0xc0c0f3) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
328	if (y == 55.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
329	if (y == 56.0) tile = ( x < 96.0 ) ? vec4(0xc0c4c0, 0xc0e0ff, 0xffc09c, 0xc0c0f3) : vec4(0xc0f8c0, 0x0000ff, 0x000000, 0x000000);
330	if (y == 57.0) tile = ( x < 96.0 ) ? vec4(0xc4c4f3, 0xc4ccff, 0xffcc88, 0xc4f3f3) : vec4(0xc4f8c4, 0x0000ff, 0x000000, 0x000000);
331	if (y == 58.0) tile = ( x < 96.0 ) ? vec4(0xfcccf3, 0xfcccff, 0xffcc80, 0xfcf3f3) : vec4(0xfcf8fc, 0x0000ff, 0x000000, 0x000000);
332	if (y == 59.0) tile = ( x < 96.0 ) ? vec4(0xc0c0f3, 0xc0ccff, 0xffc894, 0xe1f3f3) : vec4(0xf0f9c0, 0x0000ff, 0x000000, 0x000000);
333	if (y == 60.0) tile = ( x < 96.0 ) ? vec4(0xfcccf1, 0xfcc8ff, 0xffc89c, 0xcff1f1) : vec4(0xfcf9fc, 0x0000ff, 0x000000, 0x000000);
334	if (y == 61.0) tile = ( x < 96.0 ) ? vec4(0xc4c8f1, 0xc4c8ff, 0xffc88c, 0xccf1f1) : vec4(0xfcc9c4, 0x0000ff, 0x000000, 0x000000);
335	if (y == 62.0) tile = ( x < 96.0 ) ? vec4(0xc0c8f1, 0xc0c0ff, 0xffc08c, 0xc0f1f1) : vec4(0xfcc1c0, 0x0000ff, 0x000000, 0x000000);
336	if (y == 63.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
337	if (y == 64.0) tile = ( x < 96.0 ) ? vec4(0xccccc0, 0xc0ffc0, 0xf3ffcc, 0xffc1ff) : vec4(0xc0c09c, 0x0000ff, 0x000000, 0x000000);
338	if (y == 65.0) tile = ( x < 96.0 ) ? vec4(0xc8cccc, 0xccffc4, 0xf1ffc8, 0xff9c9f) : vec4(0xccc488, 0x0000ff, 0x000000, 0x000000);
339	if (y == 66.0) tile = ( x < 96.0 ) ? vec4(0xc0cccc, 0xccfffc, 0xf0ffc0, 0xff9fcf) : vec4(0xfcfc80, 0x0000ff, 0x000000, 0x000000);
340	if (y == 67.0) tile = ( x < 96.0 ) ? vec4(0xc0ccc0, 0xc8ffe1, 0xf3ffc0, 0xffc1e7) : vec4(0xc4c094, 0x0000ff, 0x000000, 0x000000);
341	if (y == 68.0) tile = ( x < 96.0 ) ? vec4(0xccc4e4, 0xc8ffcf, 0xf3ffcc, 0xfffcf3) : vec4(0xc4fc9c, 0x0000ff, 0x000000, 0x000000);
342	if (y == 69.0) tile = ( x < 96.0 ) ? vec4(0xc8c4c4, 0xc8ffcc, 0xf3ffc8, 0xfffcf9) : vec4(0xccc48c, 0x0000ff, 0x000000, 0x000000);
343	if (y == 70.0) tile = ( x < 96.0 ) ? vec4(0xc8c0c4, 0xc0ffc0, 0xc0ffc8, 0xff80fc) : vec4(0xc0c08c, 0x0000ff, 0x000000, 0x000000);
344	if (y == 71.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
345	if (y == 72.0) tile = ( x < 96.0 ) ? vec4(0xcfc0c0, 0xe1ffc0, 0xffe0cc, 0xf3c0e0) : vec4(0xc0c0c4, 0x0000ff, 0x000000, 0x000000);
346	if (y == 73.0) tile = ( x < 96.0 ) ? vec4(0xe7f3c4, 0xedffc4, 0xffccc8, 0xf3cccc) : vec4(0xc4c4c4, 0x0000ff, 0x000000, 0x000000);
347	if (y == 74.0) tile = ( x < 96.0 ) ? vec4(0xf3f3fc, 0xedfffc, 0xffccc0, 0xf3cccc) : vec4(0xfcfcc4, 0x0000ff, 0x000000, 0x000000);
348	if (y == 75.0) tile = ( x < 96.0 ) ? vec4(0xfff3e1, 0xc0ffe1, 0xffccc0, 0xf3c0cc) : vec4(0xe1c0cc, 0x0000ff, 0x000000, 0x000000);
349	if (y == 76.0) tile = ( x < 96.0 ) ? vec4(0xfff1cf, 0xccffcf, 0xffc8cc, 0xf1e4c8) : vec4(0xcffccc, 0x0000ff, 0x000000, 0x000000);
350	if (y == 77.0) tile = ( x < 96.0 ) ? vec4(0xfff1cc, 0xc4ffcc, 0xffc8c8, 0xf1c4c8) : vec4(0xccc4e1, 0x0000f3, 0x000000, 0x000000);
351	if (y == 78.0) tile = ( x < 96.0 ) ? vec4(0xfff1c0, 0xc4ffc0, 0xffc0c8, 0xf1c4c0) : vec4(0xc0c0f3, 0x0000f3, 0x000000, 0x000000);
352	if (y == 79.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
353	if (y == 80.0) tile = ( x < 96.0 ) ? vec4(0xc0ffc1, 0xc0c7cc, 0xc0ffcc, 0xffc0c4) : vec4(0xc0c0e0, 0x0000c0, 0x000000, 0x000000);
354	if (y == 81.0) tile = ( x < 96.0 ) ? vec4(0xc4ff9c, 0xccc7c8, 0xf3ffcc, 0xffc4c4) : vec4(0xc4c4e4, 0x0000f3, 0x000000, 0x000000);
355	if (y == 82.0) tile = ( x < 96.0 ) ? vec4(0xfcff9f, 0xccc7c0, 0xf3ffcc, 0xfffccc) : vec4(0xfcfce4, 0x0000f3, 0x000000, 0x000000);
356	if (y == 83.0) tile = ( x < 96.0 ) ? vec4(0xc0ffc1, 0xc8e7c0, 0xf3ffc0, 0xffc0c0) : vec4(0xe1c0c0, 0x0000f3, 0x000000, 0x000000);
357	if (y == 84.0) tile = ( x < 96.0 ) ? vec4(0xfcfffc, 0xc8e7cc, 0xf1fff3, 0xfffccc) : vec4(0xcffccc, 0x0000f1, 0x000000, 0x000000);
358	if (y == 85.0) tile = ( x < 96.0 ) ? vec4(0xc4f3fc, 0xc8e4c8, 0xf1ffe3, 0xffc4c8) : vec4(0xccc4cc, 0x0000f1, 0x000000, 0x000000);
359	if (y == 86.0) tile = ( x < 96.0 ) ? vec4(0xc0f380, 0xc0e0c8, 0xf1ffe3, 0xffc0c8) : vec4(0xc0c0c0, 0x0000f1, 0x000000, 0x000000);
360	if (y == 87.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
361	if (y == 88.0) tile = ( x < 96.0 ) ? vec4(0xffc0c0, 0x9cc0e0, 0xc0ffc0, 0x9cc0c0) : vec4(0xc4c0ff, 0x0000c0, 0x000000, 0x000000);
362	if (y == 89.0) tile = ( x < 96.0 ) ? vec4(0xfff3c4, 0x88c4cc, 0xc4ffcc, 0x88cccc) : vec4(0xc4f3ff, 0x0000c4, 0x000000, 0x000000);
363	if (y == 90.0) tile = ( x < 96.0 ) ? vec4(0xfff3fc, 0x80fccc, 0xfcffcc, 0x80cccc) : vec4(0xccf3ff, 0x0000fc, 0x000000, 0x000000);
364	if (y == 91.0) tile = ( x < 96.0 ) ? vec4(0xc073e1, 0x94c0cc, 0xf0ffc8, 0x94c8c0) : vec4(0xc0f3ff, 0x0000c0, 0x000000, 0x000000);
365	if (y == 92.0) tile = ( x < 96.0 ) ? vec4(0xc071cf, 0x9cfcc8, 0xfcffc8, 0x9cc8e4) : vec4(0xccf1ff, 0x0000fc, 0x000000, 0x000000);
366	if (y == 93.0) tile = ( x < 96.0 ) ? vec4(0xfff1cc, 0x8cc4c8, 0xfcffc8, 0x8cc8c4) : vec4(0xc8f1ff, 0x0000c4, 0x000000, 0x000000);
367	if (y == 94.0) tile = ( x < 96.0 ) ? vec4(0xfff1c0, 0x8cc0c0, 0xfcffc0, 0x8cc0c4) : vec4(0xc8f1ff, 0x0000c0, 0x000000, 0x000000);
368	if (y == 95.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
369	if (y == 96.0) tile = ( x < 96.0 ) ? vec4(0xc0c0e0, 0xc0ffc0, 0xc0ffc0, 0xc0cccc) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
370	if (y == 97.0) tile = ( x < 96.0 ) ? vec4(0xc4c4e4, 0xc4fff3, 0xccfff3, 0xc4cccc) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
371	if (y == 98.0) tile = ( x < 96.0 ) ? vec4(0xfcfce4, 0xfcfff3, 0xfcfff3, 0xfccccc) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
372	if (y == 99.0) tile = ( x < 96.0 ) ? vec4(0xe1c0c0, 0xe1fff3, 0xc4c073, 0xe1c0cc) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
373	if (y == 100.0) tile = ( x < 96.0 ) ? vec4(0xcffccc, 0xcffff1, 0xc4c071, 0xcff3c4) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
374	if (y == 101.0) tile = ( x < 96.0 ) ? vec4(0xccc4cc, 0xccfff1, 0xccfff1, 0xcce3c4) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
375	if (y == 102.0) tile = ( x < 96.0 ) ? vec4(0xc0c0c0, 0xc0fff1, 0xc0fff1, 0xc0e3c0) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
376	if (y == 103.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
377	if (y == 104.0) tile = ( x < 96.0 ) ? vec4(0xffffff, 0xc0c4c0, 0xccccff, 0xccc0f3) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
378	if (y == 105.0) tile = ( x < 96.0 ) ? vec4(0xffffff, 0xc4c4f3, 0xc8ccff, 0xc8ccf3) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
379	if (y == 106.0) tile = ( x < 96.0 ) ? vec4(0xffffff, 0xfcccf3, 0xc0ccff, 0xc0ccf3) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
380	if (y == 107.0) tile = ( x < 96.0 ) ? vec4(0xffffff, 0xc0c0f3, 0xc0ccff, 0xc0c8f3) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
381	if (y == 108.0) tile = ( x < 96.0 ) ? vec4(0xffffff, 0xfcccf1, 0xccc4ff, 0xccc8f1) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
382	if (y == 109.0) tile = ( x < 96.0 ) ? vec4(0xffffff, 0xc4c8f1, 0xc8c4ff, 0xc8c8f1) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
383	if (y == 110.0) tile = ( x < 96.0 ) ? vec4(0xffffff, 0xc0c8f1, 0xc8c0ff, 0xc8c0f1) : vec4(0xfffff3, 0x0000ff, 0x000000, 0x000000);
384	if (y == 111.0) tile = ( x < 96.0 ) ? vec4(0xffffff) : vec4(0xffffff, 0x0000ff, 0x000000, 0x000000);
385
386	float n = mod(x, 96.0); // quantize x coordinate to nearest 96 pixels and get float containing 24 pixels
387	float t = ( ( n < 24.0 ) ? tile.x : ( n < 48.0 ) ? tile.y : (n < 72.0 ) ? tile.z : tile.w );
388	float p = mod( x, 24.0 ) * 1.0; // quantize x coordinate to nearest 24 pixels to determine pixel bit index
389	int idx = int( mod( floor( t*exp2(-p) ), 2.0 ));
390
391	// look up colour palette for the indexed pixel
392	if (idx == 0) color = vec4(1.000000, 1.000000, 1.000000, 1.0);
393	if (idx == 1) color = vec4(0.898039, 0.447059, 0.796078, 0.0);
394}
395
396
397
398
399void drawLogo(inout vec4 bg, in float x, in float y, in vec2 pixelCoord)
400{
401    const float w = 64.0;
402    const float h = 32.0;
403
404    // bounds check - no idea how the GPU feels about these checks.
405	if ( (pixelCoord.x >= x) && (pixelCoord.y >= y)
406        && (pixelCoord.x < (x + w)) && (pixelCoord.y < (y + h)))
407    {
408    	vec2 coord;
409    	coord.x = (pixelCoord.x - x);
410    	coord.y = (pixelCoord.y - y);
411        drawSpriteUnionDemoLogo(bg,  coord.x, coord.y);
412    }
413
414}
415
416#define RGBA(r,g,b,a) vec4(float(r)/255.0, float(g)/255.0, float(b)/255.0, float(a)/255.0)
417
418void textGradient(inout vec4 c, in float y)
419{
420	const float GRADIENT_SCALE = 112.0/4.0; // 4 zones over the 112 pixel high bitmap
421    const vec4 GRADIENT0 = RGBA(224,0,32,255);
422    const vec4 GRADIENT1 = RGBA(224,0,224,255);
423    const vec4 GRADIENT2 = RGBA(224,224,224,255);
424    const vec4 GRADIENT3 = RGBA(224,224,32,255);
425    const vec4 GRADIENT4 = RGBA(160,224,0,255);
426
427    // quantize vertical coord into 4 zones
428    float n = floor(y / GRADIENT_SCALE);
429
430    // compute interpolation amount
431    float k = mod(y, GRADIENT_SCALE) / 112.0 * 4.0;
432
433    // lerp the gradients across each zone
434    if (n == 0.0) c *= mix(GRADIENT0, GRADIENT1, k);
435    if (n == 1.0) c *= mix(GRADIENT1, GRADIENT2, k);
436    if (n == 2.0) c *= mix(GRADIENT2, GRADIENT3, k);
437    if (n == 3.0) c *= mix(GRADIENT3, GRADIENT4, k);
438}
439
440void drawText(inout vec4 bg, in float x, in float y, in vec2 pixelCoord)
441{
442    float w = 128.0*2.0;	// we double up the horizontal pixels when rendering this one
443    float h = 112.0;
444
445	if ( (pixelCoord.x >= x) && (pixelCoord.y >= y)
446        && (pixelCoord.x < (x + w)) && (pixelCoord.y < (y + h)))
447    {
448    	vec2 coord;
449    	coord.x = (pixelCoord.x - x);
450    	coord.y = (pixelCoord.y - y);
451        drawSpriteUnionLettersWhite(bg,  floor(coord.x/2.0), coord.y);
452        // apply colour gradient to white text bitmap
453        textGradient(bg, coord.y);
454    }
455}
456
457
458void mainImage( out vec4 fragColor, in vec2 fragCoord )
459{
460	float sx, sy;
461    vec4 c2;
462
463    // convert screen space to 320x200 bitmap with top left origin
464	vec2 uv = fragCoord.xy / iResolution.xy;
465    vec2 pixelCoord;
466    pixelCoord.x = floor(uv.x * 320.0);
467    pixelCoord.y = floor((1.0 - uv.y) * 200.0);
468
469	// render background as tiled bitmap, with vertical scroll animation
470    vec4 bg = vec4(0.0);
471    sx = mod(floor(fragCoord.x / 3.0), 48.0);
472    sy = mod(floor(iGlobalTime * 50.0 + fragCoord.y / 3.0), 48.0);
473	drawSpriteUnionBackground(bg, sx, sy);
474
475    // animate the logo horizontally & render it
476    sx = floor(sin(iGlobalTime*3.0) * cos(iGlobalTime*2.0) * 280.0*0.3 + 260.0*0.5);
477    sy = 4.0;
478    c2 = vec4(0.0);
479    drawLogo(c2, sx, sy, pixelCoord);
480    bg = mix(bg, c2, c2.w);
481
482	// animate the text in an old-skool sine wave way and render it
483    float ws = iGlobalTime*2.5;
484    sx = 32.0 + sin(pixelCoord.y/40.0 + ws)*20.0;
485    sy = floor(64.0 + cos(pixelCoord.x/40.0 + ws)*4.0);
486    drawText(c2, sx, sy, pixelCoord);
487    bg = mix(bg, c2, c2.w);
488
489    // final output
490    fragColor = bg;
491}
492
493 void main(void)
494{
495  //just some shit to wrap shadertoy's stuff
496  vec2 FragCoord = vTexCoord.xy*OutputSize.xy;
497  mainImage(FragColor,FragCoord);
498}
499#endif
500