Каркас 3D-движка на C99. Никаких зависимостей: собирается против libX11
и libm, а OpenGL и ALSA открываются через dlopen в рантайме — бинарник
стартует и на машине, где их нет.
Не C89: геометрия buf требует unsigned long long, а математика —
sqrtf. Оба требования пришли из твоего же buffer.h, так что спорить не
о чем.
make # демо (x11 + opengl) -> ./demo-bin
make check # тесты, без дисплея -> 88 проверок
make PLAT=null GFX=null # то же демо вообще без окна
Движок-фреймворк, а не редактор с рантаймом. Нет разделения «ресурсы против движка»: уровень, ИИ, логика, меню — обычный C-код, который ты компилируешь вместе с движком. Движок даёт окно, ввод, треугольники, звук, коллизии и загрузчики форматов. Всё остальное — твоё.
Графика уровня PS2: текстуры, прозрачность, вершинное освещение (Гуро), туман, спрайты, 2D. Никакого antialiasing, теней в реальном времени, постобработки и физики.
buf/ твой buffer.c — геометрия буфера, на которой описаны текстуры
core/ m3 (векторы, матрицы, фрустум), arena (память), app (главный цикл)
plat/ окно, ввод, время, звуковое устройство [x11 | null]
gfx/ рендер за интерфейсом без единого GL-типа [gl | null]
asset/ tga, obj, wav, van — байты на входе, буферы на выходе
world/ секторы и порталы, коллизии
snd/ программный микшер
ui/ immediate-mode GUI, таймлайн катсцен
tools/ экспортёр из Blender, генератор шрифтового атласа, xxd-обёртка
demo/ игра «Чертоги»: слэшер, ресурсы вшиты через xxd (demo/README.md)
test/ то, что проверяется без экрана
docs/ эта документация
Движок не открывает файлы и не зовёт malloc. Ни одного open(),
read(), fopen() или malloc() внутри движка. Ты даёшь ему байты — из
read(), из mmap(), из массива, сделанного xxd -i — и один блок памяти,
из которого загрузчики отрезают куски (core/arena.c). Поэтому один и тот же
код работает и с файлами, и со встроенными в бинарник ресурсами, и в
freestanding-окружении.
Низкоуровневщина живёт ровно в двух файлах. grep -r "X11\|windows.h"
находит только plat/. grep -r "gl[A-Z]" — только gfx/gfx_gl.c. Замена
оконной системы или рендера — это новый файл в plat/ или gfx/ и один
флаг в make.
docs/book/ — разбор кода от main() вниз, четырнадцать глав: что делает
каждая строчка, почему она такая и что сломается, если сделать иначе.
Начинать с docs/book/00-index.md. Незнакомые слова — в 13-glossary.md.
Короткие справочные тексты:
docs/01-architecture.md— слои, кто кого зовёт, почему именно такdocs/02-game.md— как написать игру: полный скелет и разборdocs/03-formats.md— tga, obj, wav, van, встраивание ресурсов, пределыdocs/04-decisions.md— спорные решения и аргументы против нихdocs/05-roadmap.md— чего ещё нет, в порядке важности
BSD-3-Clause, как и buf.