+++ /dev/null
-#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;
-
-#define BSP_IDENT (('P'<<24)+('S'<<16)+('B'<<8)+'I')
-#define Q3_BSP_VERSION 46
-#define 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 defined(__BIG_ENDIAN__)
- std::reverse(reinterpret_cast<unsigned char*>(&l), reinterpret_cast<unsigned char*>(&l) + sizeof(int));
-#endif
- return l;
-}
-
-float LittleFloat (float l)
-{
-#if defined(__BIG_ENDIAN__)
- std::reverse(reinterpret_cast<unsigned char*>(&l), reinterpret_cast<unsigned char*>(&l) + sizeof(float));
-#endif
- 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;
-}