aboutsummaryrefslogtreecommitdiff
path: root/docs/reference/atmosphere.md
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-10-31 23:26:45 +0300
committerValentin Popov <valentin@popov.link>2026-10-31 23:26:45 +0300
commit8fab4b44b8241ffc6450780c6590908f4406f4da (patch)
treee50d187c1aeb231599c98dc1a827295b943dc706 /docs/reference/atmosphere.md
parentd7c18d4c1ab576e4329a85b4729403fef3c09183 (diff)
downloadfparkan-8fab4b44b8241ffc6450780c6590908f4406f4da.tar.xz
fparkan-8fab4b44b8241ffc6450780c6590908f4406f4da.zip
fix(render): animate sky layers on the native UV clock
Diffstat (limited to 'docs/reference/atmosphere.md')
-rw-r--r--docs/reference/atmosphere.md25
1 files changed, 25 insertions, 0 deletions
diff --git a/docs/reference/atmosphere.md b/docs/reference/atmosphere.md
index 8d44e4e..dba20c2 100644
--- a/docs/reference/atmosphere.md
+++ b/docs/reference/atmosphere.md
@@ -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, выбирает сектор