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