Skip to content

About

simple 3d software render

Resources

Stars

0 stars

Watchers

1 watching

Forks

Latest commit

 

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Минималистичный монолитный движок

Каркас 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.

About

simple 3d software render

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages