Sursă înăuntru

Sursă de motor BSP

Privire de ansamblu asupra
Formatul BSP conține toate informațiile necesare pentru ca motorul sursă să afișeze corect harta și oferă posibilitatea de a juca pe aceasta. Aceasta include: geometria, adică toate poligoanele la nivel; Numele și direcțiile tuturor texturilor care vor fi afișate pe poligoane; datele necesare pentru a simula fizica, precum și alte obiecte ale mediului; locația și proprietățile tuturor entităților bazate pe perie, model (prop) și non-afișate (logice) pe hartă; toate tabelele BSP pentru copaci și vizibilitate, care sunt folosite pentru a stabili locația jucătorului pe hartă în interiorul geometriei și pentru a cartografia harta pe ecran. Hartă poate purta în sine aceleași texturi și chiar modele utilizate la nivel care sunt situate în bucla Pakfile (a se vedea mai jos).
Este demn de amintit faptul că nu toate informațiile pot fi conținute în harta, de exemplu de fișier BSP nu include o descriere a cardului (care poate fi văzut atunci când sunt încărcate în CS: S și HL2: DM) și să navigați la AI-ului, pentru că fișierele individuale (imya_karty.txt create și respectiv map_name.nav). Motorul sursă însuși încarcă fișiere și fișiere suplimentare din pachetul Pakfile în timpul încărcării hărții.
Hărțile oficiale sunt în formatul fișierului cache al jocului Steam Game (GCF), iar accesul la acestea este prin intermediul sistemului de fișiere Steam. Pentru a extrage fișiere din fișierul GCF, trebuie să aplicați programul Nemesis GCF Scape.

BSP header header
Fișierul BSP începe cu antetul. Această structură identifică fișierul ca fișier BSP pentru motorul sursei de valori, conține o versiune a formatului, conține lungimea și versiunea tuturor subsecțiunilor de fișiere, conține informații despre diferitele părți ale hărții.
Structura fișierului BSP a fost preluată din SDK (public / bspfile.h), antetul are o lungime de 1036 octeți și este definit ca:
struct dheader_t
int ident; // identificator de fișier BSP

int versiune; // Versiunea de fișier BSP
lump_t bucăți [HEADER_LUMPS]; // matricea directoarelor
int mapRevision; // numărul reviziei (iterație, versiune) a hărții
>;
Aici ident este o semnătură de 4 octeți, care este definită ca:
IDBSPHEADER (('P'<<24)+('S'<<16)+('B'<<8)+'V') //little-endian 'VBSP';
După cum ați ghicit, s-a dovedit abrevierea "VBSP". Este cea care identifică fișierul BSP de la Valve; alte formate BSP utilizează alte semnături (de exemplu, software-ul iD în motorul Quake folosit "IBSP"). Formatul BSP HL1 nu a utilizat semnături deloc.
Cel de-al doilea întreg determină versiunea fișierului BSP (BSPVERSION); pentru HL2 în momentul în care este 19 (în notație zecimală); VMTB utilizează formatul versiunii 17.
Notă: Fișierele BSP pentru alte jocuri utilizează propriile game de numere de versiune.
Aceasta este urmată de o structură lump_t de 16 octeți. Conținutul HEADER_LUMPS are o valoare de 64, adică sunt create 64 de elemente și în prezent sunt utilizate doar 48 de elemente.
Iată cum arată structura lump_t declarată în bspfile.h:
struct lump_t
int fileofs; // offset în fișier (octeți)
int filelen; // lungimea forfetarii (bytes)
int versiune; // versiune cu formate forfetare
char 4CC [4]; // cod lump id
>;
Primele două variabile întregi includ offset în octeți (relativ la începutul fișierului BSP) și dimensiunea în octeți forfetara bloc de date; urmat de versiunea format a identificatorului forfetare și 4-byte bloc curent care are aproape întotdeauna o valoare de 0, 0, 0, 0. Elementele de matrice nefolosite bulgări conțin variabile sunt egale cu zero.
Tipul de date conținute în nodulii matrice, în funcție de poziția în matrice, de exemplu: pentru prima matrice într-un nod (nestinsa 0) este întotdeauna fixă ​​BSP despre entitate de date (vezi mai jos). Locația reală a datelor din BSP este determinată exclusiv de mărimea unei anumite ture și forfetare-bloc, și nu depinde de ordinea în matrice, cum ar fi entitate de date stocate în sfârșitul fișierului, în timp ce un nodul-bloc este primul din matrice.
Lista întregului element în matrice (cele necunoscute sunt marcate cu un semn de întrebare):
Lump: Nume: Scop:
0 Entități Entități Map
1 matrice planuri plane
2 Index Texdata la numele texturilor
3 matrice Vertex Vertex
Vizibilitate Matrice de biți de vizibilitate comprimate
5 noduri noduri BSP copac
6 Texinfo Matrice textură
7 fețe
8 Iluminarea matricei Lightmap
9 Date privind ocluzia ocluziei (?)
10 noduri frunze de copac BSP
11 Nefolosite
12 Margini Matrice de muchii
13 Surfedges Index de margini
14 Modele Modele perii (geometria entităților periei)
15 entități luminoase luminoase
16 LeafFaces Indicele de față în fiecare frunză
17 Frunze de frunze Indicați periile din fiecare frunză
18 Pensule Matrice de perii
19 Pensule Pensula de pensula
20 Zone Area matrix
21 Portaluri AreaPortals între zone
22 Portaluri Poligoane care definesc limita dintre frunzele adiacente (?)
23 Clusterele Frunzele care pot fi introduse de către jucător
24 PortalVerts Vertexele de poligoane portal
25 Clusterportals Poligoane care definesc limita dintre grupurile adiacente (?)
26 Matrice de suprafață Dispinfo Displacement
27 OriginalFaces Pensulă se confruntă cu matrice înainte de divizarea BSP
28 Nefolosite
29 Date de coliziune PhysCollide Physics (?)
30 normale VertNormals Vertex (?)
31 VertNormalIndicies Vertex normal array index (?)
32 DispLightmapAlphas Datele de afișare a distanței (?)
33 DISPOZIȚII Suprafețe ale ochiurilor suprafeței de deplasare
34 DispLightmapSamplePos Datele despre harta de deplasare (?)
35 GameLump Jocul specific pentru joc
36 LeafWaterData (?)
37 Primitive (?)
38 PrimVerts (?)
39 Principii (?)
40 Fișier formatat în format Pakfile necomprimat
41 ClipPortalVerts (?)
Cubemaps Env_cubemap matrice de locație
43 Date despre textura texturii TexdataStringData
44 Matrice index TexdataStringTable în texte de date texdata
45 Suprapuneri Info_overlay matrice
46 LeafMinDistToWater (?)
47 FaceMacroTextureInfo (?)
48 Dispersie triunghiuri de suprafață
PhysCollideSurface 49 Date privind suprafața coliziunii fizice (?)
50-64 Nefolosite
Structura unor date forfetare va fi descrisă mai jos.
La sfârșitul antetului conține numărul de verificări, care se bazează pe numărul de scanare din fișierul vmf original, pe lângă acesta, se adaugă momentul în care a fost salvat cardul.

Planul de forfetare
Bazele geometriei BSP sunt planurile, ele servesc ca suprafețe suprapuse în structura arborelui BSP.
Planul forfetar (1) este un pointer la structura dplane_t:
struct dplane_t
Vector normal; // vector normal
float dist; // distanța de la origine
int type; // identificatorul axei plane
>;
Unde Vector este doar o structură care reprezintă un sistem de coordonate în spațiul 3-D:
struct Vector
float x;
float y;
float z;
>;
Planul este determinat de un vector normal, normal, cu dimensiunea unei unități (1.0) și perpendicular pe suprafața plană. Poziția planului în sine este determinată de distanța - distanța este de la centrul hărții (0,0,0) la plan.
Matematic, planul este calculat ca un set specific de puncte (x, y, z) și este o egalitate:
F (x, y, z) = ax + cu + Cz + D
În cazul în care A, B și C sunt componentele normale.x, normal.y și normal.z, D este dist.
Tipul variabilei conține un stegulec specific care indică faptul că planul este perpendicular pe axa de coordonate, de obicei nu este utilizat.
Numărul maxim de avioane de pe harta dvs. este de 65536 (MAX_MAP_PLANES).

Verticală
Vertex (3) conține o matrice de toate vârfurile (unghiurile) în geometria hărții. Unghiul este un punct simplu cu 3 coordonate (x, y, z).
Numărul maxim de colțuri este 65536 (MAX_MAP_VERTS).

Edge Lump
Edgingul (12) este un pointer la structura dedge_t:
struct dedge_t
nesemnate scurte v [2]; // indici de vârf
>;
Edge - o margine este o linie care leagă două colțuri. Numărul maxim de margini este de 256,000 (MAX_MAP_EDGES).

Față și fețe originale
Fascicul de față (7) conține geometria de bază a hărții folosite de motorul de joc pentru a afișa imaginea pe ecran.
Blocul cu fața este una sau mai multe structuri complexe într-un fișier de hartă. Aceasta este o serie de elemente dface_t, lungime de 56 octeți.

struct dface_t
Planul scurt nesemnat; // numărul planului
octeți; // se confruntă cu direcția opusă direcției planului nodului
byte onNode; // 1 de pe nod, 0 dacă este în frunză
int firstedge; // index în surfedges
scurte numedges; // numărul de surfingge
scurt texinfo; // texture info
scurtă dispoziție; // informații despre deplasare
scurtă suprafațăFogVolumeID; //?
byte stiluri [4]; // informații de iluminare comutate
int lightofs; // offset în forfetare lightmap
zona plutitoare; // suprafața feței în unități 2
int LightmapTextureMinsInLuxels [2]; // informații despre textura de iluminat
int LightmapTextureSizeInLuxels [2]; // informații despre textura de iluminat
int origFace; // fata originală
semne scurte nesemnate; // primitive
nesemnate scurt FirstPrimID;
unsigned int smoothingGroups; // groupmap smoothming lightmap
>;

Versiunea BSP 17 conține o structură ușor diferită, modificată.
struct dface_bsp17_t
octet necunoscut [32];
Planul scurt nesemnat;
octeți;
byte onNode;
int firstedge;
scurte numedges;
scurt texinfo;
scurtă dispoziție;
octet necunoscut [50];
int origFace;
unsigned int smoothingGroups;
>;

Pensule și pensule pentru pensule
forfetare perie (18) conține toate periile, care au fost conținute în fișierul original VMF (de fapt, ele nu necesită decompila, sau creați-le pe baza cartii de decompiled - o sarcină ușoară). Această bucată conține o structură dbrush de 12 octeți

struct dbrush_t
int prima parte; // prima perie
int numsides; // numărul de pensule
int conținut; // conținutul steagurilor
>;

Mai ales aici merită notat conținutul variabil, aici este tabelul de valori pe care le ia:

Numărul maxim de perii este 8192 (MAX_MAP_BRUSHES)

Unghi perforat (19) - o serie de structuri de 8 octeți:
struct dbrushside_t
Planul scurt nesemnat; / / cu fața în afara frunzei
scurt texinfo; // texture info
scurtă dispoziție; // informații despre deplasare
scurtă teșitură; // este planul lateral un plan conic?
>;

Cantitatea maximă de perie este 65536 (MAX_MAP_BRUSHSIDES). Numărul maxim de perii pe o perie este de 128 (MAX_BRUSH_SIDES).