.OLM in IGI 2 -- Multi-Layer Lightmap Cascades

1. Architectural Role & Engine Purpose

The OLM (Covert Strike Hierarchical Object Layout Map) format defines world entity placement, interactive objectives, dynamic alarm sensors, and multi-tier visibility layers in I.G.I. 2: Covert Strike.

In IGI 2, OLM was upgraded to version v0.16. Descriptors expanded from 16 bytes to 24 bytes per entity (olm_item_igi2_s), adding 32-bit mission layer bitmasks and unique entity script UIDs (linking world objects directly to DefineMagicObj script instances).

2. Binary File Layout & Memory Map Diagram

An IGI 2 OLM file contains version 0.16 headers, 24-byte entity descriptors, and orientation matrices:

IGI 2 OLM OBJECT LAYOUT — HIERARCHICAL ENTITY REGISTRY (v0.16) 0x00: OLM Header (32 Bytes) VERSION 0.16 Magic "OLM " | Version 0.16 | Object Count | Valley Bounding Box Min/Max | Layer Count magic[4], ver_major (0), ver_minor (16), count, world_min[3], world_max[3] Entity Descriptor Array: 24 Bytes per Object (olm_item_igi2_s) 24B DESCRIPTOR Model ID (uint16) | Flags (uint16) | Layer Bitmask (uint32) | Position XYZ (float[3]) | Entity UID (uint32) Layer mask filters objects by mission difficulty (Easy, Medium, Hard) & mission phases 3x3 Orientation Rotation Matrix & Script Handle Table MAGICOBJECT LINK Entity UID binds directly to DefineMagicObj instance in magicobj.qvm Security cameras, alarm siren panels, patrol guards, heavy vehicles

3. Difficulty & Layer Filtering Pipeline Diagram

The world streaming manager filters entity spawning based on difficulty settings and mission phases:

IGI 2 OLM — DIFFICULTY LAYER FILTERING & ENTITY SPAWN 1. DIFFICULTY INIT • Mission Difficulty: HARD • Active Phase = 1 • Loop 24B Descriptors 2. LAYER FILTER • Test layer_mask Bits • Match: Spawn Entity • Mismatch: Skip Object 3. SCRIPT BINDING • Fetch Entity UID • Bind DefineMagicObj • Connect AI State Machine 4. SECTOR STREAM • Insert Scene Graph • Portal Octree Registry • Active in World

4. C++ Struct Definitions

#pragma pack(push, 1)
struct OlmHeaderIgi2 {
    char     magic[4];       // "OLM "
    uint16_t ver_major;      // 0
    uint16_t ver_minor;      // 16 (v0.16)
    uint32_t object_count;   // Total world entities
    float    world_min[3];   // Valley bounding box minimum
    float    world_max[3];   // Valley bounding box maximum
};
static_assert(sizeof(OlmHeaderIgi2) == 32, "OlmHeaderIgi2 must be 32 bytes");

// IGI 2 24-Byte Entity Descriptor
struct olm_item_igi2_s {
    uint16_t model_id;       // 3D MEF model index
    uint16_t flags;          // Visibility & collision flags
    uint32_t layer_mask;     // Difficulty / objective layer filter
    float    pos_x;          // World coordinate X
    float    pos_y;          // World height Y
    float    pos_z;          // World coordinate Z
    uint32_t entity_uid;     // Unique script entity handle
};
static_assert(sizeof(olm_item_igi2_s) == 24, "olm_item_igi2_s must be 24 bytes");
#pragma pack(pop)