feat(runtime): query building meshes in world space
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 38s
This commit is contained in:
4 files changed
+687
-2
No files matched your search
@@ -15,8 +15,17 @@ state transitions и окончательный порядок части transp
|
||||
подтверждают поведение стратегической камеры или камеры робота оригинала.
|
||||
|
||||
Локальный MSH-запрос `query_slot_segment` сверён с оригиналом на фабричной
|
||||
стене и дверном проёме. Мировое преобразование, фильтры категории и
|
||||
подключение к свободной камере остаются открытыми ([MSH](../reference/msh.md)).
|
||||
стене и дверном проёме. Runtime-адаптер `query_building_segment_world` теперь
|
||||
переводит отрезок через переданные преобразования выбранных MSH-узлов, выбирает
|
||||
ближайшее мировое попадание и повторяет запрос для helper batch bit `0x0008`.
|
||||
Его синтетические тесты покрывают поворот, масштаб, отражение, helper-повтор и
|
||||
ограничение в 200 пересечений; они не доказывают паритет с полным мировым
|
||||
запросом оригинала.
|
||||
|
||||
Открыты выбор нативной категории и состава узлов/слотов, получение актуальных
|
||||
поз и component bindings из runtime-объектов, подключение адаптера к свободной
|
||||
камере и сравнение мирового результата с оригиналом
|
||||
([MSH](../reference/msh.md)).
|
||||
|
||||
Для MSH без потока цветов type 16 подтверждён только один постоянный alpha
|
||||
override для диапазонов с CPU-цветом и raw-флагом `Batch20` `0x0008`: GOG
|
||||
|
||||
@@ -197,6 +197,37 @@ Rust использует обычное деление `f32`, поэтому п
|
||||
отличаться. Игнорируемый тест с ресурсами проверяет исходную стену, дверной
|
||||
проём и обратное направление на `fortif.rlb/fr_l_plant.msh`.
|
||||
|
||||
### Мировой отрезок по выбранным узлам
|
||||
|
||||
Локальный запрос выше проверяет один узел и slot модели. Runtime-функция
|
||||
`query_building_segment_world` принимает мировой отрезок и список выбранных
|
||||
узлов со slot-ами и их преобразованиями `world_from_node`. Для каждого узла она
|
||||
переводит оба конца отрезка обратной матрицей, вызывает `query_slot_segment`, а
|
||||
найденную точку переносит назад в мир. Затем она выбирает ближайшее попадание
|
||||
среди переданных узлов.
|
||||
|
||||
```text
|
||||
segment_node = inverse(world_from_node) * segment_world
|
||||
hit_world = world_from_node * hit_node
|
||||
distance² = dot(hit_world - original_start, hit_world - original_start)
|
||||
```
|
||||
|
||||
`original_start` остаётся началом первоначального мирового отрезка, даже когда
|
||||
запрос перезапускается. Нативный CBuilding query сохраняет raw
|
||||
`Batch20.batch_flags & 0x0008`: если ближайшее попадание помечено этим bit,
|
||||
следующий проход начинается в его мировой точке и идёт к исходному концу.
|
||||
Первичный запрос исключает из batch только `0x0200`, а тип-7 треугольники —
|
||||
`0x0024`. Счётчик ограничивает число всех пересечений: при посещении 200
|
||||
запрос завершается ошибкой до проверки bit `0x0008`.
|
||||
|
||||
Эта схема восстановлена по GOG `Terrain.dll` SHA-256
|
||||
`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead`:
|
||||
мировой обход проходит через `FUN_10016a20` (RVA `0x16A20`), CBuilding выполняет
|
||||
запрос и helper-перезапуски в `FUN_10035430` (RVA `0x35430`), а guard находится
|
||||
в участке `0x358FC..0x35926`. Runtime-модуль проверен на синтетических
|
||||
переносах, поворотах, масштабах и отражениях; подключение к текущим позам
|
||||
объектов и камере приложения пока не выполнено.
|
||||
|
||||
## Сторона грани в цветовом проходе
|
||||
|
||||
В цветном проходе `Terrain.dll`, функция `0x100296F0`, сравнивает камеру с
|
||||
|
||||
Reference in new issue
Block a user