Difference between revisions of "FF7/P"

From QhimmWiki
Jump to navigation Jump to search
Qhimm>Halkun
Qhimm>Mirex
(added what I know / mirex / first version, have to fix up inconsistencies, typos and looks)
Line 1: Line 1:
<i>This is just a sub, the rest of my export turned all the tables into pictures. Feel free to finish the rest. (This might just be a note to myself) --[[User:Halkun|Halkun]] 14:41, 12 Mar 2005 (CST)</i>
<i>This is just a sub, the rest of my export turned all the tables into pictures. Feel free to finish the rest. (This might just be a note to myself) --[[User:Halkun|Halkun]] 14:41, 12 Mar 2005 (CST)</i>


Line 39: Line 38:


The .p files have a 128-Byte-long Header. The following is the known structure of the header.
The .p files have a 128-Byte-long Header. The following is the known structure of the header.
<table CELLSPACING="0" style="text-align: center; margin-bottom: 17px;">
{| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"
<tr>
|+'''Table 1: P File header'''
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
! style="background:rgb(204,204,204)" align="center" | Off
Off </td>
! style="background:rgb(204,204,204)" align="center" | 00
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
! style="background:rgb(204,204,204)" align="center" | 01
00 </td>
! style="background:rgb(204,204,204)" align="center" | 02
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
! style="background:rgb(204,204,204)" align="center" | 03
! style="background:rgb(204,204,204)" align="center" | 04
! style="background:rgb(204,204,204)" align="center" | 05
! style="background:rgb(204,204,204)" align="center" | 06
! style="background:rgb(204,204,204)" align="center" | 07
! style="background:rgb(204,204,204)" align="center" | 08
! style="background:rgb(204,204,204)" align="center" | 09
! style="background:rgb(204,204,204)" align="center" | 0A
! style="background:rgb(204,204,204)" align="center" | 0B
! style="background:rgb(204,204,204)" align="center" | 0C
! style="background:rgb(204,204,204)" align="center" | 0D
! style="background:rgb(204,204,204)" align="center" | 0E
! style="background:rgb(204,204,204)" align="center" | 0F
|-
| 00
 
| 01
| 00
| 00
| 00
 
| 01
| 00
| 00
| 00
| colspan="4" align="center"| VertexColor
| colspan="4" align="center"| A
|-
| 10
 
| colspan="4" align="center"| NumNormals


01 </td>
| 00
<td style="border: 1px solid rgb(0, 0, 0); width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
| 00
02 </td>
| 00
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
| 00
03 </td>
<td style="border-style: solid none solid solid; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; width: 33px; height: 25px; background-color: rgb(230, 230, 230);">
04 </td>
<td style="border-style: solid solid solid none; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; vertical-align: top; width: 6px; height: 25px; background-color: rgb(230, 230, 230);">
</td><td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
05 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
06 </td>


<td style="border-style: solid none solid solid; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; vertical-align: top; width: 6px; height: 25px; background-color: rgb(230, 230, 230);">
| colspan="4" align="center"| NumTexCoords
</td><td style="border-style: solid solid solid none; border-color: rgb(0, 0, 0); border-width: 1px; width: 34px; height: 25px; background-color: rgb(230, 230, 230);">
07 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
08 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
09 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
0a </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 40px; height: 25px; background-color: rgb(230, 230, 230);">
0b </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">


0c </td>
| colspan="4" align="center"| NumVertices
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
|-
0d </td>
| 20
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
0e </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 40px; height: 25px; background-color: rgb(230, 230, 230);">
0f </td>
</tr>
<tr>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">


01 </td>
| colspan="4" align="center"| NumEdges
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); width: 39px; height: 25px;">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>
<td style="border-style: solid none solid solid; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; width: 33px; height: 25px;">
01 </td>
<td style="border-style: solid solid solid none; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; vertical-align: top; width: 6px; height: 25px;">
</td><td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>


<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
| colspan="4" align="center"| NumPolygons
00 </td>
<td style="border-style: solid none solid solid; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; vertical-align: top; width: 6px; height: 25px;">
</td><td style="border-style: solid solid solid none; border-color: rgb(0, 0, 0); border-width: 1px; width: 34px; height: 25px;">
00 </td>
<td colspan="4" style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 157px; height: 25px;">
VertexColor </td>
<td colspan="4" style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 157px; height: 25px;">
NumVerts </td>
</tr>
<tr>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
10 </td>


<td colspan="4" style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 157px; height: 25px;">
| 00
NumNormals </td>
| 00  
<td style="border-style: solid none solid solid; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; width: 33px; height: 25px;">
| 00  
00 </td>
| 00  
<td style="border-style: solid solid solid none; border-color: rgb(0, 0, 0); border-width: 1px; vertical-align: top; width: 6px; height: 25px;">
</td><td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>
<td style="border-style: solid none solid solid; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; vertical-align: top; width: 6px; height: 25px;">
</td><td style="border-style: solid solid solid none; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; width: 34px; height: 25px;">
00 </td>


<td colspan="4" style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 157px; height: 25px;">
| 00
NumTexCs </td>
| 00
<td colspan="4" style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 157px; height: 25px;">
| 00
NumNormInds </td>
| 00
</tr>
|-
<tr>
| 30
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
20 </td>
<td colspan="4" style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 157px; height: 25px;">
NumEdges </td>
<td style="border-style: solid none solid solid; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; vertical-align: top; width: 33px; height: 25px;">
</td><td colspan="4" style="border-style: solid none; border-color: rgb(0, 0, 0); border-width: 1px; width: 90px; height: 25px;">
NumPolys </td>


<td style="border-style: solid solid solid none; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; vertical-align: top; width: 34px; height: 25px;">
| colspan="4" align="center"| H
</td><td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 40px; height: 25px;">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); width: 39px; height: 25px;">


00 </td>
| colspan="4" align="center"| NumGroups
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 40px; height: 25px;">
00 </td>
</tr>
<tr>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px; background-color: rgb(230, 230, 230);">
30 </td>
<td colspan="4" style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 157px; height: 25px;">
mirex_h </td>
<td style="border-style: solid none solid solid; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; vertical-align: top; width: 33px; height: 25px;">


</td><td colspan="4" style="border-style: solid none; border-color: rgb(0, 0, 0); border-width: 1px; width: 90px; height: 25px;">
| colspan="4" align="center"| G
NumGroups </td>
<td style="border-style: solid solid solid none; border-color: rgb(0, 0, 0); border-width: 1px; text-align: center; vertical-align: top; width: 34px; height: 25px;">
</td><td colspan="4" style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 157px; height: 25px;">
mirex_g </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
01 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 39px; height: 25px;">
00 </td>
<td style="border: 1px solid rgb(0, 0, 0); text-align: center; width: 40px; height: 25px;">


00 </td>
| 01
</tr>
| 00
</table>
| 00  
| 00
|}


All Values, that can be Read out in this part of the header are 4-Byte-Integers
All Values, that can be Read out in this part of the header are 4-Byte-Integers


Here are the meanings:
This 64-byte-long header is followed by 64 bytes of unknown data.
 
Here are the meanings of values from header:
<pre>
<pre>
typedef struct
typedef struct
Line 282: Line 216:
</tr>
</tr>
</table>
</table>
^^ table not modified accordingly, FIXIT ^^
=== Vertices ===
Vertices are stored as array of structure ‘vertex’ below, which is triplet of float numbers. Numbers specify point in 3D space. Size of this array is specified in header. Size of vertex section is ( 12 * NumVertices )
<pre>
struct s_vertex {
    float              x, y, z;
}  vertex;
</pre>
// structure size = 12 bytes
=== Vertex normals ===
Same format as vertices. Though, each of coordinate means vertex normal orientation instead of position. Size of this section is ( 12 * NumNormals )
=== Texture coordinates ===
Array of vertex texture coordinates. Size of this section is ( 8 * NumTexCoords )
=== Vertex colors ===
Vertex colors are stored as array of colors, each color is specified by four bytes.  Color is in B8G8R8A8 format, that means that first byte specifies Blue, second specifies Green, third specifies Red and fourth specifies Alpha. Alpha byte has usually value ‘255’, so its at full opacity. Size of this  section is ( 4 * NumVertices ).
=== Polygon colors ===
Polygon colors are stored in the same manner as vertex colors. Size of this section is ( 4 * NumPolygons ).
=== Edges ===
Dunno. Size of this section is ( 4 * NumEdges ).
=== Polygons ===
Array of polygon definitions. I know only meaning of values which specify vertex indexes. Vertex indexes can’t be used directly to select vertices, you have first to read groups as groups separate polygons and vertices into groups, and polygons have only group-relative indexes to vertices (that means that in each group these indexes start from 0 ). Size of this section is ( 24 * NumPolygons ).
<pre>
struct {
    unsigned short    zero, VertexIndex[3], ps[3], pu[3], u[2];
} Ppolygon;
</pre>
{| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"
|+'''Table 1: P File header'''
! style="background:rgb(204,204,204)" align="center" | Off
! style="background:rgb(204,204,204)" align="center" | 00
! style="background:rgb(204,204,204)" align="center" | 01
! style="background:rgb(204,204,204)" align="center" | 02
! style="background:rgb(204,204,204)" align="center" | 03
! style="background:rgb(204,204,204)" align="center" | 04
! style="background:rgb(204,204,204)" align="center" | 05
! style="background:rgb(204,204,204)" align="center" | 06
! style="background:rgb(204,204,204)" align="center" | 07
! style="background:rgb(204,204,204)" align="center" | 08
! style="background:rgb(204,204,204)" align="center" | 09
! style="background:rgb(204,204,204)" align="center" | 0A
! style="background:rgb(204,204,204)" align="center" | 0B
! style="background:rgb(204,204,204)" align="center" | 0C
! style="background:rgb(204,204,204)" align="center" | 0D
! style="background:rgb(204,204,204)" align="center" | 0E
! style="background:rgb(204,204,204)" align="center" | 0F
|-
| 00
| colspan="2" align="center"| 00 00
| colspan="2" align="center"| VertexIndex1
| colspan="2" align="center"| VertexIndex2
| colspan="2" align="center"| VertexIndex3
| colspan="2" align="center"| ps1
| colspan="2" align="center"| ps2
| colspan="2" align="center"| ps3
| colspan="2" align="center"| pu1
|-
| 01
| colspan="2" align="center"| pu1
| colspan="2" align="center"| pu2
| colspan="2" align="center"| u1
| colspan="2" align="center"| u2
| colspan="8" align="center"|
|}
=== Hundreds ===
No idea.  Size of this section is ( 100 * H ).
=== Groups ===
{| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;"
|+'''Table 1: P File header'''
! style="background:rgb(204,204,204)" align="center" | Off
! style="background:rgb(204,204,204)" align="center" | 00
! style="background:rgb(204,204,204)" align="center" | 01
! style="background:rgb(204,204,204)" align="center" | 02
! style="background:rgb(204,204,204)" align="center" | 03
! style="background:rgb(204,204,204)" align="center" | 04
! style="background:rgb(204,204,204)" align="center" | 05
! style="background:rgb(204,204,204)" align="center" | 06
! style="background:rgb(204,204,204)" align="center" | 07
! style="background:rgb(204,204,204)" align="center" | 08
! style="background:rgb(204,204,204)" align="center" | 09
! style="background:rgb(204,204,204)" align="center" | 0A
! style="background:rgb(204,204,204)" align="center" | 0B
! style="background:rgb(204,204,204)" align="center" | 0C
! style="background:rgb(204,204,204)" align="center" | 0D
! style="background:rgb(204,204,204)" align="center" | 0E
! style="background:rgb(204,204,204)" align="center" | 0F
|-
| 00
| colspan="4" align="center"| PrimitiveType
| colspan="4" align="center"| PolygonStartIndex
| colspan="4" align="center"| NumPolygons
| colspan="4" align="center"| VerticesStartIndex
|-
| 10
| colspan="4" align="center"| NumVertices
| colspan="4" align="center"| ?
| colspan="4" align="center"| ?
| colspan="4" align="center"| ?
|-
| 20
| colspan="4" align="center"| ?
| colspan="4" align="center"| ?
| colspan="4" align="center"| ?
| colspan="4" align="center"| TexCoordStartIndex
|-
| 30
| colspan="4" align="center"| AreTexturesUsed
| colspan="4" align="center"| TextureNumber
| colspan="8" align="center"|
|}
<pre>
struct {
unsigned long    PrimitiveType;
unsigned long    PolygonStartIndex;
unsigned long    NumPolygons;
unsigned long    VerticesStartIndex;
unsigned long    NumVertices;
unsigned long    u1;
unsigned long    u2;
unsigned long    u3t;
unsigned long    u4;
unsigned long    u5;
unsigned long    u6;
unsigned long    TexCoordStartIndex;
unsigned long    AreTexturesUsed;
unsigned long    TextureNumber;
} group;
// also called pool56, size is 56 bytes
</pre>
Each group specifies group of polygons.  ++
To read this group’s geometry you have to read polygons from polygon segment. First polygon is one with index //group. PolygonStartIndex//, number of polygons is defined by  //group. NumPolygons//.  Polygon has indexes of vertices. These indexes are group-relative and that means that you have to add //group. VerticesStartIndex// to each vertex index.
It’s the same with vertex texture coords. Their indexes are group-relative, to each index you have to add //group. TexCoordStartIndex //
If //group.textures_used// is equal 1 then texture is applied on all polygons of current group. If its 0 there is no texture.  If its 1 then //group. TextureNumber//  defines which texture to use on polygons. Though, texture name is not specified inside the P-file,  it is specified in HRC or DA file, which loads model as a whole ( it points to texture files, P-files, animation files etc.)
Size of this section is ( 100 * H ).
=== Bounding box ===
Not checked yet. Size of this section is 24 bytes.
=== Normal index table ===
Not checked yet. Size of this section is ( 4 * NumVertices ).

Revision as of 19:30, 13 February 2009

This is just a sub, the rest of my export turned all the tables into pictures. Feel free to finish the rest. (This might just be a note to myself) --Halkun 14:41, 12 Mar 2005 (CST)

"P" Polygon File Format

This is a short diagram of the file structure

.p-File
   |
   +- Header
   |
   +- Vertices[]
   |
   (+- Normals[])
   |
   (+- Texture Coords[])
   |
   +- Vertice Colors[]
   |
   +- Polygon Colors[]
   |
   +- Edges[]
   |
   +- Polygons[]
   |
   +- Hundrets[]
   |
   +- Groups[]
   |
   +- BoundingBox
   |
   +- Normal Index Table[]

[] = a variable-sized array


.P File Header

The .p files have a 128-Byte-long Header. The following is the known structure of the header.

Table 1: P File header
Off 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00 01 00 00 00 01 00 00 00 VertexColor A
10 NumNormals 00 00 00 00 NumTexCoords NumVertices
20 NumEdges NumPolygons 00 00 00 00 00 00 00 00
30 H NumGroups G 01 00 00 00

All Values, that can be Read out in this part of the header are 4-Byte-Integers

This 64-byte-long header is followed by 64 bytes of unknown data.

Here are the meanings of values from header:

typedef struct
{
     long off00;
     long off04;
     long VertexColor;
     long NumVerts;
     long NumNormals;
     long off14;
     long NumTexCs;
     long NumNormInds;
     long NumEdges;
     long NumPolys;
     long off28;
     long off2c;
     long mirex_h;
     long NumGroups;
     long mirex_g;
     long off3c;
     long unknown[16];
} 
t_p_header;
VertexColor Specifies if Vertex-Colors are used (0=no,1=yes; default: 1)
NumVerts Count of Vertices
NumNormals Count of Normals (always 0 in Battle files)
NumTexCs Count of Texture Coords
NumNormInds Count of Normal Indices
NumEdges Count of Lines for WireFrame-Model
NumPolys Count of Polygons
VertexColor Specifies if Vertex-Colors are used (0=no,1=yes; default: 1)
mirex_h Count of Hundrets Chunk Entries (Textures?)
NumGroups Count of Groups
mirex_g ? (sometimes 0 or 1)(but usually 1)

^^ table not modified accordingly, FIXIT ^^

Vertices

Vertices are stored as array of structure ‘vertex’ below, which is triplet of float numbers. Numbers specify point in 3D space. Size of this array is specified in header. Size of vertex section is ( 12 * NumVertices )

struct s_vertex {
    float              x, y, z;
}  vertex;

// structure size = 12 bytes

Vertex normals

Same format as vertices. Though, each of coordinate means vertex normal orientation instead of position. Size of this section is ( 12 * NumNormals )

Texture coordinates

Array of vertex texture coordinates. Size of this section is ( 8 * NumTexCoords )

Vertex colors

Vertex colors are stored as array of colors, each color is specified by four bytes. Color is in B8G8R8A8 format, that means that first byte specifies Blue, second specifies Green, third specifies Red and fourth specifies Alpha. Alpha byte has usually value ‘255’, so its at full opacity. Size of this section is ( 4 * NumVertices ).

Polygon colors

Polygon colors are stored in the same manner as vertex colors. Size of this section is ( 4 * NumPolygons ).

Edges

Dunno. Size of this section is ( 4 * NumEdges ).

Polygons

Array of polygon definitions. I know only meaning of values which specify vertex indexes. Vertex indexes can’t be used directly to select vertices, you have first to read groups as groups separate polygons and vertices into groups, and polygons have only group-relative indexes to vertices (that means that in each group these indexes start from 0 ). Size of this section is ( 24 * NumPolygons ).

struct {
    unsigned short     zero, VertexIndex[3], ps[3], pu[3], u[2];
} Ppolygon;
Table 1: P File header
Off 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00 00 00 VertexIndex1 VertexIndex2 VertexIndex3 ps1 ps2 ps3 pu1
01 pu1 pu2 u1 u2

Hundreds

No idea. Size of this section is ( 100 * H ).


Groups

Table 1: P File header
Off 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00 PrimitiveType PolygonStartIndex NumPolygons VerticesStartIndex
10 NumVertices ? ? ?
20 ? ? ? TexCoordStartIndex
30 AreTexturesUsed TextureNumber


struct {
	unsigned long    PrimitiveType;
	unsigned long    PolygonStartIndex;
	unsigned long    NumPolygons;
	unsigned long    VerticesStartIndex;
	unsigned long    NumVertices;
	unsigned long    u1;
	unsigned long    u2;
	unsigned long    u3t;
	unsigned long    u4;
	unsigned long    u5;
	unsigned long    u6;
	unsigned long    TexCoordStartIndex;
	unsigned long    AreTexturesUsed;
	unsigned long    TextureNumber;
} group; 
// also called pool56, size is 56 bytes

Each group specifies group of polygons. ++ To read this group’s geometry you have to read polygons from polygon segment. First polygon is one with index //group. PolygonStartIndex//, number of polygons is defined by //group. NumPolygons//. Polygon has indexes of vertices. These indexes are group-relative and that means that you have to add //group. VerticesStartIndex// to each vertex index. It’s the same with vertex texture coords. Their indexes are group-relative, to each index you have to add //group. TexCoordStartIndex // If //group.textures_used// is equal 1 then texture is applied on all polygons of current group. If its 0 there is no texture. If its 1 then //group. TextureNumber// defines which texture to use on polygons. Though, texture name is not specified inside the P-file, it is specified in HRC or DA file, which loads model as a whole ( it points to texture files, P-files, animation files etc.) Size of this section is ( 100 * H ).

Bounding box

Not checked yet. Size of this section is 24 bytes.

Normal index table

Not checked yet. Size of this section is ( 4 * NumVertices ).