feat(app): constrain free-flight movement by building meshes
Docs Deploy / Build and Deploy MkDocs (push) Successful in 35s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 35s
This commit is contained in:
6 files changed
+1202
-43
No files matched your search
@@ -28,6 +28,14 @@ cargo run --release -p fparkan-game -- `
|
|||||||
потере фокуса обзор отключается и нажатые клавиши сбрасываются. `Esc`
|
потере фокуса обзор отключается и нажатые клавиши сбрасываются. `Esc`
|
||||||
отпускает обзор или закрывает окно.
|
отпускает обзор или закрывает окно.
|
||||||
|
|
||||||
|
В интерактивном режиме каждое отрисовываемое строение (корневой объект класса
|
||||||
|
`FORT`) и его отрисовываемые компоненты участвуют в проверке движения с их
|
||||||
|
позами и преобразованиями присоединения. Камера проверяет непрерывный путь до
|
||||||
|
новой позиции после ограничения рельефом; при пересечении она остаётся на
|
||||||
|
прежней позиции, сохраняя новый поворот. Повторная отправка ожидающего кадра не
|
||||||
|
применяет шаг второй раз. Режим `--legacy-camera-capture` не использует
|
||||||
|
свободную камеру и сохраняет положение из захвата без изменений.
|
||||||
|
|
||||||
В каталоге миссии ищется `sky.ske`. Если файл найден, приложение читает её
|
В каталоге миссии ищется `sky.ske`. Если файл найден, приложение читает её
|
||||||
расписание и `sky.wea`; связанные MAT0/WEAR-материалы и
|
расписание и `sky.wea`; связанные MAT0/WEAR-материалы и
|
||||||
`effects.rlb/env_lightning` загружаются из ресурсов игры. Без `sky.ske`
|
`effects.rlb/env_lightning` загружаются из ресурсов игры. Без `sky.ske`
|
||||||
|
|||||||
+1112
-20
File diff suppressed because it is too large.
Load diff
@@ -10,9 +10,13 @@ authoring API без динамического подтверждения.
|
|||||||
Не доказаны символами точные имена renderer vtable slots, полный набор CShade
|
Не доказаны символами точные имена renderer vtable slots, полный набор CShade
|
||||||
state transitions и окончательный порядок части transparent/FX/shadow subpasses.
|
state transitions и окончательный порядок части transparent/FX/shadow subpasses.
|
||||||
|
|
||||||
Свободная камера превью удерживается в XY-границах поверхностей карты и над
|
После ограничения цели рельефом интерактивная камера проверяет движение
|
||||||
рельефом. Она пока не проверяет стены и проёмы строений; эти ограничения не
|
против каждого отрисовываемого корневого строения класса `FORT` и его
|
||||||
подтверждают поведение стратегической камеры или камеры робота оригинала.
|
отрисовываемых компонентов. Для этого пути используются текущая Node38-поза
|
||||||
|
компонента и его преобразование присоединения. При попадании камера сохраняет
|
||||||
|
прежнюю позицию, но оставляет новый поворот. Так приложение связывает мировой
|
||||||
|
MSH-запрос со свободной preview-камерой; это не подтверждает алгоритм
|
||||||
|
стратегической или следящей камеры оригинала.
|
||||||
|
|
||||||
Локальный MSH-запрос `query_slot_segment` сверён с оригиналом на фабричной
|
Локальный MSH-запрос `query_slot_segment` сверён с оригиналом на фабричной
|
||||||
стене и дверном проёме. Runtime-адаптер `query_building_segment_world` теперь
|
стене и дверном проёме. Runtime-адаптер `query_building_segment_world` теперь
|
||||||
@@ -22,15 +26,23 @@ state transitions и окончательный порядок части transp
|
|||||||
тесты покрывают связи, отсутствие геометрии у промежуточного узла, маски,
|
тесты покрывают связи, отсутствие геометрии у промежуточного узла, маски,
|
||||||
равные попадания и предел в 200 пересечений.
|
равные попадания и предел в 200 пересечений.
|
||||||
|
|
||||||
Игнорируемый тест на AutoDemo загружает настоящий объект PLANT 4 и подтверждает,
|
Игнорируемый тест приложения загружает настоящий PLANT 4 из AutoDemo и его
|
||||||
что сегмент пересекает геометрию Node3 в исходной закрытой позе, но не
|
исходную CTLD-привязку Node3 (`frame_a = 0`, `frame_b = 1`, blend `0`). В
|
||||||
пересекает её в открытой позе Node3 на frame `1`. В загруженных
|
контроллере корневого PLANT нет записей tag-21 для открытия двери. В исходной
|
||||||
Control-привязках корня PLANT нет tag-21 записи для этого перехода. Тест задаёт
|
закрытой позе камера блокируется о дверь через обычный путь обновления
|
||||||
frame `1` напрямую и не исполняет команду открытия из миссии.
|
приложения. Для второго запроса тест вручную задаёт время `1` только Node3,
|
||||||
|
обновляет иерархию позы компонента и преобразование присоединения, затем
|
||||||
|
проверяет, что камера проходит через проём. Это подтверждает только подачу
|
||||||
|
выбранных поз в коллизию приложения: тест не запускает событие открытия, не
|
||||||
|
доказывает видимое открытие двери и не сравнивает полный игровой цикл с
|
||||||
|
оригиналом.
|
||||||
|
|
||||||
Открыты выбор первого корня и состава узлов/слотов нативного мирового запроса,
|
Открыты выбор первого корня и правила состава узлов/slot-ов оригинального
|
||||||
полный обход текущих runtime-поз и component bindings, подключение адаптера к
|
мирового запроса, сравнение полного обхода с оригиналом, а также связь с
|
||||||
свободной камере и сравнение итогового результата мирового запроса с оригиналом
|
игровыми позами и событиями. Текущий путь приложения использует все
|
||||||
|
отрисовываемые компоненты строений `FORT`, но их выбор ещё не сопоставлен с
|
||||||
|
поведением оригинала для первого корня и всего мира. Совпадение со
|
||||||
|
стратегической и следящей камерами не подтверждено
|
||||||
([MSH](../reference/msh.md)).
|
([MSH](../reference/msh.md)).
|
||||||
|
|
||||||
Для MSH без потока цветов type 16 подтверждён только один постоянный alpha
|
Для MSH без потока цветов type 16 подтверждён только один постоянный alpha
|
||||||
|
|||||||
+24
-9
@@ -236,15 +236,30 @@ distance² = dot(hit_world - original_start, hit_world - original_start)
|
|||||||
`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead` (RVA
|
`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead` (RVA
|
||||||
`0x35430`, `0x35961`) и `AniMesh.dll` SHA-256
|
`0x35430`, `0x35961`) и `AniMesh.dll` SHA-256
|
||||||
`65659bf67f20e5be77d67a5b2f59968f61b94293143807fa59ca451c560c4f7e` (RVA
|
`65659bf67f20e5be77d67a5b2f59968f61b94293143807fa59ca451c560c4f7e` (RVA
|
||||||
`0x134D0`, `0x10A50`). Игнорируемый тест загружает настоящий объект PLANT 4
|
`0x134D0`, `0x10A50`).
|
||||||
миссии AutoDemo и проверяет, что сегмент пересекает геометрию Node3 в исходной
|
|
||||||
закрытой позе, но проходит без попадания при явно заданной открытой позе frame
|
Игнорируемый тест загружает настоящий объект PLANT 4 миссии
|
||||||
`1`. Это проверка запроса для двух поз, а не открытие двери игровой командой.
|
AutoDemo и использует его исходную CTLD-привязку Node3: `frame_a = 0`,
|
||||||
В загруженных Control-привязках корня PLANT нет tag-21 записи для перехода
|
`frame_b = 1`, начальное смешивание `0`. В контроллере корневого PLANT нет
|
||||||
Node3; тест задаёт frame `1` напрямую и не исполняет команду открытия из
|
записей tag-21. В
|
||||||
миссии.
|
закрытой начальной позе запрос, вызванный через обновление камеры приложения,
|
||||||
Нативный выбор первого корня и полный мировой обход ещё не сопоставлены с Rust;
|
останавливает движение. Затем тест вручную задаёт время `1` только для
|
||||||
app пока не передаёт этой функции живые runtime-позы и bindings.
|
Node3, пересчитывает pose и преобразование присоединения и повторяет тот же
|
||||||
|
путь обновления камеры; отрезок проходит через проём. Это проверяет подачу
|
||||||
|
двух заданных в MSH поз в коллизию приложения, а не открытие двери событием
|
||||||
|
миссии и не её видимое обновление в игровой сцене.
|
||||||
|
|
||||||
|
Интерактивный preview создаёт отдельную запись для каждого отрисовываемого
|
||||||
|
корневого строения класса `FORT` и его отрисовываемых компонентов. На каждом
|
||||||
|
движении камера получает текущую Node38-иерархию компонента и его актуальное
|
||||||
|
преобразование присоединения, переводит выбранные узлы и slot-ы в мировой
|
||||||
|
запрос и выполняет его после ограничения цели рельефом. Попадание сохраняет
|
||||||
|
прежнюю позицию камеры, но не отменяет новый поворот; повтор ожидающего кадра
|
||||||
|
не применяет шаг движения второй раз. Так приложение связывает мировой
|
||||||
|
MSH-запрос с движением свободной preview-камеры. Выбор первого корня и полный
|
||||||
|
состав мирового списка ещё не сверены с оригиналом; игровые источники поз и
|
||||||
|
событий, а также поведение стратегической и следящей камеры остаются
|
||||||
|
открытыми.
|
||||||
|
|
||||||
## Сторона грани в цветовом проходе
|
## Сторона грани в цветовом проходе
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
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. Так проверяется вход запроса столкновения и путь камеры;
|
||||||
|
видимая дверь не анимируется, а миссионные команды не воспроизводятся.
|
||||||
|
|
||||||
Высота полёта сверху не ограничена. Это ограничение диагностической камеры
|
Высота полёта сверху не ограничена. Это ограничение диагностической камеры
|
||||||
превью; столкновения со стенами зданий и точные правила игровых камер оригинала
|
превью; точные правила игровых и следящих камер оригинала остаются
|
||||||
остаются отдельными задачами.
|
неподтверждёнными.
|
||||||
|
|
||||||
## Ограничения точного совпадения
|
## Ограничения точного совпадения
|
||||||
|
|
||||||
|
|||||||
+13
-1
@@ -1045,7 +1045,19 @@ swapchain, тот же sample времени и состояние мира от
|
|||||||
Счётчик и replay clock продвигаются только после результата `Presented`.
|
Счётчик и replay clock продвигаются только после результата `Presented`.
|
||||||
После шага движения камера проверяет высоту
|
После шага движения камера проверяет высоту
|
||||||
`TerrainWorld`: над конечной поверхностью сохраняется начальный просвет, а вне
|
`TerrainWorld`: над конечной поверхностью сохраняется начальный просвет, а вне
|
||||||
поверхности высота не ограничивается. Mission-local `sky.ske`/`sky.wea` выбирают
|
поверхности высота не ограничивается.
|
||||||
|
|
||||||
|
Для каждого отрисовываемого строения (корневого объекта класса `FORT`) и для
|
||||||
|
каждого его отрисовываемого компонента создаётся отдельная запись проверки. Она
|
||||||
|
использует те же текущие матрицы узлов и присоединённых компонентов, что и
|
||||||
|
геометрия.
|
||||||
|
После ограничения целевой позиции по TerrainWorld камера проверяет непрерывный
|
||||||
|
отрезок от прежней позиции до цели; при пересечении она остаётся в прежней
|
||||||
|
позиции, сохраняя новый поворот. Повторная отправка ожидающего кадра не
|
||||||
|
применяет движение второй раз. Это ограничение диагностической свободной
|
||||||
|
камеры, а не правило игрового или следящего режима оригинала.
|
||||||
|
|
||||||
|
Mission-local `sky.ske`/`sky.wea` выбирают
|
||||||
атмосферное расписание и sky materials, `effects.rlb/env_lightning` даёт
|
атмосферное расписание и sky materials, `effects.rlb/env_lightning` даёт
|
||||||
lightning visual; weather particles, flares, sun/moon, point lights,
|
lightning visual; weather particles, flares, sun/moon, point lights,
|
||||||
projected shadows и audio events обновляются вместе с камерой и временем.
|
projected shadows и audio events обновляются вместе с камерой и временем.
|
||||||
|
|||||||
Reference in new issue
Block a user