From a160937863383196e6e836e7b7cf77e43f1a0b92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petri=20J=C3=A4rvisalo?= Date: Fri, 24 May 2024 02:01:34 +0300 Subject: [PATCH] Initial workin version, see readme for build info. --- .gitignore | 3 +- 4kdemo.compofiller | 2 +- 4klang.h | 8 +- 4klang.inc | 317 +++++++++++++++++++++++++--------- _shader.glsl | 272 +++++++++++++++++++++++++++++ base.config | 24 ++- common.script | 2 +- debug_audio.dll | Bin 40168 -> 41381 bytes debug_visuals.dll | Bin 34572 -> 34482 bytes final.config | 8 + minified.config | 7 +- shader.glsl | 389 +++++++++++++++--------------------------- shader_minified.h | 156 +++++++++++++++++ timings_and_texts.inc | 22 +-- 14 files changed, 840 insertions(+), 370 deletions(-) create mode 100644 _shader.glsl create mode 100644 shader_minified.h diff --git a/.gitignore b/.gitignore index 3905687..9ca26e0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.obj *.exe *.html -__temp*.* \ No newline at end of file +__temp*.* +*.dll diff --git a/4kdemo.compofiller b/4kdemo.compofiller index a1db361..baa5bd0 100644 --- a/4kdemo.compofiller +++ b/4kdemo.compofiller @@ -6,7 +6,7 @@ PROJECT_INFO_FILE=prod.nfo PROJECT_SCREENSHOT= # Currently active config file name -ACTIVE_CONFIG=base.config +ACTIVE_CONFIG=minified.config # ------- GUI options/preferences -------- # Automatically rebuild DLLs when things have changed? diff --git a/4klang.h b/4klang.h index 6f477e5..668b979 100644 --- a/4klang.h +++ b/4klang.h @@ -1,12 +1,12 @@ // some useful song defines for 4klang #define SAMPLE_RATE 44100 -#define BPM 120.000000 -#define MAX_INSTRUMENTS 3 -#define MAX_PATTERNS 50 +#define BPM 133.000000 +#define MAX_INSTRUMENTS 5 +#define MAX_PATTERNS 52 #define PATTERN_SIZE_SHIFT 4 #define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT) #define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE) -#define SAMPLES_PER_TICK 5512 +#define SAMPLES_PER_TICK 4973 #define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS) #define POLYPHONY 1 #define INTEGER_16BIT diff --git a/4klang.inc b/4klang.inc index 84cc72f..955645b 100644 --- a/4klang.inc +++ b/4klang.inc @@ -4,34 +4,41 @@ %endmacro %define USE_SECTIONS %define SAMPLE_RATE 44100 -%define MAX_INSTRUMENTS 3 +%define MAX_INSTRUMENTS 5 %define MAX_VOICES 1 %define HLD 1 -%define BPM 120.000000 -%define MAX_PATTERNS 50 +%define BPM 133.000000 +%define MAX_PATTERNS 52 %define PATTERN_SIZE_SHIFT 4 %define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT) %define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE) -%define SAMPLES_PER_TICK 5512 -%define DEF_LFO_NORMALIZE 0.0000453515 +%define SAMPLES_PER_TICK 4973 +%define DEF_LFO_NORMALIZE 0.0000502645 %define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS) %define GO4K_USE_16BIT_OUTPUT ;%define GO4K_USE_GROOVE_PATTERN ;%define GO4K_USE_ENVELOPE_RECORDINGS -;%define GO4K_USE_NOTE_RECORDINGS +%define GO4K_USE_NOTE_RECORDINGS %define GO4K_CLIP_OUTPUT +%define GO4K_USE_DST %define GO4K_USE_DLL +%define GO4K_USE_PAN %define GO4K_USE_GLOBAL_DLL %define GO4K_USE_ENV_CHECK +%define GO4K_USE_ENV_MOD_GM %define GO4K_USE_VCO_CHECK +%define GO4K_USE_VCO_PHASE_OFFSET %define GO4K_USE_VCO_SHAPE +%define GO4K_USE_VCO_MOD_TM +%define GO4K_USE_VCO_MOD_DM +%define GO4K_USE_VCO_MOD_CM %define GO4K_USE_VCF_CHECK -%define GO4K_USE_VCF_MOD_FM %define GO4K_USE_VCF_HIGH %define GO4K_USE_VCF_BAND %define GO4K_USE_VCF_PEAK +%define GO4K_USE_VCF_STEREO %define GO4K_USE_DST_CHECK -%define GO4K_USE_DLL_CHORUS +%define GO4K_USE_DST_SH %define GO4K_USE_DLL_CHORUS_CLAMP %define GO4K_USE_DLL_DAMP %define GO4K_USE_DLL_DC_FILTER @@ -445,25 +452,51 @@ section .data align=1 %endif go4k_patterns db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - db 48, HLD, HLD, 48, HLD, HLD, 43, HLD, 41, HLD, HLD, 41, 0, 0, 0, 0, - db 41, HLD, HLD, 41, HLD, HLD, 43, HLD, 48, HLD, HLD, 48, 0, 0, 0, 0, - db 43, HLD, HLD, 43, HLD, HLD, 46, HLD, 48, HLD, HLD, 48, 0, 0, 0, 0, - db 41, HLD, HLD, 41, HLD, HLD, 53, HLD, 41, HLD, HLD, 41, 0, 0, 0, 0, - db 48, HLD, HLD, 48, HLD, HLD, 60, HLD, 48, HLD, HLD, 48, 0, 0, 0, 0, - db 0, 0, 84, HLD, HLD, HLD, 79, 0, 82, 79, 0, 77, 0, 75, HLD, 0, - db 72, 0, 72, 0, 75, 0, 82, 79, HLD, HLD, 79, 0, 0, 0, 0, 0, - db 72, 0, 72, 0, 75, 0, 75, 72, HLD, HLD, 72, 0, 0, 0, 0, 0, - db 87, HLD, HLD, HLD, 0, 0, 84, 0, 0, 0, 84, 0, 84, 0, 0, 0, - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 82, 0, 84, 82, 79, - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, HLD, 0, 89, 0, 87, 0, - db 89, HLD, HLD, HLD, 0, 0, 84, 0, 0, 0, 84, 0, 84, 0, 0, 0, - db 75, HLD, HLD, 75, HLD, HLD, 70, HLD, 68, HLD, HLD, 68, 0, 0, 0, 0, - db 68, HLD, HLD, 68, HLD, HLD, 70, HLD, 75, HLD, HLD, 75, 0, 0, 0, 0, - db 70, HLD, HLD, 70, HLD, HLD, 70, HLD, 75, HLD, HLD, 75, 0, 0, 0, 0, - db 68, HLD, HLD, 68, HLD, HLD, 70, HLD, HLD, 70, HLD, HLD, 70, HLD, 0, 0, - db 68, HLD, HLD, 68, HLD, HLD, 68, HLD, 70, HLD, HLD, 70, 0, 0, 70, HLD, - db 70, HLD, HLD, 70, HLD, HLD, 75, HLD, HLD, 75, HLD, HLD, 75, HLD, 0, 0, - db 70, HLD, HLD, 70, HLD, HLD, 70, HLD, 75, HLD, HLD, 75, 0, 0, 75, HLD, + db 38, HLD, 0, 0, 38, HLD, HLD, HLD, 0, 0, 38, 0, 48, 50, HLD, HLD, + db 0, 0, 50, 0, 38, HLD, HLD, HLD, 50, 0, 50, 0, 38, HLD, HLD, HLD, + db 0, 0, 38, 0, 38, HLD, 38, 38, 48, HLD, 50, HLD, 53, HLD, 52, HLD, + db 38, 0, 38, 0, 38, HLD, HLD, HLD, HLD, HLD, 0, 0, 38, HLD, 50, HLD, + db 0, 0, 50, 0, 38, 0, 38, 38, 46, HLD, 48, HLD, 57, HLD, 48, HLD, + db 46, HLD, 0, 0, 46, HLD, HLD, HLD, 0, 0, 46, 0, 47, HLD, 48, HLD, + db 0, 0, 48, 0, 36, HLD, HLD, HLD, 36, 0, 48, 0, 48, HLD, HLD, HLD, + db 38, HLD, 0, 0, 38, HLD, HLD, HLD, 0, 0, 38, 0, 48, HLD, 50, HLD, + db HLD, 0, 50, 0, 38, HLD, HLD, HLD, 38, HLD, 50, HLD, 48, HLD, 36, HLD, + db 43, HLD, 0, 0, 43, HLD, HLD, HLD, 55, HLD, 43, HLD, HLD, HLD, 55, HLD, + db 41, 0, 41, 0, 41, HLD, HLD, HLD, 53, HLD, 41, HLD, 41, HLD, HLD, HLD, + db 40, HLD, 0, 0, 40, HLD, HLD, HLD, 52, HLD, 40, HLD, HLD, HLD, 52, HLD, + db 45, 0, 45, 0, 45, HLD, HLD, HLD, 57, HLD, 45, HLD, 45, HLD, HLD, HLD, + db 50, HLD, 0, 0, 50, HLD, HLD, HLD, 62, HLD, 50, HLD, HLD, HLD, 62, HLD, + db 43, 0, 43, 0, 43, HLD, HLD, HLD, 55, HLD, 43, HLD, 43, HLD, HLD, HLD, + db 48, HLD, 0, 0, 48, HLD, HLD, HLD, 60, HLD, 48, HLD, HLD, HLD, 60, HLD, + db 48, 0, 48, 0, 48, HLD, HLD, HLD, 60, HLD, 48, HLD, 48, HLD, HLD, HLD, + db 48, HLD, HLD, 48, HLD, HLD, 48, HLD, HLD, HLD, 48, HLD, HLD, HLD, 48, HLD, + db HLD, HLD, 48, HLD, HLD, HLD, 48, 48, HLD, HLD, 48, HLD, HLD, HLD, HLD, HLD, + db 48, HLD, HLD, 48, HLD, HLD, 48, HLD, HLD, HLD, 48, HLD, HLD, HLD, HLD, HLD, + db HLD, HLD, 48, HLD, HLD, HLD, 48, HLD, HLD, HLD, 48, HLD, HLD, HLD, HLD, HLD, + db 48, HLD, 48, HLD, HLD, HLD, 48, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 48, HLD, 48, HLD, HLD, HLD, 48, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 48, HLD, + db 48, HLD, HLD, HLD, HLD, HLD, 48, HLD, HLD, HLD, 48, HLD, HLD, HLD, HLD, HLD, + db 0, 0, 0, 0, 0, 0, 0, 0, 60, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 60, HLD, HLD, HLD, 60, HLD, HLD, HLD, + db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 60, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 48, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 74, HLD, HLD, HLD, HLD, HLD, 69, HLD, HLD, HLD, HLD, HLD, 72, HLD, HLD, HLD, + db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 74, HLD, HLD, HLD, 76, HLD, HLD, HLD, + db 77, HLD, HLD, HLD, 76, HLD, 74, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0, + db 74, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, + db 70, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 72, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 76, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 77, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 79, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 81, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 76, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 67, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 69, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 73, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 71, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, go4k_patterns_end %ifdef USE_SECTIONS section .g4kmuc2 data align=1 @@ -471,9 +504,11 @@ section .g4kmuc2 data align=1 section .data %endif go4k_pattern_lists -Instrument0List db 0, 0, 0, 0, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 0, 0, 0, 0, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 0, 0, -Instrument1List db 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 6, 8, 6, 7, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 9, 11, 12, 11, 12, 0, 6, 7, 6, 8, 6, 7, 6, 8, 9, 11, 9, 0, 6, 7, 6, 8, 0, 0, -Instrument2List db 13, 14, 13, 15, 13, 14, 13, 15, 13, 14, 13, 15, 13, 14, 13, 15, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 13, 14, 13, 15, 13, 14, 13, 15, 13, 14, 13, 0, 13, 14, 13, 15, 0, 0, +Instrument0List db 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 4, 5, 1, 3, 1, 2, 6, 7, 8, 9, 6, 7, 1, 2, 10, 11, 12, 13, 14, 15, 16, 17, 10, 11, 12, 13, 14, 15, 16, 17, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, +Instrument2List db 18, 19, 18, 19, 18, 19, 18, 19, 20, 21, 20, 21, 18, 21, 18, 21, 18, 21, 18, 21, 18, 21, 18, 21, 18, 21, 18, 21, 18, 21, 18, 21, 18, 21, 18, 21, 18, 21, 18, 21, 22, 21, 23, 19, 24, 21, 18, 19, 24, 21, 18, 19, +Instrument3List db 25, 26, 27, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, 28, 26, +Instrument4List db 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 31, 32, 29, 30, 33, 32, 29, 30, 31, 32, 29, 30, 33, 34, 35, 36, 33, 37, 38, 39, 38, 37, 35, 36, 33, 37, 38, 39, 40, 39, 38, 41, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, +Instrument5List db 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 31, 32, 29, 30, 33, 32, 29, 30, 31, 32, 29, 30, 33, 34, 42, 43, 35, 44, 36, 33, 36, 36, 42, 43, 35, 44, 36, 45, 43, 42, 38, 41, 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, go4k_pattern_lists_end %ifdef USE_SECTIONS section .g4kmuc3 data align=1 @@ -483,45 +518,101 @@ section .data go4k_synth_instructions GO4K_BEGIN_CMDDEF(Instrument0) db GO4K_ENV_ID - db GO4K_ENV_ID + db GO4K_VCO_ID db GO4K_FST_ID db GO4K_FOP_ID db GO4K_VCO_ID + db GO4K_FST_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_VCO_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_FOP_ID + db GO4K_FOP_ID + db GO4K_VCF_ID + db GO4K_FOP_ID + db GO4K_PAN_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +GO4K_BEGIN_CMDDEF(Instrument2) + db GO4K_ENV_ID + db GO4K_FST_ID + db GO4K_ENV_ID + db GO4K_DST_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_VCO_ID + db GO4K_FOP_ID + db GO4K_PAN_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +GO4K_BEGIN_CMDDEF(Instrument3) + db GO4K_ENV_ID + db GO4K_FST_ID + db GO4K_ENV_ID + db GO4K_FST_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_VCF_ID + db GO4K_FOP_ID + db GO4K_FOP_ID db GO4K_FOP_ID db GO4K_VCF_ID db GO4K_PAN_ID db GO4K_OUT_ID GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument1) +GO4K_BEGIN_CMDDEF(Instrument4) db GO4K_ENV_ID + db GO4K_FST_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_FST_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_FOP_ID + db GO4K_FOP_ID + db GO4K_VCF_ID + db GO4K_VCF_ID + db GO4K_DST_ID + db GO4K_PAN_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +GO4K_BEGIN_CMDDEF(Instrument5) db GO4K_ENV_ID + db GO4K_VCO_ID db GO4K_FST_ID db GO4K_FOP_ID db GO4K_VCO_ID + db GO4K_FST_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_VCO_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_FOP_ID db GO4K_FOP_ID db GO4K_VCF_ID db GO4K_FOP_ID - db GO4K_VCF_ID db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_VCF_ID + db GO4K_PAN_ID db GO4K_DLL_ID db GO4K_OUT_ID GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument2) - db GO4K_ENV_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF GO4K_BEGIN_CMDDEF(Global) db GO4K_ACC_ID db GO4K_DLL_ID @@ -540,55 +631,111 @@ section .data %endif go4k_synth_parameter_values GO4K_BEGIN_PARAMDEF(Instrument0) - GO4K_ENV ATTAC(5),DECAY(85),SUSTAIN(107),RELEASE(0),GAIN(128) - GO4K_ENV ATTAC(59),DECAY(95),SUSTAIN(0),RELEASE(64),GAIN(91) - GO4K_FST AMOUNT(80),DEST(6*MAX_UNIT_SLOTS+4+FST_SET) + GO4K_ENV ATTAC(9),DECAY(85),SUSTAIN(113),RELEASE(38),GAIN(119) + GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(TRISAW|LFO) + GO4K_FST AMOUNT(52),DEST(11*MAX_UNIT_SLOTS+2+FST_SET) GO4K_FOP OP(FOP_POP) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(TRISAW) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(20),RESONANCE(23),VCFTYPE(LOWPASS) - GO4K_PAN PANNING(64) - GO4K_OUT GAIN(64), AUXSEND(0) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument1) - GO4K_ENV ATTAC(23),DECAY(66),SUSTAIN(20),RELEASE(64),GAIN(128) - GO4K_ENV ATTAC(75),DECAY(77),SUSTAIN(20),RELEASE(64),GAIN(128) - GO4K_FST AMOUNT(92),DEST(6*MAX_UNIT_SLOTS+4+FST_SET) + GO4K_VCO TRANSPOSE(41),DETUNE(42),PHASE(55),GATES(85),COLOR(54),SHAPE(63),GAIN(128),FLAGS(SINE|LFO) + GO4K_FST AMOUNT(75),DEST(12*MAX_UNIT_SLOTS+2+FST_SET) + GO4K_FST AMOUNT(59),DEST(12*MAX_UNIT_SLOTS+5+FST_SET) GO4K_FOP OP(FOP_POP) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(PULSE) + GO4K_VCO TRANSPOSE(74),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(SINE|LFO) + GO4K_FST AMOUNT(69),DEST(13*MAX_UNIT_SLOTS+2+FST_SET) + GO4K_FOP OP(FOP_POP) + GO4K_VCO TRANSPOSE(64),DETUNE(76),PHASE(22),GATES(85),COLOR(0),SHAPE(64),GAIN(128),FLAGS(TRISAW) + GO4K_VCO TRANSPOSE(64),DETUNE(60),PHASE(87),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(TRISAW) + GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(106),GAIN(128),FLAGS(SINE) + GO4K_FOP OP(FOP_ADDP) + GO4K_FOP OP(FOP_ADDP) + GO4K_VCF FREQUENCY(128),RESONANCE(89),VCFTYPE(LOWPASS|STEREO) GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(38),RESONANCE(45),VCFTYPE(BANDPASS) - GO4K_FOP OP(FOP_PUSH) - GO4K_VCF FREQUENCY(56),RESONANCE(80),VCFTYPE(BANDSTOP) - GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(35),DEPTH(57),DELAY(17),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_VCF FREQUENCY(45),RESONANCE(94),VCFTYPE(BANDSTOP) - GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(8),DEPTH(61),DELAY(18),COUNT(1) - GO4K_OUT GAIN(64), AUXSEND(0) + GO4K_PAN PANNING(63) + GO4K_OUT GAIN(128), AUXSEND(55) GO4K_END_PARAMDEF GO4K_BEGIN_PARAMDEF(Instrument2) - GO4K_ENV ATTAC(36),DECAY(75),SUSTAIN(0),RELEASE(64),GAIN(128) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(89),GAIN(128),FLAGS(TRISAW) - GO4K_VCO TRANSPOSE(68),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(89),GAIN(128),FLAGS(TRISAW) + GO4K_ENV ATTAC(0),DECAY(83),SUSTAIN(0),RELEASE(0),GAIN(100) + GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2+FST_SET) + GO4K_ENV ATTAC(0),DECAY(73),SUSTAIN(0),RELEASE(0),GAIN(128) + GO4K_DST DRIVE(27), SNHFREQ(128), FLAGS(0) + GO4K_FST AMOUNT(86),DEST(6*MAX_UNIT_SLOTS+1+FST_SET) + GO4K_FOP OP(FOP_MULP) + GO4K_VCO TRANSPOSE(38),DETUNE(128),PHASE(20),GATES(85),COLOR(64),SHAPE(88),GAIN(90),FLAGS(TRISAW) + GO4K_FOP OP(FOP_MULP) + GO4K_PAN PANNING(64) + GO4K_OUT GAIN(128), AUXSEND(0) +GO4K_END_PARAMDEF +GO4K_BEGIN_PARAMDEF(Instrument3) + GO4K_ENV ATTAC(0),DECAY(74),SUSTAIN(0),RELEASE(0),GAIN(93) + GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2+FST_SET) + GO4K_ENV ATTAC(0),DECAY(57),SUSTAIN(64),RELEASE(0),GAIN(128) + GO4K_FST AMOUNT(66),DEST(6*MAX_UNIT_SLOTS+1+FST_SET) + GO4K_FST AMOUNT(58),DEST(7*MAX_UNIT_SLOTS+1+FST_SET) + GO4K_FOP OP(FOP_POP) + GO4K_VCO TRANSPOSE(63),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(127),GAIN(83),FLAGS(NOISE) + GO4K_VCO TRANSPOSE(62),DETUNE(59),PHASE(14),GATES(85),COLOR(64),SHAPE(89),GAIN(67),FLAGS(SINE) + GO4K_VCO TRANSPOSE(68),DETUNE(64),PHASE(0),GATES(85),COLOR(42),SHAPE(65),GAIN(14),FLAGS(TRISAW) + GO4K_VCF FREQUENCY(98),RESONANCE(128),VCFTYPE(LOWPASS) GO4K_FOP OP(FOP_ADDP) - GO4K_VCO TRANSPOSE(71),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(85),GAIN(128),FLAGS(TRISAW) GO4K_FOP OP(FOP_ADDP) GO4K_FOP OP(FOP_MULP) - GO4K_FOP OP(FOP_PUSH) - GO4K_VCF FREQUENCY(36),RESONANCE(49),VCFTYPE(BANDPASS) + GO4K_VCF FREQUENCY(22),RESONANCE(11),VCFTYPE(HIGHPASS) + GO4K_PAN PANNING(64) + GO4K_OUT GAIN(45), AUXSEND(28) +GO4K_END_PARAMDEF +GO4K_BEGIN_PARAMDEF(Instrument4) + GO4K_ENV ATTAC(79),DECAY(96),SUSTAIN(95),RELEASE(82),GAIN(128) + GO4K_FST AMOUNT(68),DEST(0*MAX_UNIT_SLOTS+2+FST_SET) + GO4K_VCO TRANSPOSE(64),DETUNE(59),PHASE(0),GATES(85),COLOR(52),SHAPE(64),GAIN(128),FLAGS(PULSE) + GO4K_VCO TRANSPOSE(76),DETUNE(64),PHASE(64),GATES(85),COLOR(101),SHAPE(127),GAIN(111),FLAGS(TRISAW) + GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(TRISAW|LFO) + GO4K_FST AMOUNT(61),DEST(2*MAX_UNIT_SLOTS+2+FST_SET) + GO4K_FST AMOUNT(63),DEST(3*MAX_UNIT_SLOTS+2+FST_SET) + GO4K_FOP OP(FOP_POP) + GO4K_FOP OP(FOP_ADDP) + GO4K_FOP OP(FOP_MULP) + GO4K_VCF FREQUENCY(26),RESONANCE(36),VCFTYPE(PEAK) + GO4K_VCF FREQUENCY(80),RESONANCE(44),VCFTYPE(LOWPASS) + GO4K_DST DRIVE(109), SNHFREQ(85), FLAGS(0) + GO4K_PAN PANNING(64) + GO4K_DLL PREGAIN(72),DRY(123),FEEDBACK(90),DAMP(49),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) GO4K_FOP OP(FOP_XCH) - GO4K_VCF FREQUENCY(49),RESONANCE(28),VCFTYPE(BANDPASS) - GO4K_OUT GAIN(46), AUXSEND(0) + GO4K_DLL PREGAIN(98),DRY(112),FEEDBACK(62),DAMP(45),FREQUENCY(0),DEPTH(0),DELAY(18),COUNT(1) + GO4K_FOP OP(FOP_XCH) + GO4K_OUT GAIN(59), AUXSEND(59) +GO4K_END_PARAMDEF +GO4K_BEGIN_PARAMDEF(Instrument5) + GO4K_ENV ATTAC(64),DECAY(70),SUSTAIN(70),RELEASE(88),GAIN(128) + GO4K_VCO TRANSPOSE(69),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(SINE|LFO) + GO4K_FST AMOUNT(72),DEST(11*MAX_UNIT_SLOTS+2+FST_SET) + GO4K_FOP OP(FOP_POP) + GO4K_VCO TRANSPOSE(73),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(SINE|LFO) + GO4K_FST AMOUNT(56),DEST(12*MAX_UNIT_SLOTS+2+FST_SET) + GO4K_FST AMOUNT(56),DEST(12*MAX_UNIT_SLOTS+5+FST_SET) + GO4K_FOP OP(FOP_POP) + GO4K_VCO TRANSPOSE(77),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(SINE|LFO) + GO4K_FST AMOUNT(72),DEST(13*MAX_UNIT_SLOTS+2+FST_SET) + GO4K_FOP OP(FOP_POP) + GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(0),SHAPE(64),GAIN(128),FLAGS(TRISAW) + GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(0),SHAPE(64),GAIN(128),FLAGS(TRISAW) + GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(0),SHAPE(64),GAIN(128),FLAGS(TRISAW) + GO4K_FOP OP(FOP_ADDP) + GO4K_FOP OP(FOP_ADDP) + GO4K_VCF FREQUENCY(104),RESONANCE(96),VCFTYPE(LOWPASS) + GO4K_FOP OP(FOP_MULP) + GO4K_DLL PREGAIN(64),DRY(64),FEEDBACK(64),DAMP(0),FREQUENCY(0),DEPTH(0),DELAY(19),COUNT(1) + GO4K_PAN PANNING(64) + GO4K_DLL PREGAIN(128),DRY(0),FEEDBACK(0),DAMP(0),FREQUENCY(0),DEPTH(0),DELAY(20),COUNT(1) + GO4K_OUT GAIN(128), AUXSEND(47) GO4K_END_PARAMDEF GO4K_BEGIN_PARAMDEF(Global) GO4K_ACC ACCTYPE(AUX) - GO4K_DLL PREGAIN(40),DRY(128),FEEDBACK(113),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(1),COUNT(8) + GO4K_DLL PREGAIN(39),DRY(90),FEEDBACK(93),DAMP(62),FREQUENCY(0),DEPTH(0),DELAY(1),COUNT(8) GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(40),DRY(128),FEEDBACK(103),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(9),COUNT(8) + GO4K_DLL PREGAIN(41),DRY(128),FEEDBACK(93),DAMP(74),FREQUENCY(0),DEPTH(0),DELAY(9),COUNT(8) GO4K_FOP OP(FOP_XCH) GO4K_ACC ACCTYPE(OUTPUT) GO4K_FOP OP(FOP_ADDP2) - GO4K_OUT GAIN(64), AUXSEND(16) + GO4K_OUT GAIN(67), AUXSEND(0) GO4K_END_PARAMDEF go4k_synth_parameter_values_end %ifdef USE_SECTIONS @@ -616,6 +763,8 @@ _go4k_delay_times dw 1516 dw 1580 dw 1642 - dw 22050 - dw 16537 + dw 19894 + dw 13263 + dw 29842 + dw 512 %endif diff --git a/_shader.glsl b/_shader.glsl new file mode 100644 index 0000000..ab6f27a --- /dev/null +++ b/_shader.glsl @@ -0,0 +1,272 @@ +// Compofiller Studio by Yzi 2018 +// +// Default template shader + +// This shader program is executed in the GPU (or a CPU-based emulation) for +// every pixel (i.e. "fragment" in OpenGL jargon) of every frame. + +// The "uniforms" are the same (i.e. uniform) for all pixels/fragments of the frame, +// and they come from the main program. +uniform float time; +uniform vec2 resolution; + +// If you choose to save some bytes and not use either of these uniforms, you have to +// do some additional tricks. +// * time : if you uncheck "[ ] Use time uniform" checkbox, time is in gl_Color.y (green component) +// * resolution : if you uncheck "[ ] Use resolution uniform" checkbox, you'll have to hard-code the resolution manually + +// The uniform-less version could look like this, 88200.0 being the time divider +//float time = gl_Color.y * 256.0 * (65536.0 / 88200.0); +//vec2 resolution = vec2(1280.0, 720.0); + +// Uncomment this to use the texture-based features +uniform sampler2D texture_sampler; + +// Uncomment this to use the texture-based features +uniform sampler2D texts; + +// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. +// Created by S. Guillitte 2015 + +float zoom=1.; + +vec2 cmul( vec2 a, vec2 b ) { return vec2( a.x*b.x - a.y*b.y, a.x*b.y + a.y*b.x ); } +vec2 csqr( vec2 a ) { return vec2( a.x*a.x - a.y*a.y, 2.*a.x*a.y ); } + + +mat2 rot(float a) { + return mat2(cos(a),sin(a),-sin(a),cos(a)); +} + +vec2 iSphere( in vec3 ro, in vec3 rd, in vec4 sph )//from iq +{ + vec3 oc = ro - sph.xyz; + float b = dot( oc, rd ); + float c = dot( oc, oc ) - sph.w*sph.w; + float h = b*b - c; + if( h<0.0 ) return vec2(-1.0); + h = sqrt(h); + return vec2(-b-h, -b+h ); +} + +float map(in vec3 p) { + + float res = 0.; + + vec3 c = p; + for (int i = 0; i < 10; ++i) { + p =.7*abs(p)/dot(p,p) -.7; + p.yz= csqr(p.yz); + p=p.zxy; + res += exp(-19. * abs(dot(p,c))); + + } + return res/2.; +} + + + +vec3 raymarch( in vec3 ro, vec3 rd, vec2 tminmax ) +{ + float t = tminmax.x; + float dt = .02; + //float dt = .2 - .195*cos(iTime*.05);//animated + vec3 col= vec3(0.); + float c = 0.; + for( int i=0; i<64; i++ ) + { + t+=dt*exp(-2.*c); + if(t>tminmax.y)break; + + c = map(ro+t*rd); + + col = .99*col+ .08*vec3(c*c, c, c*c*c);//green + //col = .99*col+ .08*vec3(c*c*c, c*c, c);//blue + } + return col; +} + + +void CoolSphere( out vec4 fragColor, in vec2 fragCoord ) +{ + float time = time; + vec2 q = fragCoord.xy / resolution.xy; + vec2 p = -1.0 + 2.0 * q; + p.x *= resolution.x/resolution.y; + vec2 m = vec2(0.); + m-=.5; + + // camera + + vec3 ro = zoom*vec3(4.); + ro.yz*=rot(m.y); + ro.xz*=rot(m.x+ 0.1*time); + vec3 ta = vec3( 0.0 , 0.0, 0.0 ); + vec3 ww = normalize( ta - ro ); + vec3 uu = normalize( cross(ww,vec3(0.0,1.0,0.0) ) ); + vec3 vv = normalize( cross(uu,ww)); + vec3 rd = normalize( p.x*uu + p.y*vv + 4.0*ww ); + + + vec2 tmm = iSphere( ro, rd, vec4(0.,0.,0.,2.) ); + + // raymarch + vec3 col = raymarch(ro,rd,tmm); + if (tmm.x<0.)col = texture2D(texture_sampler, rd).rgb; + else { + vec3 nor=(ro+tmm.x*rd)/2.; + nor = reflect(rd, nor); + float fre = pow(.5+ clamp(dot(nor,rd),0.0,1.0), 3. )*1.3; + col += texture2D(texture_sampler, nor).rgb * fre; + + } + + // shade + + col = .5 *(log(1.+col)); + col = clamp(col,0.,1.); + fragColor = vec4( col, 1.0 ); + +} + + +float bar = time; // this is just a coding nicety to highlight that in some calculations we want musical time ... you wouldn't want to have this in a real prod's final version +// --- noise from procedural pseudo-Perlin (better but not so nice derivatives) --------- + // ( adapted from IQ ) + +float gTime = 0.; + +float sdBox( vec3 p, vec3 b ) +{ + vec3 q = abs(p) - b; + return length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0); +} + +float box(vec3 pos, float scale) { + pos *= scale; + float base = sdBox(pos, vec3(.4,.4,.1)) /1.5; + pos.xy *= 5.; + pos.y -= 3.5; + pos.xy *= rot(.75); + float result = -base; + return result; +} + +float box_set(vec3 pos, float time) { + vec3 pos_origin = pos; + pos = pos_origin; + pos .y += sin(gTime * 0.4) * 2.5; + pos.xy *= rot(.8); + float box1 = box(pos,2. - abs(sin(gTime * 0.4)) * 1.5); + pos = pos_origin; + pos .y -=sin(gTime * 0.4) * 2.5; + pos.xy *= rot(.8); + float box2 = box(pos,2. - abs(sin(gTime * 0.4)) * 1.5); + pos = pos_origin; + pos .x +=sin(gTime * 0.4) * 2.5; + pos.xy *= rot(.8); + float box3 = box(pos,2. - abs(sin(gTime * 0.4)) * 1.5); + pos = pos_origin; + pos .x -=sin(gTime * 0.4) * 2.5; + pos.xy *= rot(.8); + float box4 = box(pos,2. - abs(sin(gTime * 0.4)) * 1.5); + pos = pos_origin; + pos.xy *= rot(.8); + float box5 = box(pos,.5) * 6.; + pos = pos_origin; + float box6 = box(pos,.5) * 6.; + float result = max(max(max(max(max(box1,box2),box3),box4),box5),box6); + return result; +} + +float map(vec3 pos, float time) { + vec3 pos_origin = pos; + float box_set1 = box_set(pos, time); + + return box_set1; +} + + +void mainImage2( out vec4 fragColor, in vec2 fragCoord ) { + vec2 p = (fragCoord.xy * 2. - resolution.xy) / min(resolution.x, resolution.y); + vec3 ro = vec3(0., -0.2 ,time * 4.); + vec3 ray = normalize(vec3(p, 1.5)); + ray.xy = ray.xy * rot(sin(time * .03) * 5.); + ray.yz = ray.yz * rot(sin(time * .05) * .2); + float t = 0.1; + vec3 col = vec3(0.); + float ac = 0.0; + + + for (int i = 0; i < 99; i++){ + vec3 pos = ro + ray * t; + pos = mod(pos-2., 4.) -2.; + gTime = time -float(i) * 0.01; + + float d = map(pos, time); + + d = max(abs(d), 0.01); + ac += exp(-d*23.); + + t += d* 0.55; + } + + col = vec3(ac * 0.02); + + col +=vec3(0.,0.2 * abs(sin(time)),0.5 + sin(time) * 0.2); + + + fragColor = vec4(col ,1.0 - t * (0.02 + 0.02 * sin (time))); +} + +float noise3( vec3 x ) { + vec3 p = floor(x),f = fract(x); + + f = f*f*(3.-2.*f); // or smoothstep // to make derivative continuous at borders + +#define hash3(p) fract(sin(1e3*dot(p,vec3(1,57,-13.7)))*4375.5453) // rand + + return mix( mix(mix( hash3(p+vec3(0,0,0)), hash3(p+vec3(1,0,0)),f.x), // triilinear interp + mix( hash3(p+vec3(0,1,0)), hash3(p+vec3(1,1,0)),f.x),f.y), + mix(mix( hash3(p+vec3(0,0,1)), hash3(p+vec3(1,0,1)),f.x), + mix( hash3(p+vec3(0,1,1)), hash3(p+vec3(1,1,1)),f.x),f.y), f.z); +} + +#define noise(x) (noise3(x)+noise3(x+11.5)) / 2. // pseudoperlin improvement from foxes idea + +void mainImage3( out vec4 O, vec2 U ) // ------------ draw isovalues +{ + vec2 R = resolution.xy; + float n = noise(vec3(U*8./R.y, .1*time)), + v = sin(6.28*10.*n), + t = time; + + v = smoothstep(1.,0., .5*abs(v)/fwidth(v)); + + O = mix( exp(-33./R.y )* texture2D( texture_sampler, (U+vec2(1,sin(t)))/R), // .97 + .5+.5*sin(12.*n+vec4(0,2.1,-2.1,0)), + v ); + +} + +void main(void) +{ + vec3 l; + + float abstime = abs(time); + if (abstime < 10.0) + CoolSphere(gl_FragColor, gl_FragCoord.xy); + else if (abstime < 15.0) + { + mainImage2(gl_FragColor, gl_FragCoord.xy); + } + else + { + mainImage3(gl_FragColor, gl_FragCoord.xy); + } + + vec2 texttop = vec2(0., -.35), pt = (gl_FragCoord.xy / resolution) - texttop; + if (pt.y > 0.) l = gl_FragColor + texture2D(texts, pt); + gl_FragColor = vec4(l * (1.0), 1.0); + +} diff --git a/base.config b/base.config index 07ae4cd..58292a2 100644 --- a/base.config +++ b/base.config @@ -3,13 +3,13 @@ # Base configuration file ########### Music ############# -MUSIC_4KLANG_INC_FILE= +MUSIC_4KLANG_INC_FILE=4klang.inc MUSIC_BEATS_PER_BAR=4.0 ########### Visuals ############ SHADER_FILE=shader.glsl -RESOLUTION_X=1920 -RESOLUTION_Y=1080 +RESOLUTION_X=1280 +RESOLUTION_Y=720 USE_TIME_UNIFORM=1 TIME_UNIFORM_NAME='time' @@ -29,7 +29,7 @@ USE_TEXTS_UNIFORM=1 TEXTS_UNIFORM_NAME='texts' TEXT_BITMAP_RESOLUTION_X=1024 TEXT_BITMAP_RESOLUTION_Y=1024 -TEXT_FONT_NAME='Arial' +TEXT_FONT_NAME='Segoe UI Black' TEXT_FONT_SIZE=120 TEXT_FONT_STRIKEOUT=0 TEXT_FONT_UNDERLINE=0 @@ -39,33 +39,31 @@ TEXT_FONT_ORIENTATION=0 TEXT_FONT_ESCAPEMENT=0 TEXT_FONT_WIDTH=0 TEXT_CHARACTER_EXTRA_SPACING=0 -USE_WIDECHAR_TEXTS=0 +USE_WIDECHAR_TEXTS=1 ########### Time base ########### USE_TIME_DIVIDER_IN_X86_CODE=1 -TIME_DIVIDER=88200.000 +TIME_DIVIDER=79578.945 TIME_BASE=bars AUDIO_DELAY=2048 -PROD_END_TIME=4411648 +PROD_END_TIME=4139584 ########### Final product ########### # The name of the final EXE -OUTPUT_EXE_NAME=testing.exe +OUTPUT_EXE_NAME=4k_test.exe # this is just the name/text of the GUI option, not the name of the linker executable EXE_LINKER_PROGRAM=Crinkler QUOTE=\" +CRINKLER_ORDERTRIES=4000 -CRINKLER_ORDERTRIES=100 - - -AUDIO_BUFFER_ALLOCATED_LENGTH=4411648 +AUDIO_BUFFER_ALLOCATED_LENGTH=4139584 AUDIO_SAMPLING_RATE=44100 LOOP_END=5.0 LOOP_START=3.0 LOOP_ENABLED=0 -TIME_DIVIDER_INT=88200 +TIME_DIVIDER_INT=79578 diff --git a/common.script b/common.script index 202b2a7..0ca240f 100644 --- a/common.script +++ b/common.script @@ -89,7 +89,7 @@ ifeq ($(EXE_LINKER_PROGRAM),Crinkler) # Crinkler settings # Linker for building standalone EXE files for running FINAL_LINKER_EXE="$(PROGRAM_DIR)\Tools\Crinkler\crinkler.exe" -FINAL_LINKER_OPTS=/SUBSYSTEM:WINDOWS /ENTRY:t /COMPMODE:SLOW /HASHSIZE:200 /HASHTRIES:50 /ORDERTRIES:$(CRINKLER_ORDERTRIES) \ +FINAL_LINKER_OPTS=/SUBSYSTEM:WINDOWS /ENTRY:t /COMPMODE:VERYSLOW /HASHSIZE:500 /HASHTRIES:100 /ORDERTRIES:$(CRINKLER_ORDERTRIES) \ /UNSAFEIMPORT /LIBPATH:$(LIB_PATH) /REPORT:crinkler_report.html /PROGRESSGUI FINAL_LINKER_OUT_OPT=/OUT: FINAL_LINKER_GENERAL_LIBS_PARAMS=kernel32.lib user32.lib diff --git a/debug_audio.dll b/debug_audio.dll index 93f604d98f4e11146e2c4ce0cea06920316750f3..9ca8ee5fe6f63fc05f5ecd055a72725dd929a57c 100644 GIT binary patch literal 41381 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 K_BC12CH;R=K7~*K literal 40168 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 diff --git a/debug_visuals.dll b/debug_visuals.dll index 81185b0811c9525076bc5f7610e76ba28cd788cb..dba295e8ed321607dc940039ba568781ee43ad4b 100644 GIT binary patch delta 2402 zcmZXVYfMyE5Xa~2Ufz!daf|X$T8J29V7s_2*=kq?3fLxvNQJ&!5muHr0v1S&+ooVJ zizvOOF?|FGO{^bCw3nohqzw@%UyMad8%hh|gH1@k1b?w|IY#=vHxX{geqTc5deW^0=isQr(mT;{ww_9L zYYj*}Y*}8Jpq{)kgYJ+T-C8W=GCkzE(;?DC7`kIsZHUVBMd5i;cgTxwEr(WjNb%-< zAVwuPM22A_Y^fnN+_n+SZ{z7r*uA>0Z-LVQ^@?t7#kJIHkvSkumZ|=bCSkC8U3bV; zOPhKy`lbj|XQL})7Y+2CJkN~It5KFcVo`l9rbf(b-^S#L*tzZYS;Ic39^cg(7-mZ!93OP<(#acWk4t60*8;&ZIeye$hu?Z&y9x|=>KI^n5p@ua<4 zl6I`Is=9$5YwP<$#GoxKI}M_vkhYVDn&=EQQa8nrooqM`!B#{q_|?GD4aL*iot;04 zI2Xk={GyP8Yf{NBO4E)Um=@}=X}{_Ev=(}BAR=mp3fihV%ROBk721$v%)DpSzGg>T z5W0nS;iA~0Z98q{wrX3O?V=6s`N8|na51h%ILpwZZ#dJ@qdsSPNDs7O+D+$Gk)Yt# zY#i?Pj<&kyT6>y0dbpv)1-5B}0)1S}ND|2Fj64fc$4C)KmsWA)2T?M+g9uMXDxxRI zILAmNa?LZ60ECvQvH`^0Wo_ z6|+yyux~ffvLFh@y@}jzPjijiEe*zyH6;2Nni&fbWJXnq#z3qaD-CESL5OJ{f!yDU zEaN-@`38S@>48J$HzyITFt>O~f+A=#L9WGaPwxb|9lsR_nv)>s8R-D2Wa%$~5H=j_ z1I83yA{sJ~!~sNf2PA{7>;cFpj4TDb;x+>j{i%-Br2E#vzd|8{b&5_#LbklUAggSm z&x3r*$Z?Pf=5-1rmyu?WDdyE%40MB`8z3vJ24f)mS)jWhX^hONeowmZH}F2@`wvJs zQ(97p{$g(?1q8dpMmx!}IzU{^s}Q7%kqQu5v|vG7d_Zyp(K{eDAi?SmfE2SpAAzOdyosvYZ+vjE#qGh-!K!! z??K-nR$!ZuYs>4@N~$JSAI)lOPec~{sWQ>js^e# delta 2636 zcmZ9NZERCj7{{N}m9e*WgRMilK?+@f5MH{D;+!*#t-v6@)NILyxOA0XXlu7Sx{iS% zsmjEej+b)3I1|Daj7Tz-c>N$V5+WdezyuUC5jA{qF2hKpB;pKQ|L1mFdv?>FbIkWNt6F==RM6;BH!Kt(|58JAoV=Gy& zauel<@-ORUQFWieY?xndBnrGfUp->1&W=qvspu;s#oZOgGmlg6!@RycoL9w5GcP~4 z>Lq!o=!^lc@w$}w^03~@dHUH3V{dW1(fE#u`yRfOqs#8yMdT1^7WY0lX2bEVOVK?c z@@N)6NC>ud0iGa40iHo~agAna#G`ea*`oXU3KM!li6d*=h2#arL5U6Eok*w2$fbJId<9T9#Dy z7W(qub_a-(Zp}5ObQPAW6NQ`D%)%+_7Id+sdU`>XWkWRBA@RAPh}12Id!j+PQ*TD4 z1JQ0G_sF)*k)SV350H)O@W&D+mX#>QE5~DvQaCKzTI5LBPtAc~w++9h-BPDiNn3-F z?x@W#b;zb($tLZWBDM~nUlL_bYVsYl1%kGyY{AC<|| zd=WowlV$%a2c>0t_jsX>mK|yqXN{;ZCO-?+S6mAD%9;Oil`p-!}TT9g8IZ$ zPmmw=(4>_*Rm@7H4d$df0n3OIg0VG}gbE=tdzCUkN^ASQHS; z^hi_W6A%(K7eTJWB^!p6=2ws}agXsQ+uBY6J(t&O(JN@?9@8B0O-1Iy> z1St~6mydJvx6n~L$om4>2y#jA+5u86ke5KN3SRpff!-BRA4pP|gF%p0LZFX9Yy!EW zG)VT?P4IrfcN`=~Q2qz zB`KdYsRCiRY|_K12e~P9@%bebqfuec`5^jG=ui(xvq0h?=Y{zg1fh0(e`mM+7a)fO zuUjA!!Z0R4Vnc%H5zs2cN*`wHQjA{EtOc2QQZw`n$Q41;0x}@%(GZ9Un)Id63-Uv$ zAQ}Lg;DOZN_6{vp2j8g3vU-CZU0!d!Bz4tQlXv#xSLbx7V|~||J(G|(rEZd<{0rG2 Jhvf*o{s&w1#%2Hj diff --git a/final.config b/final.config index 14b6987..c372c10 100644 --- a/final.config +++ b/final.config @@ -11,3 +11,11 @@ RESOLUTION_Y=720 CRINKLER_ORDERTRIES=4000 OUTPUT_EXE_NAME=release.exe +SHADER_FILE=shader_minified.h +TIME_UNIFORM_NAME='v' +RESOLUTION_UNIFORM_NAME='s' +TEXTS_UNIFORM_NAME='m' +EXE_LINKER_PROGRAM=Crinkler +TIME_BASE=bars +TIME_DIVIDER=79578.945 +TIME_DIVIDER_INT=79578 diff --git a/minified.config b/minified.config index 8326f0e..213bfcb 100644 --- a/minified.config +++ b/minified.config @@ -8,4 +8,9 @@ include $(PARENT_CONFIG) # Visuals EXE_LINKER_PROGRAM=Crinkler -CRINKLER_ORDERTRIES=100 +CRINKLER_ORDERTRIES=4000 +SHADER_FILE=shader_minified.h +TIME_UNIFORM_NAME='v' +RESOLUTION_UNIFORM_NAME='s' +TEXTS_UNIFORM_NAME='c' +USE_WIDECHAR_TEXTS=1 diff --git a/shader.glsl b/shader.glsl index 85dd43d..5387474 100644 --- a/shader.glsl +++ b/shader.glsl @@ -1,314 +1,205 @@ -// Compofiller Studio by Yzi 2018 -// -// Default template shader - -// This shader program is executed in the GPU (or a CPU-based emulation) for -// every pixel (i.e. "fragment" in OpenGL jargon) of every frame. - -// The "uniforms" are the same (i.e. uniform) for all pixels/fragments of the frame, -// and they come from the main program. uniform float time; uniform vec2 resolution; - -// If you choose to save some bytes and not use either of these uniforms, you have to -// do some additional tricks. -// * time : if you uncheck "[ ] Use time uniform" checkbox, time is in gl_Color.y (green component) -// * resolution : if you uncheck "[ ] Use resolution uniform" checkbox, you'll have to hard-code the resolution manually - -// The uniform-less version could look like this, 88200.0 being the time divider -//float time = gl_Color.y * 256.0 * (65536.0 / 88200.0); -//vec2 resolution = vec2(1280.0, 720.0); - -// Uncomment this to use the texture-based features uniform sampler2D texture_sampler; - -// Uncomment this to use the texture-based features uniform sampler2D texts; -// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. -// Created by S. Guillitte 2015 +float zoom = 1.; +float gTime = 0.; -float zoom=1.; - -vec2 cmul( vec2 a, vec2 b ) { return vec2( a.x*b.x - a.y*b.y, a.x*b.y + a.y*b.x ); } -vec2 csqr( vec2 a ) { return vec2( a.x*a.x - a.y*a.y, 2.*a.x*a.y ); } - - -mat2 rot(float a) { - return mat2(cos(a),sin(a),-sin(a),cos(a)); +int getBeat(void) { + return floor(abs(time*4) / (60./133) ); +} +int getBar(void) { + return floor(abs(time) / (60./133)); } -vec2 iSphere( in vec3 ro, in vec3 rd, in vec4 sph )//from iq +vec2 csqr(vec2 a) { + return vec2(a.x * a.x - a.y * a.y, 2. * a.x * a.y); +} + +mat2 rot(float a) { + return mat2(cos(a), sin(a), -sin(a), cos(a)); +} + +vec2 iSphere(in vec3 ro, in vec3 rd, in vec4 sph)//from iq { - vec3 oc = ro - sph.xyz; - float b = dot( oc, rd ); - float c = dot( oc, oc ) - sph.w*sph.w; - float h = b*b - c; - if( h<0.0 ) return vec2(-1.0); - h = sqrt(h); - return vec2(-b-h, -b+h ); + vec3 oc = ro - sph.xyz; + float b = dot(oc, rd); + float c = dot(oc, oc) - sph.w * sph.w; + float h = b * b - c; + if(h < 0.0) + return vec2(-1.0); + h = sqrt(h); + return vec2(-b - h, -b + h); } float map(in vec3 p) { - - float res = 0.; - + + float res = 0.; + vec3 c = p; - for (int i = 0; i < 10; ++i) { - p =.7*abs(p)/dot(p,p) -.7; - p.yz= csqr(p.yz); - p=p.zxy; - res += exp(-19. * abs(dot(p,c))); - - } - return res/2.; + for(int i = 0; i < 10; ++i) { + p = .7 * abs(p) / dot(p, p) - .7; + p.yz = csqr(p.yz); + p = p.zxy; + res += exp(-19. * abs(dot(p, c))); + + } + return res / 2.; } - - -vec3 raymarch( in vec3 ro, vec3 rd, vec2 tminmax ) -{ +vec3 raymarch(in vec3 ro, vec3 rd, vec2 tminmax) { float t = tminmax.x; float dt = .02; //float dt = .2 - .195*cos(iTime*.05);//animated - vec3 col= vec3(0.); + vec3 col = vec3(0.); float c = 0.; - for( int i=0; i<64; i++ ) - { - t+=dt*exp(-2.*c); - if(t>tminmax.y)break; - - c = map(ro+t*rd); - - col = .99*col+ .08*vec3(c*c, c, c*c*c);//green + for(int i = 0; i < 64; i++) { + t += dt * exp(-2. * c); + if(t > tminmax.y) + break; + + c = map(ro + t * rd); + + col = .99 * col + .08 * vec3(c * c, c, c * c * c);//green //col = .99*col+ .08*vec3(c*c*c, c*c, c);//blue - } + } return col; } - -void CoolSphere( out vec4 fragColor, in vec2 fragCoord ) -{ - float time = time; +void CoolSphere(out vec4 fragColor, in vec2 fragCoord) { + float time = time; vec2 q = fragCoord.xy / resolution.xy; vec2 p = -1.0 + 2.0 * q; - p.x *= resolution.x/resolution.y; + p.x *= resolution.x / resolution.y; vec2 m = vec2(0.); - m-=.5; + m -= .5; // camera - vec3 ro = zoom*vec3(4.); - ro.yz*=rot(m.y); - ro.xz*=rot(m.x+ 0.1*time); - vec3 ta = vec3( 0.0 , 0.0, 0.0 ); - vec3 ww = normalize( ta - ro ); - vec3 uu = normalize( cross(ww,vec3(0.0,1.0,0.0) ) ); - vec3 vv = normalize( cross(uu,ww)); - vec3 rd = normalize( p.x*uu + p.y*vv + 4.0*ww ); + vec3 ro = zoom * vec3(4.); + ro.yz *= rot(m.y); + ro.xz *= rot(m.x + 0.1 * time); + vec3 ta = vec3(0.0, 0.0, 0.0); + vec3 ww = normalize(ta - ro); + vec3 uu = normalize(cross(ww, vec3(0.0, 1.0, 0.0))); + vec3 vv = normalize(cross(uu, ww)); + vec3 rd = normalize(p.x * uu + p.y * vv + 4.0 * ww); - - vec2 tmm = iSphere( ro, rd, vec4(0.,0.,0.,2.) ); + vec2 tmm = iSphere(ro, rd, vec4(0., 0., 0., 2.)); // raymarch - vec3 col = raymarch(ro,rd,tmm); - if (tmm.x<0.)col = texture2D(texture_sampler, rd).rgb; + vec3 col = raymarch(ro, rd, tmm); + if(tmm.x < 0.) + col = texture2D(texture_sampler, rd).rgb; else { - vec3 nor=(ro+tmm.x*rd)/2.; - nor = reflect(rd, nor); - float fre = pow(.5+ clamp(dot(nor,rd),0.0,1.0), 3. )*1.3; + vec3 nor = (ro + tmm.x * rd) / 2.; + nor = reflect(rd, nor); + float fre = pow(.5 + clamp(dot(nor, rd), 0.0, 1.0), 3.) * 1.3; col += texture2D(texture_sampler, nor).rgb * fre; - + } - + // shade - - col = .5 *(log(1.+col)); - col = clamp(col,0.,1.); - fragColor = vec4( col, 1.0 ); + + col = .5 * (log(1. + col)); + col = clamp(col, 0., 1.); + fragColor = vec4(col, 1.0); } - -float bar = time; // this is just a coding nicety to highlight that in some calculations we want musical time ... you wouldn't want to have this in a real prod's final version -// --- noise from procedural pseudo-Perlin (better but not so nice derivatives) --------- - // ( adapted from IQ ) - -float gTime = 0.; - -float sdBox( vec3 p, vec3 b ) -{ - vec3 q = abs(p) - b; - return length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0); +float sdBox(vec3 p, vec3 b) { + vec3 q = abs(p) - b; + return length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0); } float box(vec3 pos, float scale) { - pos *= scale; - float base = sdBox(pos, vec3(.4,.4,.1)) /1.5; - pos.xy *= 5.; - pos.y -= 3.5; - pos.xy *= rot(.75); - float result = -base; - return result; + pos *= scale; + float base = sdBox(pos, vec3(.4, .4, .1)) / 1.5; + pos.xy *= 5.; + pos.y -= 3.5; + pos.xy *= rot(.75); + float result = -base; + return result; } float box_set(vec3 pos, float time) { - vec3 pos_origin = pos; - pos = pos_origin; - pos .y += sin(gTime * 0.4) * 2.5; - pos.xy *= rot(.8); - float box1 = box(pos,2. - abs(sin(gTime * 0.4)) * 1.5); - pos = pos_origin; - pos .y -=sin(gTime * 0.4) * 2.5; - pos.xy *= rot(.8); - float box2 = box(pos,2. - abs(sin(gTime * 0.4)) * 1.5); - pos = pos_origin; - pos .x +=sin(gTime * 0.4) * 2.5; - pos.xy *= rot(.8); - float box3 = box(pos,2. - abs(sin(gTime * 0.4)) * 1.5); - pos = pos_origin; - pos .x -=sin(gTime * 0.4) * 2.5; - pos.xy *= rot(.8); - float box4 = box(pos,2. - abs(sin(gTime * 0.4)) * 1.5); - pos = pos_origin; - pos.xy *= rot(.8); - float box5 = box(pos,.5) * 6.; - pos = pos_origin; - float box6 = box(pos,.5) * 6.; - float result = max(max(max(max(max(box1,box2),box3),box4),box5),box6); - return result; + vec3 pos_origin = pos; + pos = pos_origin; + pos.y += sin(gTime * 0.4) * 2.5; + pos.xy *= rot(.8); + float box1 = box(pos, 2. - abs(sin(gTime * 0.4)) * 1.5); + pos = pos_origin; + pos.y -= sin(gTime * 0.4) * 2.5; + pos.xy *= rot(.8); + float box2 = box(pos, 2. - abs(sin(gTime * 0.4)) * 1.5); + pos = pos_origin; + pos.x += sin(gTime * 0.4) * 2.5; + pos.xy *= rot(.8); + float box3 = box(pos, 2. - abs(sin(gTime * 0.4)) * 1.5); + pos = pos_origin; + pos.x -= sin(gTime * 0.4) * 2.5; + pos.xy *= rot(.8); + float box4 = box(pos, 2. - abs(sin(gTime * 0.4)) * 1.5); + pos = pos_origin; + pos.xy *= rot(.8); + float box5 = box(pos, .5) * 6.; + pos = pos_origin; + float box6 = box(pos, .5) * 6.; + float result = max(max(max(max(max(box1, box2), box3), box4), box5), box6); + return result; } float map(vec3 pos, float time) { - vec3 pos_origin = pos; - float box_set1 = box_set(pos, time); + vec3 pos_origin = pos; + float box_set1 = box_set(pos, time); - return box_set1; + return box_set1; } +void mainImage2(out vec4 fragColor, in vec2 fragCoord) { + vec2 p = (fragCoord.xy * 2. - resolution.xy) / min(resolution.x, resolution.y); + vec3 ro = vec3(0., -0.2, time * 4.); + vec3 ray = normalize(vec3(p, 1.5)); + ray.xy = ray.xy * rot(sin(time * .03) * 5.); + ray.yz = ray.yz * rot(sin(time * .05) * .2); + float t = 0.1; + vec3 col = vec3(0.); + float ac = 0.0; -void mainImage2( out vec4 fragColor, in vec2 fragCoord ) { - vec2 p = (fragCoord.xy * 2. - resolution.xy) / min(resolution.x, resolution.y); - vec3 ro = vec3(0., -0.2 ,time * 4.); - vec3 ray = normalize(vec3(p, 1.5)); - ray.xy = ray.xy * rot(sin(time * .03) * 5.); - ray.yz = ray.yz * rot(sin(time * .05) * .2); - float t = 0.1; - vec3 col = vec3(0.); - float ac = 0.0; + for(int i = 0; i < 99; i++) { + vec3 pos = ro + ray * t; + pos = mod(pos - 2., 4.) - 2.; + gTime = time - float(i) * 0.01; + float d = map(pos, time); - for (int i = 0; i < 99; i++){ - vec3 pos = ro + ray * t; - pos = mod(pos-2., 4.) -2.; - gTime = time -float(i) * 0.01; - - float d = map(pos, time); + d = max(abs(d), 0.01); + ac += exp(-d * 23.); - d = max(abs(d), 0.01); - ac += exp(-d*23.); + t += d * 0.55; + } - t += d* 0.55; - } + col = vec3(ac * 0.02); - col = vec3(ac * 0.02); + col += vec3(0., 0.2 * abs(sin(time)), 0.5 + sin(time) * 0.2); - col +=vec3(0.,0.2 * abs(sin(time)),0.5 + sin(time) * 0.2); - - - fragColor = vec4(col ,1.0 - t * (0.02 + 0.02 * sin (time))); + fragColor = vec4(col, 1.0 - t * (0.02 + 0.02 * sin(time))); } -float noise3( vec3 x ) { - vec3 p = floor(x),f = fract(x); - - f = f*f*(3.-2.*f); // or smoothstep // to make derivative continuous at borders - -#define hash3(p) fract(sin(1e3*dot(p,vec3(1,57,-13.7)))*4375.5453) // rand +void main(void) { + if (getBar() <= 8) + CoolSphere(gl_FragColor, gl_FragCoord.xy); + else + mainImage2(gl_FragColor, gl_FragCoord.xy); - return mix( mix(mix( hash3(p+vec3(0,0,0)), hash3(p+vec3(1,0,0)),f.x), // triilinear interp - mix( hash3(p+vec3(0,1,0)), hash3(p+vec3(1,1,0)),f.x),f.y), - mix(mix( hash3(p+vec3(0,0,1)), hash3(p+vec3(1,0,1)),f.x), - mix( hash3(p+vec3(0,1,1)), hash3(p+vec3(1,1,1)),f.x),f.y), f.z); -} -#define noise(x) (noise3(x)+noise3(x+11.5)) / 2. // pseudoperlin improvement from foxes idea + vec3 l; + vec2 texttop = vec2(0., -.35), pt = (gl_FragCoord.xy / resolution) - texttop; + if(pt.y > 0.) { + l = gl_FragColor + texture2D(texts, pt); + } -void mainImage3( out vec4 O, vec2 U ) // ------------ draw isovalues -{ - vec2 R = resolution.xy; - float n = noise(vec3(U*8./R.y, .1*time)), - v = sin(6.28*10.*n), - t = time; - - v = smoothstep(1.,0., .5*abs(v)/fwidth(v)); - - O = mix( exp(-33./R.y )* texture2D( texture_sampler, (U+vec2(1,sin(t)))/R), // .97 - .5+.5*sin(12.*n+vec4(0,2.1,-2.1,0)), - v ); - -} - -/* "Vortex" by @kishimisu (2024) - https://www.shadertoy.com/view/MX33Dr - - It eventually leads somewhere... - - [388 → 378 chars by @Xor] -*/ - -#define R mat2(cos(vec4(0,11,33,0) - -void mainImage(out vec4 O, vec2 F) { - - vec2 V = resolution; - vec3 o; - float r = time; - float t= .1; - float e,x; - - for (O *= e; e++ < 40.; - - o.y += t*t*.09, - o.z = mod(o.z + r, .2) - .1, - x = t*.06 - r*.2, - - o.x = fract( - o.xy *= R+floor(((atan(o.y, o.x) - x) / .314) +0.5) * .314 + x)) - ).x - .8, - - t += x = length(o)*.5 - .014, - - O += (1. + cos(t*.5 + r + vec4(0,1,2,0))) - * (.3 + sin(3.*t + r*5.)/4.) - / (8. + x*4e2) - ) - o = t * normalize(vec3((F+F-V.xy)*R+r*.15)),V.y)); -} - -void main(void) -{ - float abstime = abs(time); - vec3 l; - if (abstime < 10.0) - CoolSphere(gl_FragColor, gl_FragCoord.xy); - else if (abstime < 15.0) - { - mainImage2(gl_FragColor, gl_FragCoord.xy); - } - else if (abstime < 20.0) - { - mainImage(gl_FragColor, gl_FragCoord.xy); - } - else - { - mainImage3(gl_FragColor, gl_FragCoord.xy); - } - - vec2 texttop = vec2(0., -.35), pt = (gl_FragCoord.xy / resolution) - texttop; - if (pt.y > 0.) - l = gl_FragColor + texture2D(texts, pt); - - - gl_FragColor = vec4(l * (1.0), 1.0); + gl_FragColor = vec4(l * (1.0), 1.0); } diff --git a/shader_minified.h b/shader_minified.h new file mode 100644 index 0000000..cb28b9a --- /dev/null +++ b/shader_minified.h @@ -0,0 +1,156 @@ +// Generated with Shader Minifier 1.3.6 (https://github.com/laurentlb/Shader_Minifier/) +#ifndef SHADER_MINIFIED_H_ +# define SHADER_MINIFIED_H_ +# define VAR_resolution "s" +# define VAR_texts "c" +# define VAR_texture_sampler "m" +# define VAR_time "v" + +const char *__temp_cleaned_shader_glsl = + "uniform float v;" + "uniform vec2 s;" + "uniform sampler2D m,c;" + "float f=0.;" + "vec2 n(vec2 v)" + "{" + "return vec2(v.x*v.x-v.y*v.y,2.*v.x*v.y);" + "}" + "mat2 t(float v)" + "{" + "return mat2(cos(v),sin(v),-sin(v),cos(v));" + "}" + "vec2 n(vec3 v,vec3 y)" + "{" + "vec4 s=vec4(0,0,0,2);" + "vec3 f=v-s.xyz;" + "float t=dot(f,y),m=t*t-dot(f,f)+s.w*s.w;" + "if(m<0.)" + "return vec2(-1);" + "m=sqrt(m);" + "return vec2(-t-m,-t+m);" + "}" + "float x(vec3 v)" + "{" + "float f=0.;" + "vec3 y=v;" + "for(int m=0;m<10;++m)" + "v=.7*abs(v)/dot(v,v)-.7,v.yz=n(v.yz),v=v.zxy,f+=exp(-19.*abs(dot(v,y)));" + "return f/2.;" + "}" + "vec3 n(vec3 v,vec3 y,vec2 s)" + "{" + "float f=s.x;" + "vec3 m=vec3(0);" + "float r=0.;" + "for(int i=0;i<64;i++)" + "{" + "f+=.02*exp(-2.*r);" + "if(f>s.y)" + "break;" + "r=x(v+f*y);" + "m=.99*m+.08*vec3(r*r,r,r*r*r);" + "}" + "return m;" + "}" + "void t(out vec4 f,vec2 y)" + "{" + "float r=v;" + "vec2 i=-1.+2.*(y.xy/s.xy);" + "i.x*=s.x/s.y;" + "vec2 d=vec2(0);" + "d-=.5;" + "vec3 a=vec3(4);" + "a.yz*=t(d.y);" + "a.xz*=t(d.x+.1*r);" + "vec3 c=normalize(vec3(0)-a),g=normalize(cross(c,vec3(0,1,0))),z=normalize(i.x*g+i.y*normalize(cross(g,c))+4.*c);" + "vec2 o=n(a,z);" + "vec3 x=n(a,z,o);" + "if(o.x<0.)" + "x=texture2D(m,z).xyz;" + "else" + "{" + "vec3 e=(a+o.x*z)/2.;" + "e=reflect(z,e);" + "float l=pow(.5+clamp(dot(e,z),0.,1.),3.)*1.3;" + "x+=texture2D(m,e).xyz*l;" + "}" + "x=.5*log(1.+x);" + "x=clamp(x,0.,1.);" + "f=vec4(x,1);" + "}" + "float e(vec3 v)" + "{" + "vec3 f=abs(v)-vec3(.4,.4,.1);" + "return length(max(f,0.))+min(max(f.x,max(f.y,f.z)),0.);" + "}" + "float e(vec3 v,float y)" + "{" + "v*=y;" + "float f=e(v)/1.5;" + "v.xy*=5.;" + "v.y-=3.5;" + "v.xy*=t(.75);" + "return-f;" + "}" + "float x(vec3 v,float y)" + "{" + "vec3 m=v;" + "v=m;" + "v.y+=sin(f*.4)*2.5;" + "v.xy*=t(.8);" + "float s=e(v,2.-abs(sin(f*.4))*1.5);" + "v=m;" + "v.y-=sin(f*.4)*2.5;" + "v.xy*=t(.8);" + "float z=e(v,2.-abs(sin(f*.4))*1.5);" + "v=m;" + "v.x+=sin(f*.4)*2.5;" + "v.xy*=t(.8);" + "float r=e(v,2.-abs(sin(f*.4))*1.5);" + "v=m;" + "v.x-=sin(f*.4)*2.5;" + "v.xy*=t(.8);" + "float c=e(v,2.-abs(sin(f*.4))*1.5);" + "v=m;" + "v.xy*=t(.8);" + "float x=e(v,.5)*6.;" + "v=m;" + "float g=e(v,.5)*6.;" + "return max(max(max(max(max(s,z),r),c),x),g);" + "}" + "void p(out vec4 m,vec2 y)" + "{" + "vec3 r=vec3(0,-.2,v*4.),z=normalize(vec3((y.xy*2.-s.xy)/min(s.x,s.y),1.5));" + "z.xy=z.xy*t(sin(v*.03)*5.);" + "z.yz=z.yz*t(sin(v*.05)*.2);" + "float a=.1;" + "vec3 i=vec3(0);" + "float c=0.;" + "for(int e=0;e<99;e++)" + "{" + "vec3 d=r+z*a;" + "d=mod(d-2.,4.)-2.;" + "f=v-float(e)*.01;" + "float g=x(d,v);" + "g=max(abs(g),.01);" + "c+=exp(-g*23.);" + "a+=g*.55;" + "}" + "i=vec3(c*.02);" + "i+=vec3(0,.2*abs(sin(v)),.5+sin(v)*.2);" + "m=vec4(i,1.-a*(.02+.02*sin(v)));" + "}" + "void main()" + "{" + "if(floor(abs(v)/(60./133))<=8)" + "t(gl_FragColor,gl_FragCoord.xy);" + "else" + " p(gl_FragColor,gl_FragCoord.xy);" + "vec3 f;" + "vec2 m=gl_FragCoord.xy/s-vec2(0,-.35);" + "if(m.y>0.)" + "f=gl_FragColor+texture2D(c,m);" + "gl_FragColor=vec4(f,1);" + "}"; + +#endif // SHADER_MINIFIED_H_ diff --git a/timings_and_texts.inc b/timings_and_texts.inc index e016c75..6489d33 100644 --- a/timings_and_texts.inc +++ b/timings_and_texts.inc @@ -45,27 +45,17 @@ TIMINGS_REC_STRING_PTR_FIELD_OFS equ (REC_TIMINGS_TIME_FIELD_SIZE + REC_TIMINGS_ section .textstr1 data ;______STRINGS_START______ -_string0: DEFINE_STRING 'Hello World' END_STRING -_string1: DEFINE_STRING 'This is Scene1' END_STRING -_string2: DEFINE_STRING 70, 105, 114, 115, 116, 32, 100, 101, 109, 111, 13, 119, 101, 32, 101, 118, 101, 114, 32, 109, 97, 100, 101 END_STRING -_string3: DEFINE_STRING 'This is Scene2' END_STRING -_string4: DEFINE_STRING 83, 97, 121, 32, 104, 105, 32, 116, 111, 13, 77, 111, 109, 32, 102, 111, 114, 32, 109, 101 END_STRING -_string5: DEFINE_STRING 'Shout out to' END_STRING -_string6: DEFINE_STRING 'Puavohard' END_STRING -_string7: DEFINE_STRING 'Goodbye!' END_STRING +_string0: DEFINE_STRING 32 END_STRING +_string1: DEFINE_STRING 65, 115, 115, 101, 109, 98, 108, 121, 13, 50, 48, 50, 52 END_STRING +_string2: DEFINE_STRING 71, 111, 111, 100, 98, 121, 101, 33 END_STRING ;______STRINGS_END______ section .textstr2 data text_string_timings: ;______TIMINGS_START______ -DEFINE_TIMING TIMING_TIME(0,0.00000,0) TIMING_ALIAS('START_TIME') TIMING_CUSTOM(0) TIMING_STRING(0,_string0) ; this is a comment -DEFINE_TIMING TIMING_TIME(1,0.00000,88200) TIMING_ALIAS('') TIMING_CUSTOM(0) TIMING_STRING(0,_string1) ; this is a comment -DEFINE_TIMING TIMING_TIME(2,0.50000,220500) TIMING_ALIAS('') TIMING_CUSTOM(0) TIMING_STRING(0,_string2) ; another comment -DEFINE_TIMING TIMING_TIME(10,0.00000,882000) TIMING_ALIAS('') TIMING_CUSTOM(0) TIMING_STRING(0,_string3) ; this is a komment -DEFINE_TIMING TIMING_TIME(12,0.00000,1058400) TIMING_ALIAS('') TIMING_CUSTOM(0) TIMING_STRING(0,_string4) ; -DEFINE_TIMING TIMING_TIME(15,0.00000,1323000) TIMING_ALIAS('') TIMING_CUSTOM(0) TIMING_STRING(0,_string5) ; abcd -DEFINE_TIMING TIMING_TIME(18,0.00000,1587600) TIMING_ALIAS('') TIMING_CUSTOM(0) TIMING_STRING(0,_string6) ; efgh -DEFINE_TIMING TIMING_TIME(20,0.00000,1764000) TIMING_ALIAS('END_TIME') TIMING_CUSTOM(0) TIMING_STRING(0,_string7) ; efgh +DEFINE_TIMING TIMING_TIME(0,0.00000,0) TIMING_ALIAS('') TIMING_CUSTOM(0) TIMING_STRING(0,_string0) ; +DEFINE_TIMING TIMING_TIME(4,0.00000,318315) TIMING_ALIAS('') TIMING_CUSTOM(0) TIMING_STRING(0,_string1) ; +DEFINE_TIMING TIMING_TIME(20,0.00000,1591578) TIMING_ALIAS('END_TIME') TIMING_CUSTOM(0) TIMING_STRING(0,_string2) ; ;______TIMINGS_END______ dd 0xFFFFFFFF ; end-of-time