GlitcherOG (talk | contribs) (Created page with "<nowiki>#</nowiki> MPF File (PS2 Models) - Contents: - [Overview](#overview) - [Structure](#structure) <nowiki><br></nowiki> <nowiki>***</nowiki> <nowiki><br></nowiki> <nowiki>#</nowiki> Overview An **MPF** file contains model names, bones, UV maps, normals, vertices and other model data. <nowiki><br></nowiki> Used for boards, characters and accessories. <nowiki><br></nowiki> Here is the structure made in programming languages for easy code impleme...") |
GlitcherOG (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
== Overview == |
|||
<nowiki>#</nowiki> MPF File (PS2 Models) |
|||
An MPF file contains model names, bones, UV maps, normals, vertices and other model data. |
|||
- Contents: |
|||
- [Overview](#overview) |
|||
- [Structure](#structure) |
|||
<nowiki><br></nowiki> |
|||
<nowiki>***</nowiki> |
|||
<nowiki><br></nowiki> |
|||
<nowiki>#</nowiki> Overview |
|||
An **MPF** file contains model names, bones, UV maps, normals, vertices and other model data. <nowiki><br></nowiki> |
|||
Used for boards, characters and accessories. |
|||
<nowiki><br></nowiki> |
|||
Here is the structure made in programming languages for easy code implementation: |
Here is the structure made in programming languages for easy code implementation: |
||
- [SSX Tricky mpf GO struct by Erick](<nowiki>https://github.com/Erickson400/TheTrickyModels/blob/main/mpf/MpfStructure.go</nowiki>) |
|||
<nowiki><br></nowiki> |
|||
- [SSX Tricky mpf |
- [SSX Tricky mpf C# handler by GlitcherOG](<nowiki>https://github.com/GlitcherOG/SSX-PS2-Collection-Modder/blob/main/FileHandlers/Models/TrickyMPFModelHandler.cs</nowiki>) |
||
== Structure == |
|||
- [SSX Tricky mpf C# handler by GlitcherOG](<nowiki>https://github.com/GlitcherOG/SSX-PS2-Collection-Modder/blob/main/FileHandlers/Models/TrickyMPFModelHandler.cs</nowiki>)<nowiki><br></nowiki> |
|||
<nowiki>#</nowiki> Structure |
|||
<nowiki><br></nowiki> |
|||
<nowiki>**</nowiki>File contents:** |
|||
- [File Header](#file-header) |
|||
- Model Header List |
|||
- [Model Header](#model-header) |
|||
- Model Data List |
|||
- [Model Data](#model-data) |
|||
<nowiki><br></nowiki> |
|||
<nowiki>##</nowiki> File Header |
|||
=== File Header === |
|||
Section 0 - Bytes[12] |
Section 0 - Bytes[12] |
||
{| class="wikitable" |
|||
|+ |
|||
!Type |
|||
!Description |
|||
|- |
|||
|Byte[4] |
|||
|Unknown (Possibly version or magic) |
|||
|- |
|||
|UInt16 |
|||
|Model Header Count |
|||
|- |
|||
|UInt16 |
|||
|Offset To Model Headers |
|||
|- |
|||
|UInt32 |
|||
|Offset To Model Data List Start |
|||
|} |
|||
=== Model Header === |
|||
| Offset | Type | Description | Key | |
|||
All Offsets Within the file are relative to the start of the Model Data |
|||
{| class="wikitable" |
|||
!Type |
|||
!Description |
|||
|- |
|||
|Bytes[16] |
|||
|Name of Model (ASCII string with a max length of 16 bytes) |
|||
|- |
|||
|UInt32 |
|||
|Offset to Model Data which is relative to Model Data List Start Offset |
|||
|- |
|||
|UInt32 |
|||
|Size of model in bytes |
|||
|- |
|||
|UInt32 |
|||
|Offset of **Bone Data List** |
|||
|- |
|||
|UInt32 |
|||
|Offset of **IK Point List** |
|||
|- |
|||
|UInt32 |
|||
|Offset of **Mesh Group Offset** |
|||
|- |
|||
|UInt32 |
|||
|Offset of **Mesh Data** |
|||
|- |
|||
|UInt32 |
|||
|Offset Of **Material Data** |
|||
|- |
|||
|UInt32 |
|||
|Offset of Weight List Reference |
|||
|- |
|||
|UInt32 |
|||
|Offset of Bone Weights |
|||
|- |
|||
|UInt32 |
|||
|Unknown (Unused/Filler) |
|||
|- |
|||
|UInt32 |
|||
|Unknown (Unused/Filler) |
|||
|- |
|||
|UInt16 |
|||
|Num of Bone Weights |
|||
|- |
|||
|UInt16 |
|||
|Num of Weight List Refrence |
|||
|- |
|||
|UInt16 |
|||
|Num Of Mesh Groups |
|||
|- |
|||
|UInt16 |
|||
|Num Of Bone Data |
|||
|- |
|||
|UInt16 |
|||
|Num Of Materials |
|||
|- |
|||
|UInt16 |
|||
|Num Of IK Points |
|||
|- |
|||
|UInt16 |
|||
|Num Of Morph Keys |
|||
|- |
|||
|UInt16 |
|||
|Internal File ID. This is used in conjunction with weights so that it can access bones within another file |
|||
|- |
|||
|UInt32 |
|||
|Filler/Padding |
|||
|} |
|||
=== Model Data === |
|||
|--------|--------|--------------------------------------|---------------------| |
|||
All Offsets Unless Stated Otherwise are relative to the start of model data |
|||
==== Material Data ==== |
|||
| 0x00 | UInt32 | Unknown (Possibly version or magic) | | |
|||
Unused Slots use 0x00202020 as a place holder |
|||
{| class="wikitable" |
|||
!Type |
|||
!Description |
|||
|- |
|||
|Bytes[4] |
|||
|Name of Main Texture map/file |
|||
|- |
|||
|Bytes[4] |
|||
|Name/Type of Texture (Unused In PS2) |
|||
|- |
|||
|Bytes[4] |
|||
|Name/Type of Texture (Unused In PS2) |
|||
|- |
|||
|Bytes[4] |
|||
|Name/Type of Texture (Unused In PS2) |
|||
|- |
|||
|Bytes[4] |
|||
|Name/Type of Texture (Unused In PS2) |
|||
|- |
|||
|Float32 |
|||
|Unknown float value |
|||
|- |
|||
|Float32 |
|||
|Unknown float value |
|||
|- |
|||
|Float32 |
|||
|Unknown float value |
|||
|} |
|||
==== Bone Data ==== |
|||
| 0x04 | Int16 | Count of **Models** | `mdlCount` | |
|||
Location and Rotation are relative to parent |
|||
{| class="wikitable" |
|||
!Type |
|||
!Description |
|||
|- |
|||
|Bytes[16] |
|||
|Name of Bone (ASCII string with a maximum length of 16 bytes) |
|||
|- |
|||
|UInt16 |
|||
|Internal File ID of Parent Bone(First bone always has 0xFFFF) |
|||
|- |
|||
|UInt16 |
|||
|ID of Parent Bone (First bone always has 0xFFFF) |
|||
|- |
|||
|UInt16 |
|||
|Bone ID (?) |
|||
|- |
|||
|UInt16 |
|||
|Unknown |
|||
|- |
|||
|Vector 3 (3 Float32s) |
|||
|XYZ Position Of the Bone |
|||
|- |
|||
|Vector 3 (3 Float32s) |
|||
|XYZ Radian Rotation of the bone |
|||
|- |
|||
|Vector 3 (3 Float32s) |
|||
|XYZ Radian 2 |
|||
|- |
|||
|6 Float32s |
|||
|Contains 6 float values with either -1.0 or 1.0 |
|||
|} |
|||
==== IK Point (Inverse Kinematic) ==== |
|||
| 0x06 | Int16 | Offset of **Model Header List** | | |
|||
Inverse Kinematic Targets this is a list which usually contains 2 points boards use them so the character's boots stick on |
|||
{| class="wikitable" |
|||
|+ |
|||
!Type |
|||
!Description |
|||
|- |
|||
|Vector 3 (3 Float32s) |
|||
|Location XYZ |
|||
|- |
|||
|UInt32 |
|||
|Unknown (Filler) |
|||
|} |
|||
==== Group Main ==== |
|||
| 0x08 | UInt32 | Offset of **Model Data List** | `mdlDataListOffset` | |
|||
===== Group Main Header ===== |
|||
| | List | List containing Model Headers | | |
|||
{| class="wikitable" |
|||
|+ |
|||
| | List | List containing Model Data | | |
|||
!Type |
|||
!Description |
|||
<nowiki><br></nowiki> |
|||
|- |
|||
|UInt32 |
|||
<nowiki>##</nowiki> Model Header |
|||
|ID (?) |
|||
|- |
|||
Section 1 - Bytes[80] |
|||
|UInt32 |
|||
|Material ID |
|||
| Offset | Type | Description | Key | Rel | |
|||
|- |
|||
|UInt32 |
|||
|-------- |----------- |------------------------------------------------------------ |------------------ |--------------------- | |
|||
|Unknown |
|||
|- |
|||
| 0x00 | Bytes[16] | Name of Model (ASCII string with a max length of 16 bytes) | `mdlName` | | |
|||
|UInt32 |
|||
|Sub Group Offset |
|||
| 0x10 | UInt32 | Offset of **Model Data** | `mdlDataOffset` | `mdlDataListOffset` | |
|||
|- |
|||
|UInt32 |
|||
| 0x14 | UInt32 | Size of model in bytes or end offset | | `mdlDataOffset` | |
|||
|Sub Group Count |
|||
|} |
|||
| 0x18 | UInt32 | Offset of **Bone Data List** | `boneListOffset` | `mdlDataOffset` | |
|||
| 0x1C | UInt32 | Offset of **IK Point List** | | `mdlDataOffset` | |
|||
| 0x20 | UInt32 | Offset of **Mesh Group Offset** (Chunk offsets) | | `mdlDataOffset` | |
|||
| 0x24 | UInt32 | Offset of **Mesh Data** | | `mdlDataOffset` | |
|||
| 0x28 | UInt32 | Offset Of **Material Data**? | | | |
|||
| 0x2C | UInt32 | Offset of _Number list reference_ | | `mdlDataOffset` | |
|||
| 0x30 | UInt32 | Offset of **Skinning Data** | | `mdlDataOffset` | |
|||
| 0x34 | UInt32 | Unknown (Unused/Filler) | | `mdlDataOffset` | |
|||
| 0x38 | UInt32 | Unknown (Unused/Filler) | | | |
|||
| 0x3C | UInt16 | Count of **Skinning Data** | | | |
|||
| 0x3E | UInt16 | Number Ref List Count | | | |
|||
| 0x40 | UInt16 | Count of **Chunk Data** | | | |
|||
| 0x42 | UInt16 | Count of **Bone Data** | `boneDataCount` | | |
|||
| 0x44 | UInt16 | Count of **Material Data** | `matDataCount` | | |
|||
| 0x46 | UInt16 | Count of **IK points** | | | |
|||
| 0x48 | UInt16 | Count of **Morph Data** | | | |
|||
| 0x4A | UInt16 | Unknown ID/Count (Related to Skeleton/Animation) | | | |
|||
| 0x4C | UInt32 | Filler/Padding | | | |
|||
<nowiki><br></nowiki> |
|||
<nowiki>##</nowiki> Model Data |
|||
| Name | Description | |
|||
|----------------------|----------------------------------------------------------| |
|||
| Material Data Lists | Contains this `matDataCount` many materials | |
|||
| Bone Data List | Contains this `boneDataCount` many bones | |
|||
| Bone Weight Headers | | |
|||
| Number List Ref | | |
|||
| Unknown Data | | |
|||
| Internal Mesh Ref | | |
|||
| Internal Mesh | | |
|||
<nowiki><br></nowiki> |
|||
<nowiki>##</nowiki> Material Data |
|||
| Offset | Type | Description | Key | |
|||
|--------|-----------|-----------------------------------------------------------------------|----------------| |
|||
| 0x00 | Bytes[4] | Name of main Texture map/file | | |
|||
| 0x04 | Bytes[4] | Name/Type of Texture | | |
|||
| 0x08 | Bytes[4] | Name/Type of Texture | | |
|||
| 0x0C | Bytes[4] | Name/Type of Texture | | |
|||
| 0x04 | Bytes[4] | Name/Type of Texture | | |
|||
| 0x14 | Float32 | Unknown float value | | |
|||
| 0x18 | Float32 | Unknown float value | | |
|||
| 0x1C | Float32 | Unknown float value | | |
|||
If a slot has 0x00202020 it may be a placeholder |
|||
<nowiki>**</nowiki>Texture types:** |
|||
<nowiki>**</nowiki> = first and last letter of main texture name |
|||
- **_b - Bump/Normal map (Xbox) <nowiki><br></nowiki> |
|||
- **_g - Shadow/Light? |
|||
- �nvr - Environment/Reflection? (Might be leftover) |
|||
- envr - Environment/Reflection? (Xbox) |
|||
<nowiki><br></nowiki> |
|||
<nowiki>##</nowiki> Bone Data |
|||
Size - Bytes[84] |
|||
| Offset | Type | Description | Key | |
|||
|--------|-----------|---------------------------------------------------------------|----------------| |
|||
| 0x00 | Bytes[16] | Name of Bone (ASCII string with a maximum length of 16 bytes) | `boneName` | |
|||
| 0x10 | UInt16 | Unknown (First bone always has 0xFFFF) | | |
|||
| 0x12 | UInt16 | ID of Parent Bone (First bone always has 0xFFFF) | `boneParentID` | |
|||
| 0x14 | UInt16 | Unknown | | |
|||
| 0x16 | UInt16 | ID of Bone | `boneID` | |
|||
| 0x18 | Float32 | Location X | | |
|||
| 0x1C | Float32 | Location Y | | |
|||
| 0x20 | Float32 | Location Z | | |
|||
| 0x24 | Float32 | Rotation Euler Radian X | | |
|||
| 0x28 | Float32 | Rotation Euler Radian Y | | |
|||
| 0x2C | Float32 | Rotation Euler Radian Z | | |
|||
| 0x30 | Float32 | Rotation Euler Radian X | | |
|||
| 0x34 | Float32 | Rotation Euler Radian Y | | |
|||
| 0x38 | Float32 | Rotation Euler Radian Z | | |
|||
| 0x3C | Bytes[24] | Contains 6 float values with either -1.0 or 1.0 | | |
|||
Location and Rotation is relative to parent bone. |
|||
<nowiki><br></nowiki> |
|||
<!-- Inverse Kinematic bones/tagets/points |
|||
This is a list which usually contains 2 points |
|||
Boards use them so the character's boots stick on |
|||
--> |
|||
<nowiki>##</nowiki> IK Point (Inverse Kinematic) |
|||
| Offset | Type | Description | Key | Rel | |
|||
|--------|-----------|--------------------------------|-----|-----| |
|||
| 0x00 | Float32 | Location X | | | |
|||
| 0x04 | Float32 | Location Y | | | |
|||
| 0x08 | Float32 | Location Z | | | |
|||
| 0x0C | UInt32 | Unknown (Filler) | | | |
|||
<nowiki>##</nowiki> Group Main |
|||
<nowiki>###</nowiki> Group Main Header |
|||
| Offset | Type | Description | Key | Rel | |
|||
|-------- |-------- |------------------ |----- |----- | |
|||
| 0x00 | UInt32 | ID | | | |
|||
| 0x04 | UInt32 | Material ID | | | |
|||
| 0x08 | UInt32 | Unknown | | | |
|||
| | UInt32 | Sub Group Offset | | | |
|||
| | UInt32 | Sub Group Count | | | |
|||
<nowiki>###</nowiki> Group Sub Group |
|||
==== Sub Group ==== |
|||
{| class="wikitable" |
|||
!Type |
|||
!Description |
|||
|- |
|||
|UInt32 |
|||
|Mesh Group Offset |
|||
|- |
|||
|UInt32 |
|||
|Mesh Group Count |
|||
|} |
|||
| Offset | Type | Description | Key | Rel | |
| Offset | Type | Description | Key | Rel | |
||
Line 273: | Line 225: | ||
| 0x04 | UInt32 | Mesh Group Count | | | |
| 0x04 | UInt32 | Mesh Group Count | | | |
||
==== Mesh/Morph Data Group ==== |
|||
<nowiki>###</nowiki> Sub Sub Mesh Group |
|||
{| class="wikitable" |
|||
|+ |
|||
| Offset | Type | Description | Key | Rel | |
|||
!Type |
|||
!Description |
|||
|-------- |-------- |-------------- |----- |----- | |
|||
|- |
|||
|UInt32 |
|||
| 0x00 | UInt32 | Model Offset | | | |
|||
|Model Offset |
|||
|- |
|||
| 0x04 | UInt32 | Unknown 1 | | | |
|||
|UInt32 |
|||
|Morph Target Offset Relative to Model Offset |
|||
| | UInt32 | Unknown 2 | | | |
|||
|- |
|||
|UInt32 |
|||
|Morph Target Entry Size |
|||
|} |
|||
<nowiki><br></nowiki> |
<nowiki><br></nowiki> |
||
Bone Weight |
|||
<nowiki>###</nowiki> Bone Weight Header |
<nowiki>###</nowiki> Bone Weight Header |
Revision as of 07:25, 5 January 2023
Overview
An MPF file contains model names, bones, UV maps, normals, vertices and other model data.
Here is the structure made in programming languages for easy code implementation:
- [SSX Tricky mpf GO struct by Erick](https://github.com/Erickson400/TheTrickyModels/blob/main/mpf/MpfStructure.go)
- [SSX Tricky mpf C# handler by GlitcherOG](https://github.com/GlitcherOG/SSX-PS2-Collection-Modder/blob/main/FileHandlers/Models/TrickyMPFModelHandler.cs)
Structure
File Header
Section 0 - Bytes[12]
Type | Description |
---|---|
Byte[4] | Unknown (Possibly version or magic) |
UInt16 | Model Header Count |
UInt16 | Offset To Model Headers |
UInt32 | Offset To Model Data List Start |
Model Header
All Offsets Within the file are relative to the start of the Model Data
Type | Description |
---|---|
Bytes[16] | Name of Model (ASCII string with a max length of 16 bytes) |
UInt32 | Offset to Model Data which is relative to Model Data List Start Offset |
UInt32 | Size of model in bytes |
UInt32 | Offset of **Bone Data List** |
UInt32 | Offset of **IK Point List** |
UInt32 | Offset of **Mesh Group Offset** |
UInt32 | Offset of **Mesh Data** |
UInt32 | Offset Of **Material Data** |
UInt32 | Offset of Weight List Reference |
UInt32 | Offset of Bone Weights |
UInt32 | Unknown (Unused/Filler) |
UInt32 | Unknown (Unused/Filler) |
UInt16 | Num of Bone Weights |
UInt16 | Num of Weight List Refrence |
UInt16 | Num Of Mesh Groups |
UInt16 | Num Of Bone Data |
UInt16 | Num Of Materials |
UInt16 | Num Of IK Points |
UInt16 | Num Of Morph Keys |
UInt16 | Internal File ID. This is used in conjunction with weights so that it can access bones within another file |
UInt32 | Filler/Padding |
Model Data
All Offsets Unless Stated Otherwise are relative to the start of model data
Material Data
Unused Slots use 0x00202020 as a place holder
Type | Description |
---|---|
Bytes[4] | Name of Main Texture map/file |
Bytes[4] | Name/Type of Texture (Unused In PS2) |
Bytes[4] | Name/Type of Texture (Unused In PS2) |
Bytes[4] | Name/Type of Texture (Unused In PS2) |
Bytes[4] | Name/Type of Texture (Unused In PS2) |
Float32 | Unknown float value |
Float32 | Unknown float value |
Float32 | Unknown float value |
Bone Data
Location and Rotation are relative to parent
Type | Description |
---|---|
Bytes[16] | Name of Bone (ASCII string with a maximum length of 16 bytes) |
UInt16 | Internal File ID of Parent Bone(First bone always has 0xFFFF) |
UInt16 | ID of Parent Bone (First bone always has 0xFFFF) |
UInt16 | Bone ID (?) |
UInt16 | Unknown |
Vector 3 (3 Float32s) | XYZ Position Of the Bone |
Vector 3 (3 Float32s) | XYZ Radian Rotation of the bone |
Vector 3 (3 Float32s) | XYZ Radian 2 |
6 Float32s | Contains 6 float values with either -1.0 or 1.0 |
IK Point (Inverse Kinematic)
Inverse Kinematic Targets this is a list which usually contains 2 points boards use them so the character's boots stick on
Type | Description |
---|---|
Vector 3 (3 Float32s) | Location XYZ |
UInt32 | Unknown (Filler) |
Group Main
Group Main Header
Type | Description |
---|---|
UInt32 | ID (?) |
UInt32 | Material ID |
UInt32 | Unknown |
UInt32 | Sub Group Offset |
UInt32 | Sub Group Count |
Sub Group
Type | Description |
---|---|
UInt32 | Mesh Group Offset |
UInt32 | Mesh Group Count |
| Offset | Type | Description | Key | Rel |
|-------- |-------- |---------------------- |----- |----- |
| 0x00 | UInt32 | Mesh Group Offset | | |
| 0x04 | UInt32 | Mesh Group Count | | |
Mesh/Morph Data Group
Type | Description |
---|---|
UInt32 | Model Offset |
UInt32 | Morph Target Offset Relative to Model Offset |
UInt32 | Morph Target Entry Size |
<br>
Bone Weight
### Bone Weight Header
| Offset | Type | Description | Key | Rel |
|--------|--------|----------------------------|-----|-----|
| 0x00 | UInt32 | Length of array/list | | |
| 0x04 | UInt32 | Offset to Bone weight list | | |
| 0x08 | UInt32 | Unknown | | |
<br>
### Bone Weight
| Offset | Type | Description | Key | Rel |
|--------|--------|------------------------|-----|-----|
| 0x00 | UInt16 | Bone weight (0 to 100) | | |
| 0x02 | UInt8 | Bone ID | | |
| 0x03 | UInt8 | Unknown | | |
## Number List Ref
### Number List Ref Header
| Offset | Type | Description | Key | Rel |
|--------|--------|-----------------------------|-----|-----|
| 0x00 | UInt32 | Sub Number List Ref Count | | |
| 0x04 | UInt32 | Sub Number List Ref Offset | | |
<br>
### Sub Number List Ref
| Offset | Type | Description | Key | Rel |
|--------|--------|------------------------|-----|-----|
| | UInt16 | Unknown | | |
| | UInt16 | Unknown2 | | |
<br>
## Mesh Data
| Offset | Type | Description | Key |
|--------|-----------|-----------------------------------------------------------------------------------------------------------------|-----|
| 0x00 | UInt24 | Count of total rows | |
| 0x03 | Byte | Size of individual rows (Always 16) | |
| 0x04 | Bytes[12] | Unknown (Filler/Padding) | |
| 0x10 | Bytes[13] | Unknown (Always 0x00000000010100010000000000) | |
| 0x1D | Byte | Prefix of count (0x80) | |
| 0x1E | Byte | Count of total mesh info rows (sum of the amount of mesh info rows and the amount of triangle strip count rows) | |
| 0x1F | Byte | Suffix of count (0x6c) | |
| 0x20 | Bytes[16] | Mesh Info Row 1 | |
| 0x30 | Bytes[16] | Mesh Info Row 2 | |
| | List | List of Triangle Strip Count Rows | |
- **Triangle Strip Count Row**
The amount of triangle strip rows can be found inside Mesh Info Row 2 <br>
_First type is assumed to be either UInt32 or Byte_
| Type | Description |
|-----------|-----------------------------------------|
| UInt32 | Count of vertices |
| Bytes[12] | Padding/Unknown |
_mesh data continued:_
| Type | Description |
|-----------|-----------------------------------------|
| UInt24 | Count of rows |
| Byte | Unknown (Always 16) |
| Bytes[12] | Unknown |
| List | UV Block |
| List | Normal Block |
| List | Vertex Block |
<br>
## UV Block
| Type | Desc | Key |
|-----------|----------------------------------------------------------------|-----|
| Bytes[16] | Header of UV Block (Hex: 00100000 00100000 00000020 50505050) | |
| Bytes[12] | Unknown | |
| Byte | Unknown | |
| Byte | Prefix of UV count (0x80) | |
| Byte | Count of UVs | |
| Byte | Suffix of UV count (0x6D) | |
| List | List of UV values | |
**UV value**
| Type | Description |
|-----------|-----------------------------------------|
| UInt16 | UV map U (X translation) |
| UInt16 | UV map V (Y translation) |
| UInt16 | UV map U distance |
| UInt16 | UV map V distance |
<br>
## Normal Block
| Type | Desc | Key |
|-----------|-------------------------------------------------------------------|-----|
| Bytes[16] | Header of normal Block (Hex: 00000000 00800000 00000020 40404040) | |
| Bytes[12] | Unknown | |
| Byte | Unknown | |
| Byte | Prefix of Normal Count (0x80) | |
| Byte | Count of Normals | |
| Byte | Suffix of Normal count (0x79) | |
| List | List Normal values | |
**Normal value:**
| Type | Description |
|-----------|-------------------------------|
| UInt16 | Normal X direction |
| UInt16 | Normal Y direction |
| UInt16 | Normal Z direction |
<br>
## Vertex Block
| Type | Desc | Key |
|-----------|-------------------------------------------------------------------|-----|
| Bytes[16] | Header of Vertex Block (Hex: 00000000 0000803F 00000020 40404040) | |
| Bytes[12] | Unknown | |
| Byte | Unknown | |
| Byte | Prefix of Vertex count (0x80) | |
| Byte | Count of Vertices | |
| Byte | Suffix of Vertex count (0x78) | |
| List | List Vertex values | |
**Vertex value:**
| Type | Description |
|-----------|-------------------------------|
| Float32 | Location X |
| Float32 | Location Y |
| Float32 | Location Z |
## Shadow Vertex Block
| Type | Desc | Key |
|-----------|-------------------------------------------------------------------|-----|
| Bytes[16] | Header of Vertex Block (Hex: 00000000 0000803F 00000020 40404040) | |
| Bytes[12] | Unknown | |
| Byte | Unknown | |
| Byte | Prefix of Vertex count (0x80) | |
| Byte | Count of Vertices | |
| Byte | Suffix of Vertex count (0x6C) | |
| List | List Vertex values | |
**Vertex value:**
| Type | Description |
|-----------|-------------------------------|
| Float32 | Location X |
| Float32 | Location Y |
| Float32 | Location Z |
| UInt32 | Unknown |
<br>
***
<br>
**End of MPF Structure**
<br>