From 3d86c9cf600fc4dc4631f2b03da789a3c0b3fe2e Mon Sep 17 00:00:00 2001 From: klemek Date: Sun, 8 Nov 2026 19:02:24 +0100 Subject: [PATCH] feat: new src: dungeon --- Makefile.dev | 22 +++- project/inc_dungeon.glsl | 241 +++++++++++++++++++++++++++++++++++++++ project/inc_src.glsl | 237 ++++++++------------------------------ 3 files changed, 310 insertions(+), 190 deletions(-) create mode 100644 project/inc_dungeon.glsl diff --git a/Makefile.dev b/Makefile.dev index 357a987..1554f73 100644 --- a/Makefile.dev +++ b/Makefile.dev @@ -49,6 +49,9 @@ sentences.txt: project/inc_sentences.glsl: sentences.txt $(MAKE) glsl-glyphs-sentences +project/inc_dungeon.glsl: + $(MAKE) glsl-glyphs-dungeon + # ACTIONS .PHONY: init @@ -120,7 +123,7 @@ ty: .venv ## ty check $(TY) check .PHONY: git-submodule-update -git-submodule-update: ## prepare git submodules +git-submodule-update: ## git submodule update git submodule update --init --recursive .PHONY: glsl-glyphs-sentences @@ -134,8 +137,21 @@ glsl-glyphs-sentences: sentences.txt ## glsl-glyphs --sentences-only --sentences-input ../../sentences.txt \ --sentences-output ../../project/inc_sentences.glsl +.PHONY: glsl-glyphs-dungeon +glsl-glyphs-dungeon: ## glsl-glyphs --name dungeon + $(GLSL_GLYPHS) \ + --name dungeon \ + --functions \ + --includes \ + --add-empty \ + --add-all \ + --input sample/pmlomb_8x8.png \ + --glyph-names sample/pmlomb_names.txt \ + --sets sample/pmlomb_sets.csv \ + --output ../../project/inc_dungeon.glsl + .PHONY: forge-run -forge-run: $(BUILD_DIR)/$(TARGET) ## run locally +forge-run: $(BUILD_DIR)/$(TARGET) ## ./build/forge $(BUILD_DIR)/$(TARGET) $(RUN_ARGS) .PHONY: rasp-chmod-opt @@ -143,7 +159,7 @@ rasp-chmod-opt: ## chmod remote project sudo chmod -R a+rwx $(RASP_ROOTFS)/opt .PHONY: rasp-remove-motd -rasp-remove-motd: ## +rasp-remove-motd: ## rm remote project motd sudo rm -rf $(RASP_ROOTFS)/etc/motd sudo rm -rf $(RASP_ROOTFS)/etc/issue sudo rm -rf $(RASP_ROOTFS)/etc/update-motd.d/* diff --git a/project/inc_dungeon.glsl b/project/inc_dungeon.glsl new file mode 100644 index 0000000..5a38ae5 --- /dev/null +++ b/project/inc_dungeon.glsl @@ -0,0 +1,241 @@ +#ifndef INC_DUNGEON +#define INC_DUNGEON + +#define DUNGEON_COUNT 193 + +const int dungeon_glyphs[] = int[772]( + 0x0000, 0x0000, 0x0000, 0x0000, // 0x00, EMPTY + 0xC480, 0x6530, 0x0088, 0x0033, // 0x01, TODO + 0xCC80, 0x7730, 0x4C2A, 0x569B, // 0x02 + 0xC800, 0x7300, 0x04C4, 0x0575, // 0x03 + 0xAEEA, 0x5775, 0x26EE, 0x4677, // 0x04 + 0xECD6, 0xBB60, 0x2EE7, 0x4371, // 0x05 + 0xC400, 0x7100, 0x4CEE, 0x27FF, // 0x06 + 0xEAEC, 0x7AB9, 0x26FE, 0xABBB, // 0x07 + 0xEAE2, 0xB232, 0x26FF, 0x233F, // 0x08 + 0x8400, 0x7200, 0xA698, 0x207A, // 0x09 + 0x9A80, 0xA724, 0x5E69, 0x2307, // 0x0A + 0x4C40, 0x532C, 0x4C2A, 0x2767, // 0x0B + 0xEC80, 0xF730, 0x4E62, 0x4FD9, // 0x0C + 0x4EA0, 0x5FB0, 0x08AC, 0x02A7, // 0x0D + 0x0000, 0x0000, 0x7EC8, 0x7331, // 0x0E + 0x0000, 0x0000, 0xFC00, 0xEF70, // 0x0F + 0x0000, 0x0000, 0xFE80, 0xF730, // 0x10 + 0x5E48, 0x7110, 0x07BE, 0x9760, // 0x11 + 0xEEC8, 0xFF73, 0xCEE2, 0x6EE8, // 0x12 + 0xACC4, 0x5332, 0x24CD, 0x423B, // 0x13 + 0xAD12, 0x5B84, 0x56C6, 0xA636, // 0x14 + 0xACC7, 0x533E, 0x478E, 0x2E17, // 0x15 + 0xA2E3, 0x547C, 0x4AE2, 0x2574, // 0x16 + 0xE421, 0x7248, 0x5EBF, 0xA7DF, // 0x17 + 0xE153, 0x78AC, 0x2E6A, 0x4765, // 0x18 + 0x0000, 0x0000, 0x8484, 0x3530, // 0x19 + 0x8400, 0x0000, 0xCE6C, 0x3753, // 0x1A + 0x6C80, 0xB700, 0x44EE, 0x44FF, // 0x1B + 0xE6C0, 0x7530, 0x3FDF, 0xFEFF, // 0x1C + 0xF880, 0xF320, 0x08CE, 0x0037, // 0x1D + 0xCA94, 0x7210, 0xCE5D, 0x3482, // 0x1E + 0x4000, 0x5500, 0xEC82, 0xE778, // 0x1F + 0xCC80, 0x2310, 0x008C, 0x0303, // 0x20 + 0xC800, 0x3133, 0x48AA, 0x2253, // 0x21 + 0xAC00, 0x3133, 0x448A, 0x2215, // 0x22 + 0xDE88, 0x2011, 0x24FE, 0x1135, // 0x23 + 0x2A62, 0x8BC8, 0x842A, 0x349A, // 0x24 + 0xFEC8, 0x7000, 0x4880, 0x0013, // 0x25 + 0xA553, 0x1236, 0xD3EC, 0x3872, // 0x26 + 0x22C0, 0x8960, 0x0084, 0x0124, // 0x27 + 0x22C0, 0xEF60, 0x0084, 0x0126, // 0x28 + 0xEEC0, 0xFF60, 0x008C, 0x0137, // 0x29 + 0xCC00, 0x7600, 0x0008, 0x0013, // 0x2A + 0x1000, 0x1A40, 0x004A, 0x0000, // 0x2B + 0xC800, 0x7210, 0x0008, 0x0013, // 0x2C + 0xA248, 0x2210, 0xFF15, 0x7754, // 0x2D + 0x9E00, 0x8700, 0xF99F, 0xF8AF, // 0x2E + 0x0E00, 0x1E00, 0x0088, 0x0133, // 0x2F + 0x0800, 0x1200, 0x0088, 0x0133, // 0x30 + 0x0000, 0x5640, 0x284A, 0x1012, // 0x31 + 0x4000, 0x5EC0, 0x248C, 0x0312, // 0x32 + 0x22A4, 0x88B4, 0x0842, 0x1248, // 0x33 + 0x4C00, 0x4700, 0x0844, 0x1244, // 0x34 + 0x4287, 0x5258, 0x2348, 0x8A94, // 0x35 + 0x0000, 0xDA98, 0x1248, 0x007E, // 0x36 + 0x8000, 0x3760, 0x08EC, 0x3335, // 0x37 + 0xCC80, 0x1100, 0x0C0C, 0x0101, // 0x38 + 0x2240, 0x1248, 0x128C, 0x0340, // 0x39 + 0x4000, 0x7EC8, 0xD258, 0x0113, // 0x3A + 0x2C80, 0x9970, 0x8422, 0x34CE, // 0x3B + 0x0FFE, 0x0111, 0x68EE, 0xF300, // 0x3C + 0xC800, 0x7700, 0x8CAA, 0x3777, // 0x3D + 0xEEC0, 0x7730, 0xC2EE, 0x7477, // 0x3E + 0xF1F0, 0xF9F0, 0xF3F9, 0xF9F8, // 0x3F + 0xCC80, 0x7731, 0x00EC, 0x10F7, // 0x40 + 0x8000, 0x3100, 0x224C, 0x8847, // 0x41 + 0x8000, 0x7FF6, 0x2340, 0x0001, // 0x42 + 0xC800, 0x33C4, 0x23CC, 0x0013, // 0x43 + 0x0000, 0x5E68, 0xF95B, 0x0000, // 0x44 + 0x2000, 0xDE48, 0x75FC, 0x0102, // 0x45 + 0x9C00, 0x9300, 0x8CAE, 0x1357, // 0x46 + 0x8C00, 0x1300, 0xCED8, 0x37B1, // 0x47 + 0x080C, 0x1317, 0x08C0, 0x1371, // 0x48 + 0x0000, 0x0000, 0x0000, 0x0001, // 0x49 + 0x0000, 0x1100, 0x000C, 0x0116, // 0x4A + 0x0000, 0x0010, 0x0002, 0x1008, // 0x4B + 0x0000, 0xA620, 0x8C80, 0x13BA, // 0x4C + 0x0000, 0x5110, 0x4444, 0x5555, // 0x4D + 0x0000, 0x2000, 0x0084, 0x0001, // 0x4E + 0x8000, 0x2000, 0x0080, 0x0021, // 0x4F + 0x2C00, 0x1ACE, 0x0C22, 0x0122, // 0x50 + 0x8448, 0x3443, 0x08C0, 0x1371, // 0x51 + 0xC448, 0x7553, 0x8444, 0x3444, // 0x52 + 0xCCC8, 0x7553, 0x8444, 0x3444, // 0x53 + 0xC448, 0x7773, 0x8444, 0x3444, // 0x54 + 0x2480, 0x8421, 0xC444, 0x7444, // 0x55 + 0xC800, 0x7310, 0x0888, 0x0333, // 0x56 + 0xE0E0, 0x7070, 0x00E0, 0x0070, // 0x57 + 0xFAC0, 0xF730, 0xC211, 0x3488, // 0x58 + 0x8000, 0x6DE0, 0x16A4, 0x0017, // 0x59 + 0x0000, 0x1010, 0xCE10, 0x7B51, // 0x5A + 0x0800, 0x16E0, 0xCEEC, 0x3773, // 0x5B + 0x0000, 0xEC88, 0xCE80, 0x377F, // 0x5C + 0x8000, 0x3160, 0x8CC8, 0x3773, // 0x5D + 0x4888, 0x4221, 0x4EE4, 0x4EE4, // 0x5E + 0x8420, 0x2480, 0x2480, 0x8421, // 0x5F + 0x2480, 0x8430, 0x8422, 0x3488, // 0x60 + 0x111F, 0x888F, 0xF111, 0xF888, // 0x61 + 0x0117, 0x088E, 0x7110, 0xE880, // 0x62 + 0x0013, 0x008C, 0x3100, 0xC800, // 0x63 + 0x0137, 0x08CE, 0x7310, 0xEC80, // 0x64 + 0x0032, 0x00C4, 0x2300, 0x4C00, // 0x65 + 0x0764, 0x0E62, 0x4670, 0x26E0, // 0x66 + 0x113E, 0x88C7, 0xE311, 0x7C88, // 0x67 + 0x174D, 0x8E2B, 0xD471, 0xB2E8, // 0x68 + 0x111E, 0x8887, 0xE111, 0x7888, // 0x69 + 0x0116, 0x0886, 0x6110, 0x6880, // 0x6A + 0x101D, 0x880D, 0xB011, 0xB808, // 0x6B + 0x101B, 0x808D, 0xB101, 0xD808, // 0x6C + 0x112C, 0x8843, 0xC211, 0x3488, // 0x6D + 0x4800, 0x2100, 0x0084, 0x0012, // 0x6E + 0xB7EC, 0xDE73, 0xCE7B, 0x37ED, // 0x6F + 0xC800, 0x3100, 0x008C, 0x0013, // 0x70 + 0x0105, 0x8085, 0xA101, 0xA080, // 0x71 + 0x101A, 0x080A, 0x5010, 0x5808, // 0x72 + 0x22C0, 0x4430, 0x0CE2, 0x0374, // 0x73 + 0x0020, 0x0040, 0x0020, 0x0401, // 0x74 + 0xDCC0, 0xFF10, 0x08DD, 0x0133, // 0x75 + 0xDCC8, 0x3300, 0x08DD, 0x0133, // 0x76 + 0xA888, 0x7300, 0x80CC, 0x7077, // 0x77 + 0xDC44, 0xFBB3, 0xC0EF, 0x3077, // 0x78 + 0x0000, 0x0000, 0x26E0, 0x0000, // 0x79 + 0xEC00, 0x7700, 0x26EE, 0x0037, // 0x7A + 0xEEEC, 0xFFF7, 0x4CEE, 0x007F, // 0x7B + 0xAEEC, 0xFFF7, 0x4CEE, 0x007F, // 0x7C + 0xAEEC, 0xEFF7, 0x4CEE, 0x007F, // 0x7D + 0xAEEC, 0xAFF7, 0x4CEE, 0x007F, // 0x7E + 0xEEEC, 0xFEE7, 0x4CEE, 0x007E, // 0x7F + 0xEEEC, 0xFDC7, 0x4CEE, 0x007E, // 0x80 + 0xEEEC, 0x9EE7, 0x4CEE, 0x007F, // 0x81 + 0x622C, 0xC897, 0x4CEE, 0x007E, // 0x82 + 0x22AC, 0x88A7, 0x4CE2, 0x0078, // 0x83 + 0xE6EC, 0xECE7, 0x4CEE, 0x007E, // 0x84 + 0x152C, 0x8A43, 0xC295, 0x349A, // 0x85 + 0x152C, 0x8A43, 0xC29D, 0x349B, // 0x86 + 0x152C, 0x8A43, 0xC21D, 0x348B, // 0x87 + 0x152C, 0x8A43, 0xC259, 0x34A9, // 0x88 + 0x152C, 0x8A43, 0xC21D, 0x3488, // 0x89 + 0x152C, 0x8A43, 0xC299, 0x3499, // 0x8A + 0x152C, 0x8A43, 0xC2D9, 0x34B9, // 0x8B + 0x152C, 0x8A43, 0xC259, 0x349A, // 0x8C + 0x352C, 0xCA43, 0xC291, 0x3498, // 0x8D + 0x512C, 0xA843, 0xC211, 0x3488, // 0x8E + 0x552C, 0xAA43, 0xC655, 0x36AA, // 0x8F + 0x152C, 0x8A43, 0xC291, 0x34BA, // 0x90 + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x91 + 0x585A, 0x1A4A, 0x0040, 0x0204, // 0x92 + 0x5A5A, 0x5A5A, 0x5A5A, 0x5A5A, // 0x93 + 0x50FF, 0x50FF, 0x5A5A, 0x5A5A, // 0x94 + 0x5A0F, 0x5A0F, 0x5A5A, 0x5A5A, // 0x95 + 0x10FF, 0xE0FF, 0x7591, 0x889A, // 0x96 + 0x70FF, 0xE0FF, 0x7599, 0xE99A, // 0x97 + 0x10FF, 0x80FF, 0x11D7, 0x8CB8, // 0x98 + 0x10FF, 0x80FF, 0xE311, 0x7888, // 0x99 + 0x10FF, 0x00FF, 0x000E, 0x000F, // 0x9A + 0x00FF, 0x00FF, 0x000F, 0x000F, // 0x9B + 0x0000, 0x0000, 0x000F, 0x000F, // 0x9C + 0xFEFF, 0x7EFB, 0xFEFF, 0x7EFF, // 0x9D + 0x0A5B, 0x52DB, 0x2051, 0x0272, // 0x9E + 0x7EDB, 0x7EDB, 0x7EDB, 0x7EDB, // 0x9F + 0x7E0F, 0x7E0F, 0x7EDB, 0x7EDB, // 0xA0 + 0x7E05, 0x7E05, 0x7EDB, 0x7EDB, // 0xA1 + 0x3E0F, 0x4E0F, 0x729B, 0x7CD9, // 0xA2 + 0x5D1F, 0xBA8F, 0xF1D9, 0xF8A9, // 0xA3 + 0x5C0F, 0x2B0F, 0x70D5, 0x78BA, // 0xA4 + 0x135F, 0x000B, 0x1011, 0x0000, // 0xA5 + 0xF8BB, 0x0C9F, 0x7513, 0x0001, // 0xA6 + 0x153E, 0x0078, 0x1222, 0x0000, // 0xA7 + 0x0117, 0x000B, 0x1011, 0x0000, // 0xA8 + 0x0000, 0x0000, 0x0000, 0x0000, // 0xA9 + 0xFFCD, 0x0000, 0x0000, 0x0000, // 0xAA + 0x0000, 0xFF3B, 0x0000, 0x0000, // 0xAB + 0x0000, 0x0000, 0xDCFF, 0x0000, // 0xAC + 0x0000, 0x0000, 0x0000, 0xB3FF, // 0xAD + 0xFF0F, 0xFF0F, 0x0000, 0x0000, // 0xAE + 0xDDDD, 0x0000, 0xDDDD, 0x0000, // 0xAF + 0x7BCD, 0x1000, 0x0008, 0xB3DE, // 0xB0 + 0x8000, 0xED3B, 0xDCB7, 0x0001, // 0xB1 + 0x0000, 0xBBBB, 0x0000, 0xBBBB, // 0xB2 + 0x0000, 0x0000, 0xF0FF, 0xF0FF, // 0xB3 + 0xDD1F, 0xFF0F, 0xDDDD, 0x0000, // 0xB4 + 0xFF0F, 0xBB8F, 0x0000, 0xBBBB, // 0xB5 + 0xDDDD, 0x0000, 0xF1DD, 0xF0FF, // 0xB6 + 0x0000, 0xBBBB, 0xF0FF, 0xF8BB, // 0xB7 + 0x0000, 0x1248, 0x1248, 0x0000, // 0xB8 + 0x8421, 0x0000, 0x0000, 0x8421, // 0xB9 + 0x4801, 0x5A5A, 0x5A5A, 0x8012, // 0xBA + 0x111E, 0x8887, 0xE111, 0x7888, // 0xBB + 0xDD1E, 0xBB87, 0xE1DD, 0x78BB, // 0xBC + 0xD91E, 0xB987, 0xE111, 0x7888, // 0xBD + 0xD91E, 0xB987, 0xE19D, 0x789B, // 0xBE + 0xD51E, 0x8887, 0xE1DD, 0x78B9, // 0xBF + 0x151E, 0xBA87, 0xE1D9, 0x78BA // 0xC0 +); + +#define DUNGEON_SETS 9 + +const int dungeon_sets[] = int[18]( + 0x01, 192, // ALL + 0x01, 36, // ENTITIES + 0x27, 3, // HEARTS + 0x25, 36, // OBJECTS + 0x61, 20, // SELECT + 0x7B, 10, // CHAT + 0x85, 12, // EMOTION + 0x91, 42, // TILES + 0xBB, 6 // SQUARES +); + +bool dungeon(vec2 pos, int code) +{ + if (pos.x < .0 || pos.y < .0 || pos.x >= 1. || pos.y >= 1. || code < 0 || code >= DUNGEON_COUNT) { + return false; + } + ivec2 pos2 = ivec2(pos.x * 8., (1 - pos.y) * 8.); + ivec2 subpos = pos2 % 4; + int v = int(pow(2., subpos.y * 4. + subpos.x)); + int d = int(pos2.y * .25) * 2 + int(pos2.x * .25); + return (dungeon_glyphs[code * 4 + d] & v) > 0; +} + +float dungeon_at(vec2 uv, vec2 pos, int code) +{ + return dungeon(uv - pos, code) ? 1. : 0.; +} + +int dungeon_set_glyph(int set, float v) +{ + if (v < .0 || v >= 1. || set < 0. || set >= DUNGEON_SETS) { + return 0; + } + return dungeon_sets[set * 2] + int(v * dungeon_sets[set * 2 + 1]); +} + +#endif /* INC_DUNGEON */ \ No newline at end of file diff --git a/project/inc_src.glsl b/project/inc_src.glsl index 2b454af..890942d 100644 --- a/project/inc_src.glsl +++ b/project/inc_src.glsl @@ -158,7 +158,7 @@ vec4 src_5(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 return vec4(f); } -// SRC 6 : circuit +// SRC 6 : cp437 vec4 src_6(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { // start @@ -169,138 +169,6 @@ vec4 src_6(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 // 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); -} - -// SRC 7 : cp437 -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.); @@ -324,9 +192,9 @@ vec4 src_7(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 return vec4(f); } -// SRC 8 : sentences +// SRC 7 : sentences -vec4 src_8(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +vec4 src_7(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { // start @@ -354,8 +222,8 @@ vec4 src_8(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 return vec4(f); } -// SRC 9 : sentences repeat -vec4 src_9(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) +// SRC 8 : sentences repeat +vec4 src_8(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { // start @@ -389,8 +257,49 @@ vec4 src_9(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 return vec4(f); } -// SRC 10 : isometric grid +// 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 = cp437(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 @@ -441,13 +350,6 @@ vec4 src_10(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec return vec4(f); } -// SRC 11 : video in 2 + thru -vec4 src_11(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) -{ - // TODO find another source - return src_1(vUV, seed, b1, f1, b2, f2, b3, f3); -} - // SRC 12 : Scales vec4 src_12(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) { @@ -523,50 +425,11 @@ vec4 src_13(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec return vec4(f); } -// SRC 14 : Cursor +// SRC 14 : 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); + // 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)