-#include "StdAfx.h"\r
-#include "./dialogs/dialogs-gtk.h"\r
-#include "bsploader.h"\r
-#include "../../libs/cmdlib.h"\r
-\r
-int numnodes;\r
-int numplanes;\r
-int numleafs;\r
-int numleafsurfaces;\r
-int numVisBytes;\r
-int numDrawVerts;\r
-int numDrawSurfaces;\r
-int numbrushes;\r
-int numbrushsides;\r
-int numleafbrushes;\r
-\r
-byte *visBytes = NULL;\r
-dnode_t *dnodes = NULL;\r
-dplane_t *dplanes = NULL;\r
-dleaf_t *dleafs = NULL;\r
-qdrawVert_t *drawVerts = NULL;\r
-dsurface_t *drawSurfaces = NULL;\r
-int *dleafsurfaces = NULL;\r
-dbrush_t *dbrushes = NULL;\r
-dbrushside_t *dbrushsides = NULL;\r
-int *dleafbrushes = NULL;\r
-\r
-#define BSP_IDENT (('P'<<24)+('S'<<16)+('B'<<8)+'I')\r
-#define Q3_BSP_VERSION 46\r
-#define WOLF_BSP_VERSION 47\r
-\r
-/*\r
-================\r
-FileLength\r
-================\r
-*/\r
-int FileLength (FILE *f)\r
-{\r
- int pos;\r
- int end;\r
-\r
- pos = ftell (f);\r
- fseek (f, 0, SEEK_END);\r
- end = ftell (f);\r
- fseek (f, pos, SEEK_SET);\r
-\r
- return end;\r
-}\r
-\r
-/*\r
-==============\r
-LoadFile\r
-==============\r
-*/\r
-qboolean LoadFile( const char *filename, byte **bufferptr)\r
-{\r
- FILE *f;\r
- int length;\r
- byte *buffer;\r
-\r
- f = fopen(filename, "rb");\r
- if(!f)\r
- return false;\r
-\r
- length = FileLength (f);\r
- buffer = new byte[length+1];\r
- buffer[length] = 0;\r
- fread(buffer, 1, length, f);\r
- fclose (f);\r
-\r
- *bufferptr = buffer;\r
- return true;\r
-}\r
-\r
-/*int LittleLong (int l)\r
-{\r
- return l;\r
-}\r
-\r
-float LittleFloat (float l)\r
-{\r
- return l;\r
-}*/\r
-\r
-/*\r
-=============\r
-SwapBlock\r
-\r
-If all values are 32 bits, this can be used to swap everything\r
-=============\r
-*/\r
-void SwapBlock( int *block, int sizeOfBlock ) {\r
- int i;\r
-\r
- sizeOfBlock >>= 2;\r
- for ( i = 0 ; i < sizeOfBlock ; i++ ) {\r
- block[i] = LittleLong( block[i] );\r
- }\r
-}\r
-\r
-/*\r
-=============\r
-SwapBSPFile\r
-\r
-Byte swaps all data in a bsp file.\r
-=============\r
-*/\r
-void SwapBSPFile( void ) {\r
- int i;\r
- \r
- // models \r
-// SwapBlock( (int *)dmodels, nummodels * sizeof( dmodels[0] ) );\r
-\r
- // shaders (don't swap the name)\r
-// for ( i = 0 ; i < numShaders ; i++ ) {\r
-// dshaders[i].contentFlags = LittleLong( dshaders[i].contentFlags );\r
-// dshaders[i].surfaceFlags = LittleLong( dshaders[i].surfaceFlags );\r
-// }\r
-\r
- // planes\r
- SwapBlock( (int *)dplanes, numplanes * sizeof( dplanes[0] ) );\r
- \r
- // nodes\r
- SwapBlock( (int *)dnodes, numnodes * sizeof( dnodes[0] ) );\r
-\r
- // leafs\r
- SwapBlock( (int *)dleafs, numleafs * sizeof( dleafs[0] ) );\r
-\r
- // leaffaces\r
- SwapBlock( (int *)dleafsurfaces, numleafsurfaces * sizeof( dleafsurfaces[0] ) );\r
-\r
- // leafbrushes\r
- SwapBlock( (int *)dleafbrushes, numleafbrushes * sizeof( dleafbrushes[0] ) );\r
-\r
- // brushes\r
- SwapBlock( (int *)dbrushes, numbrushes * sizeof( dbrushes[0] ) );\r
-\r
- // brushsides\r
- SwapBlock( (int *)dbrushsides, numbrushsides * sizeof( dbrushsides[0] ) );\r
-\r
- // vis\r
- ((int *)&visBytes)[0] = LittleLong( ((int *)&visBytes)[0] );\r
- ((int *)&visBytes)[1] = LittleLong( ((int *)&visBytes)[1] );\r
-\r
- // drawverts (don't swap colors )\r
- for ( i = 0 ; i < numDrawVerts ; i++ ) {\r
- drawVerts[i].lightmap[0] = LittleFloat( drawVerts[i].lightmap[0] );\r
- drawVerts[i].lightmap[1] = LittleFloat( drawVerts[i].lightmap[1] );\r
- drawVerts[i].st[0] = LittleFloat( drawVerts[i].st[0] );\r
- drawVerts[i].st[1] = LittleFloat( drawVerts[i].st[1] );\r
- drawVerts[i].xyz[0] = LittleFloat( drawVerts[i].xyz[0] );\r
- drawVerts[i].xyz[1] = LittleFloat( drawVerts[i].xyz[1] );\r
- drawVerts[i].xyz[2] = LittleFloat( drawVerts[i].xyz[2] );\r
- drawVerts[i].normal[0] = LittleFloat( drawVerts[i].normal[0] );\r
- drawVerts[i].normal[1] = LittleFloat( drawVerts[i].normal[1] );\r
- drawVerts[i].normal[2] = LittleFloat( drawVerts[i].normal[2] );\r
- }\r
-\r
- // drawindexes\r
-// SwapBlock( (int *)drawIndexes, numDrawIndexes * sizeof( drawIndexes[0] ) );\r
-\r
- // drawsurfs\r
- SwapBlock( (int *)drawSurfaces, numDrawSurfaces * sizeof( drawSurfaces[0] ) );\r
-\r
- // fogs\r
-// for ( i = 0 ; i < numFogs ; i++ ) {\r
-// dfogs[i].brushNum = LittleLong( dfogs[i].brushNum );\r
-// dfogs[i].visibleSide = LittleLong( dfogs[i].visibleSide );\r
-// }\r
-}\r
-\r
-/*\r
-=============\r
-CopyLump\r
-=============\r
-*/\r
-int CopyLump( dheader_t *header, int lump, void **dest, int size ) {\r
- int length, ofs;\r
-\r
- length = header->lumps[lump].filelen;\r
- ofs = header->lumps[lump].fileofs;\r
- \r
- if(length == 0)\r
- return 0;\r
- \r
- *dest = new byte[length];\r
- memcpy( *dest, (byte *)header + ofs, length );\r
-\r
- return length / size;\r
-}\r
-\r
-/*\r
-=============\r
-LoadBSPFile\r
-=============\r
-*/\r
-qboolean LoadBSPFile( const char *filename ) {\r
- dheader_t *header;\r
-\r
- // load the file header\r
- if(!LoadFile (filename, (byte **)&header))\r
- return false;\r
-\r
- // swap the header\r
- SwapBlock( (int *)header, sizeof(*header) );\r
-\r
- if ( header->ident != BSP_IDENT ) {\r
- DoMessageBox( "Cant find a valid IBSP file", "Error", MB_OK);\r
- return false;\r
- }\r
- if ( (header->version != Q3_BSP_VERSION) &&\r
- (header->version != WOLF_BSP_VERSION) ) {\r
- DoMessageBox( "File is incorrect version", "Error", MB_OK);\r
- return false;\r
- }\r
-\r
- numbrushsides = CopyLump( header, LUMP_BRUSHES, (void**)&dbrushsides, sizeof(dbrushside_t) );\r
- numbrushes = CopyLump( header, LUMP_BRUSHES, (void**)&dbrushes, sizeof(dbrush_t) );\r
- numplanes = CopyLump( header, LUMP_PLANES, (void**)&dplanes, sizeof(dplane_t) );\r
- numleafs = CopyLump( header, LUMP_LEAFS, (void**)&dleafs, sizeof(dleaf_t) );\r
- numnodes = CopyLump( header, LUMP_NODES, (void**)&dnodes, sizeof(dnode_t) );\r
- numDrawVerts = CopyLump( header, LUMP_DRAWVERTS, (void**)&drawVerts, sizeof(qdrawVert_t) );\r
- numDrawSurfaces = CopyLump( header, LUMP_SURFACES, (void**)&drawSurfaces, sizeof(dsurface_t) );\r
- numleafsurfaces = CopyLump( header, LUMP_LEAFSURFACES, (void**)&dleafsurfaces, sizeof(int) );\r
- numVisBytes = CopyLump( header, LUMP_VISIBILITY, (void**)&visBytes, 1 );\r
- numleafbrushes = CopyLump( header, LUMP_LEAFBRUSHES, (void**)&dleafbrushes, sizeof(int) );\r
-\r
- delete header; // everything has been copied out\r
- \r
- // swap everything\r
- SwapBSPFile();\r
-\r
- return true;\r
-}\r
-\r
-void FreeBSPData()\r
-{\r
- if(visBytes)\r
- delete visBytes;\r
- if(dnodes)\r
- delete dnodes;\r
- if(dplanes)\r
- delete dplanes;\r
- if(dleafs)\r
- delete dleafs;\r
- if(drawVerts)\r
- delete drawVerts;\r
- if(drawSurfaces)\r
- delete drawSurfaces;\r
- if(dleafsurfaces)\r
- delete dleafsurfaces;\r
- if(dleafbrushes)\r
- delete dleafbrushes;\r
- if(dbrushes)\r
- delete dbrushes;\r
- if(dbrushsides)\r
- delete dbrushsides;\r
-}\r
+#include <globaldefs.h>
+#include "bsploader.h"
+#include "dialogs/dialogs-gtk.h"
+#include "cmdlib.h"
+
+int numnodes;
+int numplanes;
+int numleafs;
+int numleafsurfaces;
+int numVisBytes;
+int numDrawVerts;
+int numDrawSurfaces;
+int numbrushes;
+int numbrushsides;
+int numleafbrushes;
+
+byte *visBytes = NULL;
+dnode_t *dnodes = NULL;
+dplane_t *dplanes = NULL;
+dleaf_t *dleafs = NULL;
+qdrawVert_t *drawVerts = NULL;
+dsurface_t *drawSurfaces = NULL;
+int *dleafsurfaces = NULL;
+dbrush_t *dbrushes = NULL;
+dbrushside_t *dbrushsides = NULL;
+int *dleafbrushes = NULL;
+
+const int BSP_IDENT = ( ( 'P' << 24 ) + ( 'S' << 16 ) + ( 'B' << 8 ) + 'I' );
+const int Q3_BSP_VERSION = 46;
+const int WOLF_BSP_VERSION = 47;
+
+/*
+ ================
+ FileLength
+ ================
+ */
+int FileLength( FILE *f ){
+ int pos;
+ int end;
+
+ pos = ftell( f );
+ fseek( f, 0, SEEK_END );
+ end = ftell( f );
+ fseek( f, pos, SEEK_SET );
+
+ return end;
+}
+
+/*
+ ==============
+ LoadFile
+ ==============
+ */
+bool LoadFile( const char *filename, byte **bufferptr ){
+ FILE *f;
+ int length;
+ byte *buffer;
+
+ f = fopen( filename, "rb" );
+ if ( !f ) {
+ return false;
+ }
+
+ length = FileLength( f );
+ buffer = new byte[length + 1];
+ buffer[length] = 0;
+ fread( buffer, 1, length, f );
+ fclose( f );
+
+ *bufferptr = buffer;
+ return true;
+}
+
+int LittleLong( int l ){
+ if (GDEF_ARCH_ENDIAN_BIG) {
+ std::reverse(reinterpret_cast<unsigned char *>( &l ), reinterpret_cast<unsigned char *>( &l ) + sizeof(int));
+ }
+ return l;
+}
+
+float LittleFloat( float l ){
+ if (GDEF_ARCH_ENDIAN_BIG) {
+ std::reverse( reinterpret_cast<unsigned char*>( &l ), reinterpret_cast<unsigned char*>( &l ) + sizeof( float ) );
+ }
+ return l;
+}
+
+/*
+ =============
+ SwapBlock
+
+ If all values are 32 bits, this can be used to swap everything
+ =============
+ */
+void SwapBlock( int *block, int sizeOfBlock ) {
+ int i;
+
+ sizeOfBlock >>= 2;
+ for ( i = 0 ; i < sizeOfBlock ; i++ ) {
+ block[i] = LittleLong( block[i] );
+ }
+}
+
+/*
+ =============
+ SwapBSPFile
+
+ Byte swaps all data in a bsp file.
+ =============
+ */
+void SwapBSPFile( void ) {
+ int i;
+
+ // models
+// SwapBlock( (int *)dmodels, nummodels * sizeof( dmodels[0] ) );
+
+ // shaders (don't swap the name)
+// for ( i = 0 ; i < numShaders ; i++ ) {
+// dshaders[i].contentFlags = LittleLong( dshaders[i].contentFlags );
+// dshaders[i].surfaceFlags = LittleLong( dshaders[i].surfaceFlags );
+// }
+
+ // planes
+ SwapBlock( (int *)dplanes, numplanes * sizeof( dplanes[0] ) );
+
+ // nodes
+ SwapBlock( (int *)dnodes, numnodes * sizeof( dnodes[0] ) );
+
+ // leafs
+ SwapBlock( (int *)dleafs, numleafs * sizeof( dleafs[0] ) );
+
+ // leaffaces
+ SwapBlock( (int *)dleafsurfaces, numleafsurfaces * sizeof( dleafsurfaces[0] ) );
+
+ // leafbrushes
+ SwapBlock( (int *)dleafbrushes, numleafbrushes * sizeof( dleafbrushes[0] ) );
+
+ // brushes
+ SwapBlock( (int *)dbrushes, numbrushes * sizeof( dbrushes[0] ) );
+
+ // brushsides
+ SwapBlock( (int *)dbrushsides, numbrushsides * sizeof( dbrushsides[0] ) );
+
+ // vis
+ ( (int *)&visBytes )[0] = LittleLong( ( (int *)&visBytes )[0] );
+ ( (int *)&visBytes )[1] = LittleLong( ( (int *)&visBytes )[1] );
+
+ // drawverts (don't swap colors )
+ for ( i = 0 ; i < numDrawVerts ; i++ ) {
+ drawVerts[i].lightmap[0] = LittleFloat( drawVerts[i].lightmap[0] );
+ drawVerts[i].lightmap[1] = LittleFloat( drawVerts[i].lightmap[1] );
+ drawVerts[i].st[0] = LittleFloat( drawVerts[i].st[0] );
+ drawVerts[i].st[1] = LittleFloat( drawVerts[i].st[1] );
+ drawVerts[i].xyz[0] = LittleFloat( drawVerts[i].xyz[0] );
+ drawVerts[i].xyz[1] = LittleFloat( drawVerts[i].xyz[1] );
+ drawVerts[i].xyz[2] = LittleFloat( drawVerts[i].xyz[2] );
+ drawVerts[i].normal[0] = LittleFloat( drawVerts[i].normal[0] );
+ drawVerts[i].normal[1] = LittleFloat( drawVerts[i].normal[1] );
+ drawVerts[i].normal[2] = LittleFloat( drawVerts[i].normal[2] );
+ }
+
+ // drawindexes
+// SwapBlock( (int *)drawIndexes, numDrawIndexes * sizeof( drawIndexes[0] ) );
+
+ // drawsurfs
+ SwapBlock( (int *)drawSurfaces, numDrawSurfaces * sizeof( drawSurfaces[0] ) );
+
+ // fogs
+// for ( i = 0 ; i < numFogs ; i++ ) {
+// dfogs[i].brushNum = LittleLong( dfogs[i].brushNum );
+// dfogs[i].visibleSide = LittleLong( dfogs[i].visibleSide );
+// }
+}
+
+/*
+ =============
+ CopyLump
+ =============
+ */
+int CopyLump( dheader_t *header, int lump, void **dest, int size ) {
+ int length, ofs;
+
+ length = header->lumps[lump].filelen;
+ ofs = header->lumps[lump].fileofs;
+
+ if ( length == 0 ) {
+ return 0;
+ }
+
+ *dest = new byte[length];
+ memcpy( *dest, (byte *)header + ofs, length );
+
+ return length / size;
+}
+
+/*
+ =============
+ LoadBSPFile
+ =============
+ */
+bool LoadBSPFile( const char *filename ) {
+ dheader_t *header;
+
+ // load the file header
+ if ( !LoadFile( filename, (byte **)&header ) ) {
+ return false;
+ }
+
+ // swap the header
+ SwapBlock( (int *)header, sizeof( *header ) );
+
+ if ( header->ident != BSP_IDENT ) {
+ DoMessageBox( "Cant find a valid IBSP file", "Error", eMB_OK );
+ return false;
+ }
+ if ( ( header->version != Q3_BSP_VERSION ) &&
+ ( header->version != WOLF_BSP_VERSION ) ) {
+ DoMessageBox( "File is incorrect version", "Error", eMB_OK );
+ return false;
+ }
+
+ numbrushsides = CopyLump( header, LUMP_BRUSHES, (void**)&dbrushsides, sizeof( dbrushside_t ) );
+ numbrushes = CopyLump( header, LUMP_BRUSHES, (void**)&dbrushes, sizeof( dbrush_t ) );
+ numplanes = CopyLump( header, LUMP_PLANES, (void**)&dplanes, sizeof( dplane_t ) );
+ numleafs = CopyLump( header, LUMP_LEAFS, (void**)&dleafs, sizeof( dleaf_t ) );
+ numnodes = CopyLump( header, LUMP_NODES, (void**)&dnodes, sizeof( dnode_t ) );
+ numDrawVerts = CopyLump( header, LUMP_DRAWVERTS, (void**)&drawVerts, sizeof( qdrawVert_t ) );
+ numDrawSurfaces = CopyLump( header, LUMP_SURFACES, (void**)&drawSurfaces, sizeof( dsurface_t ) );
+ numleafsurfaces = CopyLump( header, LUMP_LEAFSURFACES, (void**)&dleafsurfaces, sizeof( int ) );
+ numVisBytes = CopyLump( header, LUMP_VISIBILITY, (void**)&visBytes, 1 );
+ numleafbrushes = CopyLump( header, LUMP_LEAFBRUSHES, (void**)&dleafbrushes, sizeof( int ) );
+
+ delete header; // everything has been copied out
+
+ // swap everything
+ SwapBSPFile();
+
+ return true;
+}
+
+void FreeBSPData(){
+ if ( visBytes ) {
+ delete visBytes;
+ }
+ if ( dnodes ) {
+ delete dnodes;
+ }
+ if ( dplanes ) {
+ delete dplanes;
+ }
+ if ( dleafs ) {
+ delete dleafs;
+ }
+ if ( drawVerts ) {
+ delete drawVerts;
+ }
+ if ( drawSurfaces ) {
+ delete drawSurfaces;
+ }
+ if ( dleafsurfaces ) {
+ delete dleafsurfaces;
+ }
+ if ( dleafbrushes ) {
+ delete dleafbrushes;
+ }
+ if ( dbrushes ) {
+ delete dbrushes;
+ }
+ if ( dbrushsides ) {
+ delete dbrushsides;
+ }
+}