// generation data
Vector3D uAxis; Float uOffset;
Пишем рендерер уровней Quake II
Vector3D vAxis; Float vOffset;
unsigned long flags; // miptex flags and
// overrides
unsigned long value; // light emission and etc
char texName [32]; // texture name without
// extension
long nextTexture; // next texture in animation
// chain or -1
} ;
Текстурные координаты для каждой из вершин каждой грани определяются посредством следующих формул:
u-(p,uAxis) + uOffset, v = (p,vAxis) + vOffset. (11.2)
Поле texName содержит имя текстуры с путем, но без расширения. Поэтому к этому имени нужно прибавить расширения ".wal".
Блок видимости (visibility lump) служит для хранения информации о видимости (PVS). В начале блока идет беззнаковое 32-битовое целое значение, являющееся числом кластеров в сцене. Далее идет массив структур Quake2PvsEntry, по одной для каждого кластера. Далее идут в сжатом виде списки видимых кластеров.
struct Quake2PvsEntry // directory entry of pvs lump {
long pvsOffs; long phsOffs;
} ;
Поле pvsOffs содержит смещение от начала блока до сжатой информации о видимости для данного кластера. Список видимых кластеров представляется как битовый массив, по 1 биту на каждый кластер. Для уменьшения занимаемой памяти этот массив кодируется с применением так называемого RLE (Run-Length Encoding), позволяющего компактно хранить массивы, содержащие большое количество нулевых битов. Подробнее раскодирование этой информации мы рассмотрим несколько позже.
Блок карт освещенности (lightmap lump) хранит карты освещенности для каждой грани сцены. Каждая карта освещенности представляет собой массив из 24-битовый структур (в виде RGB-значений, по 1 байту на каждую компоненту) по одному значению на каждый пиксел. Размер карты освещенности не хранится и вычисляется по текстурным координатам грани (см. гл. 10).
Блок моделей (models(hulls) lump) хранит в себе массив следующих структур, каждая из которых описывает часть уровня, представленную отдельным BSP-деревом.