P3D File Format - ODOLV7: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
(removed from public view to hinder reverse engineering)
(Undo of removal in agreement with mikero)
Line 1: Line 1:
This page has been removed to hinder the thieves, lowlife, and parasites reverse engineering p3ds to the detriment of the community.
{{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

Template: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];
  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;
 }


Related Page(s)

LZ in ODOL

see Compressed LZSS File Format

Model File Formats