70 lines
1.8 KiB
Markdown
70 lines
1.8 KiB
Markdown
|
|
# WEAR и MAT0
|
|||
|
|
|
|||
|
|
MSH batch хранит только `material_index`. WEAR переводит этот индекс в имя
|
|||
|
|
материала, а MAT0 по этому имени описывает phases, parameters и texture
|
|||
|
|
references.
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
Batch20.material_index
|
|||
|
|
-> WEAR row
|
|||
|
|
-> MAT0 entry
|
|||
|
|
-> active phase
|
|||
|
|
-> textureName
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## WEAR
|
|||
|
|
|
|||
|
|
WEAR -- текстовый ресурс type ID `0x52414557`, обычно `*.wea` рядом с моделью.
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
<wearCount>
|
|||
|
|
<legacyId> <materialName>
|
|||
|
|
...
|
|||
|
|
|
|||
|
|
[empty line]
|
|||
|
|
[LIGHTMAPS
|
|||
|
|
<lightmapCount>
|
|||
|
|
<legacyId> <lightmapName>
|
|||
|
|
...]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`legacyId` сохраняется, но выбор выполняется по позиции строки и имени. Между
|
|||
|
|
основной таблицей и `LIGHTMAPS` нужен пустой разделитель.
|
|||
|
|
|
|||
|
|
## MAT0
|
|||
|
|
|
|||
|
|
MAT0 имеет type ID `0x3054414D`, обычно расположен в `Material.lib`. `attr1`
|
|||
|
|
содержит runtime flags, `attr2` -- версию payload.
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
#pragma pack(push, 1)
|
|||
|
|
struct Mat0PrefixV4Plus {
|
|||
|
|
uint16_t phase_count;
|
|||
|
|
uint16_t animation_block_count;
|
|||
|
|
uint8_t metadata_a;
|
|||
|
|
uint8_t metadata_b;
|
|||
|
|
uint32_t metadata_c_raw;
|
|||
|
|
uint32_t metadata_d_raw;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
struct Phase34 {
|
|||
|
|
uint8_t parameters[18];
|
|||
|
|
char texture_name[16];
|
|||
|
|
};
|
|||
|
|
#pragma pack(pop)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Versioned fields читаются только если версия их содержит. Для старых версий
|
|||
|
|
используются runtime defaults, а raw values сохраняются.
|
|||
|
|
|
|||
|
|
## Fallback
|
|||
|
|
|
|||
|
|
Material resolve:
|
|||
|
|
|
|||
|
|
1. имя из WEAR;
|
|||
|
|
2. `DEFAULT`;
|
|||
|
|
3. entry с индексом 0.
|
|||
|
|
|
|||
|
|
Пустое texture name означает намеренно нетекстурированную поверхность. Lightmap
|
|||
|
|
fallback отдельный: отсутствующий lightmap даёт slot `-1`.
|