---
name: "P3D File Format - ODOLV7"
type: topic
source: https://community.bistudio.com/wiki/P3D_File_Format_-_ODOLV7
revid: 373442
updated: 2025-05-08T11:27:12Z
---

# P3D File Format - ODOLV7

> **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](../topics/Generic_FileFormat_Data_Types.md)

### CompressedStructures

(potentially) compressed arrays are endemic to most blocks contained in a p3d.

```cpp
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 decompression, 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

See [P3D Model Info](../topics/P3D_Model_Info.md).

```cpp
ODOLV7
{
    StandardP3DHeader    Header;
    LodStruct            Lods[Header.LodCount];
    ModelInfo            ModelInfo;
};
```

### StandardP3DHeader

```cpp
StandardP3DHeader
{
    char    Signature[4];    //"ODOL" (vs MLOD eg)
    ulong    Version;        // 7
    ulong    LodCount;        // at least one
}
```

### LodStruct

See:

- [VertexTable](../topics/P3D_File_Format_-_ODOLV7.md#vertextable)
- [Textures](../topics/P3D_File_Format_-_ODOLV7.md#textures)
- [P3D Lod Edges](../topics/P3D_Lod_Edges.md)
- [P3D Lod Faces](../topics/P3D_Lod_Faces.md)
- [P3D Lod Sections](../topics/P3D_Lod_Sections.md)
- [P3D Named Selections](../topics/P3D_Named_Selections.md)
- [NamedProperty](../topics/P3D_File_Format_-_ODOLV7.md#namedproperty)
- [P3D Lod Frames](../topics/P3D_Lod_Frames.md)
- [P3D Lod Proxies](../topics/P3D_Lod_Proxies.md)

```cpp
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

See [P3D Point and Face Flags](../topics/P3D_Point_and_Face_Flags.md).

```cpp
    struct
    {
    ulong        Count;
    ulong        PointFlags[Count];    // compressed
    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

```cpp
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

```cpp
struct
{
    Asciiz Property; // e.g "noshadow" = "1"
    Asciiz Value;
}
```

## Related Page(s)

### LZ in ODOL

see [Compressed LZSS File Format](../topics/Compressed_LZSS_File_Format.md)

Model File Formats

<sub>Source: [BI Community Wiki — P3D File Format - ODOLV7](https://community.bistudio.com/wiki/P3D_File_Format_-_ODOLV7) (revision 373442).</sub>
