P3D File Format - ODOLV7: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - "{{unsupported-doc}}" to "{{Feature|UnsupportedDoc}}")
m (Text replacement - ";[ ]+ " to "; ")
Line 59: Line 59:
   float          UnknownFloat3;
   float          UnknownFloat3;
   [[#Textures|Textures]]      Textures;
   [[#Textures|Textures]]      Textures;
   [[P3D Lod Edges|LodEdges]]      LodEdges;        
   [[P3D Lod Edges|LodEdges]]      LodEdges;
   ulong          NoOfFaces;
   ulong          NoOfFaces;
   ulong          OffsetToLodSections;
   ulong          OffsetToLodSections;
Line 70: Line 70:
   [[#NamedProperty|NamedProperty]]  NamedProperties[nTokens];
   [[#NamedProperty|NamedProperty]]  NamedProperties[nTokens];
   ulong          nFrames;
   ulong          nFrames;
   [[P3D Lod Frames|Frame]]          Frames[nFrames];  
   [[P3D Lod Frames|Frame]]          Frames[nFrames];
   ulong          IconColor;
   ulong          IconColor;
   ulong          SelectedColor;
   ulong          SelectedColor;
Line 81: Line 81:
   struct
   struct
   {  
   {  
     ulong      Count;            
     ulong      Count;
     ulong      PointFlags[Count];  // compressed. see [[P3D Point and Face Flags]]
     ulong      PointFlags[Count];  // compressed. see [[P3D Point and Face Flags]]
     ulong      Count;            
     ulong      Count;
     UVPair      UV1[Count];        // compressed  
     UVPair      UV1[Count];        // compressed  
     ulong      Count;            
     ulong      Count;
     XYZTriplet  Points[Count];      // UNcompressed
     XYZTriplet  Points[Count];      // UNcompressed
     ulong      Count;            
     ulong      Count;
     XYZTriplet  Normals[Count];    // UNcompressed
     XYZTriplet  Normals[Count];    // UNcompressed
   }
   }

Revision as of 00:55, 8 August 2021

bi symbol white.png
Disclaimer: This page describes internal undocumented structures of Bohemia Interactive software.

This page contains unofficial information.

Some usage of this information may constitute a violation of the rights of Bohemia Interactive and is in no way endorsed or recommended by Bohemia Interactive.
Bohemia Interactive is not willing to tolerate use of such tools if it contravenes any general licenses granted to end users of this community wiki or BI products.


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