aboutsummaryrefslogtreecommitdiff
path: root/docs/reference
diff options
context:
space:
mode:
Diffstat (limited to 'docs/reference')
-rw-r--r--docs/reference/msh.md31
1 files changed, 31 insertions, 0 deletions
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`, сравнивает камеру с