Skin PLG (RW Section)

From GTAMods Wiki
Revision as of 18:51, 11 September 2020 by Aschratt (talk | contribs)
Jump to navigation Jump to search
40px-Ambox rewrite orange.svg.png This article may need to be rewritten.
Please help improve this article. The discussion page may contain suggestions.
Skin PLG
RenderWare Stream Section
Vendor Criterion Games
Module Toolkit
Module ID 0x000001
Identifier 0x16
Chunk ID 0x00000116
Versions All
Hierarchy
Parents:
Geometry (Extension)
Children:
None
Extensions:
None
File Format

Skin is an additional RenderWare plugin for geometry section. It is used to hold information about skinned model.

Structure

The structure starts with a 4-byte value, where each individual byte contains a counter and the last byte being used for padding.

1b - BYTE - numBones: Overall number of bones in the skeleton.
1b - BYTE - usedBones: Number of bones affected by the skin.
1b - BYTE - maxVertexWeights: Maximum number of non-zero weights per vertex.
1b - BYTE - Padding

The third counter can be any value from 0 to 4. If it equals zero, the engine attempts to figure out this number by looking into each weight array (see below) and counting the non-zero weights. It then takes the largest number from the results.

The counters are followed by multiple arrays that contain information about how vertices of a mesh relate to bones. The number of vertices is obtained from the parent geometry section.

Xb - BYTE[usedBones]       - A list of bone indices, that are affected by the skin.
Xb - BYTE[numVertices][4]  - A list that maps all vertices to (up to) four bones of the skeleton.
Xb - FLOAT[numVertices]    - A list that weights each vertex-bone mapping.

Next, a list of transformation matrices for each bone is provided:

Xb - RpBone[numBones]      - Bone transformations

Where RpBone is defined as follows:

struct RpBone {
    DWORD unused;            // Only stored if version < 0x37000 && maxVertexWeights == 0
    FLOAT transform[4][4];   // Skin-to-Bone transform.
};

Run-Length Encoding (RLE)

The skin skin may be followed by a encoded list of index mappings:

// Split data
UINT32  boneLimit
UINT32  numMeshes
UINT32  numRLE 
#if numMeshes > 0
UINT8   meshBoneRemapIndices[numBones]
UINT16  meshBoneRLECount[numMeshes]
UINT16  meshBoneRLE[numRLE]
#endif