| 2026-09-11 |
Фидбек: вьювер крутит вокруг центра модели, точечный свет ярче, реестр объектов
...
- modelCenter (движок): ось орбиты ModelViewer — центр bbox занятых
вокселей, а не угол сетки; экспорт из index.ts, тест на углы.
- Точечные источники: three r155+ считает PointLight в физических
единицах — POINT_LIGHT_GAIN=8 в addPointLight И setIntensity
(мерцание каждый кадр затирало усиление — свет оставался тусклым).
- Реестр объектов игры (apps/game/src/registry.ts): каталог дев-вьювера
собирается сам из мест создания (areas/main/fauna), без ручного
списка; devview только рисует DOM. 20 записей, id стабильны —
гейт panels без изменений.
- Доки v2/CLAUDE.md: трек 33 + структура modelViewer/addPointLight.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
6 hours ago
|
Трек 31: пост-обработка движка (RT + полноэкранный квад) и воздух области
...
- Движок: VoxelRenderer.setPostPass (сцена в RT NearestFilter 1:1, затем
квад на экран; PostPassHandle {uniforms, dispose}) + сборщик postPass
({vignette?, grain?, wobble?}); uTime заводится рендерером всегда.
Детерминизм гейтов: зерно статично (хэш по координатам), анимируется
только дисторсия через uTime.
- Игра: PostFx (виньетка 0.32→0.5 к ночи, зерно 0.02, дисторсия жары
0.004 в зале Машины — проход пересобирается в setArea, active=ashEnabled);
AirFx (листопад рощи 26 шт с покачиванием, пыль разъезда 40 шт —
взвесь с edgeAlpha в марже окна видимости); карта AIRFX в данных;
ambientInfo.air.
- Гейт atmosphere +5 проверок (виньетка по зонам кадра, листья, пыль);
гейт panels: статы манекена синхронизированы с треком 29 (19 тайлей).
317 тестов, 7+11 гейтов зелёные.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
8 hours ago
|

Слой частиц движка: спрайты/плоские квады + окно видимости камеры
...
Частицы больше не воксели: отдельный 2D-слой поверх мира (THREE.Points
билборды и InstancedBufferGeometry квады в XZ), без освещения и теней.
Окно видимости частиц — точный AABB сляба ортокамеры на слое [y0,y1]
(polyWindow, перебор вершин полиэдра). Пепел/мотыльки/дымка/блики воды
переведены на слой: частицы живут в мировых координатах, окно камеры
заворачивает их с маржой за экран, в марже альфа гаснет — без появления
из воздуха. Окно покрывает весь кадр с перекрытием.
Движок: particles.ts (ParticlePoint/ParticleLayer, createSpriteLayer/
createQuadLayer, addParticles/addFlatParticles), polyWindow.ts,
visibleWindow(y0,y1), 4 теста (симметрия следа, покрытие окна,
сдвиг от высоты, вырожденность). Игра: particlesWindow.ts (маржа,
wrap, edgeAlpha), миграция ash/ambientParticles/waterShimmer,
setAsh пересобирает частицы области.
Грабли: знаки полуплоскостей n·δ≤b; AABB в дельтах — прибавлять target;
окно без кэша (едет за камерой); квады на воде — над гранью y=3;
fresh.update после роста ёмкости; скорости по v1 (px/s ÷ 32).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
13 hours ago
|
Трек 29: редизайн мира + текстурный слой на world-меше + скины
...
Движок: слой тайлей мира (Chunk.tex / VoxelWorld.getTex/setTex, мешер
texAt → per-vertex tiles/uvs, stampModel с opts.texRemap), рендер —
worldTileAtlas (общий атлас чанков, шейдерная инъция общая с облаком).
Манекен: скины деталей (подол/застёжка/подошвы, пряжка — слот metal).
309 тестов (+6), все 18 гейтов зелёные.
Игра: редизайн строений (дом — 3 стиля стен по сиду + tall, круглые
башня и колодец с воротом, клёпаная Машина), природа (валун-купол
с трещиной/мохом, высокий и малый кусты — варианты по сиду), олень.
Скины домов (houseTexture: кладка/доски/штукатурка/дранка/дверь) и
персонажей идут через реестр worldTex с дедупликацией тайлей по
контенту. Палитра мира дополнена слотами 18-23. Гейты areas/interact
поправлены под UNIT=10 (устаревшие константы), props — центр тайла.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
17 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 |

Трек 18: время суток, освещение и музыка — атмосфера v1 в игре v2
...
Движок: экспорт daynight (dayNightFactor/dayNightAmbient/flickerFactor),
новые API VoxelRenderer — setNight(k, tint) (hemisphere → тон ночи, фон
сцены, гашение солнца) и setDayAmbient(color) (дневная база области:
тёмные интерьеры гасят hemisphere и солнце по яркости), addPointLight.
Игра (apps/game): GameClock (1 сек = 1 игровая минута, старт 8:00),
данные освещения 8 областей v1 1:1 (bells, окна, очаги, отсвет башни;
whenFlag/notFlag/whenNight), GameLighting (diff источников, мерцание,
лампа героя HERO_LAMP), AshParticles (пепел лугов), GameAudio (темы
областей с кроссфейдом — только луга, как в v1). Мост: clockInfo/
setClock/lightingInfo/audioInfo/setAsh. Гейт tools/checks/atmosphere.mjs
— 18 проверок; areas.mjs научен отключать пепел для кадр-равенств.
Вне скоупа (отложено): туман прудов, ауры наката, виньетка, амбиент-слои.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 days ago
|

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
|

v2 трек 6: рига/анимация — «анимация = данные» + walk-цикл манекена
...
- animation/mat.ts: аффинная математика без three (Affine, порядок
Эйлера X→Y→Z, rotateAround) — чистая, тестируется без рендера.
- animation/rig.ts: рига (кости: имя/родитель/pivot в связочном
пространстве), привязка вокселей — явная у генератора или bindNearest;
validateRig (родители раньше детей, согласованность привязки);
poseVoxels — жёсткая деформация по цепочкам костей.
- animation/clip.ts: клипы — ключи {t, кость: rot/pos}, линейный
семплинг с заворотом t, validateClip (монотонность, замкнутость
цикла «первый = последний»), footMinY (контакт стопы).
- animation/locomotion.ts: walkClip(params) — ноги в противофазе, руки
против одноимённой ноги, корень приседает дважды за цикл и качается.
- models/mannequin.ts: эталонный манекен 5×11×3 с ригой (5 костей,
явная привязка — Voronoi по pivot отнёс бы торс к рукам).
- render: addVoxelCloud — InstancedMesh для деформированных вокселей,
обновление позы без пересборки геометрии.
- Демка: anim.html/anim.ts — аним-лист 8 кадров цикла (4×2); мост
poseStats(i)/clipCheck()/setModels. Гейт anim.mjs: 8 проверок —
картинка (ячейки видны, фазы различаются) + числа через мост
(клип замкнут, противофазы, контакт стоп, качание корня).
- Попутно: turntable sheetInfo отдавал viewSize 30 при камере 32 —
исправлено на реальное значение (гейт проходил за счёт запаса).
- 91 юнит-тест; гейты: render 13/13, turntable 5/5, anim 8/8.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
2 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
2 days ago
|