Compare commits

...
16 Commits
Author SHA1 Message Date
klemek 468674c4ea chore: update forge-steel 2026-08-30 11:32:30 +02:00
klemek ed12435680 fix: Makefile 2026-08-30 11:32:19 +02:00
klemek 636f3d7cfc test 2026-08-29 20:35:49 +02:00
klemek a8f06b0cfb test 2026-08-29 20:30:33 +02:00
klemek 4df3b93f9c test 2026-08-29 20:26:56 +02:00
klemek d4f0e0a88f test 2026-08-29 20:16:57 +02:00
klemek c08b55a424 delay.sh 2026-08-29 20:08:27 +02:00
klemek fb969de830 Update README.md 2026-08-29 12:03:43 +02:00
klemek 2bd2c4233f use auto-save 2026-08-29 12:02:35 +02:00
klemek 6c6e321fc5 Update frag7.glsl 2026-08-28 20:15:50 +02:00
klemek bba4c0e8f5 use symlinks 2026-08-28 20:12:44 +02:00
klemek e1e88362bd Update inc_cp437.glsl 2026-08-28 19:22:13 +02:00
klemek fb80096569 upgrade glsl code 2026-08-28 19:02:39 +02:00
klemek 11d5f41402 Update frag7.glsl 2026-08-28 18:05:35 +02:00
klemek 773cf309f0 show demo mode 2026-08-28 18:04:41 +02:00
klemek d9eae7ba4b Update frag7.glsl 2026-08-28 17:51:06 +02:00
16 changed files with 394 additions and 1376 deletions
+6 -5
View File
@@ -4,7 +4,7 @@ PROJECT_DIR ?= $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
BUILD_DIR ?= $(PROJECT_DIR)/build BUILD_DIR ?= $(PROJECT_DIR)/build
FORGE_SRC ?= $(PROJECT_DIR)/forge-steel FORGE_SRC ?= $(PROJECT_DIR)/forge-steel
TARGET ?= forge TARGET ?= forge
RUN_ARGS ?= --project=$(PROJECT_DIR)/project -is=576 RUN_ARGS ?= --project=$(PROJECT_DIR)/project --internal-size=576 --auto-save
VERSION ?= invar-$(shell grep -Eo '[0-9]+\.[0-9]+\.[0-9]+' $(FORGE_SRC)/configure.ac) VERSION ?= invar-$(shell grep -Eo '[0-9]+\.[0-9]+\.[0-9]+' $(FORGE_SRC)/configure.ac)
SOURCES ?= $(FORGE_SRC)/src/*.h $(FORGE_SRC)/src/*.c $(FORGE_SRC)/hashmap.c/hashmap.c $(FORGE_SRC)/log.c/src/log.c SOURCES ?= $(FORGE_SRC)/src/*.h $(FORGE_SRC)/src/*.c $(FORGE_SRC)/hashmap.c/hashmap.c $(FORGE_SRC)/log.c/src/log.c
CFLAGS ?= -Ofast -Ofast -march=native -flto -funroll-loops -fprefetch-loop-arrays -fno-exceptions -fopenmp -I$(FORGE_SRC)/include -DGLFW_INCLUDE_NONE -DGLFW_NATIVE_INCLUDE_NONE -DLOG_USE_COLOR -DVERSION=\"$(VERSION)\" -DOPENGL_MAJOR_VERSION=3 -DOPENGL_MINOR_VERSION=1 CFLAGS ?= -Ofast -Ofast -march=native -flto -funroll-loops -fprefetch-loop-arrays -fno-exceptions -fopenmp -I$(FORGE_SRC)/include -DGLFW_INCLUDE_NONE -DGLFW_NATIVE_INCLUDE_NONE -DLOG_USE_COLOR -DVERSION=\"$(VERSION)\" -DOPENGL_MAJOR_VERSION=3 -DOPENGL_MINOR_VERSION=1
@@ -35,7 +35,7 @@ $(BUILD_DIR)/$(TARGET): forge-steel/src/main.c forge-steel/hashmap.c/hashmap.c f
.PHONY: remove-passwd .PHONY: remove-passwd
remove-passwd: remove-passwd:
sudo passwd -d forge sudo passwd -d $(shell whoami)
.PHONY: apt-install .PHONY: apt-install
apt-install: apt-install:
@@ -48,7 +48,7 @@ setup-weston:
.PHONY: setup-rasp-config .PHONY: setup-rasp-config
setup-rasp-config: setup-rasp-config:
sudo $(PROJECT_DIR)/line_in_file.sh "include forge-invar.txt" "/boot/firmware/config.txt" sudo $(PROJECT_DIR)/line_in_file.sh "include forge-invar.txt" "/boot/firmware/config.txt"
sudo $(PROJECT_DIR)/line_in_file.sh "vc4.tv_norm=PAL" "/boot/firmware/config.txt" "vc4.tv_norm" sudo $(PROJECT_DIR)/line_in_file.sh "vc4.tv_norm=PAL" "/boot/firmware/cmdline.txt" "vc4.tv_norm"
sudo cp -f $(PROJECT_DIR)/system/config.ini /boot/firmware/forge-invar.txt sudo cp -f $(PROJECT_DIR)/system/config.ini /boot/firmware/forge-invar.txt
.PHONY: setup-services .PHONY: setup-services
@@ -69,7 +69,7 @@ setup-bashrc:
$(PROJECT_DIR)/line_in_file.sh "make -C $(PROJECT_DIR) start-weston" "$(HOME)/.bashrc" $(PROJECT_DIR)/line_in_file.sh "make -C $(PROJECT_DIR) start-weston" "$(HOME)/.bashrc"
.PHONY: install .PHONY: install
install: remove-passwd setup-rasp-config apt-install setup-weston setup-rasp-config setup-services setup-bashrc install: remove-passwd apt-install setup-weston setup-rasp-config setup-services setup-bashrc
.PHONY: clean .PHONY: clean
clean: clean:
@@ -80,7 +80,8 @@ build: $(BUILD_DIR)/$(TARGET)
.PHONY: run .PHONY: run
run: $(BUILD_DIR)/$(TARGET) run: $(BUILD_DIR)/$(TARGET)
$(BUILD_DIR)/$(TARGET) $(RUN_ARGS) # $(BUILD_DIR)/$(TARGET) $(RUN_ARGS)
$(PROJECT_DIR)/delay.sh
.PHONY: submodule-init .PHONY: submodule-init
submodule-init: submodule-init:
+8 -5
View File
@@ -36,12 +36,15 @@ echo 'make -C /opt/forge-invar start-weston' >> ~/.bashrc
Logical Logical
* [ ] Play on start * [x] Play on start
* [ ] disable services for faster boot * [ ] disable services for faster boot
* [ ] Save while running * [ ] special texts in demo vs classic
* [x] Save while running
* [ ] I2C monitor screen write
Physical Physical
* PAL/NTSC switch * [ ] PAL/NTSC switch
* Sync in -> fake midi ? * [ ] Sync in -> fake keyboard
* rasp compute * [ ] rasp compute
* [ ] I2C screen
Executable
+26
View File
@@ -0,0 +1,26 @@
#!/bin/bash
set -e
DELAY=30
rm -rf /tmp/delay_stream*
ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 \
-vf scale=720:576 \
-vcodec libx264 -preset ultrafast -tune zerolatency \
-f hls -hls_time 1 -hls_list_size $((DELAY + 5)) -hls_flags delete_segments \
/tmp/delay_stream.m3u8 &
FFMPEG_PID=$!
start=`date +%s`
until [ -f /tmp/delay_stream.m3u8 ]; do sleep 0.1; done
end=`date +%s`
sleep $((DELAY - end + start))
ffplay /tmp/delay_stream.m3u8
kill $FFMPEG_PID $HTTP_PID
+2 -2
View File
@@ -19,8 +19,8 @@ uniform int iSeed5;
uniform vec3 iGroup3_1[2]; uniform vec3 iGroup3_1[2];
void main() { void main() {
float mix_value = magic(iGroup3_1[1].xy, vec3(1, 0, 0), iSeed5); float mix_value = magic(iGroup3_1[1].xy, vec3(1., 0., 0.), iSeed5);
bool mix_type = magic_trigger(vec3(iGroup3_1[0].x, 0, 0), iSeed5 + 10); bool mix_type = magic_trigger(vec3(iGroup3_1[0].x, 0., 0.), iSeed5 + 10.);
vec4 color_a = texture(iTex3, vUV); vec4 color_a = texture(iTex3, vUV);
vec4 color_b = texture(iTex4, vUV); vec4 color_b = texture(iTex4, vUV);
+1 -1
View File
@@ -21,7 +21,7 @@ uniform vec3 iGroup3_1[2];
void main() { void main() {
vec4 color = fx_stage(iState6, vUV, iTex5, iTex0, iSeed6, iGroup2_3[0], iGroup2_3[1].xy, iGroup2_3[2], iGroup2_3[3].xy, iGroup2_3[4], iGroup2_3[5].xy, iGroup2_3[6]); vec4 color = fx_stage(iState6, vUV, iTex5, iTex0, iSeed6, iGroup2_3[0], iGroup2_3[1].xy, iGroup2_3[2], iGroup2_3[3].xy, iGroup2_3[4], iGroup2_3[5].xy, iGroup2_3[6]);
color = mix(color, vec4(0), iGroup3_1[0].y); color = mix(color, vec4(0.), iGroup3_1[0].y);
fragColor = color; fragColor = color;
} }
+5 -1
View File
@@ -10,11 +10,15 @@ out vec4 fragColor;
uniform sampler2D iTex0; uniform sampler2D iTex0;
uniform int iFPS; uniform int iFPS;
uniform int iDemo;
const int[] textDEMO = int[5](0x44, 0x45, 0x4D, 0x4F, 0x00);
void main() { void main() {
// vec2 uv = 1 - vUV; // vec2 uv = 1 - vUV;
vec2 uv = vUV; vec2 uv = vUV;
vec3 c = texture(iTex0, uv).xyz; vec3 c = texture(iTex0, uv).xyz;
c = mix(c, 1 - c, write_int(uv * 20, vec2(.25, .25), iFPS, 2)); c = mix(c, 1. - c, iDemo * write_int(uv * 20., vec2(1.), iFPS, 2));
c = mix(c, 1. - c, iDemo * write_5(uv * 20., vec2(1., 18.), textDEMO));
fragColor = vec4(c, 1); fragColor = vec4(c, 1);
} }
-447
View File
@@ -1,447 +0,0 @@
#ifndef INC_CP437
#define INC_CP437
const int cp437[] = int[1024](
0x0000, 0x0000, 0x0000, 0x0000, // 0x00, NUL
0x151E, 0x8A87, 0xE19D, 0x789B, // 0x01, SOH, SMILEY BLACK
0xFBFE, 0xFDF7, 0xEF73, 0x7FEC, // 0x02, STX, SMILEY LIGHT
0xFFF6, 0x7773, 0x08CE, 0x0013, // 0x03, ETX, HEART
0xFEC8, 0x7310, 0x08CE, 0x0013, // 0x04, EOT, DIAMOND
0xFCEC, 0x7131, 0xECEF, 0x3137, // 0x05, ENQ, CLUB
0xEC88, 0x3100, 0xECEF, 0x3137, // 0x06, ACK, SPADE
0xC800, 0x3100, 0x008C, 0x0013, // 0x07, BEL, DOT
0x37FF, 0xCEFF, 0xFF73, 0xFFEC, // 0x08, BS, INVERT DOT
0x26C0, 0x4630, 0x0C62, 0x0364, // 0x09, HT, CIRCLE
0xD93F, 0xB9CF, 0xF39D, 0xFC9B, // 0x0A, LF, INVERT CIRCLE
0xE000, 0xBFEF, 0xE333, 0x1333, // 0x0B, VT, MALE
0x666C, 0x6663, 0x8E8C, 0x1713, // 0x0C, FF, FEMALE
0xCCCC, 0x0FCF, 0x7FEC, 0x0000, // 0x0D, CR, NOTE
0x6E6E, 0xCFCF, 0x3766, 0x06EC, // 0x0E, SO, DOUBLE NOTE
0x7CA9, 0xE359, 0x9AC7, 0x953E, // 0x0F, SI, SUN
0xFF71, 0x7100, 0x017F, 0x0001, // 0x10, DLE, RIGHT TRIANGLE
0xFC00, 0x7774, 0x000C, 0x0477, // 0x11, DC1, LEFT TRIANGLE
0x8EC8, 0x1731, 0x8CE8, 0x1371, // 0x12, DC2, ARROW UP DOWN
0x6666, 0x6666, 0x0606, 0x0606, // 0x13, DC3, DOUBLE EXCLAMATION
0xEBBE, 0xDDDF, 0x0888, 0x0DDD, // 0x14, DC4, PARAGRAPH
0x6C6C, 0x31C7, 0xE3C6, 0x1313, // 0x15, NAK, ?
0x0000, 0x0000, 0x0EEE, 0x0777, // 0x16, SYN, HALF SQUARE BOTTOM
0x8EC8, 0x1731, 0xF8CE, 0xF137, // 0x17, ETB, ARROW UP DOWN UNDERLINED
0x8EC8, 0x1731, 0x0888, 0x0111, // 0x18, CAN, ARROW UP
0x8888, 0x1111, 0x08CE, 0x0137, // 0x19, EM, ARROW DOWN
0xF080, 0x7310, 0x0080, 0x0013, // 0x1A, SUB, ARROW RIGHT
0xF6C0, 0x7000, 0x00C6, 0x0000, // 0x1B, ESC, ARROW LEFT
0x3300, 0x0000, 0x00F3, 0x0070, // 0x1C, FS, ?
0xF640, 0xF620, 0x0046, 0x0026, // 0x1D, GS, ARROW LEFT RIGHT
0xEC80, 0x7310, 0x00FF, 0x00FF, // 0x1E, RS, TRIANGLE UP
0xEFF0, 0x7FF0, 0x008C, 0x0013, // 0x1F, US, TRIANGLE DOWN
0x0000, 0x0000, 0x0000, 0x0000, // 0x20, SPACE
0xCEEC, 0x0110, 0x0C0C, 0x0000, // 0x21, !
0x0666, 0x0333, 0x0000, 0x0000, // 0x22, "
0x6F66, 0x3733, 0x066F, 0x0337, // 0x23, #
0xE3EC, 0x1030, 0x0CF0, 0x0013, // 0x24, $
0x8330, 0x1360, 0x036C, 0x0660, // 0x25, %
0xEC6C, 0x6131, 0x0E3B, 0x0633, // 0x26, &
0x0366, 0x0000, 0x0000, 0x0000, // 0x27, '
0x66C8, 0x0001, 0x08C6, 0x0100, // 0x28, (
0x88C6, 0x1100, 0x06C8, 0x0001, // 0x29, )
0xFC60, 0xF360, 0x006C, 0x0063, // 0x2A, *
0xFCC0, 0x3000, 0x00CC, 0x0000, // 0x2B, +
0x0000, 0x0000, 0x6CC0, 0x0000, // 0x2C, ,
0xF000, 0x3000, 0x0000, 0x0000, // 0x2D, -
0x0000, 0x0000, 0x0CC0, 0x0000, // 0x2E, .
0xC800, 0x0136, 0x0136, 0x0000, // 0x2F, /
0xB33E, 0x7763, 0x0E7F, 0x0366, // 0x30, 0
0xCCEC, 0x0000, 0x0FCC, 0x0300, // 0x31, 1
0xC03E, 0x1331, 0x0F36, 0x0330, // 0x32, 2
0xC03E, 0x1331, 0x0E30, 0x0133, // 0x33, 3
0x36C8, 0x3333, 0x080F, 0x0737, // 0x34, 4
0x0F3F, 0x3103, 0x0E30, 0x0133, // 0x35, 5
0xF36C, 0x1001, 0x0E33, 0x0133, // 0x36, 6
0x803F, 0x1333, 0x0CCC, 0x0000, // 0x37, 7
0xE33E, 0x1331, 0x0E33, 0x0133, // 0x38, 8
0xE33E, 0x3331, 0x0E80, 0x0013, // 0x39, 9
0x0CC0, 0x0000, 0x0CC0, 0x0000, // 0x3A, :
0x0CC0, 0x0000, 0x6CC0, 0x0000, // 0x3B, ;
0x36C8, 0x0001, 0x08C6, 0x0100, // 0x3C, <
0x0F00, 0x0300, 0x00F0, 0x0030, // 0x3D, =
0x08C6, 0x3100, 0x06C8, 0x0001, // 0x3E, >
0x803E, 0x1331, 0x0C0C, 0x0000, // 0x3F, ?
0xBB3E, 0x7763, 0x0E3B, 0x0107, // 0x40, @
0x33EC, 0x3310, 0x033F, 0x0333, // 0x41, A
0xE66F, 0x3663, 0x0F66, 0x0366, // 0x42, B
0x336C, 0x0063, 0x0C63, 0x0360, // 0x43, C
0x666F, 0x6631, 0x0F66, 0x0136, // 0x44, D
0xE66F, 0x1147, 0x0F66, 0x0741, // 0x45, E
0xE66F, 0x1147, 0x0F66, 0x0001, // 0x46, F
0x336C, 0x0063, 0x0C63, 0x0767, // 0x47, G
0xF333, 0x3333, 0x0333, 0x0333, // 0x48, H
0xCCCE, 0x0001, 0x0ECC, 0x0100, // 0x49, I
0x0008, 0x3337, 0x0E33, 0x0133, // 0x4A, J
0xE667, 0x1366, 0x0766, 0x0663, // 0x4B, K
0x666F, 0x0000, 0x0F66, 0x0764, // 0x4C, L
0xFF73, 0x7776, 0x033B, 0x0666, // 0x4D, M
0xBF73, 0x7666, 0x0333, 0x0667, // 0x4E, N
0x336C, 0x6631, 0x0C63, 0x0136, // 0x4F, O
0xE66F, 0x3663, 0x0F66, 0x0000, // 0x50, P
0x333E, 0x3331, 0x08EB, 0x0313, // 0x51, Q
0xE66F, 0x3663, 0x0766, 0x0663, // 0x52, R
0xE73E, 0x0031, 0x0E38, 0x0133, // 0x53, S
0xCCDF, 0x0023, 0x0ECC, 0x0100, // 0x54, T
0x3333, 0x3333, 0x0F33, 0x0333, // 0x55, U
0x3333, 0x3333, 0x0CE3, 0x0013, // 0x56, V
0xB333, 0x6666, 0x037F, 0x0677, // 0x57, W
0xC633, 0x1366, 0x036C, 0x0631, // 0x58, X
0xE333, 0x1333, 0x0ECC, 0x0100, // 0x59, Y
0x813F, 0x1367, 0x0F6C, 0x0764, // 0x5A, Z
0x666E, 0x0001, 0x0E66, 0x0100, // 0x5B, [
0x8C63, 0x1000, 0x0000, 0x0463, // 0x5C,
0x888E, 0x1111, 0x0E88, 0x0111, // 0x5D, ]
0x36C8, 0x6310, 0x0000, 0x0000, // 0x5E, ^
0x0000, 0x0000, 0xF000, 0xF000, // 0x5F, _
0x08CC, 0x0100, 0x0000, 0x0000, // 0x60, `
0x0E00, 0x3100, 0x0E3E, 0x0633, // 0x61, a
0xE667, 0x3000, 0x0B66, 0x0366, // 0x62, b
0x3E00, 0x3100, 0x0E33, 0x0130, // 0x63, c
0xE008, 0x3333, 0x0E33, 0x0633, // 0x64, d
0x3E00, 0x3100, 0x0E3F, 0x0103, // 0x65, e
0xF66C, 0x0031, 0x0F66, 0x0000, // 0x66, f
0x3E00, 0x3600, 0xF0E3, 0x1333, // 0x67, g
0xE667, 0x6300, 0x0766, 0x0666, // 0x68, h
0xCE0C, 0x0000, 0x0ECC, 0x0100, // 0x69, i
0x0000, 0x3303, 0xE330, 0x1333, // 0x6A, j
0x6667, 0x3600, 0x076E, 0x0631, // 0x6B, k
0xCCCE, 0x0000, 0x0ECC, 0x0100, // 0x6C, l
0xF300, 0x7300, 0x03BF, 0x0667, // 0x6D, m
0x3F00, 0x3100, 0x0333, 0x0333, // 0x6E, n
0x3E00, 0x3100, 0x0E33, 0x0133, // 0x6F, o
0x6B00, 0x6300, 0xF6E6, 0x0036, // 0x70, p
0x3E00, 0x3600, 0x80E3, 0x7333, // 0x71, q
0xEB00, 0x6300, 0x0F66, 0x0006, // 0x72, r
0x3E00, 0x0300, 0x0F0E, 0x0131, // 0x73, s
0xCEC8, 0x0300, 0x08CC, 0x0120, // 0x74, t
0x3300, 0x3300, 0x0E33, 0x0633, // 0x75, u
0x3300, 0x3300, 0x0CE3, 0x0013, // 0x76, v
0xB300, 0x6600, 0x06FF, 0x0377, // 0x77, w
0x6300, 0x3600, 0x036C, 0x0631, // 0x78, x
0x3300, 0x3300, 0xF0E3, 0x1333, // 0x79, y
0x9F00, 0x1300, 0x0F6C, 0x0320, // 0x7A, z
0x7CC8, 0x0003, 0x08CC, 0x0300, // 0x7B, {
0x0888, 0x0111, 0x0888, 0x0111, // 0x7C, |
0x8CC7, 0x3000, 0x07CC, 0x0000, // 0x7D, }
0x00BE, 0x0036, 0x0000, 0x0000, // 0x7E, ~
0x6C80, 0x3100, 0x0F33, 0x0766, // 0x7F, DEL, HOUSE
0x333E, 0x3031, 0xE08E, 0x1311, // 0x80, Ç
0x3030, 0x3030, 0x0E33, 0x0733, // 0x81, ü
0x3E08, 0x3103, 0x0E3F, 0x0103, // 0x82, é
0x0C3E, 0x63C7, 0x0C6C, 0x0F67, // 0x83, â
0x0E03, 0x3103, 0x0E3E, 0x0733, // 0x84, ä
0x0E07, 0x3100, 0x0E3E, 0x0733, // 0x85, à
0x0ECC, 0x3100, 0x0E3E, 0x0733, // 0x86, å
0x3E00, 0x0100, 0xC0E3, 0x1310, // 0x87, ç
0x6C3E, 0x63C7, 0x0C6E, 0x0307, // 0x88, ê
0x3E03, 0x3103, 0x0E3F, 0x0103, // 0x89, ë
0x3E07, 0x3100, 0x0E3F, 0x0103, // 0x8A, è
0xCE03, 0x0003, 0x0ECC, 0x0100, // 0x8B, ï
0x8C3E, 0x1163, 0x0C88, 0x0311, // 0x8C, î
0xCE07, 0x0000, 0x0ECC, 0x0100, // 0x8D, ì
0x36C3, 0x6316, 0x033F, 0x0667, // 0x8E, Ä
0xE0CC, 0x1000, 0x03F3, 0x0333, // 0x8F, Å
0x6F08, 0x0303, 0x0F6E, 0x0301, // 0x90, É
0x0E00, 0x3F00, 0x0E3E, 0x0F3F, // 0x91, æ
0xF36C, 0x7337, 0x0333, 0x0733, // 0x92, Æ
0xE03E, 0x1031, 0x0E33, 0x0133, // 0x93, ô
0xE030, 0x1030, 0x0E33, 0x0133, // 0x94, ö
0xE070, 0x1000, 0x0E33, 0x0133, // 0x95, ò
0x303E, 0x3031, 0x0E33, 0x0733, // 0x96, û
0x3070, 0x3000, 0x0E33, 0x0733, // 0x97, ù
0x3030, 0x3030, 0xF0E3, 0x1333, // 0x98, ÿ
0x6C83, 0x631C, 0x08C6, 0x0136, // 0x99, Ö
0x3303, 0x3303, 0x0E33, 0x0133, // 0x9A, Ü
0x3E88, 0x0711, 0x88E3, 0x1170, // 0x9B, ¢
0xF66C, 0x0231, 0x0F76, 0x0360, // 0x9C, £
0xFE33, 0x3133, 0xCCFC, 0x0030, // 0x9D, ¥
0xF33F, 0x5331, 0x3333, 0xE6F6, // 0x9E, ₧
0xC880, 0x31D7, 0xEB88, 0x0111, // 0x9F, ƒ
0x0E08, 0x3103, 0x0E3E, 0x0733, // 0xA0, á
0xCE0C, 0x0001, 0x0ECC, 0x0100, // 0xA1, í
0xE080, 0x1030, 0x0E33, 0x0133, // 0xA2, ó
0x3080, 0x3030, 0x0E33, 0x0733, // 0xA3, ú
0xF0F0, 0x1010, 0x0333, 0x0333, // 0xA4, ñ
0x730F, 0x3303, 0x03BF, 0x0333, // 0xA5, Ñ
0xC66C, 0x7333, 0x00E0, 0x0070, // 0xA6, ª
0xC66C, 0x1331, 0x00E0, 0x0030, // 0xA7, º
0x6C0C, 0x0000, 0x0E33, 0x0130, // 0xA8, ¿
0xF000, 0x3000, 0x0033, 0x0000, // 0xA9, ⌐
0xF000, 0x3000, 0x0000, 0x0033, // 0xAA, ¬
0xB333, 0x736C, 0x036C, 0xF36C, // 0xAB, ½
0xB333, 0xD36C, 0x036C, 0xCFFE, // 0xAC, ¼
0x8088, 0x1011, 0x0888, 0x0111, // 0xAD, ¡
0x36C0, 0x36C0, 0x00C6, 0x00C6, // 0xAE, «
0xC630, 0xC630, 0x0036, 0x0036, // 0xAF, »
0x1414, 0x1414, 0x1414, 0x1414, // 0xB0, ░
0x5A5A, 0x5A5A, 0x5A5A, 0x5A5A, // 0xB1, ▒
0xBEBE, 0xBEBE, 0xBEBE, 0xBEBE, // 0xB2, ▓
0x8888, 0x1111, 0x8888, 0x1111, // 0xB3, │
0x8888, 0x1111, 0x888F, 0x1111, // 0xB4, ┤
0x8F88, 0x1111, 0x888F, 0x1111, // 0xB5, ╡
0xCCCC, 0x6666, 0xCCCF, 0x6666, // 0xB6, ╢
0x0000, 0x0000, 0xCCCF, 0x6667, // 0xB7, ╖
0x8F00, 0x1100, 0x888F, 0x1111, // 0xB8, ╕
0x0FCC, 0x6666, 0xCCCF, 0x6666, // 0xB9, ╣
0xCCCC, 0x6666, 0xCCCC, 0x6666, // 0xBA, ║
0x0F00, 0x6700, 0xCCCF, 0x6666, // 0xBB, ╗
0x0FCC, 0x6666, 0x000F, 0x0007, // 0xBC, ╝
0xCCCC, 0x6666, 0x000F, 0x0007, // 0xBD, ╜
0x8F88, 0x1111, 0x000F, 0x0001, // 0xBE, ╛
0x0000, 0x0000, 0x888F, 0x1111, // 0xBF, ┐
0x8888, 0x1111, 0x0008, 0x000F, // 0xC0, └
0x8888, 0x1111, 0x000F, 0x000F, // 0xC1, ┴
0x0000, 0x0000, 0x888F, 0x111F, // 0xC2, ┬
0x8888, 0x1111, 0x8888, 0x111F, // 0xC3, ├
0x0000, 0x0000, 0x000F, 0x000F, // 0xC4, ─
0x8888, 0x1111, 0x888F, 0x111F, // 0xC5, ┼
0x8888, 0x1F11, 0x8888, 0x111F, // 0xC6, ╞
0xCCCC, 0x6666, 0xCCCC, 0x666E, // 0xC7, ╟
0xCCCC, 0x0E66, 0x000C, 0x000F, // 0xC8, ╚
0xCC00, 0x0F00, 0xCCCC, 0x666E, // 0xC9, ╔
0x0FCC, 0x0E66, 0x000F, 0x000F, // 0xCA, ╩
0x0F00, 0x0F00, 0xCCCF, 0x666E, // 0xCB, ╦
0xCCCC, 0x0E66, 0xCCCC, 0x666E, // 0xCC, ╠
0x0F00, 0x0F00, 0x000F, 0x000F, // 0xCD, ═
0x0FCC, 0x0E66, 0xCCCF, 0x666E, // 0xCE, ╬
0x0F88, 0x0F11, 0x000F, 0x000F, // 0xCF, ╧
0xCCCC, 0x6666, 0x000F, 0x000F, // 0xD0, ╨
0x0F00, 0x0F00, 0x888F, 0x111F, // 0xD1, ╤
0x0000, 0x0000, 0xCCCF, 0x666F, // 0xD2, ╥
0xCCCC, 0x6666, 0x000C, 0x000F, // 0xD3, ╙
0x8888, 0x1F11, 0x0008, 0x000F, // 0xD4, ╘
0x8800, 0x1F00, 0x8888, 0x111F, // 0xD5, ╒
0x0000, 0x0000, 0xCCCC, 0x666F, // 0xD6, ╓
0xCCCC, 0x6666, 0xCCCF, 0x666F, // 0xD7, ╫
0x8F88, 0x1F11, 0x888F, 0x111F, // 0xD8, ╪
0x8888, 0x1111, 0x000F, 0x0001, // 0xD9, ┘
0x0000, 0x0000, 0x8888, 0x111F, // 0xDA, ┌
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0xDB, █
0x0000, 0x0000, 0xFFFF, 0xFFFF, // 0xDC, ▄
0xFFFF, 0x0000, 0xFFFF, 0x0000, // 0xDD, ▌
0x0000, 0xFFFF, 0x0000, 0xFFFF, // 0xDE, ▐
0xFFFF, 0xFFFF, 0x0000, 0x0000, // 0xDF, ▀
0xBE00, 0x3600, 0x0EB3, 0x0631, // 0xE0, α
0xF3E0, 0x1310, 0x33F3, 0x0013, // 0xE1, ß
0x33F0, 0x0330, 0x0333, 0x0000, // 0xE2, Γ
0x66F0, 0x3370, 0x0666, 0x0333, // 0xE3, π
0xC63F, 0x0033, 0x0F36, 0x0330, // 0xE4, Σ
0xBE00, 0x1700, 0x0EBB, 0x0011, // 0xE5, σ
0x6660, 0x6660, 0x36E6, 0x0036, // 0xE6, µ
0x8BE0, 0x1360, 0x0888, 0x0111, // 0xE7, τ
0x3ECF, 0x3103, 0xFCE3, 0x3013, // 0xE8, Φ
0xF36C, 0x7631, 0x0C63, 0x0136, // 0xE9, Θ
0x336C, 0x6631, 0x0766, 0x0733, // 0xEA, Ω
0xE8C8, 0x3103, 0x0E33, 0x0133, // 0xEB, δ
0xBE00, 0xD700, 0x00EB, 0x007D, // 0xEC, ∞
0xBE00, 0xD736, 0x36EB, 0x007D, // 0xED, φ
0xF36C, 0x1001, 0x0C63, 0x0100, // 0xEE, ε
0x333E, 0x3331, 0x0333, 0x0333, // 0xEF, ∩
0xF0F0, 0x3030, 0x00F0, 0x0030, // 0xF0, ≡
0xCFCC, 0x0300, 0x0F0C, 0x0300, // 0xF1, ±
0xC8C6, 0x0100, 0x0F06, 0x0300, // 0xF2, ≥
0xC6C8, 0x0001, 0x0F08, 0x0301, // 0xF3, ≤
0x8880, 0x1DD7, 0x8888, 0x1111, // 0xF4, ⌠
0x8888, 0x1111, 0xEBB8, 0x0111, // 0xF5, ⌡
0xF0CC, 0x3000, 0x0CC0, 0x0000, // 0xF6, ÷
0x0BE0, 0x0360, 0x00BE, 0x0036, // 0xF7, ≈
0xC66C, 0x1331, 0x0000, 0x0000, // 0xF8, °
0x8000, 0x1000, 0x0008, 0x0001, // 0xF9, ∙
0x0000, 0x0000, 0x0008, 0x0001, // 0xFA, ·
0x0000, 0x333F, 0x8C67, 0x3333, // 0xFB, √
0x666E, 0x3331, 0x0006, 0x0003, // 0xFC, ⁿ
0x6C8E, 0x0010, 0x000E, 0x0001, // 0xFD, ²
0xCC00, 0x3300, 0x00CC, 0x0033, // 0xFE, ■
0x0000, 0x0000, 0x0000, 0x0000 // 0xFF, NBSP
);
const int charsets[] = int[18](
0x30, 10, // NUMBERS
0x41, 26, // UPPERCASE LETTERS
0x61, 26, // LOWERCASE LETTERS
0x01, 15, // SYMBOLS
0x18, 4, // ARROWS
0xB3, 40, // BARS
0xE0, 16, // GREEK
0x80, 28, // ACCENTS
0xB0, 3 // SHADES
);
#define CHARSETS 8
const int hex_chars[] = int[16](
0x30,
0x31,
0x32,
0x33,
0x34,
0x35,
0x36,
0x37,
0x38,
0x39,
0x41,
0x42,
0x43,
0x44,
0x45,
0x46
);
bool char(vec2 pos, int code)
{
if (pos.x < .0 || pos.y < .0 || pos.x >= 1. || pos.y >= 1.) {
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 (cp437[code * 4 + d] & v) > 0.;
}
float char_at(vec2 uv, vec2 pos, int code)
{
return char(uv - pos, code) ? 1. : 0.;
}
float write_5(vec2 uv, vec2 pos, int str[5])
{
float d = 0.;
int i;
for (i = 0; i < 5; i++) {
if (str[i] == 0) {
return d;
}
d += char_at(uv, pos + vec2(i, 0.), str[i]);
}
return d;
}
float write_10(vec2 uv, vec2 pos, int str[10])
{
float d = 0.;
int i;
for (i = 0; i < 10; i++) {
if (str[i] == 0) {
return d;
}
d += char_at(uv, pos + vec2(i, 0), str[i]);
}
return d;
}
float write_20(vec2 uv, vec2 pos, int str[20])
{
float d = 0.;
int i;
for (i = 0; i < 20; i++) {
if (str[i] == 0) {
return d;
}
d += char_at(uv, pos + vec2(i, 0.), str[i]);
}
return d;
}
float write_int(vec2 uv, vec2 pos, int value, int magnitude)
{
int i;
int m = 1;
float d = 0.;
for (i = 0; i < magnitude; i++) {
if (i == 0 || value >= m) {
d += char_at(uv, pos + vec2(magnitude - i - 1., 0.), int(0x30 + (value % (m * 10)) / m));
m *= 10;
}
}
return d;
}
float write_int_left(vec2 uv, vec2 pos, int value, int magnitude)
{
int i;
int m = 1;
float d = 0.;
for (i = 0; i < magnitude; i++) {
if (i == 0 || value >= m) {
pos.x += 1.;
m *= 10;
}
}
return write_int(uv, pos, value, magnitude);
}
int read(sampler2D tex, vec2 uv, float k, int d, float t)
{
float inv_k = 1 / k;
vec2 tex_uv = floor(uv * k) * inv_k;
tex_uv += vec2(d % 2, floor(d * .5)) * .5 * inv_k;
return
((mean(reframe(tex, tex_uv + vec2(0, 3) * inv_k * .125)) > t) ? 1 : 0) +
((mean(reframe(tex, tex_uv + vec2(0, 2) * inv_k * .125)) > t) ? 2 : 0) +
((mean(reframe(tex, tex_uv + vec2(0, 1) * inv_k * .125)) > t) ? 4 : 0) +
((mean(reframe(tex, tex_uv + vec2(0, 0) * inv_k * .125)) > t) ? 8 : 0) +
((mean(reframe(tex, tex_uv + vec2(1, 3) * inv_k * .125)) > t) ? 16 : 0) +
((mean(reframe(tex, tex_uv + vec2(1, 2) * inv_k * .125)) > t) ? 32 : 0) +
((mean(reframe(tex, tex_uv + vec2(1, 1) * inv_k * .125)) > t) ? 64 : 0) +
((mean(reframe(tex, tex_uv + vec2(1, 0) * inv_k * .125)) > t) ? 128 : 0) +
((mean(reframe(tex, tex_uv + vec2(2, 3) * inv_k * .125)) > t) ? 256 : 0) +
((mean(reframe(tex, tex_uv + vec2(2, 2) * inv_k * .125)) > t) ? 512 : 0) +
((mean(reframe(tex, tex_uv + vec2(2, 1) * inv_k * .125)) > t) ? 1024 : 0) +
((mean(reframe(tex, tex_uv + vec2(2, 0) * inv_k * .125)) > t) ? 2048 : 0) +
((mean(reframe(tex, tex_uv + vec2(3, 3) * inv_k * .125)) > t) ? 4096 : 0) +
((mean(reframe(tex, tex_uv + vec2(3, 2) * inv_k * .125)) > t) ? 8192 : 0) +
((mean(reframe(tex, tex_uv + vec2(3, 1) * inv_k * .125)) > t) ? 16384 : 0) +
((mean(reframe(tex, tex_uv + vec2(3, 0) * inv_k * .125)) > t) ? 32768 : 0);
}
// https://web.archive.org/web/20151229003112/http://blogs.msdn.com/b/jeuge/archive/2005/06/08/hakmem-bit-count.aspx
int bit_count(int u)
{
int c;
c = u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111);
return ((c + (c >> 3)) & 030707070707) % 63;
}
int guess_char(sampler2D tex, vec2 uv, float k, float t)
{
int b0 = read(tex, uv, k, 0, t);
int b1 = read(tex, uv, k, 1, t);
int b2 = read(tex, uv, k, 2, t);
int b3 = read(tex, uv, k, 3, t);
int mc = 0;
int mb = 100;
int i;
int b;
for (i = 0x01; i <= 0xFF; i++) {
if (i == 0x20 || i == 0xff || i == 0xDB) {
continue;
}
b = bit_count(cp437[i * 4] ^ b0) + bit_count(cp437[i * 4 + 1] ^ b1) + bit_count(cp437[i * 4 + 2] ^ b2) + + bit_count(cp437[i * 4 + 3] ^ b3);
if (b < mb) {
mb = b;
mc = i;
}
}
return mc;
}
#endif
+1
View File
@@ -0,0 +1 @@
../forge-steel/default/inc_cp437.glsl
-400
View File
@@ -1,400 +0,0 @@
#ifndef PI
#define PI 3.1415927
#endif
#include inc_time.glsl
#include inc_rand.glsl
#include inc_res.glsl
#ifndef INC_FUNCTIONS
#define INC_FUNCTIONS
// BASICS
float istep(float x, float y) {
return 1. - step(x, y);
}
float estep(float x, float y) {
return smoothstep(x - .0001, x + .0001, y);
}
float iestep(float x, float y) {
return 1. - estep(x, y);
}
float ease(float x) {
return .5 - cos(max(min(x, 1.), 0.) * PI) * .5;
}
vec2 ease(vec2 x) {
return .5 - cos(max(min(x, 1.), 0.) * PI) * .5;
}
vec3 ease(vec3 x) {
return .5 - cos(max(min(x, 1.), 0.) * PI) * .5;
}
float saw(float x) {
return abs(mod(x + 1., 2.) - 1.);
}
vec2 saw(vec2 x) {
return abs(mod(x + 1., 2.) - 1.);
}
vec3 saw(vec3 x) {
return abs(mod(x + 1., 2.) - 1.);
}
float cmod(float x, float k) {
return mod(x + k * .5, k) - k * .5;
}
vec2 cmod(vec2 x, float k) {
return mod(x + k * .5, k) - k * .5;
}
vec3 cmod(vec3 x, float k) {
return mod(x + k * .5, k) - k * .5;
}
// COLORS
vec3 col(float x) {
return vec3(
.5 * (sin(x * 2. * PI) + 1.),
.5 * (sin(x * 2. * PI + 2. * PI / 3.) + 1.),
.5 * (sin(x * 2. * PI - 2. * PI / 3.) + 1.)
);
}
vec3 shift(vec3 c, float f) {
return vec3(
c.x * (1. - f) + c.y * f,
c.y * (1. - f) + c.z * f,
c.z * (1. - f) + c.x * f
);
}
vec3 shift3(vec3 c, float f) {
return shift(shift(shift(c, f), f), f);
}
vec3 mix3(vec3 c1, vec3 c2, vec3 c3, float x) {
return istep(.5, x) * mix(c1, c2, x * 2.)
+ step(.5, x) * mix(c2, c3, x * 2. - 1.);
}
vec3 mix4(vec3 c1, vec3 c2, vec3 c3, vec3 c4, float x) {
return istep(.333, x) * mix(c1, c2, x * 3.)
+ step(.333, x) * istep(.667, x) * mix(c2, c3, x * 3. - 1.)
+ step(.667, x) * mix(c3, c4, x * 3. - 2.);
;
}
vec3 mix5(vec3 c1, vec3 c2, vec3 c3, vec3 c4, vec3 c5, float x) {
return istep(.25, x) * mix(c1, c2, x * 4.)
+ step(.25, x) * istep(.5, x) * mix(c2, c3, x * 4. - 1.)
+ step(.5, x) * istep(.75, x) * mix(c3, c4, x * 4. - 2.)
+ step(.75, x) * mix(c4, c5, x * 4. - 3.);
}
vec3 mix6(vec3 c1, vec3 c2, vec3 c3, vec3 c4, vec3 c5, vec3 c6, float x) {
return istep(.2, x) * mix(c1, c2, x * 5)
+ step(.2, x) * istep(.4, x) * mix(c2, c3, x * 5. - 1.)
+ step(.4, x) * istep(.6, x) * mix(c3, c4, x * 5. - 2.)
+ step(.6, x) * istep(.8, x) * mix(c4, c5, x * 5. - 3.)
+ step(.8, x) * mix(c5, c6, x * 5. - 4.);
}
float mean(vec3 v)
{
return v.x * .3333 + v.y * .3333 + v.z * .3333;
}
float mean(vec4 v)
{
return v.x * .3333 + v.y * .3333 + v.z * .3333;
}
// OTHER
mat2 rot(float angle) {
return mat2(
cos(angle * 2. * PI), -sin(angle * 2. * PI),
sin(angle * 2. * PI), cos(angle * 2. * PI)
);
}
// EFFECTS
vec2 lens(vec2 uv, float limit, float power) {
return uv * (1. + limit + length(uv * power));
}
vec2 kal(vec2 uv, float n) {
float t = atan(uv.y, uv.x) + PI * .5;
float q = 3. / (2. * PI);
t = abs(mod(t + PI / (n), 2. * PI / n) - PI / (n));
return length(uv) * vec2(
cos(t),
sin(t)
);
}
vec2 kal2(vec2 uv, float n) {
float t = atan(uv.y, uv.x) + PI * .5;
float t2 = abs(mod(t + PI / n, 2. * PI / n) - PI / n);
return length(uv) * vec2(
cos(t2),
sin(t2)
);
}
// NOISE
float noise(vec2 n)
{
const vec2 d = vec2(0., 1.);
vec2 b = floor(n);
vec2 f = fract(n);
f *= f * (3. - 2. * f);
return mix(mix(rand(b), rand(b + d.yx), f.x), mix(rand(b + d.xy), rand(b + d.yy), f.x), f.y);
}
float noise_f(vec2 n, int f)
{
float o = noise(n) * .5;
o += mix(o, noise(n * 2.), f > 1. ? 1. : 0.) * .25;
o += mix(o, noise(n * 4.), f > 2. ? 1. : 0.) * .125;
o += mix(o, noise(n * 8.), f > 3. ? 1. : 0.) * .0625;
o += mix(o, noise(n * 16.), f > 4. ? 1. : 0.) * .03125;
return o;
}
// VORONOI
float v_index(vec2 uv) {
return floor(uv.x) + floor(uv.y) * 45.;
}
vec2 v_pos(float i, int seed, float time) {
int iTimeId = int(time);
float iTimeV = time - iTimeId;
float x0 = rand(i + seed + iTimeId);
float y0 = rand(i + seed + 10. + iTimeId);
float x1 = rand(i + seed + iTimeId + 1.);
float y1 = rand(i + seed + 10. + iTimeId + 1.);
return vec2(
mix(x0, x1, ease(ease(iTimeV))),
mix(y0, y1, ease(ease(iTimeV)))
);
}
vec4 voronoi(vec2 uv, float dist, int seed, float time) {
vec4 o = vec4(0., 0., 2., 0.);
vec4 t = vec4(0., 0., 2., 0.);
float d, i;
vec2 uv2, p;
int dx, dy;
for (dx = -1; dx <= 1; dx++) {
for (dy = -1; dy <= 1; dy++) {
uv2 = vec2(floor(uv.x) + dx, floor(uv.y) + dy);
i = v_index(uv2);
p = uv2 + v_pos(i, seed, time) * dist;
d = length(p - uv);
if (d < o.z) {
t = o;
o = vec4(p, d, i);
} else if (d < t.z) {
t = vec4(p, d, i);
}
}
}
return vec4(o.z, t.z, o.w, t.w);
}
// SHAPES
float circle(vec2 uv, vec2 c, float size) {
return istep(size, length(uv - c));
}
float h_circle(vec2 uv, vec2 c, float size, float k) {
return circle(uv, c, size + k * .5) - circle(uv, c, size - k * .5);
}
float stripe(float x, float k1, float k2)
{
return k2 > k1 ? (1. - step(x, k1)) * (step(x, k2)) : ((1. - step(x, k2)) * (step(x, k1)));
}
float capsule(vec2 uv, float r, float d, float a)
{
uv *= rot(a);
float f1 = step(uv.x, r) * step(-uv.x, r) * step(uv.y, d - r) * step(-uv.y, d - r);
float f2 = step(length(uv - vec2(0., d - r)), r);
float f3 = step(length(uv + vec2(0., d - r)), r);
return min(1., f1 + f2 + f3);
}
float rect(vec2 uv, vec2 c, vec2 size) {
uv -= c;
return step(abs(uv.x), size.x) * step(abs(uv.y), size.y);
}
float h_rect(vec2 uv, vec2 c, vec2 size, float k) {
return rect(uv, c, size + k * .5) - rect(uv, c, size - k * .5);
}
float line(vec2 uv, vec2 p1, vec2 p2, float thick) {
vec2 p = p2 - p1;
uv -= p1;
vec2 k;
if (abs(p.y) > abs(p.x)) {
k = vec2(
uv.x - p.x * uv.y / p.y,
uv.y / p.y
);
return step(k.x, thick * .5)
* step(-k.x, thick * .5)
* step(k.y, 1.)
* (1. - step(k.y, 0.));
} else {
k = vec2(
uv.x / p.x,
uv.y - p.y * uv.x / p.x
);
return step(k.y, thick * .5)
* step(-k.y, thick * .5)
* step(k.x, 1.)
* (1. - step(k.x, 0.));
}
}
const mat2x2 ISOMETRIC_MATRIX = mat2x2(
.5, 1.,
.5, -1.
);
vec2 iso(vec2 p) {
return p * ISOMETRIC_MATRIX;
}
vec2 iso_z(float z) {
return vec2(
-z,
z
);
}
vec2 iso(vec3 uv) {
return iso(uv.xy) + iso_z(uv.z);
}
// INPUTS
vec4 reframe(sampler2D tex, vec2 uv)
{
uv = uv * vec2(iResolution.y / iResolution.x, 1.) + .5;
uv = saw(uv);
return texture(tex, uv);
}
vec4 reframe_b(sampler2D tex, vec2 uv)
{
uv = uv * vec2(iResolution.y / iResolution.x, 1.) + .5;
return texture(tex, uv);
}
vec4 kernel(sampler2D tex, vec2 uv, mat3x3 k, float spm)
{
int x, y;
vec2 offset;
vec4 sum = vec4(0.);
for (y = -1; y <= 1; ++y) {
for (x = -1; x <= 1; ++x) {
offset = vec2(x, y) * spm;
if (abs(k[x + 1][y + 1]) > 0) {
sum += k[x + 1][y + 1] * texture(tex, uv + offset);
}
}
}
return sum;
}
// BLUR
float gaussian_weight(float x, float sigma)
{
return exp(-(x * x) / (2. * sigma * sigma));
}
vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size, float spm, float sigma, float bloom)
{
int x, y;
vec2 offset;
float w;
vec4 sum = vec4(0.);
float weight_sum = 0.;
for (y = -kernel_size; y <= kernel_size; ++y) {
for (x = -kernel_size; x <= kernel_size; ++x) {
offset = vec2(x, y) * spm;
w = gaussian_weight(length(vec2(x, y)), sigma);
sum += texture(tex, uv + offset) * w;
weight_sum += w;
}
}
return (sum / weight_sum) * bloom;
}
vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size, float spm, float sigma)
{
return gauss(tex, uv, kernel_size, spm, sigma, 1.);
}
vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size, float spm)
{
return gauss(tex, uv, kernel_size, spm, 2.);
}
vec4 gauss(sampler2D tex, vec2 uv, const int kernel_size)
{
return gauss(tex, uv, kernel_size, 1. / max(iResolution.x, iResolution.y));
}
vec4 gauss(sampler2D tex, vec2 uv)
{
return gauss(tex, uv, 3);
}
float dither(vec2 uv, float x)
{
bool o = false;
o = o || x * 16. >= 1. && floor(mod(uv.x, 4.)) == 0. && floor(mod(uv.y, 4.)) == 0.;
o = o || x * 16. >= 2. && floor(mod(uv.x, 4.)) == 2. && floor(mod(uv.y, 4.)) == 2.;
o = o || x * 16. >= 3. && floor(mod(uv.x, 4.)) == 0. && floor(mod(uv.y, 4.)) == 2.;
o = o || x * 16. >= 4. && floor(mod(uv.x, 4.)) == 2. && floor(mod(uv.y, 4.)) == 0.;
o = o || x * 16. >= 5. && floor(mod(uv.x, 4.)) == 1. && floor(mod(uv.y, 4.)) == 1.;
o = o || x * 16. >= 6. && floor(mod(uv.x, 4.)) == 3. && floor(mod(uv.y, 4.)) == 3.;
o = o || x * 16. >= 7. && floor(mod(uv.x, 4.)) == 1. && floor(mod(uv.y, 4.)) == 3.;
o = o || x * 16. >= 8. && floor(mod(uv.x, 4.)) == 3. && floor(mod(uv.y, 4.)) == 1.;
o = o || x * 16. >= 9. && floor(mod(uv.x, 4.)) == 1. && floor(mod(uv.y, 4.)) == 0.;
o = o || x * 16. >= 10. && floor(mod(uv.x, 4.)) == 3. && floor(mod(uv.y, 4.)) == 2.;
o = o || x * 16. >= 11. && floor(mod(uv.x, 4.)) == 1. && floor(mod(uv.y, 4.)) == 2.;
o = o || x * 16. >= 12. && floor(mod(uv.x, 4.)) == 3. && floor(mod(uv.y, 4.)) == 0.;
o = o || x * 16. >= 13. && floor(mod(uv.x, 4.)) == 0. && floor(mod(uv.y, 4.)) == 1.;
o = o || x * 16. >= 14. && floor(mod(uv.x, 4.)) == 2. && floor(mod(uv.y, 4.)) == 3.;
o = o || x * 16. >= 15. && floor(mod(uv.x, 4.)) == 0. && floor(mod(uv.y, 4.)) == 3.;
o = o || x * 16. >= 16. && floor(mod(uv.x, 4.)) == 2. && floor(mod(uv.y, 4.)) == 1.;
return o ? 1. : 0.;
}
#endif
+1
View File
@@ -0,0 +1 @@
../forge-steel/default/inc_functions.glsl
+86 -87
View File
@@ -1,19 +1,20 @@
#include inc_res.glsl #include inc_res.glsl
#include inc_magic.glsl #include inc_magic.glsl
#include inc_functions.glsl #include inc_functions.glsl
#include inc_cp437.glsl
#ifndef INC_FX #ifndef INC_FX
#define INC_FX #define INC_FX
vec4 fx_master(vec3 c0, vec3 c, int seed, vec3 m0) { vec4 fx_master(vec3 c0, vec3 c, int seed, vec3 m0) {
float fx = magic(m0.xy, vec3(1,0,0), seed); float fx = magic(m0.xy, vec3(1., 0., 0.), seed);
bool invert = magic_trigger(vec3(m0.z, 0, 0), seed); bool invert = magic_trigger(vec3(m0.z, 0., 0.), seed);
vec3 c_out = mix(c0, c, fx); vec3 c_out = mix(c0, c, fx);
c_out = mix(c_out, 1 - c_out, invert ? 1 : 0); c_out = mix(c_out, 1. - c_out, invert ? 1. : 0.);
return vec4(c_out, 1.0); return vec4(c_out, 1.);
} }
// FX 1 : thru // FX 1 : thru
@@ -25,17 +26,17 @@ vec4 fx_1(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, v
// controls // controls
float hue = magic(f1, b1, seed + 10); float hue = magic(f1, b1, seed + 10.);
float saturation = magic(f2, b2, seed + 20); float saturation = magic(f2, b2, seed + 20.);
float light = magic(f3, b3, seed + 30); float light = magic(f3, b3, seed + 30.);
// logic // logic
vec3 c0 = texture(previous, uv0).xyz; vec3 c0 = texture(previous, uv0).xyz;
vec3 c = c0; vec3 c = c0;
c = shift3(c, hue); c = shift3(c, hue);
c *= 1 + saturation; c *= 1. + saturation;
c = mix(c + light * 2.0, c - (1 - light) * 2.0, step(.5, light)); c = mix(c + light * 2., c - (1. - light) * 2., step(.5, light));
return fx_master(c0, c, seed, m0); return fx_master(c0, c, seed, m0);
} }
@@ -47,7 +48,7 @@ vec4 fx_shift(vec2 vUV, sampler2D src0, sampler2D src1, int seed, vec3 b1, vec2
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
@@ -111,24 +112,24 @@ vec4 fx_5(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, v
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float pixel_size = magic(f1, b1, seed + 10); float pixel_size = magic(f1, b1, seed + 10.);
float quantize = magic(f2, b2, seed + 20); float quantize = magic(f2, b2, seed + 20.);
bool quantize_trigger = magic_trigger(b2, seed + 20); bool quantize_trigger = magic_trigger(b2, seed + 20.);
float blur = magic(f3, b3, seed + 30); float blur = magic(f3, b3, seed + 30.);
// logic // logic
vec3 c0 = texture(previous, uv0).xyz; vec3 c0 = texture(previous, uv0).xyz;
vec2 uv2 = uv1; vec2 uv2 = uv1;
float pixel = (1 - pixel_size) * 250 + 25; float pixel = (1., - pixel_size) * 250. + 25.;
uv2 = round(uv2 * pixel) / pixel; uv2 = round(uv2 * pixel) / pixel;
vec3 c = gauss(previous, uv2 * vec2(1 / ratio, 1) + .5, 3, .005 * blur).xyz; vec3 c = gauss(previous, uv2 * vec2(1. / ratio, 1.) + .5, 3, .005 * blur).xyz;
float colors = (1 - quantize) * 10 + 1; float colors = (1. - quantize) * 10. + 1.;
if (quantize_trigger) { if (quantize_trigger) {
c = round(c * colors) / colors; c = round(c * colors) / colors;
} }
@@ -144,7 +145,7 @@ vec4 fx_6(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, v
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
@@ -186,13 +187,13 @@ vec4 fx_7(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, v
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float lens_v = magic(f1, b1, seed + 10); float lens_v = magic(f1, b1, seed + 10.);
float horizontal_noise = magic(f2, b2, seed + 20); float horizontal_noise = magic(f2, b2, seed + 20.);
float zoom = magic(f3, b3, seed + 30); float zoom = magic(f3, b3, seed + 30.);
// logic // logic
@@ -200,12 +201,12 @@ vec4 fx_7(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, v
vec2 uv2 = uv1; vec2 uv2 = uv1;
float k1 = lens_v * .5; float k1 = lens_v * .5;
uv2 *= 1 + zoom * 2; uv2 *= 1. + zoom * 2.;
uv2 = lens(uv2, -k1, k1); uv2 = lens(uv2, -k1, k1);
float k = horizontal_noise; float k = horizontal_noise;
vec3 c = vec3( vec3 c = vec3(
reframe_b(previous, uv2 + vec2((rand(uv0.y * 1000 + iTime) - .5) * k * .1)).x, reframe_b(previous, uv2 + vec2((rand(uv0.y * 1000. + iTime) - .5) * k * .1)).x,
reframe_b(previous, uv2 + vec2((rand(uv0.y * 1100 + iTime) - .5) * k * .1)).y, reframe_b(previous, uv2 + vec2((rand(uv0.y * 1100. + iTime) - .5) * k * .1)).y,
reframe_b(previous, uv2).z reframe_b(previous, uv2).z
); );
@@ -219,30 +220,28 @@ vec4 fx_8(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, v
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float axes = magic(f1, b1, seed + 10); float axes = magic(f1, b1, seed + 10.);
float axes_trigger = magic_b(b1, seed + 10).x; float axes_trigger = magic_b(b1, seed + 10.).x;
float rotation = magic(f2, b2, seed + 20); float rotation = magic(f2, b2, seed + 20.);
float h_scroll = magic(f3, b3, seed + 30); float h_scroll = magic(f3, b3, seed + 30.);
// logic // logic
vec3 c0 = texture(previous, uv0).xyz; vec3 c0 = texture(previous, uv0).xyz;
vec2 uv2 = uv1; vec2 uv2 = uv1;
uv2 = mix(uv2, kal2(uv2 * rot(.25), floor(axes * 9 + 1)) * vec2(1, -2) + vec2(0, -.5), axes_trigger); uv2 = mix(uv2, kal2(uv2 * rot(.25), floor(axes * 9. + 1.)) * vec2(1., -2.) + vec2(0., -.5), axes_trigger);
uv2 *= rot(rotation); uv2 *= rot(rotation);
uv2.x = (saw(uv2.x / ratio + .5 + h_scroll * 2) - .5) * ratio; uv2.x = (saw(uv2.x / ratio + .5 + h_scroll * 2.) - .5) * ratio;
vec3 c = reframe(previous, uv2).xyz; vec3 c = reframe(previous, uv2).xyz;
return fx_master(c0, c, seed, m0); return fx_master(c0, c, seed, m0);
} }
#include inc_cp437.glsl
// FX 9 : cp437 // FX 9 : cp437
vec4 fx_9(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) vec4 fx_9(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0)
{ {
@@ -250,35 +249,35 @@ vec4 fx_9(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, v
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float zoom = magic(f1, b1, seed + 10); float zoom = magic(f1, b1, seed + 10.);
vec2 charset = magic_f(f2, b2, seed + 20); vec2 charset = magic_f(f2, b2, seed + 20.);
vec3 charset_ctrl = magic_b(b2, seed + 20); vec3 charset_ctrl = magic_b(b2, seed + 20.);
float char_delta = magic(f3, b3, seed + 30); float char_delta = magic(f3, b3, seed + 30.);
float t = magic(seed + 40); float t = magic(seed + 40.);
// logic // logic
vec3 c0 = texture(previous, uv0).xyz; vec3 c0 = texture(previous, uv0).xyz;
vec2 uv2 = uv1; vec2 uv2 = uv1;
float k1 = 100 * (1 - zoom) + 10; float k1 = 100. * (1. - zoom) + 10.;
float inv_k = 1 / k1; float inv_k = 1. / k1;
uv2 = floor(uv2 * k1) * inv_k; uv2 = floor(uv2 * k1) * inv_k;
int start_char = charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2] : 0x01; int start_char = charset_ctrl.x > 0. ? charsets[int(charset.x * CHARSETS) * 2] : 0x01;
int char_span = int((charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2 + 1] : 255)); int char_span = int((charset_ctrl.x > 0. ? charsets[int(charset.x * CHARSETS) * 2 + 1] : 255));
char_span = int(char_span * max(1 - charset.y, 1 / (char_span * .75))); char_span = int(char_span * max(1. - charset.y, 1. / (char_span * .75)));
ivec2 uv2i = ivec2(uv2 * k1); ivec2 uv2i = ivec2(uv2 * k1);
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); 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);
vec3 c = reframe(previous, uv2 + vec2(0, 0) * inv_k * .125).xyz * .2 vec3 c = reframe(previous, uv2 + vec2(0., 0.) * inv_k * .125).xyz * .2
+ reframe(previous, uv2 + vec2(1, 0) * inv_k * .125).xyz * .2 + reframe(previous, uv2 + vec2(1., 0.) * inv_k * .125).xyz * .2
+ reframe(previous, uv2 + vec2(1, 1) * inv_k * .125).xyz * .2 + reframe(previous, uv2 + vec2(1., 1.) * inv_k * .125).xyz * .2
+ reframe(previous, uv2 + vec2(0, 1) * inv_k * .125).xyz * .2 + reframe(previous, uv2 + vec2(0., 1.) * inv_k * .125).xyz * .2
+ reframe(previous, uv2 + vec2(.5, .5) * inv_k * .125).xyz * .2; + reframe(previous, uv2 + vec2(.5, .5) * inv_k * .125).xyz * .2;
c = char(mod(uv1 * k1, 1), code) ? c : vec3(0); c = char(mod(uv1 * k1, 1.), code) ? c : vec3(0.);
return fx_master(c0, c, seed, m0); return fx_master(c0, c, seed, m0);
} }
@@ -290,22 +289,22 @@ vec4 fx_10(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1,
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float lens_v1 = magic(f1, b1, seed + 10); float lens_v1 = magic(f1, b1, seed + 10.);
float lens_v2 = magic(f2, b2, seed + 20); float lens_v2 = magic(f2, b2, seed + 20.);
float zoom = magic(f3, b3, seed + 30); float zoom = magic(f3, b3, seed + 30.);
float k = magic(seed + 40); float k = magic(seed + 40.);
// logic // logic
vec3 c0 = texture(previous, uv0).xyz; vec3 c0 = texture(previous, uv0).xyz;
vec2 uv2 = uv1; vec2 uv2 = uv1;
uv2 *= 1 + zoom * 2; uv2 *= 1. + zoom * 2.;
uv2 = lens(uv2, -lens_v2 * 10, lens_v1 * 10); uv2 = lens(uv2, -lens_v2 * 10., lens_v1 * 10.);
vec3 c = reframe(previous, uv2).xyz; vec3 c = reframe(previous, uv2).xyz;
return fx_master(c0, c, seed, m0); return fx_master(c0, c, seed, m0);
@@ -318,13 +317,13 @@ vec4 fx_11(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1,
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float wall1 = magic(f1, b1, seed + 10); float wall1 = magic(f1, b1, seed + 10.);
float wall2 = magic(f2, b2, seed + 20); float wall2 = magic(f2, b2, seed + 20.);
float angle = magic(f3, b3, seed + 30); float angle = magic(f3, b3, seed + 30.);
// logic // logic
@@ -332,8 +331,8 @@ vec4 fx_11(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1,
vec2 uv2 = uv1; vec2 uv2 = uv1;
uv2 *= rot(angle); uv2 *= rot(angle);
uv2.y = min(uv2.y, 1 - wall1); uv2.y = min(uv2.y, 1. - wall1);
uv2.y = -min(-uv2.y, 1 - wall2); uv2.y = -min(-uv2.y, 1. - wall2);
uv2 *= rot(-angle); uv2 *= rot(-angle);
vec3 c = reframe(previous, uv2).xyz; vec3 c = reframe(previous, uv2).xyz;
@@ -347,24 +346,24 @@ vec4 fx_12(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1,
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float pixel_size = magic(f1, b1, seed + 10); float pixel_size = magic(f1, b1, seed + 10.);
bool pixel_size_trigger = magic_trigger(b1, seed + 10); bool pixel_size_trigger = magic_trigger(b1, seed + 10.);
f2 = magic_f(f2, b2, seed + 20); f2 = magic_f(f2, b2, seed + 20.);
int rule = int(f2.x * 12); int rule = int(f2.x * 12.);
float threshold = f2.y * .9 + .05; float threshold = f2.y * .9 + .05;
float fb = magic(f3, b3, seed + 30); float fb = magic(f3, b3, seed + 30.);
// logic // logic
vec3 c0 = texture(previous, uv0).xyz; vec3 c0 = texture(previous, uv0).xyz;
vec2 uv2 = uv1; vec2 uv2 = uv1;
float k1 = pow(2, 9 - floor(pixel_size * 5)); float k1 = pow(2., 9. - floor(pixel_size * 5.));
float p = 1 / k1; float p = 1. / k1;
uv2 = round(uv2 * k1) / k1; uv2 = round(uv2 * k1) / k1;
vec3 c1 = mix( vec3 c1 = mix(
reframe(previous, uv2 + vec2(.5, .5) * p).xyz, reframe(previous, uv2 + vec2(.5, .5) * p).xyz,
@@ -449,7 +448,7 @@ vec4 fx_12(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1,
alive = n >= 6 || !alive && n == 4 || alive && (n == 3 || n == 5); alive = n >= 6 || !alive && n == 4 || alive && (n == 3 || n == 5);
} }
vec3 cout = vec3(alive ? 1 : 0); vec3 cout = vec3(alive ? 1. : 0.);
return fx_master(c0, cout, seed, m0); return fx_master(c0, cout, seed, m0);
} }
@@ -461,20 +460,20 @@ vec4 fx_13(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1,
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float sx = magic(f1, b1, seed + 10) * 2; float sx = magic(f1, b1, seed + 10.) * 2.;
float sy = magic(f2, b2, seed + 20) * 2; float sy = magic(f2, b2, seed + 20.) * 2.;
float disp = .005 * magic(f3, b3, seed + 30); float disp = .005 * magic(f3, b3, seed + 30.);
// logic // logic
vec3 c0 = texture(previous, uv0).xyz; vec3 c0 = texture(previous, uv0).xyz;
const mat3x3 sobelx = mat3x3(-1, -2, -1, 0, 0, 0, 1, 2, 1); const mat3x3 sobelx = mat3x3(-1., -2., -1., 0., 0., 0., 1., 2., 1.);
const mat3x3 sobely = mat3x3(-1, 0, 1, -2, 0, 2, -1, 0, 1); const mat3x3 sobely = mat3x3(-1., 0., 1., -2., 0., 2., -1., 0., 1.);
mat3x3 sobel = sobelx * sx + sobely * sy; mat3x3 sobel = sobelx * sx + sobely * sy;
@@ -490,13 +489,13 @@ vec4 fx_14(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1,
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float zoom = 1 + magic(f1, b1, seed + 10) * 9; float zoom = 1 + magic(f1, b1, seed + 10.) * 9.;
float h_scroll = magic(f2, b2, seed + 20); float h_scroll = magic(f2, b2, seed + 20.);
float angle = magic(f3, b3, seed + 30); float angle = magic(f3, b3, seed + 30.);
// logic // logic
@@ -508,11 +507,11 @@ vec4 fx_14(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1,
uv3 *= rot(angle); uv3 *= rot(angle);
uv3 += vec2(h_scroll, 0); uv3 += vec2(h_scroll, 0.);
uv3 *= round(zoom); uv3 *= round(zoom);
vec2 umax = vec2(round(zoom), 300); vec2 umax = vec2(round(zoom), 300.);
vec3 c = reframe(previous, mod(uv3, umax)).xyz; vec3 c = reframe(previous, mod(uv3, umax)).xyz;
@@ -521,7 +520,7 @@ vec4 fx_14(vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1,
vec4 fx_stage(int fx, vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) { vec4 fx_stage(int fx, vec2 vUV, sampler2D previous, sampler2D feedback, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3, vec3 m0) {
if (fx >= 15) { if (fx >= 15) {
fx = int(randTime(seed + 100) * 14) + 1; fx = int(randTime(seed + 100.) * 14.) + 1;
} }
if (fx == 1) { if (fx == 1) {
-77
View File
@@ -1,77 +0,0 @@
#include inc_time.glsl
#ifndef INC_MAGIC
#define INC_MAGIC
vec2 magic_f(vec2 F, vec3 B, float i)
{
return vec2(
mix(F.x, randTime(i + 1.), min(1., B.z)),
mix(F.y, randTime(i + 2.), min(1., B.z))
);
}
vec2 magic_f(float i)
{
return magic_f(vec2(0.), vec3(0., 0., 1.), i);
}
vec3 magic_b(vec3 B, float i)
{
return vec3(
mix(B.x, step(.2, randTime(i + 3.)), min(1., B.z)),
mix(B.y, step(.5, randTime(i + 4.)), min(1., B.z)),
min(1., B.z)
);
}
vec3 magic_b(float i)
{
return magic_b(vec3(0., 0., 1.), i);
}
bool magic_trigger(vec3 B, float i)
{
return magic_b(B, i).x > 0.;
}
bool magic_trigger(float i)
{
return magic_b(i).x > 0.;
}
float magic(vec2 F, vec3 B, float i)
{
vec2 f = magic_f(F, B, i);
vec3 b = magic_b(B, i);
return mix(0., f.x * mix(1. - modTime(f.y), cosTime(f.y) * .5 + .5, b.y), b.x);
}
float fmagic(vec2 F, vec3 B, float i)
{
vec2 f = magic_f(F, B, i);
vec3 b = magic_b(B, i);
return f.x * mix(1. - modTime(f.y), cosTime(f.y) * .5 + .5, b.y);
}
float magic(float i)
{
return magic(vec2(0.), vec3(0., 0., 1.), i);
}
float magic_reverse(vec2 F, vec3 B, float i)
{
vec2 f = magic_f(F, B, i);
vec3 b = magic_b(B, i);
return mix(0., f.x * mix(1. - modTime(f.y), modTime(f.y), b.y), b.x);
}
float magic_reverse(float i)
{
return magic_reverse(vec2(0.), vec3(0., 0., 1.), i);
}
#endif
+1
View File
@@ -0,0 +1 @@
../forge-steel/default/inc_magic.glsl
-14
View File
@@ -1,14 +0,0 @@
#ifndef INC_RAND
#define INC_RAND
float rand(float seed){
float v=pow(abs(seed),6./7.);
v*=sin(v)+1.;
return fract(v);
}
float rand(vec2 n){
return rand(n.x * 1234. + n.y * 9876.);
}
#endif
+1
View File
@@ -0,0 +1 @@
../forge-steel/default/inc_rand.glsl
-7
View File
@@ -1,7 +0,0 @@
#ifndef INC_BASE
#define INC_BASE
uniform vec2 iResolution;
uniform vec2 iTexResolution;
#endif
+1
View File
@@ -0,0 +1 @@
../forge-steel/default/inc_res.glsl
-16
View File
@@ -27,20 +27,4 @@ const int sentences[] = int[SENTENCE_COUNT * SENTENCE_MAX_LENGTH](
const int lengths[] = int[SENTENCE_COUNT]( const int lengths[] = int[SENTENCE_COUNT](
5, 5, 10, 6, 2, 9, 10, 7, 18, 14, 4, 9, 10, 1, 6, 11, 11 5, 5, 10, 6, 2, 9, 10, 7, 18, 14, 4, 9, 10, 1, 6, 11, 11
); );
float write_sentence(vec2 uv, vec2 pos, int n)
{
float d = 0;
int i;
for (i = 0; i < SENTENCE_MAX_LENGTH; i++) {
if (sentences[n * SENTENCE_MAX_LENGTH + i] == 0) {
return d;
}
d += char_at(uv, pos + vec2(i, 0), sentences[n * SENTENCE_MAX_LENGTH + i]);
}
return d;
}
#endif #endif
+253 -260
View File
@@ -1,6 +1,7 @@
#include inc_res.glsl #include inc_res.glsl
#include inc_magic.glsl #include inc_magic.glsl
#include inc_functions.glsl #include inc_functions.glsl
#include inc_cp437.glsl
#ifndef INC_SRC #ifndef INC_SRC
#define INC_SRC #define INC_SRC
@@ -17,9 +18,9 @@ vec4 src_thru(vec2 vUV, sampler2D tex, int seed, vec3 b1, vec2 f1, vec3 b2, vec2
// controls // controls
float hue = magic(f1, b1, seed + 10); float hue = magic(f1, b1, seed + 10.);
float saturation = magic(f2, b2, seed + 20); float saturation = magic(f2, b2, seed + 20.);
float light = magic(f3, b3, seed + 30); float light = magic(f3, b3, seed + 30.);
// logic // logic
@@ -27,8 +28,8 @@ vec4 src_thru(vec2 vUV, sampler2D tex, int seed, vec3 b1, vec2 f1, vec3 b2, vec2
c = shift3(c, hue); c = shift3(c, hue);
c *= 1 + saturation; c *= 1. + saturation;
c = mix(c + light * 2.0, c - (1 - light) * 2.0, step(.5, light)); c = mix(c + light * 2., c - (1. - light) * 2., step(.5, light));
// output // output
@@ -48,21 +49,21 @@ vec4 src_2(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float thickness = magic(f1, b1, seed + 10); float thickness = magic(f1, b1, seed + 10.);
float rotation = magic(f2, b2, seed + 20); float rotation = magic(f2, b2, seed + 20.);
float distort = magic(f3, b3, seed + 30); float distort = magic(f3, b3, seed + 30.);
// logic // logic
vec2 uv2 = uv1; vec2 uv2 = uv1;
uv2.y *= cos(uv2.x * 5 * distort); uv2.y *= cos(uv2.x * 5. * distort);
uv2 *= rot(rotation + iBeats / 16); uv2 *= rot(rotation + iBeats * .0625);
float k = thickness * 2; float k = thickness * 2.;
uv2.y = cmod(uv2.y, k * 2 + .1); uv2.y = cmod(uv2.y, k * 2. + .1);
float f = istep(k * .125 + .05, uv2.y) * istep(k * .125 + .01, -uv2.y); float f = istep(k * .125 + .05, uv2.y) * istep(k * .125 + .01, -uv2.y);
return vec4(f); return vec4(f);
@@ -75,159 +76,28 @@ vec4 src_3(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float zoom = magic(f1, b1, seed + 10); float zoom = magic(f1, b1, seed + 10.);
float rotation = magic(f2, b2, seed + 20); float rotation = magic(f2, b2, seed + 20.);
float lens_v = magic(f3, b3, seed + 30); float lens_v = magic(f3, b3, seed + 30.);
// logic // logic
vec2 uv2 = uv1; vec2 uv2 = uv1;
float k1 = lens_v * 5; float k1 = lens_v * 5.;
uv2 = lens(uv2, -k1, k1); uv2 = lens(uv2, -k1, k1);
uv2 = kal(uv2, 5); uv2 = kal(uv2, 5.);
uv2 *= rot(rotation + iBeats / 16); uv2 *= rot(rotation + iBeats * .0625);
float k = zoom * .1 + .05; float k = zoom * .1 + .05;
uv2 = cmod(uv2, k * 2); uv2 = cmod(uv2, k * 2.);
float f = istep(k / (1 + length(uv1) * 2), length(uv2)); float f = istep(k / (1. + length(uv1) * 2.), length(uv2));
return vec4(f); return vec4(f);
} }
// // SRC 4 : circuit
// vec4 src_4(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3)
// {
// // start
// vec2 uv0 = vUV.st;
// float ratio = iResolution.x / iResolution.y;
// vec2 uv1 = (uv0 - .5) * vec2(ratio, 1);
// // controls
// float 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.0) - .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 4 : bacteria // SRC 4 : bacteria
vec4 src_4(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) vec4 src_4(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3)
@@ -236,23 +106,23 @@ vec4 src_4(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float zoom = 2 + magic(f1, b1, seed + 10) * 20; float zoom = 2. + magic(f1, b1, seed + 10.) * 20.;
float details = 5 * magic(f2, b2, seed + 20); float details = 5. * magic(f2, b2, seed + 20.);
float delta = magic(f3, b3, seed + 30); float delta = magic(f3, b3, seed + 30.);
// logic // logic
uv1 *= zoom; uv1 *= zoom;
vec4 data = voronoi(uv1, 1, seed + 40, iBeats * .25); vec4 data = voronoi(uv1, 1., seed + 40, iBeats * .25);
float f = ease(data.x) + ease(data.y); float f = ease(data.x) + ease(data.y);
f = saw(f * (1 + data.x * details) - delta * 2.0); f = saw(f * (1. + data.x * details) - delta * 2.);
return vec4(f); return vec4(f);
} }
@@ -264,36 +134,160 @@ vec4 src_5(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float zoom = magic(f1, b1, seed + 10); float zoom = magic(f1, b1, seed + 10.);
float voronoi_distort = magic(f2, b2, seed + 20); float voronoi_distort = magic(f2, b2, seed + 20.);
float details = magic(f3, b3, seed + 30); float details = magic(f3, b3, seed + 30.);
float noise_factor = magic(seed + 40); float noise_factor = magic(seed + 40.);
// logic // logic
vec2 uv2 = uv1; vec2 uv2 = uv1;
uv2 *= zoom * 20 + 3; uv2 *= zoom * 20. + 3.;
uv2.x += iBeats; uv2.x += iBeats;
vec4 data = voronoi(uv2, voronoi_distort, seed + 50, iBeats); vec4 data = voronoi(uv2, voronoi_distort, seed + 50, iBeats);
float f = data.x / (data.x + data.y); float f = data.x / (data.x + data.y);
f = sin(f * PI * (details * 20)) * .5 + 1; f = sin(f * PI * (details * 20.)) * .5 + 1.;
int nf = int(noise_factor * 6); int nf = int(noise_factor * 6.);
f *= mix(1, noise_f(uv2, nf - 1), step(.0, float(nf))); f *= mix(1., noise_f(uv2, nf - 1), step(.0, float(nf)));
return vec4(f); return vec4(f);
} }
// SRC 6 : video in 1 + thru // SRC 6 : circuit
vec4 src_6(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) vec4 src_6(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3)
{ {
return src_1(vUV, seed, b1, f1, b2, f2, b3, f3); // start
}
#include inc_cp437.glsl 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);
}
// SRC 7 : cp437 // SRC 7 : cp437
vec4 src_7(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)
@@ -302,60 +296,58 @@ vec4 src_7(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float zoom = magic(f1, b1, seed + 10); float zoom = magic(f1, b1, seed + 10.);
vec2 charset = magic_f(f2, b2, seed + 20); vec2 charset = magic_f(f2, b2, seed + 20.);
vec3 charset_ctrl = magic_b(b2, seed + 20); vec3 charset_ctrl = magic_b(b2, seed + 20.);
float char_delta = magic(f3, b3, seed + 30); float char_delta = magic(f3, b3, seed + 30.);
// logic // logic
vec2 uv2 = uv1; vec2 uv2 = uv1;
uv2 *= zoom * 20 + 3; uv2 *= zoom * 20. + 3.;
uv2 += iBeats; uv2 += iBeats;
uv2 = mod(uv2, 100) + 100; uv2 = mod(uv2, 100.) + 100.;
int start_char = charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2] : 0x01; int start_char = charset_ctrl.x > 0. ? charsets[int(charset.x * CHARSETS) * 2] : 0x01;
int char_span = int((charset_ctrl.x > 0 ? charsets[int(charset.x * CHARSETS) * 2 + 1] : 255)); int char_span = int((charset_ctrl.x > 0. ? charsets[int(charset.x * CHARSETS) * 2 + 1] : 255));
char_span = int(char_span * max(1 - charset.y, 1 / (char_span * .75))); char_span = int(char_span * max(1. - charset.y, 1. / (char_span * .75)));
ivec2 uv2i = ivec2(uv2); 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); 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); uv2 = mod(uv2, 1.);
float f = char(uv2, code) ? 1 : 0; float f = char(uv2, code) ? 1. : 0.;
return vec4(f); return vec4(f);
} }
// SRC 8 : sentences // SRC 8 : sentences
#include inc_sentences.glsl
vec4 src_8(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) vec4 src_8(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3)
{ {
// start // start
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float zoom = magic(f1, b1, seed + 10); float zoom = magic(f1, b1, seed + 10.);
float sentence = magic_reverse(f2, b2, seed + 20); float sentence = magic_reverse(f2, b2, seed + 20.);
float h_delta = magic(f3, b3, seed + 30); float h_delta = magic(f3, b3, seed + 30.);
vec3 h_delta_b = magic_b(b3, seed + 30); vec3 h_delta_b = magic_b(b3, seed + 30.);
// logic // logic
vec2 uv2 = uv1; vec2 uv2 = uv1;
uv2 *= (1 + zoom) * 12; uv2 *= (1. + zoom) * 12.;
uv2.y += .5; uv2.y += .5;
int s = int(sentence * (SENTENCE_COUNT - 1)); int s = int(sentence * (SENTENCE_COUNT - 1));
uv2.x += floor(uv2.y) * (h_delta - .5) * 2; uv2.x += floor(uv2.y) * (h_delta - .5) * 2.;
uv2.y = mix(uv2.y, mod(uv2.y, 1), h_delta_b.x); uv2.y = mix(uv2.y, mod(uv2.y, 1.), h_delta_b.x);
float f = write_sentence(uv2, vec2(-float(lengths[s]) * .5, 0), s); float f = write_sentence(uv2, vec2(-float(lengths[s]) * .5, 0.), s);
return vec4(f); return vec4(f);
} }
@@ -367,30 +359,30 @@ vec4 src_9(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float h_shift = magic(f1, b1, seed + 10); float h_shift = magic(f1, b1, seed + 10.);
float sentence = magic_reverse(f2, b2, seed + 20); float sentence = magic_reverse(f2, b2, seed + 20.);
float h_delta = magic(f3, b3, seed + 30); float h_delta = magic(f3, b3, seed + 30.);
vec3 h_delta_b = magic_b(b3, seed + 30); vec3 h_delta_b = magic_b(b3, seed + 30.);
// logic // logic
vec2 uv2 = uv1; vec2 uv2 = uv1;
uv2.x += h_shift; uv2.x += h_shift;
uv2 *= 15; uv2 *= 15.;
uv2.y += .5; uv2.y += .5;
int s = int(sentence * (SENTENCE_COUNT - 1)); int s = int(sentence * (SENTENCE_COUNT - 1));
float slen = float(lengths[s]); float slen = float(lengths[s]);
uv2.x += floor(uv2.y) * (h_delta - .5) * 2; uv2.x += floor(uv2.y) * (h_delta - .5) * 2.;
uv2.x = cmod(uv2.x, slen + 1); uv2.x = cmod(uv2.x, slen + 1.);
vec2 uv3 = uv2; vec2 uv3 = uv2;
uv3.y = mix(uv3.y, mod(uv3.y, 1), h_delta_b.x); uv3.y = mix(uv3.y, mod(uv3.y, 1.), h_delta_b.x);
float f = write_sentence(uv3, vec2(-slen * .5, 0), s); float f = write_sentence(uv3, vec2(-slen * .5, 0.), s);
f *= (1 - abs(floor(uv2.y) * .125)) * (1 - abs(floor(uv2.y) * .125)); f *= (1. - abs(floor(uv2.y) * .125)) * (1. - abs(floor(uv2.y) * .125));
return vec4(f); return vec4(f);
} }
@@ -402,13 +394,13 @@ vec4 src_10(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float zoom = 5 + magic(f1, b1, seed + 10) * 15; float zoom = 5. + magic(f1, b1, seed + 10.) * 15.;
float h_scroll = magic(f2, b2, seed + 20); float h_scroll = magic(f2, b2, seed + 20.);
float max_elevation = magic(f3, b3, seed + 30) * .5; float max_elevation = magic(f3, b3, seed + 30.) * .5;
float thick = .1; float thick = .1;
// logic // logic
@@ -417,32 +409,32 @@ vec4 src_10(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec
vec2 uv3 = iso(uv2); vec2 uv3 = iso(uv2);
uv3 += vec2(h_scroll, 0); uv3 += vec2(h_scroll, 0.);
uv3 *= round(zoom); uv3 *= round(zoom);
vec2 umax = vec2(round(zoom), 300); vec2 umax = vec2(round(zoom), 300.);
vec2 u0 = mod(floor(uv3), umax); vec2 u0 = mod(floor(uv3), umax);
vec2 u1 = mod(floor(uv3 + vec2(1, 0)), umax); vec2 u1 = mod(floor(uv3 + vec2(1., 0.)), umax);
vec2 u2 = mod(floor(uv3 + vec2(0, 1)), umax); vec2 u2 = mod(floor(uv3 + vec2(0., 1.)), umax);
vec2 u3 = mod(floor(uv3 + vec2(-1, 0)), umax); vec2 u3 = mod(floor(uv3 + vec2(-1., 0.)), umax);
vec2 u4 = mod(floor(uv3 + vec2(0, -1)), umax); vec2 u4 = mod(floor(uv3 + vec2(0., -1.)), umax);
float e0 = (rand(floor(u0)) * 2 - 1) * max_elevation; float e0 = (rand(floor(u0)) * 2. - 1.) * max_elevation;
float e1 = (rand(floor(u1)) * 2 - 1) * max_elevation; float e1 = (rand(floor(u1)) * 2. - 1.) * max_elevation;
float e2 = (rand(floor(u2)) * 2 - 1) * max_elevation; float e2 = (rand(floor(u2)) * 2. - 1.) * max_elevation;
float e3 = (rand(floor(u3)) * 2 - 1) * max_elevation; float e3 = (rand(floor(u3)) * 2. - 1.) * max_elevation;
float e4 = (rand(floor(u4)) * 2 - 1) * max_elevation; float e4 = (rand(floor(u4)) * 2. - 1.) * max_elevation;
uv3 = mod(uv3, 1.0) - .5; uv3 = mod(uv3, 1.) - .5;
float f = 0; float f = 0.;
f = line(uv3, vec2(0, 0) - iso_z(e0), vec2(1, 0) - iso_z(e1), thick) 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(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(-1., 0.) - iso_z(e3), thick)
+ line(uv3, vec2(0, 0) - iso_z(e0), vec2(0, -1) - iso_z(e4), thick); + line(uv3, vec2(0., 0.) - iso_z(e0), vec2(0., -1.) - iso_z(e4), thick);
return vec4(f); return vec4(f);
} }
@@ -450,6 +442,7 @@ vec4 src_10(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec
// SRC 11 : video in 2 + thru // 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) 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); return src_1(vUV, seed, b1, f1, b2, f2, b3, f3);
} }
@@ -460,38 +453,38 @@ vec4 src_12(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float zoom = 5 + magic(f1, b1, seed + 10) * 15; float zoom = 5. + magic(f1, b1, seed + 10.) * 15.;
float shape = magic(f2, b2, seed + 20); float shape = magic(f2, b2, seed + 20.);
float repeat = 1 + magic(f3, b3, seed + 30) * 10; float repeat = 1. + magic(f3, b3, seed + 30.) * 10.;
// logic // logic
float f = 0; float f = 0.;
vec2 uv2 = uv1; vec2 uv2 = uv1;
uv2 *= zoom; uv2 *= zoom;
uv2 = mod(uv2, 4); uv2 = mod(uv2, 4.);
vec2 uv3 = uv2; 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, 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 = mix(uv3.y, -uv3.y, istep(2., uv2.x) * istep(2., uv2.y));
uv3.y = -uv3.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.x) * step(1., uv2.x));
uv3.x = mix(-uv3.x, uv3.x, istep(3, uv2.y) * step(1, uv2.y)); 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 = 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, 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)); f = mix(1. - f, f, step(1., abs(uv2.y - 2.)) * step(2., uv2.x));
return vec4(f); return vec4(f);
} }
@@ -503,13 +496,13 @@ vec4 src_13(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float zoom = 5 + magic(f1, b1, seed + 10) * 15; float zoom = 5. + magic(f1, b1, seed + 10.) * 15.;
float shape = .1 + magic(f2, b2, seed + 20) * .9; float shape = .1 + magic(f2, b2, seed + 20.) * .9;
float repeat = 1 + magic(f3, b3, seed + 30) * 10; float repeat = 1. + magic(f3, b3, seed + 30.) * 10.;
// logic // logic
@@ -517,13 +510,13 @@ vec4 src_13(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec
uv2 *= zoom; uv2 *= zoom;
uv2 = mod(uv2, 2); uv2 = mod(uv2, 2.);
uv2 = abs(uv2 - 1); uv2 = abs(uv2 - 1.);
float f = istep(1, length(uv2)) * istep(1, length(1 - uv2)); 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)); f *= istep(.5, saw((length(uv2) + shape + .5) * repeat)) * istep(.5, saw((length(1. - uv2) + shape + .5) * repeat));
return vec4(f); return vec4(f);
} }
@@ -535,15 +528,15 @@ vec4 src_14(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec
vec2 uv0 = vUV.st; vec2 uv0 = vUV.st;
float ratio = iResolution.x / iResolution.y; float ratio = iResolution.x / iResolution.y;
vec2 uv1 = (uv0 - .5) * vec2(ratio, 1); vec2 uv1 = (uv0 - .5) * vec2(ratio, 1.);
// controls // controls
float size = magic(f1, b1, seed + 10) * 2 + .1; float size = magic(f1, b1, seed + 10.) * 2. + .1;
float dx = (fmagic(f2, b2, seed + 20) * (1 - size * .06) - .5) * ratio; float dx = (fmagic(f2, b2, seed + 20.) * (1. - size * .06) - .5) * ratio;
bool flip_x = magic_trigger(b2, seed + 20); bool flip_x = magic_trigger(b2, seed + 20.);
float dy = fmagic(f3, b3, seed + 30) * (1 - size * .17) - .5; float dy = fmagic(f3, b3, seed + 30.) * (1. - size * .17) - .5;
bool flip_y = magic_trigger(b3, seed + 30); bool flip_y = magic_trigger(b3, seed + 30.);
// logic // logic
@@ -561,15 +554,15 @@ vec4 src_14(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec
uv2 /= size; uv2 /= size;
uv2 *= -rot(-PI / 2); uv2 *= -rot(-PI * 0.5);
float f = istep(0, (uv2.x * 2 + uv2.y) * (uv2.x * 2 - uv2.y)) * istep(0, uv2.y); float f = istep(0., (uv2.x * 2. + uv2.y) * (uv2.x * 2. - uv2.y)) * istep(0., uv2.y);
uv2.y += .1; uv2.y += .1;
f -= istep(0, (uv2.x + uv2.y * 3) * (uv2.x - uv2.y * 3)) * istep(0, uv2.y); 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)); f += rect(uv2, vec2(0., -.04), vec2(.01, .04));
return vec4(f); return vec4(f);
} }
@@ -577,7 +570,7 @@ vec4 src_14(vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec
vec4 src_stage(int src, vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3) vec4 src_stage(int src, vec2 vUV, int seed, vec3 b1, vec2 f1, vec3 b2, vec2 f2, vec3 b3, vec2 f3)
{ {
if (src >= 15) { if (src >= 15) {
src = int(randTime(seed + 100) * 14) + 1; src = int(randTime(seed + 100.) * 14.) + 1;
} }
if (src == 1) { if (src == 1) {
-53
View File
@@ -1,53 +0,0 @@
#ifndef PI
#define PI 3.1415927
#endif
#include inc_rand.glsl
#ifndef INC_TIME
#define INC_TIME
uniform float iTime;
uniform float iTempo;
uniform float iBeats;
float randTime(float seed, int beats){
return rand(seed + floor(iBeats / beats));
}
float randTime(float seed){
return randTime(seed, 4);
}
float divider(float x)
{
if (x < .1) return 0.;
if (x < .2) return .125;
if (x < .3) return .25;
if (x < .4) return .5;
if (x < .6) return 1.;
if (x < .8) return 2.;
return 4.;
}
float modTime(float k, float k2)
{
return mod(divider(k) * iBeats * k2 / 4., 1.);
}
float modTime(float k)
{
return modTime(k, 1.);
}
float sinTime(float k)
{
return sin(modTime(k, .5) * 2. * PI);
}
float cosTime(float k)
{
return cos(modTime(k, .5) * 2. * PI);
}
#endif
+1
View File
@@ -0,0 +1 @@
../forge-steel/default/inc_time.glsl