га

^ІЯ.

struct Quake2Hull // bsp hull
{
Vector3D mins; // hull bounding box
Vector3D maxs;
Vector3D origin;
long headNode;
long firstFace;
long numFaces;
};

Здесь mins и maxs задают ограничивающее тело, описанное вокруг всей модели, headNode - номер узла, соответствующего корню соответствующего BSP-дерева (узлы всех деревьев хранятся в одном массиве).

При этом основная геометрия уровня задается первой такой структурой, а следующие служат для задания вспомогательных структур.

Для загрузки bsp-фаша и его разбора мы будем использовать класс BspFile.

class BspFile {
public:
Quake2BspHeader * hdr;
Vector3D * vertices;
int numVertices;
Quake2Edge * edges;
int numEdges;
Quake2Face * faces;
int numFaces;
unsigned long * faceEdges; // indices of edges
// for any face
Quake2BspPlane * planes;
int numPlanes;
Quake2BspNode * nodes;
int numNodes;
Quake2BspLeaf * leaves;
int numLeaves;
unsigned short * leafFaces; // indices of faces
// for any leaf

Quake2TexInfо * texlnfos;

int numTexInfos;

Пишем рендерер уровней Quake II

unsigned char * vis; // visibility lump
// info
int visBytes;
void * lightmaps; // lightmaps lump
Quake2Hull * hulls ;
int numHulls;
char * entities;
BspFile ( Data * data ) ; -BspFile () ;
int getNumFaces () const {
return numFaces;
}
int getNumClusters () const {
return * (long *} vis;
}
int getPvsOffset ( int cluster ) const {
return ((Quake2PvsEntry *)(4 + cluster * sizeof
(Quake2PvsEntry) + (char *) vis)) -> pvsOff
}
void * getLightMap ( long offset ) const {
return offset + (unsigned char *) lightmaps;
}
};

Приведем конструктор для этого класса.

OA.
BspFile : : BspFile ( Data * data ) {
void * ptr = malloc ( data -> getLength () );
if ( ptr == NULL ) return;
data -> getBytes ( ptr, data -> getLength () ); hdr = (Quake2BspHeader *) ptr;
vertices = (Vector3D *)(hdr ->

⇐ Предыдущая| |Следующая ⇒