aboutsummaryrefslogtreecommitdiff
path: root/docs/specs/textures.md
blob: 72e1462b74ec157f1235c7149cdf62ba0fcdbb43 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# Текстуры и материалы

На текущем этапе в дизассемблированных библиотеках **не найден полный декодер формата текстурного файла** (нет явных парсеров DDS/TGA/BMP и т.п.). Поэтому документ пока фиксирует:

- что можно достоверно вывести по рендер‑конфигу,
- что видно по структурам модели (materialIndex),
- какие места требуют дальнейшего анализа.

---

## 1) Материал в модели

В batch table модели (см. документацию по MSH/AniMesh) есть поле, очень похожее на:

- `materialIndex: u16` (batch + 2)

Это индекс, по которому рендерер выбирает:

- текстуру(ы),
- параметры (blend, alpha test, двухтекстурность и т.п.),
- “шейдер/пайплайн” (в терминах оригинального рендера — набор state’ов).

**Где лежит таблица материалов** (внутри модели или глобально) — требует подтверждения:

- вероятный кандидат — отдельный ресурс/таблица, на которую `materialIndex` ссылается.
- строковая таблица `Res10` может хранить имена материалов/текстур, но маппинг не доказан.

---

## 2) Переключатели рендера, влияющие на текстуры (из Ngi32.dll)

В `Ngi32.dll` есть набор runtime‑настроек (похоже, читаются из системных настроек/INI/registry), которые сильно влияют на текстурный пайплайн:

- `DisableMipmap`
- `DisableBilinear`
- `DisableTrilinear`
- `DisableMultiTexturing`
- `Disable32bitTextures` / `Force16bitTextures`
- `ForceSoftware`
- `ForceNoFiltering`
- `ForceHWTnL`
- `ForceNoHWTnL`

Практический вывод для порта:

- движок может работать **без мипмапов**, **без фильтрации**, и даже **без multitexturing**.

---

## 3) “Две текстуры” и дополнительные UV‑потоки

В загрузчике модели присутствуют дополнительные per‑vertex ресурсы:

- Res15 (stride 8) — кандидат на UV1 (lightmap/second layer)
- Res16 (stride 8, split в 2×4) — кандидат на tangent/bitangent (normal mapping)
- Res18 (stride 4) — кандидат на vertex color / AO

Если материал реально поддерживает:

- вторую текстуру (detail map, lightmap),
- нормалмапы,

то где‑то должен быть код:

- который выбирает эти потоки как входные атрибуты вершинного шейдера/пайплайна,
- который активирует multi‑texturing.

Сейчас в найденных фрагментах это ещё **не подтверждено**, но структура данных “просится” именно туда.

---

## 4) Что нужно найти дальше (чтобы написать полноценную спецификацию материалов/текстур)

1. Место, где `materialIndex` разворачивается в набор render states:
    - alpha blending / alpha test
    - z‑write/z‑test
    - culling
    - 1‑pass vs 2‑pass (multi‑texturing)
2. Формат записи “material record”:
    - какие поля
    - ссылки на текстуры (ID, имя, индекс в таблице)
3. Формат “texture asset”:
    - где хранится (внутри NRes или отдельным файлом)
    - компрессия/палитра/мip’ы
4. Привязка строковой таблицы `Res10` к материалам:
    - это имена материалов?
    - это имена текстур?
    - или это имена узлов/анимаций?

До подтверждения этих пунктов разумнее держать документацию как “архитектурную карту”, а не как точный байтовый формат.