aboutsummaryrefslogtreecommitdiff
path: root/docs/specs/wear.md
blob: e969f9cb4ac9bc308d1ba0a83d87ff8dcd483163 (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
91
92
93
94
95
96
# Wear table (`WEAR`)

`WEAR` — текстовый ресурс, который связывает слоты wear с именами материалов и lightmap.

Связанные страницы:

- [Material (`MAT0`)](material.md)
- [Texture (`Texm`)](texture.md)

## 1. Контейнер

- Тип ресурса: `0x52414557` (`WEAR`).
- Обычно хранится как `*.wea` внутри world/mission архивов.

## 2. Формат текста

```text
<wearCount:int>
<legacyId:int> <materialName>
... (wearCount строк)

[пустая строка]
[LIGHTMAPS
<lightmapCount:int>
<legacyId:int> <lightmapName>
... (lightmapCount строк)]
```

`legacyId` читается, но логика выбора работает по имени.

## 3. Совместимость парсинга

В движке используются два режима чтения (`из файла` и `из буфера`), у которых различается обработка блока `LIGHTMAPS`.

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

- если присутствует блок `LIGHTMAPS`, перед строкой `LIGHTMAPS` должна быть пустая строка-разделитель.

## 4. Runtime-ограничения

- Число wear-таблиц в менеджере ограничено: максимум `70`.
- Для `wearCount <= 0` ресурс считается некорректным.
- Для `LIGHTMAPS` блока `lightmapCount <= 0` — также ошибка формата.

## 5. Поведение резолва

### 5.1. Материал

Для каждого wear-слота:

1. Ищется материал по имени.
2. Если не найден — используется fallback (`DEFAULT`, затем индекс 0).

### 5.2. Lightmap

Для каждого lightmap-слота:

1. Ищется текстура lightmap по имени.
2. Если не найдено — слот получает `-1`.

## 6. Handle-кодирование

Движок кодирует ссылку на material-slot как:

```c
handle = (tableIndex << 16) | wearIndex
```

- `tableIndex` — номер wear-таблицы.
- `wearIndex` — индекс строки внутри таблицы.

## 7. Правила writer/editor

1. Сохранять порядок строк.
2. Не переставлять и не нормализовать `legacyId`.
3. Для совместимости buffer-парсинга сохранять пустую строку перед `LIGHTMAPS`.
4. Проверять, что число строк соответствует `wearCount`/`lightmapCount`.

## 8. Статус валидации

- Поведение `WEAR` согласовано с текущей спецификацией материалов/текстур и runtime-пайплайном.
- Корпусные проверки связки `WEAR -> MAT0 -> Texm` включены в текущий валидаторный контур проекта.

## 9. Статус покрытия и что осталось до 100%

Закрыто:

1. Текстовый формат `WEAR`, включая блок `LIGHTMAPS`.
2. Handle-кодирование material slot и fallback-резолв.
3. Правила совместимого writer/editor path.

Осталось:

1. Полная спецификация edge-case форматов строк (кодировки, редкие разделители, возможные legacy-варианты).
2. Формализация всех ограничений менеджера wear-таблиц в runtime (лимиты и политики вытеснения).
3. Интеграционные parity-тесты на полном цикле «модель -> wear -> material -> texture/lightmap».