]> de.git.xonotic.org Git - voretournament/voretournament.git/blobdiff - misc/mediasource/extra/netradiant-src/contrib/bobtoolz/bsploader.cpp
Include netRadiant source in this GIT
[voretournament/voretournament.git] / misc / mediasource / extra / netradiant-src / contrib / bobtoolz / bsploader.cpp
diff --git a/misc/mediasource/extra/netradiant-src/contrib/bobtoolz/bsploader.cpp b/misc/mediasource/extra/netradiant-src/contrib/bobtoolz/bsploader.cpp
new file mode 100644 (file)
index 0000000..287c5ff
--- /dev/null
@@ -0,0 +1,263 @@
+#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;
+}