diff options
| author | Valentin Popov <valentin@popov.link> | 2026-11-01 05:12:44 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-11-01 05:12:44 +0300 |
| commit | 05572c7bf446572264d2cf97c531be6c3bfaaf30 (patch) | |
| tree | 9aa68d9c49fe525f4e632b960653cc0082936e95 /docs | |
| parent | dfa2db65cc7b052d91c30ce179df8bc07af0cb1b (diff) | |
| download | fparkan-05572c7bf446572264d2cf97c531be6c3bfaaf30.tar.xz fparkan-05572c7bf446572264d2cf97c531be6c3bfaaf30.zip | |
feat(render): animate water with native EMBM waves
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/appendices/knowledge-boundaries.md | 3 | ||||
| -rw-r--r-- | docs/tomes/05-render.md | 29 |
2 files changed, 28 insertions, 4 deletions
diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index a48bec5..1af4ad5 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -73,7 +73,8 @@ MSH-запрос со свободной preview-камерой; это не пÐ среде, перехватить DirectDraw/Direct3D calls и surface flips, сохранить state log на минимальных сценах с одним типом материала. -Горизонтальные грани Land.msh с флагом `0x20000` используют плоское Vulkan-отражение; shifted-камера, волны и native EMBM combiner остаются заглушкой `planar_reflection_embm_unsupported`. +Горизонтальные грани Land.msh с флагом `0x20000` используют Vulkan-отражение и исходную карту волн Du/Dv; перенос её смещений в обычное зеркало приближённый: `planar_reflection_shifted_camera_unsupported`. +Raw queue clock задаёт фазу волн отдельно от времени суток и sky elapsed; старые захваты без него считаются в `captured_water_phase_unverified`. Один target отражает ближайшую активную высоту воды; остальные высоты и неплоские грани считаются в `planar_reflection_other_planes_unsupported` и `planar_reflection_nonplanar_unsupported` и сохраняют обычный terrain shader. `terrain_face8_pipeline_unverified` теперь считает только исходные грани с `0x8` без `0x20000`; сама семантика оставшихся специальных проходов ещё не установлена. 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 обслуживает ближайшую активную высоту воды; другие высоты и негоризонтальные поверхности явно считаются как неподдержанные. Это промежуточный водный проход, а не полная приёмка воды или лавы. |
