🔥 Обзор
Сетки обычно встраиваются в файлы жестких моделей (.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.
- Существует ограничение на количество индексов, которые может иметь нарисованная каркасная модель (включая любые вложения).