2 #include "./dialogs/dialogs-gtk.h"
\r
3 #include "bsploader.h"
\r
4 #include "../../libs/cmdlib.h"
\r
12 int numDrawSurfaces;
\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
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
37 int FileLength (FILE *f)
\r
43 fseek (f, 0, SEEK_END);
\r
45 fseek (f, pos, SEEK_SET);
\r
55 qboolean LoadFile( const char *filename, byte **bufferptr)
\r
61 f = fopen(filename, "rb");
\r
65 length = FileLength (f);
\r
66 buffer = new byte[length+1];
\r
68 fread(buffer, 1, length, f);
\r
71 *bufferptr = buffer;
\r
75 /*int LittleLong (int l)
\r
80 float LittleFloat (float l)
\r
89 If all values are 32 bits, this can be used to swap everything
\r
92 void SwapBlock( int *block, int sizeOfBlock ) {
\r
96 for ( i = 0 ; i < sizeOfBlock ; i++ ) {
\r
97 block[i] = LittleLong( block[i] );
\r
105 Byte swaps all data in a bsp file.
\r
108 void SwapBSPFile( void ) {
\r
112 // SwapBlock( (int *)dmodels, nummodels * sizeof( dmodels[0] ) );
\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
121 SwapBlock( (int *)dplanes, numplanes * sizeof( dplanes[0] ) );
\r
124 SwapBlock( (int *)dnodes, numnodes * sizeof( dnodes[0] ) );
\r
127 SwapBlock( (int *)dleafs, numleafs * sizeof( dleafs[0] ) );
\r
130 SwapBlock( (int *)dleafsurfaces, numleafsurfaces * sizeof( dleafsurfaces[0] ) );
\r
133 SwapBlock( (int *)dleafbrushes, numleafbrushes * sizeof( dleafbrushes[0] ) );
\r
136 SwapBlock( (int *)dbrushes, numbrushes * sizeof( dbrushes[0] ) );
\r
139 SwapBlock( (int *)dbrushsides, numbrushsides * sizeof( dbrushsides[0] ) );
\r
142 ((int *)&visBytes)[0] = LittleLong( ((int *)&visBytes)[0] );
\r
143 ((int *)&visBytes)[1] = LittleLong( ((int *)&visBytes)[1] );
\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
160 // SwapBlock( (int *)drawIndexes, numDrawIndexes * sizeof( drawIndexes[0] ) );
\r
163 SwapBlock( (int *)drawSurfaces, numDrawSurfaces * sizeof( drawSurfaces[0] ) );
\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
177 int CopyLump( dheader_t *header, int lump, void **dest, int size ) {
\r
180 length = header->lumps[lump].filelen;
\r
181 ofs = header->lumps[lump].fileofs;
\r
186 *dest = new byte[length];
\r
187 memcpy( *dest, (byte *)header + ofs, length );
\r
189 return length / size;
\r
197 qboolean LoadBSPFile( const char *filename ) {
\r
200 // load the file header
\r
201 if(!LoadFile (filename, (byte **)&header))
\r
205 SwapBlock( (int *)header, sizeof(*header) );
\r
207 if ( header->ident != BSP_IDENT ) {
\r
208 DoMessageBox( "Cant find a valid IBSP file", "Error", MB_OK);
\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
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
228 delete header; // everything has been copied out
\r
249 delete drawSurfaces;
\r
251 delete dleafsurfaces;
\r
253 delete dleafbrushes;
\r
257 delete dbrushsides;
\r