P3D File Format - ODOLV7: Difference between revisions
(removed from public view to hinder reverse engineering) |
(Undo of removal in agreement with mikero) |
||
| Line 1: | Line 1: | ||
{{unsupported-doc}} | |||
=General= | |||
==Legend== | |||
see [[Generic FileFormat Data Types]] | |||
==CompressedStructures== | |||
(potentially) compressed arrays are endemic to most blocks contained in a p3d. | |||
CompressedStruct | |||
{ | |||
ulong Count; | |||
<type> Array[Count]; | |||
}; | |||
if Count * sizeof(<type>) exceeds 1023 bytes the array is compressed. The '''resulting''' array will be expanded using lzh compression exactly as found in pbo's (for instance) | |||
After de-compression, the Count remains the same because it is a count of the arraytype. | |||
For uncompressed arrays (byte count < 1024) the Count and data are treated 'as is'. | |||
Thus for various Array <types> | |||
*ulong Array: > 255 // 1024 / sizeof(ulong) | |||
*float thing[2]: > 127 // 1024 / 2*sizeof(float) | |||
*SomeStructure: > // count * sizeof (SomeStructure) > 1023 | |||
Note that potentially compressed arrays in these structures only have an known output length. the decompressor therefore must work on infinite input length. | |||
=Odol7Stuct= | |||
ODOLV7 | |||
{ | |||
StandardP3DHeader Header; | |||
LodStruct Lods[Header.LodCount]; | |||
[[P3D Model Info|ModelInfo]] ModelInfo; | |||
}; | |||
==StandardP3DHeader== | |||
StandardP3DHeader | |||
{ | |||
char Signature[4]; ''//"ODOL" (vs MLOD eg)'' | |||
ulong Version; ''// 7'' | |||
ulong LodCount; ''// at least one'' | |||
} | |||
==LodStruct== | |||
LodStruct | |||
{ | |||
[[#VertexTable|VertexTable]] VertexTable; | |||
float UnknownFloat1; | |||
float UnknownFloat2; | |||
XYZTriplet MinPos; | |||
XYZTriplet MaxPos; | |||
XYZTriplet AutoCenterPos; | |||
float UnknownFloat3; | |||
[[#Textures|Textures]] Textures; | |||
[[P3D Lod Edges|LodEdges]] LodEdges; | |||
ulong NoOfFaces; | |||
ulong OffsetToLodSections; | |||
[[P3D Lod Faces|LodFace]] LodFaces[NoOfFaces]; // ie polygons | |||
ulong nSections; | |||
[[P3D Lod Sections|LODSection]] LODSections[nSections]; | |||
ulong nNamedSelections; | |||
[[P3D Named Selections|NamedSelection]] NamedSelections[nNamedSelections]; | |||
ulong nTokens; | |||
[[#NamedProperty|NamedProperty]] NamedProperties[nTokens]; | |||
ulong nFrames; | |||
[[P3D Lod Frames|Frame]] Frames[nFrames]; | |||
ulong IconColor; | |||
ulong SelectedColor; | |||
ulong Unknown; | |||
ulong nProxies; | |||
[[P3D Lod Proxies|LodProxy]] LodProxies[nProxies]; | |||
}; | |||
===VertexTable=== | |||
struct | |||
{ | |||
ulong Count; | |||
ulong PointFlags[Count]; // compressed. see [[P3D Point and Face Flags]] | |||
ulong Count; | |||
UVPair UV1[Count]; // compressed | |||
ulong Count; | |||
XYZTriplet Points[Count]; // UNcompressed | |||
ulong Count; | |||
XYZTriplet Normals[Count]; // UNcompressed | |||
} | |||
*Count is the same value for all four tables. | |||
===Textures=== | |||
struct | |||
{ | |||
'''ulong''' Count; | |||
'''asciiz''' Textures[...]; ''// "data/1.paa\0data/2.paa\0"... | |||
} | |||
Count corresponds to the number of concatenated strings. It is required, since, architecturally at least, one of more of the asciiz strings could be null. | |||
===NamedProperty=== | |||
struct | |||
{ | |||
Asciiz Property;// "noshadow" = "1" eg | |||
Asciiz Value; | |||
} | |||
=Related Page(s)= | |||
==LZ in ODOL== | |||
see [[Compressed LZSS File Format]] | |||
[[BIS_File_Formats#3D_Model_File_Formats|Model File Formats]] | |||
[[Category:BIS_File_Formats]] | |||
Revision as of 17:14, 16 January 2017
General
Legend
see Generic FileFormat Data Types
CompressedStructures
(potentially) compressed arrays are endemic to most blocks contained in a p3d.
CompressedStruct
{
ulong Count;
<type> Array[Count];
};
if Count * sizeof(<type>) exceeds 1023 bytes the array is compressed. The resulting array will be expanded using lzh compression exactly as found in pbo's (for instance)
After de-compression, the Count remains the same because it is a count of the arraytype.
For uncompressed arrays (byte count < 1024) the Count and data are treated 'as is'.
Thus for various Array <types>
- ulong Array: > 255 // 1024 / sizeof(ulong)
- float thing[2]: > 127 // 1024 / 2*sizeof(float)
- SomeStructure: > // count * sizeof (SomeStructure) > 1023
Note that potentially compressed arrays in these structures only have an known output length. the decompressor therefore must work on infinite input length.
Odol7Stuct
ODOLV7
{
StandardP3DHeader Header;
LodStruct Lods[Header.LodCount];
ModelInfo ModelInfo;
};
StandardP3DHeader
StandardP3DHeader
{
char Signature[4]; //"ODOL" (vs MLOD eg)
ulong Version; // 7
ulong LodCount; // at least one
}
LodStruct
LodStruct
{
VertexTable VertexTable;
float UnknownFloat1;
float UnknownFloat2;
XYZTriplet MinPos;
XYZTriplet MaxPos;
XYZTriplet AutoCenterPos;
float UnknownFloat3;
Textures Textures;
LodEdges LodEdges;
ulong NoOfFaces;
ulong OffsetToLodSections;
LodFace LodFaces[NoOfFaces]; // ie polygons
ulong nSections;
LODSection LODSections[nSections];
ulong nNamedSelections;
NamedSelection NamedSelections[nNamedSelections];
ulong nTokens;
NamedProperty NamedProperties[nTokens];
ulong nFrames;
Frame Frames[nFrames];
ulong IconColor;
ulong SelectedColor;
ulong Unknown;
ulong nProxies;
LodProxy LodProxies[nProxies];
};
VertexTable
struct
{
ulong Count;
ulong PointFlags[Count]; // compressed. see P3D Point and Face Flags
ulong Count;
UVPair UV1[Count]; // compressed
ulong Count;
XYZTriplet Points[Count]; // UNcompressed
ulong Count;
XYZTriplet Normals[Count]; // UNcompressed
}
- Count is the same value for all four tables.
Textures
struct
{
ulong Count;
asciiz Textures[...]; // "data/1.paa\0data/2.paa\0"...
}
Count corresponds to the number of concatenated strings. It is required, since, architecturally at least, one of more of the asciiz strings could be null.
NamedProperty
struct
{
Asciiz Property;// "noshadow" = "1" eg
Asciiz Value;
}