aboutsummaryrefslogtreecommitdiff
path: root/docs/tomes
diff options
context:
space:
mode:
Diffstat (limited to 'docs/tomes')
-rw-r--r--docs/tomes/05-render.md34
1 files changed, 30 insertions, 4 deletions
diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md
index e717736..b04af31 100644
--- a/docs/tomes/05-render.md
+++ b/docs/tomes/05-render.md
@@ -175,10 +175,11 @@ struct Node38 {
};
```
-`slot_index` образует матрицу `3 LOD x 5 groups`. Выбор выполняется как
-`slot_index[lod * 5 + group]`; `0xFFFF` означает отсутствие geometry для этой
-комбинации. Поле `parent_or_link` участвует в иерархии или связи узлов, но
-название остаётся описательным.
+`slot_index` хранит 3 состояния по 5 LOD: `slot_index[state * 5 + lod]`;
+`0xFFFF` означает отсутствие геометрии для комбинации. Публичные Rust-обёртки
+сохраняют исторические имена `Lod` и `Group`: аргумент `Lod` задаёт нативное
+состояние (0..2), а `Group` — нативный уровень LOD (0..4). Поле `parent_or_link`
+участвует в иерархии или связи узлов, но название остаётся описательным.
Type 2 начинается с header `0x8C`, затем содержит slots по 68 байт:
@@ -929,6 +930,31 @@ sun-ray queries поэтому используют исходные коордÐ
Эти два указателя нельзя подменять друг другом. Формулы камеры и размещения
реализованы и проверяются в `fparkan-render`.
+## LOD ландшафта
+
+У `Land.msh` список slot-ссылок terrain хранится в 38-байтовых записях
+Node38, а диапазоны граней — в 68-байтовых Slot68. В текущем runtime первые
+две ссылки Node38 выбирают соответственно LOD0 и LOD1; каждая запись слота
+задаёт начало и число граней в исходном массиве `TerrainFace28`. Все грани
+проверяются на единственное назначение, а выходящий за массив, повторный или
+неподдерживаемый диапазон считается ошибкой загрузки.
+
+Первый рендер карты, terrain-запросы высоты и пересечения, receiver-ы теней и
+обрезка контуром зданий используют только LOD0. Отбор сохраняет порядок
+исходных граней, а контурный проход отдельно переводит индекс спроецированной
+грани обратно в исходный. LOD1 пока не подставляется по расстоянию: такой
+переход не реализован.
+
+```rust
+let assignments = mesh.face_lod_assignments()?;
+for (face, assignment) in mesh.faces.iter().zip(assignments.iter()) {
+ if assignment.lod != TerrainLod::Lod0 {
+ continue;
+ }
+ // Build terrain query geometry from this source face.
+}
+```
+
## Материалы ландшафта
Рядом с `Land.msh` лежат `Land1.wea` и `Land2.wea`. Старший байт