ASCII DONUT
A real-time 3D torus drawn entirely from characters. Move your cursor across it to steer the rotation. Let go and it keeps spinning.
GLYPHS.,-~:;=!*#$@|FRAMERATE60 fps|INPUTpointer + touch
view the gallery ascii animations
Hand-tuned loops rendered the same way the donut is - pure text, glowing under the CRT.
$$@@@@@@@@@@
@@@$$#######***####$$@@
@@$$##**!!!!=====!!!!**##$$@
@@$##**!!===;;;;;;;;===!!**##$@
@$##**!!==;;:::~~~~:::;;==!!**##$@
@$#**!!==;;::~~----~~::;;==!!**#$@
@$#**!==;::~~--,,,,,,--~~::;==!!*#$@
@$#*!!=;::~--,,......,,--~::;=!!*#$@
$#*!!=;::~-,,.. ..,,-~::;=!*#$
$#*!=;::~-,.. ..,-~:;=!*#$
@$#*!=;:~-,.. ..,-~:;=!*#$@
@$#**!=;:~--,,.. ..,,-~:;=!**#$@
@$#*!!=;::~~--,,......,,--~::;=!!*#$@
@$##*!!==;;::~~----~~::;;==!!**##$@
@@$##**!!===;;:::::::;;===!!**##$@
@@$$##**!!!!=======!!!!**##$$@
@@@$$$######***#####$$@@@
@@@@@@@@@@@@@@@ neon torusSTILL
frozen frame of the donut, full luminance ramp
.
.:.
.:::.
.:::::.
':::'
':'
' reactor core6F
pulsing diamond, 6-frame loop
= + < | = 1 \< | 0= 1 \< 0 /1 \ *| 0 /1 \ * 0 / + =/ <* =/ <* = \ 0 < = < > = + < | 1 \ | 0 1 \ 0 / * / * > + < > = + < = \ | 0 1 | 1 > 1+ | /1 *| /1 *|
code rain8F
procedural downpour of glyphs
~~==~~ ~~==~~
==..== ==..==
~.. ..~ ~.. ..~
~ ~= =~ ~= =
=~ ~=. .=~ ~=. .
.= =. .= =.
.~~ ~~. .~~ ~~.
==~~== ==~~==
..==.. ..==.. carrier wave12F
scrolling sine, sampled to the grid
## ##
###### ######
################
##############
############
########
####
## 8-bit heart4F
systole / diastole, 4-frame loop
live donutREALTIME
same renderer, smaller grid - hover to steer it too
how the donut is drawn
No WebGL, no mesh, no textures. Trigonometry and a z-buffer, printed as monospace text.
- projection
- Each point on the torus is rotated in 3D, divided by depth, and mapped to a character cell.
- lighting
- A surface-normal dot light picks a glyph from .,-~:;=!*#$@ - brighter normals get denser ink.
- color
- Depth shifts the hue from neon green (near) to neon pink (far), so the tube reads as a glowing ring.
- control
- Pointer position sets a target tilt; the pose eases toward it, then idles back into an auto-spin.
/dev/ascii
visitor@ascii:~$ echo "