fix(render): select native Land2 multitexture variants
Docs Deploy / Build and Deploy MkDocs (push) Successful in 37s

This commit is contained in:
Valentin Popov committed 2026-10-31 22:44:00 +04:00
1 parent 7ba8a0d84e
commit 8a2c3e9840
3 files changed
+132 -15

No files matched your search

+23 -3
View File
@@ -1059,13 +1059,33 @@ for (face, assignment) in mesh.faces.iter().zip(assignments.iter()) {
## Материалы ландшафта
Рядом с `Land.msh` лежат `Land1.wea` и `Land2.wea`. Старший байт
`TerrainFace28.material_tag` выбирает материал первой таблицы, младший —
второй. `0xff` в старшем байте означает отсутствие первого слоя.
Рядом с `Land.msh` лежат `Land1.wea` и `Land2.wea`. Младший байт
`TerrainFace28.material_tag` выбирает базовый материал `Land1.wea`, старший —
дополнительный материал той же таблицы. `0xff` в старшем байте означает
отсутствие дополнительного слоя. `Land2.wea` содержит соответствующие этим
двум строкам detail-материалы.
В AutoDemo встречаются теги `0102`, `0203`, `ff01`, `ff02`, `ff03`.
Менеджер World3D получает селектор `(table_index << 16) | material_index`
и возвращает выбранную фазу MAT0 размером 76 байт.
Таблица, строка и блок анимации — разные части запроса. В быстром проходе
с двумя текстурами `CShade` запрашивает для Land2 блок анимации **1**. Он может
выбирать другую текстуру, а не только другие коэффициенты освещения:
например, в «Конструкторе» это `L09M.0` вместо `L09.0`. Подмена блока первым
приводит к умножению базового изображения на неподходящую detail-текстуру и
меняет яркость и контраст земли. `TerrainMaterialSelection` сохраняет номер
блока отдельно от packed material key; приложение использует его при загрузке
дескриптора и в последующих кадрах. Если второго блока нет, общий MAT0 sampler
возвращается к первому, как оригинальный `GetMaterialPhase`.
В GOG `Terrain.dll` (сборка из [таблицы бинарников](../reference/original-binaries.md))
быстрая ветвь находится в RVA `0x1A7AC–0x1A7FB`. Живое исполнение передаёт
handle `0x00010002`, block `1` и устанавливает режим текстур `9`; первая
текстура умножается на diffuse, вторая — на результат с множителем два.
Ближний дополнительный проход с порогом `260 / FOV` относится к fallback без
этого режима. На проверенном устройстве он не выбирается, поэтому переносить
его дистанционный порог в быстрый проход нельзя.
Type 18 в `Land.msh` оригинал называет microtexture mapping chunk;
он содержит четырёхбайтовые записи. Type 11 хранит пары `u16`, выбранные
таблицей terrain slots. Их первое поле — ключ shade cache, а не номер строки