type = fancymenu_layout

layout-meta {
  identifier = receiving_level_screen
  render_custom_elements_behind_vanilla = false
  last_edited_time = 0
  is_enabled = true
  randommode = false
  randomgroup = 1
  randomonlyfirsttime = false
  layout_index = 0
}

menu_background {
  instance_identifier = 5f26e2b5-473b-4b22-b03a-fd46db1f7c5f-toz
  background_type = glsl
  show_background = true
  inline_shader_source = // Teachings of Zeta - loading screens: the canal town being built in time-lapse.%%!serialized_property_newline!%%// Generated by modpack_pipeline/menu/gen_menu_scenes.py + gen_menu_art.py from scenes/*.glsl -%%!serialized_property_newline!%%// edit those, then re-run the generators.%%!serialized_property_newline!%%%%!serialized_property_newline!%%// clock: since the last menu%%!serialized_property_newline!%%%%!serialized_property_newline!%%// generated by modpack_pipeline/menu/gen_menu_art.py - atlas 384x517%%!serialized_property_newline!%%const ivec4 R_MOUNT = ivec4(0, 2, 384, 44); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_HILLS = ivec4(0, 47, 384, 30); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_VIADUCT = ivec4(0, 78, 384, 24); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_TOWN_FAR = ivec4(0, 103, 384, 38); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_TOWN_NEAR = ivec4(0, 142, 384, 30); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_QUAY = ivec4(0, 173, 384, 24); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_SHIP_BIG = ivec4(0, 198, 76, 32); // 2 frame(s)%%!serialized_property_newline!%%const ivec4 R_SHIP_SMALL = ivec4(153, 198, 41, 17); // 2 frame(s)%%!serialized_property_newline!%%const ivec4 R_LOCO = ivec4(236, 198, 28, 17); // 2 frame(s)%%!serialized_property_newline!%%const ivec4 R_CAR = ivec4(293, 198, 22, 15); // 2 frame(s)%%!serialized_property_newline!%%const ivec4 R_MILL = ivec4(338, 198, 14, 24); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_BLADES = ivec4(0, 231, 30, 30); // 6 frame(s)%%!serialized_property_newline!%%const ivec4 R_GEAR_BIG = ivec4(0, 262, 70, 70); // 4 frame(s)%%!serialized_property_newline!%%const ivec4 R_GEAR_MID = ivec4(0, 333, 46, 46); // 4 frame(s)%%!serialized_property_newline!%%const ivec4 R_GEAR_SMALL = ivec4(185, 333, 34, 34); // 4 frame(s)%%!serialized_property_newline!%%const ivec4 R_CLOUD_A = ivec4(0, 380, 64, 15); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_CLOUD_B = ivec4(65, 380, 46, 12); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_CLOUD_C = ivec4(112, 380, 30, 9); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_HARBOR = ivec4(0, 396, 384, 40); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_PIER = ivec4(0, 437, 384, 22); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_LIGHTHOUSE = ivec4(0, 460, 20, 56); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_MAST = ivec4(21, 460, 12, 50); // 1 frame(s)%%!serialized_property_newline!%%const ivec4 R_STEAMBOAT = ivec4(34, 460, 52, 24); // 2 frame(s)%%!serialized_property_newline!%%const ivec4 R_PLANE = ivec4(139, 460, 24, 13); // 2 frame(s)%%!serialized_property_newline!%%// chimney tops: x in strip, y above strip bottom, size%%!serialized_property_newline!%%const int N_CHIM_NEAR = 5;%%!serialized_property_newline!%%const vec3 CHIM_NEAR[5] = vec3[5](vec3(4.0, 20.0, 1.0), vec3(124.0, 26.0, 1.0), vec3(188.0, 21.0, 1.0), vec3(231.0, 30.0, 1.0), vec3(317.0, 24.0, 1.0));%%!serialized_property_newline!%%const int N_CHIM_FAR = 6;%%!serialized_property_newline!%%const vec3 CHIM_FAR[6] = vec3[6](vec3(156.0, 18.0, 1.0), vec3(166.0, 20.0, 1.0), vec3(203.0, 19.0, 1.0), vec3(355.0, 27.0, 1.0), vec3(363.0, 25.0, 1.0), vec3(377.0, 22.0, 1.0));%%!serialized_property_newline!%%const int N_CHIM_HARBOR = 2;%%!serialized_property_newline!%%const vec3 CHIM_HARBOR[2] = vec3[2](vec3(310.5, 31.0, 1.6), vec3(321.5, 31.0, 1.6));%%!serialized_property_newline!%%const float STRIP_W = 384.0;%%!serialized_property_newline!%%const vec2 MILL = vec2(46.0, 17.0); // windmill base in the hills strip%%!serialized_property_newline!%%%%!serialized_property_newline!%%// ------------------------------------------------------------------ common (all scenes)%%!serialized_property_newline!%%// Every scene draws on a PIXW px wide virtual grid (p = virtual pixel, y up, 0 at the bottom; H = height)%%!serialized_property_newline!%%// and gets the music as a Music value: see music() at the end of this file.%%!serialized_property_newline!%%%%!serialized_property_newline!%%#define PIXW 320.0%%!serialized_property_newline!%%#define PI 3.14159265%%!serialized_property_newline!%%%%!serialized_property_newline!%%// FancyMenu variables (set every frame by Tickers in the title layout), uploaded as fmVarFloat_<name>%%!serialized_property_newline!%%uniform float fmVarFloat_toz_music_pos;     // seconds into the current track; -1 = addon missing%%!serialized_property_newline!%%uniform float fmVarFloat_toz_music_dur;     // length of the current track; 0 while it is loading%%!serialized_property_newline!%%uniform float fmVarFloat_toz_music_track;   // playlist index of the current track%%!serialized_property_newline!%%uniform int fmVarBool_toz_music_playing;     // 1 while the track plays (0 paused / stopped)%%!serialized_property_newline!%%%%!serialized_property_newline!%%float H;            // virtual height%%!serialized_property_newline!%%bool TOP_FIRST;     // atlas row 0 is the image's top row%%!serialized_property_newline!%%ivec2 ATLAS_SIZE;%%!serialized_property_newline!%%%%!serialized_property_newline!%%float hash11(float p) { p = fract(p * 0.1031); p *= p + 33.33; p *= p + p; return fract(p); }%%!serialized_property_newline!%%float hash21(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * 0.1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }%%!serialized_property_newline!%%vec2 hash22(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * vec3(0.1031, 0.1030, 0.0973)); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.xx + p3.yz) * p3.zy); }%%!serialized_property_newline!%%vec3 hexrgb(int h) { return vec3(float((h >> 16) & 255), float((h >> 8) & 255), float(h & 255)) / 255.0; }%%!serialized_property_newline!%%float vnoise(float x) { float i = floor(x), f = fract(x); return mix(hash11(i), hash11(i + 1.0), f * f * (3.0 - 2.0 * f)); }%%!serialized_property_newline!%%float vnoise2(vec2 p) {%%!serialized_property_newline!%%    vec2 i = floor(p), f = fract(p);%%!serialized_property_newline!%%    vec2 u = f * f * (3.0 - 2.0 * f);%%!serialized_property_newline!%%    return mix(mix(hash21(i), hash21(i + vec2(1.0, 0.0)), u.x), mix(hash21(i + vec2(0.0, 1.0)), hash21(i + 1.0), u.x), u.y);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%// pixel-stepped ridge line: height of a silhouette at column x%%!serialized_property_newline!%%float ridge(float x, float seed, float amp, float scale) {%%!serialized_property_newline!%%    return floor(amp * (0.55 * vnoise(x / scale + seed) + 0.3 * vnoise(x / (scale * 0.37) + seed * 3.1) + 0.15 * vnoise(x / (scale * 0.13) + seed * 7.7)));%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%// 4x4 ordered dither threshold (0..1): the pixel-art way to blend two flat colours%%!serialized_property_newline!%%float bayer4(vec2 p) {%%!serialized_property_newline!%%    const int M[16] = int[16](0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5);%%!serialized_property_newline!%%    int x = int(mod(p.x, 4.0)), y = int(mod(p.y, 4.0));%%!serialized_property_newline!%%    return (float(M[y * 4 + x]) + 0.5) / 16.0;%%!serialized_property_newline!%%}%%!serialized_property_newline!%%vec3 dmix(vec3 a, vec3 b, float f, vec2 p) { return f > bayer4(p) ? b : a; }%%!serialized_property_newline!%%// stepped vertical gradient through a 4-colour palette (h 0..1 = c0..c3): 4 flat shades between each%%!serialized_property_newline!%%// pair (12 bands), joined by a thin ordered-dither seam instead of a wide checkerboard%%!serialized_property_newline!%%vec3 bands(vec3 c0, vec3 c1, vec3 c2, vec3 c3, float h, vec2 p) {%%!serialized_property_newline!%%    float f = clamp(h, 0.0, 0.999) * 12.0;%%!serialized_property_newline!%%    float level = clamp(floor(f + (bayer4(p) - 0.5) * 0.5), 0.0, 11.0);%%!serialized_property_newline!%%    float x = (level + 0.5) / 4.0;                                      // 0..3 across the palette%%!serialized_property_newline!%%    return x < 1.0 ? mix(c0, c1, x) : (x < 2.0 ? mix(c1, c2, x - 1.0) : mix(c2, c3, x - 2.0));%%!serialized_property_newline!%%}%%!serialized_property_newline!%%float luma(vec3 c) { return dot(c, vec3(0.30, 0.59, 0.11)); }%%!serialized_property_newline!%%vec2 rot(vec2 v, float a) { float c = cos(a), s = sin(a); return vec2(c * v.x - s * v.y, s * v.x + c * v.y); }%%!serialized_property_newline!%%// distance from the pixel centre to segment a-b (.x) and how far along it the closest point is (.y, 0..1)%%!serialized_property_newline!%%vec2 segment(vec2 p, vec2 a, vec2 b) {%%!serialized_property_newline!%%    vec2 pa = p + 0.5 - a, ba = b - a;%%!serialized_property_newline!%%    float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);%%!serialized_property_newline!%%    return vec2(length(pa - ba * h), h);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%// 3x5 pixel glyphs: 0-9 + x = pi sigma root; l = pixel inside the glyph, x from the left, y from the top%%!serialized_property_newline!%%const int GLYPH[16] = int[16](31599, 11415, 29671, 29647, 23497, 31183, 31215, 29330, 31727, 31695,%%!serialized_property_newline!%%                              1488, 2728, 3640, 31597, 30887, 4714);%%!serialized_property_newline!%%bool glyph(int g, vec2 l) {%%!serialized_property_newline!%%    if (l.x < 0.0 || l.y < 0.0 || l.x > 2.0 || l.y > 4.0) return false;%%!serialized_property_newline!%%    return ((GLYPH[g & 15] >> ((4 - int(l.y)) * 3 + (2 - int(l.x)))) & 1) == 1;%%!serialized_property_newline!%%}%%!serialized_property_newline!%%// bitmap sprite of up to 16 columns: rows[] top to bottom, bit (w-1) = leftmost pixel%%!serialized_property_newline!%%bool bitAt(int row, int w, float x) { return x >= 0.0 && x < float(w) && ((row >> (w - 1 - int(x))) & 1) == 1; }%%!serialized_property_newline!%%%%!serialized_property_newline!%%// ------------------------------------------------------------------ atlas access (iChannel0)%%!serialized_property_newline!%%vec4 texel(int x, int y) {%%!serialized_property_newline!%%    int ty = TOP_FIRST ? y : ATLAS_SIZE.y - 1 - y;%%!serialized_property_newline!%%    return texelFetch(iChannel0, ivec2(x, ty), 0);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%// local: pixel inside the sprite, y counted up from the sprite's bottom row%%!serialized_property_newline!%%vec4 sprite(ivec4 r, int frame, vec2 local) {%%!serialized_property_newline!%%    if (local.x < 0.0 || local.y < 0.0 || local.x >= float(r.z) || local.y >= float(r.w)) return vec4(0.0);%%!serialized_property_newline!%%    return texel(r.x + frame * r.z + int(local.x), r.y + r.w - 1 - int(local.y));%%!serialized_property_newline!%%}%%!serialized_property_newline!%%// sprites face right; `left` mirrors them, so nothing ever flies backwards%%!serialized_property_newline!%%vec4 spriteDir(ivec4 r, int frame, vec2 local, bool left) {%%!serialized_property_newline!%%    if (left) local.x = float(r.z) - 1.0 - local.x;%%!serialized_property_newline!%%    return sprite(r, frame, local);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%// a biplane with its bottom-left at `pos`, propeller spinning, puffs of exhaust trailing behind;%%!serialized_property_newline!%%// .a = coverage (1 for the plane, less for the fading puffs)%%!serialized_property_newline!%%vec4 biplane(vec2 p, vec2 pos, bool left, float t) {%%!serialized_property_newline!%%    vec2 o = floor(pos);%%!serialized_property_newline!%%    vec4 c = spriteDir(R_PLANE, int(mod(t * 16.0, 2.0)), p - o, left);%%!serialized_property_newline!%%    if (c.a > 0.5) return vec4(c.rgb, 1.0);%%!serialized_property_newline!%%    float back = left ? p.x - (o.x + float(R_PLANE.z)) : o.x - p.x;              // distance behind the tail%%!serialized_property_newline!%%    if (back >= 1.0 && back < 22.0 && p.y == o.y + 6.0 + floor(back / 11.0) && mod(back + floor(t * 12.0), 5.0) < 2.0)%%!serialized_property_newline!%%        return vec4(vec3(0.96, 0.96, 0.98), 0.9 - back / 24.0);%%!serialized_property_newline!%%    return vec4(0.0);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%vec4 strip(ivec4 r, float x, float ly) {%%!serialized_property_newline!%%    if (ly < 0.0 || ly >= float(r.w)) return vec4(0.0);%%!serialized_property_newline!%%    return texel(r.x + int(mod(x, STRIP_W)), r.y + r.w - 1 - int(ly));%%!serialized_property_newline!%%}%%!serialized_property_newline!%%bool isKey(vec4 c, vec3 k) { return c.a > 0.5 && all(lessThan(abs(c.rgb - k), vec3(0.02))); }%%!serialized_property_newline!%%%%!serialized_property_newline!%%// ------------------------------------------------------------------ music (iChannel1 = envelope.png)%%!serialized_property_newline!%%struct Music {%%!serialized_property_newline!%%    float tension;  // the song's arc, 0..1 (seconds)%%!serialized_property_newline!%%    float energy;   // loudness of the moment, 0..1%%!serialized_property_newline!%%    float accent;   // hits / note onsets, jumps up and decays in ~0.2 s%%!serialized_property_newline!%%    float hit;      // seconds since the last big hit (>= HIT_NONE: none lately) - for longer events%%!serialized_property_newline!%%    float hitSeed;  // differs per big hit: picks where/how its event happens%%!serialized_property_newline!%%    float drive;    // music time: runs 0.3x (calm) .. 1.7x (climax) real time, never jumps%%!serialized_property_newline!%%    float pos;      // seconds into the track%%!serialized_property_newline!%%    float prog;     // 0..1 through the track%%!serialized_property_newline!%%    bool live;      // false: no position (addon missing) - a slow synthetic swell instead%%!serialized_property_newline!%%    bool playing;   // false while paused: the song's state holds, hits and their events stay away%%!serialized_property_newline!%%};%%!serialized_property_newline!%%%%!serialized_property_newline!%%#define HIT_NONE 2.5%%!serialized_property_newline!%%%%!serialized_property_newline!%%ivec2 ENV_SIZE;%%!serialized_property_newline!%%bool ENV_TOP;%%!serialized_property_newline!%%vec4 envTexel(int x, int y) {%%!serialized_property_newline!%%    int ty = ENV_TOP ? y : ENV_SIZE.y - 1 - y;%%!serialized_property_newline!%%    return texelFetch(iChannel1, ivec2(x, ty), 0);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%vec4 envAt(int row0, int i) { return envTexel(i % ENV_SIZE.x, row0 + i / ENV_SIZE.x); }%%!serialized_property_newline!%%int u8(float v) { return int(v * 255.0 + 0.5); }%%!serialized_property_newline!%%%%!serialized_property_newline!%%Music synthetic(float t) {%%!serialized_property_newline!%%    float s = 0.5 + 0.5 * sin(t * 0.07);%%!serialized_property_newline!%%    return Music(0.35 + 0.3 * s, 0.4 + 0.3 * s, 0.0, 9.0, 0.0, t, 0.0, fract(t / 240.0), false, true);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%Music music(int track, float t) {%%!serialized_property_newline!%%    ENV_SIZE = textureSize(iChannel1, 0);%%!serialized_property_newline!%%    float pos = fmVarFloat_toz_music_pos;%%!serialized_property_newline!%%    if (pos < 0.0 || ENV_SIZE.x < 8) return synthetic(t);%%!serialized_property_newline!%%    vec4 mark = texelFetch(iChannel1, ivec2(0, 0), 0);%%!serialized_property_newline!%%    ENV_TOP = mark.r > 0.5 && mark.g < 0.5;%%!serialized_property_newline!%%    vec4 h = envTexel(1 + track, 0);%%!serialized_property_newline!%%    int row0 = u8(h.r), n = u8(h.g) * 256 + u8(h.b);%%!serialized_property_newline!%%    float rate = float(u8(ENV_TOP ? mark.b : envTexel(0, 0).b));%%!serialized_property_newline!%%    if (row0 < 1 || n < 2 || rate < 1.0) return synthetic(t);%%!serialized_property_newline!%%    float fi = clamp(pos * rate, 0.0, float(n) - 1.001);%%!serialized_property_newline!%%    int i = int(fi);%%!serialized_property_newline!%%    float f = fract(fi);%%!serialized_property_newline!%%    vec3 v = mix(envAt(row0, i).rgb, envAt(row0, i + 1).rgb, f);%%!serialized_property_newline!%%    int drow = row0 + (n + ENV_SIZE.x - 1) / ENV_SIZE.x;%%!serialized_property_newline!%%    vec4 da = envAt(drow, i), db = envAt(drow, i + 1);%%!serialized_property_newline!%%    float drive = mix(float(u8(da.r) * 256 + u8(da.g)), float(u8(db.r) * 256 + u8(db.g)), f) * 0.01;%%!serialized_property_newline!%%    int age = u8(da.b);                                   // centiseconds since the last big hit%%!serialized_property_newline!%%    float hit = age >= 250 ? 9.0 : float(age) * 0.01 + f / rate;%%!serialized_property_newline!%%    float dur = fmVarFloat_toz_music_dur > 0.0 ? fmVarFloat_toz_music_dur : float(n) / rate;%%!serialized_property_newline!%%    // paused: the position stands still, so a hit (flash, firework, lightning...) would freeze mid-air -%%!serialized_property_newline!%%    // keep the song's state (tension, energy, drive) and drop the hits%%!serialized_property_newline!%%    if (fmVarBool_toz_music_playing == 0) return Music(v.r, v.g, 0.0, 9.0, 0.0, drive, pos, clamp(pos / dur, 0.0, 1.0), true, false);%%!serialized_property_newline!%%    return Music(v.r, v.g, v.b, hit, floor((pos - hit) * 4.0 + 0.5), drive, pos, clamp(pos / dur, 0.0, 1.0), true, true);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%%%!serialized_property_newline!%%// ------------------------------------------------------------------ Sweden: "Zeta by day"%%!serialized_property_newline!%%// The pack's home scene: canal town in daylight under a high sun (sprites from atlas.png, painted in%%!serialized_property_newline!%%// dusk purples and re-graded into daylight here), airships and biplanes in the sky. Music: clouds,%%!serialized_property_newline!%%// airships, planes, windmill, birds and smoke run on music time; the sun's halo grows with the tension and a ring leaves it on every hit; the light%%!serialized_property_newline!%%// turns golden as the song swells.%%!serialized_property_newline!%%%%!serialized_property_newline!%%const vec3 SW_HAZE = vec3(0.722, 0.839, 0.925);   // #b8d6ec%%!serialized_property_newline!%%%%!serialized_property_newline!%%// the landscape strips are painted in dusk purples: re-grade them into daylight%%!serialized_property_newline!%%// (desaturate, lift, cool slightly) and push distant layers into the haze%%!serialized_property_newline!%%vec3 swDay(vec3 c, float depth) {%%!serialized_property_newline!%%    float l = luma(c);%%!serialized_property_newline!%%    vec3 g = mix(c, vec3(l), 0.65) * 2.1 + vec3(0.05, 0.08, 0.10);%%!serialized_property_newline!%%    g = clamp(g * vec3(0.92, 1.0, 1.08), 0.0, 1.0);%%!serialized_property_newline!%%    return mix(g, SW_HAZE, depth);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%// window / lamp key colours: daytime = mostly sky reflections, lamps off%%!serialized_property_newline!%%vec3 swKeys(vec4 c, vec2 world, float t, float depth) {%%!serialized_property_newline!%%    if (isKey(c, vec3(1.0, 0.0, 1.0))) {%%!serialized_property_newline!%%        vec2 cell = floor(world / vec2(2.0, 3.0));%%!serialized_property_newline!%%        float id = hash21(cell + depth * 17.0);%%!serialized_property_newline!%%        float glint = step(0.985, hash21(cell + floor(t / (6.0 + id * 9.0)) * 3.1));%%!serialized_property_newline!%%        vec3 glass = mix(hexrgb(0x3e5468), hexrgb(0x5e7a92), step(0.6, id));%%!serialized_property_newline!%%        return mix(mix(glass, SW_HAZE, depth), hexrgb(0xf4fbff), glint);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    if (isKey(c, vec3(1.0, 1.0, 0.0))) return mix(hexrgb(0x8a96a6), SW_HAZE, depth);%%!serialized_property_newline!%%    return c.rgb;%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%vec3 swSky(vec2 p, float horizon, Music m) {%%!serialized_property_newline!%%    const int NB = 9;%%!serialized_property_newline!%%    const int BAND[9] = int[9](0xdcf0f8, 0xc6e6f6, 0xaedaf2, 0x96cced, 0x7fbde6, 0x6aaddf, 0x589cd6, 0x488ac9, 0x3b78ba);%%!serialized_property_newline!%%    float h = (p.y - horizon) / max(H - horizon, 1.0);%%!serialized_property_newline!%%    float f = clamp(h, 0.0, 0.999) * float(NB);%%!serialized_property_newline!%%    f = pow(f / float(NB), 0.9) * float(NB);%%!serialized_property_newline!%%    int i = int(f);%%!serialized_property_newline!%%    float fr = fract(f) * (H - horizon) / float(NB);%%!serialized_property_newline!%%    if (fr < 1.0 && mod(p.x + p.y, 2.0) < 1.0 && i > 0) i -= 1;      // one checker row between bands%%!serialized_property_newline!%%    vec3 col = hexrgb(BAND[clamp(i, 0, NB - 1)]);%%!serialized_property_newline!%%    // high sun: the stepped glow grows with the tension, a ring rides out from it on every hit%%!serialized_property_newline!%%    vec2 sc = vec2(0.76 * PIXW, H - 30.0);%%!serialized_property_newline!%%    float r = length(p + 0.5 - sc);%%!serialized_property_newline!%%    float g1 = 16.0 + 5.0 * m.tension, g2 = 22.0 + 9.0 * m.tension;%%!serialized_property_newline!%%    if (r < 11.0) col = r < 9.0 ? hexrgb(0xfffdf0) : hexrgb(0xfff2b8);%%!serialized_property_newline!%%    else if (r < g1) col = mix(col, hexrgb(0xfff8d8), 0.55);%%!serialized_property_newline!%%    else if (r < g2 && mod(p.x + p.y, 2.0) < 1.0) col = mix(col, hexrgb(0xfff8d8), 0.35);%%!serialized_property_newline!%%    float ring = 13.0 + 26.0 * (1.0 - m.accent);%%!serialized_property_newline!%%    if (m.accent > 0.08 && abs(r - ring) < 0.8) col = dmix(col, hexrgb(0xfffbe6), m.accent * 1.3, p);%%!serialized_property_newline!%%    return col;%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%// the town strips are drawn in daylight colours already (gen_menu_art.town_strip): the near town shows%%!serialized_property_newline!%%// as it is, the far one sits in the haze%%!serialized_property_newline!%%vec3 swNearTown(vec3 c) { return c; }%%!serialized_property_newline!%%vec3 swFarTown(vec3 c) { return mix(mix(c, vec3(luma(c)), 0.25), SW_HAZE, 0.34); }%%!serialized_property_newline!%%%%!serialized_property_newline!%%// white cumulus from the cloud sprites (grey-blue bodies, bright tops)%%!serialized_property_newline!%%vec3 swCloud(vec3 c) {%%!serialized_property_newline!%%    return mix(hexrgb(0xd2e2f0), hexrgb(0xffffff), smoothstep(0.42, 0.62, luma(c)));%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%vec4 swSmoke(vec2 p, float t, vec3 chim, float offx, float baseY, float depth) {%%!serialized_property_newline!%%    vec4 acc = vec4(0.0);%%!serialized_property_newline!%%    for (int w = -1; w <= 1; w++) {%%!serialized_property_newline!%%        vec2 src = vec2(chim.x - offx + float(w) * STRIP_W, baseY + chim.y);%%!serialized_property_newline!%%        if (abs(p.x - src.x) > 40.0) continue;%%!serialized_property_newline!%%        for (int k = 0; k < 5; k++) {%%!serialized_property_newline!%%            float age = fract(t * (0.07 + 0.02 * chim.z) + float(k) / 5.0 + hash11(chim.x));%%!serialized_property_newline!%%            vec2 c = src + vec2(age * 16.0 + sin(age * 5.0 + chim.x) * 1.5, age * 20.0 * (0.6 + 0.4 * chim.z));%%!serialized_property_newline!%%            float rad = 0.8 + age * (1.6 + 1.6 * chim.z);%%!serialized_property_newline!%%            vec2 d = p + 0.5 - c;%%!serialized_property_newline!%%            if (dot(d, d) < rad * rad) {%%!serialized_property_newline!%%                if (age > 0.55 && hash21(p + floor(t * 6.0)) < (age - 0.55) * 2.2) continue;   // dissolve%%!serialized_property_newline!%%                vec3 sc = d.y > rad * 0.25 ? hexrgb(0xf4f6f8) : hexrgb(0xb4bcc8);%%!serialized_property_newline!%%                acc = vec4(mix(sc, SW_HAZE, depth * 0.6), 1.0);%%!serialized_property_newline!%%            }%%!serialized_property_newline!%%        }%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    return acc;%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%float SW_QUAY_Y, SW_NEAR_Y, SW_FAR_Y, SW_VIA_Y, SW_HILL_Y, SW_MOUNT_Y, SW_HORIZON;%%!serialized_property_newline!%%%%!serialized_property_newline!%%// t: music time (clouds, ships, mill, smoke); tr: real time (the train keeps its timetable)%%!serialized_property_newline!%%vec3 swScene(vec2 p, float t, float tr, bool refl, Music m) {%%!serialized_property_newline!%%    vec3 col = swSky(p, SW_HORIZON, m);%%!serialized_property_newline!%%    vec4 c;%%!serialized_property_newline!%%%%!serialized_property_newline!%%    for (int k = 0; k < 3; k++) {                                      // clouds drift, wrap%%!serialized_property_newline!%%        ivec4 r = k == 0 ? R_CLOUD_A : (k == 1 ? R_CLOUD_B : R_CLOUD_C);%%!serialized_property_newline!%%        float span = PIXW + float(r.z) + 40.0;%%!serialized_property_newline!%%        float x0 = mod(float(k) * 131.0 + t * (1.2 + 0.5 * float(k)), span) - float(r.z) - 20.0;%%!serialized_property_newline!%%        float y0 = H - 46.0 - float(k) * 17.0 + float(k == 2) * 10.0;%%!serialized_property_newline!%%        c = sprite(r, 0, p - vec2(floor(x0), floor(y0)));%%!serialized_property_newline!%%        if (c.a > 0.5) col = swCloud(c.rgb);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    {                                                                  // far airship drifting left, nose first%%!serialized_property_newline!%%        float span = PIXW + 80.0;%%!serialized_property_newline!%%        float x0 = PIXW + 40.0 - mod(t * 2.2 + 60.0, span);%%!serialized_property_newline!%%        c = spriteDir(R_SHIP_SMALL, int(mod(t * 8.0, 2.0)), p - vec2(floor(x0), floor(H - 40.0 + sin(t * 0.5) * 1.0)), true);%%!serialized_property_newline!%%        if (c.a > 0.5) col = mix(swKeys(c, p, t, 0.5), SW_HAZE, 0.45);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    c = strip(R_MOUNT, p.x + 40.0, p.y - SW_MOUNT_Y);%%!serialized_property_newline!%%    if (c.a > 0.5) col = swDay(c.rgb, 0.6);%%!serialized_property_newline!%%    {                                                                  // big airship drifting right%%!serialized_property_newline!%%        float span = PIXW + 160.0;%%!serialized_property_newline!%%        float x0 = mod(t * 4.0 + 30.0, span) - 80.0;%%!serialized_property_newline!%%        float y0 = floor(H - 78.0 + sin(t * 0.7) * 1.5);%%!serialized_property_newline!%%        c = sprite(R_SHIP_BIG, int(mod(t * 10.0, 2.0)), p - vec2(floor(x0), y0));%%!serialized_property_newline!%%        if (c.a > 0.5) col = swKeys(c, p, t, 0.0);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    // two biplanes on their rounds near the airships: one high going right, one lower going left%%!serialized_property_newline!%%    for (int k = 0; k < 2; k++) {%%!serialized_property_newline!%%        bool left = k == 1;%%!serialized_property_newline!%%        float span = PIXW + 220.0;%%!serialized_property_newline!%%        float run = mod(t * (k == 0 ? 15.0 : 12.0) + float(k) * 190.0, span);%%!serialized_property_newline!%%        float x0 = left ? PIXW + 40.0 - run : run - 40.0;%%!serialized_property_newline!%%        float y0 = H - (k == 0 ? 60.0 : 96.0) + sin(t * 0.9 + float(k) * 2.0) * 3.0;%%!serialized_property_newline!%%        vec4 pl = biplane(p, vec2(x0, y0), left, tr);%%!serialized_property_newline!%%        if (pl.a > 0.0) col = mix(col, mix(pl.rgb, SW_HAZE, k == 1 ? 0.25 : 0.1), pl.a);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    c = strip(R_HILLS, p.x, p.y - SW_HILL_Y);%%!serialized_property_newline!%%    if (c.a > 0.5) col = mix(swDay(c.rgb, 0.35), hexrgb(0x6f9a6a), 0.35);     // a touch of green%%!serialized_property_newline!%%    {%%!serialized_property_newline!%%        vec2 base = vec2(MILL.x, SW_HILL_Y + MILL.y);%%!serialized_property_newline!%%        c = sprite(R_MILL, 0, p - (base + vec2(-7.0, 0.0)));%%!serialized_property_newline!%%        if (c.a > 0.5) col = mix(swKeys(c, p, t, 0.2), SW_HAZE, 0.2);%%!serialized_property_newline!%%        c = sprite(R_BLADES, int(mod(t * 5.0, 6.0)), p - (base + vec2(-15.0, 3.0)));%%!serialized_property_newline!%%        if (c.a > 0.5) col = mix(c.rgb, SW_HAZE, 0.2);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    c = strip(R_VIADUCT, p.x, p.y - SW_VIA_Y);%%!serialized_property_newline!%%    if (c.a > 0.5) col = swDay(c.rgb, 0.22);%%!serialized_property_newline!%%    {                                                                  // train on the viaduct%%!serialized_property_newline!%%        float deck = SW_VIA_Y + float(R_VIADUCT.w);%%!serialized_property_newline!%%        float period = 36.0, len = 4.0 * 22.0 + 28.0;%%!serialized_property_newline!%%        float tx = floor(mod(tr, period) / period * (PIXW + len + 120.0) - len - 60.0);%%!serialized_property_newline!%%        int wf = int(mod(floor(tx / 3.0), 2.0));%%!serialized_property_newline!%%        float lx = p.x - tx;%%!serialized_property_newline!%%        if (lx >= 0.0 && lx < 4.0 * 22.0) {%%!serialized_property_newline!%%            c = sprite(R_CAR, wf, vec2(mod(lx, 22.0), p.y - deck + 1.0));%%!serialized_property_newline!%%            if (c.a > 0.5) col = swKeys(c, p, t, 0.1);%%!serialized_property_newline!%%        } else {%%!serialized_property_newline!%%            c = sprite(R_LOCO, wf, vec2(lx - 4.0 * 22.0, p.y - deck + 1.0));%%!serialized_property_newline!%%            if (c.a > 0.5) col = swKeys(c, p, t, 0.1);%%!serialized_property_newline!%%        }%%!serialized_property_newline!%%        if (!refl) {%%!serialized_property_newline!%%            for (int k = 0; k < 6; k++) {%%!serialized_property_newline!%%                float age = fract(tr * 1.1 - float(k) / 6.0);%%!serialized_property_newline!%%                vec2 cc = vec2(tx + 4.0 * 22.0 + 20.0 - age * 26.0, deck + 17.0 + age * 10.0);%%!serialized_property_newline!%%                float rad = 1.5 + age * 4.0;%%!serialized_property_newline!%%                vec2 d = p + 0.5 - cc;%%!serialized_property_newline!%%                if (dot(d, d) < rad * rad && !(age > 0.6 && hash21(p + floor(tr * 8.0)) < (age - 0.6) * 2.5))%%!serialized_property_newline!%%                    col = d.y > rad * 0.2 ? hexrgb(0xffffff) : hexrgb(0xc8d0dc);%%!serialized_property_newline!%%            }%%!serialized_property_newline!%%        }%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    float fx = 101.0;                                                  // far town + its smoke%%!serialized_property_newline!%%    if (!refl) for (int i = 0; i < N_CHIM_FAR; i++) { c = swSmoke(p, t, CHIM_FAR[i], fx, SW_FAR_Y, 0.4); if (c.a > 0.5) col = c.rgb; }%%!serialized_property_newline!%%    c = strip(R_TOWN_FAR, p.x + fx, p.y - SW_FAR_Y);%%!serialized_property_newline!%%    if (c.a > 0.5) col = isKey(c, vec3(1.0, 0.0, 1.0)) ? swKeys(c, p + vec2(fx, 0.0), t, 0.3) : swFarTown(c.rgb);%%!serialized_property_newline!%%    float nx = 17.0;                                                   // near town + its smoke%%!serialized_property_newline!%%    c = strip(R_TOWN_NEAR, p.x + nx, p.y - SW_NEAR_Y);%%!serialized_property_newline!%%    if (c.a > 0.5) col = isKey(c, vec3(1.0, 0.0, 1.0)) ? swKeys(c, p + vec2(nx, 0.0), t, 0.05) : swNearTown(c.rgb);%%!serialized_property_newline!%%    if (!refl) for (int i = 0; i < N_CHIM_NEAR; i++) { c = swSmoke(p, t, CHIM_NEAR[i], nx, SW_NEAR_Y, 0.0); if (c.a > 0.5) col = c.rgb; }%%!serialized_property_newline!%%    c = strip(R_QUAY, p.x, p.y - SW_QUAY_Y);%%!serialized_property_newline!%%    // stone/iron stay dark - lifting them like the far layers turns the lamp posts white%%!serialized_property_newline!%%    if (c.a > 0.5) col = isKey(c, vec3(1.0, 1.0, 0.0)) ? swKeys(c, p, t, 0.0) : c.rgb * vec3(1.5, 1.55, 1.7) + vec3(0.04, 0.05, 0.07);%%!serialized_property_newline!%%    return col;%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%vec3 sweden(vec2 p, Music m) {%%!serialized_property_newline!%%    float tr = iTime;%%!serialized_property_newline!%%    float t = 0.35 * tr + 0.65 * m.drive;%%!serialized_property_newline!%%    float waterTop = 18.0;%%!serialized_property_newline!%%    SW_QUAY_Y = waterTop - 12.0;               // quay wall top sits at waterTop%%!serialized_property_newline!%%    SW_NEAR_Y = waterTop;%%!serialized_property_newline!%%    SW_FAR_Y = waterTop + 8.0;%%!serialized_property_newline!%%    SW_VIA_Y = waterTop + 12.0;%%!serialized_property_newline!%%    SW_HILL_Y = waterTop + 26.0;%%!serialized_property_newline!%%    SW_MOUNT_Y = waterTop + 34.0;%%!serialized_property_newline!%%    SW_HORIZON = waterTop + 44.0;%%!serialized_property_newline!%%%%!serialized_property_newline!%%    vec3 col;%%!serialized_property_newline!%%    if (p.y >= waterTop) {%%!serialized_property_newline!%%        col = swScene(p, t, tr, false, m);%%!serialized_property_newline!%%    } else {%%!serialized_property_newline!%%        // canal: mirrored scene, rippled, blue; more glints when the music is loud%%!serialized_property_newline!%%        float row = waterTop - p.y;%%!serialized_property_newline!%%        float ripple = floor(sin(row * 1.3 + t * 2.2) * 1.2 + sin(row * 0.5 - t * 0.9) * 1.0);%%!serialized_property_newline!%%        vec2 rp = vec2(p.x + ripple, waterTop + row - 1.0);%%!serialized_property_newline!%%        col = swScene(rp, t, tr, true, m);%%!serialized_property_newline!%%        col = mix(col * vec3(0.62, 0.78, 0.92), hexrgb(0x3a78b0), 0.30 + row * 0.012);%%!serialized_property_newline!%%        if (hash21(vec2(floor((p.x + t * 5.0) / 5.0), p.y)) > 0.94 - 0.05 * m.energy) col = mix(col, hexrgb(0xeaf6ff), 0.7);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%%%!serialized_property_newline!%%    // brass gears in the corners (meshing pairs turn in step)%%!serialized_property_newline!%%    int f = int(mod(t * 5.0, 4.0));%%!serialized_property_newline!%%    vec4 c;%%!serialized_property_newline!%%    c = sprite(R_GEAR_MID, 3 - f, p - vec2(28.0, -22.0));%%!serialized_property_newline!%%    if (c.a > 0.5) col = c.rgb;%%!serialized_property_newline!%%    c = sprite(R_GEAR_BIG, f, p - vec2(-38.0, -16.0));%%!serialized_property_newline!%%    if (c.a > 0.5) col = c.rgb;%%!serialized_property_newline!%%    c = sprite(R_GEAR_SMALL, f, p - vec2(PIXW - 46.0, -12.0));%%!serialized_property_newline!%%    if (c.a > 0.5) col = c.rgb;%%!serialized_property_newline!%%    c = sprite(R_GEAR_BIG, 3 - f, p - vec2(PIXW - 30.0, -6.0));%%!serialized_property_newline!%%    if (c.a > 0.5) col = c.rgb;%%!serialized_property_newline!%%%%!serialized_property_newline!%%    // birds gliding across (two-frame wing flap); more of them as the song builds%%!serialized_property_newline!%%    int birds = 3 + int(5.0 * m.tension);%%!serialized_property_newline!%%    for (int k = 0; k < 8; k++) {%%!serialized_property_newline!%%        if (k >= birds) break;%%!serialized_property_newline!%%        float fk = float(k);%%!serialized_property_newline!%%        float span = PIXW + 60.0;%%!serialized_property_newline!%%        float bx = floor(mod(t * (7.0 + 3.0 * hash11(fk)) + hash11(fk * 5.3) * span, span) - 30.0);%%!serialized_property_newline!%%        float by = floor(H - 70.0 - hash11(fk * 2.1) * 40.0 + sin(t * 0.8 + fk) * 2.0);%%!serialized_property_newline!%%        vec2 d = p - vec2(bx, by);%%!serialized_property_newline!%%        bool up = fract(t * 3.0 + fk * 0.37) < 0.5;%%!serialized_property_newline!%%        if ((d.y == 0.0 && abs(d.x) <= 1.0) || (abs(d.x) == 2.0 && d.y == (up ? 1.0 : -1.0)))%%!serialized_property_newline!%%            col = hexrgb(0x2e3a4a);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    // golden light as the song swells%%!serialized_property_newline!%%    col = mix(col, col * vec3(1.08, 1.0, 0.86) + vec3(0.03, 0.02, 0.0), 0.6 * smoothstep(0.55, 1.0, m.tension));%%!serialized_property_newline!%%    return col;%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%%%!serialized_property_newline!%%// ------------------------------------------------------------------ loading screens: "Zeta rises" (time-lapse)%%!serialized_property_newline!%%// The canal town from the Sweden scene being built, while days and seasons race by: the quay and canal%%!serialized_property_newline!%%// first, the viaduct arch by arch, houses rising out of their scaffolding (cranes on the busy plots),%%!serialized_property_newline!%%// the windmill, then the train, airships and biplanes. A day lasts TL_DAY seconds (sun, moon, stars,%%!serialized_property_newline!%%// lit windows and lamps at night), a season TL_SEASON (spring blossom, summer, autumn leaves, winter%%!serialized_property_newline!%%// snow on the roofs and a frozen canal).%%!serialized_property_newline!%%// The clock E (seconds) runs on across the loading screens of one load: since the last menu was on%%!serialized_property_newline!%%// screen (Tickers keep toz_menu_h/m/s at the current time while a menu shows), or - in the resource%%!serialized_property_newline!%%// loading overlay, built with TL_UPTIME - since the game started, continuing the early window's APNG.%%!serialized_property_newline!%%%%!serialized_property_newline!%%#define TL_DAY 10.0%%!serialized_property_newline!%%#define TL_SEASON 30.0%%!serialized_property_newline!%%#define TL_BUILD 62.0%%!serialized_property_newline!%%#define TL_DAYLIGHT 0.6%%!serialized_property_newline!%%%%!serialized_property_newline!%%uniform int fmVarInt_toz_menu_h;%%!serialized_property_newline!%%uniform int fmVarInt_toz_menu_m;%%!serialized_property_newline!%%uniform int fmVarInt_toz_menu_s;%%!serialized_property_newline!%%uniform float fmVarFloat_toz_uptime_ms;%%!serialized_property_newline!%%%%!serialized_property_newline!%%float tlClock() {%%!serialized_property_newline!%%#ifdef TL_UPTIME%%!serialized_property_newline!%%    if (fmVarFloat_toz_uptime_ms > 0.0) return fmVarFloat_toz_uptime_ms / 1000.0;%%!serialized_property_newline!%%    return iTime;%%!serialized_property_newline!%%#else%%!serialized_property_newline!%%    float now = float(fmTimeParts.x * 3600 + fmTimeParts.y * 60 + fmTimeParts.z) + float(fmTimeParts.w) / 1000.0;%%!serialized_property_newline!%%    float start = float(fmVarInt_toz_menu_h * 3600 + fmVarInt_toz_menu_m * 60 + fmVarInt_toz_menu_s);%%!serialized_property_newline!%%    if (start <= 0.0) return iTime;%%!serialized_property_newline!%%    return mod(now - start + 86400.0, 86400.0);%%!serialized_property_newline!%%#endif%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%// season weights: spring, summer, autumn, winter (smooth hand-over between neighbours)%%!serialized_property_newline!%%vec4 tlSeasons(float E) {%%!serialized_property_newline!%%    float s = mod(E / TL_SEASON + 0.3, 4.0);                            // the load starts in early spring%%!serialized_property_newline!%%    vec4 w = vec4(0.0);%%!serialized_property_newline!%%    for (int i = 0; i < 4; i++) {%%!serialized_property_newline!%%        float d = abs(s - float(i) - 0.5);%%!serialized_property_newline!%%        d = min(d, 4.0 - d);%%!serialized_property_newline!%%        w[i] = clamp(1.0 - (d - 0.35) / 0.3, 0.0, 1.0);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    return w / max(0.001, w.x + w.y + w.z + w.w);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%// how far a plot is built (0..1): plots of `cw` px start between t0 and t0 + span and take `dur` seconds%%!serialized_property_newline!%%float tlProgress(float x, float cw, float E, float t0, float span, float dur, float seed) {%%!serialized_property_newline!%%    float start = t0 + hash11(floor(x / cw) * 1.7 + seed) * span;%%!serialized_property_newline!%%    return clamp((E - start) / dur, 0.0, 1.0);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%const vec3 TL_WOOD = vec3(0.62, 0.46, 0.30);%%!serialized_property_newline!%%const vec3 TL_WOOD_D = vec3(0.42, 0.30, 0.20);%%!serialized_property_newline!%%%%!serialized_property_newline!%%// a strip pixel under construction: finished rows from the bottom, scaffolding where the rest will be%%!serialized_property_newline!%%vec4 tlBuild(vec4 c, float x, float ly, float h, float pr) {%%!serialized_property_newline!%%    if (c.a < 0.5 || ly < floor(pr * h)) return c;%%!serialized_property_newline!%%    if (pr <= 0.0) return vec4(0.0);%%!serialized_property_newline!%%    if (mod(x, 4.0) == 0.0) return vec4(TL_WOOD_D, 1.0);%%!serialized_property_newline!%%    if (mod(ly, 4.0) == 0.0) return vec4(TL_WOOD, 1.0);%%!serialized_property_newline!%%    return vec4(0.0);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%// snow on whatever has open sky directly above it%%!serialized_property_newline!%%bool tlSnowTop(ivec4 r, float x, float ly) { return strip(r, x, ly + 1.0).a < 0.5; }%%!serialized_property_newline!%%%%!serialized_property_newline!%%vec3 tlSky(vec2 p, float horizon, float sunH, float dayPh, float t) {%%!serialized_property_newline!%%    float h = clamp((p.y - horizon) / max(H - horizon, 1.0), 0.0, 1.0);%%!serialized_property_newline!%%    vec3 day = bands(hexrgb(0xdcf0f8), hexrgb(0xa8d6f0), hexrgb(0x6aaddf), hexrgb(0x3b78ba), h, p);%%!serialized_property_newline!%%    vec3 twi = bands(hexrgb(0xffc08a), hexrgb(0xe08a8a), hexrgb(0x7a5a9a), hexrgb(0x2a2a62), h, p);%%!serialized_property_newline!%%    vec3 night = bands(hexrgb(0x2a3460), hexrgb(0x1c2448), hexrgb(0x121838), hexrgb(0x080c20), h, p);%%!serialized_property_newline!%%    vec3 col = sunH > 0.15 ? day : (sunH > -0.15 ? dmix(night, twi, (sunH + 0.15) / 0.3 * 1.4, p) : night);%%!serialized_property_newline!%%    if (sunH > 0.0 && sunH < 0.3) col = dmix(day, twi, 1.0 - sunH / 0.3, p);%%!serialized_property_newline!%%    // stars at night%%!serialized_property_newline!%%    vec2 cell = floor(p / 5.0);%%!serialized_property_newline!%%    if (sunH < -0.05 && hash21(cell + 3.0) < 0.3 && p == cell * 5.0 + floor(hash22(cell) * 4.0) && h > 0.15)%%!serialized_property_newline!%%        col = mix(col, vec3(1.0), clamp(-sunH * 3.0, 0.0, 0.8) * (0.6 + 0.4 * sin(t * 3.0 + hash21(cell) * 40.0)));%%!serialized_property_newline!%%    // the sun by day (60 % of it), the moon by night, crossing the sky%%!serialized_property_newline!%%    float ph = fract(dayPh);%%!serialized_property_newline!%%    float arc = ph < TL_DAYLIGHT ? ph / TL_DAYLIGHT : (ph - TL_DAYLIGHT) / (1.0 - TL_DAYLIGHT);%%!serialized_property_newline!%%    vec2 sc = vec2(mix(-14.0, PIXW + 14.0, arc), horizon - 6.0 + (H - horizon) * 0.85 * sin(arc * PI));%%!serialized_property_newline!%%    float r = length(p + 0.5 - sc);%%!serialized_property_newline!%%    if (ph < TL_DAYLIGHT) {                                             // sun%%!serialized_property_newline!%%        if (r < 8.0) col = r < 6.5 ? hexrgb(0xfffbe8) : hexrgb(0xfff0b0);%%!serialized_property_newline!%%        else if (r < 14.0 && mod(p.x + p.y, 2.0) < 1.0) col = mix(col, hexrgb(0xfff8d8), 0.4);%%!serialized_property_newline!%%    } else {                                                            // moon%%!serialized_property_newline!%%        if (r < 6.0) col = length(p + 0.5 - sc - vec2(2.0, 1.0)) < 5.0 ? hexrgb(0xf4ecd0) : col;%%!serialized_property_newline!%%        if (r < 6.0 && length(p + 0.5 - sc - vec2(-1.0, -1.0)) < 1.5) col = hexrgb(0xd8cfb0);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    return col;%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%float TL_QUAY_Y, TL_NEAR_Y, TL_FAR_Y, TL_VIA_Y, TL_HILL_Y, TL_MOUNT_Y, TL_HORIZON;%%!serialized_property_newline!%%bool TL_GROUND;                       // tlScene drew something over the sky here (gets the day/night light)%%!serialized_property_newline!%%%%!serialized_property_newline!%%// the whole town at time E (daylight colours; night and seasons are graded in by the caller)%%!serialized_property_newline!%%vec3 tlScene(vec2 p, float E, float t, vec4 se, float sunH, float dayPh, bool refl, out float glow) {%%!serialized_property_newline!%%    glow = 0.0;%%!serialized_property_newline!%%    vec3 sky = tlSky(p, TL_HORIZON, sunH, dayPh, t);%%!serialized_property_newline!%%    vec3 col = sky;%%!serialized_property_newline!%%    vec4 c;%%!serialized_property_newline!%%    float winter = se.w, autumn = se.z, spring = se.x;%%!serialized_property_newline!%%%%!serialized_property_newline!%%    for (int k = 0; k < 3; k++) {                                       // clouds, greyer in winter%%!serialized_property_newline!%%        ivec4 r = k == 0 ? R_CLOUD_A : (k == 1 ? R_CLOUD_B : R_CLOUD_C);%%!serialized_property_newline!%%        float span = PIXW + float(r.z) + 40.0;%%!serialized_property_newline!%%        float x0 = mod(float(k) * 131.0 + E * (3.0 + 1.2 * float(k)), span) - float(r.z) - 20.0;%%!serialized_property_newline!%%        float y0 = H - 46.0 - float(k) * 17.0 + float(k == 2) * 10.0;%%!serialized_property_newline!%%        c = sprite(r, 0, p - vec2(floor(x0), floor(y0)));%%!serialized_property_newline!%%        if (c.a > 0.5) col = mix(swCloud(c.rgb), vec3(0.78, 0.8, 0.84) * (0.9 + 0.1 * luma(c.rgb)), winter * 0.6);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    if (E > 44.0) {                                                     // the airships arrive once the town stands%%!serialized_property_newline!%%        float span = PIXW + 160.0;%%!serialized_property_newline!%%        float x0 = mod((E - 44.0) * 6.0 - 80.0, span) - 80.0;%%!serialized_property_newline!%%        c = sprite(R_SHIP_BIG, int(mod(t * 10.0, 2.0)), p - vec2(floor(x0), floor(H - 78.0 + sin(t * 0.7) * 1.5)));%%!serialized_property_newline!%%        if (c.a > 0.5) { col = swKeys(c, p, t, 0.0); if (isKey(c, vec3(1.0, 0.0, 1.0)) && sunH < 0.0) glow = 1.0; }%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    if (E > 54.0) {%%!serialized_property_newline!%%        float run = mod((E - 54.0) * 22.0, PIXW + 220.0);%%!serialized_property_newline!%%        vec4 pl = biplane(p, vec2(PIXW + 40.0 - run, H - 62.0 + sin(t) * 2.0), true, t);%%!serialized_property_newline!%%        if (pl.a > 0.0) col = mix(col, pl.rgb, pl.a);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    // mountains, snow line coming down in winter%%!serialized_property_newline!%%    c = strip(R_MOUNT, p.x + 40.0, p.y - TL_MOUNT_Y);%%!serialized_property_newline!%%    if (c.a > 0.5) {%%!serialized_property_newline!%%        col = swDay(c.rgb, 0.6);%%!serialized_property_newline!%%        if (p.y - TL_MOUNT_Y > float(R_MOUNT.w) * (0.75 - 0.4 * winter) && hash21(p) < 0.85) col = mix(col, vec3(0.95, 0.97, 1.0), 0.8);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    // hills: green, blossom, gold, snow%%!serialized_property_newline!%%    c = strip(R_HILLS, p.x, p.y - TL_HILL_Y);%%!serialized_property_newline!%%    if (c.a > 0.5) {%%!serialized_property_newline!%%        float l = luma(c.rgb);%%!serialized_property_newline!%%        vec3 spr = mix(hexrgb(0x5e9a52), hexrgb(0x8ac46a), l * 3.0), sum = mix(hexrgb(0x3e7a3a), hexrgb(0x6aa04a), l * 3.0);%%!serialized_property_newline!%%        vec3 aut = mix(hexrgb(0xa8502a), hexrgb(0xe0a040), l * 3.0), win = mix(hexrgb(0xb8c8dc), hexrgb(0xf4f8fc), l * 3.0);%%!serialized_property_newline!%%        col = spr * spring + sum * se.y + aut * autumn + win * winter;%%!serialized_property_newline!%%        if (hash21(p + 7.0) < 0.06 * spring) col = hash21(p) < 0.5 ? hexrgb(0xffd0e0) : vec3(1.0);   // blossom%%!serialized_property_newline!%%        if (tlSnowTop(R_HILLS, p.x, p.y - TL_HILL_Y)) col = mix(col, vec3(1.0), winter);%%!serialized_property_newline!%%        col = mix(col, SW_HAZE, 0.25);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    {                                                                   // the windmill: built, then turning%%!serialized_property_newline!%%        vec2 base = vec2(MILL.x, TL_HILL_Y + MILL.y);%%!serialized_property_newline!%%        float pr = clamp((E - 10.0) / 6.0, 0.0, 1.0);%%!serialized_property_newline!%%        c = sprite(R_MILL, 0, p - (base + vec2(-7.0, 0.0)));%%!serialized_property_newline!%%        c = tlBuild(c, p.x, p.y - base.y, float(R_MILL.w), pr);%%!serialized_property_newline!%%        if (c.a > 0.5) col = mix(c.rgb == TL_WOOD || c.rgb == TL_WOOD_D ? c.rgb : swKeys(c, p, t, 0.2), SW_HAZE, 0.2);%%!serialized_property_newline!%%        if (pr >= 1.0) {%%!serialized_property_newline!%%            c = sprite(R_BLADES, int(mod(E * 3.0, 6.0)), p - (base + vec2(-15.0, 3.0)));%%!serialized_property_newline!%%            if (c.a > 0.5) col = mix(c.rgb, SW_HAZE, 0.2);%%!serialized_property_newline!%%        }%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    // the viaduct, arch by arch from the left, then the train%%!serialized_property_newline!%%    {%%!serialized_property_newline!%%        float front = (E - 4.0) / 18.0 * (PIXW + 20.0);%%!serialized_property_newline!%%        c = strip(R_VIADUCT, p.x, p.y - TL_VIA_Y);%%!serialized_property_newline!%%        if (c.a > 0.5) {%%!serialized_property_newline!%%            if (p.x < front) col = swDay(c.rgb, 0.22);%%!serialized_property_newline!%%            else if (p.x < front + 14.0 && (mod(p.x, 4.0) == 0.0 || mod(p.y, 4.0) == 0.0)) col = TL_WOOD;%%!serialized_property_newline!%%        }%%!serialized_property_newline!%%        if (E > 24.0) {%%!serialized_property_newline!%%            float deck = TL_VIA_Y + float(R_VIADUCT.w);%%!serialized_property_newline!%%            float period = 14.0, len = 4.0 * 22.0 + 28.0;%%!serialized_property_newline!%%            float tx = floor(mod(E - 24.0, period) / period * (PIXW + len + 120.0) - len - 60.0);%%!serialized_property_newline!%%            int wf = int(mod(floor(tx / 3.0), 2.0));%%!serialized_property_newline!%%            float lx = p.x - tx;%%!serialized_property_newline!%%            c = lx >= 0.0 && lx < 4.0 * 22.0 ? sprite(R_CAR, wf, vec2(mod(lx, 22.0), p.y - deck + 1.0))%%!serialized_property_newline!%%                                             : sprite(R_LOCO, wf, vec2(lx - 4.0 * 22.0, p.y - deck + 1.0));%%!serialized_property_newline!%%            if (c.a > 0.5) { col = swKeys(c, p, t, 0.1); if (isKey(c, vec3(1.0, 0.0, 1.0)) && sunH < 0.0) glow = 1.0; }%%!serialized_property_newline!%%        }%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    // far town, then near town, plot by plot out of their scaffolding; snow on the roofs in winter%%!serialized_property_newline!%%    for (int layer = 0; layer < 2; layer++) {%%!serialized_property_newline!%%        bool near = layer == 1;%%!serialized_property_newline!%%        ivec4 r = near ? R_TOWN_NEAR : R_TOWN_FAR;%%!serialized_property_newline!%%        float off = near ? 17.0 : 101.0, base = near ? TL_NEAR_Y : TL_FAR_Y;%%!serialized_property_newline!%%        float x = p.x + off, ly = p.y - base;%%!serialized_property_newline!%%        float pr = near ? tlProgress(x, 12.0, E, 6.0, 38.0, 8.0, 1.0) : tlProgress(x, 12.0, E, 14.0, 36.0, 8.0, 5.0);%%!serialized_property_newline!%%        c = strip(r, x, ly);%%!serialized_property_newline!%%        vec4 b = tlBuild(c, x, ly, float(r.w), pr);%%!serialized_property_newline!%%        if (b.a > 0.5) {%%!serialized_property_newline!%%            if (b.rgb == TL_WOOD || b.rgb == TL_WOOD_D) col = mix(b.rgb, SW_HAZE, near ? 0.0 : 0.3);%%!serialized_property_newline!%%            else {%%!serialized_property_newline!%%                col = isKey(c, vec3(1.0, 0.0, 1.0)) ? swKeys(c, vec2(x, p.y), t, near ? 0.05 : 0.3) : (near ? swNearTown(c.rgb) : swFarTown(c.rgb));%%!serialized_property_newline!%%                if (isKey(c, vec3(1.0, 0.0, 1.0)) && sunH < 0.05 && hash21(floor(vec2(x, p.y) / vec2(2.0, 3.0)) + floor(E / TL_DAY)) < 0.7) glow = 1.0;%%!serialized_property_newline!%%                if (winter > 0.05 && tlSnowTop(r, x, ly) && !isKey(c, vec3(1.0, 0.0, 1.0))) col = mix(col, vec3(0.97, 0.98, 1.0), winter);%%!serialized_property_newline!%%            }%%!serialized_property_newline!%%        }%%!serialized_property_newline!%%        // a crane on every plot that is going up (near town)%%!serialized_property_newline!%%        if (near && pr > 0.0 && pr < 1.0) {%%!serialized_property_newline!%%            float cx = floor(x / 12.0) * 12.0 + 6.0 - off;%%!serialized_property_newline!%%            float top = base + float(r.w) + 8.0;%%!serialized_property_newline!%%            bool mast = abs(p.x - cx) < 0.6 && p.y >= base && p.y < top;%%!serialized_property_newline!%%            bool jib = p.y == top && p.x > cx - 4.0 && p.x < cx + 9.0;%%!serialized_property_newline!%%            float hook = cx + 3.0 + floor(4.0 * (0.5 + 0.5 * sin(E * 2.0 + cx)));%%!serialized_property_newline!%%            bool rope = abs(p.x - hook) < 0.6 && p.y < top && p.y > top - 6.0 - floor(3.0 * sin(E * 3.0 + cx));%%!serialized_property_newline!%%            if (mast || jib || rope) col = rope ? hexrgb(0x3a3046) : TL_WOOD_D;%%!serialized_property_newline!%%        }%%!serialized_property_newline!%%        // smoke from the chimneys of finished houses, more of it in the cold%%!serialized_property_newline!%%        if (!refl) for (int i = 0; i < 6; i++) {%%!serialized_property_newline!%%            if (near ? i >= N_CHIM_NEAR : i >= N_CHIM_FAR) break;%%!serialized_property_newline!%%            vec3 ch = near ? CHIM_NEAR[i] : CHIM_FAR[i];%%!serialized_property_newline!%%            if (tlProgress(ch.x, 12.0, E, near ? 6.0 : 14.0, near ? 38.0 : 36.0, 8.0, near ? 1.0 : 5.0) < 1.0) continue;%%!serialized_property_newline!%%            vec4 sm = swSmoke(p, E * (0.5 + 0.7 * winter), ch, off, base, near ? 0.0 : 0.4);%%!serialized_property_newline!%%            if (sm.a > 0.5) col = sm.rgb;%%!serialized_property_newline!%%        }%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    // the quay with its gas lamps (lit at night)%%!serialized_property_newline!%%    c = strip(R_QUAY, p.x, p.y - TL_QUAY_Y);%%!serialized_property_newline!%%    if (c.a > 0.5) {%%!serialized_property_newline!%%        col = isKey(c, vec3(1.0, 1.0, 0.0)) ? (sunH < 0.05 ? hexrgb(0xffe08a) : hexrgb(0x8a96a6)) : c.rgb * vec3(1.5, 1.55, 1.7) + vec3(0.04, 0.05, 0.07);%%!serialized_property_newline!%%        if (isKey(c, vec3(1.0, 1.0, 0.0)) && sunH < 0.05) glow = 1.0;%%!serialized_property_newline!%%        if (winter > 0.05 && tlSnowTop(R_QUAY, p.x, p.y - TL_QUAY_Y)) col = mix(col, vec3(0.97, 0.98, 1.0), winter);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    TL_GROUND = any(notEqual(col, sky));%%!serialized_property_newline!%%    return col;%%!serialized_property_newline!%%}%%!serialized_property_newline!%%%%!serialized_property_newline!%%void mainImage(out vec4 fragColor, in vec2 fragCoord) {%%!serialized_property_newline!%%    ATLAS_SIZE = textureSize(iChannel0, 0);%%!serialized_property_newline!%%    vec4 m0 = texelFetch(iChannel0, ivec2(0, 0), 0);%%!serialized_property_newline!%%    TOP_FIRST = m0.r > 0.5 && m0.g < 0.5;%%!serialized_property_newline!%%    if (ATLAS_SIZE.x < 8) { fragColor = vec4(0.10, 0.08, 0.16, 1.0); return; }%%!serialized_property_newline!%%    float scale = iResolution.x / PIXW;%%!serialized_property_newline!%%    H = floor(iResolution.y / scale);%%!serialized_property_newline!%%    vec2 p = floor(fragCoord / scale);%%!serialized_property_newline!%%    float t = iTime;%%!serialized_property_newline!%%    float E = tlClock();%%!serialized_property_newline!%%    vec4 se = tlSeasons(E);%%!serialized_property_newline!%%    float dayPh = E / TL_DAY + 0.15;                                    // starts in the morning%%!serialized_property_newline!%%    float f = fract(dayPh);%%!serialized_property_newline!%%    float sunH = f < TL_DAYLIGHT ? sin(f / TL_DAYLIGHT * PI) : -sin((f - TL_DAYLIGHT) / (1.0 - TL_DAYLIGHT) * PI);   // > 0 by day%%!serialized_property_newline!%%%%!serialized_property_newline!%%    float waterTop = 18.0;%%!serialized_property_newline!%%    TL_QUAY_Y = waterTop - 12.0; TL_NEAR_Y = waterTop; TL_FAR_Y = waterTop + 8.0; TL_VIA_Y = waterTop + 12.0;%%!serialized_property_newline!%%    TL_HILL_Y = waterTop + 26.0; TL_MOUNT_Y = waterTop + 34.0; TL_HORIZON = waterTop + 44.0;%%!serialized_property_newline!%%%%!serialized_property_newline!%%    float glow;%%!serialized_property_newline!%%    vec3 col;%%!serialized_property_newline!%%    if (p.y >= waterTop) {%%!serialized_property_newline!%%        col = tlScene(p, E, t, se, sunH, dayPh, false, glow);%%!serialized_property_newline!%%    } else {                                                            // canal: mirrored, rippled - frozen in winter%%!serialized_property_newline!%%        float row = waterTop - p.y;%%!serialized_property_newline!%%        float ripple = floor(sin(row * 1.3 + t * 2.2) * 1.2 * (1.0 - se.w) + sin(row * 0.5 - t * 0.9) * 1.0 * (1.0 - se.w));%%!serialized_property_newline!%%        col = tlScene(vec2(p.x + ripple, waterTop + row - 1.0), E, t, se, sunH, dayPh, true, glow);%%!serialized_property_newline!%%        col = mix(col * vec3(0.62, 0.78, 0.92), hexrgb(0x3a78b0), 0.30 + row * 0.012);%%!serialized_property_newline!%%        vec3 ice = mix(hexrgb(0xc8dcec), hexrgb(0xe8f2fa), step(0.5, hash21(floor(p / vec2(9.0, 2.0)))));%%!serialized_property_newline!%%        if (hash21(floor(p / vec2(13.0, 1.0))) > 0.93) ice = hexrgb(0xa8c0d8);                      // cracks%%!serialized_property_newline!%%        col = mix(col, ice, se.w);%%!serialized_property_newline!%%        if (se.w < 0.5 && hash21(vec2(floor((p.x + t * 5.0) / 5.0), p.y)) > 0.94) col = mix(col, hexrgb(0xeaf6ff), 0.6 * max(sunH, 0.0));%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    // day light: full by day, warm at the edges of the day, blue at night - lights stay bright%%!serialized_property_newline!%%    float day = smoothstep(-0.2, 0.25, sunH);%%!serialized_property_newline!%%    vec3 tint = mix(vec3(0.30, 0.36, 0.58), vec3(1.0), day);%%!serialized_property_newline!%%    if (sunH > -0.2 && sunH < 0.25) tint *= mix(vec3(1.0), vec3(1.1, 0.9, 0.78), 1.0 - abs(sunH - 0.02) / 0.23);%%!serialized_property_newline!%%    col = glow > 0.5 ? mix(hexrgb(0xffd27a), hexrgb(0xfff0b8), hash21(p) * 0.5) : (TL_GROUND || p.y < waterTop ? col * tint : col);%%!serialized_property_newline!%%    // petals in spring, leaves in autumn, snow in winter, fireflies on summer nights%%!serialized_property_newline!%%    vec2 fall = vec2(p.x + t * (8.0 + 6.0 * se.z), p.y + t * mix(10.0, 26.0, se.w));%%!serialized_property_newline!%%    vec2 fc = floor(fall / vec2(7.0, 9.0));%%!serialized_property_newline!%%    float fh = hash21(fc);%%!serialized_property_newline!%%    if (fall == floor(fc * vec2(7.0, 9.0) + floor(hash22(fc) * vec2(6.0, 8.0)))) {%%!serialized_property_newline!%%        if (fh < 0.35 * se.w) col = vec3(0.96, 0.97, 1.0);%%!serialized_property_newline!%%        else if (fh < 0.08 * se.x) col = hexrgb(0xffc8dc);%%!serialized_property_newline!%%        else if (fh < 0.10 * se.z) col = fh < 0.05 ? hexrgb(0xd8702a) : hexrgb(0xe8b040);%%!serialized_property_newline!%%    }%%!serialized_property_newline!%%    if (se.y > 0.3 && sunH < -0.1 && hash21(floor(p / 3.0) + floor(t * 2.0)) > 0.997 && p.y < 60.0) col = hexrgb(0xd8ff7a);%%!serialized_property_newline!%%    fragColor = vec4(col, 1.0);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%
  ichannel_0_source = [source:local]/config/fancymenu/assets/toz/atlas.png
  image_ichannel0_input = resource0
  compile_mode = auto
  force_shadertoy_compatibility = true
  freeze_time = false
  time_scale = 1.0
  enable_blending = false
  use_input = false
  mouse_position_requires_hold = false
  opacity_multiplier = 1.0
  show_compile_errors = true
}

element {
  element_type = glsl
  instance_identifier = ba7306a4-f95c-4f74-8e43-1df121bb3144-toz
  appearance_delay = no_delay
  disappearance_delay = no_delay
  fade_in_v2 = no_fading
  fade_out = no_fading
  auto_sizing = false
  sticky_anchor = false
  anchor_point = top-centered
  x = -32
  y = 16
  width = 64
  height = 48
  stay_on_screen = false
  element_loading_requirement_container_identifier = edffcf0b-7a8e-472b-91ac-e1677018b5f1-toz
  [loading_requirement_container_meta:edffcf0b-7a8e-472b-91ac-e1677018b5f1-toz] = [groups:][instances:]
  enable_parallax = false
  load_once_per_session = false
  advanced_posx = -2147483648
  advanced_posy = -2147483648
  advanced_width = -2147483648
  advanced_height = -2147483648
  stretch_x = false
  stretch_y = false
  base_opacity = 1.0
  rotation_degrees = 0.0
  should_be_affected_by_decoration_overlays = false
  inline_shader_source = const ivec4 R_GEAR_BIG = ivec4(0, 262, 70, 70); // 4 frame(s)%%!serialized_property_newline!%%const ivec4 R_GEAR_MID = ivec4(0, 333, 46, 46); // 4 frame(s)%%!serialized_property_newline!%%const ivec4 R_GEAR_SMALL = ivec4(185, 333, 34, 34); // 4 frame(s)%%!serialized_property_newline!%%// Teachings of Zeta - spinning loading gear (frames from atlas.png)%%!serialized_property_newline!%%ivec4 regionOf(int which) {%%!serialized_property_newline!%%    // filled in from the title scenes' atlas constants at generation time%%!serialized_property_newline!%%    return which == 0 ? R_GEAR_MID : R_GEAR_SMALL;%%!serialized_property_newline!%%}%%!serialized_property_newline!%%vec4 texel2(ivec2 p) {%%!serialized_property_newline!%%    ivec2 s = textureSize(iChannel0, 0);%%!serialized_property_newline!%%    vec4 m = texelFetch(iChannel0, ivec2(0, 0), 0);%%!serialized_property_newline!%%    bool top = m.r > 0.5 && m.g < 0.5;%%!serialized_property_newline!%%    return texelFetch(iChannel0, ivec2(p.x, top ? p.y : s.y - 1 - p.y), 0);%%!serialized_property_newline!%%}%%!serialized_property_newline!%%vec4 spr(ivec4 r, int f, vec2 l) {%%!serialized_property_newline!%%    if (l.x < 0.0 || l.y < 0.0 || l.x >= float(r.z) || l.y >= float(r.w)) return vec4(0.0);%%!serialized_property_newline!%%    return texel2(ivec2(r.x + f * r.z + int(l.x), r.y + r.w - 1 - int(l.y)));%%!serialized_property_newline!%%}%%!serialized_property_newline!%%void mainImage(out vec4 fragColor, in vec2 fragCoord) {%%!serialized_property_newline!%%    ivec4 big = regionOf(0), small = regionOf(1);%%!serialized_property_newline!%%    float px = floor(min(iResolution.x / 64.0, iResolution.y / 48.0));%%!serialized_property_newline!%%    px = max(px, 1.0);%%!serialized_property_newline!%%    vec2 p = floor(fragCoord / px);%%!serialized_property_newline!%%    int f = int(mod(iTime * 8.0, 4.0));%%!serialized_property_newline!%%    vec4 c = spr(small, 3 - f, p - vec2(36.0, 2.0));%%!serialized_property_newline!%%    vec4 b = spr(big, f, p - vec2(2.0, 4.0));%%!serialized_property_newline!%%    fragColor = b.a > 0.5 ? b : c;%%!serialized_property_newline!%%}%%!serialized_property_newline!%%
  image_ichannel0_input = resource0
  ichannel_0_source = [source:local]/config/fancymenu/assets/toz/atlas.png
  compile_mode = auto
  force_shadertoy_compatibility = true
  enable_blending = true
  use_input = false
  time_scale = 1.0
  show_compile_errors = true
  opacity_multiplier = 1.0
}
