aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes/05-render.md
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-11-01 05:12:44 +0300
committerValentin Popov <valentin@popov.link>2026-11-01 05:12:44 +0300
commit05572c7bf446572264d2cf97c531be6c3bfaaf30 (patch)
tree9aa68d9c49fe525f4e632b960653cc0082936e95 /docs/tomes/05-render.md
parentdfa2db65cc7b052d91c30ce179df8bc07af0cb1b (diff)
downloadfparkan-05572c7bf446572264d2cf97c531be6c3bfaaf30.tar.xz
fparkan-05572c7bf446572264d2cf97c531be6c3bfaaf30.zip
feat(render): animate water with native EMBM waves
Diffstat (limited to 'docs/tomes/05-render.md')
-rw-r--r--docs/tomes/05-render.md29
1 files changed, 26 insertions, 3 deletions
diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md
index e374ef0..a7a1396 100644
--- a/docs/tomes/05-render.md
+++ b/docs/tomes/05-render.md
@@ -1161,9 +1161,32 @@ lightmap state передаются в `VulkanStaticMaterial`, а shader посÐ
записи отражения привязан отдельный нейтральный descriptor, чтобы проход
не читал собственное вложение.
-Такое зеркало ещё не повторяет shifted-камеру и EMBM оригинала: искажение
-отражения волнами пока отсутствует и учитывается в
-`planar_reflection_embm_unsupported`. Один target обслуживает ближайшую
+Волны не требуют готовой текстуры из ресурсов: Terrain.dll RVA `0x2BF50`
+создаёт карту 128×128 со знаковыми парами Du/Dv. Для нормированных координат
+текселя `x` и `y` угол равен `(x + y − 1) × 12,566360473632812`, а компоненты —
+округлённые `64 cos(угол)` и `64 sin(угол)`. Все 32 768 байт Rust-генератора
+сверены с исполнением этой функции DLL при игровом x87 CW `0x007F`.
+
+Рябь привязана к водоёму, поэтому не плывёт вслед за экраном. Конструктор
+ландшафта собирает прямоугольник всех отражающих граней; U меняется против
+мировой Y, V — против X. Эти координаты повторяются сто раз, к обеим прибавляется
+`(queue_clock % 10000) / 10000`. Это самостоятельный clock: время суток и
+относительный clock неба не задают фазу волн. Захват хранит исходный
+`sky_uv_clock.raw_clock`; ограниченный replay фиксирует его, интерактивный
+продолжает с этого значения. Старые захваты без raw clock явно считаются в
+`captured_water_phase_unverified`.
+
+Карта Du/Dv смещает координаты следующей текстуры с диагональными коэффициентами
+`0,01`, без изменения яркости. Это правило
+[Direct3D BUMPENVMAP](https://learn.microsoft.com/en-us/windows/win32/direct3d9/bump-mapping-formulas).
+В Vulkan карта хранится в двух каналах несжатой текстуры и возвращается к
+знаковым значениям перед вычислением смещения.
+
+Обычное зеркало ещё не повторяет shifted-камеру оригинала: смещения Du/Dv
+сейчас переводятся из координат водоёма в текущую зеркальную проекцию.
+Это приближение учитывается в `planar_reflection_shifted_camera_unsupported`;
+совпадение генератора волн не доказывает совпадения итогового отражения.
+Один target обслуживает ближайшую
активную высоту воды; другие высоты и негоризонтальные поверхности явно
считаются как неподдержанные. Это промежуточный водный проход, а не полная
приёмка воды или лавы.