Difference between revisions of "Skin PLG (RW Section)"
| Line 1: | Line 1: | ||
| − | |||
| − | |||
{{cleanup-rewrite}} | {{cleanup-rewrite}} | ||
| Line 16: | Line 14: | ||
==Structure== | ==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. | |
| − | :Number of bones | + | 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: | |
| − | : | ||
| − | ; | + | <source lang="c"> |
| + | struct RpBone { | ||
| + | DWORD unused; // Only stored if version < 0x37000 && maxVertexWeights == 0 | ||
| + | FLOAT transform[4][4]; // Skin-to-Bone transform. | ||
| + | }; | ||
| + | </source> | ||
| − | + | === Run-Length Encoding (RLE) === | |
| − | + | The skin skin may be followed by a [https://en.wikipedia.org/wiki/Run-length_encoding|Run-length 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 | ||
| − | |||
{{N|SA|VC|3}} | {{N|SA|VC|3}} | ||
Revision as of 18:51, 11 September 2020
| 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