494 lines
13 KiB
GLSL
494 lines
13 KiB
GLSL
#include inc_res.glsl
|
|
#include inc_magic.glsl
|
|
#include inc_functions.glsl
|
|
#include inc_cp437.glsl
|
|
|
|
#ifndef INC_SRC
|
|
#define INC_SRC
|
|
|
|
uniform int iDemo;
|
|
|
|
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);
|
|
|
|
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., c - (1. - light) * 2., step(.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 * .0625);
|
|
float k = thickness * 2.;
|
|
uv2.y = cmod(uv2.y, k * 2. + .1);
|
|
float f = istep(k * .125 + .05, uv2.y) * istep(k * .125 + .01, -uv2.y);
|
|
|
|
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 * .0625);
|
|
float k = zoom * .1 + .05;
|
|
uv2 = cmod(uv2, k * 2.);
|
|
float f = istep(k / (1. + length(uv1) * 2.), length(uv2));
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
|
|
// SRC 4 : bacteria
|
|
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 zoom = 2. + magic(f1, b1, seed + 10.) * 20.;
|
|
float details = 5. * magic(f2, b2, seed + 20.);
|
|
float delta = magic(f3, b3, seed + 30.);
|
|
|
|
// logic
|
|
|
|
uv1 *= zoom;
|
|
|
|
vec4 data = voronoi(uv1, 1., seed + 40, iBeats * .25);
|
|
|
|
float f = ease(data.x) + ease(data.y);
|
|
|
|
f = saw(f * (1. + data.x * details) - delta * 2.);
|
|
|
|
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, seed + 50, iBeats);
|
|
float f = data.x / (data.x + data.y);
|
|
f = sin(f * PI * (details * 20.)) * .5 + 1.;
|
|
int nf = int(noise_factor * 6.);
|
|
f *= mix(1., noise_f(uv2, nf - 1), step(.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)
|
|
{
|
|
if (iDemo > 0) {
|
|
return src_2(vUV, seed, b1, f1, b2, f2, b3, 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 * .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
|
|
|
|
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.;
|
|
uv2.y += .5;
|
|
int s = int(sentence * (SENTENCE_COUNT - 1));
|
|
uv2.x += floor(uv2.y) * (h_delta - .5) * 2.;
|
|
uv2.y = mix(uv2.y, mod(uv2.y, 1.), h_delta_b.x);
|
|
float f = write_sentence(uv2, vec2(-float(lengths[s]) * .5, 0.), s);
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
// SRC 9 : sentences repeat
|
|
subroutine(src_stage_sub) vec4 src_9(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 h_shift = 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.x += h_shift;
|
|
uv2 *= 15.;
|
|
uv2.y += .5;
|
|
int s = int(sentence * (SENTENCE_COUNT - 1));
|
|
float slen = float(lengths[s]);
|
|
uv2.x += floor(uv2.y) * (h_delta - .5) * 2.;
|
|
uv2.x = cmod(uv2.x, slen + 1.);
|
|
vec2 uv3 = uv2;
|
|
uv3.y = mix(uv3.y, mod(uv3.y, 1.), h_delta_b.x);
|
|
float f = write_sentence(uv3, vec2(-slen * .5, 0.), s);
|
|
|
|
f *= (1. - abs(floor(uv2.y) * .125)) * (1. - abs(floor(uv2.y) * .125));
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
// SRC 10 : isometric grid
|
|
subroutine(src_stage_sub) vec4 src_10(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 = 5. + magic(f1, b1, seed + 10.) * 15.;
|
|
float h_scroll = magic(f2, b2, seed + 20.);
|
|
float max_elevation = magic(f3, b3, seed + 30.) * .5;
|
|
float thick = .1;
|
|
|
|
// logic
|
|
|
|
vec2 uv2 = uv1;
|
|
|
|
vec2 uv3 = iso(uv2);
|
|
|
|
uv3 += vec2(h_scroll, 0.);
|
|
|
|
uv3 *= round(zoom);
|
|
|
|
vec2 umax = vec2(round(zoom), 300.);
|
|
|
|
vec2 u0 = mod(floor(uv3), umax);
|
|
vec2 u1 = mod(floor(uv3 + vec2(1., 0.)), umax);
|
|
vec2 u2 = mod(floor(uv3 + vec2(0., 1.)), umax);
|
|
vec2 u3 = mod(floor(uv3 + vec2(-1., 0.)), umax);
|
|
vec2 u4 = mod(floor(uv3 + vec2(0., -1.)), umax);
|
|
|
|
float e0 = (rand(floor(u0)) * 2. - 1.) * max_elevation;
|
|
float e1 = (rand(floor(u1)) * 2. - 1.) * max_elevation;
|
|
float e2 = (rand(floor(u2)) * 2. - 1.) * max_elevation;
|
|
float e3 = (rand(floor(u3)) * 2. - 1.) * max_elevation;
|
|
float e4 = (rand(floor(u4)) * 2. - 1.) * max_elevation;
|
|
|
|
uv3 = mod(uv3, 1.) - .5;
|
|
|
|
float f = 0.;
|
|
|
|
f = line(uv3, vec2(0., 0.) - iso_z(e0), vec2(1., 0.) - iso_z(e1), thick)
|
|
+ line(uv3, vec2(0., 0.) - iso_z(e0), vec2(0., 1.) - iso_z(e2), thick)
|
|
+ line(uv3, vec2(0., 0.) - iso_z(e0), vec2(-1., 0.) - iso_z(e3), thick)
|
|
+ line(uv3, vec2(0., 0.) - iso_z(e0), vec2(0., -1.) - iso_z(e4), thick);
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
// 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)
|
|
{
|
|
if (iDemo > 0) {
|
|
return src_3(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
}
|
|
|
|
return src_thru(vUV, iTex4, seed, b1, f1, b2, f2, b3, f3);
|
|
}
|
|
|
|
// SRC 12 : Scales
|
|
subroutine(src_stage_sub) vec4 src_12(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 = 5. + magic(f1, b1, seed + 10.) * 15.;
|
|
float shape = magic(f2, b2, seed + 20.);
|
|
float repeat = 1. + magic(f3, b3, seed + 30.) * 10.;
|
|
|
|
// logic
|
|
|
|
float f = 0.;
|
|
|
|
vec2 uv2 = uv1;
|
|
|
|
uv2 *= zoom;
|
|
|
|
uv2 = mod(uv2, 4.);
|
|
|
|
vec2 uv3 = uv2;
|
|
|
|
uv3.y = mix(uv3.y, -uv3.y, step(2., uv2.x) * step(2., uv2.y));
|
|
uv3.y = mix(uv3.y, -uv3.y, istep(2., uv2.x) * istep(2., uv2.y));
|
|
|
|
uv3.y = -uv3.y;
|
|
|
|
uv3.x = mix(-uv3.x, uv3.x, istep(3., uv2.x) * step(1., uv2.x));
|
|
uv3.x = mix(-uv3.x, uv3.x, istep(3., uv2.y) * step(1., uv2.y));
|
|
|
|
f = istep(.5, saw((length(mod(uv3, 1.)) + shape + .5) * repeat));
|
|
|
|
f = mix(1. - f, f, istep(1., abs(uv2.y - 2.)) * istep(2., uv2.x));
|
|
f = mix(1. - f, f, step(1., abs(uv2.y - 2.)) * step(2., uv2.x));
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
// SRC 13 : Credenza
|
|
subroutine(src_stage_sub) vec4 src_13(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 = 5. + magic(f1, b1, seed + 10.) * 15.;
|
|
float shape = .1 + magic(f2, b2, seed + 20.) * .9;
|
|
float repeat = 1. + magic(f3, b3, seed + 30.) * 10.;
|
|
|
|
// logic
|
|
|
|
vec2 uv2 = uv1;
|
|
|
|
uv2 *= zoom;
|
|
|
|
uv2 = mod(uv2, 2.);
|
|
|
|
uv2 = abs(uv2 - 1.);
|
|
|
|
float f = istep(1., length(uv2)) * istep(1., length(1. - uv2));
|
|
|
|
f *= istep(.5, saw((length(uv2) + shape + .5) * repeat)) * istep(.5, saw((length(1. - uv2) + shape + .5) * repeat));
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
// SRC 14 : Cursor
|
|
subroutine(src_stage_sub) vec4 src_14(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 size = magic(f1, b1, seed + 10.) * 2. + .1;
|
|
float dx = (fmagic(f2, b2, seed + 20.) * (1. - size * .06) - .5) * ratio;
|
|
bool flip_x = magic_trigger(b2, seed + 20.);
|
|
float dy = fmagic(f3, b3, seed + 30.) * (1. - size * .17) - .5;
|
|
bool flip_y = magic_trigger(b3, seed + 30.);
|
|
|
|
// logic
|
|
|
|
vec2 uv2 = uv1;
|
|
|
|
if (flip_x) {
|
|
uv2.x = -uv2.x;
|
|
}
|
|
|
|
if (flip_y) {
|
|
uv2.y = -uv2.y;
|
|
}
|
|
|
|
uv2 -= vec2(dx, -dy);
|
|
|
|
uv2 /= size;
|
|
|
|
uv2 *= -rot(-PI * 0.5);
|
|
|
|
float f = istep(0., (uv2.x * 2. + uv2.y) * (uv2.x * 2. - uv2.y)) * istep(0., uv2.y);
|
|
|
|
uv2.y += .1;
|
|
|
|
f -= istep(0., (uv2.x + uv2.y * 3.) * (uv2.x - uv2.y * 3.)) * istep(0., uv2.y);
|
|
|
|
f += rect(uv2, vec2(0., -.04), vec2(.01, .04));
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
// SRC 15 : Random
|
|
subroutine(src_stage_sub) vec4 src_15(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3)
|
|
{
|
|
int src = int(randTime(seed + 100.) * 14.) + 1;
|
|
|
|
if (src == 1) {
|
|
return src_1(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 2) {
|
|
return src_2(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 3) {
|
|
return src_3(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 4) {
|
|
return src_4(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 5) {
|
|
return src_5(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 6) {
|
|
return src_6(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 7) {
|
|
return src_7(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 8) {
|
|
return src_8(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 9) {
|
|
return src_9(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 10) {
|
|
return src_10(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 11) {
|
|
return src_11(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 12) {
|
|
return src_12(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 13) {
|
|
return src_13(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else {
|
|
return src_14(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
}
|
|
}
|
|
|
|
#endif
|