Native Data PLG (Секция RW) — различия между версиями
Материал из GTAModding.ru
DK22 (обсуждение | вклад) м |
DK22 (обсуждение | вклад) м (→Playstation 2) |
||
(не показаны 2 промежуточные версии 1 участника) | |||
Строка 135: | Строка 135: | ||
// | // | ||
// | // | ||
− | Формат данных меша определён особенностями двжика Playstation 2 | + | Формат данных меша определён особенностями двжика Playstation 2. |
Данные меша представляют собой набор тегов и собственно данных, "прикрепленных" к этим тегам. | Данные меша представляют собой набор тегов и собственно данных, "прикрепленных" к этим тегам. | ||
+ | |||
+ | Данные начинаются с заголовка, который называется '''DMA''' (Direct Memory Access)'''- тегом'''. | ||
+ | struct DMATag | ||
+ | { | ||
+ | unsigned short qwc; // количество данных в DMA-пакете (умножить на 16, чтобы получить размер в байтах) | ||
+ | unsigned short unused : 10; // не используется | ||
+ | unsigned short pce : 2; // флаг Priority Control | ||
+ | unsigned short id : 3; ID тега | ||
+ | unsigned short irq : 1; // Interrupt request - запрос прерывания перед отправкой данных ? | ||
+ | unsigned int addr; // адрес данных/следующего тега ? | ||
+ | }; | ||
+ | ''Пример:'' | ||
+ | 2b 001A // qwc = 0x1A, реальный размер пакета в байтах - 26 * 16 = 416 | ||
+ | 2b 0600 // pce = 0; id = 6; irq = 0 | ||
+ | 4b 00000000 // адрес - всегда 0 для первого DMA-тега в меше | ||
+ | |||
+ | За DMA-тегом (т.е. в DMA-пакете) находятся другие теги, которые называются '''VIF-кодами'''. VIF-код имеет следующий вид: | ||
+ | struct VIFCode | ||
+ | { | ||
+ | unsigned short immediate; // параметр IMMEDIATE для команды этого кода (некое значение) | ||
+ | unsigned char num; // параметр NUM для команды этого кода (количество) | ||
+ | unsigned char cmd; // команда этого кода. Формат и назначение параметров NUM и IMMEDIATE зависит от этой команды. | ||
+ | }; | ||
+ | Типы команд (параметр cmd) - следующие: | ||
+ | # биты название | ||
+ | 0 0000 0000 NOP - NO Operation | ||
+ | 1 0000 0001 STCYCL - позволяет делать распаковку данных в цикле | ||
+ | 2 0000 0010 OFFSET | ||
+ | 3 0000 0011 BASE | ||
+ | 4 0000 0100 ITOP | ||
+ | 5 0000 0101 STMOD | ||
+ | 6 0000 0110 MSKPATH3 | ||
+ | 7 0000 0111 MARK | ||
+ | 16 0001 0000 FLUSHE | ||
+ | 17 0001 0001 FLUSH | ||
+ | 19 0001 0011 FLUSHA | ||
+ | 20 0001 0100 MSCAL | ||
+ | 21 0001 0101 MSCALF | ||
+ | 23 0001 0111 MSCNT | ||
+ | 32 0010 0000 STMASK | ||
+ | 48 0011 0000 STROW | ||
+ | 49 0011 0001 STCOL | ||
+ | 74 0100 1010 MPG | ||
+ | 80 0101 0000 DIRECT | ||
+ | 81 0101 0001 DIRECTHL | ||
+ | - 0110 XXXX UNPACK - одна из основных и часто используемых команд. Пересылает данные. | ||
+ | |||
+ | '''UNPACK''' | ||
+ | |||
+ | Эта команда определяет размер, формат данных, которые надо передать для отрисовки меша. После этой команды следует и сам массив этих данных. | ||
+ | VIFCode: UNPACK | ||
+ | Data[Data count * Data stride + (Data count * Data stride) % 16) * (16 - (Data count * Data stride) % 16)] // данные, выравнены по 16 байт | ||
+ | Формат VIF-кода для этой команды имеет следующий вид: | ||
+ | struct VIFCodeUnpack | ||
+ | { | ||
+ | unsigned short addr : 10; // адрес назначения (разделен на 16) | ||
+ | unsigned short unused : 4; // не используется | ||
+ | unsigned short usn : 1; // знак чисел: 0 - знаковое, 1 - беззнаковое. | ||
+ | unsigned short flg : 1; // флаг адресации данных ?. | ||
+ | unsigned char num; // количество данных для пересылки (обычно равно кол-ву вершин в меше) | ||
+ | unsigned char format: 4; // Тип формата данных (см. ниже) | ||
+ | unsigned char cmd : 4; // команда этого кода (UNPACK) - 6 | ||
+ | }; | ||
+ | ''Типы формата данных:'' | ||
+ | # название размерность | ||
+ | 0 S-32 32bit x 1 | ||
+ | 1 S-16 16bit x 1 | ||
+ | 2 S-8 8bit x 1 | ||
+ | 4 V2-32 32bit x 2 | ||
+ | 5 V2-16 16bit x 2 | ||
+ | 6 V2-8 8bit x 2 | ||
+ | 8 V3-32 32bit x 3 | ||
+ | 9 V3-16 16bit x 3 | ||
+ | 10 V3-8 8bit x 3 | ||
+ | 12 V4-32 32bit x 4 | ||
+ | 13 V4-16 16bit x 4 | ||
+ | 14 V4-8 8bit x 4 | ||
+ | 15 V4-5 5+5+5+1 bits | ||
+ | ''Пример:'' | ||
+ | 2b 8000 // addr = 0; usn = 0 (числа со знаком); flg = 1 | ||
+ | 1b 0B // кол-во данных - 11 | ||
+ | 1b 68 // команда - UNPACK (6), формат данных - V3-32 (это позиции вершин) | ||
+ | 132b ....... // массив данных | ||
+ | 12b ....... // выравнивание | ||
+ | |||
+ | {{Заготовка}} | ||
+ | |||
+ | ==XBOX 360== | ||
+ | |||
+ | {{Заготовка}} |
Текущая версия на 21:34, 27 июня 2014
Секция RenderWare |
Native Data PLG |
0x0510 |
Native Data PLG - секция, используемая в DFF-файлах как расширение секции Geometry. Данная секция представляет геометрию в "природном" для движка виде. Это значит, что данные будут напрямую отправлены на конвеер рендеринга, без дополнительной трансформации (построение оптимального вершинного буфера (в терминологии RenderWare - Instancing)). Наличие этой секции в геометрии означает, что "привычные" куски геометрии - такие, как треугольники, позиции вершин, нормали, цвета, текстурные координаты - должны отсутствовать. Также, во флагах геометрии должен быть включен флаг rpGEOMETRYNATIVE.
Содержание |
Direct3D 8
Игры: GTA3 PC, GTAVC PC
Секция включает в себя секцию Struct, в которой находятся все данные.
chunk STRUCT (size (resEntrySize + 8 + totalMeshesVerticesSize + totalMeshesIndicesSize) // unsigned int platformVersion (версия платформы движка, 8 - PC D3D8) unsigned int resEntrySize (размер resEntryHeader + размеры всех мешей) // ResEntry data unsigned int serialNumber unsigned int numMeshes (Кол-во мешей. Упрощённо говоря, меш - это набор треугольников (индексов, вершин), которые рендерятся с одним и тем же материалом. То есть, кол-во мешей равно кол-ву материалов в геометрии) // Meshes [numMeshes] unsigned int minVert (индекс первой вершины?) unsigned int stride (Кол-во байт на одну вершину) unsigned int numVertices (кол-во вершин меша) unsigned int numIndices (кол-во индексов в меше) unsigned int material (ID материала этого меша) unsigned int vertexShader (Указатель) unsigned int primType (тип примитивов (rwPRIMITIVETYPE)) unsigned int indexBuffer (Указатель) unsigned int vertexBuffer (Указатель) unsigned int baseIndex (индекс первой вершины?) unsigned char vertexAlpha (вершины могут быть прозрачными (используется компонент alpha цвета вершины) unsigned char managed unsigned char remapped unsigned char padding // // unsigned short indices[totalNumIndex] (индексы) Vertex vertices[totalNumVertex] (вершины) //
Direct3D 9
Игры: GTASA PC, Manhunt PC
Секция включает в себя секцию Struct, в которой находятся все данные. В GTA SA PC, в отличии от GTA3, все меши используют общий формат вершин.
STRUCT (size (resEntrySize + 4 + 8 * numDeclarations + 2 * numIndices + 32 + vertexStride1 * vertexNum1 + vertexStride2 * vertexNum2)) // unsigned int platformVersion (версия платформы движка, 9 - PC D3D9) unsigned int resEntrySize (размер resEntryHeader + размеры всех мешей) // ResEntry unsigned int serialNumber unsigned int numMeshes (Кол-во мешей. Упрощённо говоря, меш - это набор треугольников (индексов, вершин), которые рендерятся с одним и тем же материалом. То есть, кол-во мешей равно кол-ву материалов в геометрии) unsigned int indexBuffer (Указатель) unsigned int primType (тип примитивов (rwPRIMITIVETYPE)) // Vertex Stream [2] (из параметров "реально" нужны только vertexBuffer(0 если не используется, любое другое значение - используется) и stride) unsigned int vertexBuffer (Указатель. Если это значение равно нулю, массив vertices в Vertex Data [] отсутсвует (см. ниже)) unsigned int offset unsigned int stride (Кол-во байт на одну вершину) unsigned short geometryFlags unsigned char managed unsigned char dynamicLock // unsigned int useOffsets unsigned int vertexDeclaration (Указатель) unsigned int totalNumIndex (Общее кол-во индексов) unsigned int totalNumVertex (Общее кол-во вершин) // Meshes [numMeshes] unsigned int numIndex (кол-во индексов в меше) unsigned int minVert (индекс первой вершины?) unsigned int material (ID материала этого меша) unsigned int vertexAlpha (вершины могут быть прозрачными (используется компонент alpha цвета вершины) unsigned int vertexShader (Указатель) unsigned int baseIndex (индекс первой вершины?) unsigned int numVertices (кол-во вершин меша) unsigned int startIndex (индекс первой вершины?) unsigned int numPrimitives (кол-во треугольников меша) // // unsigned int numDeclarationElements (кол-во элементов вершины) // Elements [numDeclarationElements] (элементы) unsigned short Stream (номер потока (0 или 1) unsigned short Offset (офсет элемента в структуре вершины) unsigned char Type (тип (D3DDECLTYPE)) unsigned char Method (метод (D3DDECLMETHOD)) unsigned char Usage (назначение (D3DDECLUSAGE)) unsigned char UsageIndex (индекс элемента, для COLOR - 0/1 (цвет спекуляра), для текстурных координат - 0 - 7) // unsigned short indices[totalNumIndex] (индексы) // Vertex Data [2] (повторяется Vertex Stream []. Второй поток обычно не используется) unsigned int vertexBuffer unsigned int offset unsigned int stride unsigned short geometryFlags unsigned char managed unsigned char dynamicLock Vertex vertices[totalNumVertex] (вершины) // //
Пример секции: Файл:Bat.rar
OpenGL
Игры: GTA3 Mobile, GTAVC Mobile, GTASA Mobile
В начале секции описаны элементы, которые используют вершины. Далее описаны вершинные данные.
unsigned int numVertexElements // Vertex elements [numVertexElements] unsigned int paramType // тип параметра, типы описаны ниже unsigned int dataType // тип формата параметра, типы описаны ниже unsigned int unknown // 1 для цвета и весов вершин unsigned int size // размерность элемента (2D, 3D, 4D) unsigned int stride // общий размер одной вершины unsigned int offset // смещение (в байтах) к данным этого элемента в структуре вершины // // Вершинные данные для каждого из элементов (по порядку) char vertexData [numVertexElements * stride * vertexCount] //
Типы параметров
0 POSITION 1 TEXCOORD0 2 NORMAL 3 GLOBALCOLOR 4 BLENDWEIGHT 5 BLENDINDICES 6 COLOR2 // В GTA San Andreas используется для цветов ночного освещения
Типы формата параметров
0 FLOAT3 1 BYTE3 // возможно 2 BYTE4 3 WORD2
Playstation 2
Игры: GTA3 PS2, GTAVC PS2, GTASA PS2
Секция включает в себя секцию Struct, в которой находятся все данные.
STRUCT // unsigned int platformVersion (версия платформы движка, 4 - PS2) // Meshes [numMeshes] - Меши. Количество мешей определно в секции Bin Mesh. unsigned int meshSize unsigned int notSkinned char meshData [meshSize] // //
Формат данных меша определён особенностями двжика Playstation 2.
Данные меша представляют собой набор тегов и собственно данных, "прикрепленных" к этим тегам.
Данные начинаются с заголовка, который называется DMA (Direct Memory Access)- тегом.
struct DMATag { unsigned short qwc; // количество данных в DMA-пакете (умножить на 16, чтобы получить размер в байтах) unsigned short unused : 10; // не используется unsigned short pce : 2; // флаг Priority Control unsigned short id : 3; ID тега unsigned short irq : 1; // Interrupt request - запрос прерывания перед отправкой данных ? unsigned int addr; // адрес данных/следующего тега ? };
Пример:
2b 001A // qwc = 0x1A, реальный размер пакета в байтах - 26 * 16 = 416 2b 0600 // pce = 0; id = 6; irq = 0 4b 00000000 // адрес - всегда 0 для первого DMA-тега в меше
За DMA-тегом (т.е. в DMA-пакете) находятся другие теги, которые называются VIF-кодами. VIF-код имеет следующий вид:
struct VIFCode { unsigned short immediate; // параметр IMMEDIATE для команды этого кода (некое значение) unsigned char num; // параметр NUM для команды этого кода (количество) unsigned char cmd; // команда этого кода. Формат и назначение параметров NUM и IMMEDIATE зависит от этой команды. };
Типы команд (параметр cmd) - следующие:
# биты название 0 0000 0000 NOP - NO Operation 1 0000 0001 STCYCL - позволяет делать распаковку данных в цикле 2 0000 0010 OFFSET 3 0000 0011 BASE 4 0000 0100 ITOP 5 0000 0101 STMOD 6 0000 0110 MSKPATH3 7 0000 0111 MARK 16 0001 0000 FLUSHE 17 0001 0001 FLUSH 19 0001 0011 FLUSHA 20 0001 0100 MSCAL 21 0001 0101 MSCALF 23 0001 0111 MSCNT 32 0010 0000 STMASK 48 0011 0000 STROW 49 0011 0001 STCOL 74 0100 1010 MPG 80 0101 0000 DIRECT 81 0101 0001 DIRECTHL - 0110 XXXX UNPACK - одна из основных и часто используемых команд. Пересылает данные.
UNPACK
Эта команда определяет размер, формат данных, которые надо передать для отрисовки меша. После этой команды следует и сам массив этих данных.
VIFCode: UNPACK Data[Data count * Data stride + (Data count * Data stride) % 16) * (16 - (Data count * Data stride) % 16)] // данные, выравнены по 16 байт
Формат VIF-кода для этой команды имеет следующий вид:
struct VIFCodeUnpack { unsigned short addr : 10; // адрес назначения (разделен на 16) unsigned short unused : 4; // не используется unsigned short usn : 1; // знак чисел: 0 - знаковое, 1 - беззнаковое. unsigned short flg : 1; // флаг адресации данных ?. unsigned char num; // количество данных для пересылки (обычно равно кол-ву вершин в меше) unsigned char format: 4; // Тип формата данных (см. ниже) unsigned char cmd : 4; // команда этого кода (UNPACK) - 6 };
Типы формата данных:
# название размерность 0 S-32 32bit x 1 1 S-16 16bit x 1 2 S-8 8bit x 1 4 V2-32 32bit x 2 5 V2-16 16bit x 2 6 V2-8 8bit x 2 8 V3-32 32bit x 3 9 V3-16 16bit x 3 10 V3-8 8bit x 3 12 V4-32 32bit x 4 13 V4-16 16bit x 4 14 V4-8 8bit x 4 15 V4-5 5+5+5+1 bits
Пример:
2b 8000 // addr = 0; usn = 0 (числа со знаком); flg = 1 1b 0B // кол-во данных - 11 1b 68 // команда - UNPACK (6), формат данных - V3-32 (это позиции вершин) 132b ....... // массив данных 12b ....... // выравнивание