Difference between revisions of "FF7/P"
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. | ||
{| 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 | |||
| 01 | |||
| 00 | |||
| 00 | |||
| 00 | |||
| 01 | |||
| 00 | |||
| 00 | |||
| 00 | |||
| colspan="4" align="center"| VertexColor | |||
| colspan="4" align="center"| A | |||
|- | |||
| 10 | |||
| colspan="4" align="center"| NumNormals | |||
| 00 | |||
| 00 | |||
| 00 | |||
| 00 | |||
| colspan="4" align="center"| NumTexCoords | |||
| colspan="4" align="center"| NumVertices | |||
|- | |||
| 20 | |||
| colspan="4" align="center"| NumEdges | |||
| colspan="4" align="center"| NumPolygons | |||
| 00 | |||
| 00 | |||
| 00 | |||
00 | | 00 | ||
00 | |||
00 | |||
00 | |||
| 00 | |||
| 00 | |||
| 00 | |||
| 00 | |||
|- | |||
| 30 | |||
| colspan="4" align="center"| H | |||
| colspan="4" align="center"| NumGroups | |||
| colspan="4" align="center"| G | |||
00 | | 01 | ||
| 00 | |||
| 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.
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;
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
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 ).