| 2026-09-12 |
Фиксы ревью движка: параллакс тумана, dispose молнии, tint при росте слоя
...
- fog: дрейф слоёв теперь убывает с глубиной (0.42−0.05·k) — код
противоречил доку «глубокие слои медленнее» (параллакс объёма).
- lightning: dispose посреди вспышки гасит свет рендера и слой —
раньше DirectionalLight и env-подсветка дождя замирали навсегда.
- particles: обёртка слоя помнит tint и переапплаит его свежему impl
при росте ёмкости (иначе новый меш получал дефолтный белый).
- тесты: dispose молнии гасит свет; tint переживает рост (спрайты/квады).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
12 hours ago
|
Молния подсвечивает дождь/снег и туман
...
Lit-слои получали env-свет только от ambient+солнца — направленный свет
вспышки на них не действовал (ночью дождь оставался невидимым в разряд).
lightningEnvLight(k, nightK) добавляет долю вспышки (0.2) в uEnv и
uFogColor при пересчёте света в setSun: ночью дождь проявляется во
вспышку вместе с миром, туман вспыхивает тем же цветом.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
13 hours ago
|
Молния: разряд + вспышка с тенями, дебаг-кнопка «⚡ Молния»
...
Движок (render/lightning.ts): LightningSystem — strike(at?) (без точки —
случайная точка окна видимости, детерминирована номером удара), update(t)
гонит огибающую мерцания (пик + два рестрайка, 0.55 с), info(). Разряд —
излучающий слой частиц: непрерывный зигзаг (сумма двух синусов) 58 узлов
на высоту 176 (за верх кадра) + ореол и две ветви. Вспышка — отдельный
направленный свет рендера setLightning(at, k) с shadow map: свет из точки
разряда вниз с наклоном, ночью усилен (×(1+nightK)); setSun не трогает.
Игра: мост makeLightning(at?)/lightningInfo(), тик системы, кнопка в
секции погоды дев-панели. Гейт weather.mjs: +6 чеков (25 всего).
Тесты чистой части (огибающая, геометрия, жизненный цикл) — 387 ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
13 hours ago
|
Снег на 50% быстрее: 1.7 → 2.55 юнит/с
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
13 hours ago
|
Капли дождя втрое быстрее: 31 → 93 юнит/с
...
Цикл падения слоя (40 юнитов) сжался до ~0.43 с — тест «колонка
неизменна внутри падения» ужат до окна 0.15 с внутри цикла.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
13 hours ago
|
Дождь и снег: слоёв 3 → 6, суммарная плотность ~×1.75
...
6 перекрывающихся полос глубины (дальний 0..0.3 частый и мелкий,
ближний 0.75..1.0 редкий и крупный): ливень 6147 → 10757 капель,
снег 3074 → 5798 хлопьев. Потолки RAIN_MAX/SNOW_MAX не тронуты —
они по-слойные, макс. плотность отдельного слоя не менялась.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
13 hours ago
|
Дождь и снег многослойные и втрое гуще (как туман)
...
Фидбек: «дождь сильно гуще, тоже многослойным — с туманом круто
сработало, снег аналогично». RAIN_LAYERS/SNOW_LAYERS = 3 слоя частиц,
каждый в своей полосе глубины: ближний редкий и крупный, дальний
частый и мелкий (стена дождя в глубине), полосы перекрываются —
слоистость не читается линиями. Суммарная плотность ×~3 (ливень
~6100 капель, снег ~3100 хлопьев у игры). Слои остаются lit-частицами
— свет источников и ночное гашение работают как раньше. Тесты под
новую плотность (+1 на полосы слоёв), 378 ✓; гейт погоды зелёный.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
13 hours ago
|
Туман без высотного затухания: кроны и герой под туманом
...
Фидбек скрином (screens/fog.png): затухание выше y≈8 выводило из
тумана кроны деревьев (17–38) и героя (~14) — туман «строго у земли»,
деревья торчали чистыми посреди дымки. На плоском рельефе демки
«собирание тумана в низинах» ничего не добавляет — затухание убрано,
объём читается стопкой слоёв по глубине. Гейт погоды зелёный.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
14 hours ago
|

Многослойный туман по дальности от камеры + слайдер дев-панели
...
Композитный проход: сцена → RT с DepthTexture, полноэкранный квад
реконструирует мировую точку (в орто глубина линейна) и красит кадр
стопкой из 6 слоёв по дистанции вдоль взгляда ОТ КАМЕРЫ. Клубы — fbm
по мировым XZ с дрейфом ветра (глубокие слои медленнее — параллакс),
высотное затухание собирает туман в низинах; цвет — env-свет сцены
(день светло-серый, ночь тёмный). Полоты ⟂ оси взгляда забракованы
пробой-изолятом: при взгляде ~63° плоскости уходят под рельеф.
Главная грабля: d в шейдере обязан быть dot(wp − uCamPos, uCamF) —
глубиной от КАМЕРЫ; вариант от цели давал для видимых пикселей
d ∈ [−1.12·V, +1.12·V] при слоях на 2.5..5·V — все smoothstep'ы
нули, туман полностью прозрачен (изолят маскировал: камера ближе).
Попутно чинит pow-граблю из 55876f8: степень PARTICLE_LIT_GAMMA из TS
в GLSL-шаблоне печаталась «2» (int) — pow(int) не компилировался в
GLSL ES, lit-слои частиц (дождь/снег/пепел/листья/пыль) молча не
рисовали; в GLSL-шаблоны числа из TS — через .toFixed(1).
WeatherSpec.fog (0..1), база прудов 0.3; 6-й слайдер «туман» в дев-
панели. Гейт weather: 19 проверок (+6 туман: рисуется, глубинный
градиент, дрейф, ночь тёмная, слайдер панели). check:fast — 377 ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
14 hours ago
|

Освещаемые частицы в темноте ещё темнее: квадрат видимости + гашение цвета
...
Фидбек: «освещаемые партиклы в темноте сделаем ещё темнее». Две правки
ветки #if LIT шейдера частиц:
1) vis гасит и цвет, и альфу: vColor*(uTint*vis + received) — раньше
гасилась только альфа, цвет оставался полным, и полупрозрачные СЕРЫЕ
точки читались на тёмном фоне;
2) кривая видимости нелинейная: vis = clamp((max-канал(received)*1.6)^2) —
степень давит слабый свет (ночь received ~0.05-0.1: линейная кривая
оставляла vis ~0.1), а день/лампа по-прежнему насыщают vis в 1.
Чистая функция litVisibility(maxChannel) зеркалит шейдерную кривую —
тесты без WebGL (371). Замер пробы (пара кадров ночью «дождь вкл/выкл»,
пиксели ярче фона): 815 -> 641 (гашение цвета) -> 10 (квадрат); день
не изменился (дождь 101 -> 100), мотыльки (излучающие) светятся как
раньше (961 тёплых px).
Гейт weather «облачность темнит кадр» ослаблен до x0.93: зенитный свет
пасмурного дня (fd7a331) намеренно добавляет освещённости — падал и до
этой правки (воспроизведено на старом шейдере, цифры те же).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
14 hours ago
|

Два вида частиц: излучающие и освещаемые сценой (lit)
...
Живучий баг «частицы светятся одинаково при любом освещении»: теперь
режим — свойство слоя. renderer.addParticles({lit: true}) — освещаемый
слой: полученный свет (env-свет сцены + точечные источники) правит и
цветом, и видимостью (альфа = clamp(max-канал·PARTICLE_LIT_VIS)) — ночью
в темноте частица исчезает, у лампы/фонарика проявляется, днём вид как
раньше. Излучающий режим (по умолчанию) — прежняя формула.
- particleEnv(amb, sun) — чистая функция env-света (ambient + доля
солнца PARTICLE_ENV_SUN 0.3: у билборда нет нормали); рендер
пересчитывает uEnv в конце setSun — туда сходятся все изменения света;
- игра: lit — дождь/снег (WeatherSystem.setTint удалён), пепел,
листья/пыль; tint остался самосветящимся: мотыльки, дымка, блики.
Ручной ночной tint был подменой реакции на свет — больше не нужен.
Замер в игре: дождь день 101 / ночь 14 яркости, в луче фонарика капли
проявляются; мотыльки ночью светятся как раньше. Тесты 368 ✓ (+particleEnv),
гейты atmosphere/weather/panels ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
15 hours ago
|
Пасмурная «тенька сверху»: зенитный свет с контактной тенью
...
В облачный день свет рассеян и переотражается так, словно есть доп свет
прямо сверху. Второй DirectionalLight в зените (кастер тень вбок не
смещает — фрустум только на видимую область) даёт минимальную тень ПОД
объектом, куда косые лучи солнца не достают, и чуть подсвечивает
горизонтальные грани (пасмурный «молочный» свет).
- zenithIntensity(cloudK, nightK, daySunScale) — чистая функция,
OVERCAST_TOP_LIGHT = 0.55; ночь и тёмный интерьер гасят вместе с небом;
- мягкость общая с солнцем (shadowSoftK), пересчёт в setSun;
- в игре: у деревьев/валунов/героя в пасмурный день мягкий ореол у
основания, направленные солнечные тени исчезают.
Тесты 368 ✓, гейты atmosphere/weather/panels ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
15 hours ago
|
Контраст теней: setShadowStrength + облачность светлит тени
...
Рассеяный свет освещает затенённые места со всех сторон — в пасмурный
день тени не только мягче (3ba9b1d), но и светлее. Ручка —
sun.shadow.intensity (three 0.186: mix(1.0, shadow, intensity) в шейдере):
- shadowIntensity(strength, cloudK) — чистая функция: сила тени гасится
облачностью множителем 1 − k·SHADOW_CLOUD_FADE (0.45);
- setShadowStrength(k) — ручное управление (0 — тени исчезают);
- setCloud по умолчанию тянет контраст вниз (не перезаписывает силу,
в отличие от мягкости); пересчёт в setSun — переживает тики света.
Замер на изоляте (земля + куб): контраст свет/тень 3.6 в ясный →
1.5 в пасмурный. Тесты 361 ✓, гейты atmosphere/weather ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
15 hours ago
|
Мягкость теней: setShadowSoftness + облачность рассеивает тени
...
Движку нужна ручка резкости теней: облачность гасила солнце, но тени
оставались резкими, хотя рассеяный свет даёт мягкую полутень.
Механика: PCF three (0.186) масштабирует диск сэмплов Вогеля
shadow.radius'ом — мягкость без смены типа shadow map. Радиус в текселях
считает чистая функция shadowBlurTexels(k, frustumHalf, mapSize) из
мирового размытия (0..SHADOW_BLUR_MAX = 3 юнита) — зум и высота солнца
меняют фрустум, мировое размытие постоянно (setSun пересчитывает тексели).
API: VoxelRenderer.setShadowSoftness(k) (0 — резкие, ручное поверх);
setCloud(k) тянет мягкость своим k — пасмурная погода даёт диффузные тени
без правок игрового кода. Замер пробы: резких краёв на кадре 14101 → 6614
при облачности 1. Тесты функции — 4, check:fast 357 ✓, гейты
atmosphere/weather ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
15 hours ago
|
Дев-панель не ставит игру на паузу: мир и время живут при открытой панели
...
Раньше тик при dev.open выходил рано — стояло всё, кроме погоды. Теперь
панель — просто оверлей: часы/свет/фейд/катсцена/фауна идут, правки
слайдеров видно в живой игре. Метка часов панели обновляется каждый тик
(новый refreshClockLabel — только текст, слайдер не трогается, чтобы не
мешать тянущему его; полная синхронизация осталась на открытии и
перемотках). Пауза осталась только у меню и сумки. Гейты panels/weather ✓,
check:fast — 353 теста.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
16 hours ago
|
Свет частиц читается: a² вместо a³ + конус фонарика 2.2× для объёма
...
Диагноз: реакции частиц на свет были перцептивно нулевыми при исправной
проводке. Точечные источники: кубический фоллофф концентрировал вклад в
внутреннем ~10% радиуса (среднее a³ по сфере ≈ 1/60) — изолят с игровыми
условиями давал +1.4% яркости. Фонарик: тонкий горизонтальный луч едва
пересекает видимый ортокамерой слой — ~20 капель (76 px diff), глаз не
ловил; подтверждено хирургическим A/B в живой игре (flip uSpotOn при
замороженном времени).
Фикс: квадратичный фоллофф точечных источников в LIGHT_FRAG (капли в
пятне лампы тёплые и яркие), конус спота для частиц в 2.2× шире
поверхностного с клампом полуугла (луч читается светящейся цепочкой
капель). Гейт atmosphere/weather ✓, check:fast — 353 теста.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
17 hours ago
|
Осадки: ускорение ×1.4 и глубина (план даль/близь)
...
Фидбек: дождь и снег медленные, выглядят плоско. Скорости ×1.4
(дождь 31 юнит/с, снег 1.7). Глубина: камера ортографическая, параллакса
нет — глубина симулируется расхождением параметров частицы от стабильной
глубины d∈[0..1] (sin-хэш, уклон в дальний план): дальнее меньше/
медленнее/бледнее (аэроперспектива), ближнее крупнее/быстрее; у дождя
дальние штрихи короче, у снега ближние качаются шире. Снежинка несёт
свой размер в позах (раньше размер слоя был фиксированным). Тесты
респавна переведены на фазовый скан (скорость теперь пер-частица),
добавлен тест разброса планов. 352 теста, гейт weather ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
18 hours ago
|
Фикс #218: рост ёмкости слоя частиц не плодит замороженные меши
...
Редирект layer.update = fresh.update при росте ёмкости ломался, когда
держатель слоя (WeatherSystem) снял методы заранее: ссылка навсегда
указывала в замыкание старой реализации, каждый тик сверх ёмкости
создавал новый слой с однократной записью — замороженные снимки дождя
копились в сцене (пелена на весь экран, ~46 слоёв).
Теперь createSpriteLayer/createQuadLayer держат стабильный фасад:
публичный объект один на всю жизнь слоя, при росте подменяется только
внутренняя реализация, первый кадр после роста рисуется сразу.
Регрессия particleLayers.test.ts (метод снят заранее — меш один).
Живой прогон: veil% 3.6→13.5 (накопление) → стабильные 0.07-0.09.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
18 hours ago
|
Дождь/снег: респавн — полный реролл колонки, трек не остаётся на экране
...
Сдвиг колонки при респавне в узкой окрестности якоря (±20 юнитов) оставлял
каплю падать в одной и той же полосе: трек «горел» на экране вечно, а поле
колонн было квази-статично в мире — кадры, разнесённые на полный цикл
падения, совпадали. Теперь sin-хэш от номера цикла растягивается на большой
период (RAIN_SPAN 731 / SNOW_SPAN 613) — капля перебрасывается по всему
периоду. Колонка внутри падения неизменна (капля падает по прямой).
Тесты: переброс ≥80% капель за цикл, стабильность колонки внутри падения.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
19 hours ago
|
Тесты света частиц (packParticleLights/фонарик) — упущены прошлым коммитом
...
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
19 hours ago
|
Лок fps: селект 30/60 вместо чекбокса — потолок 60 при rAF 60 Гц неотличим
...
Фидбек «unlocked 60 = locked 60»: лимитер применялся верно (замер живой
страницы: лок 30 даёт ровно 30 fps), но потолок, равный герцовке rAF,
пропускает каждый кадр (порог 16.7−1 мс) и по построению совпадает с
«без лока». Осмысленный демо-лимит обязан быть ниже герцовки — секция
«ЦИКЛ» стала селектом (без лока / 30 / 60), мост devSetFpsLock принимает
лимит, fpsInfo.lock — число. Тесты цикла: поправлено неверное ожидание
«первый кадр после setMaxFps проходит» (до 33.3 мс — пропуск) + сценарий
120 Гц rAF: лок 60 рендерит вдвое реже. Гейт panels синхронен.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
19 hours ago
|
FPS-счётчик в правом верхнем углу + лок 60 fps в дев-режиме
...
- движок: GameLoop.setMaxFps(fps) на живом цикле (0 — без лимита;
lastFrame сбрасывается, чтобы без лока не ждать интервала) — тест
на живом цикле с инъекцией времени
- игра: #fps в правом верхнем углу (сводка раз в 0.5 с, z-index выше
дев-панели); в панели секция «ЦИКЛ» — чекбокс «лок 60 fps»
- мост: fpsInfo() (fps + lock), devSetFpsLock(on) — применить и
синхронизировать чекбокс
- гейт panels: счётчик показывает кадры, угол виден, лок и чекбокс
синхронны (грабля: headless троттлит rAF — мерить «fps > 0»)
Тесты 345 ✓, гейт panels ✓, гейт weather 14 ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
20 hours ago
|
Погода: респавн капли в новой колонке — траектории не повторяются
...
Якорь x/z был постоянным: капля после «приземления» респавнилась
наверху в той же колонке и вечно повторяла одну траекторию (~2 с),
рисунок дождя на экране зациклен. Теперь к якорю добавляется sin-хэш
от номера цикла падения (чистая функция t — детерминизм гейтов): каждый
цикл — новая колонка; то же у снежинок. Тест «респавн меняет колонку».
344 ✓, гейт 14 ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
20 hours ago
|
Погода: плотность осадков на площадь окна, дождь — штрихами
...
Ливень при rain=1 выглядел как редкая субпиксельная пыль: окно слоя
[0,40] (след кадра до дальней плоскости) при камере игры (viewSize 80,
far 800) — 342×342 юнита, а 260 капель с фиксированным счётчиком
размазывались по нему (капля 0.5 юнита при 3.3 px/юнит — 1.7 px).
- счётчик капель/снежинок — плотность на кв. юнит окна (RAIN_DENSITY
0.016 / SNOW_DENSITY 0.007, потолки RAIN_MAX/SNOW_MAX): зум камеры
не меняет видимую плотность; info() отдаёт фактические счётчики
- капля рисуется штрихом — цепочкой из 3 точек над головой (хвост
бледнее и тоньше), размер поднят до 0.55/0.7 юнита
- мост: windowInfo(y0, y1) — окно видимости частиц + параметры камеры
(диагностика плотности агентом)
Тесты 344 ✓ (число точек = плотность × площадь окна; счётчики после
update), гейт weather.mjs 14 ✓ (ливень — стена капель >1000).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
20 hours ago
|

Погода в движке: дождь, снег, ветер, облачность
...
Движок (packages/engine):
- WeatherSpec (windDir/windStrength/cloud/rain/snow), clampWeather,
windVector; weather.ts — WeatherSystem на слоях частиц (addParticles):
окно осадков = след кадра + маржа, wrap, альфа у края; дождь —
тяжёлая капля (дрейф ветра ×0.6), снег — покачивание + полный дрейф
- VoxelRenderer.setCloud: гашение солнца (×1−0.6k), облачный тинт
ambient/фона через cloudDim (обесцвечивание + затемнение), встроен
в setNight (lastNightTint пересчитывается)
- agent-lib: startDevServer показывает stderr vite при падении
Игра: погода по областям (AREA_WEATHER) + ручной режим дев-панели,
переживает смену области; setAsh(false) глушит погоду (гейт-режим);
в тике погода анимирует даже при открытой панели. Мост: weatherInfo,
setWeather (merge/сброс), devSetWeather. Дев-панель: слайдеры
облачность/дождь/снег/ветер/направление, счётчики капель и снежинок.
Гейт tools/checks/weather.mjs — 14 проверок (базы областей, ливень/
снег падают, облачность темнит, панель, глушение). 343 теста ✓.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
20 hours ago
|
Свет частиц: точечные источники и фонарик подсвечивают слои частиц
...
- Движок: общий блок юниформ света на рендере (packParticleLights,
setParticleLights), шарится ссылками между слоями; шейдерный вклад
ламп/конуса умножается на цвет частицы, ×2 на согласование с GAIN-пулами.
- Игра: GameLighting отдаёт снапшот источников + конус фонарика каждый тик;
снапшот моста — lightingInfo.particleLights.
- Гейт atmosphere +2 (день 0 / ночь = источникам), 332 теста.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
21 hours ago
|
Озёра утоплены, деревья крупнее, манекен 8×12×4, теневой фрустум по кадру, частицы в системе освещения
...
- Вода: яма y=1 пуст / вода y=0; непроходимость — physicsWorld
(невидимый коллайдер над ямами); декор на воде не штампуется.
- Деревья: стволы 25-38, кроны 17-24, чанк 64.
- Манекен 8×12×4 (134 вокс, 19 тайлей — детализация на текстурах),
снаряжение пропорционально меньше (рюкзак 40 / факел 4 / фонарик 16).
- Тени: динамический фрустум в setSun (visible·aspect + высота кастера),
mapSize 2048 — граница включения теней больше не видна.
- Частицы: uTint в ParticleLayer, ночной тинт PARTICLE_NIGHT,
размеры уменьшены (пепел/листья/пыль/дымка/мотыльки).
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
21 hours ago
|
Тьма за краем карты, деревья крупнее, солнце едет по часам, фонарик героя
...
- Бездна: неосвещаемая плоскость под миром — за границей области тьма
в любое время суток.
- mapTreeModel: сетка 12×12, стволы 22–36, крона до r≈5; высота чанка
мира 52→64 (дерево до 53 не влезало).
- Солнце: движок умел setSun(k), но игра не вызывала — тени стояли на
полудне. GameLighting зовёт setSun((часы−6)/12) каждый тик; снапшот
моста — sunK. Гейт детерминизма областей пинит часы перед кадрами
(солнце едет каждую игровую минуту — кадры в разные минуты различны).
- Фонарик: движок addSpotLight (SpotLightHandle setTarget) +
flashlightModel (2×2×5); игра — крепление в левой руке (armL,
зеркально факелу), конус по hero.yaw ночью/в темноте, снапшот
flashlight.on/intensity; gear по умолчанию 110 вокс.
- Доки v2/CLAUDE.md: трек 34 + генераторы/прожектор.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Eugene Sukhodolskiy
committed
22 hours ago
|
| 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
1 day ago
|

Трек 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
1 day ago
|