P3D File Format - ODOLV7: Difference between revisions
mNo edit summary |
mNo edit summary |
||
Line 1: | Line 1: | ||
{{unsupported-doc}} | {{unsupported-doc}} | ||
===Legend | |||
=General= | |||
==Legend== | |||
see [[Generic FileFormat Data Types]] | see [[Generic FileFormat Data Types]] | ||
==CompressedStructures== | |||
(potentially) compressed arrays are endemic to most blocks contained in a p3d. | |||
(potentially) compressed arrays | |||
CompressedStruct | CompressedStruct | ||
Line 31: | Line 24: | ||
Thus for various Array <types> | 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 | ODOLV7 | ||
{ | { | ||
StandardP3DHeader Header; | StandardP3DHeader Header; | ||
LodStruct Lods[Header.LodCount]; | LodStruct Lods[Header.LodCount]; | ||
[[P3D Model Info|ModelInfo]] ModelInfo; | |||
}; | }; | ||
==StandardP3DHeader== | |||
StandardP3DHeader | StandardP3DHeader | ||
{ | { | ||
char Signature[4]; ''//"ODOL"'' | char Signature[4]; ''//"ODOL" (vs MLOD eg)'' | ||
ulong Version; ''// 7'' | ulong Version; ''// 7'' | ||
ulong LodCount; ''// at least one'' | ulong LodCount; ''// at least one'' | ||
} | } | ||
==LodStruct== | |||
LodStruct | LodStruct | ||
{ | { | ||
VertexTable VertexTable; | [[#VertexTable|VertexTable]] VertexTable; | ||
float UnknownFloat1; | float UnknownFloat1; | ||
float UnknownFloat2; | float UnknownFloat2; | ||
Line 66: | Line 58: | ||
XYZTriplet AutoCenterPos; | XYZTriplet AutoCenterPos; | ||
float UnknownFloat3; | float UnknownFloat3; | ||
Textures Textures; | [[#Textures|Textures]] Textures; | ||
[[P3D Lod Edges|LodEdges]] LodEdges; | |||
ulong NoOfFaces; | ulong NoOfFaces; | ||
ulong OffsetToLodSections; | ulong OffsetToLodSections; | ||
LodFace LodFaces[NoOfFaces]; // ie polygons | [[P3D Lod Faces|LodFace]] LodFaces[NoOfFaces]; // ie polygons | ||
ulong nSections; | ulong nSections; | ||
LODSection LODSections[nSections]; | [[P3D Lod Sections|LODSection]] LODSections[nSections]; | ||
ulong nNamedSelections; | ulong nNamedSelections; | ||
[[P3D Named Selections|NamedSelection]] NamedSelections[nNamedSelections]; | |||
ulong nTokens; | ulong nTokens; | ||
NamedProperty NamedProperties[nTokens]; | [[#NamedProperty|NamedProperty]] NamedProperties[nTokens]; | ||
ulong nFrames; | ulong nFrames; | ||
Frame Frames[nFrames]; | [[P3D Lod Frames|Frame]] Frames[nFrames]; | ||
ulong IconColor; | ulong IconColor; | ||
ulong SelectedColor; | ulong SelectedColor; | ||
ulong Unknown; | ulong Unknown; | ||
ulong nProxies; | ulong nProxies; | ||
LodProxy LodProxies[nProxies]; | [[P3D Lod Proxies|LodProxy]] LodProxies[nProxies]; | ||
}; | }; | ||
Line 90: | Line 82: | ||
{ | { | ||
ulong Count; | ulong Count; | ||
ulong PointFlags[Count]; // compressed. see [[P3D Point Flags]] | ulong PointFlags[Count]; // compressed. see [[P3D Point and Face Flags]] | ||
ulong Count; | ulong Count; | ||
UVPair UV1[Count]; // compressed | UVPair UV1[Count]; // compressed |
Revision as of 02:44, 23 May 2010
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; }