]> git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/bobtoolz/bsploader.cpp
uncrustify! now the code is only ugly on the *inside*
[xonotic/netradiant.git] / contrib / bobtoolz / bsploader.cpp
1 #include "StdAfx.h"
2 #include "./dialogs/dialogs-gtk.h"
3 #include "bsploader.h"
4 #include "../../libs/cmdlib.h"
5
6 int numnodes;
7 int numplanes;
8 int numleafs;
9 int numleafsurfaces;
10 int numVisBytes;
11 int numDrawVerts;
12 int numDrawSurfaces;
13 int numbrushes;
14 int numbrushsides;
15 int numleafbrushes;
16
17 byte                *visBytes =           NULL;
18 dnode_t           *dnodes =             NULL;
19 dplane_t          *dplanes =              NULL;
20 dleaf_t           *dleafs =             NULL;
21 qdrawVert_t   *drawVerts =        NULL;
22 dsurface_t    *drawSurfaces =       NULL;
23 int                 *dleafsurfaces =    NULL;
24 dbrush_t          *dbrushes =             NULL;
25 dbrushside_t    *dbrushsides =      NULL;
26 int                 *dleafbrushes =     NULL;
27
28 #define BSP_IDENT   ( ( 'P' << 24 ) + ( 'S' << 16 ) + ( 'B' << 8 ) + 'I' )
29 #define Q3_BSP_VERSION          46
30 #define WOLF_BSP_VERSION            47
31
32 /*
33    ================
34    FileLength
35    ================
36  */
37 int FileLength( FILE *f ){
38         int pos;
39         int end;
40
41         pos = ftell( f );
42         fseek( f, 0, SEEK_END );
43         end = ftell( f );
44         fseek( f, pos, SEEK_SET );
45
46         return end;
47 }
48
49 /*
50    ==============
51    LoadFile
52    ==============
53  */
54 qboolean    LoadFile( const char *filename, byte **bufferptr ){
55         FILE    *f;
56         int length;
57         byte    *buffer;
58
59         f = fopen( filename, "rb" );
60         if ( !f ) {
61                 return false;
62         }
63
64         length = FileLength( f );
65         buffer = new byte[length + 1];
66         buffer[length] = 0;
67         fread( buffer, 1, length, f );
68         fclose( f );
69
70         *bufferptr = buffer;
71         return true;
72 }
73
74 /*int    LittleLong (int l)
75    {
76     return l;
77    }
78
79    float        LittleFloat (float l)
80    {
81     return l;
82    }*/
83
84 /*
85    =============
86    SwapBlock
87
88    If all values are 32 bits, this can be used to swap everything
89    =============
90  */
91 void SwapBlock( int *block, int sizeOfBlock ) {
92         int i;
93
94         sizeOfBlock >>= 2;
95         for ( i = 0 ; i < sizeOfBlock ; i++ ) {
96                 block[i] = LittleLong( block[i] );
97         }
98 }
99
100 /*
101    =============
102    SwapBSPFile
103
104    Byte swaps all data in a bsp file.
105    =============
106  */
107 void SwapBSPFile( void ) {
108         int i;
109
110         // models
111 //      SwapBlock( (int *)dmodels, nummodels * sizeof( dmodels[0] ) );
112
113         // shaders (don't swap the name)
114 //      for ( i = 0 ; i < numShaders ; i++ ) {
115 //              dshaders[i].contentFlags = LittleLong( dshaders[i].contentFlags );
116 //              dshaders[i].surfaceFlags = LittleLong( dshaders[i].surfaceFlags );
117 //      }
118
119         // planes
120         SwapBlock( (int *)dplanes, numplanes * sizeof( dplanes[0] ) );
121
122         // nodes
123         SwapBlock( (int *)dnodes, numnodes * sizeof( dnodes[0] ) );
124
125         // leafs
126         SwapBlock( (int *)dleafs, numleafs * sizeof( dleafs[0] ) );
127
128         // leaffaces
129         SwapBlock( (int *)dleafsurfaces, numleafsurfaces * sizeof( dleafsurfaces[0] ) );
130
131         // leafbrushes
132         SwapBlock( (int *)dleafbrushes, numleafbrushes * sizeof( dleafbrushes[0] ) );
133
134         // brushes
135         SwapBlock( (int *)dbrushes, numbrushes * sizeof( dbrushes[0] ) );
136
137         // brushsides
138         SwapBlock( (int *)dbrushsides, numbrushsides * sizeof( dbrushsides[0] ) );
139
140         // vis
141         ( (int *)&visBytes )[0] = LittleLong( ( (int *)&visBytes )[0] );
142         ( (int *)&visBytes )[1] = LittleLong( ( (int *)&visBytes )[1] );
143
144         // drawverts (don't swap colors )
145         for ( i = 0 ; i < numDrawVerts ; i++ ) {
146                 drawVerts[i].lightmap[0] = LittleFloat( drawVerts[i].lightmap[0] );
147                 drawVerts[i].lightmap[1] = LittleFloat( drawVerts[i].lightmap[1] );
148                 drawVerts[i].st[0] = LittleFloat( drawVerts[i].st[0] );
149                 drawVerts[i].st[1] = LittleFloat( drawVerts[i].st[1] );
150                 drawVerts[i].xyz[0] = LittleFloat( drawVerts[i].xyz[0] );
151                 drawVerts[i].xyz[1] = LittleFloat( drawVerts[i].xyz[1] );
152                 drawVerts[i].xyz[2] = LittleFloat( drawVerts[i].xyz[2] );
153                 drawVerts[i].normal[0] = LittleFloat( drawVerts[i].normal[0] );
154                 drawVerts[i].normal[1] = LittleFloat( drawVerts[i].normal[1] );
155                 drawVerts[i].normal[2] = LittleFloat( drawVerts[i].normal[2] );
156         }
157
158         // drawindexes
159 //      SwapBlock( (int *)drawIndexes, numDrawIndexes * sizeof( drawIndexes[0] ) );
160
161         // drawsurfs
162         SwapBlock( (int *)drawSurfaces, numDrawSurfaces * sizeof( drawSurfaces[0] ) );
163
164         // fogs
165 //      for ( i = 0 ; i < numFogs ; i++ ) {
166 //              dfogs[i].brushNum = LittleLong( dfogs[i].brushNum );
167 //              dfogs[i].visibleSide = LittleLong( dfogs[i].visibleSide );
168 //      }
169 }
170
171 /*
172    =============
173    CopyLump
174    =============
175  */
176 int CopyLump( dheader_t *header, int lump, void **dest, int size ) {
177         int length, ofs;
178
179         length = header->lumps[lump].filelen;
180         ofs = header->lumps[lump].fileofs;
181
182         if ( length == 0 ) {
183                 return 0;
184         }
185
186         *dest = new byte[length];
187         memcpy( *dest, (byte *)header + ofs, length );
188
189         return length / size;
190 }
191
192 /*
193    =============
194    LoadBSPFile
195    =============
196  */
197 qboolean    LoadBSPFile( const char *filename ) {
198         dheader_t   *header;
199
200         // load the file header
201         if ( !LoadFile( filename, (byte **)&header ) ) {
202                 return false;
203         }
204
205         // swap the header
206         SwapBlock( (int *)header, sizeof( *header ) );
207
208         if ( header->ident != BSP_IDENT ) {
209                 DoMessageBox( "Cant find a valid IBSP file", "Error", MB_OK );
210                 return false;
211         }
212         if ( ( header->version != Q3_BSP_VERSION ) &&
213                  ( header->version != WOLF_BSP_VERSION ) ) {
214                 DoMessageBox( "File is incorrect version", "Error", MB_OK );
215                 return false;
216         }
217
218         numbrushsides =     CopyLump( header, LUMP_BRUSHES,         (void**)&dbrushsides,   sizeof( dbrushside_t ) );
219         numbrushes =        CopyLump( header, LUMP_BRUSHES,         (void**)&dbrushes,      sizeof( dbrush_t ) );
220         numplanes =         CopyLump( header, LUMP_PLANES,          (void**)&dplanes,       sizeof( dplane_t ) );
221         numleafs =          CopyLump( header, LUMP_LEAFS,           (void**)&dleafs,        sizeof( dleaf_t ) );
222         numnodes =          CopyLump( header, LUMP_NODES,           (void**)&dnodes,        sizeof( dnode_t ) );
223         numDrawVerts =      CopyLump( header, LUMP_DRAWVERTS,       (void**)&drawVerts,     sizeof( qdrawVert_t ) );
224         numDrawSurfaces =   CopyLump( header, LUMP_SURFACES,        (void**)&drawSurfaces,  sizeof( dsurface_t ) );
225         numleafsurfaces =   CopyLump( header, LUMP_LEAFSURFACES,    (void**)&dleafsurfaces, sizeof( int ) );
226         numVisBytes =       CopyLump( header, LUMP_VISIBILITY,      (void**)&visBytes,      1 );
227         numleafbrushes =    CopyLump( header, LUMP_LEAFBRUSHES,     (void**)&dleafbrushes,  sizeof( int ) );
228
229         delete header;      // everything has been copied out
230
231         // swap everything
232         SwapBSPFile();
233
234         return true;
235 }
236
237 void FreeBSPData(){
238         if ( visBytes ) {
239                 delete visBytes;
240         }
241         if ( dnodes ) {
242                 delete dnodes;
243         }
244         if ( dplanes ) {
245                 delete dplanes;
246         }
247         if ( dleafs ) {
248                 delete dleafs;
249         }
250         if ( drawVerts ) {
251                 delete drawVerts;
252         }
253         if ( drawSurfaces ) {
254                 delete drawSurfaces;
255         }
256         if ( dleafsurfaces ) {
257                 delete dleafsurfaces;
258         }
259         if ( dleafbrushes ) {
260                 delete dleafbrushes;
261         }
262         if ( dbrushes ) {
263                 delete dbrushes;
264         }
265         if ( dbrushsides ) {
266                 delete dbrushsides;
267         }
268 }