diff options
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/appendices/knowledge-boundaries.md | 13 | ||||
| -rw-r--r-- | docs/reference/msh.md | 31 |
2 files changed, 42 insertions, 2 deletions
diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index 580d545..a9aaba1 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -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 diff --git a/docs/reference/msh.md b/docs/reference/msh.md index e2716d2..3cff999 100644 --- a/docs/reference/msh.md +++ b/docs/reference/msh.md @@ -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`, сравнивает камеру с |
