From e9e01eee9f8fada69ad1461aaba46df2acd3e6d9 Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Sat, 31 Oct 2026 01:24:21 +0400 Subject: feat(app): constrain free-flight movement by building meshes --- docs/appendices/knowledge-boundaries.md | 36 ++++++++++++++++++++++----------- docs/reference/msh.md | 33 +++++++++++++++++++++--------- docs/reference/render-frame.md | 24 ++++++++++++++++++++-- docs/tomes/05-render.md | 14 ++++++++++++- 4 files changed, 83 insertions(+), 24 deletions(-) (limited to 'docs') diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index bc8e999..29c9480 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -10,9 +10,13 @@ authoring API без динамического подтверждения. Не доказаны символами точные имена renderer vtable slots, полный набор CShade state transitions и окончательный порядок части transparent/FX/shadow subpasses. -Свободная камера превью удерживается в XY-границах поверхностей карты и над -рельефом. Она пока не проверяет стены и проёмы строений; эти ограничения не -подтверждают поведение стратегической камеры или камеры робота оригинала. +После ограничения цели рельефом интерактивная камера проверяет движение +против каждого отрисовываемого корневого строения класса `FORT` и его +отрисовываемых компонентов. Для этого пути используются текущая Node38-поза +компонента и его преобразование присоединения. При попадании камера сохраняет +прежнюю позицию, но оставляет новый поворот. Так приложение связывает мировой +MSH-запрос со свободной preview-камерой; это не подтверждает алгоритм +стратегической или следящей камеры оригинала. Локальный MSH-запрос `query_slot_segment` сверён с оригиналом на фабричной стене и дверном проёме. Runtime-адаптер `query_building_segment_world` теперь @@ -22,15 +26,23 @@ state transitions и окончательный порядок части transp тесты покрывают связи, отсутствие геометрии у промежуточного узла, маски, равные попадания и предел в 200 пересечений. -Игнорируемый тест на AutoDemo загружает настоящий объект PLANT 4 и подтверждает, -что сегмент пересекает геометрию Node3 в исходной закрытой позе, но не -пересекает её в открытой позе Node3 на frame `1`. В загруженных -Control-привязках корня PLANT нет tag-21 записи для этого перехода. Тест задаёт -frame `1` напрямую и не исполняет команду открытия из миссии. - -Открыты выбор первого корня и состава узлов/слотов нативного мирового запроса, -полный обход текущих runtime-поз и component bindings, подключение адаптера к -свободной камере и сравнение итогового результата мирового запроса с оригиналом +Игнорируемый тест приложения загружает настоящий PLANT 4 из AutoDemo и его +исходную CTLD-привязку Node3 (`frame_a = 0`, `frame_b = 1`, blend `0`). В +контроллере корневого PLANT нет записей tag-21 для открытия двери. В исходной +закрытой позе камера блокируется о дверь через обычный путь обновления +приложения. Для второго запроса тест вручную задаёт время `1` только Node3, +обновляет иерархию позы компонента и преобразование присоединения, затем +проверяет, что камера проходит через проём. Это подтверждает только подачу +выбранных поз в коллизию приложения: тест не запускает событие открытия, не +доказывает видимое открытие двери и не сравнивает полный игровой цикл с +оригиналом. + +Открыты выбор первого корня и правила состава узлов/slot-ов оригинального +мирового запроса, сравнение полного обхода с оригиналом, а также связь с +игровыми позами и событиями. Текущий путь приложения использует все +отрисовываемые компоненты строений `FORT`, но их выбор ещё не сопоставлен с +поведением оригинала для первого корня и всего мира. Совпадение со +стратегической и следящей камерами не подтверждено ([MSH](../reference/msh.md)). Для MSH без потока цветов type 16 подтверждён только один постоянный alpha diff --git a/docs/reference/msh.md b/docs/reference/msh.md index 945bdc4..0a8a2cb 100644 --- a/docs/reference/msh.md +++ b/docs/reference/msh.md @@ -236,15 +236,30 @@ distance² = dot(hit_world - original_start, hit_world - original_start) `af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead` (RVA `0x35430`, `0x35961`) и `AniMesh.dll` SHA-256 `65659bf67f20e5be77d67a5b2f59968f61b94293143807fa59ca451c560c4f7e` (RVA -`0x134D0`, `0x10A50`). Игнорируемый тест загружает настоящий объект PLANT 4 -миссии AutoDemo и проверяет, что сегмент пересекает геометрию Node3 в исходной -закрытой позе, но проходит без попадания при явно заданной открытой позе frame -`1`. Это проверка запроса для двух поз, а не открытие двери игровой командой. -В загруженных Control-привязках корня PLANT нет tag-21 записи для перехода -Node3; тест задаёт frame `1` напрямую и не исполняет команду открытия из -миссии. -Нативный выбор первого корня и полный мировой обход ещё не сопоставлены с Rust; -app пока не передаёт этой функции живые runtime-позы и bindings. +`0x134D0`, `0x10A50`). + +Игнорируемый тест загружает настоящий объект PLANT 4 миссии +AutoDemo и использует его исходную CTLD-привязку Node3: `frame_a = 0`, +`frame_b = 1`, начальное смешивание `0`. В контроллере корневого PLANT нет +записей tag-21. В +закрытой начальной позе запрос, вызванный через обновление камеры приложения, +останавливает движение. Затем тест вручную задаёт время `1` только для +Node3, пересчитывает pose и преобразование присоединения и повторяет тот же +путь обновления камеры; отрезок проходит через проём. Это проверяет подачу +двух заданных в MSH поз в коллизию приложения, а не открытие двери событием +миссии и не её видимое обновление в игровой сцене. + +Интерактивный preview создаёт отдельную запись для каждого отрисовываемого +корневого строения класса `FORT` и его отрисовываемых компонентов. На каждом +движении камера получает текущую Node38-иерархию компонента и его актуальное +преобразование присоединения, переводит выбранные узлы и slot-ы в мировой +запрос и выполняет его после ограничения цели рельефом. Попадание сохраняет +прежнюю позицию камеры, но не отменяет новый поворот; повтор ожидающего кадра +не применяет шаг движения второй раз. Так приложение связывает мировой +MSH-запрос с движением свободной preview-камеры. Выбор первого корня и полный +состав мирового списка ещё не сверены с оригиналом; игровые источники поз и +событий, а также поведение стратегической и следящей камеры остаются +открытыми. ## Сторона грани в цветовом проходе diff --git a/docs/reference/render-frame.md b/docs/reference/render-frame.md index 3269c67..10de209 100644 --- a/docs/reference/render-frame.md +++ b/docs/reference/render-frame.md @@ -209,9 +209,29 @@ 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. Так проверяется вход запроса столкновения и путь камеры; +видимая дверь не анимируется, а миссионные команды не воспроизводятся. + Высота полёта сверху не ограничена. Это ограничение диагностической камеры -превью; столкновения со стенами зданий и точные правила игровых камер оригинала -остаются отдельными задачами. +превью; точные правила игровых и следящих камер оригинала остаются +неподтверждёнными. ## Ограничения точного совпадения diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md index 84de6ee..ef7dc52 100644 --- a/docs/tomes/05-render.md +++ b/docs/tomes/05-render.md @@ -1045,7 +1045,19 @@ swapchain, тот же sample времени и состояние мира от Счётчик и replay clock продвигаются только после результата `Presented`. После шага движения камера проверяет высоту `TerrainWorld`: над конечной поверхностью сохраняется начальный просвет, а вне -поверхности высота не ограничивается. Mission-local `sky.ske`/`sky.wea` выбирают +поверхности высота не ограничивается. + +Для каждого отрисовываемого строения (корневого объекта класса `FORT`) и для +каждого его отрисовываемого компонента создаётся отдельная запись проверки. Она +использует те же текущие матрицы узлов и присоединённых компонентов, что и +геометрия. +После ограничения целевой позиции по TerrainWorld камера проверяет непрерывный +отрезок от прежней позиции до цели; при пересечении она остаётся в прежней +позиции, сохраняя новый поворот. Повторная отправка ожидающего кадра не +применяет движение второй раз. Это ограничение диагностической свободной +камеры, а не правило игрового или следящего режима оригинала. + +Mission-local `sky.ske`/`sky.wea` выбирают атмосферное расписание и sky materials, `effects.rlb/env_lightning` даёт lightning visual; weather particles, flares, sun/moon, point lights, projected shadows и audio events обновляются вместе с камерой и временем. -- cgit v1.2.3