diff --git a/.gitignore b/.gitignore index 73ada70..3ef2023 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,5 @@ forge-* confdeps.* conftest.* forge_saved_state.txt -*.py \ No newline at end of file +*.py +error.glsl \ No newline at end of file diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index eead825..f739abc 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -85,7 +85,7 @@ make -f Makefile.dev release-arch - [x] Clean code and fix things - [x] Share openGL state between monitor and screen - [ ] Default project - - [ ] split with includes + - [x] split with includes - [ ] src 9: game of life - [ ] src 10 : ? - [ ] src 11 : ? @@ -94,7 +94,8 @@ make -f Makefile.dev release-arch - [ ] src 15 : debug -> calibration screen - [ ] fx 11 : colorize range (pretty color ranges) - [ ] fx 12 : spill - - [ ] frag 10 : move debug screen here + add src/fx/A/B indicators + - [x] frag 10 : move debug screen here + - [ ] debug : add src/fx/A/B indicators - [ ] Other - [x] `forge_project.cfg` - [x] Define frag prefix in config @@ -103,6 +104,7 @@ make -f Makefile.dev release-arch - [x] Pass "heavy" struct as pointer to avoid stack overload - [x] Clean and sort args - [x] `--auto-random` / `--no-auto-random` + - [x] Dump failed compilation into tmp file - [ ] Update readme with usage documentation - [x] Documentation in default config file - [x] Clone "shaders" and config in system path at setup diff --git a/default/frag0.glsl b/default/frag0.glsl deleted file mode 100644 index 802b570..0000000 --- a/default/frag0.glsl +++ /dev/null @@ -1,1830 +0,0 @@ -#version 460 - -// COMMON DEFINITIONS AND FUNCTIONS -// ================================ - -// 1. real time uniforms -// --------------------- - -uniform float iTime; -uniform float iTempo; -uniform float iBeats; -uniform int iFPS; -uniform vec2 iResolution; -uniform vec2 iTexResolution; -uniform vec2 iInputResolution1; -uniform vec2 iInputResolution2; -uniform int iInputFormat1; -uniform int iInputFormat2; -uniform int iDemo; -uniform int iAutoRand; -uniform int iPage; -uniform int iSelected; - -uniform int iSeed1; -uniform int iSeed2; -uniform int iSeed3; -uniform int iSeed4; -uniform int iSeed5; -uniform int iSeed6; -uniform int iSeed7; -uniform int iSeed8; - -uniform int iState3; -uniform int iState4; -uniform int iState5; -uniform int iState6; -uniform int iState8; - -uniform int iActive1; -uniform int iActive2; - -uniform vec3 iMidi2_1[7]; -uniform vec3 iMidi2_2[7]; -uniform vec3 iMidi2_3[7]; -uniform vec3 iMidi3_1[2]; - -// 2. textures -// --------------- - -uniform sampler2D iTex0; -uniform sampler2D iTex1; -uniform sampler2D iTex2; -uniform sampler2D iTex3; -uniform sampler2D iTex4; -uniform sampler2D iTex5; -uniform sampler2D iTex6; -uniform sampler2D iTex7; -uniform sampler2D iTex8; -uniform sampler2D iTex9; - -// 3. definitions -// -------------- - -const float PI = 3.1415927; -const int YUYV_FOURCC = 1448695129; - -// 4. functions -// ------------ - -// BASICS - -float ease(float x) { - return 0.5 - cos(max(min(x, 1.0), 0.0)*PI) * 0.5; -} - -vec2 ease(vec2 x) { - return 0.5 - cos(max(min(x, 1.0), 0.0)*PI) * 0.5; -} - -vec3 ease(vec3 x) { - return 0.5 - cos(max(min(x, 1.0), 0.0)*PI) * 0.5; -} - -float saw(float x){ - return abs(mod(x+1,2)-1); -} - -vec2 saw(vec2 x){ - return abs(mod(x+1,2)-1); -} - -vec3 saw(vec3 x){ - return abs(mod(x+1,2)-1); -} - -float cmod(float x, float k){ - return mod(x + k * 0.5, k) - k * 0.5; -} - -vec2 cmod(vec2 x, float k){ - return mod(x + k * 0.5, k) - k * 0.5; -} - -vec3 cmod(vec3 x, float k){ - return mod(x + k * 0.5, k) - k * 0.5; -} - -// RANDOM - -float rand(float seed){ - float v=pow(abs(seed),6./7.); - v*=sin(v)+1.; - return fract(v); -} - -float rand(vec2 n){ - return rand(n.x * 1234 + n.y * 9876); -} - -// COLORS - -vec3 col(float x){ - return vec3( - .5*(sin(x*2.*PI)+1.), - .5*(sin(x*2.*PI+2.*PI/3.)+1.), - .5*(sin(x*2.*PI-2.*PI/3.)+1.) - ); -} - -vec3 shift(vec3 c, float f) { - return vec3( - c.x * (1 - f) + c.y * f, - c.y * (1 - f) + c.z * f, - c.z * (1 - f) + c.x * f - ); -} - -vec3 shift3(vec3 c, float f) { - return shift(shift(shift(c, f), f), f); -} - -float mean(vec3 v) -{ - return v.x * 0.3333 + v.y * 0.3333 + v.z * 0.3333; -} - -float mean(vec4 v) -{ - return v.x * 0.3333 + v.y * 0.3333 + v.z * 0.3333; -} - -// TIME - -float randTime(float seed){ - return rand(seed + floor(iBeats / 4)); -} - -float divider(float x) -{ - if (x < 0.1) return 0; - if (x < 0.2) return 0.125; - if (x < 0.3) return 0.25; - if (x < 0.4) return 0.5; - if (x < 0.6) return 1; - if (x < 0.8) return 2; - return 4; -} - -float modTime(float k, float k2) -{ - return mod(divider(k) * iBeats * k2 / 4, 1); -} - -float modTime(float k) -{ - return modTime(k, 1.0); -} - -float sinTime(float k) -{ - return sin(modTime(k, 0.5) * 2 * PI); -} - -float cosTime(float k) -{ - return cos(modTime(k, 0.5) * 2 * PI); -} - -// MAGIC - -vec2 magic_f(vec2 F, vec3 B, float i) -{ - return vec2( - mix(F.x, randTime(i + 1), min(1, B.z + iDemo)), - mix(F.y, randTime(i + 2), min(1, B.z + iDemo)) - ); -} - -vec2 magic_f(float i) -{ - return magic_f(vec2(0), vec3(0, 0, 1), i); -} - -vec3 magic_b(vec3 B, float i) -{ - return vec3( - mix(B.x, step(0.2, randTime(i + 3)), min(1, B.z + iDemo)), - mix(B.y, step(0.5, randTime(i + 4)), min(1, B.z + iDemo)), - min(1, B.z + iDemo) - ); -} - -vec3 magic_b(float i) -{ - return magic_b(vec3(0, 0, 1), i); -} - -bool magic_trigger(vec3 B, float i) -{ - return magic_b(B, i).x > 0; -} - -bool magic_trigger(float i) -{ - return magic_b(i).x > 0; -} - -float magic(vec2 F, vec3 B, float i) -{ - vec2 f = magic_f(F, B, i); - vec3 b = magic_b(B, i); - - return mix(0, f.x * mix(1 - modTime(f.y), cosTime(f.y) * 0.5 + 0.5, b.y), b.x); -} - -float magic(float i) -{ - return magic(vec2(0), vec3(0, 0, 1), i); -} - -float magic_reverse(vec2 F, vec3 B, float i) -{ - vec2 f = magic_f(F, B, i); - vec3 b = magic_b(B, i); - - return mix(0, f.x * mix(1 - modTime(f.y), modTime(f.y), b.y), b.x); -} - -float magic_reverse(float i) -{ - return magic_reverse(vec2(0), vec3(0, 0, 1), i); -} - -// EFFECTS - -mat2 rot(float angle){ - return mat2( - cos(angle*2.*PI),-sin(angle*2.*PI), - sin(angle*2.*PI),cos(angle*2.*PI) - ); -} - -vec2 lens(vec2 uv, float limit, float power) { - return uv * (1 + limit + length(uv * power)); -} - -vec2 kal(vec2 uv, float n) { - float t = atan(uv.y, uv.x) + PI * 0.5; - float q = 3.0 / (2.0 * PI); - t = abs(mod(t + PI / (n), 2 * PI / n) - PI / (n)); - return length(uv) * vec2( - cos(t), - sin(t) - ); -} - -vec2 kal2(vec2 uv, float n) { - float t = atan(uv.y, uv.x) + PI * 0.5; - float t2 = abs(mod(t + PI / n, 2 * PI / n) - PI / n); - return length(uv) * vec2( - cos(t2), - sin(t2) - ); -} - -// NOISE - -float noise(vec2 n) -{ - const vec2 d = vec2(0, 1); - vec2 b = floor(n); - vec2 f = fract(n); - f *= f * (3 - 2 * f); - return mix(mix(rand(b), rand(b + d.yx), f.x), mix(rand(b + d.xy), rand(b + d.yy), f.x), f.y); -} - -float noise_f(vec2 n, int f) -{ - float o = noise(n) / 2; - o += mix(o, noise(n * 2), f > 1 ? 1 : 0) / 4; - o += mix(o, noise(n * 4), f > 2 ? 1 : 0) / 8; - o += mix(o, noise(n * 8), f > 3 ? 1 : 0) / 16; - o += mix(o, noise(n * 16), f > 4 ? 1 : 0) / 32; - return o; -} - -// VORONOI - -float v_index(vec2 uv) { - return floor(uv.x) + floor(uv.y) * 45; -} - -vec2 v_pos(float i) { - int iTimeId = int(iBeats); - float iTimeV = iBeats - iTimeId; - - float x0 = rand(i + 823 + iTimeId); - float y0 = rand(i + 328 + iTimeId); - - float x1 = rand(i + 823 + iTimeId + 1); - float y1 = rand(i + 328 + iTimeId + 1); - - return vec2( - mix(x0, x1, ease(ease(iTimeV))), - mix(y0, y1, ease(ease(iTimeV))) - ); -} - -vec4 voronoi(vec2 uv, float dist) { - vec4 o = vec4(0, 0, 2, 0); - vec4 t = vec4(0, 0, 2, 0); - float d, i; - vec2 uv2, p; - for (int dx = -1; dx <= 1; dx++) { - for (int dy = -1; dy <= 1; dy++) { - uv2 = vec2(floor(uv.x) + dx, floor(uv.y) + dy); - i = v_index(uv2); - p = uv2 + v_pos(i) * dist; - d = length(p - uv); - if (d < o.z) { - t = o; - o = vec4(p, d, i); - } else if (d < t.z) { - t = vec4(p, d, i); - } - } - } - return vec4(o.z, t.z, o.w, t.w); -} - -// SHAPES - -float stripe(float x, float k1, float k2) -{ - return k2 > k1 ? (1 - step(x, k1)) * (step(x, k2)) : ((1 - step(x, k2)) * (step(x, k1))); -} - -float capsule(vec2 uv, float r, float d, float a) -{ - uv *= rot(a); - float f1 = step(uv.x, r) * step(-uv.x, r) * step(uv.y, d - r) * step(-uv.y, d - r); - float f2 = step(length(uv - vec2(0, d - r)), r); - float f3 = step(length(uv + vec2(0, d - r)), r); - return min(1, f1 + f2 + f3); -} - -float rect(vec2 uv, vec2 c, vec2 size) { - uv -= c; - return step(abs(uv.x), size.x) * step(abs(uv.y), size.y); -} - -float h_rect(vec2 uv, vec2 c, vec2 size, float k) { - return rect(uv, c, size + k * 0.5) - rect(uv, c, size - k * 0.5); -} - -// INPUTS - -vec4 reframe(sampler2D tex, vec2 uv) -{ - uv = uv * vec2(iResolution.y / iResolution.x, 1) + .5; - uv = saw(uv); - return texture(tex, uv); -} - -vec4 reframe_b(sampler2D tex, vec2 uv) -{ - uv = uv * vec2(iResolution.y / iResolution.x, 1) + .5; - return texture(tex, uv); -} - -// BLUR - -float gaussian_weight(float x, float sigma) -{ - return exp(-(x * x) / (2.0 * sigma * sigma)); -} - -vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size, float spm, float sigma, float bloom) -{ - int x, y; - vec2 offset; - float w; - vec4 sum = vec4(0); - float weight_sum = 0; - for (y = -kernel_size; y <= kernel_size; ++y) { - for (x = -kernel_size; x <= kernel_size; ++x) { - offset = vec2(x, y) * spm; - w = gaussian_weight(length(vec2(x, y)), sigma); - sum += texture(tex, uv + offset) * w; - weight_sum += w; - } - } - return (sum / weight_sum) * bloom; -} - -vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size, float spm, float sigma) -{ - return gauss(tex, uv, kernel_size, spm, sigma, 1.0); -} - -vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size, float spm) -{ - return gauss(tex, uv, kernel_size, spm, 2.0); -} - -vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size) -{ - return gauss(tex, uv, kernel_size, 1 / max(iResolution.x, iResolution.y)); -} - -vec4 gauss(sampler2D tex, vec2 uv) -{ - return gauss(tex, uv, 3); -} - -float dither(vec2 uv, float x) -{ - bool o = false; - o = o || x * 16 >= 1 && floor(mod(uv.x, 4)) == 0 && floor(mod(uv.y, 4)) == 0; - o = o || x * 16 >= 2 && floor(mod(uv.x, 4)) == 2 && floor(mod(uv.y, 4)) == 2; - o = o || x * 16 >= 3 && floor(mod(uv.x, 4)) == 0 && floor(mod(uv.y, 4)) == 2; - o = o || x * 16 >= 4 && floor(mod(uv.x, 4)) == 2 && floor(mod(uv.y, 4)) == 0; - o = o || x * 16 >= 5 && floor(mod(uv.x, 4)) == 1 && floor(mod(uv.y, 4)) == 1; - o = o || x * 16 >= 6 && floor(mod(uv.x, 4)) == 3 && floor(mod(uv.y, 4)) == 3; - o = o || x * 16 >= 7 && floor(mod(uv.x, 4)) == 1 && floor(mod(uv.y, 4)) == 3; - o = o || x * 16 >= 8 && floor(mod(uv.x, 4)) == 3 && floor(mod(uv.y, 4)) == 1; - o = o || x * 16 >= 9 && floor(mod(uv.x, 4)) == 1 && floor(mod(uv.y, 4)) == 0; - o = o || x * 16 >= 10 && floor(mod(uv.x, 4)) == 3 && floor(mod(uv.y, 4)) == 2; - o = o || x * 16 >= 11 && floor(mod(uv.x, 4)) == 1 && floor(mod(uv.y, 4)) == 2; - o = o || x * 16 >= 12 && floor(mod(uv.x, 4)) == 3 && floor(mod(uv.y, 4)) == 0; - o = o || x * 16 >= 13 && floor(mod(uv.x, 4)) == 0 && floor(mod(uv.y, 4)) == 1; - o = o || x * 16 >= 14 && floor(mod(uv.x, 4)) == 2 && floor(mod(uv.y, 4)) == 3; - o = o || x * 16 >= 15 && floor(mod(uv.x, 4)) == 0 && floor(mod(uv.y, 4)) == 3; - o = o || x * 16 >= 16 && floor(mod(uv.x, 4)) == 2 && floor(mod(uv.y, 4)) == 1; - return o ? 1 : 0; -} - -// CP 437 - -const int cp437[] = { - 0x0000, 0x0000, 0x0000, 0x0000, // 0x00, NUL - 0x151E, 0x8A87, 0xE19D, 0x789B, // 0x01, SOH, SMILEY BLACK - 0xFBFE, 0xFDF7, 0xEF73, 0x7FEC, // 0x02, STX, SMILEY LIGHT - 0xFFF6, 0x7773, 0x08CE, 0x0013, // 0x03, ETX, HEART - 0xFEC8, 0x7310, 0x08CE, 0x0013, // 0x04, EOT, DIAMOND - 0xFCEC, 0x7131, 0xECEF, 0x3137, // 0x05, ENQ, CLUB - 0xEC88, 0x3100, 0xECEF, 0x3137, // 0x06, ACK, SPADE - 0xC800, 0x3100, 0x008C, 0x0013, // 0x07, BEL, DOT - 0x37FF, 0xCEFF, 0xFF73, 0xFFEC, // 0x08, BS, INVERT DOT - 0x26C0, 0x4630, 0x0C62, 0x0364, // 0x09, HT, CIRCLE - 0xD93F, 0xB9CF, 0xF39D, 0xFC9B, // 0x0A, LF, INVERT CIRCLE - 0xE000, 0xBFEF, 0xE333, 0x1333, // 0x0B, VT, MALE - 0x666C, 0x6663, 0x8E8C, 0x1713, // 0x0C, FF, FEMALE - 0xCCCC, 0x0FCF, 0x7FEC, 0x0000, // 0x0D, CR, NOTE - 0x6E6E, 0xCFCF, 0x3766, 0x06EC, // 0x0E, SO, DOUBLE NOTE - 0x7CA9, 0xE359, 0x9AC7, 0x953E, // 0x0F, SI, SUN - 0xFF71, 0x7100, 0x017F, 0x0001, // 0x10, DLE, RIGHT TRIANGLE - 0xFC00, 0x7774, 0x000C, 0x0477, // 0x11, DC1, LEFT TRIANGLE - 0x8EC8, 0x1731, 0x8CE8, 0x1371, // 0x12, DC2, ARROW UP DOWN - 0x6666, 0x6666, 0x0606, 0x0606, // 0x13, DC3, DOUBLE EXCLAMATION - 0xEBBE, 0xDDDF, 0x0888, 0x0DDD, // 0x14, DC4, PARAGRAPH - 0x6C6C, 0x31C7, 0xE3C6, 0x1313, // 0x15, NAK, ? - 0x0000, 0x0000, 0x0EEE, 0x0777, // 0x16, SYN, HALF SQUARE BOTTOM - 0x8EC8, 0x1731, 0xF8CE, 0xF137, // 0x17, ETB, ARROW UP DOWN UNDERLINED - 0x8EC8, 0x1731, 0x0888, 0x0111, // 0x18, CAN, ARROW UP - 0x8888, 0x1111, 0x08CE, 0x0137, // 0x19, EM, ARROW DOWN - 0xF080, 0x7310, 0x0080, 0x0013, // 0x1A, SUB, ARROW RIGHT - 0xF6C0, 0x7000, 0x00C6, 0x0000, // 0x1B, ESC, ARROW LEFT - 0x3300, 0x0000, 0x00F3, 0x0070, // 0x1C, FS, ? - 0xF640, 0xF620, 0x0046, 0x0026, // 0x1D, GS, ARROW LEFT RIGHT - 0xEC80, 0x7310, 0x00FF, 0x00FF, // 0x1E, RS, TRIANGLE UP - 0xEFF0, 0x7FF0, 0x008C, 0x0013, // 0x1F, US, TRIANGLE DOWN - 0x0000, 0x0000, 0x0000, 0x0000, // 0x20, SPACE - 0xCEEC, 0x0110, 0x0C0C, 0x0000, // 0x21, ! - 0x0666, 0x0333, 0x0000, 0x0000, // 0x22, " - 0x6F66, 0x3733, 0x066F, 0x0337, // 0x23, # - 0xE3EC, 0x1030, 0x0CF0, 0x0013, // 0x24, $ - 0x8330, 0x1360, 0x036C, 0x0660, // 0x25, % - 0xEC6C, 0x6131, 0x0E3B, 0x0633, // 0x26, & - 0x0366, 0x0000, 0x0000, 0x0000, // 0x27, ' - 0x66C8, 0x0001, 0x08C6, 0x0100, // 0x28, ( - 0x88C6, 0x1100, 0x06C8, 0x0001, // 0x29, ) - 0xFC60, 0xF360, 0x006C, 0x0063, // 0x2A, * - 0xFCC0, 0x3000, 0x00CC, 0x0000, // 0x2B, + - 0x0000, 0x0000, 0x6CC0, 0x0000, // 0x2C, , - 0xF000, 0x3000, 0x0000, 0x0000, // 0x2D, - - 0x0000, 0x0000, 0x0CC0, 0x0000, // 0x2E, . - 0xC800, 0x0136, 0x0136, 0x0000, // 0x2F, / - 0xB33E, 0x7763, 0x0E7F, 0x0366, // 0x30, 0 - 0xCCEC, 0x0000, 0x0FCC, 0x0300, // 0x31, 1 - 0xC03E, 0x1331, 0x0F36, 0x0330, // 0x32, 2 - 0xC03E, 0x1331, 0x0E30, 0x0133, // 0x33, 3 - 0x36C8, 0x3333, 0x080F, 0x0737, // 0x34, 4 - 0x0F3F, 0x3103, 0x0E30, 0x0133, // 0x35, 5 - 0xF36C, 0x1001, 0x0E33, 0x0133, // 0x36, 6 - 0x803F, 0x1333, 0x0CCC, 0x0000, // 0x37, 7 - 0xE33E, 0x1331, 0x0E33, 0x0133, // 0x38, 8 - 0xE33E, 0x3331, 0x0E80, 0x0013, // 0x39, 9 - 0x0CC0, 0x0000, 0x0CC0, 0x0000, // 0x3A, : - 0x0CC0, 0x0000, 0x6CC0, 0x0000, // 0x3B, ; - 0x36C8, 0x0001, 0x08C6, 0x0100, // 0x3C, < - 0x0F00, 0x0300, 0x00F0, 0x0030, // 0x3D, = - 0x08C6, 0x3100, 0x06C8, 0x0001, // 0x3E, > - 0x803E, 0x1331, 0x0C0C, 0x0000, // 0x3F, ? - 0xBB3E, 0x7763, 0x0E3B, 0x0107, // 0x40, @ - 0x33EC, 0x3310, 0x033F, 0x0333, // 0x41, A - 0xE66F, 0x3663, 0x0F66, 0x0366, // 0x42, B - 0x336C, 0x0063, 0x0C63, 0x0360, // 0x43, C - 0x666F, 0x6631, 0x0F66, 0x0136, // 0x44, D - 0xE66F, 0x1147, 0x0F66, 0x0741, // 0x45, E - 0xE66F, 0x1147, 0x0F66, 0x0001, // 0x46, F - 0x336C, 0x0063, 0x0C63, 0x0767, // 0x47, G - 0xF333, 0x3333, 0x0333, 0x0333, // 0x48, H - 0xCCCE, 0x0001, 0x0ECC, 0x0100, // 0x49, I - 0x0008, 0x3337, 0x0E33, 0x0133, // 0x4A, J - 0xE667, 0x1366, 0x0766, 0x0663, // 0x4B, K - 0x666F, 0x0000, 0x0F66, 0x0764, // 0x4C, L - 0xFF73, 0x7776, 0x033B, 0x0666, // 0x4D, M - 0xBF73, 0x7666, 0x0333, 0x0667, // 0x4E, N - 0x336C, 0x6631, 0x0C63, 0x0136, // 0x4F, O - 0xE66F, 0x3663, 0x0F66, 0x0000, // 0x50, P - 0x333E, 0x3331, 0x08EB, 0x0313, // 0x51, Q - 0xE66F, 0x3663, 0x0766, 0x0663, // 0x52, R - 0xE73E, 0x0031, 0x0E38, 0x0133, // 0x53, S - 0xCCDF, 0x0023, 0x0ECC, 0x0100, // 0x54, T - 0x3333, 0x3333, 0x0F33, 0x0333, // 0x55, U - 0x3333, 0x3333, 0x0CE3, 0x0013, // 0x56, V - 0xB333, 0x6666, 0x037F, 0x0677, // 0x57, W - 0xC633, 0x1366, 0x036C, 0x0631, // 0x58, X - 0xE333, 0x1333, 0x0ECC, 0x0100, // 0x59, Y - 0x813F, 0x1367, 0x0F6C, 0x0764, // 0x5A, Z - 0x666E, 0x0001, 0x0E66, 0x0100, // 0x5B, [ - 0x8C63, 0x1000, 0x0000, 0x0463, // 0x5C, - 0x888E, 0x1111, 0x0E88, 0x0111, // 0x5D, ] - 0x36C8, 0x6310, 0x0000, 0x0000, // 0x5E, ^ - 0x0000, 0x0000, 0xF000, 0xF000, // 0x5F, _ - 0x08CC, 0x0100, 0x0000, 0x0000, // 0x60, ` - 0x0E00, 0x3100, 0x0E3E, 0x0633, // 0x61, a - 0xE667, 0x3000, 0x0B66, 0x0366, // 0x62, b - 0x3E00, 0x3100, 0x0E33, 0x0130, // 0x63, c - 0xE008, 0x3333, 0x0E33, 0x0633, // 0x64, d - 0x3E00, 0x3100, 0x0E3F, 0x0103, // 0x65, e - 0xF66C, 0x0031, 0x0F66, 0x0000, // 0x66, f - 0x3E00, 0x3600, 0xF0E3, 0x1333, // 0x67, g - 0xE667, 0x6300, 0x0766, 0x0666, // 0x68, h - 0xCE0C, 0x0000, 0x0ECC, 0x0100, // 0x69, i - 0x0000, 0x3303, 0xE330, 0x1333, // 0x6A, j - 0x6667, 0x3600, 0x076E, 0x0631, // 0x6B, k - 0xCCCE, 0x0000, 0x0ECC, 0x0100, // 0x6C, l - 0xF300, 0x7300, 0x03BF, 0x0667, // 0x6D, m - 0x3F00, 0x3100, 0x0333, 0x0333, // 0x6E, n - 0x3E00, 0x3100, 0x0E33, 0x0133, // 0x6F, o - 0x6B00, 0x6300, 0xF6E6, 0x0036, // 0x70, p - 0x3E00, 0x3600, 0x80E3, 0x7333, // 0x71, q - 0xEB00, 0x6300, 0x0F66, 0x0006, // 0x72, r - 0x3E00, 0x0300, 0x0F0E, 0x0131, // 0x73, s - 0xCEC8, 0x0300, 0x08CC, 0x0120, // 0x74, t - 0x3300, 0x3300, 0x0E33, 0x0633, // 0x75, u - 0x3300, 0x3300, 0x0CE3, 0x0013, // 0x76, v - 0xB300, 0x6600, 0x06FF, 0x0377, // 0x77, w - 0x6300, 0x3600, 0x036C, 0x0631, // 0x78, x - 0x3300, 0x3300, 0xF0E3, 0x1333, // 0x79, y - 0x9F00, 0x1300, 0x0F6C, 0x0320, // 0x7A, z - 0x7CC8, 0x0003, 0x08CC, 0x0300, // 0x7B, { - 0x0888, 0x0111, 0x0888, 0x0111, // 0x7C, | - 0x8CC7, 0x3000, 0x07CC, 0x0000, // 0x7D, } - 0x00BE, 0x0036, 0x0000, 0x0000, // 0x7E, ~ - 0x6C80, 0x3100, 0x0F33, 0x0766, // 0x7F, DEL, HOUSE - 0x333E, 0x3031, 0xE08E, 0x1311, // 0x80, Ç - 0x3030, 0x3030, 0x0E33, 0x0733, // 0x81, ü - 0x3E08, 0x3103, 0x0E3F, 0x0103, // 0x82, é - 0x0C3E, 0x63C7, 0x0C6C, 0x0F67, // 0x83, â - 0x0E03, 0x3103, 0x0E3E, 0x0733, // 0x84, ä - 0x0E07, 0x3100, 0x0E3E, 0x0733, // 0x85, à - 0x0ECC, 0x3100, 0x0E3E, 0x0733, // 0x86, å - 0x3E00, 0x0100, 0xC0E3, 0x1310, // 0x87, ç - 0x6C3E, 0x63C7, 0x0C6E, 0x0307, // 0x88, ê - 0x3E03, 0x3103, 0x0E3F, 0x0103, // 0x89, ë - 0x3E07, 0x3100, 0x0E3F, 0x0103, // 0x8A, è - 0xCE03, 0x0003, 0x0ECC, 0x0100, // 0x8B, ï - 0x8C3E, 0x1163, 0x0C88, 0x0311, // 0x8C, î - 0xCE07, 0x0000, 0x0ECC, 0x0100, // 0x8D, ì - 0x36C3, 0x6316, 0x033F, 0x0667, // 0x8E, Ä - 0xE0CC, 0x1000, 0x03F3, 0x0333, // 0x8F, Å - 0x6F08, 0x0303, 0x0F6E, 0x0301, // 0x90, É - 0x0E00, 0x3F00, 0x0E3E, 0x0F3F, // 0x91, æ - 0xF36C, 0x7337, 0x0333, 0x0733, // 0x92, Æ - 0xE03E, 0x1031, 0x0E33, 0x0133, // 0x93, ô - 0xE030, 0x1030, 0x0E33, 0x0133, // 0x94, ö - 0xE070, 0x1000, 0x0E33, 0x0133, // 0x95, ò - 0x303E, 0x3031, 0x0E33, 0x0733, // 0x96, û - 0x3070, 0x3000, 0x0E33, 0x0733, // 0x97, ù - 0x3030, 0x3030, 0xF0E3, 0x1333, // 0x98, ÿ - 0x6C83, 0x631C, 0x08C6, 0x0136, // 0x99, Ö - 0x3303, 0x3303, 0x0E33, 0x0133, // 0x9A, Ü - 0x3E88, 0x0711, 0x88E3, 0x1170, // 0x9B, ¢ - 0xF66C, 0x0231, 0x0F76, 0x0360, // 0x9C, £ - 0xFE33, 0x3133, 0xCCFC, 0x0030, // 0x9D, ¥ - 0xF33F, 0x5331, 0x3333, 0xE6F6, // 0x9E, ₧ - 0xC880, 0x31D7, 0xEB88, 0x0111, // 0x9F, ƒ - 0x0E08, 0x3103, 0x0E3E, 0x0733, // 0xA0, á - 0xCE0C, 0x0001, 0x0ECC, 0x0100, // 0xA1, í - 0xE080, 0x1030, 0x0E33, 0x0133, // 0xA2, ó - 0x3080, 0x3030, 0x0E33, 0x0733, // 0xA3, ú - 0xF0F0, 0x1010, 0x0333, 0x0333, // 0xA4, ñ - 0x730F, 0x3303, 0x03BF, 0x0333, // 0xA5, Ñ - 0xC66C, 0x7333, 0x00E0, 0x0070, // 0xA6, ª - 0xC66C, 0x1331, 0x00E0, 0x0030, // 0xA7, º - 0x6C0C, 0x0000, 0x0E33, 0x0130, // 0xA8, ¿ - 0xF000, 0x3000, 0x0033, 0x0000, // 0xA9, ⌐ - 0xF000, 0x3000, 0x0000, 0x0033, // 0xAA, ¬ - 0xB333, 0x736C, 0x036C, 0xF36C, // 0xAB, ½ - 0xB333, 0xD36C, 0x036C, 0xCFFE, // 0xAC, ¼ - 0x8088, 0x1011, 0x0888, 0x0111, // 0xAD, ¡ - 0x36C0, 0x36C0, 0x00C6, 0x00C6, // 0xAE, « - 0xC630, 0xC630, 0x0036, 0x0036, // 0xAF, » - 0x1414, 0x1414, 0x1414, 0x1414, // 0xB0, ░ - 0x5A5A, 0x5A5A, 0x5A5A, 0x5A5A, // 0xB1, ▒ - 0xBEBE, 0xBEBE, 0xBEBE, 0xBEBE, // 0xB2, ▓ - 0x8888, 0x1111, 0x8888, 0x1111, // 0xB3, │ - 0x8888, 0x1111, 0x888F, 0x1111, // 0xB4, ┤ - 0x8F88, 0x1111, 0x888F, 0x1111, // 0xB5, ╡ - 0xCCCC, 0x6666, 0xCCCF, 0x6666, // 0xB6, ╢ - 0x0000, 0x0000, 0xCCCF, 0x6667, // 0xB7, ╖ - 0x8F00, 0x1100, 0x888F, 0x1111, // 0xB8, ╕ - 0x0FCC, 0x6666, 0xCCCF, 0x6666, // 0xB9, ╣ - 0xCCCC, 0x6666, 0xCCCC, 0x6666, // 0xBA, ║ - 0x0F00, 0x6700, 0xCCCF, 0x6666, // 0xBB, ╗ - 0x0FCC, 0x6666, 0x000F, 0x0007, // 0xBC, ╝ - 0xCCCC, 0x6666, 0x000F, 0x0007, // 0xBD, ╜ - 0x8F88, 0x1111, 0x000F, 0x0001, // 0xBE, ╛ - 0x0000, 0x0000, 0x888F, 0x1111, // 0xBF, ┐ - 0x8888, 0x1111, 0x0008, 0x000F, // 0xC0, └ - 0x8888, 0x1111, 0x000F, 0x000F, // 0xC1, ┴ - 0x0000, 0x0000, 0x888F, 0x111F, // 0xC2, ┬ - 0x8888, 0x1111, 0x8888, 0x111F, // 0xC3, ├ - 0x0000, 0x0000, 0x000F, 0x000F, // 0xC4, ─ - 0x8888, 0x1111, 0x888F, 0x111F, // 0xC5, ┼ - 0x8888, 0x1F11, 0x8888, 0x111F, // 0xC6, ╞ - 0xCCCC, 0x6666, 0xCCCC, 0x666E, // 0xC7, ╟ - 0xCCCC, 0x0E66, 0x000C, 0x000F, // 0xC8, ╚ - 0xCC00, 0x0F00, 0xCCCC, 0x666E, // 0xC9, ╔ - 0x0FCC, 0x0E66, 0x000F, 0x000F, // 0xCA, ╩ - 0x0F00, 0x0F00, 0xCCCF, 0x666E, // 0xCB, ╦ - 0xCCCC, 0x0E66, 0xCCCC, 0x666E, // 0xCC, ╠ - 0x0F00, 0x0F00, 0x000F, 0x000F, // 0xCD, ═ - 0x0FCC, 0x0E66, 0xCCCF, 0x666E, // 0xCE, ╬ - 0x0F88, 0x0F11, 0x000F, 0x000F, // 0xCF, ╧ - 0xCCCC, 0x6666, 0x000F, 0x000F, // 0xD0, ╨ - 0x0F00, 0x0F00, 0x888F, 0x111F, // 0xD1, ╤ - 0x0000, 0x0000, 0xCCCF, 0x666F, // 0xD2, ╥ - 0xCCCC, 0x6666, 0x000C, 0x000F, // 0xD3, ╙ - 0x8888, 0x1F11, 0x0008, 0x000F, // 0xD4, ╘ - 0x8800, 0x1F00, 0x8888, 0x111F, // 0xD5, ╒ - 0x0000, 0x0000, 0xCCCC, 0x666F, // 0xD6, ╓ - 0xCCCC, 0x6666, 0xCCCF, 0x666F, // 0xD7, ╫ - 0x8F88, 0x1F11, 0x888F, 0x111F, // 0xD8, ╪ - 0x8888, 0x1111, 0x000F, 0x0001, // 0xD9, ┘ - 0x0000, 0x0000, 0x8888, 0x111F, // 0xDA, ┌ - 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0xDB, █ - 0x0000, 0x0000, 0xFFFF, 0xFFFF, // 0xDC, ▄ - 0xFFFF, 0x0000, 0xFFFF, 0x0000, // 0xDD, ▌ - 0x0000, 0xFFFF, 0x0000, 0xFFFF, // 0xDE, ▐ - 0xFFFF, 0xFFFF, 0x0000, 0x0000, // 0xDF, ▀ - 0xBE00, 0x3600, 0x0EB3, 0x0631, // 0xE0, α - 0xF3E0, 0x1310, 0x33F3, 0x0013, // 0xE1, ß - 0x33F0, 0x0330, 0x0333, 0x0000, // 0xE2, Γ - 0x66F0, 0x3370, 0x0666, 0x0333, // 0xE3, π - 0xC63F, 0x0033, 0x0F36, 0x0330, // 0xE4, Σ - 0xBE00, 0x1700, 0x0EBB, 0x0011, // 0xE5, σ - 0x6660, 0x6660, 0x36E6, 0x0036, // 0xE6, µ - 0x8BE0, 0x1360, 0x0888, 0x0111, // 0xE7, τ - 0x3ECF, 0x3103, 0xFCE3, 0x3013, // 0xE8, Φ - 0xF36C, 0x7631, 0x0C63, 0x0136, // 0xE9, Θ - 0x336C, 0x6631, 0x0766, 0x0733, // 0xEA, Ω - 0xE8C8, 0x3103, 0x0E33, 0x0133, // 0xEB, δ - 0xBE00, 0xD700, 0x00EB, 0x007D, // 0xEC, ∞ - 0xBE00, 0xD736, 0x36EB, 0x007D, // 0xED, φ - 0xF36C, 0x1001, 0x0C63, 0x0100, // 0xEE, ε - 0x333E, 0x3331, 0x0333, 0x0333, // 0xEF, ∩ - 0xF0F0, 0x3030, 0x00F0, 0x0030, // 0xF0, ≡ - 0xCFCC, 0x0300, 0x0F0C, 0x0300, // 0xF1, ± - 0xC8C6, 0x0100, 0x0F06, 0x0300, // 0xF2, ≥ - 0xC6C8, 0x0001, 0x0F08, 0x0301, // 0xF3, ≤ - 0x8880, 0x1DD7, 0x8888, 0x1111, // 0xF4, ⌠ - 0x8888, 0x1111, 0xEBB8, 0x0111, // 0xF5, ⌡ - 0xF0CC, 0x3000, 0x0CC0, 0x0000, // 0xF6, ÷ - 0x0BE0, 0x0360, 0x00BE, 0x0036, // 0xF7, ≈ - 0xC66C, 0x1331, 0x0000, 0x0000, // 0xF8, ° - 0x8000, 0x1000, 0x0008, 0x0001, // 0xF9, ∙ - 0x0000, 0x0000, 0x0008, 0x0001, // 0xFA, · - 0x0000, 0x333F, 0x8C67, 0x3333, // 0xFB, √ - 0x666E, 0x3331, 0x0006, 0x0003, // 0xFC, ⁿ - 0x6C8E, 0x0010, 0x000E, 0x0001, // 0xFD, ² - 0xCC00, 0x3300, 0x00CC, 0x0033, // 0xFE, ■ - 0x0000, 0x0000, 0x0000, 0x0000, // 0xFF, NBSP -}; - -const int charsets[] = { - 0x30, 10, // NUMBERS - 0x41, 26, // UPPERCASE LETTERS - 0x61, 26, // LOWERCASE LETTERS - 0x01, 15, // SYMBOLS - 0x18, 4, // ARROWS - 0xB3, 40, // BARS - 0xE0, 16, // GREEK - 0x80, 28, // ACCENTS - 0xB0, 3, // SHADES -}; - -#define CHARSETS 8 - -const int hex_chars[] = { - 0x30, - 0x31, - 0x32, - 0x33, - 0x34, - 0x35, - 0x36, - 0x37, - 0x38, - 0x39, - 0x41, - 0x42, - 0x43, - 0x44, - 0x45, - 0x46, -}; - -bool char(vec2 pos, int code) -{ - if (pos.x < 0.0 || pos.y < 0.0 || pos.x >= 1.0 || pos.y >= 1.0) { - return false; - } - ivec2 pos2 = ivec2(pos.x * 8.0, (1 - pos.y) * 8.0); - ivec2 subpos = pos2 % 4; - int v = int(pow(2, subpos.y * 4 + subpos.x)); - int d = int(pos2.y * 0.25) * 2 + int(pos2.x * 0.25); - return (cp437[code * 4 + d] & v) > 0; -} - -float char_at(vec2 uv, vec2 pos, int code) -{ - return char(uv - pos, code) ? 1 : 0; -} - -float write_5(vec2 uv, vec2 pos, int str[5]) -{ - float d = 0; - int i; - - for (i = 0; i < 5; i++) { - if (str[i] == 0) { - return d; - } - - d += char_at(uv, pos + vec2(i, 0), str[i]); - } - - return d; -} - -float write_10(vec2 uv, vec2 pos, int str[10]) -{ - float d = 0; - int i; - - for (i = 0; i < 10; i++) { - if (str[i] == 0) { - return d; - } - - d += char_at(uv, pos + vec2(i, 0), str[i]); - } - - return d; -} - -float write_20(vec2 uv, vec2 pos, int str[20]) -{ - float d = 0; - int i; - - for (i = 0; i < 20; i++) { - if (str[i] == 0) { - return d; - } - - d += char_at(uv, pos + vec2(i, 0), str[i]); - } - - return d; -} - -float write_int(vec2 uv, vec2 pos, uint value, uint magnitude) -{ - int i; - uint m = 1; - float d = 0; - for (i = 0; i < magnitude; i++) { - if (i == 0 || value >= m) { - d += char_at(uv, pos + vec2(magnitude - i - 1, 0), int(0x30 + (value % (m * 10u)) / m)); - m *= 10u; - } - } - return d; -} - -int read(sampler2D tex, vec2 uv, float k, int d, float t) -{ - float inv_k = 1 / k; - vec2 tex_uv = floor(uv * k) * inv_k; - tex_uv += vec2(d % 2, floor(d * 0.5)) * 0.5 * inv_k; - return - ((mean(reframe(tex, tex_uv + vec2(0, 3) * inv_k * 0.125)) > t) ? 1 : 0) + - ((mean(reframe(tex, tex_uv + vec2(0, 2) * inv_k * 0.125)) > t) ? 2 : 0) + - ((mean(reframe(tex, tex_uv + vec2(0, 1) * inv_k * 0.125)) > t) ? 4 : 0) + - ((mean(reframe(tex, tex_uv + vec2(0, 0) * inv_k * 0.125)) > t) ? 8 : 0) + - ((mean(reframe(tex, tex_uv + vec2(1, 3) * inv_k * 0.125)) > t) ? 16 : 0) + - ((mean(reframe(tex, tex_uv + vec2(1, 2) * inv_k * 0.125)) > t) ? 32 : 0) + - ((mean(reframe(tex, tex_uv + vec2(1, 1) * inv_k * 0.125)) > t) ? 64 : 0) + - ((mean(reframe(tex, tex_uv + vec2(1, 0) * inv_k * 0.125)) > t) ? 128 : 0) + - ((mean(reframe(tex, tex_uv + vec2(2, 3) * inv_k * 0.125)) > t) ? 256 : 0) + - ((mean(reframe(tex, tex_uv + vec2(2, 2) * inv_k * 0.125)) > t) ? 512 : 0) + - ((mean(reframe(tex, tex_uv + vec2(2, 1) * inv_k * 0.125)) > t) ? 1024 : 0) + - ((mean(reframe(tex, tex_uv + vec2(2, 0) * inv_k * 0.125)) > t) ? 2048 : 0) + - ((mean(reframe(tex, tex_uv + vec2(3, 3) * inv_k * 0.125)) > t) ? 4096 : 0) + - ((mean(reframe(tex, tex_uv + vec2(3, 2) * inv_k * 0.125)) > t) ? 8192 : 0) + - ((mean(reframe(tex, tex_uv + vec2(3, 1) * inv_k * 0.125)) > t) ? 16384 : 0) + - ((mean(reframe(tex, tex_uv + vec2(3, 0) * inv_k * 0.125)) > t) ? 32768 : 0); -} - -// https://web.archive.org/web/20151229003112/http://blogs.msdn.com/b/jeuge/archive/2005/06/08/hakmem-bit-count.aspx -int bit_count(int u) -{ - int c; - c = u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111); - return ((c + (c >> 3)) & 030707070707) % 63; -} - -int guess_char(sampler2D tex, vec2 uv, float k, float t) -{ - int b0 = read(tex, uv, k, 0, t); - int b1 = read(tex, uv, k, 1, t); - int b2 = read(tex, uv, k, 2, t); - int b3 = read(tex, uv, k, 3, t); - - int mc = 0; - int mb = 100; - int i; - int b; - - for (i = 0x01; i <= 0xFF; i++) { - if (i == 0x20 || i == 0xff || i == 0xDB) { - continue; - } - b = bit_count(cp437[i * 4] ^ b0) + bit_count(cp437[i * 4 + 1] ^ b1) + bit_count(cp437[i * 4 + 2] ^ b2) + + bit_count(cp437[i * 4 + 3] ^ b3); - if (b < mb) { - mb = b; - mc = i; - } - } - - return mc; -} - -// 5. generators -// ------------- - -subroutine vec4 src_stage_sub(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3); - -subroutine uniform src_stage_sub src_stage; - -vec4 src_thru(vec2 vUV, sampler2D tex, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - // start - - vec2 uv0 = vUV.st; - - // controls - - float hue = magic(f1, b1, seed + 10); - float saturation = magic(f2, b2, seed + 20); - float light = magic(f3, b3, seed + 30); - - // logic - - vec3 c = texture(tex, uv0).xyz; - - c = shift3(c, hue); - - c *= 1 + saturation; - c = mix(c + light * 2.0, c - (1 - light) * 2.0, step(0.5, light)); - - // output - - return vec4(c, 1.); -} - -// SRC 1: feedback + thru -subroutine(src_stage_sub) vec4 src_1(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - return src_thru(vUV, iTex0, seed, b1, f1, b2, f2, b3, f3); -} - -// SRC 2 : lines -subroutine(src_stage_sub) vec4 src_2(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float thickness = magic(f1, b1, seed + 10); - float rotation = magic(f2, b2, seed + 20); - float distort = magic(f3, b3, seed + 30); - - // logic - - vec2 uv2 = uv1; - uv2.y *= cos(uv2.x * 5 * distort); - uv2 *= rot(rotation + iBeats / 16); - float k = thickness * 2; - uv2.y = cmod(uv2.y, k * 2 + 0.1); - float f = step(uv2.y, k * 0.125 + 0.05) * step(-uv2.y, k * 0.125 + 0.01); - - return vec4(f); -} - -// SRC 3 : dots -subroutine(src_stage_sub) vec4 src_3(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float zoom = magic(f1, b1, seed + 10); - float rotation = magic(f2, b2, seed + 20); - float lens_v = magic(f3, b3, seed + 30); - - // logic - - vec2 uv2 = uv1; - float k1 = lens_v * 5; - uv2 = lens(uv2, -k1, k1); - uv2 = kal(uv2, 5); - uv2 *= rot(rotation + iBeats / 16); - float k = zoom * 0.1 + 0.05; - uv2 = cmod(uv2, k * 2); - float f = step(length(uv2), k / (1 + length(uv1) * 2)); - - return vec4(f); -} - -// SRC 4 : waves -subroutine(src_stage_sub) vec4 src_4(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float spacing = magic(f1, b1, seed + 10); - float thickness = magic(f2, b2, seed + 20); - float scroll = magic_reverse(f3, b3, seed + 30); - - // logic - - vec2 uv2 = uv1; - uv2.y += 0.5; - uv2 *= 2.25; - uv2 = vec2((uv2.x + 1) * 0.5, -uv2.y); - float m1 = spacing * 4.5 + 0.5; - float y = log(-uv2.y) * m1; - y = mod(y + scroll * 5.0 - iBeats / 16, 5.); - float id = floor(y) * 32; - float s = cos(uv2.x * rand(id + 837) * 100 + rand(id + 281) * PI) - + cos(uv2.x * rand(id + 231) * 100 + rand(id + 526) * PI) - + cos(uv2.x * rand(id + 746) * 100 + rand(id + 621) * PI) - + cos(uv2.x * rand(id + 235) * 100 + rand(id + 315) * PI) - + cos(uv2.x * rand(id + 782) * 100 + rand(id + 314) * PI) - + cos(uv2.x * rand(id + 241) * 100 + rand(id + 734) * PI) - + cos(uv2.x * rand(id + 416) * 100 + rand(id + 425) * PI) - + cos(uv2.x * rand(id + 315) * 100 + rand(id + 525) * PI) - + cos(uv2.x * rand(id + 423) * 100 + rand(id + 743) * PI) - + cos(uv2.x * rand(id + 637) * 100 + rand(id + 245) * PI); - s *= 0.1; - float cut = 0.025 + thickness * 0.475; - float y2 = min(1.0, -(uv2.y)); - float f = (0.1 + 0.9 * (cos((y2 + 1.0) * PI) * 0.5 + 0.5)) * step(uv2.y, 0.) * step(fract(y + (s - 1) * (1 - cut) * 0.5), cut);//step(uv2.y, 0.) * mod(-uv2.y * 1.0, 1.0); - - return vec4(f); -} - -// SRC 5 : noise -subroutine(src_stage_sub) vec4 src_5(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float zoom = magic(f1, b1, seed + 10); - float voronoi_distort = magic(f2, b2, seed + 20); - float details = magic(f3, b3, seed + 30); - float noise_factor = magic(seed + 40); - - // logic - - vec2 uv2 = uv1; - uv2 *= zoom * 20 + 3; - uv2.x += iBeats; - vec4 data = voronoi(uv2, voronoi_distort); - float f = data.x / (data.x + data.y); - f = sin(f * PI * (details * 20)) * 0.5 + 1; - int nf = int(noise_factor * 6); - f *= mix(1, noise_f(uv2, nf - 1), step(0.0, float(nf))); - - return vec4(f); -} - -// SRC 6 : video in 1 + thru -subroutine(src_stage_sub) vec4 src_6(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - return src_thru(vUV, iTex3, seed, b1, f1, b2, f2, b3, f3); -} - -// SRC 7 : cp437 -subroutine(src_stage_sub) vec4 src_7(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float zoom = magic(f1, b1, seed + 10); - vec2 charset = magic_f(f2, b2, seed + 20); - vec3 charset_ctrl = magic_b(b2, seed + 20); - float char_delta = magic(f3, b3, seed + 30); - - // logic - - vec2 uv2 = uv1; - uv2 *= zoom * 20 + 3; - uv2 += iBeats; - uv2 = mod(uv2, 100) + 100; - int start_char = charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2] : 0x01; - int char_span = int((charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2 + 1] : 255)); - char_span = int(char_span * max(1 - charset.y, 1 / (char_span * 0.75))); - ivec2 uv2i = ivec2(uv2); - int code = ((charset_ctrl.y < 1 || (uv2i.x % 2 ^ uv2i.y % 2) > 0) ? 1 : 0) * (start_char + int((rand(uv2i) + char_delta) * char_span) % char_span); - uv2 = mod(uv2, 1); - float f = char(uv2, code) ? 1 : 0; - - return vec4(f); -} - -// SRC 8 : sentences -#define SENTENCE_COUNT 16 - -const int sentences[SENTENCE_COUNT][20] = { - {102, 111, 114, 103, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {70, 79, 82, 71, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {70, 46, 79, 46, 82, 46, 71, 46, 69, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {70, 117, 115, 105, 111, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {79, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {82, 101, 97, 108, 45, 116, 105, 109, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {71, 101, 110, 101, 114, 97, 116, 105, 118, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {69, 102, 102, 101, 99, 116, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {69, 118, 101, 114, 121, 116, 104, 105, 110, 103, 32, 121, 111, 117, 32, 115, 101, 101, 0, 0}, - {80, 105, 120, 101, 108, 32, 98, 121, 32, 112, 105, 120, 101, 108, 0, 0, 0, 0, 0, 0}, - {76, 105, 118, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {71, 101, 110, 101, 114, 97, 116, 101, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {67, 111, 110, 116, 114, 111, 108, 108, 101, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {67, 111, 100, 101, 32, 97, 115, 32, 97, 114, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {65, 114, 116, 32, 97, 115, 32, 99, 111, 100, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {75, 108, 101, 960, 101, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -}; - - -const int lengths[SENTENCE_COUNT] = { - 5, 5, 10, 6, 2, 9, 10, 7, 18, 14, 4, 9, 10, 11, 11, 6 -}; - -subroutine(src_stage_sub) vec4 src_8(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float zoom = magic(f1, b1, seed + 10); - float sentence = magic_reverse(f2, b2, seed + 20); - float h_delta = magic(f3, b3, seed + 30); - vec3 h_delta_b = magic_b(b3, seed + 30); - - // logic - - vec2 uv2 = uv1; - uv2 *= (1 + zoom) * 12; - int s = int(sentence * (SENTENCE_COUNT - 1)); - uv2.x += floor(uv2.y) * (h_delta - 0.5) * 2; - uv2.y = mix(uv2.y, mod(uv2.y, 1), h_delta_b.x); - float f = write_20(uv2, vec2(-float(lengths[s]) * 0.5, 0), sentences[s]); - - return vec4(f); -} - -// TODO SRC 9 -subroutine(src_stage_sub) vec4 src_9(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - return src_2(vUV, seed, b1, f1, b2, f2, b3, f3); - - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - // logic - - return texture(iTex0, vUV); -} - -// TODO SRC 10 -subroutine(src_stage_sub) vec4 src_10(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - return src_3(vUV, seed, b1, f1, b2, f2, b3, f3); - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - // logic - - return texture(iTex0, vUV); -} - -// SRC 11 : video in 2 + thru -subroutine(src_stage_sub) vec4 src_11(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - return src_thru(vUV, iTex4, seed, b1, f1, b2, f2, b3, f3); -} - -// TODO SRC 12 -subroutine(src_stage_sub) vec4 src_12(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - return src_4(vUV, seed, b1, f1, b2, f2, b3, f3); - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - // logic - - return texture(iTex0, vUV); -} - -// TODO SRC 13 -subroutine(src_stage_sub) vec4 src_13(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - return src_5(vUV, seed, b1, f1, b2, f2, b3, f3); - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - // logic - - return texture(iTex0, vUV); -} - -// TODO SRC 14 -subroutine(src_stage_sub) vec4 src_14(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - return src_7(vUV, seed, b1, f1, b2, f2, b3, f3); - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - // logic - - return texture(iTex0, vUV); -} - -// SRC 15 : debug -subroutine(src_stage_sub) vec4 src_15(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // inputs - - int selected_srca = iState3 - 1; - int selected_srcb = iState4 - 1; - int selected_fxa = iState5 - 1; - int selected_fxb = iState6 - 1; - int selected_mfx = iState8 - 1; - float fxa_value = magic(iMidi2_1[6].xy, vec3(1, 0, 0), iSeed5); - bool fxa_invert = magic_trigger(vec3(iMidi2_1[6].z, 0, 0), iSeed5); - float fxb_value = magic(iMidi2_2[6].xy, vec3(1, 0, 0), iSeed6); - bool fxb_invert = magic_trigger(vec3(iMidi2_2[6].z, 0, 0), iSeed6); - float mfx_value = magic(iMidi2_3[6].xy, vec3(1, 0, 0), iSeed8); - bool mfx_invert = magic_trigger(vec3(iMidi2_3[6].z, 0, 0), iSeed8); - float mix_value = magic(iMidi3_1[1].xy, vec3(1, 0, 0), iSeed7); - bool mix_type = magic_trigger(vec3(iMidi3_1[0].x, 0, 0), iSeed7 + 10); - - // logic - - const int texts[6][5] = { - {0x46, 0x50, 0x53, 0x00, 0x00}, // FPS - {0x54, 0x45, 0x4D, 0x50, 0x4F}, // TEMPO - {0x54, 0x49, 0x4D, 0x45, 0x00}, // TIME - {0x44, 0x45, 0x4D, 0x4F, 0x00}, // DEMO - {0x4C, 0x49, 0x56, 0x45, 0x00}, // LIVE - {0x2B, 0x52, 0x41, 0x4E, 0x44}, // +RAND - }; - - vec2 uv2 = uv1; - - uv2 *= 10; - uv2.x -= 0.5; - uv2.y += 0.5; - - vec2 uv3 = uv1 * 30; - - // base frame - float f = - h_rect(uv2, vec2(-5, -2), vec2(1), 0.1) + - h_rect(uv2, vec2(-2, -2), vec2(1), 0.1) + - rect(uv2, vec2(-3.5, -2), vec2(0.5, 0.1)) + - h_rect(uv2, vec2(-5, 2), vec2(1), 0.1) + - h_rect(uv2, vec2(-2, 2), vec2(1), 0.1) + - rect(uv2, vec2(-3.5, 2), vec2(0.5, 0.1)) + - h_rect(uv2, vec2(2, 0), vec2(1), 0.1) + - h_rect(uv2, vec2(5, 0), vec2(1), 0.1) + - rect(uv2, vec2(3.5, 0), vec2(0.5, 0.1)) + - rect(uv2, vec2(0.55, -2), vec2(1.5, 0.1)) + - rect(uv2, vec2(2, -1.55), vec2(0.1, 0.55)) + - rect(uv2, vec2(0.55, 2), vec2(1.5, 0.1)) + - rect(uv2, vec2(2, 1.55), vec2(0.1, 0.55)) + - rect(uv2, vec2(7.5, 0), vec2(1.5, 0.1)) + - h_rect(uv2, vec2(-9, -3.9), vec2(1), 0.1); - - // show selected src/fx - f += char_at(uv2, vec2(-5.4, 1.45), hex_chars[selected_srca]); - f += char_at(uv2, vec2(-5.4, -2.55), hex_chars[selected_srcb]); - f += char_at(uv2, vec2(-2.4, 1.45), hex_chars[selected_fxa]); - f += fxa_invert ? rect(uv2, vec2(-2, 2.7), vec2(0.5, 0.05)) : 0; - f += char_at(uv2, vec2(-2.4, -2.55), hex_chars[selected_fxb]); - f += fxb_invert ? rect(uv2, vec2(-2, -1.3), vec2(0.5, 0.05)) : 0; - f += char_at(uv2, vec2(4.6, -0.55), hex_chars[selected_mfx]); - f += mfx_invert ? rect(uv2, vec2(5, 0.7), vec2(0.5, 0.05)) : 0; - - // show current selected - f += iSelected == 3 ? h_rect(uv2, vec2(-5, 2), vec2(1.2), 0.1) : 0; - f += iSelected == 4 ? h_rect(uv2, vec2(-5, -2), vec2(1.2), 0.1) : 0; - f += iSelected == 5 ? h_rect(uv2, vec2(-2, 2), vec2(1.2), 0.1) : 0; - f += iSelected == 6 ? h_rect(uv2, vec2(-2, -2), vec2(1.2), 0.1) : 0; - f += iSelected == 8 ? h_rect(uv2, vec2(5, 0), vec2(1.2), 0.1) : 0; - - // show selected src/fx - f += iActive1 == 1 ? h_rect(uv2, vec2(-5, 0.8), vec2(1, 0), 0.1) : 0; - f += iActive1 == 2 ? h_rect(uv2, vec2(-5, -3.2), vec2(1, 0), 0.1) : 0; - f += iActive2 == 1 ? h_rect(uv2, vec2(-2, 0.8), vec2(1.2, 0), 0.1) : 0; - f += iActive2 == 2 ? h_rect(uv2, vec2(-2, -3.2), vec2(1, 0), 0.1) : 0; - f += iActive2 == 3 ? h_rect(uv2, vec2(5, -1.2), vec2(1, 0), 0.1) : 0; - - // show inputs / feedback - float line_a_a = rect(uv2, vec2(-8, 2), vec2(2, 0.1)); - float line_a_b = rect(uv2, vec2(-7, 2), vec2(1, 0.1)) + rect(uv2, vec2(-8, 0.5), vec2(0.1, 1.6)) + rect(uv2, vec2(-9, -1), vec2(1, 0.1)); - float line_a_f = rect(uv2, vec2(-6.5, 2), vec2(0.5, 0.1)) + rect(uv2, vec2(0, 4), vec2(7, 0.1)) + rect(uv2, vec2(-7, 3), vec2(0.1, 1.1)) + rect(uv2, vec2(7, 2), vec2(0.1, 2.1)); - if (selected_srca == 5 && iInputFormat1 == YUYV_FOURCC) { - f += iInputResolution1.x > 0 ? line_a_a : line_a_f; - } else if (selected_srca == 10 && iInputFormat2 == YUYV_FOURCC) { - f += iInputResolution2.x > 0 ? line_a_b : line_a_f; - } else if (selected_srca % 5 == 0) { - f += line_a_f; - } - float line_b_a = rect(uv2, vec2(-6.5, -2), vec2(0.5, 0.1)) + rect(uv2, vec2(-7, -0.5), vec2(0.1, 1.6)) + rect(uv2, vec2(-8.5, 1), vec2(1.5, 0.1)); - float line_b_b = rect(uv2, vec2(-8, -2), vec2(2, 0.1)); - float line_b_f = rect(uv2, vec2(-6.5, -2), vec2(0.5, 0.1)) + rect(uv2, vec2(0, -4), vec2(7, 0.1)) + rect(uv2, vec2(-7, -3), vec2(0.1, 1.1)) + rect(uv2, vec2(7, -2), vec2(0.1, 2.1)); - if (selected_srcb == 5 && iInputFormat1 == YUYV_FOURCC) { - f += iInputResolution1.x > 0 ? line_b_a : line_b_f; - } else if (selected_srcb == 10 && iInputFormat2 == YUYV_FOURCC) { - f += iInputResolution2.x > 0 ? line_b_b : line_b_f; - } else if (selected_srcb % 5 == 0) { - f += line_b_f; - } - - // show page - f += char_at(uv2, vec2(-9.2, -4.3), hex_chars[iPage]); - - // show fx values - float fx_rect = 0; - - f = mix(f, 1 - f, rect(uv2, vec2(-2, 1.1 + 0.9 * fxa_value), vec2(0.9, 0.9 * fxa_value))); - f = mix(f, 1 - f, rect(uv2, vec2(-2, -2.9 + 0.9 * fxb_value), vec2(0.9, 0.9 * fxb_value))); - f = mix(f, 1 - f, rect(uv2, vec2(5, -0.9 + 0.9 * mfx_value), vec2(0.9, 0.9 * mfx_value))); - - // show mix - f += char_at(uv2, vec2(1.55, -0.6), mix_type ? 0x4B : 0x4D); - f = mix(f, 1 - f, rect(uv2, vec2(2, -0.9 + 0.9 * mix_value), vec2(0.9, 0.9 * mix_value))); - - // show debug info - float v = 0; - float x = 0; - - x = -15; - f += write_5(uv3, vec2(x,13), texts[0]); - f += write_int(uv3, vec2(x - 3.5,13), iFPS, 3); - v = min(1, iFPS/60.0); - f += h_rect(uv3, vec2(x, 12), vec2(4, 0.5), 0.2); - f += rect(uv3, vec2(x + 4 * v - 4, 12), vec2(4 * v, 0.4)); - - x = 0; - f += write_5(uv3, vec2(x,13), texts[1]); - f += write_int(uv3, vec2(x - 3.5,13), int(iTempo), 3); - v = fract(iBeats); - f += h_rect(uv3, vec2(x, 12), vec2(4, 0.5), 0.2); - f += rect(uv3, vec2(x + 4 * v - 4, 12), vec2(4 * v, 0.4)); - - x = 15; - f += write_5(uv3, vec2(x,13), texts[2]); - f += write_int(uv3, vec2(x - 5.5,13), int(iTime), 5); - v = fract(iTime); - f += h_rect(uv3, vec2(x, 12), vec2(4, 0.5), 0.2); - f += rect(uv3, vec2(x + 4 * v - 4, 12), vec2(4 * v, 0.4)); - - if (iAutoRand > 0) { - f += write_5(uv3, vec2(-4,-15), iDemo > 0 ? texts[3] : texts[4]); - f += write_5(uv3, vec2(0,-15), texts[5]); - } else { - f += write_5(uv3, vec2(-2,-15), iDemo > 0 ? texts[3] : texts[4]); - } - - return vec4(f); -} - -// 6. effects -// ---------- - -vec4 fx_master(vec3 c0, vec3 c, int seed, vec3 m0) { - float fx = magic(m0.xy, vec3(1,0,0), seed); - bool invert = magic_trigger(vec3(m0.z, 0, 0), seed); - - vec3 c_out = mix(c0, c, fx); - - c_out = mix(c_out, 1 - c_out, invert ? 1 : 0); - - return vec4(c_out, 1.0); -} - -subroutine vec4 fx_stage_sub(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0); - -subroutine uniform fx_stage_sub fx_stage; - -// FX 1 : thru -subroutine(fx_stage_sub) vec4 fx_1(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - // start - - vec2 uv0 = vUV.st; - - // controls - - float hue = magic(f1, b1, seed + 10); - float saturation = magic(f2, b2, seed + 20); - float light = magic(f3, b3, seed + 30); - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - vec3 c = c0; - c = shift3(c, hue); - c *= 1 + saturation; - c = mix(c + light * 2.0, c - (1 - light) * 2.0, step(0.5, light)); - - return fx_master(c0, c, seed, m0); -} - -// FX 2 : feedback + shift -vec4 fx_shift(vec2 vUV, sampler2D src0, sampler2D src1, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float zoom = magic(f1, b1, seed + 10); - float x_shift = magic(f2, b2, seed + 20); - float y_shift = magic(f3, b3, seed + 30); - - // logic - - vec3 c0 = texture(src0, uv0).xyz; - - vec2 uv2 = uv1; - uv2 = mix(uv2 * (1 + zoom * 2), uv2 * (zoom), step(0.5, zoom)); - uv2 += vec2(x_shift * ratio, y_shift) * 2; - vec3 c = reframe(src1, uv2).xyz; - - return fx_master(c0, c, seed, m0); -} - -subroutine(fx_stage_sub) vec4 fx_2(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - return fx_shift(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); -} - -// FX 3 : shift -subroutine(fx_stage_sub) vec4 fx_3(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - return fx_shift(vUV, previous, previous, seed, b1, f1, b2, f2, b3, f3, m0); -} - -// FX 4 : colorize -subroutine(fx_stage_sub) vec4 fx_4(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - // start - - vec2 uv0 = vUV.st; - - // controls - - float c_black = magic(f1, b1, seed + 10); - bool c_black_trigger = magic_trigger(b1, seed + 10); - float c_white = magic(f2, b2, seed + 20); - bool c_white_trigger = magic_trigger(b2, seed + 20); - float delta = magic(f3, b3, seed + 30); - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - - float f = mean(c0); - float c_mix = mix(c_black, c_white, f) + delta; - vec3 c = mix(c_black_trigger ? col(c_mix) : vec3(0), c_white_trigger ? col(c_mix) : vec3(1), f); - - return fx_master(c0, c, seed, m0); -} - -// FX 5 : quantize -subroutine(fx_stage_sub) vec4 fx_5(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float pixel_size = magic(f1, b1, seed + 10); - float quantize = magic(f2, b2, seed + 20); - bool quantize_trigger = magic_trigger(b2, seed + 20); - float blur = magic(f3, b3, seed + 30); - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - - vec2 uv2 = uv1; - float pixel = (1 - pixel_size) * 250 + 25; - uv2 = round(uv2 * pixel) / pixel; - vec3 c = gauss(previous, uv2 * vec2(1 / ratio, 1) + .5, 3, 0.005 * blur).xyz; - float colors = (1 - quantize) * 10 + 1; - if (quantize_trigger) { - c = round(c * colors) / colors; - } - // c = mix(c, 1 - c, step(noise_f(uv0 * 10 + vec2(iTime * 0.1, 0), 5), 0.5)); - - return fx_master(c0, c, seed, m0); -} - -// FX 6 : dithering -subroutine(fx_stage_sub) vec4 fx_6(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float pixel_size = magic(f1, b1, seed + 10); - bool pixel_size_trigger = magic_trigger(b1, seed + 10); - float quantize = magic(f2, b2, seed + 20); - bool quantize_trigger = magic_trigger(b2, seed + 20); - float blur = magic(f3, b3, seed + 30); - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - - vec2 uv2 = uv1; - float k1 = pow(2, 10 - floor(pixel_size * 5)); - float pixel = (1 - pixel_size) * 250 + 25; - if (pixel_size_trigger) { - uv2 = floor(uv2 * k1) / k1; - } - vec3 c = gauss(previous, uv2 * vec2(1 / ratio, 1) + .5, 3, 0.005 * blur).xyz; - float k3 = pow(2, 5 - floor(quantize * 5)); - if (quantize_trigger) { - c *= k3; - c = vec3( - mix(floor(c.x), ceil(c.x), dither(uv2 * k1, c.x - floor(c.x))), - mix(floor(c.y), ceil(c.y), dither(uv2 * k1, c.y - floor(c.y))), - mix(floor(c.z), ceil(c.z), dither(uv2 * k1, c.z - floor(c.z))) - ); - c /= k3; - } - - return fx_master(c0, c, seed, m0); -} - -// FX 7 : tv -subroutine(fx_stage_sub) vec4 fx_7(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float lens_v = magic(f1, b1, seed + 10); - float horizontal_noise = magic(f2, b2, seed + 20); - float zoom = magic(f3, b3, seed + 30); - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - - vec2 uv2 = uv1; - float k1 = lens_v * 0.5; - uv2 *= 1 + zoom * 2; - uv2 = lens(uv2, -k1, k1); - float k = horizontal_noise; - vec3 c = vec3( - reframe_b(previous, uv2 + vec2((rand(uv0.y * 1000 + iTime) - 0.5) * k * 0.1)).x, - reframe_b(previous, uv2 + vec2((rand(uv0.y * 1100 + iTime) - 0.5) * k * 0.1)).y, - reframe_b(previous, uv2).z - ); - - return fx_master(c0, c, seed, m0); -} - -// FX 8 : kaleidoscope -subroutine(fx_stage_sub) vec4 fx_8(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float axes = magic(f1, b1, seed + 10); - float axes_trigger = magic_b(b1, seed + 10).x; - float rotation = magic(f2, b2, seed + 20); - float h_scroll = magic(f3, b3, seed + 30); - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - - vec2 uv2 = uv1; - uv2 = mix(uv2, kal2(uv2 * rot(0.25), floor(axes * 9 + 1)) * vec2(1, -2) + vec2(0, -0.5), axes_trigger); - uv2 *= rot(rotation); - uv2.x = (saw(uv2.x / ratio + 0.5 + h_scroll * 2) - 0.5) * ratio; - vec3 c = reframe(previous, uv2).xyz; - - return fx_master(c0, c, seed, m0); -} - -// FX 9 : cp437 -subroutine(fx_stage_sub) vec4 fx_9(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float zoom = magic(f1, b1, seed + 10); - vec2 charset = magic_f(f2, b2, seed + 20); - vec3 charset_ctrl = magic_b(b2, seed + 20); - float char_delta = magic(f3, b3, seed + 30); - float t = magic(seed + 40); - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - - vec2 uv2 = uv1; - float k1 = 100 * (1 - zoom) + 10; - float inv_k = 1 / k1; - uv2 = floor(uv2 * k1) * inv_k; - int start_char = charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2] : 0x01; - int char_span = int((charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2 + 1] : 255)); - char_span = int(char_span * max(1 - charset.y, 1 / (char_span * 0.75))); - ivec2 uv2i = ivec2(uv2 * k1); - int code = ((charset_ctrl.y < 1 || (uv2i.x % 2 ^ uv2i.y % 2) > 0) ? 1 : 0) * (start_char + int((rand(uv2i) + char_delta) * char_span) % char_span); - vec3 c = reframe(previous, uv2 + vec2(0, 0) * inv_k * 0.125).xyz * 0.2 - + reframe(previous, uv2 + vec2(1, 0) * inv_k * 0.125).xyz * 0.2 - + reframe(previous, uv2 + vec2(1, 1) * inv_k * 0.125).xyz * 0.2 - + reframe(previous, uv2 + vec2(0, 1) * inv_k * 0.125).xyz * 0.2 - + reframe(previous, uv2 + vec2(0.5, 0.5) * inv_k * 0.125).xyz * 0.2; - c = char(mod(uv1 * k1, 1), code) ? c : vec3(0); - - return fx_master(c0, c, seed, m0); -} - -// FX 10 : lens -subroutine(fx_stage_sub) vec4 fx_10(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - float lens_v1 = magic(f1, b1, seed + 10); - float lens_v2 = magic(f2, b2, seed + 20); - float zoom = magic(f3, b3, seed + 30); - float k = magic(seed + 40); - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - - vec2 uv2 = uv1; - uv2 *= 1 + zoom * 2; - uv2 = lens(uv2, -lens_v2 * 10, lens_v1 * 10); - vec3 c = reframe(previous, uv2).xyz; - - return fx_master(c0, c, seed, m0); -} - -// TODO FX 11 -subroutine(fx_stage_sub) vec4 fx_11(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - return fx_1(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - vec3 c = c0; - - return fx_master(c0, c, seed, m0); -} - -// TODO FX 12 -subroutine(fx_stage_sub) vec4 fx_12(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - return fx_2(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - vec3 c = c0; - - return fx_master(c0, c, seed, m0); -} - -// TODO FX 13 -subroutine(fx_stage_sub) vec4 fx_13(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - return fx_3(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - vec3 c = c0; - - return fx_master(c0, c, seed, m0); -} - -// TODO FX 14 -subroutine(fx_stage_sub) vec4 fx_14(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - return fx_4(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - vec3 c = c0; - - return fx_master(c0, c, seed, m0); -} - -// TODO FX 15 -subroutine(fx_stage_sub) vec4 fx_15(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) -{ - return fx_5(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); - // start - - vec2 uv0 = vUV.st; - float ratio = iResolution.x / iResolution.y; - vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); - - // controls - - // logic - - vec3 c0 = texture(previous, uv0).xyz; - vec3 c = c0; - - return fx_master(c0, c, seed, m0); -} - -const mat3x3 yuv_to_rgb = {{1,1,1},{0,-0.39465,2.03211},{1.13983,-0.5806,0}}; - -vec4 yuyvTex(sampler2D tex, vec2 vUV, int base_width) { - float w = base_width - 1; - - int x = int(vUV.x * w); - - int xU = x - x % 2; - int xV = x - x % 2 + 1; - - vec4 tU = texture(tex, vec2(xU / w, 1 - vUV.y)); - vec4 tV = texture(tex, vec2(xV / w, 1 - vUV.y)); - - vec3 yuv = vec3( - x % 2 == 0 ? tU.x : tV.x, - tU.y - 0.5, - tV.y - 0.5 - ); - - return vec4(yuv_to_rgb * yuv, 1.0); -} \ No newline at end of file diff --git a/default/frag1.glsl b/default/frag1.glsl index c5a3ebc..eec4ab3 100644 --- a/default/frag1.glsl +++ b/default/frag1.glsl @@ -1,4 +1,4 @@ -#include frag0.glsl +#version 460 // VIDEO 1 // ----------- @@ -8,6 +8,13 @@ in vec2 vUV; out vec4 fragColor; +#include inc_yuv.glsl + +uniform sampler2D iTex0; +uniform sampler2D iTex1; +uniform int iInputFormat1; +uniform vec2 iInputResolution1; + void main() { if (iInputFormat1 == YUYV_FOURCC) { fragColor = yuyvTex(iTex1, vUV, int(iInputResolution1.x)); diff --git a/default/frag10.glsl b/default/frag10.glsl index 4e2d812..65f844c 100644 --- a/default/frag10.glsl +++ b/default/frag10.glsl @@ -1,4 +1,4 @@ -#include frag0.glsl +#version 460 // MONITOR // --- @@ -6,6 +6,18 @@ in vec2 vUV; out vec4 fragColor; +#include inc_debug.glsl + +uniform sampler2D iTex0; +uniform sampler2D iTex1; +uniform sampler2D iTex2; +uniform sampler2D iTex3; +uniform sampler2D iTex4; +uniform sampler2D iTex5; +uniform sampler2D iTex6; +uniform sampler2D iTex7; +uniform sampler2D iTex8; +uniform sampler2D iTex9; uniform int iInputFPS1; uniform int iInputFPS2; @@ -43,7 +55,7 @@ void main() { c += s(uv2,1,1) * texture(iTex6, uv2); c += s(uv2,2,1) * texture(iTex8, uv2); - c += s(uv2,0,0) * src_15(mod(uv2, 1), 0, vec3(0), vec2(0), vec3(0), vec2(0), vec3(0), vec2(0)); + c += s(uv2,0,0) * debug(mod(uv2, 1)); c += s(uv2,1,0) * texture(iTex9, uv2); c += s(uv2,2,0) * texture(iTex0, uv2); diff --git a/default/frag2.glsl b/default/frag2.glsl index c485173..cbace02 100644 --- a/default/frag2.glsl +++ b/default/frag2.glsl @@ -1,4 +1,4 @@ -#include frag0.glsl +#version 460 // VIDEO 2 // ----------- @@ -8,6 +8,13 @@ in vec2 vUV; out vec4 fragColor; +#include inc_yuv.glsl + +uniform sampler2D iTex0; +uniform sampler2D iTex2; +uniform int iInputFormat2; +uniform vec2 iInputResolution2; + void main() { if (iInputFormat2 == YUYV_FOURCC) { fragColor = yuyvTex(iTex2, vUV, int(iInputResolution2.x)); diff --git a/default/frag3.glsl b/default/frag3.glsl index d53b640..feab26d 100644 --- a/default/frag3.glsl +++ b/default/frag3.glsl @@ -1,4 +1,5 @@ -#include frag0.glsl + +#version 460 // SRC A // ----------- @@ -7,6 +8,11 @@ in vec2 vUV; out vec4 fragColor; +#include inc_src.glsl + +subroutine uniform src_stage_sub src_stage; + +uniform int iSeed3; uniform vec3 iMidi1_1[6]; void main() { diff --git a/default/frag4.glsl b/default/frag4.glsl index 1035c9e..620d11f 100644 --- a/default/frag4.glsl +++ b/default/frag4.glsl @@ -1,4 +1,4 @@ -#include frag0.glsl +#version 460 // SRC B // ----------- @@ -7,6 +7,11 @@ in vec2 vUV; out vec4 fragColor; +#include inc_src.glsl + +subroutine uniform src_stage_sub src_stage; + +uniform int iSeed4; uniform vec3 iMidi1_2[6]; void main() { diff --git a/default/frag5.glsl b/default/frag5.glsl index bb3d983..20e7baa 100644 --- a/default/frag5.glsl +++ b/default/frag5.glsl @@ -1,4 +1,4 @@ -#include frag0.glsl +#version 460 // FX A // ------------- @@ -9,6 +9,13 @@ in vec2 vUV; out vec4 fragColor; +#include inc_fx.glsl + +uniform sampler2D iTex5; +uniform sampler2D iTex7; +uniform int iSeed5; +uniform vec3 iMidi2_1[7]; + void main() { fragColor = fx_stage(vUV, iTex5, iTex7, iSeed5, iMidi2_1[0], iMidi2_1[1].xy, iMidi2_1[2], iMidi2_1[3].xy, iMidi2_1[4], iMidi2_1[5].xy, iMidi2_1[6]); } \ No newline at end of file diff --git a/default/frag6.glsl b/default/frag6.glsl index 546ca27..479cbc8 100644 --- a/default/frag6.glsl +++ b/default/frag6.glsl @@ -1,4 +1,4 @@ -#include frag0.glsl +#version 460 // FX B // ------------- @@ -9,6 +9,13 @@ in vec2 vUV; out vec4 fragColor; +#include inc_fx.glsl + +uniform sampler2D iTex6; +uniform sampler2D iTex8; +uniform int iSeed6; +uniform vec3 iMidi2_2[7]; + void main() { fragColor = fx_stage(vUV, iTex6, iTex8, iSeed6, iMidi2_2[0], iMidi2_2[1].xy, iMidi2_2[2], iMidi2_2[3].xy, iMidi2_2[4], iMidi2_2[5].xy, iMidi2_2[6]); } \ No newline at end of file diff --git a/default/frag7.glsl b/default/frag7.glsl index e60ffd4..521d6f7 100644 --- a/default/frag7.glsl +++ b/default/frag7.glsl @@ -1,4 +1,4 @@ -#include frag0.glsl +#version 460 // A+B // ------------ @@ -9,6 +9,14 @@ in vec2 vUV; out vec4 fragColor; +#include inc_magic.glsl +#include inc_functions.glsl + +uniform sampler2D iTex7; +uniform sampler2D iTex8; +uniform int iSeed7; +uniform vec3 iMidi3_1[2]; + void main() { float mix_value = magic(iMidi3_1[1].xy, vec3(1, 0, 0), iSeed7); bool mix_type = magic_trigger(vec3(iMidi3_1[0].x, 0, 0), iSeed7 + 10); diff --git a/default/frag8.glsl b/default/frag8.glsl index ad1b153..250c9fa 100644 --- a/default/frag8.glsl +++ b/default/frag8.glsl @@ -1,4 +1,4 @@ -#include frag0.glsl +#version 460 // MFX // ------------ @@ -9,6 +9,14 @@ in vec2 vUV; out vec4 fragColor; +#include inc_fx.glsl + +uniform sampler2D iTex9; +uniform sampler2D iTex0; +uniform int iSeed8; +uniform vec3 iMidi2_3[7]; +uniform vec3 iMidi3_1[2]; + void main() { vec4 color = fx_stage(vUV, iTex9, iTex0, iSeed8, iMidi2_3[0], iMidi2_3[1].xy, iMidi2_3[2], iMidi2_3[3].xy, iMidi2_3[4], iMidi2_3[5].xy, iMidi2_3[6]); diff --git a/default/frag9.glsl b/default/frag9.glsl index eac9116..39eb1b5 100644 --- a/default/frag9.glsl +++ b/default/frag9.glsl @@ -1,4 +1,4 @@ -#include frag0.glsl +#version 460 // OUT // --- @@ -6,6 +6,8 @@ in vec2 vUV; out vec4 fragColor; +uniform sampler2D iTex0; + void main() { fragColor = texture(iTex0, vUV); } \ No newline at end of file diff --git a/default/inc_cp437.glsl b/default/inc_cp437.glsl new file mode 100644 index 0000000..1f2d2a3 --- /dev/null +++ b/default/inc_cp437.glsl @@ -0,0 +1,433 @@ +#ifndef INC_CP437 +#define INC_CP437 + +const int cp437[] = { + 0x0000, 0x0000, 0x0000, 0x0000, // 0x00, NUL + 0x151E, 0x8A87, 0xE19D, 0x789B, // 0x01, SOH, SMILEY BLACK + 0xFBFE, 0xFDF7, 0xEF73, 0x7FEC, // 0x02, STX, SMILEY LIGHT + 0xFFF6, 0x7773, 0x08CE, 0x0013, // 0x03, ETX, HEART + 0xFEC8, 0x7310, 0x08CE, 0x0013, // 0x04, EOT, DIAMOND + 0xFCEC, 0x7131, 0xECEF, 0x3137, // 0x05, ENQ, CLUB + 0xEC88, 0x3100, 0xECEF, 0x3137, // 0x06, ACK, SPADE + 0xC800, 0x3100, 0x008C, 0x0013, // 0x07, BEL, DOT + 0x37FF, 0xCEFF, 0xFF73, 0xFFEC, // 0x08, BS, INVERT DOT + 0x26C0, 0x4630, 0x0C62, 0x0364, // 0x09, HT, CIRCLE + 0xD93F, 0xB9CF, 0xF39D, 0xFC9B, // 0x0A, LF, INVERT CIRCLE + 0xE000, 0xBFEF, 0xE333, 0x1333, // 0x0B, VT, MALE + 0x666C, 0x6663, 0x8E8C, 0x1713, // 0x0C, FF, FEMALE + 0xCCCC, 0x0FCF, 0x7FEC, 0x0000, // 0x0D, CR, NOTE + 0x6E6E, 0xCFCF, 0x3766, 0x06EC, // 0x0E, SO, DOUBLE NOTE + 0x7CA9, 0xE359, 0x9AC7, 0x953E, // 0x0F, SI, SUN + 0xFF71, 0x7100, 0x017F, 0x0001, // 0x10, DLE, RIGHT TRIANGLE + 0xFC00, 0x7774, 0x000C, 0x0477, // 0x11, DC1, LEFT TRIANGLE + 0x8EC8, 0x1731, 0x8CE8, 0x1371, // 0x12, DC2, ARROW UP DOWN + 0x6666, 0x6666, 0x0606, 0x0606, // 0x13, DC3, DOUBLE EXCLAMATION + 0xEBBE, 0xDDDF, 0x0888, 0x0DDD, // 0x14, DC4, PARAGRAPH + 0x6C6C, 0x31C7, 0xE3C6, 0x1313, // 0x15, NAK, ? + 0x0000, 0x0000, 0x0EEE, 0x0777, // 0x16, SYN, HALF SQUARE BOTTOM + 0x8EC8, 0x1731, 0xF8CE, 0xF137, // 0x17, ETB, ARROW UP DOWN UNDERLINED + 0x8EC8, 0x1731, 0x0888, 0x0111, // 0x18, CAN, ARROW UP + 0x8888, 0x1111, 0x08CE, 0x0137, // 0x19, EM, ARROW DOWN + 0xF080, 0x7310, 0x0080, 0x0013, // 0x1A, SUB, ARROW RIGHT + 0xF6C0, 0x7000, 0x00C6, 0x0000, // 0x1B, ESC, ARROW LEFT + 0x3300, 0x0000, 0x00F3, 0x0070, // 0x1C, FS, ? + 0xF640, 0xF620, 0x0046, 0x0026, // 0x1D, GS, ARROW LEFT RIGHT + 0xEC80, 0x7310, 0x00FF, 0x00FF, // 0x1E, RS, TRIANGLE UP + 0xEFF0, 0x7FF0, 0x008C, 0x0013, // 0x1F, US, TRIANGLE DOWN + 0x0000, 0x0000, 0x0000, 0x0000, // 0x20, SPACE + 0xCEEC, 0x0110, 0x0C0C, 0x0000, // 0x21, ! + 0x0666, 0x0333, 0x0000, 0x0000, // 0x22, " + 0x6F66, 0x3733, 0x066F, 0x0337, // 0x23, # + 0xE3EC, 0x1030, 0x0CF0, 0x0013, // 0x24, $ + 0x8330, 0x1360, 0x036C, 0x0660, // 0x25, % + 0xEC6C, 0x6131, 0x0E3B, 0x0633, // 0x26, & + 0x0366, 0x0000, 0x0000, 0x0000, // 0x27, ' + 0x66C8, 0x0001, 0x08C6, 0x0100, // 0x28, ( + 0x88C6, 0x1100, 0x06C8, 0x0001, // 0x29, ) + 0xFC60, 0xF360, 0x006C, 0x0063, // 0x2A, * + 0xFCC0, 0x3000, 0x00CC, 0x0000, // 0x2B, + + 0x0000, 0x0000, 0x6CC0, 0x0000, // 0x2C, , + 0xF000, 0x3000, 0x0000, 0x0000, // 0x2D, - + 0x0000, 0x0000, 0x0CC0, 0x0000, // 0x2E, . + 0xC800, 0x0136, 0x0136, 0x0000, // 0x2F, / + 0xB33E, 0x7763, 0x0E7F, 0x0366, // 0x30, 0 + 0xCCEC, 0x0000, 0x0FCC, 0x0300, // 0x31, 1 + 0xC03E, 0x1331, 0x0F36, 0x0330, // 0x32, 2 + 0xC03E, 0x1331, 0x0E30, 0x0133, // 0x33, 3 + 0x36C8, 0x3333, 0x080F, 0x0737, // 0x34, 4 + 0x0F3F, 0x3103, 0x0E30, 0x0133, // 0x35, 5 + 0xF36C, 0x1001, 0x0E33, 0x0133, // 0x36, 6 + 0x803F, 0x1333, 0x0CCC, 0x0000, // 0x37, 7 + 0xE33E, 0x1331, 0x0E33, 0x0133, // 0x38, 8 + 0xE33E, 0x3331, 0x0E80, 0x0013, // 0x39, 9 + 0x0CC0, 0x0000, 0x0CC0, 0x0000, // 0x3A, : + 0x0CC0, 0x0000, 0x6CC0, 0x0000, // 0x3B, ; + 0x36C8, 0x0001, 0x08C6, 0x0100, // 0x3C, < + 0x0F00, 0x0300, 0x00F0, 0x0030, // 0x3D, = + 0x08C6, 0x3100, 0x06C8, 0x0001, // 0x3E, > + 0x803E, 0x1331, 0x0C0C, 0x0000, // 0x3F, ? + 0xBB3E, 0x7763, 0x0E3B, 0x0107, // 0x40, @ + 0x33EC, 0x3310, 0x033F, 0x0333, // 0x41, A + 0xE66F, 0x3663, 0x0F66, 0x0366, // 0x42, B + 0x336C, 0x0063, 0x0C63, 0x0360, // 0x43, C + 0x666F, 0x6631, 0x0F66, 0x0136, // 0x44, D + 0xE66F, 0x1147, 0x0F66, 0x0741, // 0x45, E + 0xE66F, 0x1147, 0x0F66, 0x0001, // 0x46, F + 0x336C, 0x0063, 0x0C63, 0x0767, // 0x47, G + 0xF333, 0x3333, 0x0333, 0x0333, // 0x48, H + 0xCCCE, 0x0001, 0x0ECC, 0x0100, // 0x49, I + 0x0008, 0x3337, 0x0E33, 0x0133, // 0x4A, J + 0xE667, 0x1366, 0x0766, 0x0663, // 0x4B, K + 0x666F, 0x0000, 0x0F66, 0x0764, // 0x4C, L + 0xFF73, 0x7776, 0x033B, 0x0666, // 0x4D, M + 0xBF73, 0x7666, 0x0333, 0x0667, // 0x4E, N + 0x336C, 0x6631, 0x0C63, 0x0136, // 0x4F, O + 0xE66F, 0x3663, 0x0F66, 0x0000, // 0x50, P + 0x333E, 0x3331, 0x08EB, 0x0313, // 0x51, Q + 0xE66F, 0x3663, 0x0766, 0x0663, // 0x52, R + 0xE73E, 0x0031, 0x0E38, 0x0133, // 0x53, S + 0xCCDF, 0x0023, 0x0ECC, 0x0100, // 0x54, T + 0x3333, 0x3333, 0x0F33, 0x0333, // 0x55, U + 0x3333, 0x3333, 0x0CE3, 0x0013, // 0x56, V + 0xB333, 0x6666, 0x037F, 0x0677, // 0x57, W + 0xC633, 0x1366, 0x036C, 0x0631, // 0x58, X + 0xE333, 0x1333, 0x0ECC, 0x0100, // 0x59, Y + 0x813F, 0x1367, 0x0F6C, 0x0764, // 0x5A, Z + 0x666E, 0x0001, 0x0E66, 0x0100, // 0x5B, [ + 0x8C63, 0x1000, 0x0000, 0x0463, // 0x5C, + 0x888E, 0x1111, 0x0E88, 0x0111, // 0x5D, ] + 0x36C8, 0x6310, 0x0000, 0x0000, // 0x5E, ^ + 0x0000, 0x0000, 0xF000, 0xF000, // 0x5F, _ + 0x08CC, 0x0100, 0x0000, 0x0000, // 0x60, ` + 0x0E00, 0x3100, 0x0E3E, 0x0633, // 0x61, a + 0xE667, 0x3000, 0x0B66, 0x0366, // 0x62, b + 0x3E00, 0x3100, 0x0E33, 0x0130, // 0x63, c + 0xE008, 0x3333, 0x0E33, 0x0633, // 0x64, d + 0x3E00, 0x3100, 0x0E3F, 0x0103, // 0x65, e + 0xF66C, 0x0031, 0x0F66, 0x0000, // 0x66, f + 0x3E00, 0x3600, 0xF0E3, 0x1333, // 0x67, g + 0xE667, 0x6300, 0x0766, 0x0666, // 0x68, h + 0xCE0C, 0x0000, 0x0ECC, 0x0100, // 0x69, i + 0x0000, 0x3303, 0xE330, 0x1333, // 0x6A, j + 0x6667, 0x3600, 0x076E, 0x0631, // 0x6B, k + 0xCCCE, 0x0000, 0x0ECC, 0x0100, // 0x6C, l + 0xF300, 0x7300, 0x03BF, 0x0667, // 0x6D, m + 0x3F00, 0x3100, 0x0333, 0x0333, // 0x6E, n + 0x3E00, 0x3100, 0x0E33, 0x0133, // 0x6F, o + 0x6B00, 0x6300, 0xF6E6, 0x0036, // 0x70, p + 0x3E00, 0x3600, 0x80E3, 0x7333, // 0x71, q + 0xEB00, 0x6300, 0x0F66, 0x0006, // 0x72, r + 0x3E00, 0x0300, 0x0F0E, 0x0131, // 0x73, s + 0xCEC8, 0x0300, 0x08CC, 0x0120, // 0x74, t + 0x3300, 0x3300, 0x0E33, 0x0633, // 0x75, u + 0x3300, 0x3300, 0x0CE3, 0x0013, // 0x76, v + 0xB300, 0x6600, 0x06FF, 0x0377, // 0x77, w + 0x6300, 0x3600, 0x036C, 0x0631, // 0x78, x + 0x3300, 0x3300, 0xF0E3, 0x1333, // 0x79, y + 0x9F00, 0x1300, 0x0F6C, 0x0320, // 0x7A, z + 0x7CC8, 0x0003, 0x08CC, 0x0300, // 0x7B, { + 0x0888, 0x0111, 0x0888, 0x0111, // 0x7C, | + 0x8CC7, 0x3000, 0x07CC, 0x0000, // 0x7D, } + 0x00BE, 0x0036, 0x0000, 0x0000, // 0x7E, ~ + 0x6C80, 0x3100, 0x0F33, 0x0766, // 0x7F, DEL, HOUSE + 0x333E, 0x3031, 0xE08E, 0x1311, // 0x80, Ç + 0x3030, 0x3030, 0x0E33, 0x0733, // 0x81, ü + 0x3E08, 0x3103, 0x0E3F, 0x0103, // 0x82, é + 0x0C3E, 0x63C7, 0x0C6C, 0x0F67, // 0x83, â + 0x0E03, 0x3103, 0x0E3E, 0x0733, // 0x84, ä + 0x0E07, 0x3100, 0x0E3E, 0x0733, // 0x85, à + 0x0ECC, 0x3100, 0x0E3E, 0x0733, // 0x86, å + 0x3E00, 0x0100, 0xC0E3, 0x1310, // 0x87, ç + 0x6C3E, 0x63C7, 0x0C6E, 0x0307, // 0x88, ê + 0x3E03, 0x3103, 0x0E3F, 0x0103, // 0x89, ë + 0x3E07, 0x3100, 0x0E3F, 0x0103, // 0x8A, è + 0xCE03, 0x0003, 0x0ECC, 0x0100, // 0x8B, ï + 0x8C3E, 0x1163, 0x0C88, 0x0311, // 0x8C, î + 0xCE07, 0x0000, 0x0ECC, 0x0100, // 0x8D, ì + 0x36C3, 0x6316, 0x033F, 0x0667, // 0x8E, Ä + 0xE0CC, 0x1000, 0x03F3, 0x0333, // 0x8F, Å + 0x6F08, 0x0303, 0x0F6E, 0x0301, // 0x90, É + 0x0E00, 0x3F00, 0x0E3E, 0x0F3F, // 0x91, æ + 0xF36C, 0x7337, 0x0333, 0x0733, // 0x92, Æ + 0xE03E, 0x1031, 0x0E33, 0x0133, // 0x93, ô + 0xE030, 0x1030, 0x0E33, 0x0133, // 0x94, ö + 0xE070, 0x1000, 0x0E33, 0x0133, // 0x95, ò + 0x303E, 0x3031, 0x0E33, 0x0733, // 0x96, û + 0x3070, 0x3000, 0x0E33, 0x0733, // 0x97, ù + 0x3030, 0x3030, 0xF0E3, 0x1333, // 0x98, ÿ + 0x6C83, 0x631C, 0x08C6, 0x0136, // 0x99, Ö + 0x3303, 0x3303, 0x0E33, 0x0133, // 0x9A, Ü + 0x3E88, 0x0711, 0x88E3, 0x1170, // 0x9B, ¢ + 0xF66C, 0x0231, 0x0F76, 0x0360, // 0x9C, £ + 0xFE33, 0x3133, 0xCCFC, 0x0030, // 0x9D, ¥ + 0xF33F, 0x5331, 0x3333, 0xE6F6, // 0x9E, ₧ + 0xC880, 0x31D7, 0xEB88, 0x0111, // 0x9F, ƒ + 0x0E08, 0x3103, 0x0E3E, 0x0733, // 0xA0, á + 0xCE0C, 0x0001, 0x0ECC, 0x0100, // 0xA1, í + 0xE080, 0x1030, 0x0E33, 0x0133, // 0xA2, ó + 0x3080, 0x3030, 0x0E33, 0x0733, // 0xA3, ú + 0xF0F0, 0x1010, 0x0333, 0x0333, // 0xA4, ñ + 0x730F, 0x3303, 0x03BF, 0x0333, // 0xA5, Ñ + 0xC66C, 0x7333, 0x00E0, 0x0070, // 0xA6, ª + 0xC66C, 0x1331, 0x00E0, 0x0030, // 0xA7, º + 0x6C0C, 0x0000, 0x0E33, 0x0130, // 0xA8, ¿ + 0xF000, 0x3000, 0x0033, 0x0000, // 0xA9, ⌐ + 0xF000, 0x3000, 0x0000, 0x0033, // 0xAA, ¬ + 0xB333, 0x736C, 0x036C, 0xF36C, // 0xAB, ½ + 0xB333, 0xD36C, 0x036C, 0xCFFE, // 0xAC, ¼ + 0x8088, 0x1011, 0x0888, 0x0111, // 0xAD, ¡ + 0x36C0, 0x36C0, 0x00C6, 0x00C6, // 0xAE, « + 0xC630, 0xC630, 0x0036, 0x0036, // 0xAF, » + 0x1414, 0x1414, 0x1414, 0x1414, // 0xB0, ░ + 0x5A5A, 0x5A5A, 0x5A5A, 0x5A5A, // 0xB1, ▒ + 0xBEBE, 0xBEBE, 0xBEBE, 0xBEBE, // 0xB2, ▓ + 0x8888, 0x1111, 0x8888, 0x1111, // 0xB3, │ + 0x8888, 0x1111, 0x888F, 0x1111, // 0xB4, ┤ + 0x8F88, 0x1111, 0x888F, 0x1111, // 0xB5, ╡ + 0xCCCC, 0x6666, 0xCCCF, 0x6666, // 0xB6, ╢ + 0x0000, 0x0000, 0xCCCF, 0x6667, // 0xB7, ╖ + 0x8F00, 0x1100, 0x888F, 0x1111, // 0xB8, ╕ + 0x0FCC, 0x6666, 0xCCCF, 0x6666, // 0xB9, ╣ + 0xCCCC, 0x6666, 0xCCCC, 0x6666, // 0xBA, ║ + 0x0F00, 0x6700, 0xCCCF, 0x6666, // 0xBB, ╗ + 0x0FCC, 0x6666, 0x000F, 0x0007, // 0xBC, ╝ + 0xCCCC, 0x6666, 0x000F, 0x0007, // 0xBD, ╜ + 0x8F88, 0x1111, 0x000F, 0x0001, // 0xBE, ╛ + 0x0000, 0x0000, 0x888F, 0x1111, // 0xBF, ┐ + 0x8888, 0x1111, 0x0008, 0x000F, // 0xC0, └ + 0x8888, 0x1111, 0x000F, 0x000F, // 0xC1, ┴ + 0x0000, 0x0000, 0x888F, 0x111F, // 0xC2, ┬ + 0x8888, 0x1111, 0x8888, 0x111F, // 0xC3, ├ + 0x0000, 0x0000, 0x000F, 0x000F, // 0xC4, ─ + 0x8888, 0x1111, 0x888F, 0x111F, // 0xC5, ┼ + 0x8888, 0x1F11, 0x8888, 0x111F, // 0xC6, ╞ + 0xCCCC, 0x6666, 0xCCCC, 0x666E, // 0xC7, ╟ + 0xCCCC, 0x0E66, 0x000C, 0x000F, // 0xC8, ╚ + 0xCC00, 0x0F00, 0xCCCC, 0x666E, // 0xC9, ╔ + 0x0FCC, 0x0E66, 0x000F, 0x000F, // 0xCA, ╩ + 0x0F00, 0x0F00, 0xCCCF, 0x666E, // 0xCB, ╦ + 0xCCCC, 0x0E66, 0xCCCC, 0x666E, // 0xCC, ╠ + 0x0F00, 0x0F00, 0x000F, 0x000F, // 0xCD, ═ + 0x0FCC, 0x0E66, 0xCCCF, 0x666E, // 0xCE, ╬ + 0x0F88, 0x0F11, 0x000F, 0x000F, // 0xCF, ╧ + 0xCCCC, 0x6666, 0x000F, 0x000F, // 0xD0, ╨ + 0x0F00, 0x0F00, 0x888F, 0x111F, // 0xD1, ╤ + 0x0000, 0x0000, 0xCCCF, 0x666F, // 0xD2, ╥ + 0xCCCC, 0x6666, 0x000C, 0x000F, // 0xD3, ╙ + 0x8888, 0x1F11, 0x0008, 0x000F, // 0xD4, ╘ + 0x8800, 0x1F00, 0x8888, 0x111F, // 0xD5, ╒ + 0x0000, 0x0000, 0xCCCC, 0x666F, // 0xD6, ╓ + 0xCCCC, 0x6666, 0xCCCF, 0x666F, // 0xD7, ╫ + 0x8F88, 0x1F11, 0x888F, 0x111F, // 0xD8, ╪ + 0x8888, 0x1111, 0x000F, 0x0001, // 0xD9, ┘ + 0x0000, 0x0000, 0x8888, 0x111F, // 0xDA, ┌ + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0xDB, █ + 0x0000, 0x0000, 0xFFFF, 0xFFFF, // 0xDC, ▄ + 0xFFFF, 0x0000, 0xFFFF, 0x0000, // 0xDD, ▌ + 0x0000, 0xFFFF, 0x0000, 0xFFFF, // 0xDE, ▐ + 0xFFFF, 0xFFFF, 0x0000, 0x0000, // 0xDF, ▀ + 0xBE00, 0x3600, 0x0EB3, 0x0631, // 0xE0, α + 0xF3E0, 0x1310, 0x33F3, 0x0013, // 0xE1, ß + 0x33F0, 0x0330, 0x0333, 0x0000, // 0xE2, Γ + 0x66F0, 0x3370, 0x0666, 0x0333, // 0xE3, π + 0xC63F, 0x0033, 0x0F36, 0x0330, // 0xE4, Σ + 0xBE00, 0x1700, 0x0EBB, 0x0011, // 0xE5, σ + 0x6660, 0x6660, 0x36E6, 0x0036, // 0xE6, µ + 0x8BE0, 0x1360, 0x0888, 0x0111, // 0xE7, τ + 0x3ECF, 0x3103, 0xFCE3, 0x3013, // 0xE8, Φ + 0xF36C, 0x7631, 0x0C63, 0x0136, // 0xE9, Θ + 0x336C, 0x6631, 0x0766, 0x0733, // 0xEA, Ω + 0xE8C8, 0x3103, 0x0E33, 0x0133, // 0xEB, δ + 0xBE00, 0xD700, 0x00EB, 0x007D, // 0xEC, ∞ + 0xBE00, 0xD736, 0x36EB, 0x007D, // 0xED, φ + 0xF36C, 0x1001, 0x0C63, 0x0100, // 0xEE, ε + 0x333E, 0x3331, 0x0333, 0x0333, // 0xEF, ∩ + 0xF0F0, 0x3030, 0x00F0, 0x0030, // 0xF0, ≡ + 0xCFCC, 0x0300, 0x0F0C, 0x0300, // 0xF1, ± + 0xC8C6, 0x0100, 0x0F06, 0x0300, // 0xF2, ≥ + 0xC6C8, 0x0001, 0x0F08, 0x0301, // 0xF3, ≤ + 0x8880, 0x1DD7, 0x8888, 0x1111, // 0xF4, ⌠ + 0x8888, 0x1111, 0xEBB8, 0x0111, // 0xF5, ⌡ + 0xF0CC, 0x3000, 0x0CC0, 0x0000, // 0xF6, ÷ + 0x0BE0, 0x0360, 0x00BE, 0x0036, // 0xF7, ≈ + 0xC66C, 0x1331, 0x0000, 0x0000, // 0xF8, ° + 0x8000, 0x1000, 0x0008, 0x0001, // 0xF9, ∙ + 0x0000, 0x0000, 0x0008, 0x0001, // 0xFA, · + 0x0000, 0x333F, 0x8C67, 0x3333, // 0xFB, √ + 0x666E, 0x3331, 0x0006, 0x0003, // 0xFC, ⁿ + 0x6C8E, 0x0010, 0x000E, 0x0001, // 0xFD, ² + 0xCC00, 0x3300, 0x00CC, 0x0033, // 0xFE, ■ + 0x0000, 0x0000, 0x0000, 0x0000, // 0xFF, NBSP +}; + +const int charsets[] = { + 0x30, 10, // NUMBERS + 0x41, 26, // UPPERCASE LETTERS + 0x61, 26, // LOWERCASE LETTERS + 0x01, 15, // SYMBOLS + 0x18, 4, // ARROWS + 0xB3, 40, // BARS + 0xE0, 16, // GREEK + 0x80, 28, // ACCENTS + 0xB0, 3, // SHADES +}; + +#define CHARSETS 8 + +const int hex_chars[] = { + 0x30, + 0x31, + 0x32, + 0x33, + 0x34, + 0x35, + 0x36, + 0x37, + 0x38, + 0x39, + 0x41, + 0x42, + 0x43, + 0x44, + 0x45, + 0x46, +}; + +bool char(vec2 pos, int code) +{ + if (pos.x < 0.0 || pos.y < 0.0 || pos.x >= 1.0 || pos.y >= 1.0) { + return false; + } + ivec2 pos2 = ivec2(pos.x * 8.0, (1 - pos.y) * 8.0); + ivec2 subpos = pos2 % 4; + int v = int(pow(2, subpos.y * 4 + subpos.x)); + int d = int(pos2.y * 0.25) * 2 + int(pos2.x * 0.25); + return (cp437[code * 4 + d] & v) > 0; +} + +float char_at(vec2 uv, vec2 pos, int code) +{ + return char(uv - pos, code) ? 1 : 0; +} + +float write_5(vec2 uv, vec2 pos, int str[5]) +{ + float d = 0; + int i; + + for (i = 0; i < 5; i++) { + if (str[i] == 0) { + return d; + } + + d += char_at(uv, pos + vec2(i, 0), str[i]); + } + + return d; +} + +float write_10(vec2 uv, vec2 pos, int str[10]) +{ + float d = 0; + int i; + + for (i = 0; i < 10; i++) { + if (str[i] == 0) { + return d; + } + + d += char_at(uv, pos + vec2(i, 0), str[i]); + } + + return d; +} + +float write_20(vec2 uv, vec2 pos, int str[20]) +{ + float d = 0; + int i; + + for (i = 0; i < 20; i++) { + if (str[i] == 0) { + return d; + } + + d += char_at(uv, pos + vec2(i, 0), str[i]); + } + + return d; +} + +float write_int(vec2 uv, vec2 pos, uint value, uint magnitude) +{ + int i; + uint m = 1; + float d = 0; + for (i = 0; i < magnitude; i++) { + if (i == 0 || value >= m) { + d += char_at(uv, pos + vec2(magnitude - i - 1, 0), int(0x30 + (value % (m * 10u)) / m)); + m *= 10u; + } + } + return d; +} + +int read(sampler2D tex, vec2 uv, float k, int d, float t) +{ + float inv_k = 1 / k; + vec2 tex_uv = floor(uv * k) * inv_k; + tex_uv += vec2(d % 2, floor(d * 0.5)) * 0.5 * inv_k; + return + ((mean(reframe(tex, tex_uv + vec2(0, 3) * inv_k * 0.125)) > t) ? 1 : 0) + + ((mean(reframe(tex, tex_uv + vec2(0, 2) * inv_k * 0.125)) > t) ? 2 : 0) + + ((mean(reframe(tex, tex_uv + vec2(0, 1) * inv_k * 0.125)) > t) ? 4 : 0) + + ((mean(reframe(tex, tex_uv + vec2(0, 0) * inv_k * 0.125)) > t) ? 8 : 0) + + ((mean(reframe(tex, tex_uv + vec2(1, 3) * inv_k * 0.125)) > t) ? 16 : 0) + + ((mean(reframe(tex, tex_uv + vec2(1, 2) * inv_k * 0.125)) > t) ? 32 : 0) + + ((mean(reframe(tex, tex_uv + vec2(1, 1) * inv_k * 0.125)) > t) ? 64 : 0) + + ((mean(reframe(tex, tex_uv + vec2(1, 0) * inv_k * 0.125)) > t) ? 128 : 0) + + ((mean(reframe(tex, tex_uv + vec2(2, 3) * inv_k * 0.125)) > t) ? 256 : 0) + + ((mean(reframe(tex, tex_uv + vec2(2, 2) * inv_k * 0.125)) > t) ? 512 : 0) + + ((mean(reframe(tex, tex_uv + vec2(2, 1) * inv_k * 0.125)) > t) ? 1024 : 0) + + ((mean(reframe(tex, tex_uv + vec2(2, 0) * inv_k * 0.125)) > t) ? 2048 : 0) + + ((mean(reframe(tex, tex_uv + vec2(3, 3) * inv_k * 0.125)) > t) ? 4096 : 0) + + ((mean(reframe(tex, tex_uv + vec2(3, 2) * inv_k * 0.125)) > t) ? 8192 : 0) + + ((mean(reframe(tex, tex_uv + vec2(3, 1) * inv_k * 0.125)) > t) ? 16384 : 0) + + ((mean(reframe(tex, tex_uv + vec2(3, 0) * inv_k * 0.125)) > t) ? 32768 : 0); +} + +// https://web.archive.org/web/20151229003112/http://blogs.msdn.com/b/jeuge/archive/2005/06/08/hakmem-bit-count.aspx +int bit_count(int u) +{ + int c; + c = u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111); + return ((c + (c >> 3)) & 030707070707) % 63; +} + +int guess_char(sampler2D tex, vec2 uv, float k, float t) +{ + int b0 = read(tex, uv, k, 0, t); + int b1 = read(tex, uv, k, 1, t); + int b2 = read(tex, uv, k, 2, t); + int b3 = read(tex, uv, k, 3, t); + + int mc = 0; + int mb = 100; + int i; + int b; + + for (i = 0x01; i <= 0xFF; i++) { + if (i == 0x20 || i == 0xff || i == 0xDB) { + continue; + } + b = bit_count(cp437[i * 4] ^ b0) + bit_count(cp437[i * 4 + 1] ^ b1) + bit_count(cp437[i * 4 + 2] ^ b2) + + bit_count(cp437[i * 4 + 3] ^ b3); + if (b < mb) { + mb = b; + mc = i; + } + } + + return mc; +} + +#endif \ No newline at end of file diff --git a/default/inc_debug.glsl b/default/inc_debug.glsl new file mode 100644 index 0000000..cee4291 --- /dev/null +++ b/default/inc_debug.glsl @@ -0,0 +1,200 @@ +#include inc_magic.glsl +#include inc_functions.glsl +#include inc_yuv.glsl +#include inc_cp437.glsl + +#ifndef INC_DEBUG +#define INC_DEBUG + +uniform int iFPS; + +uniform vec2 iInputResolution1; +uniform vec2 iInputResolution2; +uniform int iInputFormat1; +uniform int iInputFormat2; + +uniform int iAutoRand; +uniform int iPage; +uniform int iSelected; + +uniform int iSeed1; +uniform int iSeed2; +uniform int iSeed3; +uniform int iSeed4; +uniform int iSeed5; +uniform int iSeed6; +uniform int iSeed7; +uniform int iSeed8; + +uniform int iState3; +uniform int iState4; +uniform int iState5; +uniform int iState6; +uniform int iState8; + +uniform int iActive1; +uniform int iActive2; + +uniform vec3 iMidi2_1[7]; +uniform vec3 iMidi2_2[7]; +uniform vec3 iMidi2_3[7]; +uniform vec3 iMidi3_1[2]; + + +vec4 debug(vec2 vUV) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // inputs + + int selected_srca = iState3 - 1; + int selected_srcb = iState4 - 1; + int selected_fxa = iState5 - 1; + int selected_fxb = iState6 - 1; + int selected_mfx = iState8 - 1; + float fxa_value = magic(iMidi2_1[6].xy, vec3(1, 0, 0), iSeed5); + bool fxa_invert = magic_trigger(vec3(iMidi2_1[6].z, 0, 0), iSeed5); + float fxb_value = magic(iMidi2_2[6].xy, vec3(1, 0, 0), iSeed6); + bool fxb_invert = magic_trigger(vec3(iMidi2_2[6].z, 0, 0), iSeed6); + float mfx_value = magic(iMidi2_3[6].xy, vec3(1, 0, 0), iSeed8); + bool mfx_invert = magic_trigger(vec3(iMidi2_3[6].z, 0, 0), iSeed8); + float mix_value = magic(iMidi3_1[1].xy, vec3(1, 0, 0), iSeed7); + bool mix_type = magic_trigger(vec3(iMidi3_1[0].x, 0, 0), iSeed7 + 10); + + // logic + + const int texts[6][5] = { + {0x46, 0x50, 0x53, 0x00, 0x00}, // FPS + {0x54, 0x45, 0x4D, 0x50, 0x4F}, // TEMPO + {0x54, 0x49, 0x4D, 0x45, 0x00}, // TIME + {0x44, 0x45, 0x4D, 0x4F, 0x00}, // DEMO + {0x4C, 0x49, 0x56, 0x45, 0x00}, // LIVE + {0x2B, 0x52, 0x41, 0x4E, 0x44}, // +RAND + }; + + vec2 uv2 = uv1; + + uv2 *= 10; + uv2.x -= 0.5; + uv2.y += 0.5; + + vec2 uv3 = uv1 * 30; + + // base frame + float f = + h_rect(uv2, vec2(-5, -2), vec2(1), 0.1) + + h_rect(uv2, vec2(-2, -2), vec2(1), 0.1) + + rect(uv2, vec2(-3.5, -2), vec2(0.5, 0.1)) + + h_rect(uv2, vec2(-5, 2), vec2(1), 0.1) + + h_rect(uv2, vec2(-2, 2), vec2(1), 0.1) + + rect(uv2, vec2(-3.5, 2), vec2(0.5, 0.1)) + + h_rect(uv2, vec2(2, 0), vec2(1), 0.1) + + h_rect(uv2, vec2(5, 0), vec2(1), 0.1) + + rect(uv2, vec2(3.5, 0), vec2(0.5, 0.1)) + + rect(uv2, vec2(0.55, -2), vec2(1.5, 0.1)) + + rect(uv2, vec2(2, -1.55), vec2(0.1, 0.55)) + + rect(uv2, vec2(0.55, 2), vec2(1.5, 0.1)) + + rect(uv2, vec2(2, 1.55), vec2(0.1, 0.55)) + + rect(uv2, vec2(7.5, 0), vec2(1.5, 0.1)) + + h_rect(uv2, vec2(-9, -3.9), vec2(1), 0.1); + + // show selected src/fx + f += char_at(uv2, vec2(-5.4, 1.45), hex_chars[selected_srca]); + f += char_at(uv2, vec2(-5.4, -2.55), hex_chars[selected_srcb]); + f += char_at(uv2, vec2(-2.4, 1.45), hex_chars[selected_fxa]); + f += fxa_invert ? rect(uv2, vec2(-2, 2.7), vec2(0.5, 0.05)) : 0; + f += char_at(uv2, vec2(-2.4, -2.55), hex_chars[selected_fxb]); + f += fxb_invert ? rect(uv2, vec2(-2, -1.3), vec2(0.5, 0.05)) : 0; + f += char_at(uv2, vec2(4.6, -0.55), hex_chars[selected_mfx]); + f += mfx_invert ? rect(uv2, vec2(5, 0.7), vec2(0.5, 0.05)) : 0; + + // show current selected + f += iSelected == 3 ? h_rect(uv2, vec2(-5, 2), vec2(1.2), 0.1) : 0; + f += iSelected == 4 ? h_rect(uv2, vec2(-5, -2), vec2(1.2), 0.1) : 0; + f += iSelected == 5 ? h_rect(uv2, vec2(-2, 2), vec2(1.2), 0.1) : 0; + f += iSelected == 6 ? h_rect(uv2, vec2(-2, -2), vec2(1.2), 0.1) : 0; + f += iSelected == 8 ? h_rect(uv2, vec2(5, 0), vec2(1.2), 0.1) : 0; + + // show selected src/fx + f += iActive1 == 1 ? h_rect(uv2, vec2(-5, 0.8), vec2(1, 0), 0.1) : 0; + f += iActive1 == 2 ? h_rect(uv2, vec2(-5, -3.2), vec2(1, 0), 0.1) : 0; + f += iActive2 == 1 ? h_rect(uv2, vec2(-2, 0.8), vec2(1.2, 0), 0.1) : 0; + f += iActive2 == 2 ? h_rect(uv2, vec2(-2, -3.2), vec2(1, 0), 0.1) : 0; + f += iActive2 == 3 ? h_rect(uv2, vec2(5, -1.2), vec2(1, 0), 0.1) : 0; + + // show inputs / feedback + float line_a_a = rect(uv2, vec2(-8, 2), vec2(2, 0.1)); + float line_a_b = rect(uv2, vec2(-7, 2), vec2(1, 0.1)) + rect(uv2, vec2(-8, 0.5), vec2(0.1, 1.6)) + rect(uv2, vec2(-9, -1), vec2(1, 0.1)); + float line_a_f = rect(uv2, vec2(-6.5, 2), vec2(0.5, 0.1)) + rect(uv2, vec2(0, 4), vec2(7, 0.1)) + rect(uv2, vec2(-7, 3), vec2(0.1, 1.1)) + rect(uv2, vec2(7, 2), vec2(0.1, 2.1)); + if (selected_srca == 5 && iInputFormat1 == YUYV_FOURCC) { + f += iInputResolution1.x > 0 ? line_a_a : line_a_f; + } else if (selected_srca == 10 && iInputFormat2 == YUYV_FOURCC) { + f += iInputResolution2.x > 0 ? line_a_b : line_a_f; + } else if (selected_srca % 5 == 0) { + f += line_a_f; + } + float line_b_a = rect(uv2, vec2(-6.5, -2), vec2(0.5, 0.1)) + rect(uv2, vec2(-7, -0.5), vec2(0.1, 1.6)) + rect(uv2, vec2(-8.5, 1), vec2(1.5, 0.1)); + float line_b_b = rect(uv2, vec2(-8, -2), vec2(2, 0.1)); + float line_b_f = rect(uv2, vec2(-6.5, -2), vec2(0.5, 0.1)) + rect(uv2, vec2(0, -4), vec2(7, 0.1)) + rect(uv2, vec2(-7, -3), vec2(0.1, 1.1)) + rect(uv2, vec2(7, -2), vec2(0.1, 2.1)); + if (selected_srcb == 5 && iInputFormat1 == YUYV_FOURCC) { + f += iInputResolution1.x > 0 ? line_b_a : line_b_f; + } else if (selected_srcb == 10 && iInputFormat2 == YUYV_FOURCC) { + f += iInputResolution2.x > 0 ? line_b_b : line_b_f; + } else if (selected_srcb % 5 == 0) { + f += line_b_f; + } + + // show page + f += char_at(uv2, vec2(-9.2, -4.3), hex_chars[iPage]); + + // show fx values + float fx_rect = 0; + + f = mix(f, 1 - f, rect(uv2, vec2(-2, 1.1 + 0.9 * fxa_value), vec2(0.9, 0.9 * fxa_value))); + f = mix(f, 1 - f, rect(uv2, vec2(-2, -2.9 + 0.9 * fxb_value), vec2(0.9, 0.9 * fxb_value))); + f = mix(f, 1 - f, rect(uv2, vec2(5, -0.9 + 0.9 * mfx_value), vec2(0.9, 0.9 * mfx_value))); + + // show mix + f += char_at(uv2, vec2(1.55, -0.6), mix_type ? 0x4B : 0x4D); + f = mix(f, 1 - f, rect(uv2, vec2(2, -0.9 + 0.9 * mix_value), vec2(0.9, 0.9 * mix_value))); + + // show debug info + float v = 0; + float x = 0; + + x = -15; + f += write_5(uv3, vec2(x,13), texts[0]); + f += write_int(uv3, vec2(x - 3.5,13), iFPS, 3); + v = min(1, iFPS/60.0); + f += h_rect(uv3, vec2(x, 12), vec2(4, 0.5), 0.2); + f += rect(uv3, vec2(x + 4 * v - 4, 12), vec2(4 * v, 0.4)); + + x = 0; + f += write_5(uv3, vec2(x,13), texts[1]); + f += write_int(uv3, vec2(x - 3.5,13), int(iTempo), 3); + v = fract(iBeats); + f += h_rect(uv3, vec2(x, 12), vec2(4, 0.5), 0.2); + f += rect(uv3, vec2(x + 4 * v - 4, 12), vec2(4 * v, 0.4)); + + x = 15; + f += write_5(uv3, vec2(x,13), texts[2]); + f += write_int(uv3, vec2(x - 5.5,13), int(iTime), 5); + v = fract(iTime); + f += h_rect(uv3, vec2(x, 12), vec2(4, 0.5), 0.2); + f += rect(uv3, vec2(x + 4 * v - 4, 12), vec2(4 * v, 0.4)); + + if (iAutoRand > 0) { + f += write_5(uv3, vec2(-4,-15), iDemo > 0 ? texts[3] : texts[4]); + f += write_5(uv3, vec2(0,-15), texts[5]); + } else { + f += write_5(uv3, vec2(-2,-15), iDemo > 0 ? texts[3] : texts[4]); + } + + return vec4(f); +} + +#endif \ No newline at end of file diff --git a/default/inc_functions.glsl b/default/inc_functions.glsl new file mode 100644 index 0000000..30f0d46 --- /dev/null +++ b/default/inc_functions.glsl @@ -0,0 +1,286 @@ +#ifndef PI +#define PI 3.1415927 +#endif + +#include inc_res.glsl + +#ifndef INC_FUNCTIONS +#define INC_FUNCTIONS + +// BASICS + +float ease(float x) { + return 0.5 - cos(max(min(x, 1.0), 0.0)*PI) * 0.5; +} + +vec2 ease(vec2 x) { + return 0.5 - cos(max(min(x, 1.0), 0.0)*PI) * 0.5; +} + +vec3 ease(vec3 x) { + return 0.5 - cos(max(min(x, 1.0), 0.0)*PI) * 0.5; +} + +float saw(float x){ + return abs(mod(x+1,2)-1); +} + +vec2 saw(vec2 x){ + return abs(mod(x+1,2)-1); +} + +vec3 saw(vec3 x){ + return abs(mod(x+1,2)-1); +} + +float cmod(float x, float k){ + return mod(x + k * 0.5, k) - k * 0.5; +} + +vec2 cmod(vec2 x, float k){ + return mod(x + k * 0.5, k) - k * 0.5; +} + +vec3 cmod(vec3 x, float k){ + return mod(x + k * 0.5, k) - k * 0.5; +} + +// COLORS + +vec3 col(float x){ + return vec3( + .5*(sin(x*2.*PI)+1.), + .5*(sin(x*2.*PI+2.*PI/3.)+1.), + .5*(sin(x*2.*PI-2.*PI/3.)+1.) + ); +} + +vec3 shift(vec3 c, float f) { + return vec3( + c.x * (1 - f) + c.y * f, + c.y * (1 - f) + c.z * f, + c.z * (1 - f) + c.x * f + ); +} + +vec3 shift3(vec3 c, float f) { + return shift(shift(shift(c, f), f), f); +} + +float mean(vec3 v) +{ + return v.x * 0.3333 + v.y * 0.3333 + v.z * 0.3333; +} + +float mean(vec4 v) +{ + return v.x * 0.3333 + v.y * 0.3333 + v.z * 0.3333; +} + +// OTHER + +mat2 rot(float angle){ + return mat2( + cos(angle*2.*PI),-sin(angle*2.*PI), + sin(angle*2.*PI),cos(angle*2.*PI) + ); +} + +// EFFECTS + +vec2 lens(vec2 uv, float limit, float power) { + return uv * (1 + limit + length(uv * power)); +} + +vec2 kal(vec2 uv, float n) { + float t = atan(uv.y, uv.x) + PI * 0.5; + float q = 3.0 / (2.0 * PI); + t = abs(mod(t + PI / (n), 2 * PI / n) - PI / (n)); + return length(uv) * vec2( + cos(t), + sin(t) + ); +} + +vec2 kal2(vec2 uv, float n) { + float t = atan(uv.y, uv.x) + PI * 0.5; + float t2 = abs(mod(t + PI / n, 2 * PI / n) - PI / n); + return length(uv) * vec2( + cos(t2), + sin(t2) + ); +} + +// NOISE + +float noise(vec2 n) +{ + const vec2 d = vec2(0, 1); + vec2 b = floor(n); + vec2 f = fract(n); + f *= f * (3 - 2 * f); + return mix(mix(rand(b), rand(b + d.yx), f.x), mix(rand(b + d.xy), rand(b + d.yy), f.x), f.y); +} + +float noise_f(vec2 n, int f) +{ + float o = noise(n) / 2; + o += mix(o, noise(n * 2), f > 1 ? 1 : 0) / 4; + o += mix(o, noise(n * 4), f > 2 ? 1 : 0) / 8; + o += mix(o, noise(n * 8), f > 3 ? 1 : 0) / 16; + o += mix(o, noise(n * 16), f > 4 ? 1 : 0) / 32; + return o; +} + +// VORONOI + +float v_index(vec2 uv) { + return floor(uv.x) + floor(uv.y) * 45; +} + +vec2 v_pos(float i) { + int iTimeId = int(iBeats); + float iTimeV = iBeats - iTimeId; + + float x0 = rand(i + 823 + iTimeId); + float y0 = rand(i + 328 + iTimeId); + + float x1 = rand(i + 823 + iTimeId + 1); + float y1 = rand(i + 328 + iTimeId + 1); + + return vec2( + mix(x0, x1, ease(ease(iTimeV))), + mix(y0, y1, ease(ease(iTimeV))) + ); +} + +vec4 voronoi(vec2 uv, float dist) { + vec4 o = vec4(0, 0, 2, 0); + vec4 t = vec4(0, 0, 2, 0); + float d, i; + vec2 uv2, p; + for (int dx = -1; dx <= 1; dx++) { + for (int dy = -1; dy <= 1; dy++) { + uv2 = vec2(floor(uv.x) + dx, floor(uv.y) + dy); + i = v_index(uv2); + p = uv2 + v_pos(i) * dist; + d = length(p - uv); + if (d < o.z) { + t = o; + o = vec4(p, d, i); + } else if (d < t.z) { + t = vec4(p, d, i); + } + } + } + return vec4(o.z, t.z, o.w, t.w); +} + +// SHAPES + +float stripe(float x, float k1, float k2) +{ + return k2 > k1 ? (1 - step(x, k1)) * (step(x, k2)) : ((1 - step(x, k2)) * (step(x, k1))); +} + +float capsule(vec2 uv, float r, float d, float a) +{ + uv *= rot(a); + float f1 = step(uv.x, r) * step(-uv.x, r) * step(uv.y, d - r) * step(-uv.y, d - r); + float f2 = step(length(uv - vec2(0, d - r)), r); + float f3 = step(length(uv + vec2(0, d - r)), r); + return min(1, f1 + f2 + f3); +} + +float rect(vec2 uv, vec2 c, vec2 size) { + uv -= c; + return step(abs(uv.x), size.x) * step(abs(uv.y), size.y); +} + +float h_rect(vec2 uv, vec2 c, vec2 size, float k) { + return rect(uv, c, size + k * 0.5) - rect(uv, c, size - k * 0.5); +} + +// INPUTS + +vec4 reframe(sampler2D tex, vec2 uv) +{ + uv = uv * vec2(iResolution.y / iResolution.x, 1) + .5; + uv = saw(uv); + return texture(tex, uv); +} + +vec4 reframe_b(sampler2D tex, vec2 uv) +{ + uv = uv * vec2(iResolution.y / iResolution.x, 1) + .5; + return texture(tex, uv); +} + +// BLUR + +float gaussian_weight(float x, float sigma) +{ + return exp(-(x * x) / (2.0 * sigma * sigma)); +} + +vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size, float spm, float sigma, float bloom) +{ + int x, y; + vec2 offset; + float w; + vec4 sum = vec4(0); + float weight_sum = 0; + for (y = -kernel_size; y <= kernel_size; ++y) { + for (x = -kernel_size; x <= kernel_size; ++x) { + offset = vec2(x, y) * spm; + w = gaussian_weight(length(vec2(x, y)), sigma); + sum += texture(tex, uv + offset) * w; + weight_sum += w; + } + } + return (sum / weight_sum) * bloom; +} + +vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size, float spm, float sigma) +{ + return gauss(tex, uv, kernel_size, spm, sigma, 1.0); +} + +vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size, float spm) +{ + return gauss(tex, uv, kernel_size, spm, 2.0); +} + +vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size) +{ + return gauss(tex, uv, kernel_size, 1 / max(iResolution.x, iResolution.y)); +} + +vec4 gauss(sampler2D tex, vec2 uv) +{ + return gauss(tex, uv, 3); +} + +float dither(vec2 uv, float x) +{ + bool o = false; + o = o || x * 16 >= 1 && floor(mod(uv.x, 4)) == 0 && floor(mod(uv.y, 4)) == 0; + o = o || x * 16 >= 2 && floor(mod(uv.x, 4)) == 2 && floor(mod(uv.y, 4)) == 2; + o = o || x * 16 >= 3 && floor(mod(uv.x, 4)) == 0 && floor(mod(uv.y, 4)) == 2; + o = o || x * 16 >= 4 && floor(mod(uv.x, 4)) == 2 && floor(mod(uv.y, 4)) == 0; + o = o || x * 16 >= 5 && floor(mod(uv.x, 4)) == 1 && floor(mod(uv.y, 4)) == 1; + o = o || x * 16 >= 6 && floor(mod(uv.x, 4)) == 3 && floor(mod(uv.y, 4)) == 3; + o = o || x * 16 >= 7 && floor(mod(uv.x, 4)) == 1 && floor(mod(uv.y, 4)) == 3; + o = o || x * 16 >= 8 && floor(mod(uv.x, 4)) == 3 && floor(mod(uv.y, 4)) == 1; + o = o || x * 16 >= 9 && floor(mod(uv.x, 4)) == 1 && floor(mod(uv.y, 4)) == 0; + o = o || x * 16 >= 10 && floor(mod(uv.x, 4)) == 3 && floor(mod(uv.y, 4)) == 2; + o = o || x * 16 >= 11 && floor(mod(uv.x, 4)) == 1 && floor(mod(uv.y, 4)) == 2; + o = o || x * 16 >= 12 && floor(mod(uv.x, 4)) == 3 && floor(mod(uv.y, 4)) == 0; + o = o || x * 16 >= 13 && floor(mod(uv.x, 4)) == 0 && floor(mod(uv.y, 4)) == 1; + o = o || x * 16 >= 14 && floor(mod(uv.x, 4)) == 2 && floor(mod(uv.y, 4)) == 3; + o = o || x * 16 >= 15 && floor(mod(uv.x, 4)) == 0 && floor(mod(uv.y, 4)) == 3; + o = o || x * 16 >= 16 && floor(mod(uv.x, 4)) == 2 && floor(mod(uv.y, 4)) == 1; + return o ? 1 : 0; +} + +#endif diff --git a/default/inc_fx.glsl b/default/inc_fx.glsl new file mode 100644 index 0000000..57120a7 --- /dev/null +++ b/default/inc_fx.glsl @@ -0,0 +1,418 @@ +#include inc_res.glsl +#include inc_magic.glsl +#include inc_functions.glsl + +#ifndef INC_FX +#define INC_FX + +vec4 fx_master(vec3 c0, vec3 c, int seed, vec3 m0) { + float fx = magic(m0.xy, vec3(1,0,0), seed); + bool invert = magic_trigger(vec3(m0.z, 0, 0), seed); + + vec3 c_out = mix(c0, c, fx); + + c_out = mix(c_out, 1 - c_out, invert ? 1 : 0); + + return vec4(c_out, 1.0); +} + +subroutine vec4 fx_stage_sub(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0); + +subroutine uniform fx_stage_sub fx_stage; + +// FX 1 : thru +subroutine(fx_stage_sub) vec4 fx_1(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + // start + + vec2 uv0 = vUV.st; + + // controls + + float hue = magic(f1, b1, seed + 10); + float saturation = magic(f2, b2, seed + 20); + float light = magic(f3, b3, seed + 30); + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + vec3 c = c0; + c = shift3(c, hue); + c *= 1 + saturation; + c = mix(c + light * 2.0, c - (1 - light) * 2.0, step(0.5, light)); + + return fx_master(c0, c, seed, m0); +} + +// FX 2 : feedback + shift +vec4 fx_shift(vec2 vUV, sampler2D src0, sampler2D src1, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float zoom = magic(f1, b1, seed + 10); + float x_shift = magic(f2, b2, seed + 20); + float y_shift = magic(f3, b3, seed + 30); + + // logic + + vec3 c0 = texture(src0, uv0).xyz; + + vec2 uv2 = uv1; + uv2 = mix(uv2 * (1 + zoom * 2), uv2 * (zoom), step(0.5, zoom)); + uv2 += vec2(x_shift * ratio, y_shift) * 2; + vec3 c = reframe(src1, uv2).xyz; + + return fx_master(c0, c, seed, m0); +} + +subroutine(fx_stage_sub) vec4 fx_2(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + return fx_shift(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); +} + +// FX 3 : shift +subroutine(fx_stage_sub) vec4 fx_3(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + return fx_shift(vUV, previous, previous, seed, b1, f1, b2, f2, b3, f3, m0); +} + +// FX 4 : colorize +subroutine(fx_stage_sub) vec4 fx_4(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + // start + + vec2 uv0 = vUV.st; + + // controls + + float c_black = magic(f1, b1, seed + 10); + bool c_black_trigger = magic_trigger(b1, seed + 10); + float c_white = magic(f2, b2, seed + 20); + bool c_white_trigger = magic_trigger(b2, seed + 20); + float delta = magic(f3, b3, seed + 30); + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + + float f = mean(c0); + float c_mix = mix(c_black, c_white, f) + delta; + vec3 c = mix(c_black_trigger ? col(c_mix) : vec3(0), c_white_trigger ? col(c_mix) : vec3(1), f); + + return fx_master(c0, c, seed, m0); +} + +// FX 5 : quantize +subroutine(fx_stage_sub) vec4 fx_5(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float pixel_size = magic(f1, b1, seed + 10); + float quantize = magic(f2, b2, seed + 20); + bool quantize_trigger = magic_trigger(b2, seed + 20); + float blur = magic(f3, b3, seed + 30); + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + + vec2 uv2 = uv1; + float pixel = (1 - pixel_size) * 250 + 25; + uv2 = round(uv2 * pixel) / pixel; + vec3 c = gauss(previous, uv2 * vec2(1 / ratio, 1) + .5, 3, 0.005 * blur).xyz; + float colors = (1 - quantize) * 10 + 1; + if (quantize_trigger) { + c = round(c * colors) / colors; + } + // c = mix(c, 1 - c, step(noise_f(uv0 * 10 + vec2(iTime * 0.1, 0), 5), 0.5)); + + return fx_master(c0, c, seed, m0); +} + +// FX 6 : dithering +subroutine(fx_stage_sub) vec4 fx_6(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float pixel_size = magic(f1, b1, seed + 10); + bool pixel_size_trigger = magic_trigger(b1, seed + 10); + float quantize = magic(f2, b2, seed + 20); + bool quantize_trigger = magic_trigger(b2, seed + 20); + float blur = magic(f3, b3, seed + 30); + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + + vec2 uv2 = uv1; + float k1 = pow(2, 10 - floor(pixel_size * 5)); + float pixel = (1 - pixel_size) * 250 + 25; + if (pixel_size_trigger) { + uv2 = floor(uv2 * k1) / k1; + } + vec3 c = gauss(previous, uv2 * vec2(1 / ratio, 1) + .5, 3, 0.005 * blur).xyz; + float k3 = pow(2, 5 - floor(quantize * 5)); + if (quantize_trigger) { + c *= k3; + c = vec3( + mix(floor(c.x), ceil(c.x), dither(uv2 * k1, c.x - floor(c.x))), + mix(floor(c.y), ceil(c.y), dither(uv2 * k1, c.y - floor(c.y))), + mix(floor(c.z), ceil(c.z), dither(uv2 * k1, c.z - floor(c.z))) + ); + c /= k3; + } + + return fx_master(c0, c, seed, m0); +} + +// FX 7 : tv +subroutine(fx_stage_sub) vec4 fx_7(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float lens_v = magic(f1, b1, seed + 10); + float horizontal_noise = magic(f2, b2, seed + 20); + float zoom = magic(f3, b3, seed + 30); + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + + vec2 uv2 = uv1; + float k1 = lens_v * 0.5; + uv2 *= 1 + zoom * 2; + uv2 = lens(uv2, -k1, k1); + float k = horizontal_noise; + vec3 c = vec3( + reframe_b(previous, uv2 + vec2((rand(uv0.y * 1000 + iTime) - 0.5) * k * 0.1)).x, + reframe_b(previous, uv2 + vec2((rand(uv0.y * 1100 + iTime) - 0.5) * k * 0.1)).y, + reframe_b(previous, uv2).z + ); + + return fx_master(c0, c, seed, m0); +} + +// FX 8 : kaleidoscope +subroutine(fx_stage_sub) vec4 fx_8(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float axes = magic(f1, b1, seed + 10); + float axes_trigger = magic_b(b1, seed + 10).x; + float rotation = magic(f2, b2, seed + 20); + float h_scroll = magic(f3, b3, seed + 30); + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + + vec2 uv2 = uv1; + uv2 = mix(uv2, kal2(uv2 * rot(0.25), floor(axes * 9 + 1)) * vec2(1, -2) + vec2(0, -0.5), axes_trigger); + uv2 *= rot(rotation); + uv2.x = (saw(uv2.x / ratio + 0.5 + h_scroll * 2) - 0.5) * ratio; + vec3 c = reframe(previous, uv2).xyz; + + return fx_master(c0, c, seed, m0); +} + +#include inc_cp437.glsl + +// FX 9 : cp437 +subroutine(fx_stage_sub) vec4 fx_9(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float zoom = magic(f1, b1, seed + 10); + vec2 charset = magic_f(f2, b2, seed + 20); + vec3 charset_ctrl = magic_b(b2, seed + 20); + float char_delta = magic(f3, b3, seed + 30); + float t = magic(seed + 40); + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + + vec2 uv2 = uv1; + float k1 = 100 * (1 - zoom) + 10; + float inv_k = 1 / k1; + uv2 = floor(uv2 * k1) * inv_k; + int start_char = charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2] : 0x01; + int char_span = int((charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2 + 1] : 255)); + char_span = int(char_span * max(1 - charset.y, 1 / (char_span * 0.75))); + ivec2 uv2i = ivec2(uv2 * k1); + int code = ((charset_ctrl.y < 1 || (uv2i.x % 2 ^ uv2i.y % 2) > 0) ? 1 : 0) * (start_char + int((rand(uv2i) + char_delta) * char_span) % char_span); + vec3 c = reframe(previous, uv2 + vec2(0, 0) * inv_k * 0.125).xyz * 0.2 + + reframe(previous, uv2 + vec2(1, 0) * inv_k * 0.125).xyz * 0.2 + + reframe(previous, uv2 + vec2(1, 1) * inv_k * 0.125).xyz * 0.2 + + reframe(previous, uv2 + vec2(0, 1) * inv_k * 0.125).xyz * 0.2 + + reframe(previous, uv2 + vec2(0.5, 0.5) * inv_k * 0.125).xyz * 0.2; + c = char(mod(uv1 * k1, 1), code) ? c : vec3(0); + + return fx_master(c0, c, seed, m0); +} + +// FX 10 : lens +subroutine(fx_stage_sub) vec4 fx_10(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float lens_v1 = magic(f1, b1, seed + 10); + float lens_v2 = magic(f2, b2, seed + 20); + float zoom = magic(f3, b3, seed + 30); + float k = magic(seed + 40); + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + + vec2 uv2 = uv1; + uv2 *= 1 + zoom * 2; + uv2 = lens(uv2, -lens_v2 * 10, lens_v1 * 10); + vec3 c = reframe(previous, uv2).xyz; + + return fx_master(c0, c, seed, m0); +} + +// TODO FX 11 +subroutine(fx_stage_sub) vec4 fx_11(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + return fx_1(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + vec3 c = c0; + + return fx_master(c0, c, seed, m0); +} + +// TODO FX 12 +subroutine(fx_stage_sub) vec4 fx_12(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + return fx_2(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + vec3 c = c0; + + return fx_master(c0, c, seed, m0); +} + +// TODO FX 13 +subroutine(fx_stage_sub) vec4 fx_13(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + return fx_3(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + vec3 c = c0; + + return fx_master(c0, c, seed, m0); +} + +// TODO FX 14 +subroutine(fx_stage_sub) vec4 fx_14(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + return fx_4(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + vec3 c = c0; + + return fx_master(c0, c, seed, m0); +} + +// TODO FX 15 +subroutine(fx_stage_sub) vec4 fx_15(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) +{ + return fx_5(vUV, previous, feedback, seed, b1, f1, b2, f2, b3, f3, m0); + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + // logic + + vec3 c0 = texture(previous, uv0).xyz; + vec3 c = c0; + + return fx_master(c0, c, seed, m0); +} + +#endif \ No newline at end of file diff --git a/default/inc_magic.glsl b/default/inc_magic.glsl new file mode 100644 index 0000000..74e0d31 --- /dev/null +++ b/default/inc_magic.glsl @@ -0,0 +1,71 @@ +#include inc_time.glsl + +#ifndef INC_MAGIC +#define INC_MAGIC + +uniform int iDemo; + +vec2 magic_f(vec2 F, vec3 B, float i) +{ + return vec2( + mix(F.x, randTime(i + 1), min(1, B.z + iDemo)), + mix(F.y, randTime(i + 2), min(1, B.z + iDemo)) + ); +} + +vec2 magic_f(float i) +{ + return magic_f(vec2(0), vec3(0, 0, 1), i); +} + +vec3 magic_b(vec3 B, float i) +{ + return vec3( + mix(B.x, step(0.2, randTime(i + 3)), min(1, B.z + iDemo)), + mix(B.y, step(0.5, randTime(i + 4)), min(1, B.z + iDemo)), + min(1, B.z + iDemo) + ); +} + +vec3 magic_b(float i) +{ + return magic_b(vec3(0, 0, 1), i); +} + +bool magic_trigger(vec3 B, float i) +{ + return magic_b(B, i).x > 0; +} + +bool magic_trigger(float i) +{ + return magic_b(i).x > 0; +} + +float magic(vec2 F, vec3 B, float i) +{ + vec2 f = magic_f(F, B, i); + vec3 b = magic_b(B, i); + + return mix(0, f.x * mix(1 - modTime(f.y), cosTime(f.y) * 0.5 + 0.5, b.y), b.x); +} + +float magic(float i) +{ + return magic(vec2(0), vec3(0, 0, 1), i); +} + +float magic_reverse(vec2 F, vec3 B, float i) +{ + vec2 f = magic_f(F, B, i); + vec3 b = magic_b(B, i); + + return mix(0, f.x * mix(1 - modTime(f.y), modTime(f.y), b.y), b.x); +} + +float magic_reverse(float i) +{ + return magic_reverse(vec2(0), vec3(0, 0, 1), i); +} + +#endif \ No newline at end of file diff --git a/default/inc_rand.glsl b/default/inc_rand.glsl new file mode 100644 index 0000000..d6c6449 --- /dev/null +++ b/default/inc_rand.glsl @@ -0,0 +1,14 @@ +#ifndef INC_RAND +#define INC_RAND + +float rand(float seed){ + float v=pow(abs(seed),6./7.); + v*=sin(v)+1.; + return fract(v); +} + +float rand(vec2 n){ + return rand(n.x * 1234 + n.y * 9876); +} + +#endif \ No newline at end of file diff --git a/default/inc_res.glsl b/default/inc_res.glsl new file mode 100644 index 0000000..8e95ccf --- /dev/null +++ b/default/inc_res.glsl @@ -0,0 +1,7 @@ +#ifndef INC_BASE +#define INC_BASE + +uniform vec2 iResolution; +uniform vec2 iTexResolution; + +#endif \ No newline at end of file diff --git a/default/inc_sentences.glsl b/default/inc_sentences.glsl new file mode 100644 index 0000000..8787831 --- /dev/null +++ b/default/inc_sentences.glsl @@ -0,0 +1,29 @@ +#ifndef INC_SENTENCES +#define INC_SENTENCES + +#define SENTENCE_COUNT 17 + +const int sentences[SENTENCE_COUNT][20] = { + {0x66, 0x6F, 0x72, 0x67, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x46, 0x4F, 0x52, 0x47, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x46, 0x2E, 0x4F, 0x2E, 0x52, 0x2E, 0x47, 0x2E, 0x45, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x46, 0x75, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x4F, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x52, 0x65, 0x61, 0x6C, 0x2D, 0x74, 0x69, 0x6D, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x47, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, 0x69, 0x76, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x45, 0x76, 0x65, 0x72, 0x79, 0x74, 0x68, 0x69, 0x6E, 0x67, 0x20, 0x79, 0x6F, 0x75, 0x20, 0x73, 0x65, 0x65, 0x00, 0x00}, + {0x50, 0x69, 0x78, 0x65, 0x6C, 0x20, 0x62, 0x79, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x4C, 0x69, 0x76, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x47, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x43, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, 0x6C, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x3C0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x4B, 0x6C, 0x65, 0x3C0, 0x65, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x43, 0x6F, 0x64, 0x65, 0x20, 0x61, 0x73, 0x20, 0x61, 0x72, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x41, 0x72, 0x74, 0x20, 0x61, 0x73, 0x20, 0x63, 0x6F, 0x64, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, +}; + +const int lengths[SENTENCE_COUNT] = { + 5, 5, 10, 6, 2, 9, 10, 7, 18, 14, 4, 9, 10, 1, 6, 11, 11 +}; +#endif \ No newline at end of file diff --git a/default/inc_src.glsl b/default/inc_src.glsl new file mode 100644 index 0000000..480effd --- /dev/null +++ b/default/inc_src.glsl @@ -0,0 +1,356 @@ +#include inc_res.glsl +#include inc_magic.glsl +#include inc_functions.glsl + +#ifndef INC_SRC +#define INC_SRC + +uniform sampler2D iTex0; +uniform sampler2D iTex3; +uniform sampler2D iTex4; + +subroutine vec4 src_stage_sub(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3); + +vec4 src_thru(vec2 vUV, sampler2D tex, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + // start + + vec2 uv0 = vUV.st; + + // controls + + float hue = magic(f1, b1, seed + 10); + float saturation = magic(f2, b2, seed + 20); + float light = magic(f3, b3, seed + 30); + + // logic + + vec3 c = texture(tex, uv0).xyz; + + c = shift3(c, hue); + + c *= 1 + saturation; + c = mix(c + light * 2.0, c - (1 - light) * 2.0, step(0.5, light)); + + // output + + return vec4(c, 1.); +} + +// SRC 1: feedback + thru +subroutine(src_stage_sub) vec4 src_1(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + return src_thru(vUV, iTex0, seed, b1, f1, b2, f2, b3, f3); +} + +// SRC 2 : lines +subroutine(src_stage_sub) vec4 src_2(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float thickness = magic(f1, b1, seed + 10); + float rotation = magic(f2, b2, seed + 20); + float distort = magic(f3, b3, seed + 30); + + // logic + + vec2 uv2 = uv1; + uv2.y *= cos(uv2.x * 5 * distort); + uv2 *= rot(rotation + iBeats / 16); + float k = thickness * 2; + uv2.y = cmod(uv2.y, k * 2 + 0.1); + float f = step(uv2.y, k * 0.125 + 0.05) * step(-uv2.y, k * 0.125 + 0.01); + + return vec4(f); +} + +// SRC 3 : dots +subroutine(src_stage_sub) vec4 src_3(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float zoom = magic(f1, b1, seed + 10); + float rotation = magic(f2, b2, seed + 20); + float lens_v = magic(f3, b3, seed + 30); + + // logic + + vec2 uv2 = uv1; + float k1 = lens_v * 5; + uv2 = lens(uv2, -k1, k1); + uv2 = kal(uv2, 5); + uv2 *= rot(rotation + iBeats / 16); + float k = zoom * 0.1 + 0.05; + uv2 = cmod(uv2, k * 2); + float f = step(length(uv2), k / (1 + length(uv1) * 2)); + + return vec4(f); +} + +// SRC 4 : waves +subroutine(src_stage_sub) vec4 src_4(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float spacing = magic(f1, b1, seed + 10); + float thickness = magic(f2, b2, seed + 20); + float scroll = magic_reverse(f3, b3, seed + 30); + + // logic + + vec2 uv2 = uv1; + uv2.y += 0.5; + uv2 *= 2.25; + uv2 = vec2((uv2.x + 1) * 0.5, -uv2.y); + float m1 = spacing * 4.5 + 0.5; + float y = log(-uv2.y) * m1; + y = mod(y + scroll * 5.0 - iBeats / 16, 5.); + float id = floor(y) * 32; + float s = cos(uv2.x * rand(id + 837) * 100 + rand(id + 281) * PI) + + cos(uv2.x * rand(id + 231) * 100 + rand(id + 526) * PI) + + cos(uv2.x * rand(id + 746) * 100 + rand(id + 621) * PI) + + cos(uv2.x * rand(id + 235) * 100 + rand(id + 315) * PI) + + cos(uv2.x * rand(id + 782) * 100 + rand(id + 314) * PI) + + cos(uv2.x * rand(id + 241) * 100 + rand(id + 734) * PI) + + cos(uv2.x * rand(id + 416) * 100 + rand(id + 425) * PI) + + cos(uv2.x * rand(id + 315) * 100 + rand(id + 525) * PI) + + cos(uv2.x * rand(id + 423) * 100 + rand(id + 743) * PI) + + cos(uv2.x * rand(id + 637) * 100 + rand(id + 245) * PI); + s *= 0.1; + float cut = 0.025 + thickness * 0.475; + float y2 = min(1.0, -(uv2.y)); + float f = (0.1 + 0.9 * (cos((y2 + 1.0) * PI) * 0.5 + 0.5)) * step(uv2.y, 0.) * step(fract(y + (s - 1) * (1 - cut) * 0.5), cut);//step(uv2.y, 0.) * mod(-uv2.y * 1.0, 1.0); + + return vec4(f); +} + +// SRC 5 : noise +subroutine(src_stage_sub) vec4 src_5(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float zoom = magic(f1, b1, seed + 10); + float voronoi_distort = magic(f2, b2, seed + 20); + float details = magic(f3, b3, seed + 30); + float noise_factor = magic(seed + 40); + + // logic + + vec2 uv2 = uv1; + uv2 *= zoom * 20 + 3; + uv2.x += iBeats; + vec4 data = voronoi(uv2, voronoi_distort); + float f = data.x / (data.x + data.y); + f = sin(f * PI * (details * 20)) * 0.5 + 1; + int nf = int(noise_factor * 6); + f *= mix(1, noise_f(uv2, nf - 1), step(0.0, float(nf))); + + return vec4(f); +} + +// SRC 6 : video in 1 + thru +subroutine(src_stage_sub) vec4 src_6(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + return src_thru(vUV, iTex3, seed, b1, f1, b2, f2, b3, f3); +} + +#include inc_cp437.glsl + +// SRC 7 : cp437 +subroutine(src_stage_sub) vec4 src_7(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float zoom = magic(f1, b1, seed + 10); + vec2 charset = magic_f(f2, b2, seed + 20); + vec3 charset_ctrl = magic_b(b2, seed + 20); + float char_delta = magic(f3, b3, seed + 30); + + // logic + + vec2 uv2 = uv1; + uv2 *= zoom * 20 + 3; + uv2 += iBeats; + uv2 = mod(uv2, 100) + 100; + int start_char = charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2] : 0x01; + int char_span = int((charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2 + 1] : 255)); + char_span = int(char_span * max(1 - charset.y, 1 / (char_span * 0.75))); + ivec2 uv2i = ivec2(uv2); + int code = ((charset_ctrl.y < 1 || (uv2i.x % 2 ^ uv2i.y % 2) > 0) ? 1 : 0) * (start_char + int((rand(uv2i) + char_delta) * char_span) % char_span); + uv2 = mod(uv2, 1); + float f = char(uv2, code) ? 1 : 0; + + return vec4(f); +} + +// SRC 8 : sentences + +#include inc_sentences.glsl + +subroutine(src_stage_sub) vec4 src_8(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + float zoom = magic(f1, b1, seed + 10); + float sentence = magic_reverse(f2, b2, seed + 20); + float h_delta = magic(f3, b3, seed + 30); + vec3 h_delta_b = magic_b(b3, seed + 30); + + // logic + + vec2 uv2 = uv1; + uv2 *= (1 + zoom) * 12; + int s = int(sentence * (SENTENCE_COUNT - 1)); + uv2.x += floor(uv2.y) * (h_delta - 0.5) * 2; + uv2.y = mix(uv2.y, mod(uv2.y, 1), h_delta_b.x); + float f = write_20(uv2, vec2(-float(lengths[s]) * 0.5, 0), sentences[s]); + + return vec4(f); +} + +// TODO SRC 9 +subroutine(src_stage_sub) vec4 src_9(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + return src_2(vUV, seed, b1, f1, b2, f2, b3, f3); + + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + // logic + + return texture(iTex0, vUV); +} + +// TODO SRC 10 +subroutine(src_stage_sub) vec4 src_10(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + return src_3(vUV, seed, b1, f1, b2, f2, b3, f3); + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + // logic + + return texture(iTex0, vUV); +} + +// SRC 11 : video in 2 + thru +subroutine(src_stage_sub) vec4 src_11(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + return src_thru(vUV, iTex4, seed, b1, f1, b2, f2, b3, f3); +} + +// TODO SRC 12 +subroutine(src_stage_sub) vec4 src_12(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + return src_4(vUV, seed, b1, f1, b2, f2, b3, f3); + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + // logic + + return texture(iTex0, vUV); +} + +// TODO SRC 13 +subroutine(src_stage_sub) vec4 src_13(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + return src_5(vUV, seed, b1, f1, b2, f2, b3, f3); + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + // logic + + return texture(iTex0, vUV); +} + +// TODO SRC 14 +subroutine(src_stage_sub) vec4 src_14(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + return src_7(vUV, seed, b1, f1, b2, f2, b3, f3); + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + // logic + + return texture(iTex0, vUV); +} + +// SRC 15 : TODO +subroutine(src_stage_sub) vec4 src_15(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +{ + return src_8(vUV, seed, b1, f1, b2, f2, b3, f3); + // start + + vec2 uv0 = vUV.st; + float ratio = iResolution.x / iResolution.y; + vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); + + // controls + + // logic + + return texture(iTex0, vUV); +} + +#endif \ No newline at end of file diff --git a/default/inc_template.glsl b/default/inc_template.glsl new file mode 100644 index 0000000..6490e0f --- /dev/null +++ b/default/inc_template.glsl @@ -0,0 +1,4 @@ +#ifndef INC_TEMPLATE +#define INC_TEMPLATE + +#endif \ No newline at end of file diff --git a/default/inc_time.glsl b/default/inc_time.glsl new file mode 100644 index 0000000..725aa00 --- /dev/null +++ b/default/inc_time.glsl @@ -0,0 +1,49 @@ +#ifndef PI +#define PI 3.1415927 +#endif + +#include inc_rand.glsl + +#ifndef INC_TIME +#define INC_TIME + +uniform float iTime; +uniform float iTempo; +uniform float iBeats; + +float randTime(float seed){ + return rand(seed + floor(iBeats / 4)); +} + +float divider(float x) +{ + if (x < 0.1) return 0; + if (x < 0.2) return 0.125; + if (x < 0.3) return 0.25; + if (x < 0.4) return 0.5; + if (x < 0.6) return 1; + if (x < 0.8) return 2; + return 4; +} + +float modTime(float k, float k2) +{ + return mod(divider(k) * iBeats * k2 / 4, 1); +} + +float modTime(float k) +{ + return modTime(k, 1.0); +} + +float sinTime(float k) +{ + return sin(modTime(k, 0.5) * 2 * PI); +} + +float cosTime(float k) +{ + return cos(modTime(k, 0.5) * 2 * PI); +} + +#endif \ No newline at end of file diff --git a/default/inc_yuv.glsl b/default/inc_yuv.glsl new file mode 100644 index 0000000..f6452dd --- /dev/null +++ b/default/inc_yuv.glsl @@ -0,0 +1,28 @@ +#ifndef INC_YUV +#define INC_YUV + +const int YUYV_FOURCC = 1448695129; + +const mat3x3 yuv_to_rgb = {{1,1,1},{0,-0.39465,2.03211},{1.13983,-0.5806,0}}; + +vec4 yuyvTex(sampler2D tex, vec2 vUV, int base_width) { + float w = base_width - 1; + + int x = int(vUV.x * w); + + int xU = x - x % 2; + int xV = x - x % 2 + 1; + + vec4 tU = texture(tex, vec2(xU / w, 1 - vUV.y)); + vec4 tV = texture(tex, vec2(xV / w, 1 - vUV.y)); + + vec3 yuv = vec3( + x % 2 == 0 ? tU.x : tV.x, + tU.y - 0.5, + tV.y - 0.5 + ); + + return vec4(yuv_to_rgb * yuv, 1.0); +} + +#endif \ No newline at end of file diff --git a/src/config_file.c b/src/config_file.c index 7823894..db4e2e6 100644 --- a/src/config_file.c +++ b/src/config_file.c @@ -70,7 +70,7 @@ void config_file_read(ConfigFile *config, char *path) { config->map = hashmap_new(sizeof(ConfigFileItem), 0, 0, 0, item_hash, item_compare, NULL, NULL); - file = file_read(path); + file_read(&file, path); if (file.error) { return; diff --git a/src/file.c b/src/file.c index ec34855..36fd0c0 100644 --- a/src/file.c +++ b/src/file.c @@ -67,16 +67,32 @@ bool file_update(File *file) { return true; } -File file_read(char *path) { - File file; +void file_read(File *file, char *path) { + strncpy(file->path, path, STR_LEN); + file->content = NULL; + file->error = false; + file->last_write = 0; - strncpy(file.path, path, STR_LEN); - file.content = NULL; - file.error = false; - file.last_write = 0; + file_update(file); +} - file_update(&file); - return file; +void file_dump(char *path, char *content) { + FILE *file_pointer; + + log_info("Dumping %s...", path); + + // open file + file_pointer = fopen(path, "w"); + if (file_pointer == NULL) { + log_warn("Cannot open file '%s'", path); + return; + } + + // write file + fprintf(file_pointer, "%s", content); + + // close file + fclose(file_pointer); } void file_write(char *path, StringArray *lines) { diff --git a/src/file.h b/src/file.h index 95fe96f..dfb7b22 100644 --- a/src/file.h +++ b/src/file.h @@ -3,7 +3,7 @@ #ifndef FILE_H #define FILE_H -File file_read(char *path); +void file_read(File *file, char *path); bool file_should_update(File *file); @@ -11,6 +11,8 @@ bool file_update(File *file); void file_write(char *path, StringArray *lines); +void file_dump(char *path, char *content); + void file_free(File *file); #endif /* FILE_H */ \ No newline at end of file diff --git a/src/project.c b/src/project.c index 53c7546..04eec62 100644 --- a/src/project.c +++ b/src/project.c @@ -11,30 +11,29 @@ #include "string.h" static bool parse_fragment_shader_file(Project *project, unsigned int i) { - File tmp_file, fragment_shader; + File tmp_file; char file_path[STR_LEN]; char *include_pos, *include_end; char included_file[STR_LEN]; char *new_content; - fragment_shader = project->fragment_shaders[i][0]; - project->sub_counts.values[i] = 0; - include_pos = strstr(fragment_shader.content, "#include "); + include_pos = strstr(project->fragment_shaders[i][0].content, "\n#include "); while (include_pos != NULL && project->sub_counts.values[i] < MAX_SUB_FILE) { - include_end = strstr(include_pos, "\n"); + include_end = strstr(include_pos + 1, "\n"); if (include_end == NULL) { - log_error("Invalid '#include' directive in '%s'", fragment_shader.path); + log_error("Invalid '#include' directive in '%s'", + project->fragment_shaders[i][0].path); return false; } - strlcpy(included_file, include_pos + 9, include_end - include_pos - 8); + strlcpy(included_file, include_pos + 10, include_end - include_pos - 9); snprintf(file_path, STR_LEN, "%s/%s", project->path, included_file); - tmp_file = file_read(file_path); + file_read(&tmp_file, file_path); if (tmp_file.error) { return false; @@ -43,14 +42,17 @@ static bool parse_fragment_shader_file(Project *project, unsigned int i) { project->fragment_shaders[i][++project->sub_counts.values[i]] = tmp_file; new_content = string_replace_at( - fragment_shader.content, include_pos - fragment_shader.content, - include_end - fragment_shader.content, tmp_file.content); + project->fragment_shaders[i][0].content, + include_pos + 1 - project->fragment_shaders[i][0].content, + include_end - project->fragment_shaders[i][0].content, + tmp_file.content); project->fragment_shaders[i][0].content = new_content; file_free(&tmp_file); - include_pos = strstr(fragment_shader.content, "#include "); + include_pos = + strstr(project->fragment_shaders[i][0].content, "\n#include "); } return true; @@ -63,7 +65,7 @@ static bool read_fragment_shader_file(Project *project, char *frag_prefix, snprintf(file_path, STR_LEN, "%s/%s%d.glsl", project->path, frag_prefix, i + 1); - project->fragment_shaders[i][0] = file_read(file_path); + file_read(&project->fragment_shaders[i][0], file_path); if (project->fragment_shaders[i][0].error) { return false; diff --git a/src/shaders.c b/src/shaders.c index 1ab2805..01507f6 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -8,6 +8,7 @@ #include "config.h" #include "config_file.h" #include "constants.h" +#include "file.h" #include "shaders.h" #define GLAD_GL_IMPLEMENTATION @@ -206,6 +207,7 @@ static bool compile_shader(GLuint shader_id, char *name, char *source_code) { if (status_params == GL_FALSE) { log_error("Failed to compile\n%s", log); + file_dump("error.glsl", source_code); } else { log_info("Compilation successful"); } @@ -479,7 +481,7 @@ static void write_uniform_multi_3f(GLuint location, unsigned int count, static void use_program(ShaderProgram *program, int i, bool output, SharedContext *context) { - unsigned int j, k, offset; + unsigned int j, k, offset, subcount; GLuint subroutines[ARRAY_SIZE]; // use specific shader program glUseProgram(program->programs[i]); @@ -547,14 +549,22 @@ static void use_program(ShaderProgram *program, int i, bool output, // set subroutines for fragment and update state uniforms k = context->state.values[i]; + subcount = 0; for (j = 0; j < program->sub_type_count; j++) { - subroutines[j] = program->sub_locations[i * program->sub_type_count * - program->sub_variant_count + - j * program->sub_variant_count + k]; + if (program->sub_locations[i * program->sub_variant_count * + program->sub_type_count + + j * program->sub_variant_count + k] != + unused_uniform) { + subroutines[subcount++] = + program->sub_locations[i * program->sub_variant_count * + program->sub_type_count + + j * program->sub_variant_count + k]; + } } - glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, program->sub_type_count, - subroutines); + if (subcount > 0) { + glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, subcount, subroutines); + } // set GL_TEXTURE(X) to uniform sampler2D texX for (j = 0; j < program->tex_count; j++) { diff --git a/src/string.c b/src/string.c index 7cf2822..b478117 100644 --- a/src/string.c +++ b/src/string.c @@ -60,12 +60,11 @@ char *string_replace_at(char *src, unsigned int from, unsigned int to, src_len = strlen(src); rpl_len = strlen(rpl); - dst = - malloc(src_len - (to - from) + rpl_len + 1); // +1 for the null-terminator + dst = malloc(src_len - (to - from) + rpl_len + 1); strncpy(dst, src, from); strncpy(dst + from, rpl, rpl_len); - strncpy(dst + from + rpl_len, src + to, src_len - to); + strlcpy(dst + from + rpl_len, src + to, src_len - to + 1); return dst; } \ No newline at end of file