- Обновлены спецификации `runtime-pipeline`, `sound`, `terrain-map-loading`, `texture`, `ui` и `wear`. - Добавлены разделы о статусе покрытия и оставшихся задачах для достижения 100% завершенности. - Внесены уточнения по архитектурным ролям, минимальным контрактам и требованиям к toolchain для каждой подсистемы. - Уточнены форматы данных и правила взаимодействия между компонентами системы.
4.8 KiB
4.8 KiB
3D implementation notes
Контрольная страница с практическими правилами реализации 3D-пайплайна и с перечнем незакрытых зон.
Документ intentionally high-level: без ссылок на внутренние функции/адреса.
Связанные страницы:
1. Базовые двоичные правила
- Все форматы в этой подсистеме little-endian.
- Внутри NRes данные ресурсов выравниваются по 8 байт.
- Внутри payload таблиц padding между записями обычно отсутствует: записи идут подряд по stride.
2. Быстрая карта stride'ов
| Ресурс | Запись | Stride |
|---|---|---|
| Res1 | Node | 38 |
| Res2 | Slot | 68 (после header 0x8C) |
| Res3 | Position | 12 |
| Res4 | Normal | 4 |
| Res5 | UV0 | 4 |
| Res6 | Index | 2 |
| Res7 | Tri descriptor | 16 |
| Res8 | Animation key | 24 |
| Res13 | Batch | 20 |
| Res19 | Animation map | 2 |
3. Декодирование ключевых потоков
3.1. Позиции (Res3)
float3, stride 12.
3.2. Нормали (Res4)
int8[4], используются первые 3 компоненты:
n = clamp(s8 / 127.0, -1..1)
3.3. UV (Res5)
int16[2]:
u = s16 / 1024.0
v = s16 / 1024.0
3.4. Animation key (Res8)
pos(float3) + time(float) + quat(int16x4):
q = s16 / 32767.0
4. Практический reader-контракт
Для runtime-совместимого чтения модели:
- Найти нужные ресурсы по
type_idв NRes. - Проверить
size/stride-инварианты. - Проверить диапазоны ссылок:
- slot -> batch/triangles;
- batch -> indices;
- indices -> vertices;
- anim_map -> anim_keys.
- Неизвестные поля и неизвестные ресурсы сохранять через copy-through.
5. Практический writer-контракт
- Пересчитывать только явно вычислимые поля.
- Не нормализовать opaque-данные без уверенной спецификации.
- При roundtrip неизмененных данных требовать byte-identical результат.
- Для новых ассетов фиксировать отдельную политику «генерация vs preserve».
6. Runtime-связка материалов и текстур
Канонический путь резолва:
- Модель -> wear-таблица (
*.wea). - Wear-слот -> material name.
- Material -> текущая фаза ->
textureName. Texmищется вTextures.lib(или lightmap-библиотеке для lightmap-ветки).
Fallback:
- материал:
DEFAULT, затем индекс0; - текстура/lightmap: fallback-слот движка.
7. Что уже закрыто для 1:1
- Бинарный контракт базовых MSH таблиц.
- Контракт animation sampling (
Res8 + Res19). - Контракт MAT0/WEAR/Texm на уровне чтения и применения в кадре.
- Формат FXID-контейнера, командный поток и fixed command sizes.
- Валидация на retail-корпусе через
tools/msh_doc_validator.py(0 ошибок/предупреждений).
8. Статус покрытия и что осталось до 100%
- Полная field-level семантика части служебных полей:
Batch20opaque-поля;- хвостовые служебные поля slot-записей;
- часть флагов узлов/групп.
- Полный writer-путь для авторинга новых анимированных ассетов (не только roundtrip существующих).
- Полная формализация семантики FX payload полей по каждому opcode для генерации новых эффектов, а не только для корректного чтения/исполнения.
- Полный канонический writer
Texmдля всех редких форматов и edge-case комбинаций служебных флагов. - Сквозной «импорт внешнего ассета -> игровой пакет» с формальной спецификацией sidecar-метаданных (материал/эффект/анимация).