| 2026-09-11 |

Трек 32: крепления предметов к костям риги — рюкзак и факел на герое
...
- Движок: attach.ts — Attachment {bone, model, pos?, rot?}: предмет
(обычная VoxelModel со своей палитрой) размещается в связочном
пространстве базы и едет с костью (boneWorlds); attachVoxels мержит
воксели предметов в позу, attachTiles — общий реестр тайлей со сдвигом
id за базу. Неизвестная кость — throw. Тесты: предмет едет ровно как
воксель кисти (равенство сдвигов 1e-9), тайли, детерминизм.
- Генераторы: backpackModel (84 вокс, пряжка — перекраска, не добавление),
torchModel (6 вокс), палитра GearPalette.
- Character: CharacterOptions.attachments + setAttachments; visual()
мержит attachVoxels до yaw-маппинга — предмет поворачивается с моделью.
- Игра: герой с рюкзаком (root, за спиной) и факелом (armR, машет с
рукой); мост heroGear(ids|null) + heroInfo.gear/gearVoxels. Гейт
gear.mjs (6 проверок): счёт 90/84/0, снятие меняет кадр, ходьба цела.
- Багфиксы, найденные пробой: пост-проход затемнял день ~втрое (RT
хранит linear, квад рисовал без linearToOutputTexel — конверсия сразу
после сэмпла, до эффектов; тест на порядок) и дев-панель была видна
с самого старта страницы (#dev[hidden]{display:none}).
326 тестов, гейты gear/atmosphere/panels/render зелёные.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
7 hours ago
|
Кубы поворачиваются вместе с моделью: rotY на инстансах
...
Character.yaw раньше вращал только позиции вокселей — кубы оставались
осями-выровненными и на диагональном ходе «пилили» силуэт углами.
Теперь PosedVoxel.rotY (опциональный поворот самого куба): visual()
ставит rotY = yaw на каждый воксель, рендер строит матрицу инстанса
makeRotationY(rotY) + setPosition — жёсткое вращение модели целиком.
Олень без изменений (четверти оборота держат сетку на осях). Проба
tools/probe-diag.mjs: герой на мировой диагонали, силуэт чистый.
6 гейтов игры + 11 демок зелёные, 301 тест.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
18 hours ago
|
| 2026-09-10 |
Текстурный слой моделей + манекен 10×16×4: деталь на текстурах, не геометрией
...
Формат: тайли пиксель-арта на грани вокселя (VoxelTile, тексель = слот
палитры — перекраска красит и текстуры) + tex (id тайля на воксель);
encodeModel(g, palette, texture?), texIdAt/texBytes/resolveTiles,
числовая валидация слоя. Рендер: addVoxelCloud(voxels, tiles) — атлас
(ячейка = 6 суб-граней тайля, 0 белая), aTileId + шейдерная инъция
(грань куба из нормали). Манекен: 14×24×8 (498 вокс) → 10×16×4 (164);
лицо — арт 8×8 текселей (бахрома/глаза/рот) на фасаде головы, волосы —
макушка и затылок. Игра: BODY_SIZE [5,16,5], stride 9.6, облака с
resolveTiles. Порог маха anim-гейта 1.0→0.8 (ноги вдвое короче).
6 гейтов игры + 11 демок зелёные, 300 тестов.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
1 day ago
|
| 2026-09-09 |

v2 трек 8: каркас ядра + герой (управление, камера следит)
...
- core/loop.ts: GameLoop — фиксированный шаг 60 Гц, аккумулятор с
maxStepsPerFrame, ручной режим setManual+stepTick (детерминизм гейтов),
now/schedule инъектируются для Node-тестов
- core/ecs.ts: EntityWorld — перенос проверенной минимальной ECS v1
(открытый вопрос «каркас ядра» решён)
- core/controls.ts: ввод как данные; screenMoveToWorld — экранные оси
в мировую горизонталь по yaw камеры (проекция на границе, урок №1)
- physics/character.ts: Character — тело физики + walk от скорости
(фаза = путь/stride, стопы не скользят; покой замирает); spawnY для
спавна в воздухе; мост тела физики переехал на Character (один путь)
- render: setTarget/currentTarget — камера (и солнце) следит за целью
- Демка: герой на WASD/стрелках + виртуальный стик агента; мост
setInput/heroInfo/heroTeleport/stepTicks/setManual/setFollow
- Гейт hero.mjs 9 проверок: ввод агента двигает героя, фаза 1.25
цикла/с, стена по грани, покой замирает, камера следует
115 юнит-тестов; гейты: render 13, turntable 5, anim 8, physics 7,
hero 9 — зелёные.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|