MATRIX RAIN: 2025 REFACTOR
21 DECEMBER 2025
Fixed the Unicode issue finally. Can now mix ASCII + Katakana.
Took me 2 hours to decipher how this even works. For future me: mat.col[]
stores shuffled column indices, mat.row[] tracks last updated row per column.
shuffle() randomizes the working set, index i (line 333) and lines 364-370 draw
one column at a time, swap() rotates columns in and out. That’s the rain.
Moved Phosphor decay level into the LSB of the RGB union - should’ve done this
in 2022 instead of separate array. WTF was I thinking?
Keeping the RGB/PD union as it is. I know the ‘portability’ nerds hate it, but
I’m on a little-endian machine, and I’m the only one reading this. It’s
cleaner.
New charset array works. UNICODE(min, max) macro packs the range into uint64.
insert_code() picks random block, unpacks it, and picks random char. Elegant.
Looks a lot like the original now:
Using half-width Katakana (U+FF61-U+FF9F) because full-width characters break
columns.
blend() is still good, left it alone.
Tossed the license and automake cruft. Just cc -O3 main.c -o matrix. Don’t
need the ceremony.
Performance regressions: none. Runs like a charm on the T490. 2% CPU. No
whirring fans.
Commit:
03f8d87
Fixed the Unicode issue finally. Can now mix ASCII + Katakana.
Took me 2 hours to decipher how this even works. For future me: mat.col[] stores shuffled column indices, mat.row[] tracks last updated row per column. shuffle() randomizes the working set, index i (line 333) and lines 364-370 draw one column at a time, swap() rotates columns in and out. That’s the rain.
Moved Phosphor decay level into the LSB of the RGB union - should’ve done this in 2022 instead of separate array. WTF was I thinking?
Keeping the RGB/PD union as it is. I know the ‘portability’ nerds hate it, but I’m on a little-endian machine, and I’m the only one reading this. It’s cleaner.
New charset array works. UNICODE(min, max) macro packs the range into uint64. insert_code() picks random block, unpacks it, and picks random char. Elegant.
Looks a lot like the original now:
Using half-width Katakana (U+FF61-U+FF9F) because full-width characters break columns.
blend() is still good, left it alone.
Tossed the license and automake cruft. Just cc -O3 main.c -o matrix. Don’t
need the ceremony.
Performance regressions: none. Runs like a charm on the T490. 2% CPU. No whirring fans.
Commit: 03f8d87