P3D File Format - ODOLV7: Difference between revisions
(Undo of removal in agreement with mikero) |
Lou Montana (talk | contribs) m (Text replacement - " (={2,})([^ = ])(.*)([^ = ])(={2,}) * " to " $1 $2$3$4 $5 ") |
||
Line 3: | Line 3: | ||
=General= | =General= | ||
==Legend== | == Legend == | ||
see [[Generic FileFormat Data Types]] | see [[Generic FileFormat Data Types]] | ||
==CompressedStructures== | == CompressedStructures == | ||
(potentially) compressed arrays are endemic to most blocks contained in a p3d. | (potentially) compressed arrays are endemic to most blocks contained in a p3d. | ||
Line 40: | Line 40: | ||
}; | }; | ||
==StandardP3DHeader== | == StandardP3DHeader == | ||
StandardP3DHeader | StandardP3DHeader | ||
{ | { | ||
Line 48: | Line 48: | ||
} | } | ||
==LodStruct== | == LodStruct == | ||
LodStruct | LodStruct | ||
{ | { | ||
Line 78: | Line 78: | ||
}; | }; | ||
===VertexTable=== | === VertexTable === | ||
struct | struct | ||
{ | { | ||
Line 93: | Line 93: | ||
*Count is the same value for all four tables. | *Count is the same value for all four tables. | ||
===Textures=== | === Textures === | ||
struct | struct | ||
{ | { | ||
Line 103: | Line 103: | ||
===NamedProperty=== | === NamedProperty === | ||
struct | struct | ||
{ | { | ||
Line 112: | Line 112: | ||
=Related Page(s)= | =Related Page(s)= | ||
==LZ in ODOL== | == LZ in ODOL == | ||
see [[Compressed LZSS File Format]] | see [[Compressed LZSS File Format]] | ||
[[BIS_File_Formats#3D_Model_File_Formats|Model File Formats]] | [[BIS_File_Formats#3D_Model_File_Formats|Model File Formats]] | ||
[[Category:BIS_File_Formats]] | [[Category:BIS_File_Formats]] |
Revision as of 19:07, 31 January 2021
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; }