aboutsummaryrefslogtreecommitdiff
path: root/docs/reference/render-frame.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/reference/render-frame.md')
-rw-r--r--docs/reference/render-frame.md52
1 files changed, 52 insertions, 0 deletions
diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md
index 3085731..10de209 100644
--- a/docs/reference/render-frame.md
+++ b/docs/reference/render-frame.md
@@ -68,6 +68,23 @@ Pending frame хранит пакет MAT0 для мира и, при налич
`batch` `0x108`. Такой диапазон при включённой проверке глубины не записывает
глубину. За фиксированными диапазонами окружения сохраняются их явные состояния.
+Для MSH без потока цветов type 16 диапазон, цвет которого вычисляет CPU, при
+raw-флаге `Batch20` `0x0008` получает переопределение alpha только в одном
+подтверждённом случае. В GOG `Terrain.dll` с SHA-256
+`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead` проверка
+по RVA `0x1B0F0` задаёт alpha `0`, когда установлен bit `0x0040` и сброшен
+`0x0010`; поэтому для `0x0148` alpha равна нулю. Для `0x0108` и `0x0118`
+превью сохраняет alpha MAT0; для `0x0058` действует приоритет bit `0x0010`,
+также оставляя alpha MAT0. При наличии type 16 или отсутствии `0x0008`
+переопределения нет. Оно относится к одному draw range и не меняет общий
+материал; alpha `0` временно задаёт число индексов `0`, а при очистке
+переопределения исходное число индексов восстанавливается.
+
+Общий fade по расстоянию пока не реализован. Открыты точная метрика расстояния,
+выбор первого CPU-принятого треугольника диапазона и эквивалентность frustum- и
+culling-отбору оригинала. Поэтому состояния `0x0108` и `0x0118` оставляют alpha
+MAT0, пока эти входные данные не установлены.
+
В превью с фиксированной камерой диапазоны туманности и звёзд, купола и облаков
явно помечаются как прозрачный фон. Непрозрачные диапазоны мира остаются на
своих местах; прозрачная очередь мира сортируется от дальних элементов к
@@ -181,6 +198,41 @@ fn vertical_fov(self, aspect: f32) -> f32 {
(`forward · direction <= 1e-4`). Лучи в передней полусфере могут проецироваться
за край viewport; владелец спрайта отдельно решает, нужно ли его рисовать.
+После движения свободная камера ограничивает X и Y прямоугольником
+поверхностей карты, затем поднимается над найденным рельефом на заданный
+зазор. Границы берутся из корня пространственного индекса `TerrainWorld`,
+поэтому неиспользуемые вершины файла их не расширяют и повторного обхода
+геометрии в каждом кадре нет:
+
+```rust
+position[axis] = position[axis].clamp(min[axis], max[axis]); // axis = 0, 1
+position[2] = position[2].max(ground_height + ground_clearance);
+```
+
+Для каждого отрисовываемого корневого объекта класса `FORT` и каждого его
+отрисовываемого компонента интерактивный путь создаёт отдельную запись проверки.
+Она использует те же текущие позы узлов и преобразования присоединённых
+компонентов, что и геометрия кадра. После ограничения целевой позиции по
+TerrainWorld камера проверяет непрерывный отрезок от прежней позиции до цели.
+Если после нативных MSH-фильтров остаётся пересечение, позиция возвращается к
+началу шага, а рассчитанный из ввода новый поворот сохраняется. Маски batch и
+type-7, а также продолжение отрезка по helper-link описаны в
+[разделе MSH о сегментном запросе](msh.md#type-7-и-сегментный-запрос).
+
+Повторная отправка того же ожидающего кадра, например после изменения размера
+области отображения, использует уже подготовленное состояние и не применяет
+движение второй раз. `--legacy-camera-capture` сохраняет положение захваченной
+камеры без изменений и не запускает проверку зданий. Это диагностическое
+ограничение, а не восстановленное правило игровой или следящей камеры
+оригинала. В проверке начальная поза берётся из декодированных связей CTLD;
+проход двери отдельно проверяется после явной выборки записанного в MSH кадра 1
+только для Node3. Так проверяется вход запроса столкновения и путь камеры;
+видимая дверь не анимируется, а миссионные команды не воспроизводятся.
+
+Высота полёта сверху не ограничена. Это ограничение диагностической камеры
+превью; точные правила игровых и следящих камер оригинала остаются
+неподтверждёнными.
+
## Ограничения точного совпадения
`VulkanStaticCamera::from_legacy_d3d7` выполняет восстановление вида и проекции