#include inc_res.glsl #include inc_magic.glsl #include inc_functions.glsl #include inc_cp437.glsl #include inc_sentences.glsl #include inc_dungeon.glsl #ifndef INC_SRC #define INC_SRC uniform int iDemo; uniform sampler2D iTex0; 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 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 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 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 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 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.) * 3. + 3.; float overthrow = magic(f2, b2, seed + 20.) * 30. + 3.; float quantize = (1. - magic(f3, b3, seed + 30.)) * 10. + 1.; // logic vec2 uv2 = uv1 * zoom + 1000; uv2.x += iBeats; float f = 0; f += perlin(uv2 * 1., seed + 00) * .5; f += perlin(uv2 * 2., seed + 10) * .25; f += perlin(uv2 * 4., seed + 10) * .125; f += perlin(uv2 * 8., seed + 10) * .0625; f += perlin(uv2 * 16., seed + 10) * .03125; f = (f - 0.5) * 2.; f *= overthrow; f = round(f * quantize) / quantize; f = (f + 1.0) * 0.5; return vec4(f); } // SRC 6 : cp437 vec4 src_6(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 charset_index = int(charset.x * (CP437_SETS - 1)); int start_char = charset_ctrl.x > 0. ? cp437_sets[charset_index * 2] : 0x01; int char_span = int((charset_ctrl.x > 0. ? cp437_sets[charset_index * 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 = cp437(uv2, code) ? 1. : 0.; return vec4(f); } // SRC 7 : sentences 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.); 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 * (CP437_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 = cp437_sentence(uv2, vec2(-float(cp437_sentences_lengths[s]) * .5, 0.), s); return vec4(f); } // SRC 8 : sentences repeat 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 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 * (CP437_SENTENCE_COUNT - 1)); float slen = float(cp437_sentences_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 = cp437_sentence(uv3, vec2(-slen * .5, 0.), s); f *= (1. - abs(floor(uv2.y) * .125)) * (1. - abs(floor(uv2.y) * .125)); return vec4(f); } // SRC 9 : dungeon 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 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 charset_index = int(charset.x * (DUNGEON_SETS - 1)); int start_char = charset_ctrl.x > 0. ? dungeon_sets[charset_index * 2] : 0x01; int char_span = int((charset_ctrl.x > 0. ? dungeon_sets[charset_index * 2 + 1] : DUNGEON_COUNT - 1)); 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 = dungeon(uv2, code) ? 1. : 0.; return vec4(f); } // SRC 10 : vec4 src_10(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { // TODO return src_1(vUV, seed, b1, f1, b2, f2, b3, f3); } // SRC 11 : isometric grid vec4 src_11(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 12 : Scales 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 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 : vec4 src_14(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { // TODO return src_1(vUV, seed, b1, f1, b2, f2, b3, f3); } vec4 src_stage(int src, vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { if (src >= 15) { 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