💨 Обзор
Сетки обычно встраиваются в файлы жестких моделей (.3db и .cmp), за исключением пользовательского интерфейса, где данные сетки хранятся в отдельном файле .vms.
stateDiagram-v2
direction LR
[*] --> VMeshLibrary
VMeshLibrary --> mesh.vms
mesh.vms --> VMeshData
🔥 VMeshData
VMeshData — это, по сути, большой буфер вершин/индексов, который содержит все вершины и треугольники одной или нескольких частей. Однако, когда VMeshData содержит сетки из нескольких частей, он не знает, сколько их всего, это просто хранилище, но косвенным указанием на то, что в его наборе данных начинается другая часть, является значение VMeshGroup.vertexStart, равное 0, и индекс вершины в треугольнике, также начинающийся с 0. Обычно части никогда не имеют общих вершин, но группы сеток внутри одной части могут иметь.
| Имя | Тип | Описание |
|---|---|---|
| meshType | uint32 | Всегда 1. В противном случае игра вылетает. |
| primitiveType | uint32 | Тип примитива Direct3D. |
| groupCount | uint16 | Количество групп сетки. |
| indexCount | uint16 | Количество элементов в буфере. |
| vertexFormat | uint16 | Direct3D FVF (гибкий формат вершин). |
| vertexCount | uint16 | Количество буферов вершин. |
| groups | varying | Сетчатые группы. |
| indices | varying | Индексы элементов. |
| vertices | varying | Данные атрибутов вершин. |
- Индексы элементов имеют тип uint16.
- Длина атрибута вершины зависит от режима FVF.
- VMeshData может быть сопоставлен с OpenGL VAO (Vertex Array Object).
Примитивные типы:
| Ценность | Тип |
|---|---|
| 1 | Список точек |
| 2 | Список линий |
| 3 | Линейная полоса |
| 4 | Список треугольников |
| 5 | Треугольная полоса |
| 6 | Веер треугольников |
Это флаги и режимы формата вершин, которые использует Freelancer:
| Имя | Mask value | Описание | Vertex value |
|---|---|---|---|
| D3DFVF_XYZ | 0x0001 | Position | float[3] |
| D3DFVF_NORMAL | 0x0010 | Normal | float[3] |
| D3DFVF_DIFFUSE | 0x0040 | Color | uint32 |
| D3DFVF_TEXn | 0xFF00 | UV1-8 | float[2] |
- Поддерживаются D3DFVF_XYZ, D3DFVF_NORMAL, D3DFVF_DIFFUSE и D3DFVF_TEX0–D3DFVF_TEX8.
- D3DFVF_PSIZE и D3DFVF_SPECULAR не поддерживаются и приведут к повреждению отрисовки.
Группа сеток — это набор вершин и индексов вершин, образующих треугольники, которые сгруппированы по одному идентификатору материала. В Freelancer довольно часто модель или даже отдельная часть сложной модели использует несколько материалов. Таким образом, модель или каждая из ее частей может использовать одну или несколько групп, если в них используется несколько материалов.
| Имя | Тип | Описание |
|---|---|---|
| materialId | uint32 | Идентификатор материала (FLCRC32 названия материала). |
| vertexStart | uint16 | Начальный индекс буфера вершин. |
| vertexEnd | uint16 | Конечный индекс буфера вершин. |
| indexCount | uint16 | Количество индексов буфера элементов. |
| padding | uint16 | Заполнение. Должно быть 0xCC. |
🔥 VMeshRef
Указатель на фрагмент данных в VMeshData.
stateDiagram-v2
direction LR
state type <<choice>>
Levels: Level0 … Level9
[*] --> type
type --> VMeshPart : Single level mesh
VMeshPart --> VMeshRef
type --> MultiLevel
MultiLevel --> Levels
MultiLevel --> Switch2
Levels --> VMeshPart
| Имя | Тип | Описание |
|---|---|---|
| size | uint32 | Размер байта VMeshRef, всегда равен 60. |
| meshId | uint32 | Идентификатор сетки (FLCRC32 имени родительской записи VMeshData). |
| vertexStart | uint16 | Начальный индекс буфера вершин. |
| vertexCount | uint16 | Количество индексов буфера вершин. |
| indexStart | uint16 | Начальный индекс буфера элемента. |
| indexCount | uint16 | Количество индексов буфера элементов. |
| groupStart | uint16 | Индекс начала группы сеток. |
| groupCount | uint16 | Количество групп сетки. |
| extents | float[6] | Ограничительная рамка как максимальное и минимальное значение x, y и z. |
| center | float[3] | Центр ограничивающей сферы. |
| radius | float | Радиус ограничивающей сферы. |
🔭 VWireData
Использует вершины сетки для построения линий для каркасного представления HUD.
stateDiagram-v2
direction LR
[*] --> VMeshWire
VMeshWire --> VWireData
| Имя | Тип | Описание |
|---|---|---|
| size | uint32 | Размер заголовка VWireData, всегда 16. |
| meshId | uint32 | Идентификатор сетки. |
| vertexStart | uint16 | Начальный индекс буфера вершин. |
| vertexCount | uint16 | Количество уникальных вершин. |
| indexCount | uint16 | Количество индексов буфера элементов. |
| vertexRange | uint16 | Диапазон между максимальным индексом вершины и минимальным индексом вершины. |
| indices | varying | Пара индексов элементов на каждую нарисованную линию. |
- Как и индексы элементов в сетке, они имеют тип uint16.
- Существует ограничение на количество индексов, которые может иметь нарисованная каркасная модель (включая любые вложения).
