932 lines
27 KiB
GLSL
932 lines
27 KiB
GLSL
#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.);
|
|
}
|
|
|
|
vec4 src_lines(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);
|
|
}
|
|
|
|
vec4 src_dots(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);
|
|
}
|
|
|
|
|
|
vec4 src_waves(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)) * istep(0, uv2.y) * istep(cut, fract(y + (s - 1) * (1 - cut) * 0.5));
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
vec4 src_bacteria(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);
|
|
}
|
|
|
|
vec4 src_noise_voronoi(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);
|
|
}
|
|
|
|
vec4 src_perlin(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);
|
|
}
|
|
|
|
vec4 src_cp437(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);
|
|
}
|
|
|
|
vec4 src_sentences(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 sentence_ctrl = magic_f(f2, b2, seed + 20.);
|
|
vec3 sentence_ctrl_b = magic_b(b2, seed + 20.);
|
|
float sentence = sentence_ctrl.x;
|
|
if (sentence_ctrl_b.y > 0) {
|
|
float sentence_rand_beats = pow(2, floor((1 - sentence_ctrl.y) * 5) - 2);
|
|
sentence = mod(sentence + rand(seed + floor(iBeats / sentence_rand_beats)), 1);
|
|
}
|
|
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);
|
|
|
|
f *= (1. - abs(floor(uv2.y) * .125)) * (1. - abs(floor(uv2.y) * .125));
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
vec4 src_sentences_repeat(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.);
|
|
vec2 sentence_ctrl = magic_f(f2, b2, seed + 20.);
|
|
vec3 sentence_ctrl_b = magic_b(b2, seed + 20.);
|
|
float sentence = sentence_ctrl.x;
|
|
if (sentence_ctrl_b.y > 0) {
|
|
float sentence_rand_beats = pow(2, floor((1 - sentence_ctrl.y) * 5) - 2);
|
|
sentence = mod(sentence + rand(seed + floor(iBeats / sentence_rand_beats)), 1);
|
|
}
|
|
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);
|
|
}
|
|
|
|
vec4 src_dungeon_tiles(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);
|
|
}
|
|
|
|
vec4 src_dungeon_maze(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 - 0.5) * vec2(ratio, 1.);
|
|
|
|
// controls
|
|
|
|
float zoom = magic(f1, b1, seed + 10.) * 20 + 10;
|
|
float thing_chances = magic(f2, b2, seed + 20.);
|
|
float wall_chances = magic(f3, b3, seed + 30.);
|
|
|
|
if (magic_b(b3, seed + 30.).x == 0.) {
|
|
wall_chances = 0.5;
|
|
}
|
|
|
|
if (magic_b(b2, seed + 20.).x == 0.) {
|
|
thing_chances = 0.1;
|
|
}
|
|
|
|
// logic
|
|
|
|
vec2 uv2 = uv1 * zoom + vec2(iBeats * 4, seed);
|
|
ivec2 iuv2 = ivec2(uv2);
|
|
|
|
vec2 uv3 = fract(uv2);
|
|
|
|
float f = 0;
|
|
|
|
if (rand(ivec2(uv2) + 0.5 + seed) >= wall_chances) {
|
|
bool wall_t = rand(ivec2(uv2 + vec2(0, -1)) + 0.5 + seed) >= wall_chances;
|
|
bool wall_b = rand(ivec2(uv2 + vec2(0, 1)) + 0.5 + seed) >= wall_chances;
|
|
bool wall_l = rand(ivec2(uv2 + vec2(-1, 0)) + 0.5 + seed) >= wall_chances;
|
|
bool wall_r = rand(ivec2(uv2 + vec2(1, 0)) + 0.5 + seed) >= wall_chances;
|
|
bool wall_tr = rand(ivec2(uv2 + vec2(1, -1)) + 0.5 + seed) >= wall_chances;
|
|
bool wall_tl = rand(ivec2(uv2 + vec2(-1, -1)) + 0.5 + seed) >= wall_chances;
|
|
bool wall_br = rand(ivec2(uv2 + vec2(1, 1)) + 0.5 + seed) >= wall_chances;
|
|
bool wall_bl = rand(ivec2(uv2 + vec2(-1, 1)) + 0.5 + seed) >= wall_chances;
|
|
|
|
if (wall_l && wall_t && wall_tl) {
|
|
f += dungeon_at(uv3 * 3, vec2(0, 0), 0xBB);
|
|
}
|
|
|
|
if (wall_l) {
|
|
f += dungeon_at(uv3 * 3, vec2(0, 1), 0xBB);
|
|
}
|
|
|
|
if (wall_l && wall_b && wall_bl) {
|
|
f += dungeon_at(uv3 * 3, vec2(0, 2), 0xBB);
|
|
}
|
|
|
|
if (wall_t) {
|
|
f += dungeon_at(uv3 * 3, vec2(1, 0), 0xBB);
|
|
}
|
|
|
|
f += dungeon_at(uv3 * 3, vec2(1, 1), 0xBB);
|
|
|
|
if (wall_b) {
|
|
f += dungeon_at(uv3 * 3, vec2(1, 2), 0xBB);
|
|
}
|
|
|
|
if (wall_r && wall_t && wall_tr) {
|
|
f += dungeon_at(uv3 * 3, vec2(2, 0), 0xBB);
|
|
}
|
|
|
|
if (wall_r) {
|
|
f += dungeon_at(uv3 * 3, vec2(2, 1), 0xBB);
|
|
}
|
|
|
|
if (wall_r && wall_b && wall_br) {
|
|
f += dungeon_at(uv3 * 3, vec2(2, 2), 0xBB);
|
|
}
|
|
|
|
f = min(1, f) * 0.6;
|
|
} else {
|
|
|
|
float k = 1. - smoothstep(thing_chances - 0.01, thing_chances, rand(ivec2(uv2) + seed + 10));
|
|
|
|
if (rand(ivec2(uv2) + seed + 20) > 0.75) {
|
|
f += k * dungeon_at(uv3 * 1.2, vec2(.1, .1 + .1 * abs(sin(iBeats * PI))), 0x01 + int(36 * rand(ivec2(uv2) + seed + 30)));
|
|
} else {
|
|
f += k * 0.8 * dungeon_at(uv3 * 1.4, vec2(.2), 0x25 + int(36 * rand(ivec2(uv2) + seed + 40)));
|
|
}
|
|
}
|
|
|
|
// output
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
#define DUNGEON_CHARACTERS 11
|
|
|
|
const int dungeon_characters[] = int[DUNGEON_CHARACTERS](
|
|
0x09, 0x0A, 0x19, 0x1A, 0x1B, 0x0C, 0x21, 0x22, 0x23, 0x08, 0x0B
|
|
);
|
|
|
|
vec4 src_scroller(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 - 0.5) * vec2(ratio, 1.);
|
|
|
|
// controls
|
|
|
|
float zoom = magic(f1, b1, seed + 10.) * 5. + 5.;
|
|
float slope = magic(f2, b2, seed + 20.);
|
|
vec2 character_f = magic_f(f3, b3, seed + 30.);
|
|
vec3 character_b = magic_b(b3, seed + 30.);
|
|
|
|
// logic
|
|
|
|
float chances = 0.7;
|
|
|
|
vec2 uv2 = uv1 * zoom;
|
|
|
|
uv2 *= rot(slope);
|
|
|
|
vec2 iuv2 = ivec2(uv2);
|
|
vec2 uv3 = uv2 + vec2(iBeats * 4., 0);
|
|
vec2 iuv3 = ivec2(uv3);
|
|
|
|
float f = 0;
|
|
|
|
// terrain
|
|
|
|
int terrain_code = 0xA9;
|
|
bool bridge = rand(int(iuv3.x * 0.1) + seed) > 0.75;
|
|
|
|
if (iuv3.y < -1) {
|
|
terrain_code = bridge ? 0xA9 : 0x9F;
|
|
} else if (iuv3.y == -1) {
|
|
terrain_code = bridge ? 0x9A : (rand(iuv3 + seed) > 0.8 ? 0xA1 : 0xA0);
|
|
}
|
|
|
|
f += dungeon(fract(uv3), terrain_code) ? mix(1., 0.75, character_b.x) : 0.;
|
|
|
|
// character
|
|
|
|
int character_code = dungeon_characters[int(character_f.x * (DUNGEON_CHARACTERS - 1))];
|
|
vec2 character_pos = vec2(-0.5, -1 + abs(sin(iBeats * PI) * (1. + character_f.y)));
|
|
|
|
f += dungeon_at(uv2, character_pos, character_code);
|
|
|
|
if (character_b.y > 0.) {
|
|
f += dungeon_at(uv2 * 1.5, character_pos + vec2(2, -0.5), character_code);
|
|
f += dungeon_at(uv2 * 1.5, character_pos + vec2(-2, -0.5), character_code);
|
|
}
|
|
|
|
// bat
|
|
|
|
bool bat = rand(iuv3.x + seed + 123) > 0.95;
|
|
float bat_phase = rand(iuv3.x + seed + 456);
|
|
float bat_amp = rand(iuv3.x + seed + 789) * 0.5 + 1.;
|
|
float bat_size = 1 + rand(iuv3.x + seed + 012) * 1;
|
|
|
|
if (bat) {
|
|
f += mix(1., 0.5, character_b.x) * dungeon_at(bat_size * vec2(fract(uv3.x), uv3.y + bat_amp * sin((iBeats + bat_phase) * PI * 0.5)), vec2(0, 3 * bat_size), 0x1D);
|
|
}
|
|
|
|
// item
|
|
|
|
bool item = mod(iuv3.x, 4.) == 0 && rand(iuv3.x + seed + 2314) > 0.9;
|
|
int item_code = 0x25 + int(35 * rand(iuv3.x + seed + 1234));
|
|
|
|
if (item) {
|
|
f += smoothstep(-0.2, 0.2, uv2.x) * dungeon_at(1.5 * vec2(fract(uv3.x), uv3.y), vec2(0, -1.5), item_code);
|
|
}
|
|
|
|
// output
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
vec4 src_circuit(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 z = 10. + magic(f1, b1, 123.) * 20.;
|
|
float h = magic(f2, b2, seed + 20.) * .8 + .1;
|
|
float v = magic_reverse(f3, b3, seed + 30.) * .8 + .1;
|
|
|
|
// logic
|
|
|
|
uv1 *= z;
|
|
uv1 += iBeats;
|
|
|
|
float s0 = rand(floor(mod(uv1, 1000.))) * 1000.;
|
|
float s1 = rand(floor(mod(uv1 + vec2(0., 1.), 1000.))) * 1000.;
|
|
float s2 = rand(floor(mod(uv1 - vec2(1., 0.), 1000.))) * 1000.;
|
|
|
|
bool up = rand(s1 + 1.) < h;
|
|
bool left = rand(s2 + 2.) < v;
|
|
bool down = rand(s0 + 1.) < h;
|
|
bool right = rand(s0 + 2.) < v;
|
|
bool up_down = up && down;
|
|
bool left_right = left && right;
|
|
|
|
uv1 = mod(uv1, 1.) - .5;
|
|
|
|
const float t = .1;
|
|
|
|
float f = 0.;
|
|
int c = 0;
|
|
|
|
if (up) {
|
|
f += stripe(uv1.x, -t * .5, t * .5) * step(-t * .5, uv1.y);
|
|
c += 1;
|
|
}
|
|
|
|
if (down) {
|
|
f += stripe(uv1.x, -t * .5, t * .5) * istep(t * .5, uv1.y);
|
|
c += 1;
|
|
}
|
|
|
|
if (left) {
|
|
f += stripe(uv1.y, -t * .5, t * .5) * istep(t * .5, uv1.x);
|
|
c += 1;
|
|
}
|
|
|
|
if (right) {
|
|
f += stripe(uv1.y, -t * .5, t * .5) * step(-t * .5, uv1.x);
|
|
c += 1;
|
|
}
|
|
|
|
if (c == 1) {
|
|
f += istep(t, length(uv1));
|
|
}
|
|
|
|
f = min(f, 1.);
|
|
|
|
if ((up_down ^^ left_right) && c == 2) {
|
|
if (up_down) {
|
|
uv1.xy = uv1.yx;
|
|
}
|
|
if (rand(s0 + 3.) < .5) {
|
|
uv1.x = -uv1.x;
|
|
}
|
|
float k = rand(s0 + 4.) * 60;
|
|
f -= rect(uv1, vec2(0.), vec2(t * 3., t));
|
|
f = max(0., f);
|
|
if (k < 10.) { // resistor
|
|
f += line(uv1, vec2(-t * 3.25, -t * .5), vec2(-t * 2.5, t * 2.), t * .75);
|
|
f += line(uv1, vec2(-t * 2.5, t * 2.), vec2(-t * 1.5, -t * 2.), t * .75);
|
|
f += line(uv1, vec2(-t * 1.5, -t * 2.), vec2(-t * .5, t * 2.), t * .75);
|
|
f += line(uv1, vec2(-t * .5, t * 2.), vec2(t * .5, -t * 2.), t * .75);
|
|
f += line(uv1, vec2(t * .5, -t * 2.), vec2(t * 1.5, t * 2.), t * .75);
|
|
f += line(uv1, vec2(t * 1.5, t * 2.), vec2(t * 2.5, -t * 2.), t * .75);
|
|
f += line(uv1, vec2(t * 2.5, -t * 2.), vec2(t * 3.25, t * .5), t * .75);
|
|
} else if (k < 20.) { // capacitor
|
|
f += rect(uv1, vec2(-t * 2., 0.), vec2(t, t * .5));
|
|
f += rect(uv1, vec2(t * 2., 0.), vec2(t, t * .5));
|
|
f += rect(uv1, vec2(t, 0.), vec2(t * .5, t * 3.5));
|
|
f += rect(uv1, vec2(-t, 0.), vec2(t * .5, t * 3.5));
|
|
} else if (k < 30.) { // diode
|
|
f += line(uv1, vec2(-t * 2., t * 2.5), vec2(t * 2., 0.), t);
|
|
f += line(uv1, vec2(-t * 2., -t * 2.5), vec2(t * 2., 0.), t);
|
|
f += rect(uv1, vec2(t * 2.5, 0.), vec2(t * .5, t * 3.));
|
|
f += rect(uv1, vec2(-t * 2.5, 0.), vec2(t * .5, t * 3.));
|
|
} else if (k < 40.) { // lamp
|
|
f += istep(t * 3.5, length(uv1));
|
|
f -= istep(t * 2.5, length(uv1));
|
|
f += line(uv1, vec2(-t * 2.), vec2(t * 2.), t);
|
|
f += line(uv1, vec2(-t * 2., t * 2.), vec2(t * 2., -t * 2.), t);
|
|
} else if (k < 50.) { // inductor
|
|
f += istep(t * 2., length(uv1 - vec2(t * 2.5, 0.)));
|
|
f += istep(t * 2., length(uv1 - vec2(0., 0.)));
|
|
f += istep(t * 2., length(uv1 - vec2(-t * 2.5, 0.)));
|
|
f -= 2. * istep(t, length(uv1 - vec2(t * 2.5, 0.)));
|
|
f -= 2. * istep(t, length(uv1 - vec2(0., 0.)));
|
|
f -= 2. * istep(t, length(uv1 - vec2(-t * 2.5, 0.)));
|
|
f *= step(-t * .5, uv1.y);
|
|
} else if (k < 60.) { // switch
|
|
f += istep(t, length(uv1 - vec2(t * 2.5, 0.)));
|
|
f += istep(t, length(uv1 + vec2(t * 2.5, 0.)));
|
|
f += line(uv1, vec2(t * 2., 0.), vec2(-t * 2.5, t * (k < 55. ? 3. : 1.)), t);
|
|
}
|
|
} else if (c == 3) {
|
|
if (left_right) {
|
|
uv1.xy = uv1.yx;
|
|
if (up) {
|
|
uv1.x = -uv1.x;
|
|
}
|
|
} else if (right) {
|
|
uv1.x = -uv1.x;
|
|
}
|
|
float k = rand(s0 + 4.) * 20.;
|
|
if (k < 10.) {
|
|
f -= rect(uv1, vec2(0.), vec2(t * 3.));
|
|
f = max(0., f);
|
|
f += rect(uv1, vec2(-t * 3., 0.), vec2(t * .5, t * 3.));
|
|
f += line(uv1, vec2(t * .25, t * 3.25), vec2(-t * 3., t), t);
|
|
f += line(uv1, vec2(t * .25, -t * 3.25), vec2(-t * 3., -t), t);
|
|
}
|
|
}
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
vec4 src_isometric_grid(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);
|
|
}
|
|
|
|
vec4 src_scales(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);
|
|
}
|
|
|
|
vec4 src_credenza(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);
|
|
}
|
|
|
|
vec4 src_cursor(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);
|
|
}
|
|
|
|
vec4 src_fire(vec2 vUV, sampler2D self, 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 * vec2(ratio, 1.);
|
|
|
|
// controls
|
|
|
|
float zoom = magic(f1, b1, seed + 10.) * 200. + 50.;
|
|
float cooling = (magic(f2, b2, seed + 20.) * 3. + 1.) * 4. / zoom;
|
|
float ball_size = magic(f3, b3, seed + 30.) * 0.8 / ratio + 0.05;
|
|
float ball_trigger = magic_b(b3, seed + 30.).x;
|
|
|
|
// logic
|
|
|
|
vec2 uv2 = uv1 * zoom;
|
|
|
|
uv2 = vec2(ivec2(uv1 * zoom));
|
|
|
|
float rand_pos = rand(uv2 + seed);
|
|
|
|
vec2 src_uv = uv2 - vec2(round(rand_pos), 1) + 0.5;
|
|
|
|
float src = mix(
|
|
1.,
|
|
mix(
|
|
0.,
|
|
texture(self, (src_uv / zoom) * vec2(iResolution.y / iResolution.x, 1.)).x,
|
|
mix(1., step(0, src_uv.x) * step(0, src_uv.y), ball_trigger)
|
|
),
|
|
mix(
|
|
step(0, src_uv.y),
|
|
1. - h_circle(uv2, vec2(0.5 * ratio, 0.5) * zoom, ball_size * zoom, 0.05 * zoom),
|
|
ball_trigger
|
|
)
|
|
);
|
|
|
|
float f = max(0., src - cooling * (rand(uv2 + int(iBeats * 16.) + seed + 10) - 0.33));
|
|
|
|
return vec4(f);
|
|
}
|
|
|
|
vec4 src_stage(int src, vec2 vUV, sampler2D self, 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) { // feedback
|
|
return src_thru(vUV, iTex0, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 2) {
|
|
return src_lines(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 3) {
|
|
return src_dots(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 4) {
|
|
return src_bacteria(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 5) {
|
|
return src_perlin(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 6) {
|
|
return src_cp437(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 7) {
|
|
return src_sentences(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 8) {
|
|
return src_dungeon_maze(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 9) {
|
|
return src_dungeon_tiles(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 10) {
|
|
return src_scroller(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 11) {
|
|
return src_isometric_grid(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 12) {
|
|
return src_scales(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else if (src == 13) {
|
|
return src_credenza(vUV, seed, b1, f1, b2, f2, b3, f3);
|
|
} else {
|
|
return src_fire(vUV, self, seed, b1, f1, b2, f2, b3, f3);
|
|
}
|
|
}
|
|
|
|
#endif
|