fix(render): animate sky layers on the native UV clock
Docs Deploy / Build and Deploy MkDocs (push) Successful in 37s

This commit is contained in:
Valentin Popov committed 2026-11-01 00:26:45 +04:00
1 parent d7c18d4c1a
commit 8fab4b44b8
8 files changed
+285 -13

No files matched your search

+25
View File
@@ -149,6 +149,31 @@ gradient и clouds row 2. Для nebula/stars/clouds используются UV
directional RGB из `sky.packed[0]`. Это четыре фиксированных pass, а не три
независимых цветных слоя.
Все три текстурных слоя движутся. Обновление GOG `CSky`
(`Terrain.dll`, RVA `0x48B90`, запись UV `0x4942A–0x495B7`;
[сборка и SHA-256](original-binaries.md)) берёт разность текущего `u32` clock
и сохранённого поля объекта `+8` с переполнением. Это отдельные миллисекунды
жизни неба, а не абсолютная фаза суток из SKE.
| Слой | Период | Добавка к исходным UV |
|---|---:|---|
| Фон | 300 000 мс | одинаковый сдвиг U и V |
| Звёзды | 100 000 мс | одинаковый сдвиг U и V |
| Облака | 50 000 мс | сдвиг только U |
Добавка равна остатку от деления elapsed clock на период, умноженному на
нативный коэффициент `f32` (`3.3333333e-6`, `1e-5`, `2e-5`). Вершинные UV
каждый раз вычисляются от позиции купола заново; накопление приращений
создавало бы дрейф. `SkyMesh::update_uvs` получает текущие миллисекунды кадра
и сохраняет геометрию купола. В работающем оригинале проверены UV всех трёх
слоёв, включая разность clock с переполнением.
Захват сохраняет `sky_uv_clock` на входе в рендер неба, проверяя его по
фактическим UV вершины зенита и clock того же кадра. Replay удерживает эту
фазу вместе с фазой суток. Без такого поля текстуры движутся по elapsed clock
приложения; начальная фаза оригинала неизвестна и явно считается как
`captured_sky_phase_unverified`.
Цвет первого screen-gradient и последнего пояса вычисляет
`SkyFrame::screen_gradient(yaw_radians, glare_rgb_delta)`. Native `CSky` сначала
округляет `(yaw + pi) * 180 / pi` режимом nearest-even, выбирает сектор