aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes
diff options
context:
space:
mode:
Diffstat (limited to 'docs/tomes')
-rw-r--r--docs/tomes/05-render.md65
1 files changed, 53 insertions, 12 deletions
diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md
index 53667c8..8c059f2 100644
--- a/docs/tomes/05-render.md
+++ b/docs/tomes/05-render.md
@@ -510,8 +510,11 @@ Material manager кэширует разобранный MAT0 и texture handles
Для MSH без потока цветов type 16 правило включает флаг batch `0x0008`.
В обычной ветви при горизонтальном FOV `1.3` поверхность прозрачна до расстояния
75 и непрозрачна после 95; между ними alpha растёт линейно. При другом FOV обе
-границы умножаются на `1.3 / FOV`. Расстояние берётся до первой вершины первого
-принятого треугольника, а не до центра здания.
+границы умножаются на `1.3 / FOV`. Расстояние берётся до первой индексированной
+вершины входного пакета, а не до центра здания. Эта точка может находиться за
+экраном: видимая часть окна всё равно сохраняет её прозрачность. Если при повороте
+камеры выбирать новую видимую точку, окно начнёт менять прозрачность без движения
+игрока.
Флаг `0x0010` выбирает другую кривую: сравнивается квадратный корень уже
вычисленного расстояния, границы равны `2.6 / FOV` и `7.7999997 / FOV`.
@@ -521,8 +524,9 @@ Material manager кэширует разобранный MAT0 и texture handles
FParkan пересчитывает эту alpha при каждом обновлении камеры, после анимации
модели. Нулевое значение временно выключает диапазон индексов; при удалении
-камеры диапазон восстанавливается. Подробности оригинального вычисления и
-пока приближённого выбора вершины приведены в [описании кадра](../reference/render-frame.md#прозрачность-порталов-msh).
+камеры диапазон восстанавливается. Расстояние использует тот же приближённый
+обратный корень, что и оригинал: округление влияет на записанную alpha.
+Подробности вычисления приведены в [описании кадра](../reference/render-frame.md#прозрачность-порталов-msh).
## Texm: текстуры, mip-уровни и атласы
@@ -736,6 +740,19 @@ struct FxHeader60 {
локальную точку опоры, scale -- базовый масштаб экземпляра. Unknown flags и
settings ID сохраняются.
+У каждого экземпляра эффекта есть своё начало отсчёта. Например, эффект
+длительностью четыре секунды, созданный на 135-й секунде, на 137-й находится
+в середине цикла: `(137 − 135) / 4 = 0,5`. Режим может идти вперёд,
+повторяться, идти назад или сохранять постоянную фазу. Вызывающий код может
+сменить режим экземпляра, не меняя документ. Запрос перезапуска ждёт конца
+текущего цикла и начинает новый при следующем обновлении.
+
+Эти правила реализованы в `fparkan-fx::clock`. Приложение передаёт одну фазу
+геометрии, свету и звуку одной Control-строки; повторная отправка кадра не
+пересчитывает её и не расходует случайные числа повторно. В статической сцене
+все экземпляры пока рождаются в момент ноль. Управляющие команды Control и
+очередь обновления с шагом 50 миллисекунд остаются задачами игрового цикла.
+
Каждая команда начинается с `uint32_t command_word`:
```text
@@ -837,14 +854,24 @@ emit не должен повторно менять игровое состоя
gate. Type 4 point list задаёт локальную матрицу; текущие MSH owner и mounted
node poses входят в transform до локальной FX basis. Реализованные visuals
охватывают Op3 modes 0–2, Op4, Op7/8 particle pools и Op9 generated mesh. Op1
-selector 1 добавляет point lights без native flag `0x80000000` в общий diffuse
-список; остальные active records сохраняют flags для специальных путей и
-projected shadows. Радиус источника масштабируется длиной его преобразованного
+selector 1 добавляет point lights в освещение. Native flag `0x80000000`
+ограничивает источник собственным объектом: такая лампа освещает завод, но
+не рельеф вокруг него. Это не запрет на обычный расчёт света. Потеря локального
+жёлтого источника над трубой делала крышу завода заметно холоднее оригинала.
+Renderer сопоставляет владельца лампы и диапазона MSH; общие источники
+доступны всем поверхностям. Исходные flags сохраняются также для projected
+shadows. Радиус источника масштабируется длиной его преобразованного
направления до нормализации. Например, локальный радиус 7 при масштабе узла
около 4,85 освещает область радиусом около 34. Потеря этого множителя оставляла
синий свет завода почти незаметным. Неположительный итог заменяется на 0,01.
-Случайные добавки к цвету и радиусу пока явно считаются в
-`render_coverage control_op1_jitter_unsupported`.
+К плавным кривым добавляется мерцание: каждый канал RGBA и радиус получают
+случайную поправку от минус половины авторской амплитуды до плюс половины.
+Она не накапливается, а заново прибавляется к текущей кривой. Два потока
+случайных чисел сохраняются между обновлениями сцены; даже погасший на время
+свет расходует их. Повторная отправка кадра не меняет уже выбранный свет.
+Формула и порядок выборок внутри команды сверены с исполнением оригинала.
+Начальные значения просмотра и общий порядок вызовов других FX пока
+приблизительные и считаются в `render_coverage control_op1_rng_schedule_approx`.
Эффект может одновременно рисовать поверхность и издавать звук. Для Op2
приложение создаёт отдельный звуковой источник у каждого экземпляра команды:
@@ -863,7 +890,8 @@ Effect renderer подавляет header bit `0x800` только при
render selector 0. Native AniMesh component path захвачен с selector 1, а в
его 53-entry manager присутствуют FX entries с header `0xD00`; preview
использует selector 1 и пропускает такие visual commands. Изменения manager
-`A8`, которые задают runtime phase/header gate, пока не моделируются. Header
+`A8`, которые задают runtime phase/header gate, пока заменены нулём с явным
+счётчиком `control_fx_manager_flag_stub`. Header
bit `0x10` относится к activation lifecycle и не выключает draw.
Для visual effect renderer использует MAT0, указанный самой командой. Его
@@ -1169,6 +1197,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 +1236,10 @@ Rust-тест отдельно проверяет углы водоёма и гÑ
В Vulkan карта хранится в двух каналах несжатой текстуры и возвращается к
знаковым значениям перед вычислением смещения.
-Матрица положения камеры, её окно и координаты волн восстановлены, но весь
+Матрица положения камеры, её окно, размер текстуры и координаты волн восстановлены, но весь
контекст отражённого вида ещё не повторён. Диапазон глубины, небо, туман и FX
-заимствуются из основного вида, а размер target совпадает со swapchain.
+заимствуются из основного вида. Для захвата с обрезанным viewport ещё не
+подтверждено соответствие размера окна FParkan полному renderer оригинала.
Эти ограничения учитываются в `planar_reflection_render_context_approx`;
совпадение генератора волн и окна не доказывает совпадения итогового отражения.
Один target обслуживает ближайшую