Files
fparkan/docs/reference/materials.md
T
Valentin Popov 78fc5f1deb
Docs Deploy / Build and Deploy MkDocs (push) Successful in 34s
Test / Lint (push) Failing after 1m7s
Test / Test (push) Has been skipped
Test / Render parity (push) Has been skipped
docs: rewrite MkDocs documentation
2026-06-22 01:58:51 +04:00

1.8 KiB
Raw Blame History

WEAR и MAT0

MSH batch хранит только material_index. WEAR переводит этот индекс в имя материала, а MAT0 по этому имени описывает phases, parameters и texture references.

Batch20.material_index
  -> WEAR row
  -> MAT0 entry
  -> active phase
  -> textureName

WEAR

WEAR -- текстовый ресурс type ID 0x52414557, обычно *.wea рядом с моделью.

<wearCount>
<legacyId> <materialName>
...

[empty line]
[LIGHTMAPS
<lightmapCount>
<legacyId> <lightmapName>
...]

legacyId сохраняется, но выбор выполняется по позиции строки и имени. Между основной таблицей и LIGHTMAPS нужен пустой разделитель.

MAT0

MAT0 имеет type ID 0x3054414D, обычно расположен в Material.lib. attr1 содержит runtime flags, attr2 -- версию payload.

#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.