| 2026-09-09 |
v2 трек 12: сцены — SceneManager (стек, фейд out→in), меню поверх игры в демке
...
core/scene.ts — перенос схемы v1 без привязки к бэкенду: стек
push/pop/replace, переход фазами затухание → смена → проявление
(полный переход 2×duration), FadeOverlay {setAlpha} инъекцией;
параллельные переходы глотаются, enter новой сцены не ожидается,
render рисует весь стек. 10 юнит-тестов.
Демка: gameScene (tick+рендер) внизу стека, menuScene (DOM-панель,
мир под ней) сверху — старт в меню; Esc/мост gotoMenu — автосейв
в слот auto + меню, «Продолжить» грузит auto; мост sceneInfo/
gotoMenu/startGame. Гейт scenes.mjs — 11 проверок (фейд чёрный в
конце out, глотание параллельного перехода, продолжение с сейва).
Гейты демки входят в игру через startGame(false)+60 тиков (полный
переход). Уроки: CSS display:flex перебивает атрибут hidden
(#menu[hidden]{display:none}); полный переход = 48 тиков, не 24.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|

v2 трек 5: .vox импорт/экспорт (MagicaVoxel) + перекладка палитры
...
- models/vox.ts: parseVox/exportVox — чанки MAIN/SIZE/XYZI/RGBA, PACK>1 —
ошибка, неизвестные чанки пропускаются с детьми; обрыв файла (в теле и
в заголовке чанка) — понятная ошибка, не RangeError. Оси: у .vox z —
вверх, у движка y — вверх: (x,y,z)_engine = (x,z,y)_vox. RGBA ровно
256 записей; при экспорте слоты модели сжимаются в подряд 1..N.
- models/paletteMap.ts: remapSlots — перекладка слотов модели на палитру
сцены (точный hex или ближайший RGB, при равенстве — меньший слот);
решает «слоты модели ≠ слоты сцены» после импорта .vox.
- Демка: мост stampVoxB64(b64,x,z) — парсинг → перекладка → штамп +
ремешинг dirty-чанков.
- Гейты: render 13 проверок (+ .vox-штамп меняет кадр, фиксстура — base64
от exportVox), turntable 5 проверок зелёные.
- Уроки в план/CLAUDE: Node не импортирует @rpg/engine — фиксстуры гейтов
вкладываются готовыми; точка правки для «кадр изменился» обязана быть
в кадре камеры; заголовок .vox-чанка — 12 байт.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
3 days ago
|
v2 трек 3: генераторы воксельных моделей (rng, формат JSON, деревья/валуны, штамповка)
...
- math/rng.ts — mulberry32: next/int/range/chance/pick, детерминизм по сиду
- models/format.ts — VoxelModel (size + плотный base64 + слоты-палитра),
encode/decode + числовая валидация (validateModel) для агентного пути
- models/generators.ts — treeModel (круглая/колонна/ель), boulderModel
(union сфер, свет на верхних гранях); (вид, сид) -> модель, чисто
- models/stamp.ts — stampModel в мир с клиппингом (half-open границы)
- демка: 12 деревьев + 3 валуна из генераторов; ручные tree/boulder удалены
- гейт рендера: 12 проверок (+ модельная статистика, детерминизм и
различие вариантов через мост stampTree)
- 50 юнит-тестов зелёные; доки plan.md/CLAUDE.md обновлены
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
3 days ago
|
v2: демка на мире 6×6 чанков (96×96), замер производительности мешинга в мосте
...
- CHUNKS=6: мир 36 чанков, 80к вершин / 40к треугольников, постройка+мешинг
~0.4-0.5 с (гейт-лимит 2 с); контент разнесён по площадке, дом у центра
- мост __agent: chunkStats/perf; правка setVoxel атомарна с ремешингом
- гейт 9/9: мир из 36 чанков, перф-лимит, столбик на шве x=48 меняет кадр
- грабля теста: правка занятого вокселя не меняет геометрию — столбик
«исчезал» дважды (вне кадра, затем внутри дома)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
3 days ago
|
v2: чанковый мир — Chunk/VoxelWorld с dirty-трекингом, meshRegion, демка 3×3 чанков
...
- world/chunk.ts (16×H×16) + world/world.ts: мир-словарь, get/set через
границы (в т.ч. отрицательные), правка боковой кромки помечает соседний
чанк dirty
- мешер обобщён: meshRegion(at, bounds, palette) — область по функции
доступа; world/worldMesher.ts мешает чанк через world.get — culled и AO
на швах бесшовны; тест: меш 4 чанков ≡ меш одной сеткой (позиции+AO)
- демка на мире 3×3 чанков с ремешингом dirty-чанков; мост __agent:
setVoxel (атомарен с ремешингом), chunkStats; гейт 8/8 — столбик на шве
чанков меняет кадр, dirty схлынулись
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
3 days ago
|
Спайк v2: воксельный рендер — сетка/мешер/AO, three.js-бэкенд, демка и скриншот-гейт
...
- движок: voxel/grid.ts (Uint8-сетка, палитра по индексам), voxel/mesher.ts
(culled-грани + классический AO 0..3 с флипом диагонали, 12 тестов),
render/voxelRenderer.ts (ортокамера диметрии 2:1, dirLight + shadow map,
низкое разрешение 480×270)
- тулзы: tools/agent-lib.mjs — браузерный каркас проверок v2 (swiftshader),
tools/png.mjs — PNG-кодек (в т.ч. RGB-скриншоты headless Chromium)
- демка: apps/demo — воксельный пепельный луг в палитре арт-библии,
мост window.__agent (setSun/stats), чек checks/render.mjs: pageerror,
меш, тени ползут утро/вечер, апскейл кратен 2×2, многокрасочность
- грабли в v2/CLAUDE.md: камера под землёй при минус-Y (ловится только
скриншот-гейтом — урок №2 подтверждён в первый же день)
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
3 days ago
|