aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/appendices/knowledge-boundaries.md5
-rw-r--r--docs/reference/environment-effects.md9
-rw-r--r--docs/reference/render-frame.md27
-rw-r--r--docs/tomes/05-render.md17
4 files changed, 55 insertions, 3 deletions
diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md
index 7b71e9e..a60fa68 100644
--- a/docs/appendices/knowledge-boundaries.md
+++ b/docs/appendices/knowledge-boundaries.md
@@ -76,7 +76,7 @@ MSH-запрос со свободной preview-камерой; это не пÐ
среде, перехватить DirectDraw/Direct3D calls и surface flips, сохранить state
log на минимальных сценах с одним типом материала.
-Горизонтальные грани Land.msh с флагом `0x20000` используют исходную карту Du/Dv и окно shifted-камеры, проверенное исполнением Terrain.dll. Диапазон глубины, небо/туман/FX основного вида и размер target остаются приближениями: `planar_reflection_render_context_approx`; неперспективная камера API использует обычное зеркало.
+Горизонтальные грани Land.msh с флагом `0x20000` используют исходную карту Du/Dv, окно shifted-камеры и квадратный размер текстуры, проверенные исполнением DLL. Диапазон глубины, небо/туман/FX основного вида и соответствие размеров при обрезанном capture остаются приближениями: `planar_reflection_render_context_approx`; неперспективная камера API использует обычное зеркало.
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`; сама семантика оставшихся специальных проходов ещё не установлена.
@@ -90,6 +90,9 @@ Control Op1 пока использует цвет и радиус без слу
Control Op2 воспроизводит modes 0/2; modes 1/3, body+76 и неподдержанные
time modes/привязки считаются как `render_coverage control_op2_unsupported`.
Управление фазой экземпляра командами Control остаётся до его подключения в runtime.
+При расширении выбранных начальных строк все пропущенные команды считаются
+в `control_fx_unsupported`, а time modes 4–17 — в `control_fx_requires_game_state`;
+причина и владелец выводятся в лог. Неразобранные FXID считаются отдельно в `control_fx_invalid_documents`.
Размеры команд, resource references, lifecycle, flags families и используемые
time modes известны. Не закрыто значение каждого поля body opcodes 1--10,
diff --git a/docs/reference/environment-effects.md b/docs/reference/environment-effects.md
index f3ecfb4..677c159 100644
--- a/docs/reference/environment-effects.md
+++ b/docs/reference/environment-effects.md
@@ -420,6 +420,15 @@ FX-команды используют общий preview clock и ограниÑ
mode 0 оставляет фазу равной нулю, mode 1 вычисляет `elapsed / duration` без
зажатия, mode 2 повторяет цикл. Header flags `0x200` и `0x20` преобразуют эту
фазу; command path `0x8120` зажимает результат только после преобразований.
+В [эталонной Effect.dll](original-binaries.md) RVA `0x5C60` режимы 4–17
+читают состояние владельца или провайдера; режим 14 тоже входит в эту группу.
+Пропуски при расширении выбранных начальных Control-строк учитываются по
+командам: `control_fx_requires_game_state` для этих режимов и
+`control_fx_unsupported` для остальных непреобразованных команд. Диагностика
+сохраняет причину, ресурс, объект, компонент, строку и номер команды.
+`control_fx_invalid_documents` отдельно считает неразобранные FXID, где число
+команд неизвестно. Счётчики суммируются по компонентам миссии; они не заменяют
+учёт ещё не выбранных Control-групп и условных строк в фазе G.
Effect renderer проверяет header bit `0x800` только при
render selector 0; native AniMesh component path был захвачен с selector 1,
поэтому preview использует selector 1 и не подавляет такие visual commands.
diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md
index df3f248..7adc4e6 100644
--- a/docs/reference/render-frame.md
+++ b/docs/reference/render-frame.md
@@ -6,6 +6,11 @@
## Порядок кадра
+Сам рельеф образует полноценную графическую сцену: список размещённых объектов
+может быть пустым. Наличие MSH-компонентов объектов не является условием
+отрисовки карты. Проверочные TMA без объектов позволяют отдельно загружать
+карты ресурсов, для которых в установленной игре нет штатной миссии.
+
```text
системные сообщения и ввод
-> расчёт симуляции
@@ -213,6 +218,22 @@ RVA `0x4EBE0` использует соглашение о вызовах `__std
`REFLECTION_SHIFTED`. Это свидетельство ABI фабрики, а не восстановленный
контракт матрицы вида или проекции.
+## Представление готового кадра
+
+Vulkan сохраняет явно выбранный режим, если поверхность его поддерживает.
+Приложение предпочитает MAILBOX: готовый новый кадр заменяет ожидающий,
+а показ остаётся привязан к развёртке. При отсутствии MAILBOX выбирается
+IMMEDIATE, затем FIFO. IMMEDIATE допускает разрывы изображения, зато не
+навязывает ожидание вертикальной развёртки; FIFO остаётся запасным режимом.
+Семантика режимов описана в [спецификации Vulkan](https://docs.vulkan.org/refpages/latest/refpages/source/VkPresentModeKHR.html).
+
+Оконная ветка GOG Ngi32.dll (SHA-256 из [таблицы модулей](original-binaries.md))
+по RVA `0x6E1B` вызывает `IDirectDrawSurface7::Blt` с `DDBLT_WAIT`.
+Эта ветка наблюдалась при нативных захватах. Флаг ждёт готовности блиттера,
+а не задаёт интервал развёртки — см. [описание Microsoft](https://learn.microsoft.com/en-us/windows/win32/api/ddraw/nf-ddraw-idirectdrawsurface7-blt).
+Современный композитор и драйвер всё равно могут влиять на фактический показ;
+это правило выбора API, а не гарантия одинаковой задержки двух движков.
+
## Предпросмотр по захвату камеры D3D7
`fparkan-game --legacy-camera-capture <json>` принимает матрицу камеры
@@ -348,3 +369,9 @@ D3D7 в `fparkan-render`, а затем один раз меняет знак в
каналов не определяет. Последовательность не содержит структурированных ID
видимых объектов, списка элементов отрисовки, ключей конвейера, матриц или
хэшей промежуточных буферов.
+
+При преобразовании кадра в PNG сохраняется исходный RGB, а прозрачность
+выключается: окно показывает готовое непрозрачное изображение. Альфа-канал
+GPU может содержать результат смешивания поверхностей; повторное применение
+его к готовому цвету затемнило бы кадр ещё раз. Поэтому конвертер и сборщик
+сравнительных пар игнорируют эту альфу, а raw-файл сохраняют без изменений.
diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md
index 53667c8..4aba919 100644
--- a/docs/tomes/05-render.md
+++ b/docs/tomes/05-render.md
@@ -1169,6 +1169,18 @@ Rust-тест отдельно проверяет углы водоёма и гÑ
водоёма с добавленным смещением волн. Для неперспективной камеры API остаётся
обычное зеркало с экранными координатами.
+Размер изображения отражения выбирается отдельно от размера основного кадра.
+Terrain.dll в конструкторе CShade (RVA `0x278E0`, цикл с `0x27FC7`) берёт
+ширину и высоту renderer через Ngi32.dll RVA `0x7FB0`. Сторона квадратной
+текстуры — наибольшая степень двойки, не превосходящая меньшую из этих
+величин и 1024; нижний предел равен 2. Например, экран 1280×1024 даёт
+отражение 1024×1024, а 1280×720 — 512×512. Getter размеров и исходный цикл
+выбора проверены исполнением DLL на десяти входах; создание нативной текстуры
+в этом оракуле пропущено. Vulkan создаёт цвет и глубину с этой стороной и
+задаёт каждому проходу собственные viewport и область очистки. Так уменьшение
+отражения не обрезает основной кадр и воспроизводит исходный масштаб его
+пикселей, от которого зависит чёткость берегов и ряби.
+
Цветовой target переходит из attachment layout в shader-read layout после
записи. Следующий зеркальный проход ждёт предыдущего чтения этой текстуры;
основной и отражённый виды используют разные слоты uniform buffer. Во время
@@ -1196,9 +1208,10 @@ Rust-тест отдельно проверяет углы водоёма и гÑ
В Vulkan карта хранится в двух каналах несжатой текстуры и возвращается к
знаковым значениям перед вычислением смещения.
-Матрица положения камеры, её окно и координаты волн восстановлены, но весь
+Матрица положения камеры, её окно, размер текстуры и координаты волн восстановлены, но весь
контекст отражённого вида ещё не повторён. Диапазон глубины, небо, туман и FX
-заимствуются из основного вида, а размер target совпадает со swapchain.
+заимствуются из основного вида. Для захвата с обрезанным viewport ещё не
+подтверждено соответствие размера окна FParkan полному renderer оригинала.
Эти ограничения учитываются в `planar_reflection_render_context_approx`;
совпадение генератора волн и окна не доказывает совпадения итогового отражения.
Один target обслуживает ближайшую